yat/utility/expression/MatrixTraits.h

Code
Comments
Other
Rev Date Author Line
3909 13 May 20 peter 1 #ifndef _theplu_yat_utility_expression_matrix_traits
3909 13 May 20 peter 2 #define _theplu_yat_utility_expression_matrix_traits
3909 13 May 20 peter 3
3909 13 May 20 peter 4 // $Id$
3909 13 May 20 peter 5
3909 13 May 20 peter 6 /*
3999 08 Oct 20 peter 7   Copyright (C) 2020 Peter Johansson
3909 13 May 20 peter 8
3909 13 May 20 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
3909 13 May 20 peter 10
3909 13 May 20 peter 11   The yat library is free software; you can redistribute it and/or
3909 13 May 20 peter 12   modify it under the terms of the GNU General Public License as
3909 13 May 20 peter 13   published by the Free Software Foundation; either version 3 of the
3909 13 May 20 peter 14   License, or (at your option) any later version.
3909 13 May 20 peter 15
3909 13 May 20 peter 16   The yat library is distributed in the hope that it will be useful,
3909 13 May 20 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
3909 13 May 20 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3909 13 May 20 peter 19   General Public License for more details.
3909 13 May 20 peter 20
3909 13 May 20 peter 21   You should have received a copy of the GNU General Public License
3909 13 May 20 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
3909 13 May 20 peter 23 */
3909 13 May 20 peter 24
3909 13 May 20 peter 25
3909 13 May 20 peter 26 #include "ScaledMatrix.h"
3909 13 May 20 peter 27 #include "TransposedMatrix.h"
3909 13 May 20 peter 28
3909 13 May 20 peter 29 #include "yat/utility/BasicMatrix.h"
3909 13 May 20 peter 30 #include "yat/utility/MatrixExpression.h"
3909 13 May 20 peter 31
3909 13 May 20 peter 32 #include <gsl/gsl_blas_types.h>
3909 13 May 20 peter 33 #include <gsl/gsl_cblas.h>
3909 13 May 20 peter 34
3909 13 May 20 peter 35 namespace theplu {
3909 13 May 20 peter 36 namespace yat {
3909 13 May 20 peter 37 namespace utility {
3909 13 May 20 peter 38
3909 13 May 20 peter 39   /// \cond IGNORE_DOXYGEN
3909 13 May 20 peter 40
3909 13 May 20 peter 41   namespace expression {
3909 13 May 20 peter 42
3909 13 May 20 peter 43     // A class that is used to de-couple a BasicMatrix<T> into a
3909 13 May 20 peter 44     // scalar factor, transpose flag and the underlying matrix.
3909 13 May 20 peter 45     template<class MATRIX>
3909 13 May 20 peter 46     class MatrixTraits
3909 13 May 20 peter 47     {
3909 13 May 20 peter 48     public:
3909 13 May 20 peter 49       typedef MATRIX base_type;
3909 13 May 20 peter 50       double factor(const MATRIX&) const { return 1.0; }
3909 13 May 20 peter 51       CBLAS_TRANSPOSE_t transpose_type(void) const { return CblasNoTrans; }
3909 13 May 20 peter 52       const gsl_matrix* get_gsl_matrix_p(const MATRIX& m) const
3909 13 May 20 peter 53       { return m.gsl_matrix_p(); }
3909 13 May 20 peter 54     private:
3909 13 May 20 peter 55     };
3909 13 May 20 peter 56
3909 13 May 20 peter 57
3909 13 May 20 peter 58     // Specialization for ScaledMatrix<Derived>
3909 13 May 20 peter 59     //
3909 13 May 20 peter 60     // To allow unfolding of multiple layers of Scaled and Transposed
3909 13 May 20 peter 61     // Matrix, all functions are calculated using
3909 13 May 20 peter 62     // MatrixTraits<Derived>.
3909 13 May 20 peter 63     //
3909 13 May 20 peter 64     // ScaledMatrix only affects the scale factor so all functions
3909 13 May 20 peter 65     // calls MatrixTraits<Derived> directly expect ::factor(void),
3909 13 May 20 peter 66     // which multiplies with ScaledMatrix<Derived>::factor
3909 13 May 20 peter 67     template<class Derived>
3909 13 May 20 peter 68     class MatrixTraits<BasicMatrix<MatrixExpression<ScaledMatrix<Derived> > > >
3909 13 May 20 peter 69     {
3909 13 May 20 peter 70     public:
3909 13 May 20 peter 71       typedef BasicMatrix<MatrixExpression<ScaledMatrix<Derived> > > MATRIX;
3909 13 May 20 peter 72
3909 13 May 20 peter 73       double factor(const MATRIX& m) const
3909 13 May 20 peter 74       {
3909 13 May 20 peter 75         return static_cast<const ScaledMatrix<Derived>&>(m).factor() *
3909 13 May 20 peter 76           sub_traits_.factor(base(m));
3909 13 May 20 peter 77       }
3909 13 May 20 peter 78
3909 13 May 20 peter 79
3909 13 May 20 peter 80       CBLAS_TRANSPOSE_t transpose_type(void) const
3909 13 May 20 peter 81       {
3909 13 May 20 peter 82         return sub_traits_.transpose_type();
3909 13 May 20 peter 83       }
3909 13 May 20 peter 84
3909 13 May 20 peter 85
3909 13 May 20 peter 86       const gsl_matrix* get_gsl_matrix_p(const MATRIX& m) const
3909 13 May 20 peter 87       {
3909 13 May 20 peter 88         return sub_traits_.get_gsl_matrix_p(base(m));
3909 13 May 20 peter 89       }
3909 13 May 20 peter 90     private:
3909 13 May 20 peter 91       const Derived& base(const MATRIX& m) const
3909 13 May 20 peter 92       { return static_cast<const ScaledMatrix<Derived>&>(m).base(); }
3909 13 May 20 peter 93       MatrixTraits<Derived> sub_traits_;
3909 13 May 20 peter 94     };
3909 13 May 20 peter 95
3909 13 May 20 peter 96
3909 13 May 20 peter 97     // Specialization for TransposedMatrix
3909 13 May 20 peter 98     //
3909 13 May 20 peter 99     // To allow unfolding of multiple layers of Scaled and Transposed
3909 13 May 20 peter 100     // Matrix, all functions are calculated using
3909 13 May 20 peter 101     // MatrixTraits<Derived>.
3909 13 May 20 peter 102     //
3909 13 May 20 peter 103     // TransposedMatrix only affects the transpose flasg so all
3909 13 May 20 peter 104     // functions calls MatrixTraits<Derived> directly, expect
3909 13 May 20 peter 105     // ::transpose_type(void), which "negates" the value.
3909 13 May 20 peter 106     template<class Derived>
3909 13 May 20 peter 107     class MatrixTraits<BasicMatrix<MatrixExpression<TransposedMatrix<Derived> > > >
3909 13 May 20 peter 108     {
3909 13 May 20 peter 109     public:
3909 13 May 20 peter 110       typedef BasicMatrix<MatrixExpression<TransposedMatrix<Derived> > > MATRIX;
3909 13 May 20 peter 111       double factor(const MATRIX& m) const
3909 13 May 20 peter 112       { return sub_traits_.factor(base(m)); }
3909 13 May 20 peter 113
3909 13 May 20 peter 114
3909 13 May 20 peter 115       CBLAS_TRANSPOSE_t transpose_type(void) const
3909 13 May 20 peter 116       {
3909 13 May 20 peter 117         return sub_traits_.transpose_type() == CblasNoTrans ?
3909 13 May 20 peter 118           CblasTrans : CblasNoTrans;
3909 13 May 20 peter 119       }
3909 13 May 20 peter 120
3909 13 May 20 peter 121
3909 13 May 20 peter 122       const gsl_matrix* get_gsl_matrix_p(const MATRIX& m) const
3909 13 May 20 peter 123       { return sub_traits_.get_gsl_matrix_p(base(m)); }
3909 13 May 20 peter 124
3909 13 May 20 peter 125     private:
3909 13 May 20 peter 126       const Derived& base(const MATRIX& m) const
3909 13 May 20 peter 127       { return static_cast<const TransposedMatrix<Derived>&>(m).base(); }
3909 13 May 20 peter 128       MatrixTraits<Derived> sub_traits_;
3909 13 May 20 peter 129     };
3909 13 May 20 peter 130
3909 13 May 20 peter 131   }
3909 13 May 20 peter 132
3909 13 May 20 peter 133   /// \endcond
3909 13 May 20 peter 134
3909 13 May 20 peter 135 }}} // end of namespace expression, utility, yat and theplu
3909 13 May 20 peter 136 #endif