def reliability_uneven2(scheme, sub_stats, tests=0):
    (distr, matrix) = sub_stats
    if sum(distr) == 0:
        return external_reliability(scheme, tests - 1)
    reliability = 0.0
    if tests == 0 or tests > 2 ** scheme.inputs():
        tests = 2 ** scheme.inputs()
    if len(distr) != 2 ** (scheme.inputs()):
        return 0
    for elem in range(scheme.elements()):
        error_number = 2 ** elem
        error = num2vec(error_number, scheme.elements())
        error_count = 0.0
        for test in range(tests):
            if tests == 2 ** scheme.inputs():
                input_num = test
            else:
                input_num = random.randrange(2 ** scheme.inputs())
            input_values = num2vec(input_num, scheme.inputs())
            etalon = scheme.process(input_values)
            with_err = scheme.process(input_values, error)
            if etalon != with_err:

                error_count += distr[input_num] * matrix[vec2num(etalon)][vec2num(with_err)]
                # print("Input vec: {}, Etalon vec: {}, Err vec: {}, Distr: {} Matrix: {}".format(input_num, vec2num(etalon), vec2num(with_err), distr[input_num], matrix[vec2num(etalon)][vec2num(with_err)]))
                # print(arr[input_num], '*', matrix[vec2num(etalon)][vec2num(with_err)])
                # print('+')
        reliability += error_count
    return reliability
def reliability_uneven(scheme, arr, tests=0):
    """
    :param scheme: Input scheme.
    :param tests: Number of tests. If 0 all possible tests will be performed.
    :return: Scheme COF characteristics.
    """
    if sum(arr) == 0:
        return external_reliability(scheme, tests - 1)
    reliability = 0.0
    if tests == 0 or tests > 2 ** scheme.inputs():
        tests = 2 ** scheme.inputs()
    if len(arr) != 2 ** (scheme.inputs()):
        return 0
    for elem in range(scheme.elements()):
        error_number = 2 ** elem
        error = num2vec(error_number, scheme.elements())
        error_count = 0.0
        for test in range(tests):
            if tests == 2 ** scheme.inputs():
                input_num = test
            else:
                input_num = random.randrange(2 ** scheme.inputs())
            input_values = num2vec(input_num, scheme.inputs())
            if error_test(scheme, input_values, error):

                error_count += arr[input_num]
        reliability += error_count
    return reliability