From 098595411770b0b7656e2b3ecc1a4050bc9ba5a6 Mon Sep 17 00:00:00 2001 From: Samaresh Kumar Singh Date: Wed, 11 Feb 2026 19:17:00 -0600 Subject: [PATCH] imatrix: fix crash when using --show-statistics with zero counts Fixes division by zero that caused floating point exceptions when processing imatrix files with zero count values. Added checks to skip zero counts and handle empty activation vectors. Fix for the bug #19190 --- tools/imatrix/imatrix.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/imatrix/imatrix.cpp b/tools/imatrix/imatrix.cpp index 669de55ddb..d210e4a1f6 100644 --- a/tools/imatrix/imatrix.cpp +++ b/tools/imatrix/imatrix.cpp @@ -142,11 +142,20 @@ static void compute_statistics(std::vector & tstats, const st activations.reserve(e.values.size()); for (int i = 0; i < n_mat; ++i) { + if (e.counts[i] == 0) { + LOG_WRN("%s: skipping tensor %s due to zero count at index %d\n", __func__, name.c_str(), i); + continue; + } for (int j = 0; j < row_size; ++j) { activations.push_back(e.values[i*row_size + j] / e.counts[i]); } } + if (activations.empty()) { + LOG_ERR("%s: all counts are zero for tensor %s, skipping statistics computation\n", __func__, name.c_str()); + return; + } + const float act_total = std::accumulate(activations.begin(), activations.end(), 0.0f); const float act_max = *std::max_element(activations.begin(), activations.end()); const float act_min = *std::min_element(activations.begin(), activations.end()); @@ -1139,10 +1148,12 @@ static bool show_statistics(const common_params & params) { blk = -1; // not a block layer } + const float entropy_norm = (tstat.elements > 0) ? 100.0f * (tstat.entropy / std::log2(tstat.elements)) : 0.0f; + LOG_INF("%5s\t%-20s\t%10.2f\t%8.4f\t%11.4f\t%6.2f\t%6.2f\t%8.2f%%\t%6d\t%10.4f\t%6.2f%%\t%10.2f%%\t%8.4f\n", layer.c_str(), name.c_str(), tstat.total_sqract, tstat.min_sqract, tstat.max_sqract, tstat.mean_sqract, tstat.stddev, tstat.active * 100.0f, tstat.elements, tstat.entropy, - 100.0f * (tstat.entropy / std::log2(tstat.elements)), 100.0f * tstat.zd, tstat.cossim); + entropy_norm, 100.0f * tstat.zd, tstat.cossim); const float weighted_bias = tstat.elements * tstat.total_sqract; const float weighted_zd = tstat.elements * tstat.zd;