16#ifndef RANS_INTERNAL_ENCODE_ENCODERSYMBOLMAPPER_H_
17#define RANS_INTERNAL_ENCODE_ENCODERSYMBOLMAPPER_H_
21#include <fairlogger/Logger.h>
37template <
typename symbolTable_T,
typename coder_T,
typename incompressible_IT,
typename derived_T>
50 template <
typename source_IT>
53 return static_cast<derived_T*
>(
this)->
unpackSymbols(sourceIter, symbol, nStreams);
56 template <
typename source_IT>
59 return static_cast<derived_T*
>(
this)->
unpackSymbols(sourceIter, symbol);
65 template <
typename source_IT>
69 if constexpr (!std::is_null_pointer_v<incompressible_iterator>) {
70 const symbol_type& symbol = (*mSymbolTable)[*sourceIter];
89template <
typename symbolTable_T,
typename coder_T,
typename incompressible_IT = std::
nullptr_t>
93 EncoderSymbolMapper<symbolTable_T, coder_T, incompressible_IT>>
107 static_assert(coder_type::getNstreams() == 1);
113 template <
typename source_IT>
120 template <
typename source_IT>
127template <
size_t streamingLowerBound_V,
typename symbolTable_T,
typename incompressible_IT>
131 CompatEncoderImpl<streamingLowerBound_V>,
133 EncoderSymbolMapper<symbolTable_T, incompressible_IT>>
147 static_assert(coder_type::getNstreams() == 1);
153 template <
typename source_IT>
160 template <
typename source_IT>
167#ifdef RANS_SINGLE_STREAM
168template <
size_t streamingLowerBound_V,
typename symbolTable_T,
typename incompressible_IT>
169class EncoderSymbolMapper<symbolTable_T,
170 SingleStreamEncoderImpl<streamingLowerBound_V>,
172 SingleStreamEncoderImpl<streamingLowerBound_V>,
174 EncoderSymbolMapper<symbolTable_T, incompressible_IT>>
176 using base_type = EncoderSymbolMapperInterface<symbolTable_T, SingleStreamEncoderImpl<streamingLowerBound_V>,
incompressible_IT, EncoderSymbolMapper<symbolTable_T, incompressible_IT>>;
188 static_assert(coder_type::getNstreams() == 1);
194 template <
typename source_IT>
201 template <
typename source_IT>
210template <
size_t streamingLowerBound_V,
typename symbolTable_T,
typename incompressible_IT>
211class EncoderSymbolMapper<symbolTable_T,
212 SSEEncoderImpl<streamingLowerBound_V>,
214 SSEEncoderImpl<streamingLowerBound_V>,
216 EncoderSymbolMapper<symbolTable_T, incompressible_IT>>
218 using base_type = EncoderSymbolMapperInterface<symbolTable_T, SSEEncoderImpl<streamingLowerBound_V>,
incompressible_IT, EncoderSymbolMapper<symbolTable_T, incompressible_IT>>;
230 static_assert(coder_type::getNstreams() == 4);
236 template <
typename source_IT>
239 using namespace simd;
240 std::array<const symbol_type*, 4> ret;
246 aosToSoa(
gsl::make_span(ret).
template subspan<0, 2>(), &unpacked.frequencies[0], &unpacked.cumulativeFrequencies[0]);
247 aosToSoa(
gsl::make_span(ret).
template subspan<2, 2>(), &unpacked.frequencies[1], &unpacked.cumulativeFrequencies[1]);
252 template <
typename source_IT>
255 using namespace internal::simd;
259 epi32_t<SIMDWidth::SSE, 2> frequencies;
260 epi32_t<SIMDWidth::SSE, 2> cumulativeFrequencies;
262 while (currentStream-- > 0) {
264 frequencies(currentStream) = symbol.getFrequency();
265 cumulativeFrequencies(currentStream) = symbol.getCumulative();
268 unpacked.frequencies[0] = load(frequencies[0]);
269 unpacked.frequencies[1] = load(frequencies[1]);
271 unpacked.cumulativeFrequencies[0] = load(cumulativeFrequencies[0]);
272 unpacked.cumulativeFrequencies[1] = load(cumulativeFrequencies[1]);
280template <
size_t streamingLowerBound_V,
typename symbolTable_T,
typename incompressible_IT>
281class EncoderSymbolMapper<symbolTable_T,
282 AVXEncoderImpl<streamingLowerBound_V>,
284 AVXEncoderImpl<streamingLowerBound_V>,
286 EncoderSymbolMapper<symbolTable_T, incompressible_IT>>
288 using base_type = EncoderSymbolMapperInterface<symbolTable_T, AVXEncoderImpl<streamingLowerBound_V>,
incompressible_IT, EncoderSymbolMapper<symbolTable_T, incompressible_IT>>;
300 static_assert(coder_type::getNstreams() == 8);
306 template <
typename source_IT>
309 using namespace simd;
310 std::array<const Symbol*, 8> ret;
320 aosToSoa(
gsl::make_span(ret).
template subspan<0, 4>(), &unpacked.frequencies[0], &unpacked.cumulativeFrequencies[0]);
321 aosToSoa(
gsl::make_span(ret).
template subspan<4, 4>(), &unpacked.frequencies[1], &unpacked.cumulativeFrequencies[1]);
326 template <
typename source_IT>
329 using namespace internal::simd;
333 epi32_t<SIMDWidth::SSE, 2> frequencies;
334 epi32_t<SIMDWidth::SSE, 2> cumulativeFrequencies;
336 while (currentStream-- > 0) {
338 frequencies(currentStream) = symbol.getFrequency();
339 cumulativeFrequencies(currentStream) = symbol.getCumulative();
342 unpacked.frequencies[0] = load(frequencies[0]);
343 unpacked.frequencies[1] = load(frequencies[1]);
345 unpacked.cumulativeFrequencies[0] = load(cumulativeFrequencies[0]);
346 unpacked.cumulativeFrequencies[1] = load(cumulativeFrequencies[1]);
Lookup table containing statistical information for each symbol in the alphabet required for encoding...
rANS encoding operations that encode multiple symbols simultaniously using SIMD. Unified implementati...
rANS encoding operations based on ryg's fast algorithm and a naive rANS implementation for all 64Bit ...
common helper classes and functions
const symbol_type & lookupSymbol(source_IT sourceIter)
EncoderSymbolMapperInterface(const symbolTable_type &symbolTable, incompressible_IT incompressibleIter=nullptr)
typename symbolTable_type::source_type source_type
incompressible_IT incompressible_iterator
EncoderSymbolMapperInterface()=default
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &symbol)
incompressible_iterator getIncompressibleIterator() const
typename coder_type::symbol_type coderSymbol_type
const symbolTable_type * mSymbolTable
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &symbol, size_type nStreams)
symbolTable_T symbolTable_type
std::ptrdiff_t difference_type
incompressible_iterator mIncompressibleIter
typename symbolTable_type::symbol_type symbol_type
typename base_type::difference_type difference_type
typename base_type::symbolTable_type symbolTable_type
typename base_type::symbol_type symbol_type
EncoderSymbolMapper()=default
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &unpacked, size_type nStreams)
typename base_type::coderSymbol_type coderSymbol_type
EncoderSymbolMapper(const symbolTable_type &symbolTable, incompressible_IT incompressibleIter=nullptr)
typename base_type::source_type source_type
typename base_type::coder_type coder_type
typename base_type::incompressible_iterator incompressible_iterator
typename base_type::size_type size_type
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &unpacked)
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &unpacked)
typename base_type::coderSymbol_type coderSymbol_type
typename base_type::coder_type coder_type
EncoderSymbolMapper(const symbolTable_type &symbolTable, incompressible_IT incompressibleIter=nullptr)
EncoderSymbolMapper()=default
typename base_type::source_type source_type
typename base_type::symbolTable_type symbolTable_type
typename base_type::incompressible_iterator incompressible_iterator
source_IT unpackSymbols(source_IT sourceIter, coderSymbol_type &unpacked, size_type nStreams)
typename base_type::size_type size_type
typename base_type::symbol_type symbol_type
typename base_type::difference_type difference_type
preprocessor defines to enable features based on CPU architecture
auto make_span(const o2::rans::internal::simd::AlignedArray< T, width_V, size_V > &array)
Freq_IT advanceIter(Freq_IT iter, std::ptrdiff_t distance)