Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // weighted_moment.hpp Chris@16: // Chris@16: // Copyright 2006, Eric Niebler, Olivier Gygi. 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_WEIGHTED_MOMENT_HPP_EAN_15_11_2005 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_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: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // for pow() Chris@16: #include Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // weighted_moment_impl Chris@16: template Chris@16: struct weighted_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: typedef typename numeric::functional::multiplies::result_type weighted_sample; Chris@16: // for boost::result_of Chris@16: typedef typename numeric::functional::fdiv::result_type result_type; Chris@16: Chris@16: template Chris@16: weighted_moment_impl(Args const &args) Chris@16: : sum(args[sample | Sample()] * numeric::one::value) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: void operator ()(Args const &args) Chris@16: { Chris@16: this->sum += args[weight] * 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, sum_of_weights(args)); Chris@16: } Chris@16: Chris@16: private: Chris@16: weighted_sample sum; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::weighted_moment Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: template Chris@16: struct weighted_moment Chris@16: : depends_on Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::weighted_moment_impl, mpl::_1, mpl::_2> impl; Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::weighted_moment Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, weighted_moment, (int)) Chris@16: } Chris@16: Chris@16: using extract::weighted_moment; Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif