Defining Initial Clone Fitness

The fitness of an initial clone is defined using the fitness_array.

If fitness_array is defined, it must contain a fitness value for each unique initial clone.
If no fitness_array is provided, all initial clones will be given a fitness value of 1.

The fitness of mutations that are generated during a simulation is more complex, and described in other tutorial guides.


With no fitness defined, all of the clones are given a fitness of 1

from clone_competition_simulation import Parameters, TimeParameters, PopulationParameters
import numpy as np
p = Parameters(
    algorithm='Moran',
    times=TimeParameters(max_time=10, division_rate=1), 
    population=PopulationParameters(initial_size_array=np.ones(16))
)
s = p.get_simulator()
s.run_sim()
print(s.view_clone_info())
clone id label fitness generation born parent clone id last gene mutated
0 0 0 1 0 -1 None
1 1 0 1 0 -1 None
2 2 0 1 0 -1 None
3 3 0 1 0 -1 None
4 4 0 1 0 -1 None
5 5 0 1 0 -1 None
6 6 0 1 0 -1 None
7 7 0 1 0 -1 None
8 8 0 1 0 -1 None
9 9 0 1 0 -1 None
10 10 0 1 0 -1 None
11 11 0 1 0 -1 None
12 12 0 1 0 -1 None
13 13 0 1 0 -1 None
14 14 0 1 0 -1 None
15 15 0 1 0 -1 None

Give each initial clone a random fitness value between 0.5 and 1.5

from clone_competition_simulation import FitnessParameters

p = Parameters(
    algorithm='Moran', 
    times=TimeParameters(max_time=10, division_rate=1), 
    population=PopulationParameters(initial_size_array=np.ones(16)),
    fitness=FitnessParameters(fitness_array=np.random.uniform(0.5, 1.5, size=16))
)
s = p.get_simulator()
s.run_sim()
print(s.view_clone_info())
clone id label fitness generation born parent clone id last gene mutated
0 0 0 0.901536 0 -1 None
1 1 0 1.402680 0 -1 None
2 2 0 1.113649 0 -1 None
3 3 0 0.895848 0 -1 None
4 4 0 0.598618 0 -1 None
5 5 0 0.896367 0 -1 None
6 6 0 1.229735 0 -1 None
7 7 0 1.271452 0 -1 None
8 8 0 1.052849 0 -1 None
9 9 0 0.687008 0 -1 None
10 10 0 0.930168 0 -1 None
11 11 0 1.255376 0 -1 None
12 12 0 0.902447 0 -1 None
13 13 0 1.493341 0 -1 None
14 14 0 0.900351 0 -1 None
15 15 0 1.392611 0 -1 None

The same principle works for clones defined using a grid

p = Parameters(
    algorithm='Moran2D',
    times=TimeParameters(max_time=10, division_rate=1), 
    population=PopulationParameters(initial_grid=np.arange(16).reshape(4, 4), cell_in_own_neighbourhood=False),
    fitness=FitnessParameters(fitness_array=np.random.uniform(0.5, 1.5, size=16))
)
s = p.get_simulator()
s.run_sim()
print(s.view_clone_info())
clone id label fitness generation born parent clone id last gene mutated
0 0 0 0.710121 0 -1 None
1 1 0 0.566186 0 -1 None
2 2 0 0.640329 0 -1 None
3 3 0 0.805205 0 -1 None
4 4 0 0.952062 0 -1 None
5 5 0 0.847487 0 -1 None
6 6 0 0.770136 0 -1 None
7 7 0 0.673199 0 -1 None
8 8 0 0.777511 0 -1 None
9 9 0 1.117545 0 -1 None
10 10 0 0.977799 0 -1 None
11 11 0 0.576575 0 -1 None
12 12 0 1.301780 0 -1 None
13 13 0 1.220930 0 -1 None
14 14 0 0.714362 0 -1 None
15 15 0 1.433839 0 -1 None