FZGPUModules 1.0
GPU-accelerated modular compression pipeline
Loading...
Searching...
No Matches
stage_factory.h
Go to the documentation of this file.
1#pragma once
2
8#include "stage/stage.h"
9#include "fzm_format.h"
10#include "encoders/diff/diff.h"
11#include "encoders/RLE/rle.h"
12#include "predictors/lorenzo/lorenzo.h"
17
18#include <memory>
19#include <stdexcept>
20#include <cstring>
21
22namespace fz {
23
33inline Stage* createStage(StageType type, const uint8_t* config, size_t config_size) {
34 Stage* stage = nullptr;
35
36 switch (type) {
40 // Dims are restored by deserializeHeader(); template types come from stored fields.
41 if (config_size >= sizeof(LorenzoConfig)) {
43 std::memcpy(&lc, config, sizeof(LorenzoConfig));
44 if (lc.input_type == DataType::FLOAT32 && lc.code_type == DataType::UINT16) {
45 auto* s = new LorenzoStage<float, uint16_t>();
46 s->deserializeHeader(config, config_size);
47 stage = s;
48 } else if (lc.input_type == DataType::FLOAT64 && lc.code_type == DataType::UINT16) {
49 auto* s = new LorenzoStage<double, uint16_t>();
50 s->deserializeHeader(config, config_size);
51 stage = s;
52 } else {
53 throw std::runtime_error(
54 "Unsupported Lorenzo template instantiation: input_type="
55 + std::to_string(static_cast<int>(lc.input_type))
56 + " code_type=" + std::to_string(static_cast<int>(lc.code_type)));
57 }
58 } else {
59 throw std::runtime_error("Lorenzo config too small: " + std::to_string(config_size));
60 }
61 break;
62 }
63
65 // Header: [0] TIn DataType, [1] TOut DataType, [2..5] chunk_size.
66 // TIn == TOut → same-type (legacy); TIn signed + TOut unsigned → negabinary-fused.
67 if (config_size >= 2) {
68 DataType tin_dt = static_cast<DataType>(config[0]);
69 DataType tout_dt = static_cast<DataType>(config[1]);
70 // Negabinary-fused instantiations
71 if (tin_dt == DataType::INT8 && tout_dt == DataType::UINT8)
73 else if (tin_dt == DataType::INT16 && tout_dt == DataType::UINT16)
75 else if (tin_dt == DataType::INT32 && tout_dt == DataType::UINT32)
77 else if (tin_dt == DataType::INT64 && tout_dt == DataType::UINT64)
79 // Same-type instantiations
80 else if (tin_dt == DataType::FLOAT32) stage = new DifferenceStage<float>();
81 else if (tin_dt == DataType::FLOAT64) stage = new DifferenceStage<double>();
82 else if (tin_dt == DataType::UINT8) stage = new DifferenceStage<uint8_t>();
83 else if (tin_dt == DataType::UINT16) stage = new DifferenceStage<uint16_t>();
84 else if (tin_dt == DataType::UINT32) stage = new DifferenceStage<uint32_t>();
85 else if (tin_dt == DataType::INT32) stage = new DifferenceStage<int32_t>();
86 else if (tin_dt == DataType::INT64) stage = new DifferenceStage<int64_t>();
87 else
88 throw std::runtime_error("Unsupported Difference data type: "
89 + std::to_string(static_cast<int>(tin_dt)));
90 stage->deserializeHeader(config, config_size);
91 } else if (config_size >= 1) {
92 // Legacy 1-byte header (same-type only)
93 DataType dt = static_cast<DataType>(config[0]);
94 switch (dt) {
95 case DataType::FLOAT32: stage = new DifferenceStage<float>(); break;
96 case DataType::FLOAT64: stage = new DifferenceStage<double>(); break;
97 case DataType::UINT8: stage = new DifferenceStage<uint8_t>(); break;
98 case DataType::UINT16: stage = new DifferenceStage<uint16_t>(); break;
99 case DataType::UINT32: stage = new DifferenceStage<uint32_t>(); break;
100 case DataType::INT32: stage = new DifferenceStage<int32_t>(); break;
101 case DataType::INT64: stage = new DifferenceStage<int64_t>(); break;
102 default:
103 throw std::runtime_error("Unsupported Difference data type: "
104 + std::to_string(static_cast<int>(dt)));
105 }
106 } else {
107 stage = new DifferenceStage<float>();
108 }
109 break;
110 }
111
112 case StageType::RLE: {
113 if (config_size >= 1) {
114 DataType dt;
115 std::memcpy(&dt, config, sizeof(DataType));
116 switch (dt) {
117 case DataType::UINT8: stage = new RLEStage<uint8_t>(); break;
118 case DataType::UINT16: stage = new RLEStage<uint16_t>(); break;
119 case DataType::UINT32: stage = new RLEStage<uint32_t>(); break;
120 case DataType::INT32: stage = new RLEStage<int32_t>(); break;
121 default:
122 throw std::runtime_error("Unsupported RLE data type: "
123 + std::to_string(static_cast<int>(dt)));
124 }
125 stage->deserializeHeader(config, config_size);
126 } else {
127 // No config — default to uint16_t
128 stage = new RLEStage<uint16_t>();
129 }
130 break;
131 }
132
133 case StageType::ZIGZAG: {
134 if (config_size >= 2) {
135 DataType tin_dt = static_cast<DataType>(config[0]);
136 DataType tout_dt = static_cast<DataType>(config[1]);
137 if (tin_dt == DataType::INT8 && tout_dt == DataType::UINT8)
138 stage = new ZigzagStage<int8_t, uint8_t>();
139 else if (tin_dt == DataType::INT16 && tout_dt == DataType::UINT16)
140 stage = new ZigzagStage<int16_t, uint16_t>();
141 else if (tin_dt == DataType::INT32 && tout_dt == DataType::UINT32)
142 stage = new ZigzagStage<int32_t, uint32_t>();
143 else if (tin_dt == DataType::INT64 && tout_dt == DataType::UINT64)
144 stage = new ZigzagStage<int64_t, uint64_t>();
145 else
146 throw std::runtime_error(
147 "Unsupported ZigzagStage type pair: TIn="
148 + std::to_string(static_cast<int>(tin_dt))
149 + " TOut=" + std::to_string(static_cast<int>(tout_dt)));
150 } else {
151 // Default: int32_t → uint32_t
152 stage = new ZigzagStage<int32_t, uint32_t>();
153 }
154 stage->deserializeHeader(config, config_size);
155 break;
156 }
157
159 if (config_size >= 2) {
160 DataType tin_dt = static_cast<DataType>(config[0]);
161 DataType tout_dt = static_cast<DataType>(config[1]);
162 if (tin_dt == DataType::INT8 && tout_dt == DataType::UINT8)
164 else if (tin_dt == DataType::INT16 && tout_dt == DataType::UINT16)
166 else if (tin_dt == DataType::INT32 && tout_dt == DataType::UINT32)
168 else if (tin_dt == DataType::INT64 && tout_dt == DataType::UINT64)
170 else
171 throw std::runtime_error(
172 "Unsupported NegabinaryStage type pair: TIn="
173 + std::to_string(static_cast<int>(tin_dt))
174 + " TOut=" + std::to_string(static_cast<int>(tout_dt)));
175 } else {
177 }
178 stage->deserializeHeader(config, config_size);
179 break;
180 }
181
183 auto* s = new BitshuffleStage();
184 s->deserializeHeader(config, config_size);
185 stage = s;
186 break;
187 }
188
189 case StageType::RZE: {
190 auto* s = new RZEStage();
191 s->deserializeHeader(config, config_size);
192 stage = s;
193 break;
194 }
195
196 default:
197 throw std::runtime_error("Unknown stage type: "
198 + std::to_string(static_cast<uint16_t>(type)));
199 }
200
201 return stage;
202}
203
204} // namespace fz
GPU bit-matrix transpose stage (W × N bit shuffle over fixed-size chunks).
Definition bitshuffle_stage.h:38
Definition diff.h:48
Definition lorenzo.h:82
Definition negabinary_stage.h:34
Definition rle.h:31
Definition rze_stage.h:47
Definition stage.h:28
virtual void deserializeHeader(const uint8_t *header_buffer, size_t size)
Definition stage.h:134
Definition zigzag_stage.h:30
First-order difference coding stage with optional negabinary fusion.
FZM binary file format definitions — structs, enums, and helpers.
Definition fzm_format.h:25
Stage * createStage(StageType type, const uint8_t *config, size_t config_size)
Definition stage_factory.h:33
StageType
Stage type identifiers written into the FZM header.
Definition fzm_format.h:76
@ BITSHUFFLE
BitshuffleStage — GPU bit-matrix transpose.
@ RLE
RLEStage — run-length encoding.
@ LORENZO_1D
LorenzoStage — 1-D predictor.
@ LORENZO_3D
LorenzoStage — 3-D predictor.
@ RZE
RZEStage — recursive zero-byte elimination.
@ LORENZO_2D
LorenzoStage — 2-D predictor.
@ ZIGZAG
ZigzagStage — zigzag encode/decode.
@ DIFFERENCE
DifferenceStage — first-order differencing.
@ NEGABINARY
NegabinaryStage — negabinary encode/decode.
DataType
Element data type identifiers used in buffer and stage descriptors.
Definition fzm_format.h:103
Element-wise negabinary encode/decode stage (TIn[] ↔ TOut[]).
Run-Length Encoding stage (lossless, stream-ordered).
Recursive Zero-byte Elimination stage — lossless byte-stream compressor.
Definition lorenzo.h:39
DataType input_type
Original input type (1B).
Definition lorenzo.h:44
DataType code_type
Quantization code type (1B).
Definition lorenzo.h:45
Element-wise zigzag encode/decode stage (TIn[] ↔ TOut[]).