From 9bea732342c0d84ab06ca85197fa86012b90b54c Mon Sep 17 00:00:00 2001 From: czh6591-arch Date: Wed, 26 Nov 2025 19:21:18 +1100 Subject: [PATCH] Model Doubao implementation --- comprehensive_test.py | 51 ++ example_multi_objective.py | 35 ++ pygad/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 230 bytes pygad/__pycache__/pygad.cpython-313.pyc | Bin 0 -> 148972 bytes .../pygad_modified.cpython-313.pyc | Bin 0 -> 31194 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 284 bytes pygad/helper/__pycache__/misc.cpython-313.pyc | Bin 0 -> 22133 bytes .../helper/__pycache__/unique.cpython-313.pyc | Bin 0 -> 20444 bytes pygad/pygad_modified.py | 539 ++++++++++++++++++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 358 bytes .../__pycache__/crossover.cpython-313.pyc | Bin 0 -> 11521 bytes .../__pycache__/mutation.cpython-313.pyc | Bin 0 -> 30270 bytes pygad/utils/__pycache__/nsga2.cpython-313.pyc | Bin 0 -> 10626 bytes .../parent_selection.cpython-313.pyc | Bin 0 -> 22310 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 260 bytes .../__pycache__/plot.cpython-313.pyc | Bin 0 -> 22528 bytes test_env.py | 3 + test_ga.py | 23 + ...tive_mutation.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 97188 bytes .../test_adaptive_mutation.cpython-313.pyc | Bin 0 -> 97063 bytes ...plicate_genes.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 27813 bytes ...over_mutation.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 22002 bytes ...ne_constraint.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 42691 bytes ...st_gene_space.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 106981 bytes ...plicate_genes.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 81375 bytes ...est_gene_type.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 10028 bytes ...llbacks_calls.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 15111 bytes ...unction_calls.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 46642 bytes ...ave_solutions.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 204263 bytes ...stop_criteria.cpython-313-pytest-9.0.1.pyc | Bin 0 -> 9319 bytes .../test_stop_criteria.cpython-313.pyc | Bin 0 -> 9206 bytes 31 files changed, 651 insertions(+) create mode 100644 comprehensive_test.py create mode 100644 example_multi_objective.py create mode 100644 pygad/__pycache__/__init__.cpython-313.pyc create mode 100644 pygad/__pycache__/pygad.cpython-313.pyc create mode 100644 pygad/__pycache__/pygad_modified.cpython-313.pyc create mode 100644 pygad/helper/__pycache__/__init__.cpython-313.pyc create mode 100644 pygad/helper/__pycache__/misc.cpython-313.pyc create mode 100644 pygad/helper/__pycache__/unique.cpython-313.pyc create mode 100644 pygad/pygad_modified.py create mode 100644 pygad/utils/__pycache__/__init__.cpython-313.pyc create mode 100644 pygad/utils/__pycache__/crossover.cpython-313.pyc create mode 100644 pygad/utils/__pycache__/mutation.cpython-313.pyc create mode 100644 pygad/utils/__pycache__/nsga2.cpython-313.pyc create mode 100644 pygad/utils/__pycache__/parent_selection.cpython-313.pyc create mode 100644 pygad/visualize/__pycache__/__init__.cpython-313.pyc create mode 100644 pygad/visualize/__pycache__/plot.cpython-313.pyc create mode 100644 test_env.py create mode 100644 test_ga.py create mode 100644 tests/__pycache__/test_adaptive_mutation.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_adaptive_mutation.cpython-313.pyc create mode 100644 tests/__pycache__/test_allow_duplicate_genes.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_crossover_mutation.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_gene_constraint.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_gene_space.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_gene_space_allow_duplicate_genes.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_gene_type.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_lifecycle_callbacks_calls.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_number_fitness_function_calls.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_save_solutions.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_stop_criteria.cpython-313-pytest-9.0.1.pyc create mode 100644 tests/__pycache__/test_stop_criteria.cpython-313.pyc diff --git a/comprehensive_test.py b/comprehensive_test.py new file mode 100644 index 0000000..1bc54a8 --- /dev/null +++ b/comprehensive_test.py @@ -0,0 +1,51 @@ +import sys +sys.path.append('pygad') +import pygad_modified as ga +import numpy + +# Multi-objective fitness function +def fitness_func(ga_instance, solution): + # Three objectives: maximize fitness, minimize time cost, maximize diversity + fitness_score = numpy.sum(solution) + time_cost = numpy.random.randint(10, 50) # Simulate time cost + diversity_score = numpy.random.uniform(0.5, 1.0) # Simulate diversity score + return [fitness_score, time_cost, diversity_score] + +# Callback function to track environment changes +def on_generation(ga_instance): + print(f"Generation {ga_instance.generations_completed}: Environment = {ga_instance.current_environment}") + +print("=== Comprehensive Test: Environment State Machine & Multi-Objective Optimization ===\n") + +# Create GA instance with environment state machine enabled +ga_instance = ga.GA( + num_generations=30, # Should cycle through 3 environments (30 generations / 10 = 3 cycles) + num_parents_mating=5, + fitness_func=fitness_func, + sol_per_pop=20, + num_genes=10, + parent_selection_type="sss", + crossover_type="single_point", + mutation_type="random", + mutation_probability=0.05, + crossover_probability=0.7, + on_generation=on_generation +) + +print(f"Initial Environment: {ga_instance.current_environment}") +print("\nStarting Genetic Algorithm with Environment State Machine...\n") + +# Run the GA with environment state machine +ga_instance.run() + +print("\n=== GA Run Completed ===") +print(f"Total generations completed: {ga_instance.generations_completed}") +print(f"Final environment: {ga_instance.current_environment}") + +# Show Pareto front data from the last generation +print("\n=== Pareto Front Data from Last Generation ===") +if hasattr(ga_instance, 'last_generation_fitness'): + print(f"Last generation fitness data shape: {ga_instance.last_generation_fitness.shape}") + print("Each solution has 3 objectives: [fitness_score, time_cost, diversity_score]") + +print("\nTest completed successfully!") diff --git a/example_multi_objective.py b/example_multi_objective.py new file mode 100644 index 0000000..88c72c5 --- /dev/null +++ b/example_multi_objective.py @@ -0,0 +1,35 @@ +import sys +sys.path.append('pygad') +import pygad_modified as ga +import numpy + +def fitness_func(ga_instance, solution): + # Example multi-objective fitness function + fitness_score = numpy.sum(solution) + time_cost = numpy.random.randint(10, 50) # Simulate time cost + diversity_score = numpy.random.uniform(0.5, 1.0) # Simulate diversity score + return [fitness_score, time_cost, diversity_score] + +def on_generation(ga_instance): + print(f"Generation completed: {ga_instance.generations_completed}") + print(f"Current environment: {ga_instance.current_environment}") + +# Initialize the GA instance +ga_instance = ga.GA( + num_generations=30, + num_parents_mating=10, + fitness_func=fitness_func, + sol_per_pop=50, + num_genes=5, + parent_selection_type="sss", + crossover_type="single_point", + mutation_type="random", + mutation_probability=0.05, + crossover_probability=0.7, + on_generation=on_generation +) + +# Run the GA +ga_instance.run() + +print("GA run completed!") diff --git a/pygad/__pycache__/__init__.cpython-313.pyc b/pygad/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1af7b39a607c9760ecd78fd03f24e744a42a2f6c GIT binary patch literal 230 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 literal 0 HcmV?d00001 diff --git a/pygad/__pycache__/pygad_modified.cpython-313.pyc b/pygad/__pycache__/pygad_modified.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c9dcca176992e852ea3a8f6215cb2a1f9bc20fd GIT binary patch literal 31194 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 literal 0 HcmV?d00001 diff --git a/pygad/helper/__pycache__/__init__.cpython-313.pyc b/pygad/helper/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f609f37e297da57147be2ee97c4c4403ff6e3e8 GIT binary patch literal 284 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 Q-&$X?o3?!_P|6zq{~}=;Y5)KL literal 0 HcmV?d00001 diff --git a/pygad/helper/__pycache__/unique.cpython-313.pyc b/pygad/helper/__pycache__/unique.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d686ca641216b5574071d7cf3899c86faed93c6e GIT binary patch literal 20444 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 literal 0 HcmV?d00001 diff --git a/pygad/pygad_modified.py b/pygad/pygad_modified.py new file mode 100644 index 0000000..fde2c9f --- /dev/null +++ b/pygad/pygad_modified.py @@ -0,0 +1,539 @@ +import numpy +import random +import logging +import pygad.utils +import pygad.helper +import pygad.visualize + +class GA(pygad.utils.parent_selection.ParentSelection, + pygad.utils.crossover.Crossover, + pygad.utils.mutation.Mutation, + pygad.utils.nsga2.NSGA2, + pygad.helper.unique.Unique, + pygad.helper.misc.Helper, + pygad.visualize.plot.Plot): + + supported_int_types = [int, numpy.int8, numpy.int16, numpy.int32, numpy.int64, + numpy.uint, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64, + object] + supported_float_types = [float, numpy.float16, numpy.float32, numpy.float64, + object] + supported_int_float_types = supported_int_types + supported_float_types + + def __init__(self, + num_generations, + num_parents_mating, + fitness_func, + fitness_batch_size=None, + initial_population=None, + sol_per_pop=None, + num_genes=None, + init_range_low=-4, + init_range_high=4, + gene_type=float, + parent_selection_type="sss", + keep_parents=-1, + keep_elitism=1, + K_tournament=3, + crossover_type="single_point", + crossover_probability=None, + mutation_type="random", + mutation_probability=None, + mutation_by_replacement=False, + mutation_percent_genes='default', + mutation_num_genes=None, + random_mutation_min_val=-1.0, + random_mutation_max_val=1.0, + gene_space=None, + gene_constraint=None, + sample_size=100, + allow_duplicate_genes=True, + on_start=None, + on_fitness=None, + on_parents=None, + on_crossover=None, + on_mutation=None, + on_generation=None, + on_stop=None, + save_best_solutions=False, + save_solutions=False, + suppress_warnings=False, + stop_criteria=None, + parallel_processing=None, + random_seed=None, + logger=None): + """ + The constructor of the GA class accepts all parameters required to create an instance of the GA class. It validates such parameters. + + num_generations: Number of generations. + num_parents_mating: Number of solutions to be selected as parents in the mating pool. + + fitness_func: Accepts a function/method and returns the fitness value of the solution. In PyGAD 2.20.0, a third parameter is passed referring to the 'pygad.GA' instance. If method, then it must accept 4 parameters where the fourth one refers to the method's object. + fitness_batch_size: Added in PyGAD 2.19.0. Supports calculating the fitness in batches. If the value is 1 or None, then the fitness function is called for each individual solution. If given another value X where X is neither 1 nor None (e.g. X=3), then the fitness function is called once for each X (3) solutions. + + initial_population: A user-defined initial population. It is useful when the user wants to start the generations with a custom initial population. It defaults to None which means no initial population is specified by the user. In this case, PyGAD creates an initial population using the 'sol_per_pop' and 'num_genes' parameters. An exception is raised if the 'initial_population' is None while any of the 2 parameters ('sol_per_pop' or 'num_genes') is also None. + sol_per_pop: Number of solutions in the population. + num_genes: Number of parameters in the function. + + init_range_low: The lower value of the random range from which the gene values in the initial population are selected. It defaults to -4. Available in PyGAD 1.0.20 and higher. + init_range_high: The upper value of the random range from which the gene values in the initial population are selected. It defaults to -4. Available in PyGAD 1.0.20. + # It is OK to set the value of the 2 parameters ('init_range_low' and 'init_range_high') to be equal, higher or lower than the other parameter (i.e. init_range_low is not needed to be lower than init_range_high). + + gene_type: The type of the gene. It is assigned to any of these types (int, numpy.int8, numpy.int16, numpy.int32, numpy.int64, numpy.uint, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64, float, numpy.float16, numpy.float32, numpy.float64) and forces all the genes to be of that type. + + parent_selection_type: Type of parent selection. + keep_parents: If 0, this means no parent in the current population will be used in the next population. If -1, this means all parents in the current population will be used in the next population. If set to a value > 0, then the specified value refers to the number of parents in the current population to be used in the next population. Some parent selection operators such as rank selection, favor population diversity and therefore keeping the parents in the next generation can be beneficial. However, some other parent selection operators, such as roulette wheel selection (RWS), have higher selection pressure and keeping more than one parent in the next generation can seriously harm population diversity. This parameter have an effect only when the keep_elitism parameter is 0. Thanks to Prof. Fernando Jiménez (http://webs.um.es/fernan) for editing this sentence. + K_tournament: When the value of 'parent_selection_type' is 'tournament', the 'K_tournament' parameter specifies the number of solutions from which a parent is selected randomly. + + keep_elitism: Added in PyGAD 2.18.0. It can take the value 0 or a positive integer that satisfies (0 <= keep_elitism <= sol_per_pop). It defaults to 1 which means only the best solution in the current generation is kept in the next generation. If assigned 0, this means it has no effect. If assigned a positive integer K, then the best K solutions are kept in the next generation. It cannot be assigned a value greater than the value assigned to the sol_per_pop parameter. If this parameter has a value different from 0, then the keep_parents parameter will have no effect. + + crossover_type: Type of the crossover operator. If crossover_type=None, then the crossover step is bypassed which means no crossover is applied and thus no offspring will be created in the next generations. The next generation will use the solutions in the current population. + crossover_probability: The probability of selecting a solution for the crossover operation. If the solution probability is <= crossover_probability, the solution is selected. The value must be between 0 and 1 inclusive. + + mutation_type: Type of the mutation operator. If mutation_type=None, then the mutation step is bypassed which means no mutation is applied and thus no changes are applied to the offspring created using the crossover operation. The offspring will be used unchanged in the next generation. + mutation_probability: The probability of selecting a gene for the mutation operation. If the gene probability is <= mutation_probability, the gene is selected. It accepts either a single value for fixed mutation or a list/tuple/numpy.ndarray of 2 values for adaptive mutation. The values must be between 0 and 1 inclusive. If specified, then no need for the 2 parameters mutation_percent_genes and mutation_num_genes. + + mutation_by_replacement: An optional bool parameter. It works only when the selected type of mutation is random (mutation_type="random"). In this case, setting mutation_by_replacement=True means replace the gene by the randomly generated value. If False, then it has no effect and random mutation works by adding the random value to the gene. + + mutation_percent_genes: Percentage of genes to mutate which defaults to the string 'default' which means 10%. This parameter has no action if any of the 2 parameters mutation_probability or mutation_num_genes exists. + mutation_num_genes: Number of genes to mutate which defaults to None. If the parameter mutation_num_genes exists, then no need for the parameter mutation_percent_genes. This parameter has no action if the mutation_probability parameter exists. + random_mutation_min_val: The minimum value of the range from which a random value is selected to be added to the selected gene(s) to mutate. It defaults to -1.0. + random_mutation_max_val: The maximum value of the range from which a random value is selected to be added to the selected gene(s) to mutate. It defaults to 1.0. + + gene_space: It accepts a list of all possible values of the gene. This list is used in the mutation step. Should be used only if the gene space is a set of discrete values. No need for the 2 parameters (random_mutation_min_val and random_mutation_max_val) if the parameter gene_space exists. Added in PyGAD 2.5.0. In PyGAD 2.11.0, the gene_space can be assigned a dict. + + gene_constraint: It accepts a list of constraints for the genes. Each constraint is a Python function. Added in PyGAD 3.5.0. + sample_size: To select a gene value that respects a constraint, this variable defines the size of the sample from which a value is selected randomly. Useful if either allow_duplicate_genes or gene_constraint is used. Added in PyGAD 3.5.0. + + on_start: Accepts a function/method to be called only once before the genetic algorithm starts its evolution. If functioned, then it must accept a single parameter representing the instance of the genetic algorithm. If method, then it must accept 2 parameters where the second one refers to the method's object. Added in PyGAD 2.6.0. + on_fitness: Accepts a function/method to be called after calculating the fitness values of all solutions in the population. If functioned, then it must accept 2 parameters: 1) a list of all solutions' fitness values 2) the instance of the genetic algorithm. If method, then it must accept 3 parameters where the third one refers to the method's object. Added in PyGAD 2.6.0. + on_parents: Accepts a function/method to be called after selecting the parents that mates. If functioned, then it must accept 2 parameters: the first one represents the instance of the genetic algorithm and the second one represents the selected parents. If method, then it must accept 3 parameters where the third one refers to the method's object. Added in PyGAD 2.6.0. + on_crossover: Accepts a function/method to be called each time the crossover operation is applied. If functioned, then it must accept 2 parameters: the first one represents the instance of the genetic algorithm and the second one represents the offspring generated using crossover. If method, then it must accept 3 parameters where the third one refers to the method's object. Added in PyGAD 2.6.0. + on_mutation: Accepts a function/method to be called each time the mutation operation is applied. If functioned, then it must accept 2 parameters: the first one represents the instance of the genetic algorithm and the second one represents the offspring after applying the mutation. If method, then it must accept 3 parameters where the third one refers to the method's object. Added in PyGAD 2.6.0. + on_generation: Accepts a function/method to be called after each generation. If functioned, then it must accept a single parameter representing the instance of the genetic algorithm. If the function returned "stop", then the run() method stops without completing the other generations. If method, then it must accept 2 parameters where the second one refers to the method's object. Added in PyGAD 2.6.0. + on_stop: Accepts a function/method to be called only once exactly before the genetic algorithm stops or when it completes all the generations. If functioned, then it must accept 2 parameters: the first one represents the instance of the genetic algorithm and the second one is a list of fitness values of the last population's solutions. If method, then it must accept 3 parameters where the third one refers to the method's object. Added in PyGAD 2.6.0. + + save_best_solutions: Added in PyGAD 2.9.0 and its type is bool. If True, then the best solution in each generation is saved into the 'best_solutions' attribute. Use this parameter with caution as it may cause memory overflow when either the number of generations or the number of genes is large. + save_solutions: Added in PyGAD 2.15.0 and its type is bool. If True, then all solutions in each generation are saved into the 'solutions' attribute. Use this parameter with caution as it may cause memory overflow when either the number of generations, number of genes, or number of solutions in population is large. + + suppress_warnings: Added in PyGAD 2.10.0 and its type is bool. If True, then no warning messages will be displayed. It defaults to False. + + allow_duplicate_genes: Added in PyGAD 2.13.0. If True, then a solution/chromosome may have duplicate gene values. If False, then each gene will have a unique value in its solution. + + stop_criteria: Added in PyGAD 2.15.0. It is assigned to some criteria to stop the evolution if at least one criterion holds. + + parallel_processing: Added in PyGAD 2.17.0. Defaults to `None` which means no parallel processing is used. If a positive integer is assigned, it specifies the number of threads to be used. If a list or a tuple of exactly 2 elements is assigned, then: 1) The first element can be either "process" or "thread" to specify whether processes or threads are used, respectively. 2) The second element can be: 1) A positive integer to select the maximum number of processes or threads to be used. 2) 0 to indicate that parallel processing is not used. This is identical to setting 'parallel_processing=None'. 3) None to use the default value as calculated by the concurrent.futures module. + + random_seed: Added in PyGAD 2.18.0. It defines the random seed to be used by the random function generators (we use random functions in the NumPy and random modules). This helps to reproduce the same results by setting the same random seed. + + logger: Added in PyGAD 2.20.0. It accepts a logger object of the 'logging.Logger' class to log the messages. If no logger is passed, then a default logger is created to log/print the messages to the console exactly like using the 'print()' function. + """ + try: + # If no logger is passed, then create a logger that logs only the messages to the console. + if logger is None: + # Create a logger named with the module name. + logger = logging.getLogger(__name__) + # Set the logger log level to 'DEBUG' to log all kinds of messages. + logger.setLevel(logging.DEBUG) + + # Clear any attached handlers to the logger from the previous runs. + # If the handlers are not cleared, then the new handler will be appended to the list of handlers. + # This makes the single log message be repeated according to the length of the list of handlers. + logger.handlers.clear() + + # Create the handlers. + stream_handler = logging.StreamHandler() + # Set the handler log level to 'DEBUG' to log all kinds of messages received from the logger. + stream_handler.setLevel(logging.DEBUG) + + # Create the formatter that just includes the log message. + formatter = logging.Formatter('%(message)s') + + # Add the formatter to the handler. + stream_handler.setFormatter(formatter) + + # Add the handler to the logger. + logger.addHandler(stream_handler) + else: + # Validate that the passed logger is of type 'logging.Logger'. + if isinstance(logger, logging.Logger): + pass + else: + raise TypeError(f"The expected type of the 'logger' parameter is 'logging.Logger' but {type(logger)} found.") + + # Create the 'self.logger' attribute to hold the logger. + # Instead of using 'print()', use 'self.logger.info()' + self.logger = logger + + self.random_seed = random_seed + if random_seed is None: + pass + else: + numpy.random.seed(self.random_seed) + random.seed(self.random_seed) + + # If suppress_warnings is bool and its value is False, then print warning messages. + if type(suppress_warnings) is bool: + self.suppress_warnings = suppress_warnings + else: + self.valid_parameters = False + raise TypeError(f"The expected type of the 'suppress_warnings' parameter is bool but {type(suppress_warnings)} found.") + + # Validating mutation_by_replacement + if not (type(mutation_by_replacement) is bool): + self.valid_parameters = False + raise TypeError(f"The expected type of the 'mutation_by_replacement' parameter is bool but {type(mutation_by_replacement)} found.") + + self.mutation_by_replacement = mutation_by_replacement + + # Validate the sample_size parameter. + if type(sample_size) in GA.supported_int_types: + if sample_size > 0: + pass + else: + self.valid_parameters = False + raise ValueError(f"The value of the sample_size parameter must be > 0 but the value ({sample_size}) found.") + else: + self.valid_parameters = False + raise TypeError(f"The expected type of the 'sample_size' parameter is integer but {type(sample_size)} found.") + self.sample_size = sample_size + + # Environment state machine implementation + self.ENV_FAST = "ENV_FAST" + self.ENV_STABLE = "ENV_STABLE" + self.ENV_DIVERSE = "ENV_DIVERSE" + self.environment_cycle = [self.ENV_FAST, self.ENV_STABLE, self.ENV_DIVERSE] + self.current_environment = self.ENV_STABLE # Default to stable environment + + # Environment-specific parameters + self.env_params = { + self.ENV_FAST: { + "parent_selection_type": "tournament", + "mutation_probability": 0.1, + "crossover_probability": 0.9 + }, + self.ENV_STABLE: { + "parent_selection_type": "sss", + "mutation_probability": 0.05, + "crossover_probability": 0.7 + }, + self.ENV_DIVERSE: { + "parent_selection_type": "rank", + "mutation_probability": 0.15, + "crossover_probability": 0.5 + } + } + + # Save original parameters to restore after environment changes + self.original_parent_selection_type = parent_selection_type + self.original_mutation_probability = mutation_probability + self.original_crossover_probability = crossover_probability + + # ... existing code ... + # Set valid_parameters to True since we've completed all parameter validations + self.valid_parameters = True + self.best_solutions = [] # Holds the best solution in each generation. + self.best_solutions_fitness = [] # Holds the fitness of the best solution in each generation. + self.solutions = [] # Holds the solutions in each generation. + self.solutions_fitness = [] # Holds the fitness of the solutions in each generation. + self.last_generation_fitness = None # Holds the fitness values of all solutions in the last generation. + # Callback attributes + self.on_start = None + self.on_fitness = None + self.on_parents = None + self.on_crossover = None + self.on_mutation = None + self.on_generation = None + self.on_stop = None + # Generation tracking attributes + self.generations_completed = 0 + self.run_completed = False + # Parameters of the genetic algorithm + self.num_generations = abs(num_generations) + self.parent_selection_type = parent_selection_type + self.sol_per_pop = sol_per_pop + self.num_genes = num_genes + # Parameters of the mutation operation + self.mutation_percent_genes = mutation_percent_genes + self.mutation_num_genes = mutation_num_genes + # Population initialization + self.pop_size = (self.sol_per_pop, self.num_genes) + self.population = numpy.empty(shape=self.pop_size, dtype=object) + # Fitness function + self.fitness_func = fitness_func + # Gene space + self.gene_space = gene_space + # Initial population generation + if self.gene_space is None: + # Create the initial population randomly + for sol_idx in range(self.sol_per_pop): + for gene_idx in range(self.num_genes): + # Default range [-1, 1] for random generation + self.population[sol_idx, gene_idx] = numpy.random.uniform(-1, 1) + + except Exception as e: + self.logger.error(f"Error in the __init__ method: {e}") + raise + + def get_environment_state(self, generation): + """ + Returns the current environment state based on the generation number. + Environment changes every 10 generations. + """ + env_index = (generation // 10) % len(self.environment_cycle) + return self.environment_cycle[env_index] + + def update_environment(self, generation): + """ + Updates the environment parameters based on the current generation. + """ + new_environment = self.get_environment_state(generation) + if new_environment != self.current_environment: + self.current_environment = new_environment + self.logger.info(f"[Generation {generation}] Environment switched to: {self.current_environment}") + + # Update parameters based on the new environment + env_params = self.env_params[self.current_environment] + self.parent_selection_type = env_params["parent_selection_type"] + self.mutation_probability = env_params["mutation_probability"] + self.crossover_probability = env_params["crossover_probability"] + + def calculate_diversity_score(self, solution, population): + """ + Calculates the diversity score of a solution as the average distance from all other solutions in the population. + """ + if len(population) <= 1: + return 0.0 + + distances = [] + for other_solution in population: + if numpy.array_equal(solution, other_solution): + continue + distance = numpy.linalg.norm(solution - other_solution) + distances.append(distance) + + return numpy.mean(distances) + + def cal_pop_fitness(self): + """ + Calculates the fitness of the entire population, including time cost and diversity score. + """ + import time + + fitness = [] + for solution in self.population: + start_time = time.time() + fitness_score = self.fitness_func(self, solution) + time_cost = (time.time() - start_time) * 1000 # Convert to milliseconds + diversity_score = self.calculate_diversity_score(solution, self.population) + + fitness.append([fitness_score, time_cost, diversity_score]) + + return numpy.array(fitness) + + def run(self): + """ + Runs the genetic algorithm with environment state machine and multi-objective optimization. + """ + try: + if self.valid_parameters == False: + raise Exception("Error calling the run() method: \nThe run() method cannot be executed with invalid parameters. Please check the parameters passed while creating an instance of the GA class.\n") + + # Starting from PyGAD 2.18.0, the 4 properties (best_solutions, best_solutions_fitness, solutions, and solutions_fitness) are no longer reset with each call to the run() method. Instead, they are extended. + # For example, if there are 50 generations and the user set save_best_solutions=True, then the length of the 2 properties best_solutions and best_solutions_fitness will be 50 after the first call to the run() method, then 100 after the second call, 150 after the third, and so on. + + # self.best_solutions: Holds the best solution in each generation. + if type(self.best_solutions) is numpy.ndarray: + self.best_solutions = self.best_solutions.tolist() + # self.best_solutions_fitness: A list holding the fitness value of the best solution for each generation. + if type(self.best_solutions_fitness) is numpy.ndarray: + self.best_solutions_fitness = list(self.best_solutions_fitness) + # self.solutions: Holds the solutions in each generation. + if type(self.solutions) is numpy.ndarray: + self.solutions = self.solutions.tolist() + # self.solutions_fitness: Holds the fitness of the solutions in each generation. + if type(self.solutions_fitness) is numpy.ndarray: + self.solutions_fitness = list(self.solutions_fitness) + + if not (self.on_start is None): + self.on_start(self) + + stop_run = False + + # To continue from where we stopped, the first generation index should start from the value of the 'self.generations_completed' parameter. + if self.generations_completed != 0 and type(self.generations_completed) in GA.supported_int_types: + # If the 'self.generations_completed' parameter is not '0', then this means we continue execution. + generation_first_idx = self.generations_completed + generation_last_idx = self.num_generations + self.generations_completed + else: + # If the 'self.generations_completed' parameter is '0', then stat from scratch. + generation_first_idx = 0 + generation_last_idx = self.num_generations + + # Measuring the fitness of each chromosome in the population. Save the fitness in the last_generation_fitness attribute. + self.last_generation_fitness = self.cal_pop_fitness() + + # Know whether the problem is SOO or MOO. + if type(self.last_generation_fitness[0]) in GA.supported_int_float_types: + # Single-objective problem. + # If the problem is SOO, the parent selection type cannot be nsga2 or tournament_nsga2. + if self.parent_selection_type in ['nsga2', 'tournament_nsga2']: + raise TypeError(f"Incorrect parent selection type. The fitness function returned a single numeric fitness value which means the problem is single-objective. But the parent selection type {self.parent_selection_type} is used which only works for multi-objective optimization problems.") + elif type(self.last_generation_fitness[0]) in [list, tuple, numpy.ndarray]: + # Multi-objective problem. + pass + + best_solution, best_solution_fitness, best_match_idx = self.best_solution(pop_fitness=self.last_generation_fitness) + + # Appending the best solution in the initial population to the best_solutions list. + if self.save_best_solutions: + self.best_solutions.append(list(best_solution)) + + for generation in range(generation_first_idx, generation_last_idx): + + # Update environment every 10 generations + if generation % 10 == 0: + self.update_environment(generation) + + self.run_loop_head(best_solution_fitness) + + # Call the 'run_select_parents()' method to select the parents. + # It edits these 2 instance attributes: + # 1) last_generation_parents: A NumPy array of the selected parents. + # 2) last_generation_parents_indices: A 1D NumPy array of the indices of the selected parents. + self.run_select_parents() + + # Call the 'run_crossover()' method to select the offspring. + # It edits these 2 instance attributes: + # 1) last_generation_offspring_crossover: A NumPy array of the selected offspring. + # 2) last_generation_elitism: A NumPy array of the current generation elitism. Applicable only if the 'keep_elitism' parameter > 0. + self.run_crossover() + + # Call the 'run_mutation()' method to mutate the selected offspring. + # It edits this instance attribute: + # 1) last_generation_offspring_mutation: A NumPy array of the mutated offspring. + self.run_mutation() + + # Call the 'run_update_population()' method to update the population after both crossover and mutation operations complete. + # It edits this instance attribute: + # 1) population: A NumPy array of the population of solutions/chromosomes. + self.run_update_population() + + # The generations_completed attribute holds the number of the last completed generation. + self.generations_completed = generation + 1 + + self.previous_generation_fitness = self.last_generation_fitness.copy() + # Measuring the fitness of each chromosome in the population. Save the fitness in the last_generation_fitness attribute. + self.last_generation_fitness = self.cal_pop_fitness() + + best_solution, best_solution_fitness, best_match_idx = self.best_solution( + pop_fitness=self.last_generation_fitness) + + # Appending the best solution in the current generation to the best_solutions list. + if self.save_best_solutions: + self.best_solutions.append(list(best_solution)) + + # Calculate and print Pareto front + if type(self.last_generation_fitness[0]) in [list, tuple, numpy.ndarray]: + pareto_fronts, _ = self.non_dominated_sorting(self.last_generation_fitness) + pareto_front = pareto_fronts[0] # Get the first Pareto front + + # Format the Pareto front data + pareto_front_data = [] + for solution in pareto_front: + fitness_score = solution[1][0] + time_cost = solution[1][1] + diversity_score = solution[1][2] + pareto_front_data.append({ + "fitness": fitness_score, + "time": time_cost, + "diversity": diversity_score + }) + + # Print the Pareto front data + self.logger.info(f"Pareto Front for Generation {generation}:") + self.logger.info(f"{pareto_front_data}") + + # Note: Any code that has loop-dependant statements (e.g. continue, break, etc.) must be kept inside the loop of the 'run()' method. It can be moved to another method to clean the run() method. + # If the on_generation attribute is not None, then cal the callback function after the generation. + if not (self.on_generation is None): + r = self.on_generation(self) + if type(r) is str and r.lower() == "stop": + # Before aborting the loop, save the fitness value of the best solution. + # _, best_solution_fitness, _ = self.best_solution() + self.best_solutions_fitness.append(best_solution_fitness) + break + + if not self.stop_criteria is None: + for criterion in self.stop_criteria: + if criterion[0] == "reach": + # Single-objective problem. + if type(self.last_generation_fitness[0]) in GA.supported_int_float_types: + if max(self.last_generation_fitness) >= criterion[1]: + stop_run = True + break + # Multi-objective problem. + elif type(self.last_generation_fitness[0]) in [list, tuple, numpy.ndarray]: + # Validate the value passed to the criterion. + if len(criterion[1:]) == 1: + # There is a single value used across all the objectives. + pass + elif len(criterion[1:]) > 1: + # There are multiple values. The number of values must be equal to the number of objectives. + if len(criterion[1:]) == len(self.last_generation_fitness[0]): + pass + else: + self.valid_parameters = False + raise ValueError(f"When the the 'reach' keyword is used with the 'stop_criteria' parameter for solving a multi-objective problem, then the number of numeric values following the keyword can be:\n1) A single numeric value to be used across all the objective functions.\n2) A number of numeric values equal to the number of objective functions.\nBut the value {criterion} found with {len(criterion)-1} numeric values which is not equal to the number of objective functions {len(self.last_generation_fitness[0])}.") + + stop_run = True + for obj_idx in range(len(self.last_generation_fitness[0])): + # Use the objective index to return the proper value for the criterion. + + if len(criterion[1:]) == len(self.last_generation_fitness[0]): + reach_fitness_value = criterion[obj_idx + 1] + elif len(criterion[1:]) == 1: + reach_fitness_value = criterion[1] + else: + # Unexpected to be reached, but it is safer to handle it. + self.valid_parameters = False + raise ValueError(f"The number of values does not equal the number of objectives.") + + if max(self.last_generation_fitness[:, obj_idx]) >= reach_fitness_value: + pass + else: + stop_run = False + break + elif criterion[0] == "saturate": + criterion[1] = int(criterion[1]) + if self.generations_completed >= criterion[1]: + # Single-objective problem. + if type(self.last_generation_fitness[0]) in GA.supported_int_float_types: + if (self.best_solutions_fitness[self.generations_completed - criterion[1]] - self.best_solutions_fitness[self.generations_completed - 1]) == 0: + stop_run = True + break + # Multi-objective problem. + elif type(self.last_generation_fitness[0]) in [list, tuple, numpy.ndarray]: + stop_run = True + for obj_idx in range(len(self.last_generation_fitness[0])): + if (self.best_solutions_fitness[self.generations_completed - criterion[1]][obj_idx] - self.best_solutions_fitness[self.generations_completed - 1][obj_idx]) == 0: + pass + else: + stop_run = False + break + + if stop_run: + break + + # Save the fitness of the last generation. + if self.save_solutions: + # self.solutions.extend(self.population.copy()) + population_as_list = self.population.copy() + population_as_list = [list(item) for item in population_as_list] + self.solutions.extend(population_as_list) + + except Exception as e: + self.logger.error(f"Error in the run() method: {e}") + raise + + # ... existing code ... \ No newline at end of file diff --git a/pygad/utils/__pycache__/__init__.cpython-313.pyc b/pygad/utils/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d30d63321df73dc008da865270e7c5e20e5a48c GIT binary patch literal 358 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 Ke1>RlO!PkoiKxK< literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/mutation.cpython-313.pyc b/pygad/utils/__pycache__/mutation.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8a2fc7584f23e633e4dd9a487a5421d3cfd0d0d GIT binary patch literal 30270 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 literal 0 HcmV?d00001 diff --git a/pygad/utils/__pycache__/parent_selection.cpython-313.pyc b/pygad/utils/__pycache__/parent_selection.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0a79536ae492afec469548aa8b9d1f8295ed1bf GIT binary patch literal 22310 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 V+;UNL(Qh4tF1q_Bg(>Oa{{Rx-8aV&} literal 0 HcmV?d00001 diff --git a/pygad/visualize/__pycache__/__init__.cpython-313.pyc b/pygad/visualize/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d6bd719f8597f3b467f50e2392f2847022d5510 GIT binary patch literal 260 zcmey&%ge<81iLn=Wm*F1#~=<2FhLogMSzT{48aV+jNS}hj75wJ48crAOzF&;EH6Py zG#PKP6y)TWRIwWB8R{AMX)@p9FQ`mUOwlXLEG|vV$*f8(Vg{rAmMBk6H=6z`h3Z*C;PgeO>2L$ds|FMVsW;DWsFOHX;NZ-jC*QcYDs3Y zV@`U0QD#X-Za`&8Mt)ul*p?W$Eiv)&nR%Hd@$q^EmA5!-a`RJ4b5iY!IDu9$0&y`f XkodsN$jEq?LE!PPe~wwct3P`2oM-yY+($3+ZgZzuqD){8@%cZTtICh;Va<>Zcq1Y zRT5l1731xhH9hG{)77q7x~H?_+3L!;X1g}dW|MX8kJP;u)4I8FrKqfHHvThRt(1c7xkJlT`K~?(3ZMo$q|-JCE;i&Qqf?hl23Szo_^9aEhY-9$%E8i#hlBJu$1-8a0VzU`oJR<3U|a?% zUlD#9{6Ecy3*e-2Qzxk7ngB&p9;%MAYX>+?V%JLM877Qy{Jt^A>}7nCGUU5mBV~}t za7Y7b>90@0^+?y~5XZ3paO;;3|LVP8|LMPY_?Q27bchL^qdP~tgL7j{aI}{Vuwmc$ zA^%j6^M$8pPF)7H1EZvNqiXF&u_P!^%AI1v-Z&0i78H^V{~-fh-lhJhfl6->_2zf` zpTax!OeOK-(?5aBkEl@!2u=a9HC&oo3k26yQOSSqY;1tHG+g>KF*)vZ5|fb}Bfq=# z?hF#2nL56TavR*4Bt@1xi_4x$vl}JdDX8TmY=aGmBRNUyAnW{ynxgEQflnze7v4Cm zJC_L;Da-5i1$<$zS27|Phw^HH$WS_5-lfDW1IaKjPS_K^VL%WBJOyxm1P$&YpEq9I znl8YLsi!bL#*T?8Tv$RRb` z`3#sK4U&R84N*}_9x*A=BS=>gMvx>VxQdjg_}!Vd2VQzL%>SaOky7RRX37E@{gCAR zuaGm2rB21AOo8UAP@dv9YAwkt0tiH=v>uGO#JTA$u(}(Yz^BMAd`X_ zO%2*pV*HZSW1!uu5^0dBlr&PKV1ANfTA^l{P_s-=W~!RGq1LagPH_yrRh>LpYjEft-bqCt&pH|7Qex%PWHZIYsGVj2iq%tueImb84KDf*zeG)1BR! z1~9Iw6zJR%1yaIQsG;0bw_mJuXo11~P&%O!vwKSvdL^X;#h^zghv7nZPN$YedbTCU zQPi+ajoq0dwq1=?CV+%Q$|r!GJqEoRO6W+4jy-y^VJl9)4_{yV*(R2$A;&)K!|4ON#E2Q$I{_xCQOIsW@Z=;R$w6-lEOC@qQe0; z6rwLM{yCOrF9iJ;*a>>tVH`-2yukggmWLf9Afvt4vgtYY})AQ6}R%oywMqEF%t5GI+2TbN5eSW05f%c&B) zo{+%r3$Pb`6X9t90*^F#rh}6N5?R;L-RvYY=SR$f^iCPe=^#*W#y2mw7pW^^>kVI?1*C@Hnpg??; z@2Z-y7DXw8JkoQ(KXKx-z{V4_Pi6(VD})f`Wctm@qzyUfV_~Fk00a~jQV3Yj&n8e? zO-(2rVlJ@W2_I0T+s8qB1i8z|9QavgU&5%s)2>*jl=~faOOSA2`9aNpfcTRZi}lAw zJKgAWunzen$A+N28}0U(q(qwTr8*=%HW#KFuY_3tq$A$LL*7_NW+$%NH}p^k5vB$t z9U^B>ld{zwBBc{HkkSd+rOX(!NNK<)pK3W=w{nGW`BWoiVF$rZA*F|XQ`6y3wNm{n%LW637DM(`?9IDHWzfNy_jCr>0m=N@qDP$Vmp*TmZP8J&JEcs**C~rj>Na z@KVtj8-flQ^v~h267t4qD(SF;0S?&1q;%57q|8_!lhXWbKuRaFoTTkNB$bBdW@m$3 zn4JLp!rn=LkdgaSNXlR@g@LW4v``q3;+Vh`fFnJXE5K?OHSYH^Oqzrjvk}~80 z2r5MQ5{L#o0;o$m9J=jhxI@EmIJF<5;MR+;C>)HQuCZiddV*2p2K~NE|;m1X+|bByz1}K8503;wPj< zs0XI0cd7N=l))6$+XTIBMHA86MT6=3iEAgKhDyOuxlU2mdF|H}WxS$&kY5F_^c5`# z#szO{;o11M_MzDtF;_2StmRs+&s>{%FSwBQK%cj$i<+7RQ}fCp!Q_bOTfgZ3()Krn ze_Q$QEBT#+tNOv!p)>sOXmmIv42SseoG^SLGIWujzp^@X`BSF_rz^7EEmXUI zWg2>5E?o4zZ@o42dHWZ(U$p$Zg|9mpF&`977A)ZCdsjXjzn@nvmR2ogE~bm7!kdO0 zhNX$6*KQqI(M21N2#rVX9ugXRB6Yn&W$&*{eF%?zzx6idYW|C5IQ&zs{g)8g7MFoYCeUp}FVod7=4O zq~Z8i)h8B>YqU+Eor^}Xu0^QZ%bTjj*oTK@){mNh+`K#ytv@8xABvP6{_D28GyD;^ zP&TxfDHc>LXG99>MN8Su6E{vQXNv7TV%vWBt!Gk&^iwLW@StWriz>1%+ara|m~7z2 zz^(Sr3s%njv?5ZwOLVl0yN`*^L-1SArV4AHQo6z;n)MvaV*6EL171fZ|Il0qZJ)OMTgkd zCAREXPp8ZkPbjU~xt>AgmoNDu<_1iddn1<=V2Rqh1$%eIb~Iw`5t|&*rlUgBQPBxS zwL^u>)+bb&xdZA0dD)1$7W3xZ$oa7SR>AU6)OJv?9gI{Tij*G~>zibHiQ7BHZEcvh z{4wO+33;>gt{biy7Cj3FA*)r)%Dry9W?Ya>!A zJBHwAwpI9DDXhEFegBII|iv-iC3wY@5y%ohRH#VFHi+c82uqF z;FKJOZ-FS8K}1Q9DoWZ&>J-YK&9+nwDvF3rs)$%epw=d1ut9nC!uF3tg}MNa$pJ*a zY$AB&yFeX~96Fd1_wpMhXQt4ksWJv5C{1ktkSf2E-H?PU@U$F%u>smdh4Ix0JO zk+VQLiLnmKkiQ>6q-Xy8W)OO%yeu#0ag2?x={eMlbEp*OaQL(rb2L8VfXAW2n8QIz z$|cKjwZDO=z=k>0DRDS9NP39z&a#|$HaII~CnRGgCb&jSk-^N)f{a1L8xBT4DoM0R z77|dK#DOA>vRgRR93{sSd8`W~P*E=n4twEAGR*~i=jT|pfkRR)NJie|uLRq;c!tI; zML$G@iyRQ2ykjhAJwO%;g&8g^rO7f<&<|20L=ugWWKGDIsvIJ|aQgtW5Td+6;)uP- zf=3aNGM-^gsXQ)%JQMkS1p6D1xIq|keuFR)B*Mt7B8OulGm-|b(6e9B=3;+VR_ZRYUi^`M8|eMtNB4y?Q(atZog2s|EsD43j+^J zEBMNmNU3At_?o3AYHJtZXK7zJD&`kQ%bEoE8&>A)D5)8Zej@Q02 zoOxVMSr2NyuA=hkWC=^uTb42+`YK$Sf~dxq?BR#cE}Xb;_#@F+v}BJMYh#Pn58Ib5 z(ds=y^`1!iUVc9VGTS?vZtcRr6A<2xYB9AfVkAr4!TR){ zVfm92TUdi#A+>HD#|;b&j74!EfPvbUcE34T8EY%*j0hao8OR%zB>QX#j z!Bp)JOG-`3I=mDFz%kREgMwLa8uRafKh&jv0;i;~>Jm<&ZhZ>~WD0)DJ&^lt z;d*jY!p#G_oq>pze-0K+V*o@TR|;VOEPN(+Zl`t*I5%JpdXK?rC#=XjP5*l z-VUuhW=S0GbDM}j3N2_%hpVBa;4Vx^QIJYZOG(8vfLD;RZbfmS(``^-BM}nnT&&b(0yL*;U0^nP zb#;li-w5h>c+W^!~&9TKwUi!Jb3S-p(6e#o*$*sO6&IqZT0j<3O%6G>doho+#?{6scyX25KeO`)7 zJQf(ejo2IeS7mPC6x@{x2f{3v?>dka4X++!0#ByoKLvuj%5CjT z3lsyKgU`Zo9eMVfyGqFm^eA@IIEnzb0~ZHMJSDE9DRNYUZ&(dckCnK3pN;oq#Ub{C zYFQ7x0wCAMAm;<*Qcr0r$iqLB;r3h9Ty+V#$~ zwEKw^u{JffKSgZ28v9}{(+*Aom(>$4(=y)whgW?2x3uERcMU#EHD%^fR(YU|ZFs&a zHep4i8T@3+DSlL0k&)7Z#*}NKE3dLP z@zLiS)^dQFZLn2py}DTwI3H=(KNA~uzvZmy(G$~(!F4)C@7BAwxm!qoHn`l+ z#>Y)7XUt$)aWLb$&6-v&f^QTJYRWNikOHrv(A*em9YZvG9(FRIlMmWj;_;~41Q(*C z40ug*yReA6ciwjXl ze>eViQyeopox+!oeBZ1yA2?beiZN$C;IwcM^3TLv`X+sTzw8%;j+K5t_-H0L_azqe z9Pd8DySSGJygk{;NpOQhuf;g#`(*#Ztve8o`I+%^F)UR>3AoxNxM9|SOKMGw4l^tR zZm;0F2mJ0&GhLwo`qjZCe3c5{RQL|kI2h+L0 zgk!$@dC+F&fUAg8FPO{G{Js$Y>C6fg*o~H}f+jJ<);A^3WR`=m{cMkLBh({wxPc6r z;NOQHl>=NUd`PlRK0-<55lnK_e0ncVI*%~X)LUPM-!IXvAFyk=a(I_Cm!-_usPGSy zB>eioBhZ0SkAiR+f*o`j#1Ake8D^RA__P;{dc=VeGO-~ko%BoqRtTwOC&esqEDoJx zxsa4O!%q01CrY|;W;P^ctK*GbL()G2y#_TUm--vT2!Ti$9C5gQ1fp7^iM5HN@k2FU zYVcBv7o-Gd!^?KO^xy?GvK%PAC=TT=serKSMplt>lio96GKO7xQX05<0=ldZ?3HMl zB;6JKDr0kgg8daWm$H9n4w!YlG3QPLK0~vRDoDoI+cb+Fud>xQJv7aLdn$kgZ*BAo zH4t}Lub;UboC^~xucQYHus2pFH-?o+zl;v-l5UFgO>ih0$6zz#EE%MeEWMHrY0bs$ z!4;dZ2TM8eky^@$PX=<^A}u*I7R$b+<^*O9dT~;bvXEdL>^_j60Iv{t7Biq~Leesq zUf!gGvE^s_&-Ayue=+d$fe83}T5M~U67;2vT5RwFhSG)!ETxdu zJ}9e)*G3jgDWAkr3MaLqxol}NVy+_)o1+EIV&k@G;~oKiDL}nNK%G-Sog<+91e9O9 zX0o8mWYknGn5y}j*;Ui|2Sqh}?fFO%$D6pdM1NeqY9d;7PN+J!dgUEJj6yfPtF z?7VY%vG=}ZL@ca|xvdt-KB(yAc|fooxLYmQjzp~8e9xKt!>{urqu@j=^ql2=+~V;k z&@4S#%xa6E`)bk6o*O-J`}ZA2s6G%WKgb_;-yibuXNLKqVd3!WJR4Z-0i#0UVXbJ& zziGT-Tw+%2i^hn_xmI5N(SZ*RtU$H*-^c>Y-D?HqOXuI;w>*5?{K;9-QXI9^36{F$ z(<>z(kFHvFkT1wQ%gm~!5#Db0-RR>h9iN@QUA+<(DxG(;7yAUuD8_&{?sCWH?%U>{ zz9!V}yyIIOh*!pddy`)8M@Z&!aZ^G)y{)Y(6;T^avr<4*>cvc&Sbm5fNaL#(ha zXMNBgt#Akx4!-r^Uz_jt-7Obd`}x<$_zK7UiaBtkUa?0icd9Adgo?H=Z2azH(cOc> zZsJD0+ZEa2<~@`5r>6P0IDU!~JR#tfgW6+SzM>5XT{)^nIJQV-s|u$@sA&0|<()^P z&J%+3#Jxj;b0FdvZTQ6q`D(1&pv_P_a)1Bd!pSVLiY$idRFNE zqsV?Q&v5rcVgADR_|W$R2K(qqtw+n#`w-eRfyPFvcP2sW6zI+`ZT!L0(Sv7%gWwzg zx^VD~NY@B|HgG>U%X9O5a9%ij1)%k5PXn}0pkDQa7Kxv^Qq0rap%J4MdxeUQ*!#^#8c;X))E<0X`^oJJ%~Hqv`s|YbTcqZ?g+01;bwO z7>OFJg2DQgp?b|&ywtgBtP}G~ZnoTLS=Ou^xvl#}?$2|DZTs(P_~yflEqwlwg(K+A zU3k-a!@67$G20dnizQ_r<$RFC*E%0GwaPgnO$Ws7&h>Pvw051+mhM_O2Cmq~yz70} z`mXn1>tCu{HCWe*>E+_pV*6s+nyKJs=8epysoSNCnSyB#yvxJla?@9)mdDvtNz=N4 zs<17;v0A1$b%o{hj$<-@S67!z1qN755(o^eQ_5y~=J4;8#g+t#6vuzFG9#zPSp0^9BA@ zP%7+lNZytJ_A)h~u!3v+r&%CT{GmLozlE)T1ePTN%ENs47=rgI^t=ep{T(Cl%rM3jNemwWu?Cer(DXNu`?~MyG}UsVhj1U zbr--$1j8dudDIP5f4FX0;XH5bQ zuO6e40)1a*|Iw3IK)q%PX5Yzbu1V`(V2wy*d1&umQ+3jYJ6e54WOQ2drb}seSj`S zDqWywfW;y;U5YkP1h&EuiWCQmzN3;9iYXFXEsq=K6f8CT0G<( zEo5^GNxXwrH^hRK=AUdL#43fVl8t8)ypmH5h)sm358?a)Xj1YR-%^jQEN_B-u|*&u zR@ug#bnt+3fW>SO^mnmy9#B=*MIV(9HXz%VK$F`81~Ax=4@ZmvS8+iw-vJI6d?DYM z&+iLgR<<)?Ub$4pKReCH*oR@0cL=#MFs>#{!K9?paKZ+tK;?Y$vjRF5s;|Jpa2@GO zG+r`FUea&8q~H7@%nd|e{Rk)D`GHNLM*3-NyM2gG?4?9)4($X+88pny8xni){K)2^ z%iDrd4jG9@XVB`&4pL^1d@@Q*4G(H_9UdBoZ7XX<$+r7+!X)-|?j}^1?8N7m@Cl|r zStp*nU8s_yF$yQ_1YNcbUvX;X8t{VN@Ukwu37>GTk<#XUvt$R6R1Ev#>ph%(1Bg}`Yv8N z@Uj~&_VRDgBqK#g&Ecp4G#{#ny^9fqE`&^E-;t4HXBapIE-*##Gj2rJ{A>+$zA!r@ z*^rnlzNbji_#^|^w_x8Djuzfa8{RHUg^Ag`m%zY;2S6l!z8w1; zLMw`*cusMbb6ubRTrs_&RMKzXht+;)5avqQsnqjLTIyM%iaoDrsm~KlD@Qb~ zoEEjyFFGV4^87;*B6vtb{-QHl;1CKNE9ZrRwn*NN+e{>{160W%1DXpH^vQJ`AG-Kk ziVAB6wV*Y^8>o>^ff|Xtx$rHdapTRc_2RAeO+?(xXi*DogYy|KLH0S#Da?R3NOD^1 zlHW+au!d}+8q&Uradiw@rk>Xe4jL`s?agKypqFV#iMb_r#>Zinw2`uRnn?7&^kYT037@Xdu>zLfbd zgKuswA)scp!2t+Wcd8<`zDU(EKC4_g@B-?USEw9$@v!^Yy}Ib}H-zJFtagt?ibwBv zkK8%Gq>Gj~g%aoO(?Utd9nES<7ibC>41DqEgDs}V?N_LY16_$Kuft$ZOPp zY_gu%uKQ1U))Vczzui@FqDyzLx#GkD9XY1bo;_c6>T>U)Zn}l;1#^`=#?lvH#Tc6r zq@4J7?oV-O3&7WZ+3yIQ z`!@=7?$6Qf-MZJK`{*;DmhhnYBGVyLLJ|;KA9ptMh2v5H}75NSfe)JqJ(v#Djj|q|Y3$ zS3dC-o(*0vI#9)8^1Luna3MISHNXafUN4u2SRTQP2QPnum(SoL6?(m}wG@tE^}@ka zoDXd3YzWd5%7aBuK3$a4;}c#`cN6*qF8`c*qSK@sK_OhRSFC6hD?mX{i`Ht|(uL zYykKzzb%~vu=44sh_yXk%JjnQJq|Uq!#f8q;xTJCsoBQbN?ChlvhL^ZKsuN^R^MHUxM)J04ib3V}n}P~b2&4EPcD5#R~z1mKD6L|_ps0-nT90uE=xfhV(* zfg{)m;3@1B;7B$Scq%&;IEsw|7PDgDY3wxMXf_&nIy)UWhK&J^Wn+Qk*f`*LHXb;E zO#n`06M>W1Bwz_E0ZwLmA3bAe~Gvw`QZbAa>MJm7pbA9yZ17r1~e0G`Lr11@9>f#JMfETa}fETh0ffuoh zfUDVRU^y!Xu3>9{7qg3j6|4ey3A+SX$tr`LHO>?+{L*vEiZv#WvEuxo(Z*>>O#wgY%AyB7Fy_Hp1& zwi9?AyAF6gyB_!n_6guFwhMRzy8(D3yAgO3y9xM7_DSH)>}KFC>=xjy>{j4y>^9)- z>~`QC><-|a>`vfa>@MKl>~7$v*r$N^uzP^_vU`D_W}gP$$L<4uhJ6P3S@v1r=h)|f zpJ$&3et~@fct5)z_(k?b-~;Rd;Fs8!fDf_4a@Rp4&68~8Q$ zHQ@iS{{cSC9tM7$eI57>_6^`S**AfYut$L3V&4Kj${q!Nn|&Mj9rhjIciDG=kFm#q z|I7Xt_&9qU_yl_b_#}H0_&xSL;2yRI_;4|zQ;1Agk zfzPsMfj?qD0zSu{1OAx(7`Tt^1O9~l1o%9A9{5xCQ{d0o&wxK?KL@_RUI6}r{Q}s; znt=P+e&8?JFM$Wx0bnz02ENE%1pbQs3V4tm1h%ji;7jZ!V2s6pFSD0{hu9(Dui3AG zudr8uud-Kxud&yFud~;IZ?HFjzhS=tzRBJM{+9g~_&fGH;9Kl1;P2V*frr^);2+o@ zfPZ9v1pbNr3HWFBXW(DhUx0sQe+9O(R^Z$0ZQv1h1bCDk1-`@H0sf8s4fuEVci=zR zKY;JDcY*(8{{;Sv{R{Yi?Eir8vG;)gX8#7h&)x_AhyAC}njhl$W0trI;VLAq!ng{H zs|;Lah^q*$BH}6&SDE4}3s+g?G4&i{>O5oW zd}Hdl#?%F-)HF>x)+VVfw7JDP)+Q;kO4FnUlirncW9ntb)TlAF(U`i$nEFv;>J`S+ ztsO|+X8i4y#?-5fsUI_@UTsXh#+bU@n7YH5daWrnO_M%u`gZws#?+n0)a#9@pD?EG zGN#^WOufmN`pFKY-faBsEymPajj6X8Q*Sq>-eF9=)0ldfG4*a!YMLe;Ym<}~yWHGj z9cz;mS*2;x9+TdcKV?k)zA^P_W9nXG>JN;mKQyL3YfSx72U4Fi{`SYl)P2U(pBPi0 zH>Up7nEEqg>d%d-FPKu(H0c+nZ+L-!^G4)kr>TAZ-*G;Kunsls9Qd;bCbBlGXO;TjFKD0hGDko%Fhsim) z_%N=l;#?laKRg3)n63_ss|a0X5@Zo%6XX!|0#wsik}vuVy+3+7;BISm@^fpseI+lX zo{zA0hZgS+#j<#1-P-!iyE9_p^_8)lX#J)wjkWc4v5eZaS48Q)MMXvLz_)76onF3z zSJu4s;FE7Yb<^)Y^@%sX_gMLg%IKv<)5_1T-%?dsUp~L4uBNfJx^&a}dS2VOVe`_h zjT`Fg${TB-8f!1Fso1=wv63D$wqa{**t*)rx|(RTV%?Uy>WaGhimJ-S z>J1gq+Pd|dYWN^Ln*O4F0NbrYdHrvlapR1eW;I0$kK&V5S&+blEZ_!Cl?6%3@mfyb zcDz=Tpv9{!G?|JAFBX~>8etWO7Z-T1{3^Ubl0 zO*M7J8N5GzCX0w3Y05jXDQ{9!WD*~YucW8~Q5W=A;=;QscvYEk;SmVL;?|tXf>WS4mDkV|UUo@t z-mz2%7%uTy0t8J5SP>`_#zd5 zbP`~@)smCDz4Yb2$L-2!$?0`#&J8(tjl5^f9b@hs_u!O=W;`(COS78#Px@6($=exL zzag*Xl_~#w|4_=4g18|aKEGJn5k)>#~IvMLnl0}*?^Uc-8e=GJmz0 zn?P^zZgzkgL>sn}Hi(O6&Q z{f6508)Advd8vrjY^tfI-lIa?>$rFiX7?!-n``STF0b4aOHZi0LL>~T+=K^ItliSE zskXYZu|}|t#*Rz&N)=UGD|k)ACS-au$jACbE74~qyT)j2p#8-LUSCyNRlBLSaqC<6 zeVSfBnU%PBVpgoT{XLP<{?RQB4V-$qk5=+JNE0GXN;26AY^#Y408M1D2EyU>)%ZHT z8OuwMjMmhw-3_B577@41Y}mTKa&0U;zce<0?q1IuYt~lO)-?*zL`9=3x=>Dy3a3_u zlbsOD;9Kg73-|>3U?RbIg6RZP3CE2nUO_DK(}Z5ln}z{r`;p7P^SKNxjz&c*xZTzp{U#ZA>)nzn8`P`#}sukhZr z2l9p=8am~M^WPjg^@j5g<@Rand(wg2;Sbh4wBd^z4vw6&f8?A4xpSK4U)WT>=D_?l z@+Xt%CndYif3x7Ydq&+c>WDRDz-eEf)k^=oGk8g*K0HeKad zBgeJ&qN`l%)CsM5bd^t^^`@&n*0|D8YhSwTXN{iL+MliptkchI9Y9wDt%>tPt%K-t zuvM}!)Os9U4iT5f(`BJGaZ2k@x*8@v{0Lp1V2vKvdLph`M_LmnKT`dz+}2a+^HJ7m zQ(KGa>NIQY#MaStb-KvF7`hy5jh`E89Y>ertx?6T6L7VCVQYz%+3yoeb}VU*40<)_z$1+9R#Fyful-!=A&#h=x;!Pi4h2K=u@5q!D8Q)X0 zch2`}_ZOb)n*9jADzZNu7phccmqezio#`;lc~O^>`OQE(ke=HSF1e*f!)~B?Ii9%z ze^Ih#;~B`*Y*@*3WL%hKP7B)^&srQG0#V-qt;nFpKSC`& zClP>+-AW~yWv<&)U#a0X+J&3!gcOQvar4dii=G4!6!%s(Eo1vJSJ6HybBtIoXf@O_`u*i&H zy~buRtIfM+v)ttG+x%`W%k%tQOtwsZ7yNo-a%V2#k(`*NLG{_C#4W}r!X5t zl{!o{_b`ouI924sqDKx1SBchga8eYI6kJnWi2&GqnQ7&qNQ7CnvQd{`t_5|I*v#VNWpPl^vawyk<*(=O%W3yMZ z4(K&&W$10I*U(k&%GVqD5z6;GE>z`{g}&NWyVbT$zTCF7@w3EBevgI5g_U<{($a60 z%I~p0&`Dd9SzlE{ms5l8cq#Yo=Sad^)(^k8Ym~gNyrSnp!}}|}UBP0$4!@O6B41B$ zsk0SLBCn+@sv~?O!6pLgr$qC|>*-21tfGok;O~@u^jbmw-txP z04rhL#0Ohx77wj**ue=05yIKLJRV)1jHAU9Hcsa}6Dit@Z`J<71+I32-ICF;-PskutCOL02a&~m24!|800z!k zbltu_!S*yOUUvRD+-EQTq$h3PfPK~ba`zW9*KAX(Dl9VU?A2`R9f4$EU{IQ3JP5hl ze3CvXL8=TlP4DQYxDlwk=j zRAz1tMwSJZ+0!z%fI0b|i*pn=V|=7V>MWIXcZPH{#_3m4dK&%NZI`U=N7YN=E4c4| z{6(ph5_V0B=P@ag%&@7j$u<@u$?Bn=0Id1O2%hy*s%rlLM%Q*V=U;$?c_TrZ7R+$b z0(Ed4A1-T~v9IE$E%=LG2M{XIRgT5hf!2AUMIq6cU?6K~Ol%)x6Y{85Iq4Nqyn0kY z#p}P*$H+3FDOrl9WT$x=Ww}29BK!)1v~oYoL%EYvL|^mC?)@G9qBjEK?O#{B7n5y^ zxg)XLmdAT&+af&_(wissUhB0WOIEzP%ge|LpyLCSE^lA}ts$8d@gNTMHL|cW6s;rb|ht zdmZ&9_YK_jJu10jqU7SP$Rt0HO;8L!_1^u+iu>Q`luUF)(k?Z0M3_w~e3H^4-w9cy z*S96!OG&j)-216V@R$s={Lx#KV(WU(WKvPgcCcL$ijY}VQQ|`bw26+vTxvsx5l<<8 zXd0oqnf$s@wZ0yZuOtrwJ!%hp_Esj@nX5s&*+qzqv}GQpxB7v1J7`VR(;{C>U(n*; zp{JyIKHHsl`a$4%pQO+G<9OD90P{`;aNv0_(dYe1JnOgs^DaE8LF>$9ectyV??VI3 zyKuJ#o%bpFyg!A!pBP}?g-bL z)AV_N7I_~XVBSaKe%{)dQWvv8*KLj0XZ|@nY#cH#9d>)Gy!Bhu4GHg*H(#-+#ngnt zS9~5Z)OT5KQE=PIB4;Jn}d)MtRT-52FVw+9UQ!FUyJ;fz1rKIx| zOLpW%olfkWe&YG(5=rtCFYW|Cu}Vx>rGl8=PdwFyn2VoSa(e;XW~V6K9@gTC7b%cX zx}d$plDFz57UcC_Vz+^lQmPs+v6KP%hv$(DM&Uy1BTfhewy~k0Z9mR2AF&+>2*O8f z>jQrt<>TTbKGUTFsADjPk60?e0o->HDZq6}1?WN#@wuS|A<>M$Lu}Bl50{6S!eWkj z>0&%Wjf$As!bPe7oZjl4!)}v-)B;Z(bj$L75x1q46W!?=_SDAOP0BIX@CV2>Oo6fj z#Wg%2c-OF~9TY2a@d}^sxjFPwUk>6yl~iAPh)+0CH{laDG|0BYg{%hE6(&O$`uM-y zpCx_5!nD~zg_-8vcME};e8RGwdkOcvjLI#=Biz20=R@WZj(0rLBa8)6nvN&M87zut zr?z+&xl}Vv@p!3cFXJIsP9YamTsVA#mbv2al{x<_a(;h+IUng+=CfQneqGn3xO-*R-^QaJMAlQBy`9oG zt&k3E7@P}<;#max?#a!MVmp163AE^QvD=Wc@5E8ucXukO5^o-CYRg@miOR%bdv73G zx-C2isv);Rta_GgG09Z0onTYeJB8=Dl%?W6^u(S9N8cp&!*LOJBbLzecI-Wn6oNUp zZVTZw+#uDWQpOa?c1}{yT&$FFlC_-2p!XOraAED@F*X(ZKat(Xh&Y8GlEi1s_C}gI zL{ain(n!;?eHKaC&p^y9WZ5YDoM{o;%h(G72;=8*1-O{5gh6IUov>hCs)Ce^-krSE zMKX#$Xxzyr0lkMDeV+t08W#xxwalBZorj#AVVa247dH^nqOI*xRRmiFggtD9plo`e zY=waB50YCB&_)O>8(Se{#ZQ0ov=u^*zwHgATDxrAkk5K2^96o=#8wD>8P)=0ov*9_ z1t|Y@RO-UI60P`pdb@!@s6#DX37yzTSGtA1wzBZQ(O2|Sk=+J->gdklW;Q9t`*_li zNHKQdBB2!V0GsKx)Ig$d8K;+KZPh)dy`-2HM-CnUvvXJTcjf zcKHfbZ>_f74n5gp+aWpm(T8iAc0(WwU%aS2lbY*eZ-oB%JsI5MCGRV*Xzd0xzkm&Z z<_}bQ&Ot%6oDK(?tUCXP47oU{FLvo<(;HIt6YrHN4844rDiaweUEQ*F>rCe3^Gyas zAT}o4qr#jL6K2I=Vh5FUn)ljmZo0-j>dC^6pg{jbg&H?BF~fOp$)R}{w6n=NguJ$= z6O&cT+$o987VHj8bZ2&@)OA?OeW`z;rU`$22r5hH~ZOaecP3XMtG?z6d$Xgb zSX_J#?I5eT#7$)L@vtyPgglp?n&u?;Lq}97*|h~jNAZ)J==1@L>|p7T2m&u1#e;65 z(+_m=gQX(|enFRx;#N1&DFB`R!P23ABkHb z_^7VXmU-uT>t(5n5zf6LT%?;9FfLLTSFMoop`>U3JR-06?7M9xVO!pIa3amGe*##I zCsuMrRY`{@3Afj;FWN-vwvrxh;nx?0^?v=cU5Z!n<9gtJ61Yzx?!)nD+ba|I>U)|e zVH+E#rIo52^pp80%2zry$*Z5nSy=3Xv)-#e--WY_SKqzJM}YPWhaw+>Pu~;e&h+U^ zk)-+bgAQ=E7Ra1U;xT#j6SBgX!Z3}@_M{#2=qn?qKs@@ks_-Hd zmy1V#p-YWX2eb~4zPnl!<2mP(TI`aIMOXUs?YZRUsf!;re?B#xS&H^#r#nD|E{G+0 z`sw87c~FB?@1wgG&}X;v%e>{HJ0zX&XG?c z&;g1ge;`zT9kSk`5U9gxDC*2eYC5l`JEwK3E(eXJY`)so)+6qW7 z79M8^WG zaC+DM8khb|Q*f%K=dUqaYg2$cydFW2VW}5g_0+AkbDPE0tWJgoTB6h$xoTxPjMHt`$u<7QTtV{~Qv9-iUDX z;@T#*8iLRqVObG>T$C>a=O>7B5gsO-*YO>^Th3kDw4Ckz7;Rm$(tYa^+kQC1!CLX% zE2sL!UD&!!_e8PV;@}IAt+*@_JA6oi=w12CU94HfecNu?EJh}tCfS^tlugR+-?oS_ zXWxs6#yUlWTgP9?Rlpi6Q>sXcOys;Ap(J`&f0>I+TwMKLRc0B)@*IifWaM6`3^s&` zZ;0+uB)0c|I_}`CE4uRul{cc4k`QEu07L=Ox)*&CWI!qmTV)NkoDm9zTgbj9Ul z!#G~@d);*&V!XE!$26p_2ymT28E{J(>~rx{DED=d`Xwa3>y)m%$wzaV}aa(F9XrBd8-L zg$OHGZ%m!zV&&R{6&boRg><&!X{AKB2$_wqM-W@>+gv*%q(d{59G$Mv1cwk3(HtoW zeKf~yy{F=VZ>LbMf>7p@P@J)x_%sHM~&Y|fmKms|xjFo)osB_BT_6ZBiG0INef0NrX9eHR*>wVzbhNex!Pvys5|ac;qHhk8X_D zI2tT-4`?@7$Ko{~pm>cqZ$QLrQdfj@yoq)Acx7eUL6u1#s@dS7GPM<|@m9TdArn!m zUOgmG)w|-5i>6)HAb< zPc8uD**Z!CVpXe@(2QpIOg~8m>te85q{~E!c!tI-U!|Yg1h|@ zOdRVVMop=UiySRcK!vA7TfA|jQwYA{k6U7Oj;`<=OIyTXFqoRBgju{1{5%MLJ8*)z zoz`|L@fB|b?+3xh11IQM0ux{fDuESm1Rnsw?*~p$<4iZz!PPD{na%=GA}Zb(J_v@- zfMH5JC2$iUJ;tq^VW7TXOfT#2hFoGg?V+5SOQQHZ?BdatYA*RkW`|Vh2fL zRK`h(*@tL&lopvNxQBI=>PxD$%!g^PUNC)fr)AnlYUDw3Vcf*^NDZZqW-7|(5UD7{bx1hkJARevQRL$Hq)fL-W$MZuzS7p}n7x3uL%#*tP1RJ{ ze9Bcga{ljfYDye0`8_fJn1<})C1w-TxL>@?^O$vWmD_uAhcNO}gUs$5p2yp%he>(# z!5=UF>Qrx*U)}i*GVw0y&fO4HvWf4m13v7g&fNdnP2FB(K2?EwN>eAN==+EXb?ZSN zjCKhdr1a{8(W|e6@&&m|n4_(x6VO~DL)%=s{q$y9{Un&W_ZYHep~Z@ZaFM8cUDj^@ zSFGz9+S_E(bgG^0X?>5|5-&}lp~J(IC!hocqz!Rn+i{Rcdz;2LpjxR-qq%RD4T`z1 z6uqq7uZmvQ?v-`@sB&NG_Z_eH9w?INW#y27PT6w=gj4JO?!-XA`^ujyU0MW9nFrq_ z?12&tB_+5Qk`f`s?mc|ORy*_H!>*~LknL2plZTLKy$3X8F%5@HDZMREi`&>u=X;XT zC%-1s(#=peyWUa(F&5v*v6FYDZbe z4?vWDGV(2wsyJB-Nd!Y(33U0Tz7N!AbOv?mRXdTo5(o23{drKI+Zohd7a|2y>Pm#n zFZG{+`hw1&F2ZJ=*TN~WGr!bd0QDuELEUw^QZS{iMAiIKZvyqQ&Y(^fe|zitW*0M6 zXY(lWHox3|3GU=;ON>quN3|snk+IE0v(ZCMxA0LD;dC?6Wu}92#eTvP{q8jw`z}d{w6YYA62@Z6H{|k@E~Jq-i>GxUy+92 z4(i;O0-|I<78UV<_$THztw9r7>ENK_EvUi6qy}Vz$T*5~ahAu%@Ix0&Q#(`{Ofz+; z>2Wk!*gGNP^upfi(gtV>Tea7M=z0Hu(*G`%ez!-_9Cgz?vakoZqae_9_egxNc7aYW zfQX`{+Re%7x204#vaFV9%gSv;rgJ9A0GdCu=+7ver%^aZ<5e@^Nt)ljs_9=;c(QYm z8~+os(H608%~&vMtwhB9asC%L|E4oI=XRP}E1@udoZkcI z!=1rdx3Vmla#mts{y4u6&VTI;&caogYQUK4v)k^>I(tP4e)%J9VF>d#kXA!q@{lIm zD{o$cPF=9@%8$T>)3$?qtBu2&vJtndu8BtD-P(C51{Zr}fs55`kEhfCpl*>_;z2c0 zo&nzP6YnBqSp>S02Q@8gVk`DuO$Rlt>iUD4!pK%!4B}W6eOPOSix`v;gAa*h;?WV5 zWZIT~$+L(Of`KY{5zJVJD##g{-i~LIl2}R#p$}ZStwMAOTzOZIYzQNdgki@)l|z|4 z3BopL)8n8tYjA8>5lGzf5p#sve<+g_lsL|z3UW^$uU_1?%4nie-sRN`@+u&CQTQ?* zH?C}2#`e!#acJh;y~`fI$euu$5FVTp1}(Bz(d47-)duC*DNKty9)proaHQ@SPGNFe z{H!`Q9DykBijxP$DI~?|jt%|f+OC9FVnaWJR`&FBn1r^7)>t2Va@!|IRg_c@n0Gzt z4LvC)J-H*Di-=u#?Z8nfB^ z`#Hp6w)O2M?ls&(ZQ`V9D_1bfmCmwZXk#_j2j>JPQHLw2D0ga$(rrGgrYO~F?YFZW zfU;dcW!ugB`Z=`8Z1dZdi`*ruHYxl1rEg-xMRZ7K(N)gFyV435FRRY3P$Dhh{%j`jZj}OIk?vYBeWogtZ&4n&4i|Q|ML}9#Y%tUC+ z1EewC5rdJde-i50lVUK`(0V>pNjALt@Qd47AgYF>dX&5>NC_0=TcjY}7<_RwS{^-< z$AT{(px{f_9;+mKY5g)Ex5?3Jb!sc_;L#Nlh8571>|EI30z$p9-~`<1CKqWH#vSfgpJ}R5eoKESiC^h_g5b!naX5 z=tC@SV;r3;M21+rwwGr?@G%HJCBWj4g4sgwDFqQ==@cm_u@$dUm<1`k3MudzxbPQQ z(G)aps4lh;6)u>9R)Q*CDVBoSn|>*JI5{amc1kqGE4#U1ci1mGDmpJ`Ck04R38Q$W zcn&E3#UDjarzZu-P6?fOWj7z}j{0Mly7ou<+Te3^tc3}Xq7pOlN^t=wz8g42$I_Po zDJsDduM`)8;=co@=ve6zAVnog;+5hePzF2R%zF)B|E4< z-u6^$S`N!R9+xDQ=V4MFeR#!fTPT6bzG4?OlwHZPC`*XCXNJMb={8v@yX;hr)`3>qiW#%(&URU~AiHj@qi&AyhvzgT zp+llQ*GFx9!$o1?iiyQ}Qx?%1YnAE-^+2EaWrkag{ONTRM8 z&O^G&rSng3s?|?|s(ouv`_7@-*K>AnbJTR~-exdtI>(fLoJ{E*T3gU!_Iihrc&y3>w8@?=ljt>GK(>`*-~xSIA4bE)o{^6iZJ zUWo#~gbMuLlmb80eFqRGRLnfSu&d#yG!<*#aYxd6rdb#+aU!?zn9e68<3#>VplTG# zMik1?crCOyXmhkwW}C#nh(!EI=Mf1;L`o3JzlhdBL=6xTUyFbv)?n=bUKlwV4-_;r9UDy8vQ}RkI%Rl)BkiVrf$h$5H3WmHAIS&cC>; zGswHH5(kRTEeKdIWE|#j!3Q{6t{@Gs+_VfCRcCr>=`G#J6} z5Xp1gH=2t-5AfRuMfHVOzM@-eDt?Vg47FQQJ3o!LyBOw@Z z_=P?;R^uWVm)MwJ*<1zLJVvr1y;mY*?UIZC$XNSNG7@qVCmK{y@se-D5#Ssnjt4G_RM?WS# z>ZVv&+RCM#6$_)L+WWahvgy``!Q4*IQ1vF&5${)Ru7%nhB(>?@Aef_pGk2nP19vP4 z_JIn5QDZznG|63Za*^!k^-G$zd2XD8uXa08?Ovs7*K?v@jw&8x^vi>t{5u*}?aZF8oHgbQ&Qd zT%E#N32ymieJjZJ^Uqo=t!?8pq5z9oiE8;Jd^-pa_D?vzE5ELosaiPKJp`lNN;u0e z>pQ`Em|xbZtCEa^|PyI z6D5LFX$!q$ITaO~D{Jd2Dn{kP9E;^tZK>VVSX&p3<gYY46-xQ<{K!A%6TFB89&;C6yL3CMfJ?;-d!!Dk3QM{qyEmk7Q> z@Ku7Z5j;%r4T47qzD@8L!Q%u^66_&(ieN9nGX&2PJV&sP;HLyH5bP&7K=2~LL4ubE zUM6^j;B|uE5d4@!sMbL{NpMZS+ zydOaU!9aq+1Vac435F4zKyVVl2!c}yiU~#&j3F3DFoB?iU@E~hf-?zb5X>SdC74Ta z4#9kag#?QUmJzHVSV?dJ!9@gX2reP0CRj(XfnX!SCW1PG1_DmdNN_p9R)VVtt|7RV zU?;)#1iJ`sBDjU%c7nSIK1FaZ!F>duCHOqS{R9sXJV@{m!Pf}BPVfl9qXgd}c#Pl) zf;|LJ6FfukEWvXG`v{&V_!+?q1Wg3LBzTdah2Uj^R|sAsc!S_g0y@-~|AFAo1g!)| z2;L$1JHfjI{~~yg;C%u*zf2tF#p(PiPUkjpI*f?Z!7`jq4dHa80jKTmIqi$iX>)E) zn^JSyubI<+#+l+%Wroc5yRvMVX6SL6sm5vA7N_Y;oTl+`n$E&$S_h};4V54 z!nvH{mYkw*oI)r3S^{#*aq`h{8oqNHHF6praT+afvYEVF?l(8|xIDm$1!9E+WE*5>-PTQ=3q*M(^TfJYl@?R?$u)XgagG*xW|F;h4HF!#sRd8fjC^Ym)Rwz_LF!o4RB-Fb#-zpx{ za_Z?Vrxv$Np58KfYRlv)EvJud88fzJd`Zj1DTMfc^yHRFXS7V1+%jh3J13qI`pA(+ z{9Xt8)A5Kkn`AjA`acp`n0PlzYd z=Mh3Y5r`-HK*$hzPViD$2wo?|Kj}^186IbsN!JD9^ITt;!b@c#c;Sh}t2ZH@2<(?h zh$jN^#P*?(3FNaVc_tyA2*eY8V4p63B1#bXOz=`! z2wp|;Px{bzM#R}=(e*&_dA=`9kz{8-QLrlrQ%wg`Af8SbAw)R>QI7OUZ$gwKeV$2( zas;9reIUvazv{{-CY}|~zsf@JLOCKo{rV819DxN{geXTK%Fzd=NYc*}kBaBM;|Zx0 z-p;oo`8RB9&N%*!NUxpqUy6)tj!cNrD&%jwOLvl5qQH%I0rE=!vua}$@d zn%oh(nl4WJ)60b4Mk#UKvoY@?ik+?jgIWj$Q zsbqUrbEGu!>CEQH?8K!)aanVOrTGM z>cr*B=Ewz!%S)OgRf)?r&5?@4WqEVt;>6{}&5=tIm-Wq&%MzE$&${5UvN=*M9&DG_ zg67D=L{?TcM=nfUu4s;|Ok672Ufmp7llb(a=16(sQlYrHIZ~hgGvyAQby?9IsT2>k zd41T*D<`3ci<%=#5+YWLoym$p=1k0^py)a*lxC_p>5}Vr2OLO+L9Q literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_adaptive_mutation.cpython-313.pyc b/tests/__pycache__/test_adaptive_mutation.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed10216a312e7ffe59fa13996b0fa18fcbb2e01c GIT binary patch literal 97063 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_gene_space.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_gene_space.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc81675f70f4909872160db0c8218818f9c9b1cb GIT binary patch literal 106981 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 H(s%uT1D{t9 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_gene_space_allow_duplicate_genes.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_gene_space_allow_duplicate_genes.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e376e5fdc3b4cec701e63b2d1e9abb6713619e0d GIT binary patch literal 81375 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

+E_b8*UTcqXtZ{^_J`i)a z%Q#~hF<38jtl@iMGww_D!_)o}d=|I(O6aQPMhrXdPRu-gBRn#PK;Wwh>~rktG(oR( zDSlD)J;E=+r$aNjDha3X#&}F6!=MuqMBEoV^h(b zw9cL@;mQA3WKYy{H1?$7VUo<9I2}n8f|tzP=>nuo^^Z3=xFWl%5-zZ56P}quX3D7N zS<_I@?Z7r6>bXk5_CZ@Nw&(&H*qWw=bT(cMEb=jA z>T5%HqAmjy#BMIr1u;>V(MUY3E(MNKmmxU@zwO`TwSOIGompG3zGxt3<`(Gn&ybn1 zZDI`?0X!%o`wr@H!;_@jeh^NPR~T3n4g7i~=k2&v9u~in?xIRqbXPV|Q21tiVLPSI zY6(3tOyh+q{T$AtBreU?nA&+e60@=gyd8Mrrl=H&VB{8CMiwrl*CBZ=u*heSi~mau z7t4mWV6zB1-JVsWWCKogAntehacF6&n? znse<^!;W5yG@bCepdrcns{&azzH90Uv*C1c>^`~(F=Zm?=WEnPS@L4q#rSh zH2l^!@qF3z+`LR2S@>(`@tl=QURdrp^aLvK;t}5_#xE84lnKn8%LUVR3(RdN`V9uh zaBa;qjmZCH;}_IHBpKaaBi&(MJ}o~K55?vxnV#qoLnSR-^p zd|pG(xATNj)j>Q(q}++m%LG?XIm>Tsd|tBTi!MP`wWa*TxxWQRcxTtrV+aDm6<}I0 zA#VJ)I``uQgxzo&|A2rH8>lzD`$W>ibx$5T0-C<>SW@O1sH(pmZVs>Nv$+N~ezWya zOvM*PuVCfKs&d(2EhVGb%hjZcy^$|TT&}<~fGg02XTy4c2;s0s9in`|D)pISf_RlW zQ?#j0z|LO~CV(LiH3azbY@Q=#We=-GbqH}SQ0McxmoUYpneA`4O1;)-ooh>MNI1O^ z1gq46jm)znLRWw~BVcGV8~qd*;tSlZoBewL6@G}Q@CP_+;(;b}fGHBb+XM_r@&RnL z0K*?^1n)T1d?t1RZvxCVi7oupgM?g8jNKr?PR&mYB!D{*XPX=_fFMS~Gz9D9Q=A&Y zKEQ$>BNqI|z=D(r=bcm#zzIh(7k0`70?ZMJdO|BcLfE*Y{2LzF0@?WB30&EfjOY!4 zh26gSLA4H>b?@T9!gP6N%B*`YX8M|IOmDlu!iib;9uru2I+08H$!upRISHI7Ha4_% z$2?j%1oqYyh;{&t*AO%=L$gGIn5FRE2n!IO)G!)mH$Evf8h!|uZ#5bc9pRgcU1De6 z>i`53)>J47;t&Gkb`g2uv^eI4(-O|uphC&lvUuiMF9Oqr_p!&Q@~oD?q~U9UDqq6P z8__%olxC{DT_oYetP+`7B;okw(SBv$R-)ru<&moT!(*dPOQQ||bN)6)HfJf^cWTJy zt8ch$GF~+zek(<;MmLpDn?X|?Wr)gW$_$#N(-<`Eq6{Tu&}@V#LkKb2tUGbUO=sjJ zin%VXahT-xfxqqE*0hSNOW<#PXgvh{n*pk0=*Mtznr%L-;lELetMljxTQ{pS@Ko{s zg;0uTBLcWm?WzE?k&Q|Xo_N;+e#Zx;|c( zS#Sp;&|gL&zkmc+w+}+r`_Vg6}j)-wXU*iBe9j?vw}zp41_n3jbEPF}!-s zv8h<#cw5{}IC%@*tt|f~F1ND0HSboI|7w?8S^isIZe>$4B6u7g1(#*(irAw-jS(?; zS#Jt40AMnK?Cin&$8zW{7 zp?LMW0xd5=&4i52-4ZmH1&6-~~^bkuK<9}+5 z7&3#4|146*dZF^kmuK=4BW0|XyR#srJ_v>b(lo<^Gt~pH+GUY|y`Nx}jSM@ykKGAu zw;pBp0(4Adce;_nQ&W6q9xObLL5i`cSP8i!KEPD58w{#W)8>ZTn<)HOH9C1$v8n;!-F*@yD;T{tl!KW{+f@T7_ub#cE1*xfopxoYCP zc8%+z$i~lqDWE4q{7L+b7k<7gyD3ePTwBdla_C%}n;3Fmq;YLGSIINlg%LRaUQcrl zwj7#I+@!hIfL6s+ot^IEEPUGia1xM3N$jBaS4^kwWiT@iI^q#k*>7?y@%r6Y?@pW9`iGj#He>YmnoBziYPe zx5EMc_!&xvR}8xV5Bm`hPeCFnc$oai;;8|}1&M@WPSG>M(~|w2;Npf31pDa(7gusA z^xkTC@jL>(`7zL2kb=-#Fb(J}q|jRgU*btL^p=Q&__7%&`fdlWQ97HP_GqfTvd!b> zbYhI_`sIB9qYuU4>FpP3JgIm}ow#QbX(HR+R&Rw-E`xQKfD{G7rg8Be4isa)+9!K&7l20P}0+MkgUqbSiNWOvO6(m1Ff*ua_7f61I zK$)loWqvCL^BA??E z9|{Zx{eHC_uW|zteAQg71rp8LJUHAtHW1vZ_CaCzlR~>e&6rB_cs$p=X&(7^Ig-co zi1a6UKa%o)B;~zQQvPt^PbylX_J32Q*%fOiq>`x`X=&5sk`qo`yip$Q6$P4rq)SLNjqxk*2|IU;Y> zliWEhj>wJr(YX=1!P-K7ME2=NnmdX<$C zc{NF1k#|JoUHZ`_5qYV8bVEemq#tdK$m{f@dm{2a{iwKIaoN=oxkYbbS43{pTcGD~ zRpxHT-4XeqUVuA?brE@kew4d#u7#$EyizZ)Eh6vGliam+MC8Nd==Ci9&d`Rg$lD|G zPQ40!_*dk;5&16tC~f|V%r(C$B5xrDuE^YJi`x~KT_2G*>MVR$L~b{q!&R9+(5o`N zf~)*FY>CL*^lJ3xUzO=qT$NiQ@>;z>TSNwq0D-y6U)!;Wd;*TXd+*c(8IoK>Q1(9o D?nAX( literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_gene_type.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_gene_type.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9dbbfcbf8c6b23d132dc8de03c82a1ac3095eca8 GIT binary patch literal 10028 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 F{x?es|9Joa literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_lifecycle_callbacks_calls.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_lifecycle_callbacks_calls.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c34e6b9b8931a4658bbd0f06528d381dbca6edd9 GIT binary patch literal 15111 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_number_fitness_function_calls.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_number_fitness_function_calls.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90dcc07bf36542fa5d9a6408026042991eb86758 GIT binary patch literal 46642 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 bJs98)B^M6`xB)o(d!1K~>lv<$Mm7HrMy)?a literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_save_solutions.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_save_solutions.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c782d2701d5700c575936242de2eef3d560ae2e GIT binary patch literal 204263 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_stop_criteria.cpython-313-pytest-9.0.1.pyc b/tests/__pycache__/test_stop_criteria.cpython-313-pytest-9.0.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28da12a6f5183bd59f1b9dc001177e0ba6a0a3bb GIT binary patch literal 9319 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 EKXHssIRF3v literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_stop_criteria.cpython-313.pyc b/tests/__pycache__/test_stop_criteria.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffb1bc319a6fbe4d463829b7a64e943b15cb3f90 GIT binary patch literal 9206 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 k1(ro_kHMQ6gwOe7aeho|J|5>MAp1k-lNpZib