in benchmarking/utils/monsoon_power.py [0:0]
def _calculatePowerDataRange(power_data):
num = len(power_data)
WINDOW_SIZE = 500
THRESHOLD = 150
if num <= WINDOW_SIZE:
return -1, -1
# first get the sum of the window size values
sum = 0
for i in range(WINDOW_SIZE):
sum += power_data[i]["current"]
ranges = []
i = WINDOW_SIZE - 1
while i < num - 1:
# first find the average current is less than the threshold
while i < num - 1 and (sum / WINDOW_SIZE) > THRESHOLD:
i = i + 1
sum = (
sum - power_data[i - WINDOW_SIZE]["current"] + power_data[i]["current"]
)
# find the first item with sudden jump in current
while (
i < num - 1
and ((sum / WINDOW_SIZE) <= THRESHOLD)
and (
(power_data[i]["current"] < THRESHOLD)
or (power_data[i]["current"] < 2 * (sum / WINDOW_SIZE))
)
):
i = i + 1
sum = (
sum - power_data[i - WINDOW_SIZE]["current"] + power_data[i]["current"]
)
# find the last entry below threshold
while i > 0 and power_data[i]["current"] > THRESHOLD:
i = i - 1
start = i
# find the last item whose current is above THRESHOLD but
# all later items are below THRESHOLD
sum = 0
while i < num - 1 and i < start + WINDOW_SIZE:
i = i + 1
sum += power_data[i]["current"]
# wait till the average of the current is below threshold
while i < num - 1 and ((sum / WINDOW_SIZE) > THRESHOLD):
i = i + 1
sum = (
sum - power_data[i - WINDOW_SIZE]["current"] + power_data[i]["current"]
)
# get the last entry below threshold
end = i
while end > i - WINDOW_SIZE and (power_data[end - 1]["current"] < THRESHOLD):
end = end - 1
if start < num and end < num:
ranges.append({"start": start, "end": end})
if len(ranges) == 0:
return -1, -1
# get the max range of all collected ranges
max_range = ranges[0]
for r in ranges:
if r["end"] - r["start"] > max_range["end"] - max_range["start"]:
max_range = r
return max_range["start"], max_range["end"]