Skip to content

Commit 00efe7c

Browse files
committed
Added Simpson diversity index
1 parent faabd46 commit 00efe7c

File tree

4 files changed

+192
-2
lines changed

4 files changed

+192
-2
lines changed

exploration.ipynb

Lines changed: 148 additions & 0 deletions
Large diffs are not rendered by default.

metapypulation/individual.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def neutral_interaction(self, interacting_individual: "Individual") -> None:
8080
mutation_random_number = np.random.rand()
8181
index_to_copy = np.random.choice(range(0, self.number_of_features))
8282
if mutation_random_number <= self.mutation_rate:
83-
self.features[index_to_copy] = np.random.randint(low = 1, high = self.number_of_trait+1, size=1)
83+
self.features[index_to_copy] = np.random.randint(low = 1, high = self.number_of_traits+1, size=1)
8484
self.number_of_mutations += 1
8585
self.number_of_changes += 1
8686
else:

metapypulation/metapopulation.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,32 @@ def metapopulation_test_sets(self) -> int:
214214

215215
uniques = np.unique(traits, axis = 0)
216216

217-
return len(uniques)
217+
return len(uniques)
218+
219+
def metapopulation_simpson(self) -> float:
220+
"""
221+
Calculates Simpson diversity index over the whole metapopulation.
222+
223+
Returns:
224+
float: Simpson diversity index of the metapopulation.
225+
"""
226+
number_of_features = self.number_of_features
227+
traits = np.zeros((self.get_metapopulation_size(), number_of_features))
228+
i = 0
229+
for subpopulation in self.subpopulations:
230+
for individual in subpopulation.population:
231+
traits[i] = (individual.features)
232+
i += 1
233+
234+
uniques, counts = np.unique(traits, axis = 0, return_counts = True)
235+
236+
simpson_denominators = []
237+
for i in range(0, len(counts)):
238+
simpson_denominators.append(counts[i]*(counts[i]-1))
239+
240+
simpson_diversity_index = self.get_metapopulation_size()*(self.get_metapopulation_size() - 1) / sum(simpson_denominators)
241+
242+
return simpson_diversity_index
218243

219244

220245
class SubpopulationIterator(object):

metapypulation/subpopulation.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,23 @@ def shannon_diversity(self) -> float:
208208

209209
return shannon_index
210210

211+
def simpson_diversity(self) -> float:
212+
"""
213+
Calculate the Simpson diversity index of the subpopulation.
214+
215+
Returns:
216+
float: The Simpson diversity index of the subpopulation.
217+
"""
218+
traits = self.return_traits_sets()
219+
uniques, counts = np.unique(traits, axis = 0, return_counts=True)
220+
221+
simpson_denominators = []
222+
for i in range(0, len(counts)):
223+
simpson_denominators.append(counts[i]*(counts[i]-1))
224+
225+
simpson_diversity_index = self.get_population_size()*(self.get_population_size() - 1) / sum(simpson_denominators)
226+
227+
return simpson_diversity_index
211228

212229
class IndividualsIterator(object):
213230
"""

0 commit comments

Comments
 (0)