ViennaCL - The Vienna Computing Library  1.2.0
matrix_size_deducer.hpp
Go to the documentation of this file.
1 #ifndef VIENNACL_TOOLS_MATRIX_SIZE_DEDUCER_HPP_
2 #define VIENNACL_TOOLS_MATRIX_SIZE_DEDUCER_HPP_
3 
4 /* =========================================================================
5  Copyright (c) 2010-2011, Institute for Microelectronics,
6  Institute for Analysis and Scientific Computing,
7  TU Wien.
8 
9  -----------------
10  ViennaCL - The Vienna Computing Library
11  -----------------
12 
13  Project Head: Karl Rupp rupp@iue.tuwien.ac.at
14 
15  (A list of authors and contributors can be found in the PDF manual)
16 
17  License: MIT (X11), see file LICENSE in the base directory
18 ============================================================================= */
19 
24 #include <string>
25 #include <fstream>
26 #include <sstream>
27 #include "viennacl/forwards.h"
29 
30 #include <vector>
31 #include <map>
32 
33 namespace viennacl
34 {
35  namespace tools
36  {
37 
44  template <typename LHS, typename RHS, typename OP>
46  {
47  //Standard case: size1 from lhs, size2 from rhs (fits most cases)
48  static size_t size1(LHS & lhs, RHS & rhs) { return lhs.size1(); }
49  static size_t size2(LHS & lhs, RHS & rhs) { return rhs.size2(); }
50  };
51 
52  //special case: outer vector product:
53  template <typename ScalarType, unsigned int A1, unsigned int A2>
54  struct MATRIX_SIZE_DEDUCER<viennacl::vector<ScalarType, A1>,
55  viennacl::vector<ScalarType, A2>,
56  viennacl::op_prod>
57  {
59  viennacl::vector<ScalarType, A2> & rhs) { return lhs.size1(); }
60 
62  viennacl::vector<ScalarType, A2> & rhs) { return rhs.size2(); }
63  };
64 
65  //special case: transposed matrix-Something product: Return the number of rows of the matrix
66  /*template <typename MatrixType, typename ScalarType, unsigned int A>
67  struct MATRIX_SIZE_DEDUCER<MatrixType, const viennacl::vector<ScalarType, A>, viennacl::op_prod>
68  {
69  static unsigned int size(MatrixType & lhs, const viennacl::vector<ScalarType, A> & rhs) { return lhs.size1(); }
70  };*/
71 
72  template <typename ScalarType, typename F1, unsigned int A1, typename F2, unsigned int A2>
73  struct MATRIX_SIZE_DEDUCER<const viennacl::matrix_expression<const viennacl::matrix<ScalarType, F1, A1>,
74  const viennacl::matrix<ScalarType, F1, A1>, op_trans>,
75  const viennacl::matrix<ScalarType, F2, A2>,
76  viennacl::op_prod>
77  {
80  op_trans> const & lhs,
81  viennacl::matrix<ScalarType, F2, A2> const & rhs) { return lhs.lhs().size2(); }
84  op_trans> const & lhs,
85  viennacl::matrix<ScalarType, F2, A2> const & rhs) { return rhs.size2(); }
86  };
87 
88  template <typename ScalarType, typename F1, unsigned int A1, typename F2, unsigned int A2>
89  struct MATRIX_SIZE_DEDUCER<const viennacl::matrix<ScalarType, F1, A1>,
90  const viennacl::matrix_expression<const viennacl::matrix<ScalarType, F2, A2>,
91  const viennacl::matrix<ScalarType, F2, A2>, op_trans>,
92  viennacl::op_prod>
93  {
94  static size_t size1(viennacl::matrix<ScalarType, F1, A1> const & lhs,
97  op_trans> const & rhs) { return lhs.size1(); }
98  static size_t size2(viennacl::matrix<ScalarType, F1, A1> const & lhs,
101  op_trans> const & rhs) { return rhs.lhs().size1(); }
102  };
103 
104  }
105 }
106 
107 #endif
108