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 |