Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // moment.hpp Chris@16: // Chris@16: // Copyright 2005 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_ACCUMULATORS_STATISTICS_MOMENT_HPP_EAN_15_11_2005 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_MOMENT_HPP_EAN_15_11_2005 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace numeric Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: template Chris@16: T const &pow(T const &x, mpl::int_<1>) Chris@16: { Chris@16: return x; Chris@16: } Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: template Chris@16: T pow(T const &x, mpl::int_) Chris@16: { Chris@16: using namespace operators; Chris@16: T y = numeric::pow(x, mpl::int_()); Chris@16: T z = y * y; Chris@16: return (N % 2) ? (z * x) : z; Chris@16: } Chris@16: }} Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // moment_impl Chris@16: template Chris@16: struct moment_impl Chris@16: : accumulator_base // TODO: also depends_on sum of powers Chris@16: { Chris@16: BOOST_MPL_ASSERT_RELATION(N::value, >, 0); Chris@16: // for boost::result_of Chris@16: typedef typename numeric::functional::fdiv::result_type result_type; Chris@16: Chris@16: template Chris@16: moment_impl(Args const &args) Chris@16: : sum(args[sample | Sample()]) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: void operator ()(Args const &args) Chris@16: { Chris@16: this->sum += numeric::pow(args[sample], N()); Chris@16: } Chris@16: Chris@16: template Chris@16: result_type result(Args const &args) const Chris@16: { Chris@16: return numeric::fdiv(this->sum, count(args)); Chris@16: } Chris@16: Chris@16: private: Chris@16: Sample sum; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::moment Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: template Chris@16: struct moment Chris@16: : depends_on Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::moment_impl, mpl::_1> impl; Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::moment Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, moment, (int)) Chris@16: } Chris@16: Chris@16: using extract::moment; Chris@16: Chris@16: // So that moment can be automatically substituted with Chris@16: // weighted_moment when the weight parameter is non-void Chris@16: template Chris@16: struct as_weighted_feature > Chris@16: { Chris@16: typedef tag::weighted_moment type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct feature_of > Chris@16: : feature_of > Chris@16: { Chris@16: }; Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif