From f22149d76e65c59ae9aaa0f7b35a2b44454b6dad Mon Sep 17 00:00:00 2001 From: Daniel Zullo Date: Wed, 9 Aug 2023 22:15:35 +0200 Subject: [PATCH 1/3] Remove absolute tolerance in floating-point comparison The comparison of the max excess `take_from[1]` and `deficit` against zero was initially done using absolute tolerance. However, as both values are then compared against each other and known to be away from zero, the absolute tolerance becomes unnecessary. The relative tolerance, which is defined by default as 1e-09, is sufficient for this comparison. Signed-off-by: Daniel Zullo --- src/frequenz/sdk/power/_distribution_algorithm.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/frequenz/sdk/power/_distribution_algorithm.py b/src/frequenz/sdk/power/_distribution_algorithm.py index 8215737af..b2a3726ae 100644 --- a/src/frequenz/sdk/power/_distribution_algorithm.py +++ b/src/frequenz/sdk/power/_distribution_algorithm.py @@ -404,9 +404,7 @@ def _distribute_power( # pylint: disable=too-many-arguments take_from = max(excess_reserved.items(), key=lambda item: item[1]) if is_close_to_zero(take_from[1]) or take_from[1] < 0.0: break - if take_from[1] >= -deficit or math.isclose( - take_from[1], -deficit, abs_tol=1e-6 - ): + if take_from[1] >= -deficit or math.isclose(take_from[1], -deficit): excess_reserved[take_from[0]] += deficit deficits[inverter_id] = 0.0 deficit = 0.0 From fdd9e27c6fb670467f605c96f4eade74a371d036 Mon Sep 17 00:00:00 2001 From: Daniel Zullo Date: Wed, 9 Aug 2023 22:17:10 +0200 Subject: [PATCH 2/3] Remove redundant deficits updates Originally, deficit updates were introduced as part of adding support for exclusion bounds in the power distribution algorithm. However, it was primarily for reasoning purposes, and these updates have no actual effects. Only the distributed_power requires updating and the deficit updates were safely removed. Signed-off-by: Daniel Zullo --- src/frequenz/sdk/power/_distribution_algorithm.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/frequenz/sdk/power/_distribution_algorithm.py b/src/frequenz/sdk/power/_distribution_algorithm.py index b2a3726ae..802ac76f5 100644 --- a/src/frequenz/sdk/power/_distribution_algorithm.py +++ b/src/frequenz/sdk/power/_distribution_algorithm.py @@ -422,12 +422,8 @@ def _distribute_power( # pylint: disable=too-many-arguments left_over = power_w - distributed_power if left_over > -deficit: distributed_power += deficit - deficit = 0.0 - deficits[inverter_id] = 0.0 elif left_over > 0.0: - deficit += left_over distributed_power += left_over - deficits[inverter_id] = deficit left_over = power_w - distributed_power dist = DistributionResult(distribution, left_over) From 91fe22a919f033537e6f1777f2c33f07389ed509 Mon Sep 17 00:00:00 2001 From: Daniel Zullo Date: Thu, 10 Aug 2023 10:22:57 +0200 Subject: [PATCH 3/3] Consolidate deficits for-loops Merge the two separate for-loops that iterated over the deficits items in `_distribute_power()`. It was determined that iterating twice over the deficits items is unnecessary. As a result, the two loops have been now consolidated into a single loop maintaining its functionality. Signed-off-by: Daniel Zullo --- src/frequenz/sdk/power/_distribution_algorithm.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/frequenz/sdk/power/_distribution_algorithm.py b/src/frequenz/sdk/power/_distribution_algorithm.py index 802ac76f5..9aabd8446 100644 --- a/src/frequenz/sdk/power/_distribution_algorithm.py +++ b/src/frequenz/sdk/power/_distribution_algorithm.py @@ -412,12 +412,6 @@ def _distribute_power( # pylint: disable=too-many-arguments deficit += excess_reserved[take_from[0]] deficits[inverter_id] = deficit excess_reserved[take_from[0]] = 0.0 - - for inverter_id, excess in excess_reserved.items(): - distribution[inverter_id] += excess - distributed_power += excess - - for inverter_id, deficit in deficits.items(): if deficit < -0.1: left_over = power_w - distributed_power if left_over > -deficit: @@ -425,6 +419,10 @@ def _distribute_power( # pylint: disable=too-many-arguments elif left_over > 0.0: distributed_power += left_over + for inverter_id, excess in excess_reserved.items(): + distribution[inverter_id] += excess + distributed_power += excess + left_over = power_w - distributed_power dist = DistributionResult(distribution, left_over)