24 std::span<std::byte> exponent_data);
27 std::span<std::byte> exponent_data);
29void LinearCompress1D(std::span<const BitFloat> input, std::span<std::byte> mantissa_data,
30 std::span<std::byte> exponent_data);
33 std::span<std::byte> exponent_data);
36 std::span<std::byte> exponent_data);
39 std::span<std::byte> exponent_data);
41void CubicCompress1D(std::span<const BitFloat> input, std::span<std::byte> mantissa_data,
42 std::span<std::byte> exponent_data);
45 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
48 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
51 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
54 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
57 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
60 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
63 std::span<const std::byte> exponent_data, std::span<BitFloat> output);
66 std::span<std::byte> exponent_data);
69 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
72 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
75 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
78 std::span<std::byte> mantissa_data,
79 std::span<std::byte> exponent_data);
82 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
85 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
88 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
91 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data);
94 std::span<float> row);
97 std::span<std::byte> exponent_data, std::span<float> row);
100 std::span<std::byte> exponent_data, std::span<float> row);
103 std::span<std::byte> exponent_data, std::span<float> row);
106 std::span<std::byte> exponent_data, std::span<float> row);
109 std::span<std::byte> exponent_data, std::span<float> row);
112 std::span<std::byte> exponent_data, std::span<float> row);
115 std::span<std::byte> exponent_data, std::span<float> row);
118 std::span<std::byte> exponent_data, std::span<float> row);
122inline void Compress1D(
int level, std::span<const BitFloat> row, std::span<std::byte> mantissa_data,
123 std::span<std::byte> exponent_data) {
147 throw std::runtime_error(
"Invalid compression level");
151 std::span<std::byte> exponent_data, std::span<BitFloat> row) {
175 throw std::runtime_error(
"Invalid compression level");
179 std::span<std::byte> mantissa_data, std::span<std::byte> exponent_data) {
209 throw std::runtime_error(
"Invalid compression level");
213 std::span<std::byte> exponent_data, std::span<float> row) {
243 throw std::runtime_error(
"Invalid compression level");
253 if (
value.Mantissa() & 0xFE000000)
261 return BitFloat(0, value_exponent,
false);
262 }
else if (previous.
Exponent() == value_exponent) {
264 }
else if (previous.
Exponent() > value_exponent) {
266 const uint8_t shift = previous.
Exponent() - value_exponent;
268 return BitFloat(0, value_exponent,
false);
275 const uint8_t shift = value_exponent - previous.
Exponent();
277 return BitFloat(0, value_exponent,
false);
291 int8_t value_exponent) {
293 return Predict(previous2, value_exponent);
295 return Predict(previous1, value_exponent);
297 return BitFloat(0, value_exponent,
false);
299 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
300 if (!matched_p2)
return BitFloat(0, value_exponent,
false);
301 std::optional<BitFloat> result = Match(previous1, value_exponent);
302 if (!result)
return BitFloat(0, value_exponent,
false);
304 (*result) -= *matched_p2;
318 int8_t value_exponent) {
320 return Predict(previous2, value_exponent);
322 return Predict(previous1, value_exponent);
324 return BitFloat(0, value_exponent,
false);
326 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
327 if (!matched_p2)
return BitFloat(0, value_exponent,
false);
328 std::optional<BitFloat> result = Match(previous1, value_exponent);
329 if (!result)
return BitFloat(0, value_exponent,
false);
330 (*result) += *matched_p2;
337 const BitFloat& previous1, int8_t value_exponent) {
339 return Predict(previous2, value_exponent);
341 return Predict(previous1, value_exponent);
343 return Predict(previous2, previous1, value_exponent);
345 return BitFloat(0, value_exponent,
false);
347 const std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
348 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
349 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
350 if (!matched_p2)
return Predict(previous1, value_exponent);
351 std::optional<BitFloat> result = Match(previous1, value_exponent);
352 if (!result)
return Predict(previous2, value_exponent);
359 (*result) -= *matched_p2;
360 (*result) += *matched_p3;
366 const BitFloat& previous1, int8_t value_exponent) {
368 return Predict(previous2, value_exponent);
370 return Predict(previous1, value_exponent);
372 return Predict(previous2, previous1, value_exponent);
374 return BitFloat(0, value_exponent,
false);
376 std::optional<BitFloat> matched_p3 = Match(-previous3, value_exponent);
377 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
378 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
379 if (!matched_p2)
return Predict(previous1, value_exponent);
380 std::optional<BitFloat> result = Match(previous1, value_exponent);
381 if (!result)
return Predict(previous2, value_exponent);
386 (*result) += *matched_p2;
388 (*result) += *matched_p3;
396 int8_t value_exponent) {
398 return Predict(previous2, value_exponent);
400 return Predict(previous1, value_exponent);
402 return Predict(previous2, previous1, value_exponent);
404 return Predict(previous3, previous2, previous1, value_exponent);
406 return BitFloat(0, value_exponent,
false);
408 const std::optional<BitFloat> matched_p4 = Match(previous4, value_exponent);
409 if (!matched_p4)
return Predict(previous3, previous2, previous1, value_exponent);
410 std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
411 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
412 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
413 if (!matched_p2)
return Predict(previous1, value_exponent);
414 std::optional<BitFloat> result = Match(previous1, value_exponent);
415 if (!result)
return Predict(previous2, value_exponent);
420 (*result) -= *matched_p2;
422 (*result) += *matched_p3;
423 (*result) -= *matched_p4;
430 int8_t value_exponent) {
432 return Predict(previous2, value_exponent);
434 return Predict(previous1, value_exponent);
436 return Predict(previous2, previous1, value_exponent);
438 return Predict(previous3, previous2, previous1, value_exponent);
440 return BitFloat(0, value_exponent,
false);
442 std::optional<BitFloat> matched_p4 = Match(previous4, value_exponent);
443 if (!matched_p4)
return Predict(previous3, previous2, previous1, value_exponent);
444 std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
445 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
446 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
447 if (!matched_p2)
return Predict(previous1, value_exponent);
448 std::optional<BitFloat> result = Match(previous1, value_exponent);
449 if (!result)
return Predict(previous2, value_exponent);
454 (*result) -= *matched_p2;
456 (*result) -= *matched_p3;
458 (*result) += *matched_p4;
Class that understands the bit-representation of single-precision floating point numbers,...
constexpr bool Sign() const
constexpr int8_t Exponent() const
static constexpr bool AllowsMath(int8_t exponent)
Based on the exponent, determines if this is a special value and should not be used in mathematical o...
constexpr uint32_t Mantissa() const
void DirectCompress2D(std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void LinearQuadraticDecompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void Linear3Decompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
void CubicCompress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
constexpr BitFloat Predict(const BitFloat &previous, int8_t value_exponent)
void Compress2D(int level, CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void DirectDecompress2D(std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void Linear3Decompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
constexpr BitFloat QuadraticPredict(const BitFloat &previous4, const BitFloat &previous3, const BitFloat &previous2, const BitFloat &previous1, int8_t value_exponent)
void DifferenceDecompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
constexpr size_t kCompressedExponentSize
void QuadraticDecompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
constexpr BitFloat Residual(const BitFloat &previous, const BitFloat &value)
void DifferenceCompress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void CubicDecompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
void QuadraticCompress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
constexpr BitFloat AveragePredict(const BitFloat &previous2, const BitFloat &previous1, int8_t value_exponent)
void Quadratic4Decompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
size_t DefaultThreadCount()
void Compress1D(int level, std::span< const BitFloat > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
constexpr size_t kCompressedMantissaSize
void LinearCompress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void Linear3Compress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void QuadraticDecompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
constexpr BitFloat LinearPredict(const BitFloat &previous3, const BitFloat &previous2, const BitFloat &previous1, int8_t value_exponent)
void LinearQuadraticCompress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void QuadraticCompress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void Decompress2D(int level, CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
constexpr BitFloat PredictThreshold(const BitFloat &value)
If the predicted value is approximately twice as large as the target value (based on its exponent onl...
void Quadratic4Compress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void LinearDecompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void Quadratic4Compress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void Decompress1D(int level, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< BitFloat > row)
void DifferenceDecompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
void LinearDecompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
void Average2Decompress1D(std::span< const std::byte > mantissa_data, std::span< const std::byte > exponent_data, std::span< BitFloat > output)
void Linear3Compress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void CubicCompress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void CubicDecompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void Average2Decompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void DifferenceCompress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void LinearCompress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void Average2Compress1D(std::span< const BitFloat > input, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
void Quadratic4Decompress2D(CompressorState &state, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data, std::span< float > row)
void Average2Compress2D(CompressorState &state, std::span< const float > row, std::span< std::byte > mantissa_data, std::span< std::byte > exponent_data)
NewDelAllocator< T > NewDelAllocator< T >::value
std::vector< BitFloat > previous1
std::vector< BitFloat > scratch
std::vector< BitFloat > previous2
std::vector< BitFloat > previous3
std::vector< BitFloat > previous4