Statistics
| Revision:

root / tmp / org.txm.statsengine.r.core.win32 / res / win32 / library / BH / include / boost / accumulators / statistics / weighted_sum_kahan.hpp @ 2486

 1 ///////////////////////////////////////////////////////////////////////////////  // weighted_sum_kahan.hpp  //  // Copyright 2011 Simon West. 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)  #ifndef BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_SUM_KAHAN_HPP_EAN_11_05_2011  #define BOOST_ACCUMULATORS_STATISTICS_WEIGHTED_SUM_KAHAN_HPP_EAN_11_05_2011  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  namespace boost { namespace accumulators  {  namespace impl  {  #if _MSC_VER > 1400  # pragma float_control(push)  # pragma float_control(precise, on)  #endif   ///////////////////////////////////////////////////////////////////////////////   // weighted_sum_kahan_impl   template   struct weighted_sum_kahan_impl   : accumulator_base   {   typedef typename numeric::functional::multiplies::result_type weighted_sample;   // for boost::result_of   typedef weighted_sample result_type;   template   weighted_sum_kahan_impl(Args const &args)   : weighted_sum_(   args[parameter::keyword::get() | Sample()] * numeric::one::value),   compensation(boost::numeric_cast(0.0))   {   }   template   void  #if BOOST_ACCUMULATORS_GCC_VERSION > 40305   __attribute__((__optimize__("no-associative-math")))  #endif   operator ()(Args const &args)   {   const weighted_sample myTmp1 = args[parameter::keyword::get()] * args[weight] - this->compensation;   const weighted_sample myTmp2 = this->weighted_sum_ + myTmp1;   this->compensation = (myTmp2 - this->weighted_sum_) - myTmp1;   this->weighted_sum_ = myTmp2;   }   result_type result(dont_care) const   {   return this->weighted_sum_;   }   private:   weighted_sample weighted_sum_;   weighted_sample compensation;   };  #if _MSC_VER > 1400  # pragma float_control(pop)  #endif  } // namespace impl  ///////////////////////////////////////////////////////////////////////////////  // tag::weighted_sum_kahan  // tag::weighted_sum_of_variates_kahan  //  namespace tag  {   struct weighted_sum_kahan   : depends_on<>   {   /// INTERNAL ONLY   ///   typedef accumulators::impl::weighted_sum_kahan_impl impl;   };   template   struct weighted_sum_of_variates_kahan   : depends_on<>   {   /// INTERNAL ONLY   ///   typedef accumulators::impl::weighted_sum_kahan_impl impl;   };  }  ///////////////////////////////////////////////////////////////////////////////  // extract::weighted_sum_kahan  // extract::weighted_sum_of_variates_kahan  //  namespace extract  {   extractor const weighted_sum_kahan = {};   extractor const weighted_sum_of_variates_kahan = {};   BOOST_ACCUMULATORS_IGNORE_GLOBAL(weighted_sum_kahan)   BOOST_ACCUMULATORS_IGNORE_GLOBAL(weighted_sum_of_variates_kahan)  }  using extract::weighted_sum_kahan;  using extract::weighted_sum_of_variates_kahan;  // weighted_sum(kahan) -> weighted_sum_kahan  template<>  struct as_feature  {   typedef tag::weighted_sum_kahan type;  };  template  struct feature_of >   : feature_of  {  };  }} // namespace boost::accumulators  #endif