Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions codecarbon/external/hardware.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,12 +377,12 @@ def _get_energy_from_cpus(self, delay: Time) -> Energy:

def total_power(self) -> Power:
self._power_history.append(self._get_power_from_cpus())
if len(self._power_history) == 0:
logger.warning("Power history is empty, returning 0 W")
return Power.from_watts(0)
power_history_in_W = [power.W for power in self._power_history]
cpu_power = sum(power_history_in_W) / len(power_history_in_W)
self._power_history = []
if not power_history_in_W:
logger.warning("No power samples collected, returning 0 W")
return Power.from_watts(0)
cpu_power = sum(power_history_in_W) / len(power_history_in_W)
return Power.from_watts(cpu_power)

def measure_power_and_energy(self, last_duration: float) -> Tuple[Power, Energy]:
Expand Down
23 changes: 23 additions & 0 deletions tests/test_cpu_load.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,3 +121,26 @@ def test_cpu_calculate_power_from_cpu_load_linear(
for test in tests_values:
power = cpu._calculate_power_from_cpu_load(tdp, test["cpu_load"], cpu_model)
self.assertEqual(power, test["expected_power"])

@mock.patch(
"codecarbon.external.hardware.CPU._get_power_from_cpus",
return_value=Power.from_watts(0),
)
def test_cpu_total_power_empty_history(
self,
mocked_is_psutil_available,
mocked_is_powergadget_available,
mocked_is_rapl_available,
mocked_get_power_from_cpus,
):
"""Regression test for issue #832: ZeroDivisionError when no power samples collected."""
cpu = CPU.from_utils(
None, MODE_CPU_LOAD, "Intel(R) Core(TM) i7-7600U CPU @ 2.80GHz", 100
)
# Simulate an empty power history before calling total_power
cpu._power_history = []
result = cpu.total_power()
# Should NOT raise ZeroDivisionError, should return a valid Power object
self.assertIsInstance(result, Power)
self.assertEqual(result.W, 0)