00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018
00023
00024 template<typename glue_type, typename T1>
00025 struct depth_lhs
00026 {
00027 static const uword num = 0;
00028 };
00029
00030 template<typename glue_type, typename T1, typename T2>
00031 struct depth_lhs< glue_type, Glue<T1,T2,glue_type> >
00032 {
00033 static const uword num = 1 + depth_lhs<glue_type, T1>::num;
00034 };
00035
00036
00037
00038 template<uword N>
00039 struct glue_times_redirect
00040 {
00041 template<typename T1, typename T2>
00042 inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);
00043 };
00044
00045
00046 template<>
00047 struct glue_times_redirect<3>
00048 {
00049 template<typename T1, typename T2, typename T3>
00050 inline static void apply(Mat<typename T1::elem_type>& out, const Glue< Glue<T1,T2,glue_times>,T3,glue_times>& X);
00051 };
00052
00053
00054 template<>
00055 struct glue_times_redirect<4>
00056 {
00057 template<typename T1, typename T2, typename T3, typename T4>
00058 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);
00059 };
00060
00061
00062
00064 class glue_times
00065 {
00066 public:
00067
00068
00069 template<typename T1, typename T2>
00070 inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1,T2,glue_times>& X);
00071
00072
00073 template<typename T1>
00074 inline static void apply_inplace(Mat<typename T1::elem_type>& out, const T1& X);
00075
00076 template<typename T1, typename T2>
00077 arma_hot inline static void apply_inplace_plus(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times>& X, const sword sign);
00078
00079 template<typename eT1, typename eT2>
00080 inline static void apply_mixed(Mat<typename promote_type<eT1,eT2>::result>& out, const Mat<eT1>& X, const Mat<eT2>& Y);
00081
00082
00083 template<typename eT>
00084 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);
00085
00086 template<typename eT>
00087 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);
00088
00089 template<typename eT>
00090 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);
00091
00092 template<typename eT>
00093 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);
00094
00095 };
00096
00097
00098
00099 class glue_times_diag
00100 {
00101 public:
00102
00103 template<typename T1, typename T2>
00104 arma_hot inline static void apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_times_diag>& X);
00105
00106 };
00107
00108
00109
00111