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 |
// $Id$ |
3909 |
13 May 20 |
peter |
5 |
|
3909 |
13 May 20 |
peter |
6 |
/* |
3999 |
08 Oct 20 |
peter |
Copyright (C) 2020 Peter Johansson |
3909 |
13 May 20 |
peter |
8 |
|
3909 |
13 May 20 |
peter |
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 |
The yat library is free software; you can redistribute it and/or |
3909 |
13 May 20 |
peter |
modify it under the terms of the GNU General Public License as |
3909 |
13 May 20 |
peter |
published by the Free Software Foundation; either version 3 of the |
3909 |
13 May 20 |
peter |
License, or (at your option) any later version. |
3909 |
13 May 20 |
peter |
15 |
|
3909 |
13 May 20 |
peter |
The yat library is distributed in the hope that it will be useful, |
3909 |
13 May 20 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
3909 |
13 May 20 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3909 |
13 May 20 |
peter |
General Public License for more details. |
3909 |
13 May 20 |
peter |
20 |
|
3909 |
13 May 20 |
peter |
You should have received a copy of the GNU General Public License |
3909 |
13 May 20 |
peter |
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 |
/// \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 |
// A class that is used to de-couple a BasicMatrix<T> into a |
3909 |
13 May 20 |
peter |
// 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 |
// Specialization for ScaledMatrix<Derived> |
3909 |
13 May 20 |
peter |
59 |
// |
3909 |
13 May 20 |
peter |
// To allow unfolding of multiple layers of Scaled and Transposed |
3909 |
13 May 20 |
peter |
// Matrix, all functions are calculated using |
3909 |
13 May 20 |
peter |
// MatrixTraits<Derived>. |
3909 |
13 May 20 |
peter |
63 |
// |
3909 |
13 May 20 |
peter |
// ScaledMatrix only affects the scale factor so all functions |
3909 |
13 May 20 |
peter |
// calls MatrixTraits<Derived> directly expect ::factor(void), |
3909 |
13 May 20 |
peter |
// 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 |
// Specialization for TransposedMatrix |
3909 |
13 May 20 |
peter |
98 |
// |
3909 |
13 May 20 |
peter |
// To allow unfolding of multiple layers of Scaled and Transposed |
3909 |
13 May 20 |
peter |
// Matrix, all functions are calculated using |
3909 |
13 May 20 |
peter |
// MatrixTraits<Derived>. |
3909 |
13 May 20 |
peter |
102 |
// |
3909 |
13 May 20 |
peter |
// TransposedMatrix only affects the transpose flasg so all |
3909 |
13 May 20 |
peter |
// functions calls MatrixTraits<Derived> directly, expect |
3909 |
13 May 20 |
peter |
// ::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 |
/// \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 |