handle_test_result.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 212 行

HPP
212
字号
//  (C) Copyright John Maddock 2006-7.//  Use, modification and distribution are subject to the//  Boost Software License, Version 1.0. (See accompanying file//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_MATH_HANDLE_TEST_RESULT#define BOOST_MATH_HANDLE_TEST_RESULT#include <boost/math/tools/stats.hpp>#include <boost/math/tools/test.hpp>#include <boost/math/tools/precision.hpp>#include <boost/regex.hpp>#include <boost/test/test_tools.hpp>#if defined(BOOST_INTEL)#  pragma warning(disable:239)#  pragma warning(disable:264)#endif//// Every client of this header has to define this function,// and initialise the table of expected results://void expected_results();typedef std::pair<boost::regex, std::pair<boost::uintmax_t, boost::uintmax_t> > expected_data_type;typedef std::list<expected_data_type> list_type;inline list_type&    get_expected_data(){   static list_type data;   return data;}inline void add_expected_result(   const char* compiler,   const char* library,   const char* platform,   const char* type_name,   const char* test_name,   const char* group_name,    boost::uintmax_t max_peek_error,    boost::uintmax_t max_mean_error){   std::string re("(?:");   re += compiler;   re += ")";   re += "\\|";   re += "(?:";   re += library;   re += ")";   re += "\\|";   re += "(?:";   re += platform;   re += ")";   re += "\\|";   re += "(?:";   re += type_name;   re += ")";   re += "\\|";   re += "(?:";   re += test_name;   re += ")";   re += "\\|";   re += "(?:";   re += group_name;   re += ")";   get_expected_data().push_back(      std::make_pair(boost::regex(re, boost::regex::perl | boost::regex::icase),          std::make_pair(max_peek_error, max_mean_error)));}inline std::string build_test_name(const char* type_name, const char* test_name, const char* group_name){   std::string result(BOOST_COMPILER);   result += "|";   result += BOOST_STDLIB;   result += "|";   result += BOOST_PLATFORM;   result += "|";   result += type_name;   result += "|";   result += group_name;   result += "|";   result += test_name;   return result;}inline const std::pair<boost::uintmax_t, boost::uintmax_t>&   get_max_errors(const char* type_name, const char* test_name, const char* group_name){   static const std::pair<boost::uintmax_t, boost::uintmax_t> defaults(1, 1);   std::string name = build_test_name(type_name, test_name, group_name);   list_type& l = get_expected_data();   list_type::const_iterator a(l.begin()), b(l.end());   while(a != b)   {      if(regex_match(name, a->first))      {#if 0         std::cout << name << std::endl;         std::cout << a->first.str() << std::endl;#endif         return a->second;      }      ++a;   }   return defaults;}template <class T, class Seq>void handle_test_result(const boost::math::tools::test_result<T>& result,                       const Seq& worst, int row,                        const char* type_name,                        const char* test_name,                        const char* group_name){   using namespace std; // To aid selection of the right pow.   T eps = boost::math::tools::epsilon<T>();   std::cout << std::setprecision(4);   T max_error_found = (result.max)()/eps;   T mean_error_found = result.rms()/eps;   //   // Begin by printing the main tag line with the results:   //   std::cout << test_name << "<" << type_name << "> Max = " << max_error_found      << " RMS Mean=" << mean_error_found;   //   // If the max error is non-zero, give the row of the table that   // produced the worst error:   //   if((result.max)() != 0)   {      std::cout << "\n    worst case at row: "         << row << "\n    { ";      if(std::numeric_limits<T>::digits10)      {         std::cout << std::setprecision(std::numeric_limits<T>::digits10 + 2);      }      else      {         std::cout << std::setprecision(std::numeric_limits<long double>::digits10 + 2);      }      for(unsigned i = 0; i < worst.size(); ++i)      {         if(i)            std::cout << ", ";#if defined(__SGI_STL_PORT)         std::cout << boost::math::tools::real_cast<double>(worst[i]);#else         std::cout << worst[i];#endif      }      std::cout << " }";   }   std::cout << std::endl;   //   // Now verify that the results are within our expected bounds:   //   std::pair<boost::uintmax_t, boost::uintmax_t> const& bounds = get_max_errors(type_name, test_name, group_name);   if(bounds.first < max_error_found)   {      std::cerr << "Peak error greater than expected value of " << bounds.first << std::endl;      BOOST_CHECK(bounds.first >= max_error_found);   }   if(bounds.second < mean_error_found)   {      std::cerr << "Mean error greater than expected value of " << bounds.second << std::endl;      BOOST_CHECK(bounds.second >= mean_error_found);   }   std::cout << std::endl;}template <class T, class Seq>void print_test_result(const boost::math::tools::test_result<T>& result,                       const Seq& worst, int row, const char* name, const char* test){   using namespace std; // To aid selection of the right pow.   T eps = boost::math::tools::epsilon<T>();   std::cout << std::setprecision(4);   T max_error_found = (result.max)()/eps;   T mean_error_found = result.rms()/eps;   //   // Begin by printing the main tag line with the results:   //   std::cout << test << "(" << name << ") Max = " << max_error_found      << " RMS Mean=" << mean_error_found;   //   // If the max error is non-zero, give the row of the table that   // produced the worst error:   //   if((result.max)() != 0)   {      std::cout << "\n    worst case at row: "         << row << "\n    { ";      for(unsigned i = 0; i < worst.size(); ++i)      {         if(i)            std::cout << ", ";         std::cout << worst[i];      }      std::cout << " }";   }   std::cout << std::endl;}#endif // BOOST_MATH_HANDLE_TEST_RESULT

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?