Skip to content

Commit f4579eb

Browse files
committed
[sonar] use a struct to configure compression
1 parent e42988b commit f4579eb

3 files changed

Lines changed: 41 additions & 73 deletions

File tree

include/dtlmod/CompressionReductionMethod.hpp

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,45 +14,31 @@ namespace dtlmod {
1414
/// \cond EXCLUDE_FROM_DOCUMENTATION
1515

1616
class CompressionReductionMethod : public ReductionMethod {
17+
struct CompressionConfig {
18+
double accuracy = 1e-3;
19+
double compression_cost_per_element = 1.0;
20+
double decompression_cost_per_element = 1.0;
21+
double compression_ratio = 0.0;
22+
std::string compressor_profile = "fixed";
23+
double data_smoothness = 0.5;
24+
double ratio_variability = 0.0;
25+
};
26+
1727
class ParameterizedCompression {
1828
const Variable* var_; // non-owning: the Variable outlives the parameterization (both owned by Stream)
19-
double accuracy_;
20-
double compression_cost_per_element_;
21-
double decompression_cost_per_element_;
22-
double compression_ratio_;
23-
std::string compressor_profile_; // "fixed", "sz", "zfp"
24-
double data_smoothness_; // hint in [0,1], shifts the model curve
25-
double ratio_variability_; // per-transaction noise amplitude in [0,1]
29+
CompressionConfig cfg_;
2630

2731
public:
28-
ParameterizedCompression(const Variable& var, double accuracy, double compression_cost_per_element,
29-
double decompression_cost_per_element, double compression_ratio,
30-
const std::string& compressor_profile, double data_smoothness, double ratio_variability)
31-
: var_(&var)
32-
, accuracy_(accuracy)
33-
, compression_cost_per_element_(compression_cost_per_element)
34-
, decompression_cost_per_element_(decompression_cost_per_element)
35-
, compression_ratio_(compression_ratio)
36-
, compressor_profile_(compressor_profile)
37-
, data_smoothness_(data_smoothness)
38-
, ratio_variability_(ratio_variability)
39-
{
40-
}
41-
42-
[[nodiscard]] double get_accuracy() const { return accuracy_; }
43-
void set_accuracy(double accuracy) { accuracy_ = accuracy; }
44-
[[nodiscard]] double get_compression_cost_per_element() const { return compression_cost_per_element_; }
45-
void set_compression_cost_per_element(double cost) { compression_cost_per_element_ = cost; }
46-
[[nodiscard]] double get_decompression_cost_per_element() const { return decompression_cost_per_element_; }
47-
void set_decompression_cost_per_element(double cost) { decompression_cost_per_element_ = cost; }
48-
[[nodiscard]] double get_compression_ratio() const { return compression_ratio_; }
49-
void set_compression_ratio(double ratio) { compression_ratio_ = ratio; }
50-
[[nodiscard]] const std::string& get_compressor_profile() const { return compressor_profile_; }
51-
void set_compressor_profile(std::string_view profile) { compressor_profile_ = profile; }
52-
[[nodiscard]] double get_data_smoothness() const { return data_smoothness_; }
53-
void set_data_smoothness(double smoothness) { data_smoothness_ = smoothness; }
54-
[[nodiscard]] double get_ratio_variability() const { return ratio_variability_; }
55-
void set_ratio_variability(double variability) { ratio_variability_ = variability; }
32+
ParameterizedCompression(const Variable& var, CompressionConfig cfg) : var_(&var), cfg_(std::move(cfg)) {}
33+
34+
[[nodiscard]] double get_accuracy() const { return cfg_.accuracy; }
35+
[[nodiscard]] double get_compression_cost_per_element() const { return cfg_.compression_cost_per_element; }
36+
[[nodiscard]] double get_decompression_cost_per_element() const { return cfg_.decompression_cost_per_element; }
37+
[[nodiscard]] double get_compression_ratio() const { return cfg_.compression_ratio; }
38+
[[nodiscard]] const std::string& get_compressor_profile() const { return cfg_.compressor_profile; }
39+
[[nodiscard]] double get_data_smoothness() const { return cfg_.data_smoothness; }
40+
[[nodiscard]] double get_ratio_variability() const { return cfg_.ratio_variability; }
41+
[[nodiscard]] const CompressionConfig& get_config() const { return cfg_; }
5642

5743
/// @brief Get the effective compression ratio, optionally perturbed by per-transaction noise.
5844
[[nodiscard]] double get_effective_ratio(unsigned int transaction_id = 0) const;

include/dtlmod/ReductionMethod.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ReductionMethod {
2525
std::string name_;
2626

2727
public:
28-
ReductionMethod(const std::string& name) : name_(name) {}
28+
explicit ReductionMethod(const std::string& name) : name_(name) {}
2929
virtual ~ReductionMethod() = default;
3030

3131
virtual void parameterize_for_variable(const Variable& var,

src/CompressionReductionMethod.cpp

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ namespace dtlmod {
1515

1616
double CompressionReductionMethod::ParameterizedCompression::get_effective_ratio(unsigned int transaction_id) const
1717
{
18-
if (ratio_variability_ <= 0.0)
19-
return compression_ratio_;
18+
if (cfg_.ratio_variability <= 0.0)
19+
return cfg_.compression_ratio;
2020
// Deterministic noise from hash of (variable_name, transaction_id)
2121
size_t seed = std::hash<std::string>{}(var_->get_name()) ^ (std::hash<unsigned int>{}(transaction_id) << 1);
2222
// Map to [1 - variability, 1 + variability]
23-
double noise = 1.0 + ratio_variability_ * (2.0 * (seed % 10001) / 10000.0 - 1.0);
24-
return std::max(1.0, compression_ratio_ * noise);
23+
double noise = 1.0 + cfg_.ratio_variability * (2.0 * (seed % 10001) / 10000.0 - 1.0);
24+
return std::max(1.0, cfg_.compression_ratio * noise);
2525
}
2626

2727
size_t CompressionReductionMethod::get_reduced_variable_global_size(const Variable& var) const
@@ -102,59 +102,41 @@ void CompressionReductionMethod::parameterize_for_variable(
102102
auto it = per_variable_parameterizations_.find(&var);
103103
bool is_new = (it == per_variable_parameterizations_.end());
104104

105-
double accuracy = 1e-3;
106-
double compression_cost_per_element = 1.0;
107-
double decompression_cost_per_element = 1.0;
108-
double compression_ratio = 0.0;
109-
std::string compressor_profile = "fixed";
110-
double data_smoothness = 0.5;
111-
double ratio_variability = 0.0;
112-
113-
if (!is_new) {
114-
const auto& existing = it->second;
115-
accuracy = existing->get_accuracy();
116-
compression_cost_per_element = existing->get_compression_cost_per_element();
117-
decompression_cost_per_element = existing->get_decompression_cost_per_element();
118-
compression_ratio = existing->get_compression_ratio();
119-
compressor_profile = existing->get_compressor_profile();
120-
data_smoothness = existing->get_data_smoothness();
121-
ratio_variability = existing->get_ratio_variability();
122-
}
105+
CompressionConfig cfg = is_new ? CompressionConfig{} : it->second->get_config();
123106

124107
bool ratio_explicitly_set = false;
125108

126109
for (const auto& [key, value] : parameters) {
127110
if (key == "accuracy")
128-
accuracy = std::stod(value);
111+
cfg.accuracy = std::stod(value);
129112
else if (key == "compression_cost_per_element")
130-
compression_cost_per_element = std::stod(value);
113+
cfg.compression_cost_per_element = std::stod(value);
131114
else if (key == "decompression_cost_per_element")
132-
decompression_cost_per_element = std::stod(value);
115+
cfg.decompression_cost_per_element = std::stod(value);
133116
else if (key == "compression_ratio") {
134-
compression_ratio = std::stod(value);
135-
ratio_explicitly_set = true;
117+
cfg.compression_ratio = std::stod(value);
118+
ratio_explicitly_set = true;
136119
} else if (key == "compressor") {
137120
validate_compressor_profile(value);
138-
compressor_profile = value;
121+
cfg.compressor_profile = value;
139122
} else if (key == "data_smoothness")
140-
data_smoothness = std::stod(value);
123+
cfg.data_smoothness = std::stod(value);
141124
else if (key == "ratio_variability")
142-
ratio_variability = std::stod(value);
125+
cfg.ratio_variability = std::stod(value);
143126
else
144127
throw UnknownCompressionOptionException(XBT_THROW_POINT, key);
145128
}
146129

147-
compression_ratio = resolve_compression_ratio(compression_ratio, ratio_explicitly_set, is_new, compressor_profile,
148-
accuracy, data_smoothness);
130+
cfg.compression_ratio = resolve_compression_ratio(cfg.compression_ratio, ratio_explicitly_set, is_new,
131+
cfg.compressor_profile, cfg.accuracy, cfg.data_smoothness);
149132

150133
XBT_DEBUG("Compression parameterization for Variable %s: profile=%s, accuracy=%.2e, ratio=%.2f, "
151134
"compression_cost=%.2f, decompression_cost=%.2f, smoothness=%.2f, variability=%.2f",
152-
var.get_cname(), compressor_profile.c_str(), accuracy, compression_ratio, compression_cost_per_element,
153-
decompression_cost_per_element, data_smoothness, ratio_variability);
135+
var.get_cname(), cfg.compressor_profile.c_str(), cfg.accuracy, cfg.compression_ratio,
136+
cfg.compression_cost_per_element, cfg.decompression_cost_per_element, cfg.data_smoothness,
137+
cfg.ratio_variability);
154138

155139
// Always (re)create the parameterization — avoids field-by-field update complexity.
156-
per_variable_parameterizations_[&var] = std::make_shared<ParameterizedCompression>(
157-
var, accuracy, compression_cost_per_element, decompression_cost_per_element, compression_ratio,
158-
compressor_profile, data_smoothness, ratio_variability);
140+
per_variable_parameterizations_[&var] = std::make_shared<ParameterizedCompression>(var, std::move(cfg));
159141
}
160142
} // namespace dtlmod

0 commit comments

Comments
 (0)