comparison armadillo-2.4.4/include/armadillo_bits/glue_times_bones.hpp @ 0:8b6102e2a9b0

Armadillo Library
author maxzanoni76 <max.zanoni@eecs.qmul.ac.uk>
date Wed, 11 Apr 2012 09:27:06 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8b6102e2a9b0
1 // Copyright (C) 2008-2010 NICTA (www.nicta.com.au)
2 // Copyright (C) 2008-2010 Conrad Sanderson
3 //
4 // This file is part of the Armadillo C++ library.
5 // It is provided without any warranty of fitness
6 // for any purpose. You can redistribute this file
7 // and/or modify it under the terms of the GNU
8 // Lesser General Public License (LGPL) as published
9 // by the Free Software Foundation, either version 3
10 // of the License or (at your option) any later version.
11 // (see http://www.opensource.org/licenses for more info)
12
13
14 //! \addtogroup glue_times
15 //! @{
16
17
18
19 //! \brief
20 //! Template metaprogram depth_lhs
21 //! calculates the number of Glue<Tx,Ty, glue_type> instances on the left hand side argument of Glue<Tx,Ty, glue_type>
22 //! i.e. it recursively expands each Tx, until the type of Tx is not "Glue<..,.., glue_type>" (i.e the "glue_type" changes)
23
24 template<typename glue_type, typename T1>
25 struct depth_lhs
26 {
27 static const uword num = 0;
28 };
29
30 template<typename glue_type, typename T1, typename T2>
31 struct depth_lhs< glue_type, Glue<T1,T2,glue_type> >
32 {
33 static const uword num = 1 + depth_lhs<glue_type, T1>::num;
34 };
35
36
37
38 template<uword N>
39 struct glue_times_redirect
40 {
41 template<typename T1, typename T2>
42 inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);
43 };
44
45
46 template<>
47 struct glue_times_redirect<3>
48 {
49 template<typename T1, typename T2, typename T3>
50 inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>,T3,glue_times>& X);
51 };
52
53
54 template<>
55 struct glue_times_redirect<4>
56 {
57 template<typename T1, typename T2, typename T3, typename T4>
58 inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue< Glue<T1,T2,glue_times>, T3, glue_times>, T4, glue_times>& X);
59 };
60
61
62
63 //! Class which implements the immediate multiplication of two or more matrices
64 class glue_times
65 {
66 public:
67
68
69 template<typename T1, typename T2>
70 inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);
71
72
73 template<typename T1>
74 inline static void apply_inplace(Mat<typename T1::elem_type>& out, const T1& X);
75
76 template<typename T1, typename T2>
77 arma_hot inline static void apply_inplace_plus(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times>& X, const sword sign);
78
79 template<typename eT1, typename eT2>
80 inline static void apply_mixed(Mat<typename promote_type<eT1,eT2>::result>& out, const Mat<eT1>& X, const Mat<eT2>& Y);
81
82
83 template<typename eT>
84 arma_inline static uword mul_storage_cost(const Mat<eT>& A, const Mat<eT>& B, const bool do_trans_A, const bool do_trans_B);
85
86 template<typename eT>
87 arma_hot inline static void apply(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const eT val, const bool do_trans_A, const bool do_trans_B, const bool do_scalar_times);
88
89 template<typename eT>
90 inline static void apply(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C, const eT val, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool do_scalar_times);
91
92 template<typename eT>
93 inline static void apply(Mat<eT>& out, const Mat<eT>& A, const Mat<eT>& B, const Mat<eT>& C, const Mat<eT>& D, const eT val, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool do_trans_D, const bool do_scalar_times);
94
95 };
96
97
98
99 class glue_times_diag
100 {
101 public:
102
103 template<typename T1, typename T2>
104 arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times_diag>& X);
105
106 };
107
108
109
110 //! @}
111