From e7ce3c6c64e0194a7c7bd3d382ac7063fccd11c6 Mon Sep 17 00:00:00 2001 From: realmisch <79525520+realmisch@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:07:26 -0400 Subject: [PATCH 1/2] Replace linear search with binary --- src/distribution_energy.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/distribution_energy.cpp b/src/distribution_energy.cpp index 7712c0d763f..af2f091037a 100644 --- a/src/distribution_energy.cpp +++ b/src/distribution_energy.cpp @@ -190,24 +190,22 @@ double ContinuousTabular::sample(double E, uint64_t* seed) const int end = n_energy_out - 2; // Discrete portion - for (int j = 0; j < n_discrete; ++j) { - k = j; - c_k = distribution_[l].c[k]; - if (r1 < c_k) { - end = j; - break; + if (n_discrete > 0) { + int idx = upper_bound_index(distribution_[l].c.begin(), distribution_[l].c.begin() + n_discrete, r1); + if (idx + 1 < n_discrete) { + k = idx + 1; + end = k; + } else { + k = n_discrete - 1; } + c_k = distribution_[l].c[k]; } // Continuous portion - double c_k1; - for (int j = n_discrete; j < end; ++j) { - k = j; - c_k1 = distribution_[l].c[k + 1]; - if (r1 < c_k1) - break; - k = j + 1; - c_k = c_k1; + if (n_discrete < end) { + int idx = upper_bound_index(distribution_[l].c.begin() + n_discrete + 1, distribution_[l].c.begin() + end + 1, r1); + k = idx + n_discrete + 1; + c_k = distribution_[l].c[k]; } double E_l_k = distribution_[l].e_out[k]; From 115216205260ac49d63a21809c0c09b7036f1a9f Mon Sep 17 00:00:00 2001 From: realmisch <79525520+realmisch@users.noreply.github.com> Date: Tue, 1 Sep 2026 12:44:53 -0400 Subject: [PATCH 2/2] Run clang-format --- src/distribution_energy.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/distribution_energy.cpp b/src/distribution_energy.cpp index af2f091037a..cddce5d65d2 100644 --- a/src/distribution_energy.cpp +++ b/src/distribution_energy.cpp @@ -191,7 +191,8 @@ double ContinuousTabular::sample(double E, uint64_t* seed) const // Discrete portion if (n_discrete > 0) { - int idx = upper_bound_index(distribution_[l].c.begin(), distribution_[l].c.begin() + n_discrete, r1); + int idx = upper_bound_index( + distribution_[l].c.begin(), distribution_[l].c.begin() + n_discrete, r1); if (idx + 1 < n_discrete) { k = idx + 1; end = k; @@ -203,7 +204,8 @@ double ContinuousTabular::sample(double E, uint64_t* seed) const // Continuous portion if (n_discrete < end) { - int idx = upper_bound_index(distribution_[l].c.begin() + n_discrete + 1, distribution_[l].c.begin() + end + 1, r1); + int idx = upper_bound_index(distribution_[l].c.begin() + n_discrete + 1, + distribution_[l].c.begin() + end + 1, r1); k = idx + n_discrete + 1; c_k = distribution_[l].c[k]; }