1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Copyright (c) 2011, Intel Corporation. All rights reserved.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Redistribution and use in source and binary forms, with or without modification,
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath are permitted provided that the following conditions are met:
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions of source code must retain the above copyright notice, this
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   list of conditions and the following disclaimer.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions in binary form must reproduce the above copyright notice,
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   this list of conditions and the following disclaimer in the documentation
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   and/or other materials provided with the distribution.
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Neither the name of Intel Corporation nor the names of its contributors may
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   be used to endorse or promote products derived from this software without
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   specific prior written permission.
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *   Content : Eigen bindings to Intel(R) MKL
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *    Householder QR decomposition of a matrix with column pivoting based on
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *    LAPACKE_?geqp3 function.
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "Eigen/src/Core/util/MKL_support.h"
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal Specialization for the data types supported by MKL */
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MKL_QR_COLPIV(EIGTYPE, MKLTYPE, MKLPREFIX, EIGCOLROW, MKLCOLROW) \
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> inline\
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >& \
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >::compute( \
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath              const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix) \
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef MatrixType::Scalar Scalar; \
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef MatrixType::RealScalar RealScalar; \
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = matrix.rows();\
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = matrix.cols();\
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index size = matrix.diagonalSize();\
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_qr = matrix;\
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_hCoeffs.resize(size);\
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_colsTranspositions.resize(cols);\
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /*Index number_of_transpositions = 0;*/ \
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_nonzero_pivots = 0; \
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_maxpivot = RealScalar(0);\
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_colsPermutation.resize(cols); \
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_colsPermutation.indices().setZero(); \
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lapack_int lda = m_qr.outerStride(), i; \
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lapack_int matrix_order = MKLCOLROW; \
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  LAPACKE_##MKLPREFIX##geqp3( matrix_order, rows, cols, (MKLTYPE*)m_qr.data(), lda, (lapack_int*)m_colsPermutation.indices().data(), (MKLTYPE*)m_hCoeffs.data()); \
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_isInitialized = true; \
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_maxpivot=m_qr.diagonal().cwiseAbs().maxCoeff(); \
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m_hCoeffs.adjointInPlace(); \
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RealScalar premultiplied_threshold = internal::abs(m_maxpivot) * threshold(); \
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lapack_int *perm = m_colsPermutation.indices().data(); \
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(i=0;i<size;i++) { \
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m_nonzero_pivots += (internal::abs(m_qr.coeff(i,i)) > premultiplied_threshold);\
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } \
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(i=0;i<cols;i++) perm[i]--;\
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /*m_det_pq = (number_of_transpositions%2) ? -1 : 1;  // TODO: It's not needed now; fix upon availability in Eigen */ \
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath\
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return *this; \
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(double,   double,        d, ColMajor, LAPACK_COL_MAJOR)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(float,    float,         s, ColMajor, LAPACK_COL_MAJOR)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, ColMajor, LAPACK_COL_MAJOR)
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, ColMajor, LAPACK_COL_MAJOR)
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(double,   double,        d, RowMajor, LAPACK_ROW_MAJOR)
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(float,    float,         s, RowMajor, LAPACK_ROW_MAJOR)
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, RowMajor, LAPACK_ROW_MAJOR)
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, RowMajor, LAPACK_ROW_MAJOR)
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
99