16#ifndef RANS_INTERNAL_CONTAINERS_DENSEHISTOGRAM_H_
17#define RANS_INTERNAL_CONTAINERS_DENSEHISTOGRAM_H_
24#include <fairlogger/Logger.h>
48namespace histogramImpl
51template <
typename source_T>
54 const auto [minIter, maxIter] = std::minmax_element(begin,
end);
55 return {*minIter, *maxIter};
60inline std::pair<uint32_t, uint32_t> minmaxImpl<uint32_t>(
const uint32_t* begin,
const uint32_t*
end)
62 return internal::simd::minmax(begin,
end);
66inline std::pair<int32_t, int32_t> minmaxImpl<int32_t>(
const int32_t* begin,
const int32_t*
end)
68 return internal::simd::minmax(begin,
end);
74template <
typename source_T>
75inline std::pair<source_T, source_T>
minmax(gsl::span<const source_T>
range)
77 const auto begin =
range.data();
78 const auto end = begin +
range.size();
79 return histogramImpl::minmaxImpl<source_T>(begin,
end);
86template <
typename source_T>
87inline std::pair<source_T, source_T>
minmax(gsl::span<const source_T>
range)
93template <
typename source_T,
typename =
void>
96template <
typename source_T>
99 typename internal::VectorContainer<source_T, uint32_t>::value_type,
100 typename internal::VectorContainer<source_T, uint32_t>::difference_type,
101 DenseHistogram<source_T>>
126 template <
typename freq_IT>
130 using HistogramConcept_type::addSamples;
132 using HistogramConcept_type::addFrequencies;
134 template <
typename source_IT>
137 if constexpr (std::is_pointer_v<source_IT>) {
140 return addSamplesImpl(begin,
end,
min,
max);
144 template <
typename source_IT>
147 return addSamplesImpl(span,
min,
max);
158 DenseHistogram& addSamplesImpl(gsl::span<const source_type> span);
160 template <
typename source_IT>
163 template <
typename source_IT>
168 template <
typename freq_IT>
172 inline static constexpr size_t MaxSize{
utils::pow2(30)};
174 bool isValidRange(difference_type
min, difference_type
max);
177template <
typename source_T>
178inline bool DenseHistogram<
source_T, std::enable_if_t<
sizeof(
source_T) == 4>>::isValidRange(difference_type
min, difference_type
max)
181 if constexpr (std::is_unsigned_v<source_T>) {
183 LOGP(warning,
"trying to add frequencies for a signed symbol to a DenseHistogram of an unsiged type.");
187 if (
max -
min >
static_cast<difference_type
>(this->MaxSize)) {
188 LOGP(warning,
"DenseHistogram exceeds {} elements threshold", this->MaxSize);
194template <
typename source_T>
201 LOG(warning) <<
"Passed empty message to " << __func__;
206template <
typename source_T>
207template <
typename source_IT>
211 const auto [minIter, maxIter] = std::minmax_element(begin,
end);
212 addSamplesImpl(begin,
end, *minIter, *maxIter);
214 LOG(warning) <<
"Passed empty message to " << __func__;
219template <
typename source_T>
222 using namespace internal;
223 using namespace utils;
230 const auto begin =
samples.data();
232 constexpr size_t ElemsPerQWord =
sizeof(uint64_t) /
sizeof(
source_type);
233 constexpr size_t nUnroll = 4 * ElemsPerQWord;
236 if (getRangeBits(
min,
max) <= 17) {
237 container_type histogram{this->mContainer.size(), this->mContainer.getOffset()};
239 auto addQWord = [&,
this](uint64_t in64) {
246 if (
end - nUnroll > begin) {
247 for (; iter <
end - nUnroll; iter += nUnroll) {
249 addQWord(load64(iter + ElemsPerQWord));
250 addQWord(load64(iter + 2 * ElemsPerQWord));
251 addQWord(load64(iter + 3 * ElemsPerQWord));
252 this->mNSamples += nUnroll;
253 __builtin_prefetch(iter + 512, 0);
257 while (iter !=
end) {
259 ++this->mContainer[*iter++];
261#if defined(RANS_OPENMP) && defined(RANS_SIMD)
264 for (
size_t i = 0;
i < this->
size(); ++
i) {
265 this->mContainer.data()[
i] += histogram.data()[
i];
268 auto addQWord = [&,
this](uint64_t in64) {
275 if (
end - nUnroll > begin) {
276 for (; iter <
end - nUnroll; iter += nUnroll) {
278 addQWord(load64(iter + ElemsPerQWord));
279 addQWord(load64(iter + 2 * ElemsPerQWord));
280 addQWord(load64(iter + 3 * ElemsPerQWord));
281 this->mNSamples += nUnroll;
282 __builtin_prefetch(iter + 512, 0);
286 while (iter !=
end) {
288 ++this->mContainer[*iter++];
295template <
typename source_T>
296template <
typename source_IT>
300 LOG(warning) <<
"Passed empty message to " << __func__;
303 if (!this->isValidRange(
min,
max)) {
304 throw HistogramError(fmt::format(
"Incompatible Frequency table dimensions: Cannot add samples in range [{},{}] to {} int32 histogram.",
305 min,
max, []() {
if constexpr (std::is_signed_v<source_T>) {
return "signed";}
else {
return "unsigned";} }()));
310 ++this->mContainer[symbol];
311 ++this->mNSamples; });
317template <
typename source_T>
318template <
typename freq_IT>
321 using namespace internal;
326 LOG(warning) <<
"Passed empty DenseHistogram to " << __func__;
332 if (!this->isValidRange(newMin, newMax) ||
333 newMin <
static_cast<difference_type>(std::numeric_limits<source_T>::min()) ||
334 newMax >
static_cast<difference_type>(std::numeric_limits<source_T>::max())) {
335 throw HistogramError(fmt::format(
"Incompatible Frequency table dimensions: Cannot add [{},{}] to {} int32 histogram.",
338 []() {if constexpr (std::is_signed_v<source_T>) {return
"signed";}
else {return
"unsigned";} }()));
344 return this->countSamples(frequency);
348 typename container_type::container_type newHistogram(newSize, 0);
351 assert(!histogramOverlap.empty());
356 assert(!histogramOverlap.empty());
359 histogramOverlap.begin(), histogramOverlap.begin(),
360 [
this](
const count_t&
a,
const count_t&
b) { return safeadd(this->countSamples(a), b); });
369template <
typename source_T>
372 using namespace utils;
374 auto getMaxSymbol = [
this]() {
379 max = std::max(
max, getMaxSymbol());
389 if (this->mContainer.empty()) {
396 return this->addFrequencies(oldHistogramView.begin(), oldHistogramView.end(), oldHistogramView.getMin());
400template <
typename source_T>
403 typename internal::VectorContainer<source_T, uint32_t>::value_type,
404 typename internal::VectorContainer<source_T, uint32_t>::difference_type,
405 DenseHistogram<source_T>>
413 friend containerBase_type;
414 friend HistogramConcept_type;
418 using value_type =
typename containerBase_type::value_type;
419 using container_type =
typename containerBase_type::container_type;
420 using size_type =
typename containerBase_type::size_type;
421 using difference_type =
typename containerBase_type::difference_type;
422 using reference =
typename containerBase_type::reference;
423 using const_reference =
typename containerBase_type::const_reference;
424 using pointer =
typename containerBase_type::pointer;
425 using const_pointer =
typename containerBase_type::const_pointer;
426 using const_iterator =
typename containerBase_type::const_iterator;
430 template <
typename freq_IT>
431 DenseHistogram(freq_IT begin, freq_IT
end, difference_type
offset) : containerBase_type{MaxSize,
std::numeric_limits<
source_type>::
min()},
432 HistogramConcept_type{begin,
end,
offset} {};
434 using HistogramConcept_type::addSamples;
436 template <
typename source_IT>
439 return addSamplesImpl(begin,
end);
442 template <
typename source_IT>
445 return addSamplesImpl(span);
448 using HistogramConcept_type::addFrequencies;
451 template <
typename source_IT>
452 DenseHistogram& addSamplesImpl(source_IT begin, source_IT
end);
454 DenseHistogram& addSamplesImpl(gsl::span<const source_type>
samples);
456 template <
typename freq_IT>
457 DenseHistogram& addFrequenciesImpl(freq_IT begin, freq_IT
end, difference_type
offset);
460 inline static constexpr size_t MaxSize = utils::pow2(utils::toBits<source_type>());
463template <
typename source_T>
464template <
typename source_IT>
465auto DenseHistogram<
source_T, std::enable_if_t<
sizeof(
source_T) <= 2>>::addSamplesImpl(source_IT begin, source_IT
end) -> DenseHistogram&
467 if constexpr (std::is_pointer_v<source_IT>) {
468 return addSamplesImpl({
begin,
end});
472 ++this->mContainer[symbol]; });
477template <
typename source_T>
478auto DenseHistogram<
source_T, std::enable_if_t<
sizeof(
source_T) <= 2>>::addSamplesImpl(gsl::span<const source_type>
samples) -> DenseHistogram&
480 using namespace internal;
481 using namespace utils;
489 constexpr size_t ElemsPerQWord =
sizeof(uint64_t) /
sizeof(
source_type);
490 constexpr size_t nUnroll = 2 * ElemsPerQWord;
495 std::array<ShiftableVector<source_type, value_type>, 3> histograms{
496 {{this->mContainer.size(), this->mContainer.getOffset()},
497 {this->mContainer.size(), this->mContainer.getOffset()},
498 {this->mContainer.size(), this->mContainer.getOffset()}}};
503 ++histograms[1][
static_cast<source_type>(
static_cast<uint16_t
>(
i) >> 8)];
506 ++this->mContainer[
static_cast<source_type>(
static_cast<uint16_t
>(
i) >> 8)];
509 ++histograms[1][
static_cast<source_type>(
static_cast<uint16_t
>(
i) >> 8)];
512 ++this->mContainer[
static_cast<source_type>(
static_cast<uint16_t
>(
i) >> 8)];
515 if (
end - nUnroll > begin) {
516 for (; iter <
end - nUnroll; iter += nUnroll) {
518 addQWord(load64(iter + ElemsPerQWord));
519 this->mNSamples += nUnroll;
520 __builtin_prefetch(iter + 512, 0);
526 ++this->mContainer[*iter++];
529#if defined(RANS_OPENMP)
530#pragma omp unroll full
532 for (
size_t j = 0;
j < 3; ++
j) {
533#if defined(RANS_OPENMP) && defined(RANS_SIMD)
536 for (
size_t i = 0;
i < 256; ++
i) {
537 this->mContainer(
i) += histograms[
j](
i);
541 container_type histogram{this->mContainer.size(), this->mContainer.getOffset()};
543 auto addQWord = [&,
this](uint64_t in64) {
546 ++this->mContainer[
static_cast<source_type>(
static_cast<uint32_t
>(
i) >> 16)];
549 ++this->mContainer[
static_cast<source_type>(
static_cast<uint32_t
>(
i) >> 16)];
552 if (
end - nUnroll > begin) {
553 for (; iter <
end - nUnroll; iter += nUnroll) {
556 this->mNSamples += nUnroll;
557 __builtin_prefetch(iter + 512, 0);
561 while (iter !=
end) {
563 ++this->mContainer[*iter++];
565#if defined(RANS_OPENMP) && defined(RANS_SIMD)
569 this->mContainer.data()[
i] += histogram.data()[
i];
576template <
typename source_T>
577template <
typename freq_IT>
578auto DenseHistogram<
source_T, std::enable_if_t<
sizeof(
source_T) <= 2>>::addFrequenciesImpl(freq_IT begin, freq_IT
end, difference_type
offset) -> DenseHistogram&
580 using namespace internal;
584 addedHistogramView = trim(addedHistogramView);
586 if constexpr (std::is_unsigned_v<source_T>) {
587 LOG_IF(warning,
addedHistogramView.getMin() < 0) << fmt::format(
"trying to add frequencies of a signed symbol type to a DenseHistogram of an unsiged type.");
589 if constexpr (std::is_signed_v<source_T>) {
590 const std::ptrdiff_t sourceTypeMax = std::numeric_limits<source_T>::max();
594 if (isMaxOutOfRange || isMinOutOfRange) {
595 LOGP(warning,
"trying to add frequencies of an unsigned symbol type to a DenseHistogram of a signed type");
602 if (isInvalidFrequencyRange) {
603 throw HistogramError(fmt::format(
"Incompatible Frequency table dimensions: Cannot add [{},{}] to [{}, {}] ",
613 auto frequency = *iter;
614 this->mContainer[
idx] = safeadd(this->mContainer[
idx], this->countSamples(frequency));
620template <
typename source_T>
Abstract container class that defines and implements basic properties shared by histograms and lookup...
Operations that will be performed on a histogram.
Non-owning, lightweight structure for histogram manipulation.
common helper classes and functions
typename containerBase_type::container_type container_type
DenseHistogram & addSamplesImpl(source_IT begin, source_IT end)
typename containerBase_type::const_iterator const_iterator
typename containerBase_type::const_pointer const_pointer
DenseHistogram & addSamplesImpl(source_IT begin, source_IT end, source_type min, source_type max)
typename containerBase_type::const_reference const_reference
typename containerBase_type::value_type value_type
DenseHistogram & resize(size_type newSize)
typename containerBase_type::reference reference
DenseHistogram(freq_IT begin, freq_IT end, difference_type offset)
typename containerBase_type::pointer pointer
DenseHistogram & addSamples(source_IT begin, source_IT end, source_type min, source_type max)
typename containerBase_type::difference_type difference_type
DenseHistogram & addFrequenciesImpl(freq_IT begin, freq_IT end, difference_type offset)
DenseHistogram & addSamples(gsl::span< const source_type > span, source_type min, source_type max)
typename containerBase_type::size_type size_type
typename base_type::reference reference
typename base_type::size_type size_type
typename base_type::const_pointer const_pointer
typename base_type::const_reference const_reference
typename base_type::value_type value_type
typename base_type::pointer pointer
typename base_type::const_iterator const_iterator
typename base_type::container_type container_type
typename base_type::difference_type difference_type
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
auto make_span(const o2::rans::internal::simd::AlignedArray< T, width_V, size_V > &array)
std::pair< source_T, source_T > minmaxImpl(const source_T *begin, const source_T *end)
uint64_t load64(const void *__restrict src)
std::pair< source_T, source_T > minmax(gsl::span< const source_T > range)
constexpr size_t pow2(size_t n) noexcept
std::pair< source_T, source_T > minmax(gsl::span< const source_T > range)
auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addFrequenciesImpl(freq_IT begin, freq_IT end, difference_type offset) -> DenseHistogram &HistogramView addedHistogramView
const auto thisHistogramView
class DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > > :public internal::VectorContainer< source_T, uint32_t >, internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >{ using containerBase_type=internal::VectorContainer< source_T, uint32_t >;using HistogramConcept_type=internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >;friend containerBase_type;friend HistogramConcept_type;public:using source_type=source_T;using value_type=typename containerBase_type::value_type;using container_type=typename containerBase_type::container_type;using size_type=typename containerBase_type::size_type;using difference_type=typename containerBase_type::difference_type;using reference=typename containerBase_type::reference;using const_reference=typename containerBase_type::const_reference;using pointer=typename containerBase_type::pointer;using const_pointer=typename containerBase_type::const_pointer;using const_iterator=typename containerBase_type::const_iterator;DenseHistogram() :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()} {};template< typename freq_IT > DenseHistogram(freq_IT begin, freq_IT end, difference_type offset) :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()}, HistogramConcept_type{begin, end, offset} {};using HistogramConcept_type::addSamples;template< typename source_IT > inline DenseHistogram &addSamples(source_IT begin, source_IT end, source_type min, source_type max) { return addSamplesImpl(begin, end);};template< typename source_IT > DenseHistogram &addSamples(gsl::span< const source_type > span, source_type min, source_type max) { return addSamplesImpl(span);};using HistogramConcept_type::addFrequencies;protected:template< typename source_IT > DenseHistogram &addSamplesImpl(source_IT begin, source_IT end);DenseHistogram &addSamplesImpl(gsl::span< const source_type > samples);template< typename freq_IT > DenseHistogram &addFrequenciesImpl(freq_IT begin, freq_IT end, difference_type offset);private:inline static constexpr size_t MaxSize=utils::pow2(utils::toBits< source_type >());};template< typename source_T >template< typename source_IT >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(source_IT begin, source_IT end) -> DenseHistogram &{ if constexpr(std::is_pointer_v< source_IT >) { return addSamplesImpl({begin, end});} else { std::for_each(begin, end, [this](const source_type &symbol) {++this->mNSamples;++this->mContainer[symbol];});} return *this;}template< typename source_T >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(gsl::span< const source_type > samples) -> DenseHistogram &{ using namespace internal;using namespace utils;if(samples.empty()) { return *this;} const auto begin=samples.data();const auto end=begin+samples.size();constexpr size_t ElemsPerQWord=sizeof(uint64_t)/sizeof(source_type);constexpr size_t nUnroll=2 *ElemsPerQWord;auto iter=begin;if constexpr(sizeof(source_type)==1) { std::array< ShiftableVector< source_type, value_type >, 3 > histograms{ {{this-> mContainer this mContainer auto addQWord
class DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > > :public internal::VectorContainer< source_T, uint32_t >, internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >{ using containerBase_type=internal::VectorContainer< source_T, uint32_t >;using HistogramConcept_type=internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >;friend containerBase_type;friend HistogramConcept_type;public:using source_type=source_T;using value_type=typename containerBase_type::value_type;using container_type=typename containerBase_type::container_type;using size_type=typename containerBase_type::size_type;using difference_type=typename containerBase_type::difference_type;using reference=typename containerBase_type::reference;using const_reference=typename containerBase_type::const_reference;using pointer=typename containerBase_type::pointer;using const_pointer=typename containerBase_type::const_pointer;using const_iterator=typename containerBase_type::const_iterator;DenseHistogram() :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()} {};template< typename freq_IT > DenseHistogram(freq_IT begin, freq_IT end, difference_type offset) :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()}, HistogramConcept_type{begin, end, offset} {};using HistogramConcept_type::addSamples;template< typename source_IT > inline DenseHistogram &addSamples(source_IT begin, source_IT end, source_type min, source_type max) { return addSamplesImpl(begin, end);};template< typename source_IT > DenseHistogram &addSamples(gsl::span< const source_type > span, source_type min, source_type max) { return addSamplesImpl(span);};using HistogramConcept_type::addFrequencies;protected:template< typename source_IT > DenseHistogram &addSamplesImpl(source_IT begin, source_IT end);DenseHistogram &addSamplesImpl(gsl::span< const source_type > samples);template< typename freq_IT > DenseHistogram &addFrequenciesImpl(freq_IT begin, freq_IT end, difference_type offset);private:inline static constexpr size_t MaxSize=utils::pow2(utils::toBits< source_type >());};template< typename source_T >template< typename source_IT >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(source_IT begin, source_IT end) -> DenseHistogram &{ if constexpr(std::is_pointer_v< source_IT >) { return addSamplesImpl({begin, end});} else { std::for_each(begin, end, [this](const source_type &symbol) {++this->mNSamples;++this->mContainer[symbol];});} return *this;}template< typename source_T >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(gsl::span< const source_type > samples) -> DenseHistogram &{ using namespace internal;using namespace utils;if(samples.empty()) { return *this;} const auto begin=samples.data();const auto end=begin+samples.size();constexpr size_t ElemsPerQWord=sizeof(uint64_t)/sizeof(source_type);constexpr size_t nUnroll=2 *ElemsPerQWord;auto iter=begin;if constexpr(sizeof(source_type)==1) { std::array< ShiftableVector< source_type, value_type >, 3 > histograms{ {{this-> mContainer this mContainer getOffset()}
HistogramView< HistA_IT > getIntersection(const HistogramView< HistA_IT > &histA, const HistogramView< HistB_IT > &histB)
class DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > > :public internal::VectorContainer< source_T, uint32_t >, internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >{ using containerBase_type=internal::VectorContainer< source_T, uint32_t >;using HistogramConcept_type=internal::HistogramConcept< source_T, typename internal::VectorContainer< source_T, uint32_t >::value_type, typename internal::VectorContainer< source_T, uint32_t >::difference_type, DenseHistogram< source_T > >;friend containerBase_type;friend HistogramConcept_type;public:using source_type=source_T;using value_type=typename containerBase_type::value_type;using container_type=typename containerBase_type::container_type;using size_type=typename containerBase_type::size_type;using difference_type=typename containerBase_type::difference_type;using reference=typename containerBase_type::reference;using const_reference=typename containerBase_type::const_reference;using pointer=typename containerBase_type::pointer;using const_pointer=typename containerBase_type::const_pointer;using const_iterator=typename containerBase_type::const_iterator;DenseHistogram() :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()} {};template< typename freq_IT > DenseHistogram(freq_IT begin, freq_IT end, difference_type offset) :containerBase_type{MaxSize, std::numeric_limits< source_type >::min()}, HistogramConcept_type{begin, end, offset} {};using HistogramConcept_type::addSamples;template< typename source_IT > inline DenseHistogram &addSamples(source_IT begin, source_IT end, source_type min, source_type max) { return addSamplesImpl(begin, end);};template< typename source_IT > DenseHistogram &addSamples(gsl::span< const source_type > span, source_type min, source_type max) { return addSamplesImpl(span);};using HistogramConcept_type::addFrequencies;protected:template< typename source_IT > DenseHistogram &addSamplesImpl(source_IT begin, source_IT end);DenseHistogram &addSamplesImpl(gsl::span< const source_type > samples);template< typename freq_IT > DenseHistogram &addFrequenciesImpl(freq_IT begin, freq_IT end, difference_type offset);private:inline static constexpr size_t MaxSize=utils::pow2(utils::toBits< source_type >());};template< typename source_T >template< typename source_IT >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(source_IT begin, source_IT end) -> DenseHistogram &{ if constexpr(std::is_pointer_v< source_IT >) { return addSamplesImpl({begin, end});} else { std::for_each(begin, end,[this](const source_type &symbol) {++this->mNSamples;++this->mContainer[symbol];});} return *this;}template< typename source_T >auto DenseHistogram< source_T, std::enable_if_t< sizeof(source_T)<=2 > >::addSamplesImpl(gsl::span< const source_type > samples) -> DenseHistogram &{ using namespace internal;using namespace utils;if(samples.empty()) { return *this;} const auto begin=samples.data();const auto end=begin+samples.size();constexpr size_t ElemsPerQWord=sizeof(uint64_t)/sizeof(source_type);constexpr size_t nUnroll=2 *ElemsPerQWord;auto iter=begin;if constexpr(sizeof(source_type)==1) { std::array< ShiftableVector< source_type, value_type >, 3 > histograms{ {{this-> mContainer size()
auto makeHistogramView(container_T &container, std::ptrdiff_t offset) noexcept -> HistogramView< decltype(std::begin(container))>
HistogramView< Hist_IT > trim(const HistogramView< Hist_IT > &buffer)
size_t countNUsedAlphabetSymbols(const AdaptiveHistogram< source_T > &histogram)
const bool isInvalidFrequencyRange
Enum< T >::Iterator begin(Enum< T >)
Defining DataPointCompositeObject explicitly as copiable.
Common utility functions.
wrapper around basic SIMD operations
basic SIMD datatypes and traits
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
auto getOffset(const map_T &resultsMap) -> typename map_T::key_type