|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r82689 - in trunk: boost/math/special_functions libs/math/test/compile_test
From: john_at_[hidden]
Date: 2013-02-06 20:24:14
Author: johnmaddock
Date: 2013-02-02 12:32:50 EST (Sat, 02 Feb 2013)
New Revision: 82689
URL: http://svn.boost.org/trac/boost/changeset/82689
Log:
Tweak airy zero interfaces.
Change output_iterator template param to OutputIterator.
Change iterator based functions to return iterator result.
Text files modified:
trunk/boost/math/special_functions/airy.hpp | 148 ++++++++++++++++++++++-----------------
trunk/boost/math/special_functions/bessel.hpp | 26 +++---
trunk/boost/math/special_functions/math_fwd.hpp | 78 ++++++++++++++------
trunk/libs/math/test/compile_test/instantiate.hpp | 26 +++++-
4 files changed, 173 insertions(+), 105 deletions(-)
Modified: trunk/boost/math/special_functions/airy.hpp
==============================================================================
--- trunk/boost/math/special_functions/airy.hpp (original)
+++ trunk/boost/math/special_functions/airy.hpp 2013-02-02 12:32:50 EST (Sat, 02 Feb 2013)
@@ -153,13 +153,11 @@
}
}
-template <class T>
-T airy_ai_zero_imp(T dummy, unsigned m)
+template <class T, class Policy>
+T airy_ai_zero_imp(unsigned m, const Policy& pol)
{
BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
- static_cast<void>(dummy);
-
// Handle cases when the zero'th zero is requested.
// Return NaN if NaN is available or return 0 if NaN is not available.
if(m == 0U)
@@ -188,7 +186,7 @@
// Perform the root-finding using Newton-Raphson iteration from Boost.Math.
const T am =
boost::math::tools::newton_raphson_iterate(
- boost::math::detail::airy_zero::airy_ai_zero_detail::function_object<T, policies::policy<> >(policies::policy<>()),
+ boost::math::detail::airy_zero::airy_ai_zero_detail::function_object<T, Policy>(pol),
guess_root,
T(guess_root - tolerance),
T(guess_root + tolerance),
@@ -200,28 +198,11 @@
return am;
}
-template <class output_iterator, class T>
-void airy_ai_zero_imp(T dummy,
- unsigned number_of_zeros,
- unsigned start_index,
- output_iterator out_it)
-{
- static_cast<void>(dummy);
-
- for(unsigned i = 0; i < number_of_zeros; ++i)
- {
- *out_it = boost::math::detail::airy_ai_zero_imp<T>(T(), start_index + i);
- ++out_it;
- }
-}
-
-template <class T>
-T airy_bi_zero_imp(T dummy, unsigned m)
+template <class T, class Policy>
+T airy_bi_zero_imp(unsigned m, const Policy& pol)
{
BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
- static_cast<void>(dummy);
-
// Handle cases when the zero'th zero is requested.
// Return NaN if NaN is available or return 0 if NaN is not available.
if(m == 0U)
@@ -251,7 +232,7 @@
// Perform the root-finding using Newton-Raphson iteration from Boost.Math.
const T bm =
boost::math::tools::newton_raphson_iterate(
- boost::math::detail::airy_zero::airy_bi_zero_detail::function_object<T, policies::policy<> >(policies::policy<>()),
+ boost::math::detail::airy_zero::airy_bi_zero_detail::function_object<T, Policy>(pol),
guess_root,
T(guess_root - tolerance),
T(guess_root + tolerance),
@@ -263,21 +244,6 @@
return bm;
}
-template <class output_iterator, class T>
-void airy_bi_zero_imp(T dummy,
- unsigned number_of_zeros,
- unsigned start_index,
- output_iterator out_it)
-{
- static_cast<void>(dummy);
-
- for(unsigned i = 0; i < number_of_zeros; ++i)
- {
- *out_it = boost::math::detail::airy_bi_zero_imp<T>(T(), start_index + i);
- ++out_it;
- }
-}
-
} // namespace detail
template <class T, class Policy>
@@ -368,48 +334,100 @@
return airy_bi_prime(x, policies::policy<>());
}
-template <class T>
-inline typename tools::promote_args<T>::type airy_ai_zero(T dummy, unsigned m)
+template <class T, class Policy>
+inline T airy_ai_zero(unsigned m, const Policy& pol)
{
BOOST_FPU_EXCEPTION_GUARD
- typedef typename tools::promote_args<T>::type result_type;
- BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy dummy parameter must be a floating-point type.");
- return policies::checked_narrowing_cast<result_type, policies::policy<> >(detail::airy_ai_zero_imp<result_type>(dummy, m), "boost::math::airy_ai_zero<%1%>(%1%)");
+ typedef typename policies::evaluation<T, Policy>::type value_type;
+ typedef typename policies::normalise<
+ Policy,
+ policies::promote_float<false>,
+ policies::promote_double<false>,
+ policies::discrete_quantile<>,
+ policies::assert_undefined<> >::type forwarding_policy;
+ BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Airy return type must be a floating-point type.");
+ return policies::checked_narrowing_cast<T, Policy>(detail::airy_ai_zero_imp<T>(m, pol), "boost::math::airy_ai_zero<%1%>(unsigned)");
+}
+
+template <class T>
+inline T airy_ai_zero(unsigned m)
+{
+ return airy_ai_zero<T>(m, policies::policy<>());
}
-template <class output_iterator, class T>
-inline void airy_ai_zero(T dummy,
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator airy_ai_zero(
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it)
+ OutputIterator out_it,
+ const Policy& pol)
+{
+ typedef T result_type;
+ BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy output type must be a floating-point type.");
+
+ for(unsigned i = 0; i < number_of_zeros; ++i)
+ {
+ *out_it = boost::math::airy_ai_zero<result_type>(start_index + i, pol);
+ ++out_it;
+ }
+ return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator airy_ai_zero(
+ unsigned number_of_zeros,
+ unsigned start_index,
+ OutputIterator out_it)
+{
+ return airy_ai_zero<T>(number_of_zeros, start_index, out_it, policies::policy<>());
+}
+
+template <class T, class Policy>
+inline T airy_bi_zero(unsigned m, const Policy& pol)
{
BOOST_FPU_EXCEPTION_GUARD
- static_cast<void>(dummy);
- typedef typename tools::promote_args<T>::type result_type;
- BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy dummy parameter must be a floating-point type.");
- boost::math::detail::airy_ai_zero_imp<output_iterator, result_type>(result_type(), number_of_zeros, start_index, out_it);
+ typedef typename policies::evaluation<T, Policy>::type value_type;
+ typedef typename policies::normalise<
+ Policy,
+ policies::promote_float<false>,
+ policies::promote_double<false>,
+ policies::discrete_quantile<>,
+ policies::assert_undefined<> >::type forwarding_policy;
+ BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Airy return type must be a floating-point type.");
+ return policies::checked_narrowing_cast<T, Policy>(detail::airy_bi_zero_imp<T>(m, pol), "boost::math::airy_bi_zero<%1%>(unsigned)");
}
template <class T>
-inline typename tools::promote_args<T>::type airy_bi_zero(T dummy, unsigned m)
+inline T airy_bi_zero(unsigned m)
{
- BOOST_FPU_EXCEPTION_GUARD
- typedef typename tools::promote_args<T>::type result_type;
- BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy dummy parameter must be a floating-point type.");
- return policies::checked_narrowing_cast<result_type, policies::policy<> >(detail::airy_bi_zero_imp<result_type>(result_type(), m), "boost::math::airy_bi_zero<%1%>(%1%)");
+ return airy_bi_zero<T>(m, policies::policy<>());
}
-template <class output_iterator, class T>
-inline void airy_bi_zero(T dummy,
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator airy_bi_zero(
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it)
+ OutputIterator out_it,
+ const Policy& pol)
{
- BOOST_FPU_EXCEPTION_GUARD
- static_cast<void>(dummy);
- typedef typename tools::promote_args<T>::type result_type;
- BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy dummy parameter must be a floating-point type.");
- boost::math::detail::airy_bi_zero_imp<output_iterator, result_type>(result_type(), number_of_zeros, start_index, out_it);
+ typedef T result_type;
+ BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy output type must be a floating-point type.");
+
+ for(unsigned i = 0; i < number_of_zeros; ++i)
+ {
+ *out_it = boost::math::airy_bi_zero<result_type>(start_index + i, pol);
+ ++out_it;
+ }
+ return out_it;
+}
+
+template <class T, class OutputIterator>
+inline OutputIterator airy_bi_zero(
+ unsigned number_of_zeros,
+ unsigned start_index,
+ OutputIterator out_it)
+{
+ return airy_bi_zero<T>(number_of_zeros, start_index, out_it, policies::policy<>());
}
}} // namespaces
Modified: trunk/boost/math/special_functions/bessel.hpp
==============================================================================
--- trunk/boost/math/special_functions/bessel.hpp (original)
+++ trunk/boost/math/special_functions/bessel.hpp 2013-02-02 12:32:50 EST (Sat, 02 Feb 2013)
@@ -555,11 +555,11 @@
return cyl_bessel_j_zero<T, policies::policy<> >(v, m, policies::policy<>());
}
-template <class output_iterator, class T, class Policy>
-inline void cyl_bessel_j_zero(T v,
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator cyl_bessel_j_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it,
+ OutputIterator out_it,
const Policy& pol)
{
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Order must be a floating-point type.");
@@ -568,13 +568,14 @@
*out_it = boost::math::cyl_bessel_j_zero(v, start_index + i, pol);
++out_it;
}
+ return out_it;
}
-template <class output_iterator, class T>
-inline void cyl_bessel_j_zero(T v,
+template <class T, class OutputIterator>
+inline OutputIterator cyl_bessel_j_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it)
+ OutputIterator out_it)
{
return cyl_bessel_j_zero(v, number_of_zeros, start_index, out_it, policies::policy<>());
}
@@ -596,11 +597,11 @@
return cyl_neumann_zero<T, policies::policy<> >(v, m, policies::policy<>());
}
-template <class output_iterator, class T, class Policy>
-inline void cyl_neumann_zero(T v,
+template <class T, class OutputIterator, class Policy>
+inline OutputIterator cyl_neumann_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it,
+ OutputIterator out_it,
const Policy& pol)
{
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Order must be a floating-point type.");
@@ -609,13 +610,14 @@
*out_it = boost::math::cyl_neumann_zero(v, start_index + i, pol);
++out_it;
}
+ return out_it;
}
-template <class output_iterator, class T>
-inline void cyl_neumann_zero(T v,
+template <class T, class OutputIterator>
+inline OutputIterator cyl_neumann_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it)
+ OutputIterator out_it)
{
return cyl_neumann_zero(v, number_of_zeros, start_index, out_it, policies::policy<>());
}
Modified: trunk/boost/math/special_functions/math_fwd.hpp
==============================================================================
--- trunk/boost/math/special_functions/math_fwd.hpp (original)
+++ trunk/boost/math/special_functions/math_fwd.hpp 2013-02-02 12:32:50 EST (Sat, 02 Feb 2013)
@@ -620,17 +620,17 @@
template <class T>
typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_bessel_j_zero(T v, unsigned m);
- template <class output_iterator, class T>
- void cyl_bessel_j_zero(T v,
+ template <class T, class OutputIterator>
+ OutputIterator cyl_bessel_j_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it);
+ OutputIterator out_it);
- template <class output_iterator, class T, class Policy>
- void cyl_bessel_j_zero(T v,
+ template <class T, class OutputIterator, class Policy>
+ OutputIterator cyl_bessel_j_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it,
+ OutputIterator out_it,
const Policy&);
template <class T, class Policy>
@@ -639,17 +639,17 @@
template <class T>
typename detail::bessel_traits<T, T, policies::policy<> >::result_type cyl_neumann_zero(T v, unsigned m);
- template <class output_iterator, class T>
- void cyl_neumann_zero(T v,
+ template <class T, class OutputIterator>
+ OutputIterator cyl_neumann_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it);
+ OutputIterator out_it);
- template <class output_iterator, class T, class Policy>
- void cyl_neumann_zero(T v,
+ template <class T, class OutputIterator, class Policy>
+ OutputIterator cyl_neumann_zero(T v,
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it,
+ OutputIterator out_it,
const Policy&);
template <class T1, class T2>
@@ -700,23 +700,39 @@
template <class T>
typename tools::promote_args<T>::type airy_bi_prime(T x);
+ template <class T>
+ T airy_ai_zero(unsigned m);
template <class T, class Policy>
- typename tools::promote_args<T>::type airy_ai_zero(T dummy, unsigned m);
+ T airy_ai_zero(unsigned m, const Policy&);
- template <class output_iterator, class T>
- void airy_ai_zero(T dummy,
+ template <class OutputIterator>
+ OutputIterator airy_ai_zero(
+ unsigned number_of_zeros,
+ unsigned start_index,
+ OutputIterator out_it);
+ template <class OutputIterator, class Policy>
+ OutputIterator airy_ai_zero(
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it);
+ OutputIterator out_it,
+ const Policy&);
+ template <class T>
+ T airy_bi_zero(unsigned m);
template <class T, class Policy>
- typename tools::promote_args<T>::type airy_bi_zero(T dummy, unsigned m);
+ T airy_bi_zero(unsigned m, const Policy&);
- template <class output_iterator, class T>
- void airy_bi_zero(T dummy,
+ template <class OutputIterator>
+ OutputIterator airy_bi_zero(
+ unsigned number_of_zeros,
+ unsigned start_index,
+ OutputIterator out_it);
+ template <class OutputIterator, class Policy>
+ OutputIterator airy_bi_zero(
unsigned number_of_zeros,
unsigned start_index,
- output_iterator out_it);
+ OutputIterator out_it,
+ const Policy&);
template <class T, class Policy>
typename tools::promote_args<T>::type sin_pi(T x, const Policy&);
@@ -1202,22 +1218,22 @@
inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type cyl_bessel_j_zero(T v, unsigned m)\
{ return boost::math::cyl_bessel_j_zero(v, m, Policy()); }\
\
-template <class output_iterator, class T>\
+template <class OutputIterator, class T>\
inline void cyl_bessel_j_zero(T v,\
unsigned number_of_zeros,\
unsigned start_index,\
- output_iterator out_it)\
+ OutputIterator out_it)\
{ boost::math::cyl_bessel_j_zero(v, number_of_zeros, start_index, out_it, Policy()); }\
\
template <class T>\
inline typename boost::math::detail::bessel_traits<T, T, Policy >::result_type cyl_neumann_zero(T v, unsigned m)\
{ return boost::math::cyl_neumann_zero(v, m, Policy()); }\
\
-template <class output_iterator, class T>\
+template <class OutputIterator, class T>\
inline void cyl_neumann_zero(T v,\
unsigned number_of_zeros,\
unsigned start_index,\
- output_iterator out_it)\
+ OutputIterator out_it)\
{ boost::math::cyl_neumann_zero(v, number_of_zeros, start_index, out_it, Policy()); }\
\
template <class T>\
@@ -1368,6 +1384,20 @@
inline typename boost::math::tools::promote_args<T>::type airy_bi_prime(T x)\
{ return boost::math::airy_bi_prime(x, Policy()); }\
\
+ template <class T>\
+ inline T airy_ai_zero(unsigned m)\
+ { return boost::math::airy_ai_zero<T>(m, Policy()); }\
+ template <class T, class OutputIterator>\
+ OutputIterator airy_ai_zero(unsigned number_of_zeros, unsigned start_index, OutputIterator out_it)\
+ { return boost::math::airy_ai_zero<T>(number_of_zeros, start_index, out_it, Policy()); }\
+ \
+ template <class T>\
+ inline T airy_bi_zero(unsigned m)\
+ { return boost::math::airy_bi_zero<T>(m, Policy()); }\
+ template <class T, class OutputIterator>\
+ OutputIterator airy_bi_zero(unsigned number_of_zeros, unsigned start_index, OutputIterator out_it)\
+ { return boost::math::airy_bi_zero<T>(number_of_zeros, start_index, out_it, Policy()); }\
+ \
Modified: trunk/libs/math/test/compile_test/instantiate.hpp
==============================================================================
--- trunk/libs/math/test/compile_test/instantiate.hpp (original)
+++ trunk/libs/math/test/compile_test/instantiate.hpp 2013-02-02 12:32:50 EST (Sat, 02 Feb 2013)
@@ -287,6 +287,12 @@
boost::math::airy_bi(v1);
boost::math::airy_ai_prime(v1);
boost::math::airy_bi_prime(v1);
+
+ boost::math::airy_ai_zero<RealType>(i);
+ boost::math::airy_bi_zero<RealType>(i);
+ boost::math::airy_ai_zero<RealType>(i, i, oi);
+ boost::math::airy_bi_zero<RealType>(i, i, oi);
+
boost::math::expint(v1);
boost::math::expint(i);
boost::math::expint(i, v2);
@@ -599,6 +605,12 @@
boost::math::airy_bi(v1, pol);
boost::math::airy_ai_prime(v1, pol);
boost::math::airy_bi_prime(v1, pol);
+
+ boost::math::airy_ai_zero<RealType>(i, pol);
+ boost::math::airy_bi_zero<RealType>(i, pol);
+ boost::math::airy_ai_zero<RealType>(i, i, oi, pol);
+ boost::math::airy_bi_zero<RealType>(i, i, oi, pol);
+
boost::math::expint(v1, pol);
boost::math::expint(i, pol);
boost::math::expint(i, v2, pol);
@@ -758,10 +770,16 @@
test::sph_hankel_2(v1, v2);
test::sph_hankel_2(i, v2);
#endif
- boost::math::airy_ai(i);
- boost::math::airy_bi(i);
- boost::math::airy_ai_prime(i);
- boost::math::airy_bi_prime(i);
+ test::airy_ai(i);
+ test::airy_bi(i);
+ test::airy_ai_prime(i);
+ test::airy_bi_prime(i);
+
+ test::airy_ai_zero<RealType>(i);
+ test::airy_bi_zero<RealType>(i);
+ test::airy_ai_zero<RealType>(i, i, oi);
+ test::airy_bi_zero<RealType>(i, i, oi);
+
test::expint(v1);
test::expint(i);
test::expint(i, v2);
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk