число оборотов аккумулятора повышения не ноль

Я пытаюсь использовать аккумуляторы, чтобы узнать статистику по данной активности в секунду. Ниже приведены две характеристики, которые я бы хотел вычислить

  • Количество срабатываний
  • Сумма общего веса, вызванного деятельностью.

    Чтобы достичь, я принял гранулярность на 10 мсек и с учетом 100 сегментов (в секунду).

  • Actvity Thread вставляется в аккумулятор всякий раз, когда происходит событие
  • Нулевая активность потока просыпается каждые 10 мсек, чтобы добавить 0 в весе.

Псевдо код ниже

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/rolling_count.hpp>
#include <boost/accumulators/statistics/rolling_sum.hpp>

using namespace boost::accumulators;

#define MAX_WEIGHT 100
#define MAX_ACIVITY 10

accumulator_set<double, features<tag::rolling_count, tag::rolling_sum> > acc(tag::rolling_window::window_size = 100);

void null_run()//invoked every 10 msecs
{
//mutex protected
acc(0);
}

void activity_triggered(int weight) // triggered by an external event
{
//mutex protected
acc(weight);
if (checkStatus() == false)
{
printf("Max quantity per sec reached stop ");
exit()
}
}bool checkStatus()
{
int weightPerSec  = rolling_sum(acc);
//here I would like to get the count only if non zero may be rolling_count_non_zero()??
int acitivitiesPersec = rolling_count(acc);

if (weightPerSec > MAX_WEIGHT)
return false;
if (acitivitiesPersec > MAX_ACTIVITY)
return false;
return true;
}

Используя вышеописанную технику, я могу набрать вес, введенный за последнюю секунду, но как мне достичь того, сколько раз активация была активирована за последнюю секунду с использованием аккумуляторов повышения?

0

Решение

Конечно rolling_count_non_zero звучит как подходящее название для того, что вы хотите (хотя это могло бы быть несколько более общим, может быть, rolling_count_if?).

Руководство пользователя Boost.accumulator описывает, как написать свои собственные аккумуляторы, функции и экстракторы, просто следуя этому описанию, похоже, работает следующее:

namespace boost { namespace accumulators { namespace impl {
template<typename Sample>
struct rolling_count_non_zero : accumulator_base
{
typedef std::size_t result_type;
rolling_count_non_zero(dont_care) : cnt_() {}
template<typename Args>
void operator ()(Args const &args)
{
if(args[sample] != 0)
++cnt_;
if(is_rolling_window_plus1_full(args)
&& rolling_window_plus1(args).front() != 0 )
--cnt_;
}
template<typename Args>
result_type result(Args const &args) const { return cnt_; }
private:
std::size_t cnt_;
};

} namespace tag {
struct rolling_count_non_zero : depends_on< rolling_window_plus1 >
{
typedef accumulators::impl::rolling_count_non_zero< mpl::_1 > impl;
};
} namespace extract {
extractor<tag::rolling_count_non_zero> const rolling_count_non_zero = {};
}
using extract::rolling_count_non_zero;
}}

живое демо: http://coliru.stacked-crooked.com/a/bc4bea090690f26d

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector