24 std::span<std::byte> mantissa_data,
25 std::span<std::byte> exponent_data);
28 std::span<std::byte> mantissa_data,
29 std::span<std::byte> exponent_data);
32 std::span<std::byte> mantissa_data,
33 std::span<std::byte> exponent_data);
36 std::span<std::byte> mantissa_data,
37 std::span<std::byte> exponent_data);
40 std::span<std::byte> mantissa_data,
41 std::span<std::byte> exponent_data);
44 std::span<std::byte> mantissa_data,
45 std::span<std::byte> exponent_data);
48 std::span<std::byte> mantissa_data,
49 std::span<std::byte> exponent_data);
52 std::span<const std::byte> exponent_data,
53 std::span<BitFloat> output);
56 std::span<const std::byte> exponent_data,
57 std::span<BitFloat> output);
60 std::span<const std::byte> exponent_data,
61 std::span<BitFloat> output);
64 std::span<const std::byte> exponent_data,
65 std::span<BitFloat> output);
68 std::span<const std::byte> exponent_data,
69 std::span<BitFloat> output);
72 std::span<const std::byte> exponent_data,
73 std::span<BitFloat> output);
76 std::span<const std::byte> exponent_data,
77 std::span<BitFloat> output);
80 std::span<std::byte> mantissa_data,
81 std::span<std::byte> exponent_data);
84 std::span<std::byte> mantissa_data,
85 std::span<std::byte> exponent_data);
88 std::span<std::byte> mantissa_data,
89 std::span<std::byte> exponent_data);
92 std::span<std::byte> mantissa_data,
93 std::span<std::byte> exponent_data);
96 std::span<const float> row,
97 std::span<std::byte> mantissa_data,
98 std::span<std::byte> exponent_data);
101 std::span<std::byte> mantissa_data,
102 std::span<std::byte> exponent_data);
105 std::span<std::byte> mantissa_data,
106 std::span<std::byte> exponent_data);
109 std::span<std::byte> mantissa_data,
110 std::span<std::byte> exponent_data);
113 std::span<std::byte> mantissa_data,
114 std::span<std::byte> exponent_data);
117 std::span<std::byte> exponent_data,
118 std::span<float> row);
121 std::span<std::byte> mantissa_data,
122 std::span<std::byte> exponent_data,
123 std::span<float> row);
126 std::span<std::byte> mantissa_data,
127 std::span<std::byte> exponent_data,
128 std::span<float> row);
131 std::span<std::byte> mantissa_data,
132 std::span<std::byte> exponent_data,
133 std::span<float> row);
136 std::span<std::byte> mantissa_data,
137 std::span<std::byte> exponent_data,
138 std::span<float> row);
141 std::span<std::byte> mantissa_data,
142 std::span<std::byte> exponent_data,
143 std::span<float> row);
146 std::span<std::byte> mantissa_data,
147 std::span<std::byte> exponent_data,
148 std::span<float> row);
151 std::span<std::byte> mantissa_data,
152 std::span<std::byte> exponent_data,
153 std::span<float> row);
156 std::span<std::byte> mantissa_data,
157 std::span<std::byte> exponent_data,
158 std::span<float> row);
162inline void Compress1D(
int level, std::span<const BitFloat> row,
163 std::span<std::byte> mantissa_data,
164 std::span<std::byte> exponent_data) {
188 throw std::runtime_error(
"Invalid compression level");
192 std::span<std::byte> exponent_data,
193 std::span<BitFloat> row) {
217 throw std::runtime_error(
"Invalid compression level");
221 std::span<const float> row,
222 std::span<std::byte> mantissa_data,
223 std::span<std::byte> exponent_data) {
253 throw std::runtime_error(
"Invalid compression level");
257 std::span<std::byte> mantissa_data,
258 std::span<std::byte> exponent_data,
259 std::span<float> row) {
289 throw std::runtime_error(
"Invalid compression level");
299 if (
value.Mantissa() & 0xFE000000)
306 int8_t value_exponent) {
308 return BitFloat(0, value_exponent,
false);
309 }
else if (previous.
Exponent() == value_exponent) {
311 }
else if (previous.
Exponent() > value_exponent) {
313 const uint8_t shift = previous.
Exponent() - value_exponent;
315 return BitFloat(0, value_exponent,
false);
323 const uint8_t shift = value_exponent - previous.
Exponent();
325 return BitFloat(0, value_exponent,
false);
342 int8_t value_exponent) {
344 return Predict(previous2, value_exponent);
346 return Predict(previous1, value_exponent);
348 return BitFloat(0, value_exponent,
false);
350 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
351 if (!matched_p2)
return BitFloat(0, value_exponent,
false);
352 std::optional<BitFloat> result = Match(previous1, value_exponent);
353 if (!result)
return BitFloat(0, value_exponent,
false);
355 (*result) -= *matched_p2;
371 int8_t value_exponent) {
373 return Predict(previous2, value_exponent);
375 return Predict(previous1, value_exponent);
377 return BitFloat(0, value_exponent,
false);
379 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
380 if (!matched_p2)
return BitFloat(0, value_exponent,
false);
381 std::optional<BitFloat> result = Match(previous1, value_exponent);
382 if (!result)
return BitFloat(0, value_exponent,
false);
383 (*result) += *matched_p2;
392 int8_t value_exponent) {
394 return Predict(previous2, value_exponent);
396 return Predict(previous1, value_exponent);
398 return Predict(previous2, previous1, value_exponent);
400 return BitFloat(0, value_exponent,
false);
402 const std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
403 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
404 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
405 if (!matched_p2)
return Predict(previous1, value_exponent);
406 std::optional<BitFloat> result = Match(previous1, value_exponent);
407 if (!result)
return Predict(previous2, value_exponent);
414 (*result) -= *matched_p2;
415 (*result) += *matched_p3;
423 int8_t value_exponent) {
425 return Predict(previous2, value_exponent);
427 return Predict(previous1, value_exponent);
429 return Predict(previous2, previous1, value_exponent);
431 return BitFloat(0, value_exponent,
false);
433 std::optional<BitFloat> matched_p3 = Match(-previous3, value_exponent);
434 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
435 const std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
436 if (!matched_p2)
return Predict(previous1, value_exponent);
437 std::optional<BitFloat> result = Match(previous1, value_exponent);
438 if (!result)
return Predict(previous2, value_exponent);
443 (*result) += *matched_p2;
445 (*result) += *matched_p3;
455 int8_t value_exponent) {
457 return Predict(previous2, value_exponent);
459 return Predict(previous1, value_exponent);
461 return Predict(previous2, previous1, value_exponent);
463 return Predict(previous3, previous2, previous1, value_exponent);
465 return BitFloat(0, value_exponent,
false);
467 const std::optional<BitFloat> matched_p4 = Match(previous4, value_exponent);
469 return Predict(previous3, previous2, previous1, value_exponent);
470 std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
471 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
472 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
473 if (!matched_p2)
return Predict(previous1, value_exponent);
474 std::optional<BitFloat> result = Match(previous1, value_exponent);
475 if (!result)
return Predict(previous2, value_exponent);
480 (*result) -= *matched_p2;
482 (*result) += *matched_p3;
483 (*result) -= *matched_p4;
492 int8_t value_exponent) {
494 return Predict(previous2, value_exponent);
496 return Predict(previous1, value_exponent);
498 return Predict(previous2, previous1, value_exponent);
500 return Predict(previous3, previous2, previous1, value_exponent);
502 return BitFloat(0, value_exponent,
false);
504 std::optional<BitFloat> matched_p4 = Match(previous4, value_exponent);
506 return Predict(previous3, previous2, previous1, value_exponent);
507 std::optional<BitFloat> matched_p3 = Match(previous3, value_exponent);
508 if (!matched_p3)
return Predict(previous2, previous1, value_exponent);
509 std::optional<BitFloat> matched_p2 = Match(previous2, value_exponent);
510 if (!matched_p2)
return Predict(previous1, value_exponent);
511 std::optional<BitFloat> result = Match(previous1, value_exponent);
512 if (!result)
return Predict(previous2, value_exponent);
517 (*result) -= *matched_p2;
519 (*result) -= *matched_p3;
521 (*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