def _calculatePowerDataRange()

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"]