30 #ifndef SHARK_LINALG_BLAS_KERNELS_DEFAULT_DOT_HPP 31 #define SHARK_LINALG_BLAS_KERNELS_DEFAULT_DOT_HPP 33 #include "../traits.hpp" 34 #include <boost/mpl/bool.hpp> 36 namespace shark {
namespace blas {
namespace bindings{
39 template<
class E1,
class E2,
class result_type>
41 vector_expression<E1>
const& v1,
42 vector_expression<E2>
const& v2,
44 dense_random_access_iterator_tag,
45 dense_random_access_iterator_tag
47 std::size_t
size = v1().size();
48 result = result_type();
49 for(std::size_t i = 0; i !=
size; ++i){
50 result += v1()(i) * v2()(i);
54 template<
class E1,
class E2,
class result_type>
56 vector_expression<E1>
const& v1,
57 vector_expression<E2>
const& v2,
59 sparse_bidirectional_iterator_tag,
60 sparse_bidirectional_iterator_tag
62 typename E1::const_iterator iter1=v1().begin();
63 typename E1::const_iterator end1=v1().end();
64 typename E2::const_iterator iter2=v2().begin();
65 typename E2::const_iterator end2=v2().end();
66 result = result_type();
68 while(iter1 != end1 && iter2 != end2)
70 std::size_t index1=iter1.index();
71 std::size_t index2=iter2.index();
73 result += *iter1 * *iter2;
77 else if(index1> index2){
87 template<
class E1,
class E2,
class result_type>
89 vector_expression<E1>
const& v1,
90 vector_expression<E2>
const& v2,
92 dense_random_access_iterator_tag,
93 sparse_bidirectional_iterator_tag
95 typename E2::const_iterator iter2=v2().begin();
96 typename E2::const_iterator end2=v2().end();
97 result = result_type();
98 for(;iter2 != end2;++iter2){
99 result += v1()(iter2.index()) * *iter2;
103 template<
class E1,
class E2,
class result_type>
104 static void dot_impl(
105 vector_expression<E1>
const& v1,
106 vector_expression<E2>
const& v2,
108 sparse_bidirectional_iterator_tag t1,
109 dense_random_access_iterator_tag t2
112 dot_impl(v2,v1,result,t2,t1);
116 template<
class E1,
class E2,
class result_type>
118 vector_expression<E1>
const& v1,
119 vector_expression<E2>
const& v2,
124 return dot_impl(v1,v2,result,
125 typename E1::const_iterator::iterator_category(),
126 typename E2::const_iterator::iterator_category()