|
ViennaCL - The Vienna Computing Library
1.1.2
|
00001 /* ======================================================================= 00002 Copyright (c) 2010, Institute for Microelectronics, TU Vienna. 00003 http://www.iue.tuwien.ac.at 00004 ----------------- 00005 ViennaCL - The Vienna Computing Library 00006 ----------------- 00007 00008 authors: Karl Rupp rupp@iue.tuwien.ac.at 00009 Florian Rudolf flo.rudy+viennacl@gmail.com 00010 Josef Weinbub weinbub@iue.tuwien.ac.at 00011 00012 license: MIT (X11), see file LICENSE in the ViennaCL base directory 00013 ======================================================================= */ 00014 00015 #ifndef _VIENNACL_NORM_INF_HPP_ 00016 #define _VIENNACL_NORM_INF_HPP_ 00017 00022 #include <math.h> //for sqrt() 00023 #include "viennacl/forwards.h" 00024 #include "tag_of.hpp" 00025 00026 namespace viennacl 00027 { 00028 // 00029 // generic norm_inf function 00030 // uses tag dispatch to identify which algorithm 00031 // should be called 00032 // 00033 namespace linalg 00034 { 00035 00036 #ifdef VIENNACL_HAVE_UBLAS 00037 // ---------------------------------------------------- 00038 // UBLAS 00039 // 00040 template< typename VectorT > 00041 typename VectorT::value_type 00042 norm_inf(VectorT const& v1, 00043 typename viennacl::tools::enable_if< viennacl::is_ublas< typename viennacl::traits::tag_of< VectorT >::type >::value 00044 >::type* dummy = 0) 00045 { 00046 // std::cout << "ublas .. " << std::endl; 00047 return boost::numeric::ublas::norm_inf(v1); 00048 } 00049 #endif 00050 00051 00052 // ---------------------------------------------------- 00053 // STL 00054 // 00055 template< typename VectorT> 00056 typename VectorT::value_type 00057 norm_inf(VectorT const& v1, 00058 typename viennacl::tools::enable_if< viennacl::is_stl< typename viennacl::traits::tag_of< VectorT >::type >::value 00059 >::type* dummy = 0) 00060 { 00061 //std::cout << "stl .. " << std::endl; 00062 typename VectorT::value_type result = 0; 00063 for (typename VectorT::size_type i=0; i<v1.size(); ++i) 00064 { 00065 if (fabs(v1[i]) > result) 00066 result = fabs(v1[i]); 00067 } 00068 00069 return result; 00070 } 00071 00072 // ---------------------------------------------------- 00073 // VIENNACL 00074 // 00075 template< typename ScalarType, unsigned int alignment > 00076 viennacl::scalar_expression< const viennacl::vector<ScalarType, alignment>, 00077 const viennacl::vector<ScalarType, alignment>, 00078 viennacl::op_norm_inf > 00079 norm_inf(viennacl::vector<ScalarType, alignment> const & v1, 00080 typename viennacl::tools::enable_if< viennacl::is_viennacl< typename viennacl::traits::tag_of< viennacl::vector<ScalarType, alignment> >::type >::value 00081 >::type* dummy = 0) 00082 { 00083 //std::cout << "viennacl .. " << std::endl; 00084 return viennacl::scalar_expression< const viennacl::vector<ScalarType, alignment>, 00085 const viennacl::vector<ScalarType, alignment>, 00086 viennacl::op_norm_inf >(v1, v1); 00087 } 00088 00089 } // end namespace linalg 00090 } // end namespace viennacl 00091 #endif 00092 00093 00094 00095 00096
1.7.6.1