Beispiel #1
0
def fixation_probability(mutant_index,
                         resident_index,
                         intensity_of_selection,
                         population_size,
                         payoff_function=None,
                         game_matrix=None,
                         number_of_strategies=None,
                         mapping='EXP',
                         **kwargs):
    suma = []
    for k in range(1, population_size):
        mult = []
        for j in range(1, k + 1):
            if payoff_function is not None and game_matrix is None:
                if number_of_strategies is None:
                    raise ValueError(
                        'When using a custom payoff_function you must specify number_of_strategies.'
                    )
                strategies = np.zeros(number_of_strategies, dtype=int)
                strategies[mutant_index] = j
                strategies[resident_index] = population_size - j
                payoff_mutant = payoff_function(
                    mutant_index, population_composition=strategies, **kwargs)
                payoff_resident = payoff_function(
                    resident_index,
                    population_composition=strategies,
                    **kwargs)
            elif game_matrix is not None and payoff_function is None:
                (payoff_mutant, payoff_resident) = payoff_from_matrix(
                    mutant_index, resident_index, game_matrix, j,
                    population_size)
            else:
                raise ValueError(
                    'No valid payoff structure given, please specify a game_matrix or a payoff_function.'
                )
            if mapping == 'EXP':
                fitness_mutant = math.e**(intensity_of_selection *
                                          payoff_mutant)
                fitness_resident = math.e**(intensity_of_selection *
                                            payoff_resident)
            elif mapping == 'LIN':
                fitness_mutant = 1.0 - intensity_of_selection + \
                                 intensity_of_selection * payoff_mutant
                fitness_resident = 1.0 - intensity_of_selection + intensity_of_selection * payoff_resident
            else:
                raise ValueError(
                    'No valid mapping given. Use EXP or LIN for exponential and linear respectively.'
                )
            mult.append(fitness_resident / fitness_mutant)
        suma.append(utils.kahan_product(mult))
    if any(np.isinf(suma)):
        return 0.0
    try:
        complex_expression = utils.kahan_sum(suma)
    except OverflowError:
        return 0.0
    if np.isinf(complex_expression):
        return 0.0
    return 1.0 / (1.0 + complex_expression)
Beispiel #2
0
def fixation_probability(mutant_index, resident_index, intensity_of_selection, population_size, payoff_function=None,
                         game_matrix=None, number_of_strategies=None, mapping='EXP', **kwargs):
    suma = []
    for k in range(1, population_size):
        mult = []
        for j in range(1, k + 1):
            if payoff_function is not None and game_matrix is None:
                if number_of_strategies is None:
                    raise ValueError(
                        'When using a custom payoff_function you must specify number_of_strategies.')
                strategies = np.zeros(number_of_strategies, dtype=int)
                strategies[mutant_index] = j
                strategies[resident_index] = population_size - j
                payoff_mutant = payoff_function(
                    mutant_index, population_composition=strategies, **kwargs)
                payoff_resident = payoff_function(
                    resident_index, population_composition=strategies, **kwargs)
            elif game_matrix is not None and payoff_function is None:
                (payoff_mutant, payoff_resident) = payoff_from_matrix(
                    mutant_index, resident_index, game_matrix, j, population_size)
            else:
                raise ValueError(
                    'No valid payoff structure given, please specify a game_matrix or a payoff_function.')
            if mapping == 'EXP':
                fitness_mutant = math.e ** (intensity_of_selection * payoff_mutant)
                fitness_resident = math.e ** (intensity_of_selection * payoff_resident)
            elif mapping == 'LIN':
                fitness_mutant = 1.0 - intensity_of_selection + \
                                 intensity_of_selection * payoff_mutant
                fitness_resident = 1.0 - intensity_of_selection + intensity_of_selection * payoff_resident
            else:
                raise ValueError(
                    'No valid mapping given. Use EXP or LIN for exponential and linear respectively.')
            mult.append(fitness_resident / fitness_mutant)
        suma.append(utils.kahan_product(mult))
    if any(np.isinf(suma)):
        return 0.0
    try:
        complex_expression = utils.kahan_sum(suma)
    except OverflowError:
        return 0.0
    if np.isinf(complex_expression):
        return 0.0
    return 1.0 / (1.0 + complex_expression)
Beispiel #3
0
 def test_kahan_product(self):
     np.testing.assert_almost_equal(utils.kahan_product([2,3]), 2*3,decimal=10,  err_msg="Kahan sum fails") 
Beispiel #4
0
 def test_kahan_product(self):
     np.testing.assert_almost_equal(utils.kahan_product([2, 3]),
                                    2 * 3,
                                    decimal=10,
                                    err_msg="Kahan sum fails")