mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			140 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | [section:error_test Relative Error and Testing] | ||
|  | 
 | ||
|  | [h4 Synopsis] | ||
|  | 
 | ||
|  | `` | ||
|  | #include <boost/math/tools/test.hpp> | ||
|  | `` | ||
|  | 
 | ||
|  | [important | ||
|  | The header `boost/math/tools/test.hpp` is located under `libs/math/include_private` | ||
|  | and is not installed to the usual locations by default, you will need to add `libs/math/include_private` | ||
|  | to your compiler's include path in order to use this header.] | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    T relative_error(T a, T b); | ||
|  |     | ||
|  |    template <class A, class F1, class F2> | ||
|  |    test_result<see-below> test(const A& a, F1 test_func, F2 expect_func); | ||
|  | 
 | ||
|  | [h4 Description] | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    T relative_error(T a, T v); | ||
|  | 
 | ||
|  | Returns the relative error between /a/ and /v/ using the usual formula: | ||
|  | 
 | ||
|  | [equation error1] | ||
|  | 
 | ||
|  | In addition the value returned is zero if: | ||
|  | 
 | ||
|  | * Both /a/ and /v/ are infinite. | ||
|  | * Both /a/ and /v/ are denormalised numbers or zero. | ||
|  | 
 | ||
|  | Otherwise if only one of /a/ and /v/ is zero then the value returned is 1. | ||
|  | 
 | ||
|  |    template <class A, class F1, class F2> | ||
|  |    test_result<see-below> test(const A& a, F1 test_func, F2 expect_func); | ||
|  |     | ||
|  | This function is used for testing a function against tabulated test data. | ||
|  | 
 | ||
|  | The return type contains statistical data on the relative errors (max, mean, | ||
|  | variance, and the number of test cases etc), as well as the row of test data that | ||
|  | caused the largest relative error.  Public members of type test_result are: | ||
|  | 
 | ||
|  | [variablelist | ||
|  | [[`unsigned worst()const;`][Returns the row at which the worst error occurred.]] | ||
|  | [[`T min()const;`][Returns the smallest relative error found.]] | ||
|  | [[`T max()const;`][Returns the largest relative error found.]] | ||
|  | [[`T mean()const;`][Returns the mean error found.]] | ||
|  | [[`boost::uintmax_t count()const;`][Returns the number of test cases.]] | ||
|  | [[`T variance()const;`][Returns the variance of the errors found.]] | ||
|  | [[`T variance1()const;`][Returns the unbiased variance of the errors found.]] | ||
|  | [[`T rms()const`][Returns the Root Mean Square, or quadratic mean of the errors.]] | ||
|  | [[`test_result& operator+=(const test_result& t)`][Combines two test_result's into | ||
|  | a single result.]] | ||
|  | ] | ||
|  | 
 | ||
|  | The template parameter of test_result, is the same type as the values in the two | ||
|  | dimensional array passed to function /test/, roughly that's  | ||
|  | `A::value_type::value_type`. | ||
|  | 
 | ||
|  | Parameter /a/ is a matrix of test data: and must be a standard library Sequence type, | ||
|  | that contains another Sequence type: | ||
|  | typically it will be a two dimensional instance of  | ||
|  | [^boost::array].  Each row | ||
|  | of /a/ should contain all the parameters that are passed to the function  | ||
|  | under test as well as the expected result. | ||
|  | 
 | ||
|  | Parameter /test_func/ is the function under test, it is invoked with each row | ||
|  | of test data in /a/.  Typically type F1 is created with Boost.Lambda: see  | ||
|  | the example below. | ||
|  | 
 | ||
|  | Parameter /expect_func/ is a functor that extracts the expected result | ||
|  | from a row of test data in /a/.  Typically type F2 is created with Boost.Lambda: see  | ||
|  | the example below. | ||
|  | 
 | ||
|  | If the function under test returns a non-finite value when a finite result is | ||
|  | expected, or if a gross error is found, then a message is sent to `std::cerr`, | ||
|  | and a call to BOOST_ERROR() made (which means that including this header requires | ||
|  | you use Boost.Test).  This is mainly a debugging/development aid  | ||
|  | (and a good place for a breakpoint). | ||
|  | 
 | ||
|  | [h4 Example] | ||
|  | 
 | ||
|  | Suppose we want to test the tgamma and lgamma functions, we can create a | ||
|  | two dimensional matrix of test data, each row is one test case, and contains | ||
|  | three elements: the input value, and the expected results for the tgamma and | ||
|  | lgamma functions respectively. | ||
|  | 
 | ||
|  |    static const boost::array<boost::array<TestType, 3>, NumberOfTests>  | ||
|  |       factorials = { | ||
|  |          /* big array of test data goes here */ | ||
|  |       }; | ||
|  | 
 | ||
|  | Now we can invoke the test function to test tgamma: | ||
|  |     | ||
|  |    using namespace boost::math::tools; | ||
|  |    using namespace boost::lambda; | ||
|  |     | ||
|  |    // get a pointer to the function under test: | ||
|  |    TestType (*funcp)(TestType) = boost::math::tgamma; | ||
|  |     | ||
|  |    // declare something to hold the result: | ||
|  |    test_result<TestType> result; | ||
|  |    // | ||
|  |    // and test tgamma against data: | ||
|  |    // | ||
|  |    result = test( | ||
|  |       factorials,  | ||
|  |       bind(funcp, ret<TestType>(_1[0])), // calls tgamma with factorials[row][0] | ||
|  |       ret<TestType>(_1[1])               // extracts the expected result from factorials[row][1] | ||
|  |    ); | ||
|  |    // | ||
|  |    // Print out some results: | ||
|  |    // | ||
|  |    std::cout << "The Mean was " << result.mean() << std::endl; | ||
|  |    std::cout << "The worst error was " << (result.max)() << std::endl; | ||
|  |    std::cout << "The worst error was at row " << result.worst_case() << std::endl; | ||
|  |    // | ||
|  |    // same again with lgamma this time: | ||
|  |    // | ||
|  |    funcp = boost::math::lgamma; | ||
|  |    result = test( | ||
|  |       factorials,  | ||
|  |       bind(funcp, ret<TestType>(_1[0])), // calls tgamma with factorials[row][0] | ||
|  |       ret<TestType>(_1[2])               // extracts the expected result from factorials[row][2] | ||
|  |    ); | ||
|  |    // | ||
|  |    // etc ... | ||
|  |    // | ||
|  |     | ||
|  | [endsect][/section:error_test Relative Error and Testing] | ||
|  | 
 | ||
|  | [/  | ||
|  |   Copyright 2006 John Maddock and Paul A. Bristow. | ||
|  |   Distributed under 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). | ||
|  | ] |