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)
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)
def test_kahan_product(self): np.testing.assert_almost_equal(utils.kahan_product([2,3]), 2*3,decimal=10, err_msg="Kahan sum fails")
def test_kahan_product(self): np.testing.assert_almost_equal(utils.kahan_product([2, 3]), 2 * 3, decimal=10, err_msg="Kahan sum fails")