Project
Loading...
Searching...
No Matches
SingleStreamEncoderImpl.h
Go to the documentation of this file.
1// Copyright 2019-2023 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
15
16#ifndef RANS_INTERNAL_ENCODE_SINGLESTREAMENCODERIMPL_H_
17#define RANS_INTERNAL_ENCODE_SINGLESTREAMENCODERIMPL_H_
18
19#include <cassert>
20#include <cstdint>
21#include <tuple>
22
27
28namespace o2::rans::internal
29{
30
31template <size_t streamingLowerBound_V, typename symbol_T, typename derived_T>
33 SingleStreamEncoderImplBase<streamingLowerBound_V, symbol_T, derived_T>>
34{
36
37 public:
43
44 [[nodiscard]] inline static constexpr size_type getNstreams() noexcept { return 1ull; };
45
46 template <typename stream_IT>
47 [[nodiscard]] inline stream_IT flush(stream_IT outputIter)
48 {
49 static_assert(base_type::getStreamOutTypeBits() == 32);
50 *(outputIter++) = static_cast<stream_type>(mState >> 32);
51 *(outputIter++) = static_cast<stream_type>(mState);
52
53 mState = 0;
54 return outputIter;
55 };
56
57 template <typename Stream_IT>
58 [[nodiscard]] inline Stream_IT putSymbols(Stream_IT outputIter, const symbol_type& encodeSymbols)
59 {
60 return static_cast<derived_T*>(this)->putSymbols(outputIter, encodeSymbols);
61 };
62
63 template <typename Stream_IT>
64 [[nodiscard]] inline Stream_IT putSymbols(Stream_IT outputIter, const symbol_type& encodeSymbols, size_type nActiveStreams)
65 {
66 assert(nActiveStreams == 1);
67 return putSymbols(outputIter, encodeSymbols);
68 };
69
70 [[nodiscard]] inline static constexpr state_type getStreamingLowerBound() noexcept { return static_cast<state_type>(utils::pow2(streamingLowerBound_V)); };
71
72 protected:
74
75 template <typename stream_IT>
76 [[nodiscard]] inline std::tuple<state_type, stream_IT> renorm(state_type state, stream_IT outputIter, typename std::remove_pointer_t<typename std::remove_cv_t<symbol_type>>::value_type frequency)
77 {
79 if (state >= maxState) {
80 *(outputIter++) = static_cast<stream_type>(state);
81 state >>= this->getStreamOutTypeBits();
82 assert(state < maxState);
83 }
84
85 return {state, outputIter};
86 };
87
89 explicit SingleStreamEncoderImplBase(size_t symbolTablePrecision) noexcept : base_type{symbolTablePrecision} {};
90};
91
92template <size_t lowerBound_V>
93class CompatEncoderImpl : public SingleStreamEncoderImplBase<lowerBound_V, const Symbol*, CompatEncoderImpl<lowerBound_V>>
94{
96
97 public:
103
104 public:
105 CompatEncoderImpl() = default;
106 explicit CompatEncoderImpl(size_type symbolTablePrecission) noexcept : base_type{symbolTablePrecission} {};
107
109
110 template <typename stream_IT>
111 [[nodiscard]] inline stream_IT putSymbols(stream_IT outputIter, const symbol_type& symbol)
112 {
113 assert(symbol->getFrequency() != 0);
114
115 const auto [newState, streamPosition] = this->renorm(this->mState, outputIter, symbol->getFrequency());
116 // coding function
117 this->mState = ((newState / symbol->getFrequency()) << this->mSymbolTablePrecision) + symbol->getCumulative() + (newState % symbol->getFrequency());
118
119 return streamPosition;
120 };
121};
122
123#ifdef RANS_SINGLE_STREAM
124template <size_t lowerBound_V>
125class SingleStreamEncoderImpl : public SingleStreamEncoderImplBase<lowerBound_V, const PrecomputedSymbol*, SingleStreamEncoderImpl<lowerBound_V>>
126{
127 using base_type = SingleStreamEncoderImplBase<lowerBound_V, const PrecomputedSymbol*, SingleStreamEncoderImpl<lowerBound_V>>;
128 __extension__ using uint128_t = unsigned __int128;
129
130 public:
131 using stream_type = typename base_type::stream_type;
132 using state_type = typename base_type::state_type;
133 using symbol_type = typename base_type::symbol_type;
134 using size_type = typename base_type::size_type;
135 using difference_type = typename base_type::difference_type;
136
137 public:
138 SingleStreamEncoderImpl() = default;
139 explicit SingleStreamEncoderImpl(size_type symbolTablePrecission) noexcept : base_type{symbolTablePrecission} {};
140
141 using base_type::putSymbols;
142
143 template <typename stream_IT>
144 [[nodiscard]] inline stream_IT putSymbols(stream_IT outputIter, const symbol_type& symbol)
145 {
146 assert(symbol->getFrequency() != 0);
147
148 const auto [newState, streamPosition] = this->renorm(this->mState, outputIter, symbol->getFrequency());
149 // coding function
150 state_type quotient = static_cast<state_type>((static_cast<uint128_t>(newState) * symbol->getReciprocalFrequency()) >> 64);
151 quotient = quotient >> symbol->getReciprocalShift();
152 this->mState = newState + symbol->getCumulative() + quotient * symbol->getFrequencyComplement();
153
154 return streamPosition;
155 };
156};
157#endif /* RANS_SINGLE_STREAM */
158
159} // namespace o2::rans::internal
160
161#endif /* RANS_INTERNAL_ENCODE_SINGLESTREAMENCODERIMPL_H_ */
benchmark::State & state
Defines the common operations for encoding data onto an rANS stream.
Contains statistical information for one source symbol, required for encoding/decoding.
common helper classes and functions
std::tuple< ransState_t, stream_IT > renorm(ransState_t state, stream_IT outputIter, count_t frequency, size_t symbolTablePrecision)
uint32_t stream_type
typename base_type::difference_type difference_type
typename base_type::stream_type stream_type
CompatEncoderImpl(size_type symbolTablePrecission) noexcept
typename base_type::state_type state_type
typename base_type::symbol_type symbol_type
stream_IT putSymbols(stream_IT outputIter, const symbol_type &symbol)
Stream_IT putSymbols(Stream_IT outputIter, const symbol_type &encodeSymbols, size_type nActiveStreams)
SingleStreamEncoderImplBase(size_t symbolTablePrecision) noexcept
static constexpr size_type getNstreams() noexcept
std::tuple< state_type, stream_IT > renorm(state_type state, stream_IT outputIter, typename std::remove_pointer_t< typename std::remove_cv_t< symbol_type > >::value_type frequency)
static constexpr state_type getStreamingLowerBound() noexcept
Stream_IT putSymbols(Stream_IT outputIter, const symbol_type &encodeSymbols)
typename base_type::difference_type difference_type
constexpr size_t pow2(size_t n) noexcept
Definition utils.h:165