From 2712cffce5344efd857b1bc3025c920b66167e03 Mon Sep 17 00:00:00 2001 From: RenatusRo <126881912+RenatusRo@users.noreply.github.com> Date: Mon, 2 Mar 2026 16:53:00 +0100 Subject: [PATCH 1/5] Update grid limit violation thresholds to 0.1 --- src/evopt/optimizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/evopt/optimizer.py b/src/evopt/optimizer.py index 4220a2963..45cd08bb8 100644 --- a/src/evopt/optimizer.py +++ b/src/evopt/optimizer.py @@ -499,13 +499,13 @@ def solve(self) -> Dict: grid_imp_limit_violated = False e_grid_imp_overshoot = [] if self.grid.p_max_imp is not None and not self.is_grid_demand_rate_active: - grid_imp_limit_violated = (np.max([pulp.value(var) for var in self.variables['e_imp_lim_exc']]) > 0) + grid_imp_limit_violated = (np.max([pulp.value(var) for var in self.variables['e_imp_lim_exc']]) > 0.1) e_grid_imp_overshoot = [pulp.value(var) for var in self.variables['e_imp_lim_exc']] # grid export limit grid_exp_limit_hit = False e_grid_exp_overshoot = [] if self.grid.p_max_exp is not None: - grid_exp_limit_hit = (np.max([pulp.value(var) for var in self.variables['e_exp_lim_exc']]) > 0) + grid_exp_limit_hit = (np.max([pulp.value(var) for var in self.variables['e_exp_lim_exc']]) > 0.1) e_grid_exp_overshoot = [pulp.value(var) for var in self.variables['e_exp_lim_exc']] if status == 'Optimal': From fb91c9adcea029c96bdfd06b5c0f31e56ce11a07 Mon Sep 17 00:00:00 2001 From: RenatusRo <126881912+RenatusRo@users.noreply.github.com> Date: Mon, 2 Mar 2026 17:01:24 +0100 Subject: [PATCH 2/5] fix merge error --- src/evopt/optimizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evopt/optimizer.py b/src/evopt/optimizer.py index 0bbfa87d2..9d5bb10a0 100644 --- a/src/evopt/optimizer.py +++ b/src/evopt/optimizer.py @@ -499,7 +499,7 @@ def solve(self) -> Dict: grid_imp_limit_violated = False e_grid_imp_overshoot = [] if self.grid.p_max_imp is not None: - grid_imp_limit_violated = (np.max([pulp.value(var) for var in self.variables['e_imp_lim_exc']]) > 0) + grid_imp_limit_violated = (np.max([pulp.value(var) for var in self.variables['e_imp_lim_exc']]) > 0.1) e_grid_imp_overshoot = [pulp.value(var) for var in self.variables['e_imp_lim_exc']] # grid export limit grid_exp_limit_hit = False From 93f21fe0915adfe796476146f0535303ad9c2093 Mon Sep 17 00:00:00 2001 From: RenatusRo <126881912+RenatusRo@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:53:40 +0100 Subject: [PATCH 3/5] Handle near-zero solver noise in grid limits dropped the arbitrary 0.1 for 1-e-6 cleaner output vectors --- src/evopt/optimizer.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/evopt/optimizer.py b/src/evopt/optimizer.py index 9d5bb10a0..0330fb2af 100644 --- a/src/evopt/optimizer.py +++ b/src/evopt/optimizer.py @@ -494,19 +494,24 @@ def solve(self) -> Dict: for t in self.time_steps: e_grid_import[t] += pulp.value(self.variables['e_imp_lim_exc'][t]) + # snap near-zero solver noise to zero + eps = 1e-6 + # get limit violations # grid import limit grid_imp_limit_violated = False e_grid_imp_overshoot = [] if self.grid.p_max_imp is not None: - grid_imp_limit_violated = (np.max([pulp.value(var) for var in self.variables['e_imp_lim_exc']]) > 0.1) - e_grid_imp_overshoot = [pulp.value(var) for var in self.variables['e_imp_lim_exc']] + e_grid_imp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 + for var in self.variables['e_imp_lim_exc']] + grid_imp_limit_violated = max(e_grid_imp_overshoot) > 0 # grid export limit grid_exp_limit_hit = False e_grid_exp_overshoot = [] if self.grid.p_max_exp is not None: - grid_exp_limit_hit = (np.max([pulp.value(var) for var in self.variables['e_exp_lim_exc']]) > 0.1) - e_grid_exp_overshoot = [pulp.value(var) for var in self.variables['e_exp_lim_exc']] + e_grid_exp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 + for var in self.variables['e_exp_lim_exc']] + grid_exp_limit_hit = max(e_grid_exp_overshoot) > 0 if status == 'Optimal': result = { From ad61db5d079aac32e86f82dbb07d503c53cc4946 Mon Sep 17 00:00:00 2001 From: RenatusRo <126881912+RenatusRo@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:57:17 +0100 Subject: [PATCH 4/5] Cleanup: Remove (here) unused limit violation flags Removed unused variables for grid import and export limit violations. --- src/evopt/optimizer.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/evopt/optimizer.py b/src/evopt/optimizer.py index 0330fb2af..94bb20ca2 100644 --- a/src/evopt/optimizer.py +++ b/src/evopt/optimizer.py @@ -499,19 +499,15 @@ def solve(self) -> Dict: # get limit violations # grid import limit - grid_imp_limit_violated = False e_grid_imp_overshoot = [] if self.grid.p_max_imp is not None: e_grid_imp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 for var in self.variables['e_imp_lim_exc']] - grid_imp_limit_violated = max(e_grid_imp_overshoot) > 0 # grid export limit - grid_exp_limit_hit = False e_grid_exp_overshoot = [] if self.grid.p_max_exp is not None: e_grid_exp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 for var in self.variables['e_exp_lim_exc']] - grid_exp_limit_hit = max(e_grid_exp_overshoot) > 0 if status == 'Optimal': result = { From dc6c4c418516d736d286fa0c542a5f44854979d7 Mon Sep 17 00:00:00 2001 From: RenatusRo <126881912+RenatusRo@users.noreply.github.com> Date: Fri, 13 Mar 2026 19:02:45 +0100 Subject: [PATCH 5/5] revert --- src/evopt/optimizer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/evopt/optimizer.py b/src/evopt/optimizer.py index 94bb20ca2..0e36e4221 100644 --- a/src/evopt/optimizer.py +++ b/src/evopt/optimizer.py @@ -499,16 +499,20 @@ def solve(self) -> Dict: # get limit violations # grid import limit + grid_imp_limit_violated = False e_grid_imp_overshoot = [] if self.grid.p_max_imp is not None: e_grid_imp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 for var in self.variables['e_imp_lim_exc']] + grid_imp_limit_violated = max(e_grid_imp_overshoot) > 0 # grid export limit + grid_exp_limit_hit = False e_grid_exp_overshoot = [] if self.grid.p_max_exp is not None: e_grid_exp_overshoot = [max(0, pulp.value(var)) if pulp.value(var) > eps else 0 for var in self.variables['e_exp_lim_exc']] - + grid_exp_limit_hit = max(e_grid_exp_overshoot) > 0 + if status == 'Optimal': result = { 'status': status,