Nano Hash - криптовалюты, майнинг, программирование

прокручивающийся счетчик буст-аккумулятора не равен нулю

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

  • Количество активаций активности

  • Сумма общего веса, вызванного активностью.

    Для достижения этого я предположил гранулярность на 10 мс и рассмотрел 100 сегментов (в секунду).

  • Поток активности вставляется в аккумулятор всякий раз, когда происходит событие

  • Null Activity 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;
}

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


Ответы:


1

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

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

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

07.11.2013
  • Спасибо Кубби. Это сработает. Хотя мне было интересно, могу ли я просто использовать то, что там существует. Может быть, я бы просто реализовал простой массив и сам реализовал бы скользящий подсчет. Это немного проще, чем включать это в базу проекта. Хотя было бы здорово, как вы сказали, если бы в аккумуляторе уже было что-то вроде roll_cout_if. Я написал Эрику Ниблеру по электронной почте, и он сказал, что мне придется реализовать собственный аккумулятор. Спасибо за код. 08.11.2013
  • Я думаю, что нам не нужно roll_window_plus1(args).front() != 0; поскольку мы никогда не вставляем 0. Верно? 08.11.2013
  • @Shanky front() — это элемент, который только что покинул скользящее окно. 08.11.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..