123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- // (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>
- #include <iostream>
- #include <iomanip>
- #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)
- {
- #ifdef BOOST_MSVC
- #pragma warning(push)
- #pragma warning(disable:4127)
- #endif
- 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;
- #ifdef BOOST_MSVC
- #pragma warning(pop)
- #endif
- }
- 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
|