Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // mean.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_MEAN_HPP_EAN_28_10_2005 Chris@16: #define BOOST_ACCUMULATORS_STATISTICS_MEAN_HPP_EAN_28_10_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: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // mean_impl Chris@16: // lazy, by default Chris@16: template Chris@16: struct mean_impl Chris@16: : accumulator_base Chris@16: { Chris@16: // for boost::result_of Chris@16: typedef typename numeric::functional::fdiv::result_type result_type; Chris@16: Chris@16: mean_impl(dont_care) {} Chris@16: Chris@16: template Chris@16: result_type result(Args const &args) const Chris@16: { Chris@16: extractor sum; Chris@16: return numeric::fdiv(sum(args), count(args)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct immediate_mean_impl Chris@16: : accumulator_base Chris@16: { Chris@16: // for boost::result_of Chris@16: typedef typename numeric::functional::fdiv::result_type result_type; Chris@16: Chris@16: template Chris@16: immediate_mean_impl(Args const &args) Chris@16: : mean(numeric::fdiv(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: std::size_t cnt = count(args); Chris@16: this->mean = numeric::fdiv( Chris@16: (this->mean * (cnt - 1)) + args[parameter::keyword::get()] Chris@16: , cnt Chris@16: ); Chris@16: } Chris@16: Chris@16: result_type result(dont_care) const Chris@16: { Chris@16: return this->mean; Chris@16: } Chris@16: Chris@16: private: Chris@16: result_type mean; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // tag::mean Chris@16: // tag::immediate_mean Chris@16: // tag::mean_of_weights Chris@16: // tag::immediate_mean_of_weights Chris@16: // tag::mean_of_variates Chris@16: // tag::immediate_mean_of_variates Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: struct mean Chris@16: : depends_on Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::mean_impl impl; Chris@16: }; Chris@16: struct immediate_mean Chris@16: : depends_on Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::immediate_mean_impl impl; Chris@16: }; Chris@16: struct mean_of_weights Chris@16: : depends_on Chris@16: { Chris@16: typedef mpl::true_ is_weight_accumulator; Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::mean_impl impl; Chris@16: }; Chris@16: struct immediate_mean_of_weights Chris@16: : depends_on Chris@16: { Chris@16: typedef mpl::true_ is_weight_accumulator; Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef accumulators::impl::immediate_mean_impl impl; Chris@16: }; Chris@16: template Chris@16: struct mean_of_variates Chris@16: : depends_on > Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef mpl::always > > impl; Chris@16: }; Chris@16: template Chris@16: struct immediate_mean_of_variates Chris@16: : depends_on Chris@16: { Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: typedef mpl::always > impl; Chris@16: }; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // extract::mean Chris@16: // extract::mean_of_weights Chris@16: // extract::mean_of_variates Chris@16: // Chris@16: namespace extract Chris@16: { Chris@16: extractor const mean = {}; Chris@16: extractor const mean_of_weights = {}; Chris@16: BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, mean_of_variates, (typename)(typename)) Chris@16: Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(mean) Chris@16: BOOST_ACCUMULATORS_IGNORE_GLOBAL(mean_of_weights) Chris@16: } Chris@16: Chris@16: using extract::mean; Chris@16: using extract::mean_of_weights; Chris@16: using extract::mean_of_variates; Chris@16: Chris@16: // mean(lazy) -> mean Chris@16: template<> Chris@16: struct as_feature Chris@16: { Chris@16: typedef tag::mean type; Chris@16: }; Chris@16: Chris@16: // mean(immediate) -> immediate_mean Chris@16: template<> Chris@16: struct as_feature Chris@16: { Chris@16: typedef tag::immediate_mean type; Chris@16: }; Chris@16: Chris@16: // mean_of_weights(lazy) -> mean_of_weights Chris@16: template<> Chris@16: struct as_feature Chris@16: { Chris@16: typedef tag::mean_of_weights type; Chris@16: }; Chris@16: Chris@16: // mean_of_weights(immediate) -> immediate_mean_of_weights Chris@16: template<> Chris@16: struct as_feature Chris@16: { Chris@16: typedef tag::immediate_mean_of_weights type; Chris@16: }; Chris@16: Chris@16: // mean_of_variates(lazy) -> mean_of_variates Chris@16: template Chris@16: struct as_feature(lazy)> Chris@16: { Chris@16: typedef tag::mean_of_variates type; Chris@16: }; Chris@16: Chris@16: // mean_of_variates(immediate) -> immediate_mean_of_variates Chris@16: template Chris@16: struct as_feature(immediate)> Chris@16: { Chris@16: typedef tag::immediate_mean_of_variates type; Chris@16: }; Chris@16: Chris@16: // for the purposes of feature-based dependency resolution, Chris@16: // immediate_mean provides the same feature as mean Chris@16: template<> Chris@16: struct feature_of Chris@16: : feature_of Chris@16: { Chris@16: }; Chris@16: Chris@16: // for the purposes of feature-based dependency resolution, Chris@16: // immediate_mean provides the same feature as mean Chris@16: template<> Chris@16: struct feature_of Chris@16: : feature_of Chris@16: { Chris@16: }; Chris@16: Chris@16: // for the purposes of feature-based dependency resolution, Chris@16: // immediate_mean provides the same feature as mean Chris@16: template Chris@16: struct feature_of > Chris@16: : feature_of > Chris@16: { Chris@16: }; Chris@16: Chris@16: // So that mean can be automatically substituted with Chris@16: // weighted_mean when the weight parameter is non-void. Chris@16: template<> Chris@16: struct as_weighted_feature Chris@16: { Chris@16: typedef tag::weighted_mean type; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct feature_of Chris@16: : feature_of Chris@16: {}; Chris@16: Chris@16: // So that immediate_mean can be automatically substituted with Chris@16: // immediate_weighted_mean when the weight parameter is non-void. Chris@16: template<> Chris@16: struct as_weighted_feature Chris@16: { Chris@16: typedef tag::immediate_weighted_mean type; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct feature_of Chris@16: : feature_of Chris@16: {}; Chris@16: Chris@16: // So that mean_of_weights<> can be automatically substituted with Chris@16: // weighted_mean_of_variates<> when the weight parameter is non-void. Chris@16: template Chris@16: struct as_weighted_feature > Chris@16: { Chris@16: typedef tag::weighted_mean_of_variates 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: // So that immediate_mean_of_weights<> can be automatically substituted with Chris@16: // immediate_weighted_mean_of_variates<> when the weight parameter is non-void. Chris@16: template Chris@16: struct as_weighted_feature > Chris@16: { Chris@16: typedef tag::immediate_weighted_mean_of_variates 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: //////////////////////////////////////////////////////////////////////////// Chris@16: //// droppable_accumulator Chris@16: //// need to specialize droppable lazy mean to cache the result at the Chris@16: //// point the accumulator is dropped. Chris@16: ///// INTERNAL ONLY Chris@16: ///// Chris@16: //template Chris@16: //struct droppable_accumulator > Chris@16: // : droppable_accumulator_base< Chris@16: // with_cached_result > Chris@16: // > Chris@16: //{ Chris@16: // template Chris@16: // droppable_accumulator(Args const &args) Chris@16: // : droppable_accumulator::base(args) Chris@16: // { Chris@16: // } Chris@16: //}; Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: #endif