from statistics import mean
import fdg.global_config
[docs]
def compute_mine(weights:list)->float:
    return simple_mean(weights) # when using the original weights, this simple_mean is better 
    # return weights[-1]
[docs]
def compute(weights:list)->float:
    # return simple_mean(weights) # when using the original weights, this simple_mean is better
    return weighted_mean(weights) 
[docs]
def simple_mean(weights:list)->float:
    return mean(weights) 
[docs]
def weighted_mean(weights:list)->float:
    w = [0.2, 0.4, 0.6, 0.8, 1]
    final = 0
    if len(weights) > fdg.global_config.seq_len_limit:
        print(
            'Do not need to compute weights as the weights come from the depth {fdg.global_config.seq_len_limit} (maximum)')
    else:
        diff = len(w) - len(weights)
        weighted_w = []
        for idx, weight in enumerate(weights):
            w_idx = idx + diff
            weighted_w.append(weight * w[w_idx])
        final = round(mean(weighted_w), 2)  # round to the second decimal place
    return final 
[docs]
def turn_write_features_to_a_value(data:[bool])->float:
    """
    three featues:[primitive type,concrete write, new write)
    """
    def turn_a_list_to_value_diff_weight(data: [bool]) -> int:
        value = 0
        for index, i in enumerate(range(len(data) - 1, -1, -1)):
            if data[index]:
                value += 1 * 2 ** i
        return value
    def turn_a_list_to_value_diff_weight_1(data: [bool]) -> int:
        assert len(data)==3
        # order: p,c,n (primitive type, concrete value, new value)
        # value=0
        # if data[2]:value+=3
        # if data[1]:value+=1
        # if data[0]:value+=2
        value = 0
        if data[2]:
            if data[0]:
                value+=3
            else:
                value+=2
        if data[1]: value += 1
        if data[0]: value += 2
        return value
    def turn_a_list_to_value_equal_weight(data: [bool]) -> int:
        value = 0
        for index, i in enumerate(range(len(data) - 1, -1, -1)):
            if data[index]:
                value += 1
        return value
    # value=turn_a_list_to_value_equal_weight(data)
    value=turn_a_list_to_value_diff_weight_1(data)
    return value