From be7bd2e60084d1113cc0b4693b88ae422f6e6f54 Mon Sep 17 00:00:00 2001 From: Jakob Jordan Date: Fri, 29 Mar 2024 13:24:57 -0400 Subject: [PATCH] Slightly improve performance of `mutate` --- cgp/genome.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/cgp/genome.py b/cgp/genome.py index d6ffb58d..83c71e06 100644 --- a/cgp/genome.py +++ b/cgp/genome.py @@ -750,15 +750,25 @@ def mutate(self, mutation_rate: float, rng: np.random.RandomState): selected_gene_indices = self._select_gene_indices_for_mutation(mutation_rate, rng) for (gene_idx, allele) in zip(selected_gene_indices, np.array(dna)[selected_gene_indices]): + permissible_values = self._permissible_values[gene_idx] - region_idx = self._get_region_idx(gene_idx) + if len(permissible_values) == 0: + raise RuntimeError("should have at least one permissible value") + elif len(permissible_values) == 1: + assert permissible_values[0] == allele + continue # since we have no new choice there's nothing to do here + else: + rng.shuffle(permissible_values) - permissible_values = self._permissible_values[gene_idx] - permissible_alternative_values = permissible_values[permissible_values != allele] + # we have at least two permissible values, we pick the one + # that's different from the current one + if permissible_values[0] != allele: + dna[gene_idx] = permissible_values[0] + else: + dna[gene_idx] = permissible_values[1] - if len(permissible_alternative_values) > 0: + region_idx = self._get_region_idx(gene_idx) - dna[gene_idx] = rng.choice(permissible_alternative_values) modified_parameter_value: bool if self._is_function_gene(gene_idx): region_idx = self._get_region_idx(gene_idx)