28 #ifndef SHARK_LINALG_BLAS_VECTOR_EXPRESSION_HPP 29 #define SHARK_LINALG_BLAS_VECTOR_EXPRESSION_HPP 31 #include <boost/type_traits/is_convertible.hpp> 32 #include <boost/utility/enable_if.hpp> 45 typedef typename E::const_closure_type expression_closure_type;
46 typedef typename E::size_type size_type;
47 typedef typename E::difference_type difference_type;
48 typedef typename E::value_type value_type;
49 typedef typename E::scalar_type scalar_type;
55 typedef typename E::index_type index_type;
59 typedef self_type
const const_closure_type;
67 m_expression(e()), m_scalar(scalar) {}
71 return m_expression.size();
82 return m_scalar * m_expression(i);
86 return m_scalar * m_expression(i);
93 m_expression.assign_to(x,alpha*m_scalar);
97 m_expression.plus_assign_to(x,alpha*m_scalar);
102 m_expression.minus_assign_to(x,alpha*m_scalar);
107 typedef transform_iterator<typename E::const_iterator,scalar_multiply1<value_type, scalar_type> >
const_iterator;
111 return const_iterator(m_expression.begin(),scalar_multiply1<value_type, scalar_type>(m_scalar));
113 const_iterator
end()
const {
114 return const_iterator(m_expression.end(),scalar_multiply1<value_type, scalar_type>(m_scalar));
117 expression_closure_type m_expression;
118 scalar_type m_scalar;
122 template<
class T,
class E>
123 typename boost::enable_if<
124 boost::is_convertible<T, typename E::scalar_type >,
128 typedef typename E::scalar_type scalar_type;
131 template<
class T,
class E>
132 typename boost::enable_if<
133 boost::is_convertible<T, typename E::scalar_type >,
137 typedef typename E::scalar_type scalar_type;
143 typedef typename E::scalar_type scalar_type;
153 typedef std::size_t size_type;
154 typedef std::ptrdiff_t difference_type;
155 typedef T value_type;
156 typedef T scalar_type;
163 typedef std::size_t index_type;
167 typedef self_type const_closure_type;
168 typedef self_type closure_type;
174 :m_size(0), m_value() {}
176 :m_size(size), m_value(value) {}
178 :m_size(v.m_size), m_value(v.m_value) {}
201 const_iterator
end()
const {
226 template<
class E,
class F>
231 typedef F functor_type;
232 typedef typename E::const_closure_type expression_closure_type;
233 typedef typename E::size_type size_type;
234 typedef typename E::difference_type difference_type;
235 typedef typename F::result_type value_type;
236 typedef value_type scalar_type;
242 typedef typename E::index_type index_type;
246 typedef self_type
const const_closure_type;
247 typedef self_type closure_type;
254 m_expression(e()), m_functor(functor) {}
258 return m_expression.size();
272 typename VecX::iterator
end=x().end();
273 for(
typename VecX::iterator pos =x().
begin(); pos !=
end; ++pos){
274 *pos= alpha * m_functor(*pos);
280 typename vector_temporary<self_type>::type temporary(
size());
288 typename vector_temporary<self_type>::type temporary(
size());
296 return m_functor(m_expression(i));
300 return m_functor(m_expression[i]);
303 typedef transform_iterator<typename E::const_iterator,functor_type>
const_iterator;
310 const_iterator
end()
const {
314 expression_closure_type m_expression;
320 #define SHARK_UNARY_VECTOR_TRANSFORMATION(name, F)\ 322 vector_unary<E,F<typename E::value_type> >\ 323 name(vector_expression<E> const& e){\ 324 typedef F<typename E::value_type> functor_type;\ 325 return vector_unary<E, functor_type>(e, functor_type());\ 340 #undef SHARK_UNARY_VECTOR_TRANSFORMATION 344 #define SHARK_VECTOR_SCALAR_TRANSFORMATION(name, F)\ 345 template<class T, class E> \ 346 typename boost::enable_if< \ 347 boost::is_convertible<T, typename E::value_type >,\ 348 vector_unary<E,F<typename E::value_type,T> > \ 350 name (vector_expression<E> const& e, T scalar){ \ 351 typedef F<typename E::value_type,T> functor_type; \ 352 return vector_unary<E, functor_type>(e, functor_type(scalar)); \ 364 #undef SHARK_VECTOR_SCALAR_TRANSFORMATION 367 #define SHARK_VECTOR_SCALAR_TRANSFORMATION_2(name, F)\ 368 template<class T, class E> \ 369 typename boost::enable_if< \ 370 boost::is_convertible<T, typename E::value_type >,\ 371 vector_unary<E,F<typename E::value_type,T> > \ 373 name (T scalar, vector_expression<E> const& e){ \ 374 typedef F<typename E::value_type,T> functor_type; \ 375 return vector_unary<E, functor_type>(e, functor_type(scalar)); \ 379 #undef SHARK_VECTOR_SCALAR_TRANSFORMATION_2 381 template<
class E1,
class E2>
384 typedef scalar_binary_plus<
385 typename E1::value_type,
386 typename E2::value_type
389 typedef std::size_t size_type;
390 typedef std::ptrdiff_t difference_type;
391 typedef typename functor_type::result_type value_type;
392 typedef value_type scalar_type;
398 typedef typename E1::index_type index_type;
402 typedef typename E1::const_closure_type expression_closure1_type;
403 typedef typename E2::const_closure_type expression_closure2_type;
406 typedef const_closure_type closure_type;
412 expression_closure1_type e1,
413 expression_closure2_type e2
414 ):m_expression1(e1),m_expression2(e2){
420 return m_expression1.size();
425 return m_expression1;
428 return m_expression2;
434 return m_expression1(i) + m_expression2(i);
439 return m_expression1(i) + m_expression2(i);
445 assign(x,alpha*m_expression1);
461 typedef binary_transform_iterator<
462 typename E1::const_iterator,
463 typename E2::const_iterator,
470 m_expression1.begin(),m_expression1.end(),
471 m_expression2.begin(),m_expression2.end()
476 m_expression1.end(),m_expression1.end(),
477 m_expression2.end(),m_expression2.end()
482 expression_closure1_type m_expression1;
483 expression_closure2_type m_expression2;
487 template<
class E1,
class E2>
495 template<
class E1,
class E2>
504 template<
class E,
class T>
505 typename boost::enable_if<
506 boost::is_convertible<T, typename E::value_type>,
516 template<
class T,
class E>
517 typename boost::enable_if<
518 boost::is_convertible<T, typename E::value_type>,
528 template<
class E,
class T>
529 typename boost::enable_if<
530 boost::is_convertible<T, typename E::value_type> ,
540 template<
class E,
class T>
541 typename boost::enable_if<
542 boost::is_convertible<T, typename E::value_type>,
552 template<
class E1,
class E2,
class F>
556 typedef E1
const expression1_type;
557 typedef E2
const expression2_type;
559 typedef std::size_t size_type;
560 typedef std::ptrdiff_t difference_type;
561 typedef typename F::result_type value_type;
562 typedef value_type scalar_type;
568 typedef typename E1::index_type index_type;
572 typedef F functor_type;
573 typedef typename E1::const_closure_type expression_closure1_type;
574 typedef typename E2::const_closure_type expression_closure2_type;
576 typedef self_type
const const_closure_type;
577 typedef self_type closure_type;
583 expression_closure1_type e1,
584 expression_closure2_type e2,
586 ):m_expression1(e1),m_expression2(e2), m_functor(functor) {
592 return m_expression1.size ();
597 return m_expression1;
600 return m_expression2;
606 return m_functor(m_expression1(i),m_expression2(i));
611 return m_functor(m_expression1(i),m_expression2(i));
618 typedef binary_transform_iterator<
619 typename E1::const_iterator,
620 typename E2::const_iterator,
627 m_expression1.begin(),m_expression1.end(),
628 m_expression2.begin(),m_expression2.end()
633 m_expression1.end(),m_expression1.end(),
634 m_expression2.end(),m_expression2.end()
639 expression_closure1_type m_expression1;
640 expression_closure2_type m_expression2;
644 #define SHARK_BINARY_VECTOR_EXPRESSION(name, F)\ 645 template<class E1, class E2>\ 646 vector_binary<E1, E2, F<typename E1::value_type, typename E2::value_type> >\ 647 name(vector_expression<E1> const& e1, vector_expression<E2> const& e2){\ 648 typedef F<typename E1::value_type, typename E2::value_type> functor_type;\ 649 return vector_binary<E1, E2, functor_type>(e1(),e2(), functor_type());\ 657 #undef SHARK_BINARY_VECTOR_EXPRESSION 659 template<
class E1,
class E2>
660 vector_binary<E1, E2,
661 scalar_binary_safe_divide<typename E1::value_type, typename E2::value_type>
666 typename promote_traits<
667 typename E1::value_type,
668 typename E2::value_type
669 >::promote_type defaultValue
671 typedef scalar_binary_safe_divide<typename E1::value_type, typename E2::value_type> functor_type;
679 typename E::value_type
681 typedef typename E::value_type value_type;
682 vector_fold<scalar_binary_plus<value_type, value_type> > kernel;
683 return kernel(e,value_type());
688 typename E::value_type
690 typedef typename E::value_type value_type;
691 vector_fold<scalar_binary_max<value_type, value_type> > kernel;
692 return kernel(e,e()(0));
697 typename E::value_type
699 typedef typename E::value_type value_type;
700 vector_fold<scalar_binary_min<value_type, value_type> > kernel;
701 return kernel(e,e()(0));
708 return std::max_element(e().
begin(),e().
end()).index();
726 typename E::value_type
728 typename E::value_type maximum =
max(e);
729 return std::log(
sum(exp(e - maximum))) + maximum;
737 typename real_traits<typename E::value_type >::type
744 typename real_traits<typename E::value_type >::type
751 typename real_traits<typename E::value_type >::type
759 typename real_traits<typename E::value_type >::type
771 template<
class E1,
class E2>
772 typename promote_traits<
773 typename E1::value_type,
774 typename E2::value_type
780 typedef typename promote_traits<
781 typename E1::value_type,
782 typename E2::value_type
783 >::promote_type value_type;
784 value_type result = value_type();