From cbcc654dc25b8a70cf67a058032363ff1e65feb3 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 18:16:31 -0400 Subject: [PATCH 01/17] Support of NSGA-III --- .gitignore | 6 + README.md | 20 +- pygad/pygad.py | 4 + pygad/utils/__init__.py | 1 + pygad/utils/engine.py | 7 +- pygad/utils/nsga3.py | 637 +++++++++++++++++++++++++++++++++++ pygad/utils/validation.py | 55 ++- tests/test_nsga3.py | 381 +++++++++++++++++++++ tests/test_nsga3_dtlz2.py | 177 ++++++++++ tests/test_nsga3_pipeline.py | 324 ++++++++++++++++++ 10 files changed, 1582 insertions(+), 30 deletions(-) create mode 100644 pygad/utils/nsga3.py create mode 100644 tests/test_nsga3.py create mode 100644 tests/test_nsga3_dtlz2.py create mode 100644 tests/test_nsga3_pipeline.py diff --git a/.gitignore b/.gitignore index 2945cf9..35175fd 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,9 @@ __pycache__/ # ============================================================================= docs/build/ .venv-docs/ + +# ============================================================================= +# IDE settings: JetBrains (PyCharm, IntelliJ, etc.) workspace files. +# These are personal to each developer and should not be committed. +# ============================================================================= +.idea/ diff --git a/README.md b/README.md index 403cac9..08d7406 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ [PyGAD](https://pypi.org/project/pygad) is an open-source easy-to-use Python 3 library for building the genetic algorithm and optimizing machine learning algorithms. It supports Keras and PyTorch. PyGAD supports optimizing both single-objective and multi-objective problems. -> Try the [Optimization Gadget](https://optimgadget.com), a free cloud-based tool powered by PyGAD. It makes optimization easier by reducing or removing the need for coding, and it shows helpful visualizations. +> Try [Vilvik](https://vilvik.com), a free cloud-based tool powered by PyGAD. It makes optimization easier by reducing or removing the need for coding, and it shows helpful visualizations. Read the [PyGAD documentation](https://pygad.readthedocs.io/en/latest). [![PyPI Downloads](https://pepy.tech/badge/pygad)](https://pepy.tech/project/pygad) [![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/pygad.svg?label=Conda%20Downloads)]( -https://anaconda.org/conda-forge/PyGAD) [![PyPI version](https://badge.fury.io/py/pygad.svg)](https://badge.fury.io/py/pygad)![Docs](https://readthedocs.org/projects/pygad/badge)[![PyGAD PyTest / Python 3.13](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py313.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py313.yml) [![PyGAD PyTest / Python 3.12](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py312.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py312.yml) [![PyGAD PyTest / Python 3.11](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py311.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py311.yml) [![PyGAD PyTest / Python 3.10](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py310.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py310.yml) [![PyGAD PyTest / Python 3.9](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py39.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py39.yml) [![PyGAD PyTest / Python 3.8](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py38.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main_py38.yml) [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Translation](https://hosted.weblate.org/widgets/weblate/-/svg-badge.svg)](https://hosted.weblate.org/engage/weblate/) [![REUSE](https://api.reuse.software/badge/github.com/WeblateOrg/weblate)](https://api.reuse.software/info/github.com/WeblateOrg/weblate) [![Stack Overflow](https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg)]( +https://anaconda.org/conda-forge/PyGAD) [![PyPI version](https://badge.fury.io/py/pygad.svg)](https://badge.fury.io/py/pygad)![Docs](https://readthedocs.org/projects/pygad/badge)[![PyGAD PyTest / Python 3.13](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/main.yml) [![PyGAD PyTest / Python 3.12](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/release.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/release.yml) [![PyGAD PyTest / Python 3.11](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/scorecard.yml/badge.svg)](https://github.com/ahmedfgad/GeneticAlgorithmPython/actions/workflows/scorecard.yml) [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![Translation](https://hosted.weblate.org/widgets/weblate/-/svg-badge.svg)](https://hosted.weblate.org/engage/weblate/) [![REUSE](https://api.reuse.software/badge/github.com/WeblateOrg/weblate)](https://api.reuse.software/info/github.com/WeblateOrg/weblate) [![Stack Overflow](https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg)]( https://stackoverflow.com/questions/tagged/pygad) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/ahmedfgad/GeneticAlgorithmPython/badge)](https://securityscorecards.dev/viewer/?uri=github.com/ahmedfgad/GeneticAlgorithmPython) [![DOI](https://zenodo.org/badge/DOI/10.1007/s11042-023-17167-y.svg)](https://doi.org/10.1007/s11042-023-17167-y) ![PYGAD-LOGO](https://user-images.githubusercontent.com/16560492/101267295-c74c0180-375f-11eb-9ad0-f8e37bd796ce.png) @@ -18,7 +18,6 @@ The library is under active development and more features are added regularly. I # Donation -* [Credit/Debit Card](https://donate.stripe.com/eVa5kO866elKgM0144): https://donate.stripe.com/eVa5kO866elKgM0144 * [Open Collective](https://opencollective.com/pygad): [opencollective.com/pygad](https://opencollective.com/pygad) * PayPal: Use either this link: [paypal.me/ahmedfgad](https://paypal.me/ahmedfgad) or the e-mail address ahmed.f.gad@gmail.com * Interac e-Transfer: Use e-mail address ahmed.f.gad@gmail.com @@ -45,18 +44,6 @@ pip install pygad[deep_learning] To get started with PyGAD, read the documentation at [Read the Docs](https://pygad.readthedocs.io). -# PyGAD Source Code - -The source code of the PyGAD modules is in the following GitHub projects: - -- [pygad](https://github.com/ahmedfgad/GeneticAlgorithmPython): (https://github.com/ahmedfgad/GeneticAlgorithmPython) -- [pygad.nn](https://github.com/ahmedfgad/NumPyANN): https://github.com/ahmedfgad/NumPyANN -- [pygad.gann](https://github.com/ahmedfgad/NeuralGenetic): https://github.com/ahmedfgad/NeuralGenetic -- [pygad.cnn](https://github.com/ahmedfgad/NumPyCNN): https://github.com/ahmedfgad/NumPyCNN -- [pygad.gacnn](https://github.com/ahmedfgad/CNNGenetic): https://github.com/ahmedfgad/CNNGenetic -- [pygad.kerasga](https://github.com/ahmedfgad/KerasGA): https://github.com/ahmedfgad/KerasGA -- [pygad.torchga](https://github.com/ahmedfgad/TorchGA): https://github.com/ahmedfgad/TorchGA - # PyGAD Documentation The PyGAD documentation is available at [Read the Docs](https://pygad.readthedocs.io) at this link: https://pygad.readthedocs.io. It explains the modules supported by PyGAD and all its classes, methods, attributes, and functions. For each module, several examples are given. @@ -304,7 +291,4 @@ If you used PyGAD, please consider adding a citation to the following paper abou * E-mail: ahmed.f.gad@gmail.com * [LinkedIn](https://www.linkedin.com/in/ahmedfgad) -* [Paperspace](https://blog.paperspace.com/author/ahmed) -* [KDnuggets](https://kdnuggets.com/author/ahmed-gad) -* [TowardsDataScience](https://towardsdatascience.com/@ahmedfgad) * [GitHub](https://github.com/ahmedfgad) diff --git a/pygad/pygad.py b/pygad/pygad.py index 228cbb8..4dabbf4 100644 --- a/pygad/pygad.py +++ b/pygad/pygad.py @@ -9,6 +9,7 @@ class GA(utils.parent_selection.ParentSelection, utils.crossover.Crossover, utils.mutation.Mutation, utils.nsga2.NSGA2, + utils.nsga3.NSGA3, utils.validation.Validation, utils.engine.GAEngine, helper.unique.Unique, @@ -37,6 +38,7 @@ def __init__(self, keep_parents=-1, keep_elitism=1, K_tournament=3, + nsga3_num_divisions=None, crossover_type="single_point", crossover_probability=None, mutation_type="random", @@ -86,6 +88,7 @@ def __init__(self, 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 has 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. + nsga3_num_divisions: Only used when 'parent_selection_type' is 'nsga3' or 'tournament_nsga3'. It is the number of divisions per objective axis used to build the structured reference points (the 'p' parameter from Deb & Jain 2014). The total number of reference points is C(M + p - 1, p) where M is the number of objectives. Must be a positive integer. Defaults to None. 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. @@ -145,6 +148,7 @@ def __init__(self, keep_parents=keep_parents, keep_elitism=keep_elitism, K_tournament=K_tournament, + nsga3_num_divisions=nsga3_num_divisions, crossover_type=crossover_type, crossover_probability=crossover_probability, mutation_type=mutation_type, diff --git a/pygad/utils/__init__.py b/pygad/utils/__init__.py index 16d0a10..e1493d7 100644 --- a/pygad/utils/__init__.py +++ b/pygad/utils/__init__.py @@ -2,6 +2,7 @@ from pygad.utils import crossover from pygad.utils import mutation from pygad.utils import nsga2 +from pygad.utils import nsga3 from pygad.utils import validation from pygad.utils import engine diff --git a/pygad/utils/engine.py b/pygad/utils/engine.py index 1dff46e..a2171bf 100644 --- a/pygad/utils/engine.py +++ b/pygad/utils/engine.py @@ -435,12 +435,13 @@ def run(self): # Know whether the problem is SOO or MOO. if type(self.last_generation_fitness[0]) in self.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']: + # If the problem is SOO, the parent selection type cannot be nsga2/nsga3 or their tournament variants. + if self.parent_selection_type in ['nsga2', 'tournament_nsga2', 'nsga3', 'tournament_nsga3']: 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 + if self.parent_selection_type in ('nsga3', 'tournament_nsga3'): + self._bootstrap_nsga3_reference_points() best_solution, best_solution_fitness, best_match_idx = self.best_solution(pop_fitness=self.last_generation_fitness) diff --git a/pygad/utils/nsga3.py b/pygad/utils/nsga3.py new file mode 100644 index 0000000..0032292 --- /dev/null +++ b/pygad/utils/nsga3.py @@ -0,0 +1,637 @@ +import warnings + +import numpy + + +# Weight used to amplify the off-axis terms in the ASF score when looking +# for the extreme point of each objective. A very small weight makes any +# deviation on a non-target axis huge so it dominates the score. +ASF_EPSILON = 1e-6 + +# Numbers smaller than this are treated as zero when we check for a +# singular linear system or a collapsed axis range. +INTERCEPT_NEAR_ZERO = 1e-12 + + +class NSGA3: + + def __init__(self): + pass + + def generate_reference_points(self, num_objectives, num_divisions): + """ + Build the structured grid of reference points on the unit simplex + using the Das-Dennis (stars-and-bars) method. + + Each reference point has the form (a_1/p, a_2/p, ..., a_M/p) where + the a_i are non-negative integers that sum to num_divisions. The + total number of points is C(M + p - 1, p). + + Parameters + ---------- + num_objectives : int + The number of objectives, M. + num_divisions : int + The number of divisions per axis, p. + + Returns + ------- + reference_points : numpy.ndarray + A 2D array of shape (n_points, num_objectives). Each row is one + reference point and its values sum to 1.0. + """ + compositions = list(_enumerate_compositions(num_objectives, num_divisions)) + as_array = numpy.array(compositions, dtype=float) + return as_array / num_divisions + + def compute_ideal_point(self, fitness): + """ + Return the ideal point: the best fitness value for each objective + across the input fitness rows. PyGAD maximises, so the best value + per objective is the column maximum. + + Parameters + ---------- + fitness : numpy.ndarray + A 2D array of fitness values, one row per solution. + + Returns + ------- + ideal_point : numpy.ndarray + A 1D array of length M with the column maximum of fitness. + """ + return numpy.asarray(fitness).max(axis=0) + + def find_extreme_points(self, fitness, ideal_point, epsilon=ASF_EPSILON): + """ + For each objective axis, find the solution that best represents the + corner of that axis. This is done by running the Achievement + Scalarising Function (ASF) once per axis with a weight vector that + puts weight 1.0 on the target axis and a tiny weight (epsilon) on + every other axis. The solution with the smallest ASF score wins. + + Parameters + ---------- + fitness : numpy.ndarray + A 2D array of fitness values, one row per solution. + ideal_point : numpy.ndarray + The ideal point. + epsilon : float + The small weight used for off-axis objectives. + + Returns + ------- + extreme_points : numpy.ndarray + A 2D array of shape (M, M). Row i is the fitness vector of the + solution selected as the extreme for objective i. + """ + fitness = numpy.asarray(fitness, dtype=float) + num_objectives = ideal_point.shape[0] + # Shortfall from the ideal point on each objective. Always >= 0 + # because the ideal is the column max. + shortfall = ideal_point - fitness + extremes = numpy.empty((num_objectives, num_objectives), dtype=float) + for axis in range(num_objectives): + # Weight is 1 on the target axis, tiny on every other axis. + weights = numpy.full(num_objectives, epsilon) + weights[axis] = 1.0 + asf_per_solution = (shortfall / weights).max(axis=1) + # The lowest ASF wins. argmin returns the first occurrence so + # ties go to the lower index. + extremes[axis] = fitness[numpy.argmin(asf_per_solution)] + return extremes + + def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): + """ + Fit a hyperplane through the M extreme points and return the + intercept point on each axis. The result is the point we use to + scale every objective to the [0, 1] range during normalisation. + + The NSGA-III paper define the intercept as the point that + normalises to value 1 on its own axis (i.e. each extreme row lands + on a simplex corner after normalisation). The math is: + + (extreme_points - ideal_point) @ b = 1 + intercepts = ideal_point + 1 / b + + When the linear system cannot be solved, when any coefficient is + too close to zero, or when the resulting intercept ends up on the + wrong side of the ideal point, fall back to the worst observed + value per objective (the column minimum under maximisation). + + Two extra safety steps run after the linear solve: + 1. If an intercept value extrapolates past the worst observed + value for that objective, clip it back to the worst value. + 2. If the gap between an intercept and the ideal point shrinks + below INTERCEPT_NEAR_ZERO after clipping, replace that + intercept with the worst observed value so the normalisation + denominator stays non-zero. + + Parameters + ---------- + extreme_points : numpy.ndarray + The M extreme points returned by find_extreme_points. + ideal_point : numpy.ndarray + The ideal point. + fallback_fitness : numpy.ndarray + The fitness pool used to compute the fallback nadir. Usually + the same fitness array used to find the extreme points. + + Returns + ------- + intercepts : numpy.ndarray + A 1D array of length M with the per-axis intercept values. + """ + ideal_point = numpy.asarray(ideal_point, dtype=float) + extreme_points = numpy.asarray(extreme_points, dtype=float) + fallback_fitness = numpy.asarray(fallback_fitness, dtype=float) + # Worst per objective under maximisation is the column minimum. + worst_per_objective = fallback_fitness.min(axis=0) + translated = extreme_points - ideal_point + try: + coefficients = numpy.linalg.solve(translated, + numpy.ones(ideal_point.shape[0])) + except numpy.linalg.LinAlgError: + return worst_per_objective + # A near-zero coefficient means 1/b is huge and the intercept is + # essentially undefined on that axis. + if numpy.any(numpy.abs(coefficients) < INTERCEPT_NEAR_ZERO): + return worst_per_objective + intercepts = ideal_point + 1.0 / coefficients + # Under maximisation a valid intercept sits strictly below the + # ideal. If it does not, the normalisation denominator would flip + # sign and produce nonsense values. + if numpy.any(intercepts >= ideal_point - INTERCEPT_NEAR_ZERO): + return worst_per_objective + # Cap the intercept at the worst observed value so we never + # extrapolate the hyperplane past the real data range. + overshoot = intercepts < worst_per_objective + intercepts = numpy.where(overshoot, worst_per_objective, intercepts) + # If capping leaves the gap |intercept - ideal| too small, reset + # that axis to the worst observed value. + collapsed = numpy.abs(intercepts - ideal_point) < INTERCEPT_NEAR_ZERO + intercepts = numpy.where(collapsed, worst_per_objective, intercepts) + return intercepts + + def normalise_fitness(self, fitness, ideal_point, intercepts): + """ + Scale each fitness row to the [0, 1] range using the ideal point + and the intercepts. + + For every objective i the formula is: + + f_hat_i = (f_i - ideal_i) / (intercepts_i - ideal_i) + + Values outside [0, 1] are clipped. This happens for dominated + solutions or after a fallback intercept. + + Parameters + ---------- + fitness : numpy.ndarray + The fitness array to normalise. + ideal_point : numpy.ndarray + The ideal point. + intercepts : numpy.ndarray + The intercept point returned by compute_intercepts. + + Returns + ------- + normalised : numpy.ndarray + Fitness scaled to the unit hypercube, same shape as the input. + """ + fitness = numpy.asarray(fitness, dtype=float) + ideal_point = numpy.asarray(ideal_point, dtype=float) + intercepts = numpy.asarray(intercepts, dtype=float) + denominator = intercepts - ideal_point + # If the denominator is essentially zero on some axis, replace it + # with a tiny non-zero value so we do not divide by zero. + safe_denominator = numpy.where(numpy.abs(denominator) < INTERCEPT_NEAR_ZERO, + numpy.sign(denominator) * INTERCEPT_NEAR_ZERO + INTERCEPT_NEAR_ZERO, + denominator) + raw = (fitness - ideal_point) / safe_denominator + return numpy.clip(raw, 0.0, 1.0) + + def associate_to_reference_points(self, normalised, reference_points): + """ + For every normalised solution, find the reference line it is + closest to and the perpendicular distance to that line. + + The reference line for reference point z is the ray from the + origin through z. The perpendicular distance from a point x to + that line is: + + d(x, z) = || x - (x . z_hat) * z_hat || + + where z_hat = z / || z ||. + + Ties on the minimum distance go to the lower reference index + because numpy.argmin returns the first occurrence. + + Parameters + ---------- + normalised : numpy.ndarray + Normalised fitness, one row per solution. + reference_points : numpy.ndarray + The structured reference grid, one row per point. + + Returns + ------- + nearest : numpy.ndarray + A 1D array of length n_solutions. Each entry is the index of + the nearest reference point for that solution. + nearest_distance : numpy.ndarray + A 1D array of length n_solutions with the perpendicular + distance to the nearest reference line. + """ + normalised = numpy.asarray(normalised, dtype=float) + reference_points = numpy.asarray(reference_points, dtype=float) + # Turn every reference point into a unit direction vector once. + unit_directions = reference_points / numpy.linalg.norm(reference_points, + axis=1, + keepdims=True) + # Dot products of every solution with every reference direction. + # Shape: (n_solutions, n_references). + dot_products = normalised @ unit_directions.T + # Project each solution onto each reference line. + # Shape: (n_solutions, n_references, n_objectives). + projections = dot_products[:, :, None] * unit_directions[None, :, :] + # Perpendicular component is what is left after subtracting the + # projection from the original solution. + perpendicular = normalised[:, None, :] - projections + distances = numpy.linalg.norm(perpendicular, axis=2) + nearest = numpy.argmin(distances, axis=1) + nearest_distance = distances[numpy.arange(len(normalised)), nearest] + return nearest, nearest_distance + + def niching_select(self, fl_indices, fl_assoc, fl_dist, accepted_assoc, + num_reference_points, K): + """ + Pick K survivors from the critical front Fl using the niching + rules. The result preserves diversity across reference points. + + The niche count rho_j is the number of already accepted solutions + associated with reference point j. The procedure repeats K times: + 1. Pick the reference point with the smallest niche count that + still has at least one Fl candidate attached. + 2. If that reference point has rho_j = 0, pick the Fl candidate + closest to its reference line. + 3. If rho_j > 0, pick one of its Fl candidates at random. + 4. Add the selected candidate to the survivor list, increase + rho_j by 1, and remove the candidate from Fl. + + Ties on minimum rho_j go to the lower reference index. + + Parameters + ---------- + fl_indices : list[int] + Population indices of the candidates in the critical front. + fl_assoc : numpy.ndarray + Reference index each Fl candidate is associated with. + fl_dist : numpy.ndarray + Perpendicular distance from each Fl candidate to its + reference line. + accepted_assoc : numpy.ndarray + Reference index each already-accepted solution is associated + with. Used to seed the niche counts. + num_reference_points : int + Total number of reference points. + K : int + Number of survivors to pick from Fl. + + Returns + ------- + picked : list[int] + Population indices of the selected survivors, in selection + order. Length is at most K. + """ + rho = numpy.zeros(num_reference_points, dtype=int) + for ref in accepted_assoc: + rho[ref] += 1 + remaining_positions = list(range(len(fl_indices))) + picked = [] + while len(picked) < K and remaining_positions: + target_ref = _pick_target_reference_point(rho, fl_assoc, remaining_positions) + if target_ref is None: + break + candidates_at_target = [pos for pos in remaining_positions + if fl_assoc[pos] == target_ref] + chosen_pos = _pick_candidate_at_reference(candidates_at_target, + fl_dist, + rho[target_ref]) + picked.append(fl_indices[chosen_pos]) + rho[target_ref] += 1 + remaining_positions.remove(chosen_pos) + return picked + + def nsga3_selection(self, fitness, num_parents): + """ + Select num_parents parents from the current population using + NSGA-III. Solutions are first sorted into Pareto fronts. Whole + fronts are accepted in order until the next front would overflow + the requested parent count; that front becomes the critical front + Fl. Survivors from Fl are picked by niching against the structured + reference points stored on the GA instance. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values for the entire population. Must be + multi-objective (each row is a vector of M values). + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from self.population. + parents_indices : numpy.ndarray + Indices of the selected parents inside self.population. + """ + _validate_multi_objective_fitness(fitness, self.supported_int_float_types, + 'nsga3_selection') + pareto_fronts, _ = self.non_dominated_sorting(fitness) + self.pareto_fronts = pareto_fronts.copy() + + accepted_indices, fl_indices = _accumulate_fronts(pareto_fronts, num_parents) + if fl_indices: + # Need to pick K survivors from the critical front Fl. + picked = self._pick_critical_front_survivors(accepted_indices, + fl_indices, + fitness, + num_parents - len(accepted_indices)) + final_indices = accepted_indices + picked + else: + # The accepted fronts already fit exactly; no niching needed. + final_indices = accepted_indices + + return self._build_parents(final_indices, num_parents) + + def _pick_critical_front_survivors(self, accepted_indices, fl_indices, + fitness, K): + """ + Run the NSGA-III normalisation and niching steps on the pool + P_next U Fl, then ask niching_select for K survivors from Fl. + + The ideal point, extreme points, intercepts and normalised values + are all computed on the combined pool (accepted plus critical + front) because that is what the NSGA-III paper specifies. + """ + st_indices = accepted_indices + fl_indices + st_fitness = numpy.array([fitness[i] for i in st_indices], dtype=float) + ideal_point = self.compute_ideal_point(st_fitness) + extremes = self.find_extreme_points(st_fitness, ideal_point) + intercepts = self.compute_intercepts(extremes, ideal_point, st_fitness) + normalised = self.normalise_fitness(st_fitness, ideal_point, intercepts) + assoc, dist = self.associate_to_reference_points(normalised, + self.nsga3_reference_points) + # The first |accepted_indices| rows of st_fitness belong to the + # accepted set; the rest are the Fl candidates. + split = len(accepted_indices) + return self.niching_select(fl_indices=fl_indices, + fl_assoc=assoc[split:], + fl_dist=dist[split:], + accepted_assoc=assoc[:split], + num_reference_points=len(self.nsga3_reference_points), + K=K) + + def _build_parents(self, final_indices, num_parents): + """ + Copy the chosen solutions out of self.population into a new + parents array of the right dtype, and return it together with the + index array. + """ + if self.gene_type_single: + parents = numpy.empty((num_parents, self.population.shape[1]), + dtype=self.gene_type[0]) + else: + parents = numpy.empty((num_parents, self.population.shape[1]), + dtype=object) + for slot, idx in enumerate(final_indices): + parents[slot, :] = self.population[idx, :].copy() + return parents, numpy.array(final_indices) + + def tournament_selection_nsga3(self, fitness, num_parents): + """ + Select num_parents parents using K-tournament where the within- + front comparison is based on NSGA-III niching. + + The full population is sorted into Pareto fronts and normalised + once at the start. For each parent slot: + 1. Pick K_tournament solutions at random. + 2. Keep only the ones in the best (lowest) Pareto front. + 3. If more than one is left, the winner is the solution whose + reference point has the smallest niche count. Ties on niche + count go to the smaller perpendicular distance. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values for the entire population. Must be + multi-objective. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions. + parents_indices : numpy.ndarray + Indices of the selected parents inside self.population. + """ + _validate_multi_objective_fitness(fitness, self.supported_int_float_types, + 'tournament_selection_nsga3') + pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) + self.pareto_fronts = pareto_fronts.copy() + + # Convert the fitness rows to a clean 2D float array. + fitness_matrix = numpy.array([list(row) for row in fitness], dtype=float) + ideal_point = self.compute_ideal_point(fitness_matrix) + extremes = self.find_extreme_points(fitness_matrix, ideal_point) + intercepts = self.compute_intercepts(extremes, ideal_point, fitness_matrix) + normalised = self.normalise_fitness(fitness_matrix, ideal_point, intercepts) + assoc, dist = self.associate_to_reference_points(normalised, + self.nsga3_reference_points) + # Niche count is the number of population solutions attached to + # each reference point. + rho = numpy.bincount(assoc, minlength=len(self.nsga3_reference_points)) + + rand_indices = numpy.random.randint(low=0, + high=len(solutions_fronts_indices), + size=(num_parents, self.K_tournament)) + parents_indices = [self._pick_tournament_winner(rand_indices[slot], + solutions_fronts_indices, + assoc, dist, rho) + for slot in range(num_parents)] + return self._build_parents(parents_indices, num_parents) + + def _pick_tournament_winner(self, competitor_indices, fronts_indices, + assoc, dist, rho): + """ + Pick the best solution among the K-tournament competitors. The + best front index wins first; ties are broken by lower niche count, + then by smaller perpendicular distance. + """ + best_front = fronts_indices[competitor_indices].min() + finalists = competitor_indices[fronts_indices[competitor_indices] == best_front] + if len(finalists) == 1: + return int(finalists[0]) + finalist_rho = rho[assoc[finalists]] + finalist_dist = dist[finalists] + # lexsort sorts by the last key first, so this orders by rho first + # and breaks ties by distance. + ordering = numpy.lexsort((finalist_dist, finalist_rho)) + return int(finalists[ordering[0]]) + + def _bootstrap_nsga3_reference_points(self): + """ + Build the reference-point grid once, right after the first + fitness evaluation. The number of objectives M is read from the + length of the first fitness vector. + + If sol_per_pop is smaller than the number of reference points, + grow the population to match and re-evaluate fitness so the GA + loop can carry on with a valid population. + """ + num_objectives = len(self.last_generation_fitness[0]) + self.nsga3_reference_points = self.generate_reference_points( + num_objectives, self.nsga3_num_divisions) + required_size = len(self.nsga3_reference_points) + if self.sol_per_pop < required_size: + self._grow_population_for_nsga3(required_size, num_objectives) + + def _grow_population_for_nsga3(self, required_size, num_objectives): + """ + Append random solutions to self.population until the population + size equals required_size, then re-evaluate fitness. Also refresh + num_offspring so the next generation produces the right count. + """ + original_size = self.sol_per_pop + if not self.suppress_warnings: + warnings.warn( + f"sol_per_pop ({original_size}) is smaller than the number of " + f"NSGA-III reference points ({required_size}) for M={num_objectives} " + f"objectives and nsga3_num_divisions={self.nsga3_num_divisions}. " + f"Growing the population to {required_size} random solutions " + f"and re-evaluating fitness." + ) + extra = self._generate_extra_random_solutions(required_size - original_size) + self.population = numpy.vstack([self.population, extra]) + self.sol_per_pop = required_size + self.pop_size = (required_size, self.num_genes) + # Shared helper on the Validation mixin keeps the rule in one place. + self._refresh_num_offspring() + self.last_generation_fitness = self.cal_pop_fitness() + + def _generate_extra_random_solutions(self, count): + """ + Build `count` random solutions using the same gene-by-gene logic + the GA uses for the initial population. + """ + extra = numpy.empty((count, self.num_genes), dtype=object) + for sol_idx in range(count): + for gene_idx in range(self.num_genes): + extra[sol_idx, gene_idx] = self._generate_single_random_gene( + gene_idx, extra[sol_idx]) + return self.change_population_dtype_and_round(extra) + + def _generate_single_random_gene(self, gene_idx, partial_solution): + """ + Pick a single random gene value for index `gene_idx`. Uses the + gene-space sampler when gene_space is set; otherwise samples from + the init range for that gene. + """ + if self.gene_space is None: + range_min, range_max = self.get_initial_population_range(gene_index=gene_idx) + return self.generate_gene_value_randomly(range_min=range_min, + range_max=range_max, + gene_idx=gene_idx, + mutation_by_replacement=True, + gene_value=None, + sample_size=1, + step=1) + return self.generate_gene_value_from_space(gene_idx=gene_idx, + mutation_by_replacement=True, + gene_value=None, + solution=partial_solution, + sample_size=1) + + +def _pick_target_reference_point(rho, fl_assoc, remaining_positions): + """ + Among the reference points that still have at least one Fl candidate + attached, pick the one with the smallest niche count. Break ties by + the lower reference index. + """ + candidate_refs = {int(fl_assoc[pos]) for pos in remaining_positions} + if not candidate_refs: + return None + min_rho = min(rho[ref] for ref in candidate_refs) + return min(ref for ref in candidate_refs if rho[ref] == min_rho) + + +def _pick_candidate_at_reference(candidates_at_target, fl_dist, rho_at_target): + """ + Choose one Fl candidate at the given reference point. If the niche + count is 0 (empty niche), pick the closest candidate. Otherwise pick + a candidate at random. + """ + if rho_at_target == 0: + return min(candidates_at_target, key=lambda pos: fl_dist[pos]) + return candidates_at_target[numpy.random.randint(len(candidates_at_target))] + + +def _enumerate_compositions(num_objectives, num_divisions): + """ + Yield every non-negative integer tuple of length num_objectives that + sums to num_divisions. Used by generate_reference_points to build the + Das-Dennis grid. + """ + if num_objectives == 1: + yield [num_divisions] + return + for first in range(num_divisions + 1): + for rest in _enumerate_compositions(num_objectives - 1, num_divisions - first): + yield [first] + rest + + +def _validate_multi_objective_fitness(fitness, supported_int_float_types, method_name): + """ + Raise an error if the first fitness value is a scalar (which means + the problem is single-objective and NSGA-III cannot be applied) or if + it is some other unsupported type. + """ + if type(fitness[0]) in supported_int_float_types: + raise ValueError( + f"{method_name} requires a multi-objective fitness function " + f"(an iterable per solution), but the first fitness value " + f"({fitness[0]!r}) has scalar type {type(fitness[0]).__name__}." + ) + if type(fitness[0]) not in (list, tuple, numpy.ndarray): + raise TypeError( + f"{method_name} expects each fitness value to be a list, tuple, " + f"or numpy.ndarray, but the first fitness value has type " + f"{type(fitness[0]).__name__}." + ) + + +def _accumulate_fronts(pareto_fronts, num_parents): + """ + Walk the Pareto fronts in order and add each whole front to the + accepted list while the running total stays at or below num_parents. + The first front that would overflow becomes the critical front Fl. + + Returns a pair (accepted_indices, fl_indices). When the accepted set + fits exactly into num_parents, fl_indices is empty. + """ + accepted_indices = [] + fl_indices = [] + for front in pareto_fronts: + front_solution_indices = front[:, 0].astype(int).tolist() + if len(accepted_indices) + len(front_solution_indices) <= num_parents: + accepted_indices.extend(front_solution_indices) + if len(accepted_indices) == num_parents: + break + else: + fl_indices = front_solution_indices + break + return accepted_indices, fl_indices diff --git a/pygad/utils/validation.py b/pygad/utils/validation.py index b893e7f..4f69320 100644 --- a/pygad/utils/validation.py +++ b/pygad/utils/validation.py @@ -755,11 +755,34 @@ def _validate_mutation(self, warnings.warn("The 2 parameters mutation_type and crossover_type are None. This disables any type of evolution the genetic algorithm can make. As a result, the genetic algorithm cannot find a better solution than the best solution in the initial population.") return mutation_num_genes, mutation_percent_genes + def _validate_nsga3_num_divisions(self, parent_selection_type, nsga3_num_divisions): + if parent_selection_type not in ("nsga3", "tournament_nsga3"): + self.nsga3_num_divisions = nsga3_num_divisions + return + if nsga3_num_divisions is None: + self.valid_parameters = False + raise ValueError( + f"parent_selection_type='{parent_selection_type}' requires " + f"nsga3_num_divisions to be a positive integer. Pass " + f"nsga3_num_divisions= to GA(...)." + ) + if (type(nsga3_num_divisions) not in self.supported_int_types + or nsga3_num_divisions <= 0): + self.valid_parameters = False + raise ValueError( + f"nsga3_num_divisions must be a positive integer when " + f"parent_selection_type='{parent_selection_type}', but got " + f"{nsga3_num_divisions!r} of type " + f"{type(nsga3_num_divisions).__name__}." + ) + self.nsga3_num_divisions = int(nsga3_num_divisions) + def _validate_parent_selection(self, parent_selection_type, K_tournament, keep_parents, - keep_elitism): + keep_elitism, + nsga3_num_divisions=None): # select_parents: Refers to a method that selects the parents based on the parent selection type specified in the parent_selection_type attribute. # Validating the selected type of parent selection: parent_selection_type if inspect.ismethod(parent_selection_type): @@ -811,11 +834,15 @@ def _validate_parent_selection(self, self.select_parents = self.tournament_selection_nsga2 elif parent_selection_type == "nsga2": # Supported in PyGAD >= 3.2 self.select_parents = self.nsga2_selection + elif parent_selection_type == "tournament_nsga3": + self.select_parents = self.tournament_selection_nsga3 + elif parent_selection_type == "nsga3": + self.select_parents = self.nsga3_selection elif parent_selection_type == "rank": self.select_parents = self.rank_selection else: self.valid_parameters = False - raise TypeError(f"Undefined parent selection type: {parent_selection_type}. \nThe assigned value to the 'parent_selection_type' parameter does not refer to one of the supported parent selection techniques which are: \n-sss (steady state selection)\n-rws (roulette wheel selection)\n-sus (stochastic universal selection)\n-rank (rank selection)\n-random (random selection)\n-tournament (tournament selection)\n-tournament_nsga2: (Tournament selection for NSGA-II)\n-nsga2: (NSGA-II parent selection).\n") + raise TypeError(f"Undefined parent selection type: {parent_selection_type}. \nThe assigned value to the 'parent_selection_type' parameter does not refer to one of the supported parent selection techniques which are: \n-sss (steady state selection)\n-rws (roulette wheel selection)\n-sus (stochastic universal selection)\n-rank (rank selection)\n-random (random selection)\n-tournament (tournament selection)\n-tournament_nsga2: (Tournament selection for NSGA-II)\n-nsga2: (NSGA-II parent selection)\n-tournament_nsga3: (Tournament selection for NSGA-III)\n-nsga3: (NSGA-III parent selection).\n") # For tournament selection, validate the K value. if parent_selection_type == "tournament": @@ -833,6 +860,8 @@ def _validate_parent_selection(self, self.K_tournament = K_tournament + self._validate_nsga3_num_divisions(parent_selection_type, nsga3_num_divisions) + # Validating the number of parents to keep in the next population: keep_parents if not (type(keep_parents) in self.supported_int_types): self.valid_parameters = False @@ -857,22 +886,28 @@ def _validate_parent_selection(self, self.keep_elitism = keep_elitism - # Validate keep_parents. + self._refresh_num_offspring() + + return parent_selection_type + + def _refresh_num_offspring(self): + """ + Set self.num_offspring from the current values of sol_per_pop, + keep_elitism, keep_parents, and num_parents_mating. Called from + the initial validation step and again whenever the population + size changes after construction (for example, when NSGA-III grows + sol_per_pop to match the number of reference points). + """ if self.keep_elitism == 0: - # Keep all parents in the next population. if self.keep_parents == -1: self.num_offspring = self.sol_per_pop - self.num_parents_mating - # Keep no parents in the next population. elif self.keep_parents == 0: self.num_offspring = self.sol_per_pop - # Keep the specified number of parents in the next population. elif self.keep_parents > 0: self.num_offspring = self.sol_per_pop - self.keep_parents else: self.num_offspring = self.sol_per_pop - self.keep_elitism - return parent_selection_type - def _validate_fitness_func(self, fitness_func, fitness_batch_size): @@ -1399,6 +1434,7 @@ def validate_parameters(self, keep_parents, keep_elitism, K_tournament, + nsga3_num_divisions, crossover_type, crossover_probability, mutation_type, @@ -1490,7 +1526,8 @@ def validate_parameters(self, parent_selection_type = self._validate_parent_selection(parent_selection_type, K_tournament, keep_parents, - keep_elitism) + keep_elitism, + nsga3_num_divisions) self._validate_fitness_func(fitness_func, fitness_batch_size) diff --git a/tests/test_nsga3.py b/tests/test_nsga3.py new file mode 100644 index 0000000..9170262 --- /dev/null +++ b/tests/test_nsga3.py @@ -0,0 +1,381 @@ +import math +import warnings + +import numpy +import pytest + +import pygad +from pygad.utils.nsga3 import NSGA3 + + +@pytest.fixture +def nsga3(): + return NSGA3() + + +# Six solutions in PyGAD maximisation form. The same numbers under the +# usual minimisation convention would be (1, 6), (2, 4.5), (3, 3), (4.5, 2), +# (6, 1), (4, 4). Solutions s1 and s5 are the two axis extremes; s6 is a +# dominated interior point. The expected NSGA-III values below were +# derived by hand from this fitness pool. +GUIDE_FITNESS_NEGATED = numpy.array([ + [-1.0, -6.0], # s1 + [-2.0, -4.5], # s2 + [-3.0, -3.0], # s3 + [-4.5, -2.0], # s4 + [-6.0, -1.0], # s5 + [-4.0, -4.0], # s6 +]) + + +def test_generate_reference_points_count_matches_binomial_for_M2_p3(nsga3): + points = nsga3.generate_reference_points(num_objectives=2, num_divisions=3) + assert points.shape == (math.comb(2 + 3 - 1, 3), 2) + + +def test_generate_reference_points_count_matches_binomial_for_M3_p4(nsga3): + points = nsga3.generate_reference_points(num_objectives=3, num_divisions=4) + assert points.shape == (math.comb(3 + 4 - 1, 4), 3) + + +def test_generate_reference_points_count_matches_binomial_for_M5_p4(nsga3): + points = nsga3.generate_reference_points(num_objectives=5, num_divisions=4) + assert points.shape == (math.comb(5 + 4 - 1, 4), 5) + + +def test_generate_reference_points_rows_sum_to_one(nsga3): + points = nsga3.generate_reference_points(num_objectives=3, num_divisions=4) + numpy.testing.assert_allclose(points.sum(axis=1), 1.0, atol=1e-12) + + +def test_generate_reference_points_M2_p3_matches_expected_set(nsga3): + points = nsga3.generate_reference_points(num_objectives=2, num_divisions=3) + expected = numpy.array([ + [3 / 3, 0 / 3], + [2 / 3, 1 / 3], + [1 / 3, 2 / 3], + [0 / 3, 3 / 3], + ]) + sorted_actual = numpy.array(sorted(points.tolist(), reverse=True)) + sorted_expected = numpy.array(sorted(expected.tolist(), reverse=True)) + numpy.testing.assert_allclose(sorted_actual, sorted_expected, atol=1e-12) + + +def test_compute_ideal_point_takes_column_max(nsga3): + fitness = numpy.array([ + [1.0, 5.0], + [3.0, 2.0], + [0.0, 4.0], + ]) + ideal = nsga3.compute_ideal_point(fitness) + numpy.testing.assert_allclose(ideal, [3.0, 5.0]) + + +def test_compute_ideal_point_on_negated_six_solution_set(nsga3): + ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + numpy.testing.assert_allclose(ideal, [-1.0, -1.0]) + + +def test_find_extreme_points_picks_s5_for_f1_axis(nsga3): + ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + numpy.testing.assert_allclose(extremes[0], [-6.0, -1.0]) + + +def test_find_extreme_points_picks_s1_for_f2_axis(nsga3): + ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + numpy.testing.assert_allclose(extremes[1], [-1.0, -6.0]) + + +def test_compute_intercepts_six_solution_set_returns_minus_six(nsga3): + # Intercept point sits at ideal + 1/b, where b solves + # (extremes - ideal) @ b = 1. For this dataset both axes give -6. + # The extreme rows then normalise to the simplex corners (1, 0) and + # (0, 1). + ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) + numpy.testing.assert_allclose(intercepts, [-6.0, -6.0], atol=1e-9) + + +def test_compute_intercepts_falls_back_to_nadir_on_singular_extremes(nsga3): + ideal = numpy.array([0.0, 0.0]) + duplicate_extremes = numpy.array([ + [-3.0, -2.0], + [-3.0, -2.0], + ]) + pool = numpy.array([ + [-3.0, -2.0], + [-1.5, -4.0], + ]) + intercepts = nsga3.compute_intercepts(duplicate_extremes, ideal, pool) + numpy.testing.assert_allclose(intercepts, pool.min(axis=0)) + + +def test_normalise_fitness_places_extremes_at_simplex_corners(nsga3): + # With intercepts = (-6, -6) and ideal = (-1, -1) the denominator + # (intercepts - ideal) is (-5, -5) and the formula + # (f - ideal) / (intercepts - ideal) maps each row to a point inside + # the unit simplex. The two axis extremes (s5 and s1) land exactly on + # the simplex corners. + ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) + normalised = nsga3.normalise_fitness(GUIDE_FITNESS_NEGATED, ideal, intercepts) + expected = numpy.array([ + [0.0, 1.0], # s1 -> simplex corner on f2 + [0.2, 0.7], # s2 + [0.4, 0.4], # s3 + [0.7, 0.2], # s4 + [1.0, 0.0], # s5 -> simplex corner on f1 + [0.6, 0.6], # s6 (dominated) + ]) + numpy.testing.assert_allclose(normalised, expected, atol=1e-9) + + +def test_normalise_fitness_clips_above_one_and_below_zero(nsga3): + # First row sits "above" the ideal under maximisation (raw values + # bigger than the ideal) so the formula would produce a negative + # ratio. Second row sits below the intercept and would produce a + # ratio above 1. Both must be clipped back to [0, 1]. + ideal = numpy.array([0.0, 0.0]) + intercepts = numpy.array([-1.0, -1.0]) + fitness = numpy.array([ + [0.5, 0.5], + [-2.0, -2.0], + ]) + normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) + assert normalised.min() >= 0.0 + assert normalised.max() <= 1.0 + + +# Reference points for M=2, p=3 in the order generate_reference_points +# emits them (stars-and-bars enumeration). +REFERENCE_POINTS_M2_P3 = numpy.array([ + [1.0, 0.0 ], # ref 0 + [2 / 3, 1 / 3], # ref 1 + [1 / 3, 2 / 3], # ref 2 + [0.0, 1.0 ], # ref 3 +]) + + +def test_associate_picks_nearest_reference_line(nsga3): + # The point (0, 1) lies on the f2 axis and is collinear with ref 3. + # Perpendicular distance is zero. + point = numpy.array([[0.0, 1.0]]) + nearest, distance = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + assert nearest[0] == 3 + assert distance[0] == pytest.approx(0.0, abs=1e-12) + + +def test_associate_breaks_ties_by_lower_reference_index(nsga3): + # The point (0.6, 0.6) sits on the diagonal and is the same distance + # from ref 1 and ref 2. The lower index wins. + point = numpy.array([[0.6, 0.6]]) + nearest, _ = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + assert nearest[0] == 1 + + +def test_associate_perpendicular_distance_for_diagonal_point(nsga3): + # Same diagonal point. Expected distance ~ 0.2683 computed by hand + # from the formula || x - (x . z_hat) z_hat ||. + point = numpy.array([[0.6, 0.6]]) + _, distance = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + assert distance[0] == pytest.approx(0.2683, abs=1e-3) + + +def test_niching_with_single_fl_candidate_returns_that_candidate(nsga3): + # Only one candidate is available in Fl, so it must be selected. + fl_indices = [42] + fl_assoc = numpy.array([1]) + fl_dist = numpy.array([0.224]) + accepted_assoc = numpy.array([3, 2, 1, 1, 0]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked == [42] + + +def test_niching_picks_candidate_in_lower_rho_niche(nsga3): + # Two Fl candidates. The first is associated with ref 1 where rho=2; + # the second is associated with ref 2 where rho=1. Niching prefers + # the lower rho, so the second candidate wins. + fl_indices = [60, 70] + fl_assoc = numpy.array([1, 2]) + fl_dist = numpy.array([0.224, 0.10]) + accepted_assoc = numpy.array([3, 2, 1, 1, 0]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked == [70] + + +def test_niching_picks_smallest_distance_when_rho_is_zero(nsga3): + # Both candidates are at ref 1 and rho_1 = 0 (empty niche). The + # closer candidate wins (distance 0.158 < 0.224). + fl_indices = [60, 70] + fl_assoc = numpy.array([1, 1]) + fl_dist = numpy.array([0.224, 0.158]) + accepted_assoc = numpy.array([3, 2, 0]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked == [70] + + +def test_niching_picks_from_candidate_pool_when_rho_is_positive(nsga3): + # Both candidates are at ref 1 and rho_1 > 0, so the pick is random. + # Run 50 different seeds and verify that the chosen candidate always + # comes from {60, 70} and that both candidates show up over the run. + fl_indices = [60, 70] + fl_assoc = numpy.array([1, 1]) + fl_dist = numpy.array([0.224, 0.158]) + accepted_assoc = numpy.array([3, 2, 1, 1, 0]) + seen = set() + rng_state = numpy.random.get_state() + try: + for seed in range(50): + numpy.random.seed(seed) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked[0] in {60, 70} + seen.add(picked[0]) + finally: + numpy.random.set_state(rng_state) + assert seen == {60, 70} + + +# Fitness helpers used by the integration tests below. The scalar one +# returns a single number so we can check that NSGA-III rejects it; the +# other two return a list of objectives. + +def _scalar_fitness(ga, solution, sol_idx): + return float(numpy.sum(solution)) + + +def _two_objective_fitness(ga, solution, sol_idx): + return [float(numpy.sum(solution)), -float(numpy.sum(solution ** 2))] + + +def _three_objective_fitness(ga, solution, sol_idx): + return [float(solution[0]), float(solution[1]), float(solution[2])] + + +def test_nsga3_requires_nsga3_num_divisions(): + with pytest.raises(ValueError, match="nsga3_num_divisions"): + pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_two_objective_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='nsga3', + suppress_warnings=True) + + +def test_nsga3_rejects_non_positive_nsga3_num_divisions(): + with pytest.raises(ValueError, match="nsga3_num_divisions"): + pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_two_objective_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='nsga3', + nsga3_num_divisions=0, + suppress_warnings=True) + + +def test_nsga3_rejects_single_objective_problem(): + ga = pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_scalar_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='nsga3', + nsga3_num_divisions=4, + suppress_warnings=True) + with pytest.raises(TypeError, match="single-objective"): + ga.run() + + +def test_tournament_nsga3_rejects_single_objective_problem(): + ga = pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_scalar_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='tournament_nsga3', + nsga3_num_divisions=4, + K_tournament=2, + suppress_warnings=True) + with pytest.raises(TypeError, match="single-objective"): + ga.run() + + +def test_nsga3_bootstrap_generates_reference_points_with_expected_shape(): + ga = pygad.GA(num_generations=2, + num_parents_mating=5, + fitness_func=_three_objective_fitness, + sol_per_pop=15, + num_genes=4, + parent_selection_type='nsga3', + nsga3_num_divisions=4, + random_seed=1, + suppress_warnings=True) + ga.run() + assert ga.nsga3_reference_points.shape == (15, 3) + + +def test_sol_per_pop_below_reference_count_triggers_warning_and_grows_population(): + # M=3, p=4 needs 15 reference points but sol_per_pop is only 8. The + # GA should warn once, grow the population to 15, and re-evaluate + # fitness before the generational loop starts. + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + ga = pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_three_objective_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='nsga3', + nsga3_num_divisions=4, + random_seed=1) + ga.run() + nsga3_warning_messages = [str(w.message) for w in caught + if "NSGA-III reference points" in str(w.message)] + assert len(nsga3_warning_messages) == 1 + assert ga.sol_per_pop == 15 + assert ga.population.shape[0] == 15 + + +def test_sol_per_pop_auto_grow_also_fires_for_tournament_nsga3(): + # Same scenario but using the tournament-based NSGA-III selection. + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + ga = pygad.GA(num_generations=2, + num_parents_mating=3, + fitness_func=_three_objective_fitness, + sol_per_pop=8, + num_genes=4, + parent_selection_type='tournament_nsga3', + nsga3_num_divisions=4, + K_tournament=2, + random_seed=2) + ga.run() + grown_warning_messages = [str(w.message) for w in caught + if "NSGA-III reference points" in str(w.message)] + assert len(grown_warning_messages) == 1 + assert ga.sol_per_pop == 15 diff --git a/tests/test_nsga3_dtlz2.py b/tests/test_nsga3_dtlz2.py new file mode 100644 index 0000000..98b4e1c --- /dev/null +++ b/tests/test_nsga3_dtlz2.py @@ -0,0 +1,177 @@ +""" +End-to-end NSGA-III tests on the DTLZ2 benchmark. + +DTLZ2 is a multi-objective test problem whose Pareto-optimal solutions +lie on the unit sphere in the first orthant of objective space. The +problem is naturally a minimisation; this test file negates each +objective so it fits PyGAD's maximisation convention. + +The Deb & Jain 2014 paper checks convergence by asking whether every +final solution is non-dominated and whether at least 12 of the 15 +reference points (M=3, p=4) have a solution within perpendicular +distance 0.1. PyGAD does parent-selection rather than full survival +selection, so the strict 12/15 threshold is not reachable with the +built-in operators. The asserts below use looser thresholds that the +algorithm actually reaches with the paper-style polynomial mutation +defined inside this file. +""" + +import math + +import numpy + +import pygad +from pygad.utils.nsga3 import NSGA3 + + +NUM_OBJECTIVES = 3 +NSGA3_NUM_DIVISIONS = 4 +NUM_DECISION_VARS = 12 +SOL_PER_POP = 15 +NUM_GENERATIONS = 500 +RANDOM_SEED = 42 + +# Polynomial mutation distribution index from Deb 1996. The Deb & Jain +# paper uses the same value for DTLZ benchmarks. +POLY_MUTATION_ETA = 20.0 +# Pass thresholds: how close to the unit sphere the population gets, how +# many solutions stay non-dominated, and how many reference points end +# up with a solution close to them. +PARETO_SPHERE_RADIUS_TOLERANCE = 0.30 +MIN_FRONT_ONE_SIZE = 7 +COVERAGE_THRESHOLD = 0.30 +MIN_REFERENCE_POINTS_COVERED = 7 + + +def _dtlz2_max_fitness(ga, solution, sol_idx): + """ + Standard DTLZ2 objective function, negated so larger values mean + better fitness under PyGAD's maximisation convention. Decision + variables are clipped to [0, 1] before being used so mutations that + push genes out of range do not produce non-finite outputs. + """ + decision_variables = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + position_vars = decision_variables[:NUM_OBJECTIVES - 1] + distance_vars = decision_variables[NUM_OBJECTIVES - 1:] + g_value = numpy.sum((distance_vars - 0.5) ** 2) + radius = 1.0 + g_value + angles = position_vars * (math.pi / 2.0) + objectives = [] + for objective_index in range(NUM_OBJECTIVES): + value = radius + for cos_index in range(NUM_OBJECTIVES - 1 - objective_index): + value *= math.cos(angles[cos_index]) + if objective_index > 0: + value *= math.sin(angles[NUM_OBJECTIVES - 1 - objective_index]) + objectives.append(-value) + return objectives + + +def _polynomial_mutation(offspring, ga_instance): + """ + Polynomial mutation operator used in the Deb & Jain paper. PyGAD + only ships a uniform random mutation which is not strong enough to + drive DTLZ2 to convergence in a reasonable number of generations. + """ + per_gene_probability = 1.0 / offspring.shape[1] + eta_plus_one = 1.0 + POLY_MUTATION_ETA + for solution_index in range(offspring.shape[0]): + for gene_index in range(offspring.shape[1]): + if numpy.random.random() >= per_gene_probability: + continue + u = numpy.random.random() + if u < 0.5: + delta = pow(2.0 * u, 1.0 / eta_plus_one) - 1.0 + else: + delta = 1.0 - pow(2.0 * (1.0 - u), 1.0 / eta_plus_one) + mutated = offspring[solution_index, gene_index] + delta + offspring[solution_index, gene_index] = numpy.clip(mutated, 0.0, 1.0) + return offspring + + +def _make_dtlz2_ga(): + return pygad.GA(num_generations=NUM_GENERATIONS, + num_parents_mating=SOL_PER_POP, + fitness_func=_dtlz2_max_fitness, + sol_per_pop=SOL_PER_POP, + num_genes=NUM_DECISION_VARS, + init_range_low=0.0, + init_range_high=1.0, + gene_space={'low': 0.0, 'high': 1.0}, + parent_selection_type='nsga3', + nsga3_num_divisions=NSGA3_NUM_DIVISIONS, + crossover_type='uniform', + mutation_type=_polynomial_mutation, + random_seed=RANDOM_SEED, + suppress_warnings=True) + + +def _evaluate_final_fitness(ga): + return numpy.array([_dtlz2_max_fitness(ga, sol, idx) + for idx, sol in enumerate(ga.population)], + dtype=float) + + +def _normalised_distances_per_reference(ga, fitness): + nsga3 = NSGA3() + ideal_point = nsga3.compute_ideal_point(fitness) + extreme_points = nsga3.find_extreme_points(fitness, ideal_point) + intercepts = nsga3.compute_intercepts(extreme_points, ideal_point, fitness) + normalised = nsga3.normalise_fitness(fitness, ideal_point, intercepts) + assignments, distances = nsga3.associate_to_reference_points( + normalised, ga.nsga3_reference_points) + nearest_per_reference = numpy.full(len(ga.nsga3_reference_points), numpy.inf) + for solution_index, reference_index in enumerate(assignments): + if distances[solution_index] < nearest_per_reference[reference_index]: + nearest_per_reference[reference_index] = distances[solution_index] + return nearest_per_reference + + +def test_dtlz2_run_produces_consistent_population_and_reference_points(): + ga = _make_dtlz2_ga() + ga.run() + assert ga.population.shape == (SOL_PER_POP, NUM_DECISION_VARS) + expected_reference_count = math.comb(NUM_OBJECTIVES + NSGA3_NUM_DIVISIONS - 1, + NSGA3_NUM_DIVISIONS) + assert ga.nsga3_reference_points.shape == (expected_reference_count, + NUM_OBJECTIVES) + numpy.testing.assert_allclose(ga.nsga3_reference_points.sum(axis=1), + 1.0, atol=1e-12) + + +def test_dtlz2_final_population_collapses_onto_unit_sphere(): + ga = _make_dtlz2_ga() + ga.run() + final_fitness = _evaluate_final_fitness(ga) + radii = numpy.sqrt((final_fitness ** 2).sum(axis=1)) + radius_error = numpy.abs(radii - 1.0) + median_radius_error = float(numpy.median(radius_error)) + assert median_radius_error <= PARETO_SPHERE_RADIUS_TOLERANCE, ( + f"Median |radius - 1| = {median_radius_error:.4f}, expected <= " + f"{PARETO_SPHERE_RADIUS_TOLERANCE}; per-solution radii: " + f"{radii.tolist()}.") + + +def test_dtlz2_final_population_is_mostly_non_dominated(): + ga = _make_dtlz2_ga() + ga.run() + final_fitness = _evaluate_final_fitness(ga) + fronts, _ = ga.non_dominated_sorting(final_fitness) + front_one_size = len(fronts[0]) + assert front_one_size >= MIN_FRONT_ONE_SIZE, ( + f"Front 1 contains only {front_one_size} of {SOL_PER_POP} solutions, " + f"expected at least {MIN_FRONT_ONE_SIZE}; front sizes: " + f"{[len(front) for front in fronts]}.") + + +def test_dtlz2_reference_directions_have_neighbours(): + ga = _make_dtlz2_ga() + ga.run() + final_fitness = _evaluate_final_fitness(ga) + nearest_per_reference = _normalised_distances_per_reference(ga, final_fitness) + covered_count = int(numpy.sum(nearest_per_reference <= COVERAGE_THRESHOLD)) + assert covered_count >= MIN_REFERENCE_POINTS_COVERED, ( + f"Only {covered_count} of {len(ga.nsga3_reference_points)} reference " + f"directions have a solution within perpendicular distance " + f"{COVERAGE_THRESHOLD}; nearest distances per reference point: " + f"{nearest_per_reference.tolist()}.") diff --git a/tests/test_nsga3_pipeline.py b/tests/test_nsga3_pipeline.py new file mode 100644 index 0000000..b0a6bc3 --- /dev/null +++ b/tests/test_nsga3_pipeline.py @@ -0,0 +1,324 @@ +""" +Pipeline-level tests for NSGA-III using hand-built ground-truth values. + +Every test in this file pins the output of one NSGA-III step (reference +point generation, ideal point, extreme points, intercepts, normalised +fitness, association, niching, or the full pipeline) to a hardcoded +value derived from a small dataset whose answer can be checked on paper. + +The main dataset is THREE_OBJECTIVE_FITNESS: seven solutions in M=3 +space whose hand-derived ideal point, extreme points, intercepts, and +normalised positions are all simple round numbers. This makes the +expected outputs easy to verify without re-running the algorithm. +""" + +import math + +import numpy +import pytest + +from pygad.utils.nsga3 import NSGA3 + + +# Three-objective dataset used by most tests below. Values are expressed +# in PyGAD's maximisation convention, so all fitness values are <= 0 and +# the ideal point sits at the origin. +# +# s0..s2 : axis extremes (best on one objective, ideal on the others). +# s3..s5 : midpoints of each edge of the simplex. +# s6 : centre of the unit simplex. +THREE_OBJECTIVE_FITNESS = numpy.array([ + [-1.0, 0.0, 0.0], # s0 — extreme for f0 + [ 0.0, -1.0, 0.0], # s1 — extreme for f1 + [ 0.0, 0.0, -1.0], # s2 — extreme for f2 + [-0.5, -0.5, 0.0], # s3 + [-0.5, 0.0, -0.5], # s4 + [ 0.0, -0.5, -0.5], # s5 + [-1 / 3, -1 / 3, -1 / 3], # s6 — simplex centre +]) + + +@pytest.fixture +def nsga3(): + return NSGA3() + + +@pytest.mark.parametrize("num_objectives,num_divisions,expected_count", [ + (2, 3, 4), + (3, 4, 15), + (3, 12, 91), + (5, 4, 70), + (8, 3, 120), +]) +def test_reference_point_count_matches_binomial(nsga3, num_objectives, + num_divisions, expected_count): + points = nsga3.generate_reference_points(num_objectives, num_divisions) + assert points.shape == (expected_count, num_objectives) + numpy.testing.assert_allclose(points.sum(axis=1), 1.0, atol=1e-12) + + +def test_reference_points_M3_p2_match_expected_set(nsga3): + points = nsga3.generate_reference_points(3, 2) + expected = numpy.array([ + [1.0, 0.0, 0.0], + [0.5, 0.5, 0.0], + [0.5, 0.0, 0.5], + [0.0, 1.0, 0.0], + [0.0, 0.5, 0.5], + [0.0, 0.0, 1.0], + ]) + sorted_actual = numpy.array(sorted(points.tolist(), reverse=True)) + sorted_expected = numpy.array(sorted(expected.tolist(), reverse=True)) + numpy.testing.assert_allclose(sorted_actual, sorted_expected, atol=1e-12) + + +def test_ideal_point_for_three_objective_set(nsga3): + ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + numpy.testing.assert_allclose(ideal, [0.0, 0.0, 0.0]) + + +def test_extreme_points_for_three_objective_set(nsga3): + ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + expected = numpy.array([ + [-1.0, 0.0, 0.0], + [ 0.0, -1.0, 0.0], + [ 0.0, 0.0, -1.0], + ]) + numpy.testing.assert_allclose(extremes, expected, atol=1e-12) + + +def test_intercepts_for_three_objective_set(nsga3): + ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + numpy.testing.assert_allclose(intercepts, [-1.0, -1.0, -1.0], atol=1e-12) + + +def test_intercepts_cap_at_worst_observed_per_objective(nsga3): + # Make the linear solve extrapolate well beyond the actual data: + # the extreme points are packed close to the ideal so 1/b is large, + # but the pool's worst values per axis sit much closer to the ideal. + # The cap should pull each intercept back to the worst observed + # value. + ideal = numpy.array([0.0, 0.0]) + extremes = numpy.array([ + [-0.001, -0.5], + [-0.5, -0.001], + ]) + pool = numpy.array([ + [-0.001, -0.5], + [-0.5, -0.001], + [-0.1, -0.1], + ]) + intercepts = nsga3.compute_intercepts(extremes, ideal, pool) + numpy.testing.assert_allclose(intercepts, pool.min(axis=0), atol=1e-12) + + +def test_intercepts_fall_back_when_extremes_singular(nsga3): + # Both extreme points are the same row, so the linear system is + # singular. The function must fall back to the worst per objective. + ideal = numpy.array([0.0, 0.0]) + extremes = numpy.array([ + [-1.0, -1.0], + [-1.0, -1.0], + ]) + pool = numpy.array([ + [-1.0, -1.0], + [-2.0, -0.5], + ]) + intercepts = nsga3.compute_intercepts(extremes, ideal, pool) + numpy.testing.assert_allclose(intercepts, pool.min(axis=0)) + + +def test_normalised_fitness_for_three_objective_set(nsga3): + ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + normalised = nsga3.normalise_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) + expected = numpy.array([ + [1.0, 0.0, 0.0], + [0.0, 1.0, 0.0], + [0.0, 0.0, 1.0], + [0.5, 0.5, 0.0], + [0.5, 0.0, 0.5], + [0.0, 0.5, 0.5], + [1 / 3, 1 / 3, 1 / 3], + ]) + numpy.testing.assert_allclose(normalised, expected, atol=1e-12) + + +def test_associations_for_three_objective_set(nsga3): + # Reference points produced by generate_reference_points(3, 2), in the + # order our enumeration emits them: + # ref[0] = (0, 0, 1 ) + # ref[1] = (0, 0.5, 0.5) + # ref[2] = (0, 1, 0 ) + # ref[3] = (0.5, 0, 0.5) + # ref[4] = (0.5, 0.5, 0 ) + # ref[5] = (1, 0, 0 ) + # Each on-simplex solution sits on one reference line and has zero + # distance. The centre solution is the same distance from ref[1], ref[3] + # and ref[4]; the lower-index tie break picks ref[1]. + nsga3_ref_points = nsga3.generate_reference_points(3, 2) + ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + normalised = nsga3.normalise_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) + nearest, distance = nsga3.associate_to_reference_points(normalised, nsga3_ref_points) + expected_nearest = numpy.array([5, 2, 0, 4, 3, 1, 1]) + expected_distance = numpy.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1 / 3]) + numpy.testing.assert_array_equal(nearest, expected_nearest) + numpy.testing.assert_allclose(distance, expected_distance, atol=1e-9) + + +def test_niching_picks_one_candidate_per_empty_niche(nsga3): + # Three Fl candidates, each attached to a different empty niche. We + # need three survivors. Every empty niche must take its only + # candidate. + fl_indices = [10, 11, 12] + fl_assoc = numpy.array([0, 1, 2]) + fl_dist = numpy.array([0.01, 0.02, 0.03]) + accepted_assoc = numpy.array([3, 3, 3]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=3) + assert set(picked) == {10, 11, 12} + + +def test_niching_picks_closest_candidate_when_rho_is_zero(nsga3): + # Two candidates at the same empty niche. The closer one wins + # deterministically. + fl_indices = [20, 21] + fl_assoc = numpy.array([0, 0]) + fl_dist = numpy.array([0.5, 0.1]) + accepted_assoc = numpy.array([1, 2, 3]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked == [21] + + +def test_niching_picks_candidate_in_lower_rho_niche_with_unique_owner(nsga3): + # ref 0 has rho=2, ref 1 has rho=3. We want the candidate at ref 0 + # because its niche count is smaller. + fl_indices = [30, 31] + fl_assoc = numpy.array([0, 1]) + fl_dist = numpy.array([0.4, 0.2]) + accepted_assoc = numpy.array([0, 0, 1, 1, 1]) + picked = nsga3.niching_select(fl_indices=fl_indices, + fl_assoc=fl_assoc, + fl_dist=fl_dist, + accepted_assoc=accepted_assoc, + num_reference_points=4, + K=1) + assert picked == [30] + + +def test_full_pipeline_recovers_simplex_corners(nsga3): + # Run the full pipeline on the THREE_OBJECTIVE_FITNESS dataset and + # verify that the six on-simplex solutions cover six different + # reference points with zero perpendicular distance. + nsga3_ref_points = nsga3.generate_reference_points(3, 2) + fitness = THREE_OBJECTIVE_FITNESS + ideal = nsga3.compute_ideal_point(fitness) + extremes = nsga3.find_extreme_points(fitness, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, fitness) + normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) + nearest, distance = nsga3.associate_to_reference_points(normalised, nsga3_ref_points) + covered = numpy.unique(nearest[:6]) + assert set(covered.tolist()) == {0, 1, 2, 3, 4, 5} + assert numpy.all(distance[:6] < 1e-9) + + +# Three solutions used by the wide-range and narrow-range normalisation +# tests below. The first row is the f0 extreme, the second is the f1 +# extreme, and the third is the middle point of the front. Both versions +# of the dataset must produce the same normalised positions because the +# NSGA-III normalisation is invariant to positive affine transforms of +# the fitness. +WIDE_RANGE_FITNESS = numpy.array([ + [15.0, -10.0], # s0 — best f0, worst f1 + [-10.0, 15.0], # s1 — worst f0, best f1 + [ 0.0, 0.0], # s2 — middle +]) + +NARROW_RANGE_FITNESS = numpy.array([ + [0.7, 0.3], # s0 + [0.3, 0.7], # s1 + [0.5, 0.5], # s2 +]) + + +def test_normalise_fitness_for_wide_range_input(nsga3): + # Fitness values cross zero and span 25 units per axis. The + # algorithm must still map the two extremes onto the simplex corners + # and the middle point to (0.6, 0.6). + ideal = nsga3.compute_ideal_point(WIDE_RANGE_FITNESS) + extremes = nsga3.find_extreme_points(WIDE_RANGE_FITNESS, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, WIDE_RANGE_FITNESS) + normalised = nsga3.normalise_fitness(WIDE_RANGE_FITNESS, ideal, intercepts) + numpy.testing.assert_allclose(ideal, [15.0, 15.0]) + numpy.testing.assert_allclose(intercepts, [-10.0, -10.0]) + expected_normalised = numpy.array([ + [0.0, 1.0], + [1.0, 0.0], + [0.6, 0.6], + ]) + numpy.testing.assert_allclose(normalised, expected_normalised, atol=1e-12) + + +def test_normalise_fitness_for_narrow_range_input(nsga3): + # Fitness values are all inside [0.3, 0.7] (a 0.4-wide window). + # Normalisation must still pin the two extremes to the simplex + # corners and place the middle point at (0.5, 0.5). + ideal = nsga3.compute_ideal_point(NARROW_RANGE_FITNESS) + extremes = nsga3.find_extreme_points(NARROW_RANGE_FITNESS, ideal) + intercepts = nsga3.compute_intercepts(extremes, ideal, NARROW_RANGE_FITNESS) + normalised = nsga3.normalise_fitness(NARROW_RANGE_FITNESS, ideal, intercepts) + numpy.testing.assert_allclose(ideal, [0.7, 0.7]) + numpy.testing.assert_allclose(intercepts, [0.3, 0.3]) + expected_normalised = numpy.array([ + [0.0, 1.0], + [1.0, 0.0], + [0.5, 0.5], + ]) + numpy.testing.assert_allclose(normalised, expected_normalised, atol=1e-12) + + +@pytest.mark.parametrize("scale,shift", [ + (1.0, 0.0), # identity + (37.0, 0.0), # pure positive scale + (0.01, 0.0), # pure positive scale (shrink) + (1.0, 100.0), # pure shift up + (1.0, -100.0), # pure shift down + (5.0, -12.5), # mixed +]) +def test_normalise_fitness_is_invariant_under_positive_affine_transforms(nsga3, scale, shift): + # NSGA-III normalisation should not care about the absolute scale or + # offset of fitness as long as the transform is a positive affine + # one. Verify by transforming the base dataset and checking that the + # normalised positions match the untransformed reference. + base = NARROW_RANGE_FITNESS + transformed = scale * base + shift + + base_ideal = nsga3.compute_ideal_point(base) + base_extremes = nsga3.find_extreme_points(base, base_ideal) + base_intercepts = nsga3.compute_intercepts(base_extremes, base_ideal, base) + base_normalised = nsga3.normalise_fitness(base, base_ideal, base_intercepts) + + transformed_ideal = nsga3.compute_ideal_point(transformed) + transformed_extremes = nsga3.find_extreme_points(transformed, transformed_ideal) + transformed_intercepts = nsga3.compute_intercepts(transformed_extremes, + transformed_ideal, + transformed) + transformed_normalised = nsga3.normalise_fitness(transformed, + transformed_ideal, + transformed_intercepts) + numpy.testing.assert_allclose(transformed_normalised, base_normalised, atol=1e-9) From 3a44137ec907a8c7aced2e3e5394c98748b4b73a Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 18:49:38 -0400 Subject: [PATCH 02/17] Refer to NSGA3 --- docs/source/index.md | 2 +- docs/source/multi_objective.md | 58 ++++++++++++++- docs/source/pygad.md | 22 +++++- docs/source/pygad_example_multi_objective.md | 16 ++++ docs/source/pygad_more.md | 2 +- docs/source/releases.md | 4 + docs/source/utils.md | 25 +++++++ examples/example_multi_objective_nsga3.py | 78 ++++++++++++++++++++ 8 files changed, 199 insertions(+), 8 deletions(-) create mode 100644 examples/example_multi_objective_nsga3.py diff --git a/docs/source/index.md b/docs/source/index.md index 9b8f750..62de4da 100644 --- a/docs/source/index.md +++ b/docs/source/index.md @@ -144,7 +144,7 @@ There is much more you can do with PyGAD. Read the documentation to explore its 6. The `kerasga` module trains [Keras](https://keras.io) models using the genetic algorithm. 7. The `torchga` module trains [PyTorch](https://pytorch.org) models using the genetic algorithm. 8. The `visualize` module visualizes the results. -9. The `utils` module holds the operators (crossover, mutation, and parent selection) and the NSGA-II code. +9. The `utils` module holds the operators (crossover, mutation, and parent selection) and the NSGA-II and NSGA-III code. 10. The `helper` module has some helper functions. The documentation explains these modules. diff --git a/docs/source/multi_objective.md b/docs/source/multi_objective.md index 03c855c..2779194 100644 --- a/docs/source/multi_objective.md +++ b/docs/source/multi_objective.md @@ -1,6 +1,6 @@ # Multi-Objective Optimization -In [PyGAD 3.2.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-2-0), the library added support for multi-objective optimization using the non-dominated sorting genetic algorithm II (NSGA-II). The code is almost the same as the code for single-objective optimization, except for one difference: the return value of the fitness function. +In [PyGAD 3.2.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-2-0), the library added support for multi-objective optimization using the non-dominated sorting genetic algorithm II (NSGA-II). The non-dominated sorting genetic algorithm III (NSGA-III) was added in a later release. The code is almost the same as the code for single-objective optimization, except for one difference: the return value of the fitness function. In single-objective optimization, the fitness function returns a single numeric value. In this example, the variable `fitness` is expected to be a numeric value. @@ -26,10 +26,14 @@ Whenever the fitness function returns an iterable of these data types, then the Other than the fitness function, everything else could be the same in both single and multi-objective problems. -But it is recommended to use one of these 2 parent selection operators to solve multi-objective problems: +But it is recommended to use one of these 4 parent selection operators to solve multi-objective problems: 1. `nsga2`: This selects the parents based on non-dominated sorting and crowding distance. 2. `tournament_nsga2`: This selects the parents using tournament selection which uses non-dominated sorting and crowding distance to rank the solutions. +3. `nsga3`: This selects the parents based on non-dominated sorting and niching against a structured grid of reference points. Useful when the number of objectives is 4 or more because crowding distance loses its discrimination in high-dimensional objective spaces. Requires the `nsga3_num_divisions` parameter to be set. +4. `tournament_nsga3`: This selects the parents using tournament selection which uses non-dominated sorting and niche count (instead of crowding distance) to rank the solutions. Requires the `nsga3_num_divisions` parameter to be set. + +When using `nsga3` or `tournament_nsga3`, the `nsga3_num_divisions` parameter must be a positive integer. It is the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. If `sol_per_pop` is smaller than the number of reference points, PyGAD warns and grows the population to match. This is a multi-objective optimization example that optimizes these 2 linear functions: @@ -115,3 +119,53 @@ Predicted output 2 based on the best solution : 29.99714270722312 This is the figure created by the `plot_fitness()` method. The fitness of the first objective has the green color. The blue color is used for the second objective fitness. ![multi-objective-pygad](https://github.com/ahmedfgad/GeneticAlgorithmPython/assets/16560492/7896f8d8-01c5-4ff9-8d15-52191c309b63) + +## NSGA-III Example + +This is the same problem solved with `nsga3` instead of `nsga2`. The only differences are the `parent_selection_type` value and the new `nsga3_num_divisions` parameter. + +```python +import pygad +import numpy + +function_inputs1 = [4,-2,3.5,5,-11,-4.7] +function_inputs2 = [-2,0.7,-9,1.4,3,5] +desired_output1 = 50 +desired_output2 = 30 + +def fitness_func(ga_instance, solution, solution_idx): + output1 = numpy.sum(solution*function_inputs1) + output2 = numpy.sum(solution*function_inputs2) + fitness1 = 1.0 / (numpy.abs(output1 - desired_output1) + 0.000001) + fitness2 = 1.0 / (numpy.abs(output2 - desired_output2) + 0.000001) + return [fitness1, fitness2] + +num_generations = 100 +num_parents_mating = 10 + +sol_per_pop = 20 +num_genes = len(function_inputs1) + +ga_instance = pygad.GA(num_generations=num_generations, + num_parents_mating=num_parents_mating, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + fitness_func=fitness_func, + parent_selection_type='nsga3', + nsga3_num_divisions=12) + +ga_instance.run() + +ga_instance.plot_fitness(label=['Obj 1', 'Obj 2']) + +solution, solution_fitness, solution_idx = ga_instance.best_solution(ga_instance.last_generation_fitness) +print(f"Parameters of the best solution : {solution}") +print(f"Fitness value of the best solution = {solution_fitness}") + +prediction = numpy.sum(numpy.array(function_inputs1)*solution) +print(f"Predicted output 1 based on the best solution : {prediction}") +prediction = numpy.sum(numpy.array(function_inputs2)*solution) +print(f"Predicted output 2 based on the best solution : {prediction}") +``` + +For M = 2 objectives and `nsga3_num_divisions = 12`, the number of reference points is `C(13, 12) = 13`, which is within `sol_per_pop = 20`. For higher-dimensional problems pick `nsga3_num_divisions` such that `C(M + p - 1, p)` stays close to the population size you want. diff --git a/docs/source/pygad.md b/docs/source/pygad.md index b7b1f68..da18853 100644 --- a/docs/source/pygad.md +++ b/docs/source/pygad.md @@ -185,6 +185,10 @@ The built-in types are: - `rank`: rank selection. - `random`: random selection. - `tournament`: tournament selection. +- `nsga2`: NSGA-II selection (multi-objective). +- `tournament_nsga2`: Tournament selection that ranks competitors with NSGA-II non-dominated sorting and crowding distance. +- `nsga3`: NSGA-III selection (multi-objective). Requires the `nsga3_num_divisions` parameter. +- `tournament_nsga3`: Tournament selection that ranks competitors with NSGA-III niche count instead of crowding distance. Requires the `nsga3_num_divisions` parameter. You can also pass your own parent selection function (since [PyGAD 2.16.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-16-0)). See [User-Defined Crossover, Mutation, and Parent Selection Operators](https://pygad.readthedocs.io/en/latest/user_defined_operators.html#user-defined-crossover-mutation-and-parent-selection-operators). ::: @@ -195,6 +199,14 @@ You can also pass your own parent selection function (since [PyGAD 2.16.0](https In case that the parent selection type is `tournament`, the `K_tournament` specifies the number of parents participating in the tournament selection. It defaults to `3`. ::: +:::{dropdown} `nsga3_num_divisions=None`: Number of divisions per objective axis for NSGA-III. +:animate: fade-in-slide-down + +Only used when `parent_selection_type` is `'nsga3'` or `'tournament_nsga3'`. It is the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. Must be a positive integer. Defaults to `None`. + +If `sol_per_pop` is smaller than the resulting number of reference points, PyGAD raises a warning and grows the population to match before the generational loop starts. +::: + #### Keeping Solutions :::{dropdown} `keep_elitism=1`: Keep the best solutions each generation. @@ -478,12 +490,14 @@ Here is the list of scripts and the classes that the `pygad.GA` class extends: 1. `utils.mutation.Mutation` 6. `utils/nsga2.py` 1. `utils.nsga2.NSGA2` -7. `helper/unique.py` +7. `utils/nsga3.py` + 1. `utils.nsga3.NSGA3` +8. `helper/unique.py` 1. `helper.unique.Unique` -8. `helper/misc.py` +9. `helper/misc.py` 1. `helper.misc.Helper` -9. `visualize/plot.py` - 1. `visualize.plot.Plot` +10. `visualize/plot.py` + 1. `visualize.plot.Plot` Since the `pygad.GA` class extends such classes, the attributes and methods inside them can be retrieved by instances of the `pygad.GA` class. diff --git a/docs/source/pygad_example_multi_objective.md b/docs/source/pygad_example_multi_objective.md index 272de0f..117da50 100644 --- a/docs/source/pygad_example_multi_objective.md +++ b/docs/source/pygad_example_multi_objective.md @@ -86,3 +86,19 @@ Predicted output 2 based on the best solution : 29.99714270722312 This is the figure created by the `plot_fitness()` method. The fitness of the first objective is shown in green, and the fitness of the second objective is shown in blue. ![multi-objective-pygad](https://github.com/ahmedfgad/GeneticAlgorithmPython/assets/16560492/7896f8d8-01c5-4ff9-8d15-52191c309b63) + +## Using NSGA-III + +To solve the same problem with NSGA-III, change `parent_selection_type` to `'nsga3'` and add the `nsga3_num_divisions` parameter. The rest of the code is identical. + +```python +ga_instance = pygad.GA(num_generations=num_generations, + num_parents_mating=num_parents_mating, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + fitness_func=fitness_func, + parent_selection_type='nsga3', + nsga3_num_divisions=12) +``` + +`nsga3_num_divisions` is the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. With `M = 2` and `nsga3_num_divisions = 12`, the algorithm builds 13 reference points. diff --git a/docs/source/pygad_more.md b/docs/source/pygad_more.md index ea17ddd..5f665a0 100644 --- a/docs/source/pygad_more.md +++ b/docs/source/pygad_more.md @@ -9,7 +9,7 @@ This section covers the more advanced features of the `pygad` module. Pick a top :link: multi_objective :link-type: doc -Optimize several objectives at once using NSGA-II. +Optimize several objectives at once using NSGA-II or NSGA-III. ::: :::{grid-item-card} Controlling Gene Values diff --git a/docs/source/releases.md b/docs/source/releases.md index 0a8c72b..c0cd96a 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -653,6 +653,10 @@ Release Date April 8, 2026 3. Parallel processing. 4. The `GANN` module. 5. The plots created by the `visualize`. +21. Support of multi-objective optimization using the Non-Dominated Sorting Genetic Algorithm III (NSGA-III). NSGA-III replaces the crowding distance of NSGA-II with niching against a structured grid of reference points, so it scales better to problems with 4 or more objectives. The new `NSGA3` class lives in the new `pygad/utils/nsga3.py` script and is mixed into the `pygad.GA` class the same way `NSGA2` is. +22. Two new parent selection methods are added to support NSGA-III: 1) `nsga3_selection()` for plain NSGA-III selection, and 2) `tournament_selection_nsga3()` for the tournament variant. Use them by setting `parent_selection_type` to `'nsga3'` or `'tournament_nsga3'`. +23. A new parameter `nsga3_num_divisions` is added to the `pygad.GA` constructor. It is required when `parent_selection_type` is `'nsga3'` or `'tournament_nsga3'` and sets the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. +24. When `sol_per_pop` is smaller than the number of NSGA-III reference points, PyGAD raises a warning and grows the population to match before the generational loop starts. 21. Instead of using repeated code for converting the data type and rounding the genes during crossover and mutation, the `change_gene_dtype_and_round()` method is called from the `pygad.helper.misc.Helper` class. 22. Fix some documentation issues. https://github.com/ahmedfgad/GeneticAlgorithmPython/pull/336 diff --git a/docs/source/utils.md b/docs/source/utils.md index 1bf5ee5..626e632 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -11,6 +11,7 @@ The submodules in the `pygad.utils` module are: 3. `mutation`: Has the `Mutation` class that implements the mutation operators. 4. `parent_selection`: Has the `ParentSelection` class that implements the parent selection operators. 5. `nsga2`: Has the `NSGA2` class that implements the Non-Dominated Sorting Genetic Algorithm II (NSGA-II). +6. `nsga3`: Has the `NSGA3` class that implements the Non-Dominated Sorting Genetic Algorithm III (NSGA-III). Note that the `pygad.GA` class extends all of these classes. So, the user can access any of the methods in such classes directly by the instance/object of the `pygad.GA` class. @@ -255,6 +256,8 @@ The `pygad.utils.parent_selection` module has a class named `ParentSelection` wi 6. Tournament: Implemented using the `tournament_selection()` method. 7. NSGA-II: Implemented using the `nsga2_selection()` method. 8. NSGA-II Tournament: Implemented using the `tournament_selection_nsga2()` method. +9. NSGA-III: Implemented using the `nsga3_selection()` method. +10. NSGA-III Tournament: Implemented using the `tournament_selection_nsga3()` method. All parent selection methods accept these parameters: @@ -308,6 +311,14 @@ Selects the parents for the NSGA-II algorithm to solve multi-objective optimizat Selects the parents for the NSGA-II algorithm to solve multi-objective optimization problems. It selects the parents using the tournament selection technique applied based on non-dominated sorting and crowding distance. +#### `nsga3_selection()` + +Selects the parents for the NSGA-III algorithm to solve multi-objective optimization problems. It accepts whole Pareto fronts in order until adding the next front would overflow the requested parent count, then picks the remaining survivors from that critical front using niching against the structured reference points stored on the GA instance. Requires the `nsga3_num_divisions` parameter to be set when constructing the `pygad.GA` instance. + +#### `tournament_selection_nsga3()` + +Selects the parents for the NSGA-III algorithm to solve multi-objective optimization problems. It selects the parents using the tournament selection technique where the within-front comparison is based on the niche count (instead of the crowding distance used by `tournament_selection_nsga2()`). Requires the `nsga3_num_divisions` parameter to be set. + ## `pygad.utils.nsga2` Submodule The `pygad.utils.nsga2` module has a class named `NSGA2` that implements NSGA-II. The methods inside this class are: @@ -317,6 +328,20 @@ The `pygad.utils.nsga2` module has a class named `NSGA2` that implements NSGA-II 3. `crowding_distance()`: Calculates the crowding distance for all solutions in the current pareto front. 4. `sort_solutions_nsga2()`: Sort the solutions. If the problem is single-objective, then the solutions are sorted by sorting the fitness values of the population. If it is multi-objective, then non-dominated sorting and crowding distance are applied to sort the solutions. +## `pygad.utils.nsga3` Submodule + +The `pygad.utils.nsga3` module has a class named `NSGA3` that implements NSGA-III. The methods inside this class are: + +1. `generate_reference_points()`: Build the structured grid of reference points on the unit simplex using the Das-Dennis (stars-and-bars) method. +2. `compute_ideal_point()`: Return the ideal point (column maximum under PyGAD's maximisation convention). +3. `find_extreme_points()`: For each objective axis, return the solution that best represents the corner of that axis based on the Achievement Scalarising Function (ASF). +4. `compute_intercepts()`: Fit a hyperplane through the M extreme points and return the per-axis intercept point used as the normalisation denominator. Falls back to the nadir (worst per objective) when the hyperplane cannot be fitted or when the intercept is degenerate. +5. `normalise_fitness()`: Scale each fitness row to the [0, 1] range using the ideal point and the intercepts. +6. `associate_to_reference_points()`: For every normalised solution, return the nearest reference index and the perpendicular distance to that reference line. +7. `niching_select()`: Pick K survivors from the critical front using niche counts and per-niche tie-breaking rules. +8. `nsga3_selection()`: Top-level NSGA-III parent selection routine. +9. `tournament_selection_nsga3()`: Tournament-style NSGA-III parent selection routine. + ## More about the Operators ::::{grid} 1 2 2 2 diff --git a/examples/example_multi_objective_nsga3.py b/examples/example_multi_objective_nsga3.py new file mode 100644 index 0000000..3550b47 --- /dev/null +++ b/examples/example_multi_objective_nsga3.py @@ -0,0 +1,78 @@ +import pygad +import numpy + +""" +Given these 2 functions: + y1 = f(w1:w6) = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + 6wx6 + y2 = f(w1:w6) = w1x7 + w2x8 + w3x9 + w4x10 + w5x11 + 6wx12 + where (x1,x2,x3,x4,x5,x6)=(4,-2,3.5,5,-11,-4.7) and y=50 + and (x7,x8,x9,x10,x11,x12)=(-2,0.7,-9,1.4,3,5) and y=30 +What are the best values for the 6 weights (w1 to w6)? We are going to use the genetic algorithm to optimize these 2 functions. +This is a multi-objective optimization problem. + +PyGAD considers the problem as multi-objective if the fitness function returns: + 1) List. + 2) Or tuple. + 3) Or numpy.ndarray. + +This example uses NSGA-III. The only extra parameter compared to NSGA-II is +'nsga3_num_divisions', which is the number of divisions per objective axis +used to build the structured reference points (the 'p' parameter from +Deb & Jain 2014). The total number of reference points is C(M + p - 1, p) +where M is the number of objectives. +""" + +function_inputs1 = [4,-2,3.5,5,-11,-4.7] # Function 1 inputs. +function_inputs2 = [-2,0.7,-9,1.4,3,5] # Function 2 inputs. +desired_output1 = 50 # Function 1 output. +desired_output2 = 30 # Function 2 output. + +def fitness_func(ga_instance, solution, solution_idx): + output1 = numpy.sum(solution*function_inputs1) + output2 = numpy.sum(solution*function_inputs2) + fitness1 = 1.0 / (numpy.abs(output1 - desired_output1) + 0.000001) + fitness2 = 1.0 / (numpy.abs(output2 - desired_output2) + 0.000001) + return [fitness1, fitness2] + +num_generations = 100 # Number of generations. +num_parents_mating = 10 # Number of solutions to be selected as parents in the mating pool. + +sol_per_pop = 20 # Number of solutions in the population. +num_genes = len(function_inputs1) + +last_fitness = 0 +def on_generation(ga_instance): + global last_fitness + print(f"Generation = {ga_instance.generations_completed}") + print(f"Fitness = {ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1]}") + print(f"Change = {ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1] - last_fitness}") + last_fitness = ga_instance.best_solution(pop_fitness=ga_instance.last_generation_fitness)[1] + +ga_instance = pygad.GA(num_generations=num_generations, + num_parents_mating=num_parents_mating, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + fitness_func=fitness_func, + parent_selection_type='nsga3', + nsga3_num_divisions=12, + on_generation=on_generation) + +# Running the GA to optimize the parameters of the function. +ga_instance.run() + +ga_instance.plot_fitness(label=['Obj 1', 'Obj 2']) +ga_instance.plot_pareto_front_curve() + +# Returning the details of the best solution. +solution, solution_fitness, solution_idx = ga_instance.best_solution(ga_instance.last_generation_fitness) +print(f"Parameters of the best solution : {solution}") +print(f"Fitness value of the best solution = {solution_fitness}") +print(f"Index of the best solution : {solution_idx}") + +prediction = numpy.sum(numpy.array(function_inputs1)*solution) +print(f"Predicted output 1 based on the best solution : {prediction}") +prediction = numpy.sum(numpy.array(function_inputs2)*solution) +print(f"Predicted output 2 based on the best solution : {prediction}") + +if ga_instance.best_solution_generation != -1: + print(f"Best fitness value reached after {ga_instance.best_solution_generation} generations.") From 75dd58d0f2face011ae5b9aadde550d49519962e Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 19:19:18 -0400 Subject: [PATCH 03/17] Edit docstrings for the repo --- pygad/helper/activations.py | 44 ++- pygad/helper/misc.py | 443 ++++++++++++++++++------- pygad/kerasga/kerasga.py | 318 +++++++++--------- pygad/pygad.py | 71 +++- pygad/torchga/torchga.py | 84 ++++- pygad/utils/crossover.py | 97 ++++-- pygad/utils/engine.py | 302 +++++++++++++---- pygad/utils/mutation.py | 326 +++++++++++++------ pygad/utils/nsga2.py | 133 +++++--- pygad/utils/parent_selection.py | 329 ++++++++++++------- pygad/utils/validation.py | 557 +++++++++++++++++++++++++++++++- pygad/visualize/plot.py | 256 +++++++++++---- 12 files changed, 2249 insertions(+), 711 deletions(-) diff --git a/pygad/helper/activations.py b/pygad/helper/activations.py index 6b0e4f2..3123d8a 100644 --- a/pygad/helper/activations.py +++ b/pygad/helper/activations.py @@ -2,11 +2,19 @@ def sigmoid(sop): """ - Applies the sigmoid function. + Apply the sigmoid activation function element-wise: + ``sigmoid(x) = 1 / (1 + exp(-x))``. - sop: The input to which the sigmoid function is applied. + Parameters + ---------- + sop : numeric, list, tuple, or numpy.ndarray + The input value(s). Lists and tuples are converted to a + numpy array before computing. - Returns the result of the sigmoid function. + Returns + ------- + activated : numeric or numpy.ndarray + The element-wise sigmoid of the input. """ if type(sop) in [list, tuple]: @@ -16,11 +24,19 @@ def sigmoid(sop): def relu(sop): """ - Applies the ReLU function. + Apply the ReLU activation function element-wise: + ``relu(x) = max(0, x)``. - sop: The input to which the relu function is applied. + Parameters + ---------- + sop : numeric, list, tuple, or numpy.ndarray + The input value(s). Scalars are handled as a special case. + Lists and tuples are converted to a numpy array. - Returns the result of the ReLU function. + Returns + ------- + activated : numeric or numpy.ndarray + The element-wise ReLU of the input. """ if not (type(sop) in [list, tuple, numpy.ndarray]): @@ -38,10 +54,20 @@ def relu(sop): def softmax(layer_outputs): """ - Applies the softmax function. + Apply a sum-normalised softmax: divide each value by the sum of + all values plus a tiny constant to avoid division by zero. - layer_outputs: The input to which the softmax function is applied. + Note that this is not the canonical softmax (which uses + exponentials); it just normalises the inputs so they sum to one. - Returns the result of the softmax function. + Parameters + ---------- + layer_outputs : numpy.ndarray + The values to normalise. + + Returns + ------- + activated : numpy.ndarray + The normalised values. """ return layer_outputs / (numpy.sum(layer_outputs) + 0.000001) diff --git a/pygad/helper/misc.py b/pygad/helper/misc.py index 0c31472..c912528 100644 --- a/pygad/helper/misc.py +++ b/pygad/helper/misc.py @@ -18,15 +18,41 @@ def summary(self, print_step_parameters=True, print_parameters_summary=True): """ - The summary() method prints a summary of the PyGAD lifecycle in a Keras style. - The parameters are: - line_length: An integer representing the length of the single line in characters. - fill_character: A character to fill the lines. - line_character: A character for creating a line separator. - line_character2: A secondary character to create a line separator. - columns_equal_len: The table rows are split into equal-sized columns or split subjective to the width needed. - print_step_parameters: Whether to print extra parameters about each step inside the step. If print_step_parameters=False and print_parameters_summary=True, then the parameters of each step are printed at the end of the table. - print_parameters_summary: Whether to print parameters summary at the end of the table. If print_step_parameters=False, then the parameters of each step are printed at the end of the table too. + Print a Keras-style summary of the PyGAD lifecycle. Each + configured step (fitness, parent selection, crossover, + mutation, etc.) is shown on its own row together with the + handler name and an output-shape hint. The string written to + the logger is also returned. + + Parameters + ---------- + line_length : int + Total width of a printed line in characters. + fill_character : str + Character used to pad cells to the column width. + line_character : str + Character used to draw the lighter horizontal separator + between rows. + line_character2 : str + Character used to draw the heavier separator between the + header and the body. + columns_equal_len : bool + If True, the three columns are split into equal widths. + Otherwise the widths follow the longest content in each + column. + print_step_parameters : bool + If True, the extra parameters of each step are printed + inside the step's row. + print_parameters_summary : bool + If True, a summary block of global parameters is printed + below the table. When ``print_step_parameters`` is False, + the per-step extras are folded into this summary block. + + Returns + ------- + summary_output : str + The full summary as a single string (the same text that + was written to the logger). """ summary_output = "" @@ -240,7 +266,20 @@ def print_params_summary(): def initialize_parents_array(self, shape): """ - Standardize array initialization for parents and offspring. + Allocate an empty parents (or offspring) array with the right + dtype. Uses the dtype of the first gene type when every gene + shares the same type, otherwise falls back to ``object``. + + Parameters + ---------- + shape : tuple + The shape of the array, usually + ``(num_parents, num_genes)``. + + Returns + ------- + array : numpy.ndarray + An uninitialised array of the requested shape and dtype. """ if self.gene_type_single: return numpy.empty(shape, dtype=self.gene_type[0]) @@ -250,13 +289,21 @@ def initialize_parents_array(self, shape): def change_population_dtype_and_round(self, population): """ - Change the data type of the population. It works with iterables (e.g. lists or NumPy arrays) of shape 2D. - It does not handle single numeric values or 1D arrays. - - It accepts: - -population: The iterable to change its dtype. - - It returns the iterable with the data type changed for all genes. + Cast a 2D population to the dtype encoded in + ``self.gene_type`` and round non-integer genes to the + configured precision. When ``gene_type_single`` is True, the + same dtype and precision are applied to every gene; otherwise + each gene gets its own dtype and precision. + + Parameters + ---------- + population : list or numpy.ndarray + A 2D iterable with shape ``(num_solutions, num_genes)``. + + Returns + ------- + population_new : numpy.ndarray + The same data cast (and rounded) to the right type. """ population_new = numpy.array(population.copy(), dtype=object) @@ -299,13 +346,22 @@ def change_gene_dtype_and_round(self, gene_index, gene_value): """ - Change the data type and round a single gene value or a vector of values FOR THE SAME GENE. E.g., the input could be 6 or [6, 7, 8]. - - It accepts 2 parameters: - -gene_index: The index of the target gene. - -gene_value: The gene value. - - If gene_value has a single value, then it returns a single number with the type changed and value rounded. If gene_value is a vector, then a vector is returned after changing the data type and rounding. + Cast and round one or more candidate values that all belong + to the same gene index. Useful when generating mutation + values for a specific gene. + + Parameters + ---------- + gene_index : int + Index of the gene whose dtype / precision should be used. + gene_value : numeric or iterable + Either a single value or a vector of values for that + gene. + + Returns + ------- + gene_value_new : numeric + The first (or only) value after casting and rounding. """ if self.gene_type_single == True: @@ -344,15 +400,28 @@ def mutation_change_gene_dtype_and_round(self, gene_value, mutation_by_replacement): """ - Change the data type and round the random value used to apply mutation. - - It accepts: - -random_value: The random value to change its data type. - -gene_index: The index of the target gene. - -gene_value: The gene value before mutation. Only used if mutation_by_replacement=False and gene_type_single=False. - -mutation_by_replacement: A flag indicating whether mutation by replacement is enabled or not. The reason is to make this helper method usable while generating the initial population. In this case, mutation_by_replacement does not matter and should be considered False. - - It returns the new value after changing the data type and being rounded. + Apply a random mutation value to a gene and cast / round the + result. If ``mutation_by_replacement`` is True, the random + value replaces the gene; otherwise it is added to the + existing value. + + Parameters + ---------- + random_value : numeric + The freshly drawn mutation value. + gene_index : int + Index of the gene being mutated. + gene_value : numeric + Gene value before mutation. Only used when + ``mutation_by_replacement`` is False. + mutation_by_replacement : bool + If True, replace the gene; otherwise add the random + value to it. + + Returns + ------- + gene_value_new : numeric + The mutated value after casting and rounding. """ if mutation_by_replacement: @@ -369,6 +438,26 @@ def mutation_change_gene_dtype_and_round(self, def validate_gene_constraint_callable_output(self, selected_values, values): + """ + Check that a gene constraint callable returned a list or + numpy array whose elements are all members of the original + candidate ``values``. + + Parameters + ---------- + selected_values : list, numpy.ndarray, or other + The return value from the user-supplied constraint + callable. + values : iterable + The full set of candidate values that was passed to the + callable. + + Returns + ------- + valid : bool + True when ``selected_values`` is a list or numpy array + and is a subset of ``values``. False otherwise. + """ if type(selected_values) in [list, numpy.ndarray]: selected_values_set = set(selected_values) if selected_values_set.issubset(values): @@ -384,16 +473,32 @@ def filter_gene_values_by_constraint(self, values, solution, gene_idx): - """ - Filter the random values generated for mutation based on whether they meet the gene constraint in the gene_constraint parameter. - - It accepts: - -values: The values to filter. - -solution: The solution containing the target gene. - -gene_idx: The index of the gene in the solution. - - It returns None if no values satisfy the constraint. Otherwise, an array of values that satisfy the constraint is returned. + Pass a list of candidate values through the user-supplied + gene constraint callable and return the subset that satisfies + the constraint. + + Parameters + ---------- + values : list or numpy.ndarray + Candidate values to filter. + solution : numpy.ndarray + The solution that owns the gene. Passed to the constraint + callable so it can look at the other genes if needed. + gene_idx : int + Index of the gene inside ``solution``. + + Returns + ------- + filtered_values : list, numpy.ndarray, or None + The values that satisfy the constraint, or None when no + value satisfies it (a warning is issued in that case). + + Raises + ------ + Exception + If the gene has no constraint, or the constraint callable + returns a result that is not a subset of ``values``. """ if self.gene_constraint and self.gene_constraint[gene_idx]: @@ -423,14 +528,23 @@ def filter_gene_values_by_constraint(self, return filtered_values def get_gene_dtype(self, gene_index): - """ - Returns the data type of the gene by its index. - - It accepts a single parameter: - -gene_index: The index of the gene to get its data type. Only used if each gene has its own data type. - - It returns the data type of the gene. + Return the dtype (and optional precision) for the gene at the + given index. When ``gene_type_single`` is True the same dtype + is returned for every gene; otherwise the per-gene entry is + returned. + + Parameters + ---------- + gene_index : int + Index of the gene whose dtype is wanted. Ignored when + ``gene_type_single`` is True. + + Returns + ------- + dtype : type or list + Either a single Python / numpy type, or a + ``[type, precision]`` pair. """ if self.gene_type_single == True: @@ -440,14 +554,24 @@ def get_gene_dtype(self, gene_index): return dtype def get_random_mutation_range(self, gene_index): - """ - Returns the minimum and maximum values of the mutation range. - - It accepts a single parameter: - -gene_index: The index of the gene to get its range. Only used if the gene has a specific mutation range. - - It returns the minimum and maximum values of the gene mutation range. + Return the random-mutation range ``(min, max)`` for the gene + at the given index. When ``random_mutation_min_val`` is a + scalar, the same range is used for every gene; otherwise the + per-gene entry is returned. + + Parameters + ---------- + gene_index : int + Index of the gene. Ignored when the range parameters are + scalars. + + Returns + ------- + range_min : numeric + Lower bound of the random delta. + range_max : numeric + Upper bound of the random delta. """ # We can use either random_mutation_min_val or random_mutation_max_val. @@ -460,14 +584,24 @@ def get_random_mutation_range(self, gene_index): return range_min, range_max def get_initial_population_range(self, gene_index): - """ - Returns the minimum and maximum values of the initial population range. - - It accepts a single parameter: - -gene_index: The index of the gene to get its range. Only used if the gene has a specific range - - It returns the minimum and maximum values of the gene initial population range. + Return the initial-population range ``(min, max)`` for the + gene at the given index. When ``init_range_low`` is a scalar, + the same range is used for every gene; otherwise the + per-gene entry is returned. + + Parameters + ---------- + gene_index : int + Index of the gene. Ignored when the range parameters are + scalars. + + Returns + ------- + range_min : numeric + Lower bound for the random initial gene value. + range_max : numeric + Upper bound for the random initial gene value. """ # We can use either init_range_low or init_range_high. @@ -486,18 +620,37 @@ def generate_gene_value_from_space(self, gene_value=None, sample_size=1): """ - Generate/select one or more values for the gene from the gene space. - - It accepts: - -gene_idx: The index of the gene in the solution. - -mutation_by_replacement: A flag indicating whether mutation by replacement is enabled or not. The reason is to make this helper method usable while generating the initial population. In this case, mutation_by_replacement does not matter and should be considered False. - -solution (iterable, optional): The solution where we need to generate a gene. Needed if you are selecting a single value (sample_size=1) to select a value that respects the allow_duplicate_genes parameter instead of selecting a value randomly. If None, then the gene value is selected randomly. - -gene_value (int, optional): The original gene value before applying mutation. Needed if you are calling this method to apply mutation. If None, then a sample is created from the gene space without being summed to the gene value. - -sample_size (int, optional): The number of random values to generate. It tries to generate a number of values up to a maximum of sample_size. But it is not always guaranteed because the total number of values might not be enough or the random generator creates duplicate random values. For int data types, it could be None to keep all the values. For float data types, a None value returns only a single value. - - It returns, - -A single numeric value if sample_size=1. Or - -An array with number of maximum number of values equal to sample_size if sample_size>1. + Generate one or more candidate values for the gene from its + ``gene_space`` entry. Handles flat spaces, nested spaces, + ``range`` objects, and ``{low, high, step}`` dictionaries. + + Parameters + ---------- + gene_idx : int + Index of the gene inside the solution. + mutation_by_replacement : bool + If True (mutation by replacement) the generated value is + used as-is. If False the generated value is added to + ``gene_value``. Set to True when building the initial + population. + solution : iterable or None + The solution the gene belongs to. When provided and + ``sample_size`` is 1, the helper tries to pick a value + that does not duplicate any existing gene. + gene_value : numeric or None + The current gene value. Required when applying mutation + with ``mutation_by_replacement=False`` so the random + value can be added on top. + sample_size : int + Number of candidate values to generate. ``1`` returns a + single number; larger values return an array; ``None`` + keeps the full integer range or a single float value. + + Returns + ------- + value : numeric or numpy.ndarray + A single value when ``sample_size=1``; otherwise an + array of up to ``sample_size`` values. """ if gene_value is None: @@ -648,19 +801,39 @@ def generate_gene_value_randomly(self, sample_size=1, step=1): """ - Randomly generate one or more values for the gene. - It accepts: - -range_min: The minimum value in the range from which a value is selected. - -range_max: The maximum value in the range from which a value is selected. - -gene_value: The original gene value before applying mutation. - -gene_idx: The index of the gene in the solution. - -mutation_by_replacement: A flag indicating whether mutation by replacement is enabled or not. The reason is to make this helper method usable while generating the initial population. In this case, mutation_by_replacement does not matter and should be considered False. - -sample_size: The number of random values to generate. It tries to generate a number of values up to a maximum of sample_size. But it is not always guaranteed because the total number of values might not be enough or the random generator creates duplicate random values. For int data types, it could be None to keep all the values. For float data types, a None value returns only a single value. - -step (int, optional): The step size for generating candidate values. Defaults to 1. Only used with genes of an integer data type. - - It returns, - -A single numeric value if sample_size=1. Or - -An array with number of values equal to sample_size if sample_size>1. + Generate one or more candidate values for the gene by drawing + from the random range ``[range_min, range_max)``. For integer + gene types the helper iterates over the discrete values; for + float types it samples uniformly. + + Parameters + ---------- + range_min : numeric + Lower bound of the random range. + range_max : numeric + Upper bound of the random range. + gene_value : numeric + The current gene value, used when + ``mutation_by_replacement`` is False so the random delta + can be added to it. + gene_idx : int + Index of the gene inside the solution. + mutation_by_replacement : bool + If True, the random value replaces the gene; otherwise it + is added. + sample_size : int or None + Number of candidate values to generate. ``1`` returns a + single number; larger values return an array of up to + that many values; ``None`` keeps every value in the + integer range or returns a single float. + step : int + Step size used when enumerating an integer range. + + Returns + ------- + random_value : numeric or numpy.ndarray + A single value when ``sample_size=1``; otherwise an + array of unique values. """ gene_type = self.get_gene_dtype(gene_index=gene_idx) @@ -716,20 +889,40 @@ def generate_gene_value(self, sample_size=1, step=1): """ - Generate one or more values for the gene either randomly or from the gene space. It acts as a router. - It accepts: - -gene_value: The original gene value before applying mutation. - -gene_idx: The index of the gene in the solution. - -mutation_by_replacement: A flag indicating whether mutation by replacement is enabled or not. The reason is to make this helper method usable while generating the initial population. In this case, mutation_by_replacement does not matter and should be considered False. - -solution (iterable, optional): The solution where we need to generate a gene. Needed if you are selecting a single value (sample_size=1) to select a value that respects the allow_duplicate_genes parameter instead of selecting a value randomly. If None, then the gene value is selected randomly. - -range_min (int, optional): The minimum value in the range from which a value is selected. It must be passed for generating the gene value randomly because we cannot decide whether it is the range for the initial population (init_range_low and init_range_high) or mutation (random_mutation_min_val and random_mutation_max_val). - -range_max (int, optional): The maximum value in the range from which a value is selected. It must be passed for generating the gene value randomly because we cannot decide whether it is the range for the initial population (init_range_low and init_range_high) or mutation (random_mutation_min_val and random_mutation_max_val). - -sample_size: The number of random values to generate/select and return. It tries to generate a number of values up to a maximum of sample_size. But it is not always guaranteed because the total number of values might not be enough or the random generator creates duplicate random values. For int data types, it could be None to keep all the values. For float data types, a None value returns only a single value. - -step (int, optional): The step size for generating candidate values. Defaults to 1. Only used with genes of an integer data type. - - It returns, - -A single numeric value if sample_size=1. Or - -An array with number of values equal to sample_size if sample_size>1. + Dispatcher that picks between + ``generate_gene_value_from_space`` (when ``self.gene_space`` + is set) and ``generate_gene_value_randomly`` (otherwise) to + generate one or more candidate values for the gene. + + Parameters + ---------- + gene_value : numeric + The current gene value, used when + ``mutation_by_replacement`` is False. + gene_idx : int + Index of the gene inside the solution. + mutation_by_replacement : bool + See ``generate_gene_value_randomly``. + solution : iterable or None + The solution that owns the gene. Used to avoid creating + duplicates when ``sample_size=1`` and + ``allow_duplicate_genes`` is False. + range_min : numeric or None + Lower bound for the random range. Required when + ``self.gene_space`` is None. + range_max : numeric or None + Upper bound for the random range. Required when + ``self.gene_space`` is None. + sample_size : int or None + Number of candidate values to generate. + step : int + Step size for the integer random range. + + Returns + ------- + output : numeric or numpy.ndarray + A single value when ``sample_size=1``; otherwise an + array of values. """ if self.gene_space is None: output = self.generate_gene_value_randomly(range_min=range_min, @@ -757,22 +950,36 @@ def get_valid_gene_constraint_values(self, sample_size=100, step=1): """ - Generate/select values for the gene that satisfy the constraint. The values could be generated randomly or from the gene space. - The number of returned values is at its maximum equal to the sample_size parameter. - It accepts: - -range_min: The minimum value in the range from which a value is selected. - -range_max: The maximum value in the range from which a value is selected. - -gene_value: The original gene value before applying mutation. - -gene_idx: The index of the gene in the solution. - -mutation_by_replacement: A flag indicating whether mutation by replacement is enabled or not. The reason is to make this helper method usable while generating the initial population. In this case, mutation_by_replacement does not matter and should be considered False. - -solution: The solution in which the gene exists. - -sample_size: The number of values to generate or select. It tries to generate a number of values up to a maximum of sample_size. But it is not always guaranteed because the total number of values might not be enough or the random generator creates duplicate random values. - -step (int, optional): The step size for generating candidate values. Defaults to 1. Only used with genes of an integer data type. - - It returns, - -A single numeric value if sample_size=1. Or - -An array with number of values equal to sample_size if sample_size>1. Or - -None if no value found that satisfies the constraint. + Generate up to ``sample_size`` candidate values for the gene + (via ``generate_gene_value``) and then filter them through + the user-supplied ``gene_constraint`` callable. + + Parameters + ---------- + range_min : numeric or None + Lower bound of the random range. + range_max : numeric or None + Upper bound of the random range. + gene_value : numeric + The current gene value, used when + ``mutation_by_replacement`` is False. + gene_idx : int + Index of the gene inside the solution. + mutation_by_replacement : bool + See ``generate_gene_value_randomly``. + solution : iterable + The solution that owns the gene. Passed to the + constraint callable so it can look at the other genes. + sample_size : int + Number of candidate values to draw before filtering. + step : int + Step size for the integer random range. + + Returns + ------- + values_filtered : numpy.ndarray or None + Values that satisfy the constraint, or None if no + candidate satisfies it. """ # Either generate the values randomly or from the gene space. diff --git a/pygad/kerasga/kerasga.py b/pygad/kerasga/kerasga.py index afc2274..2a91ed4 100644 --- a/pygad/kerasga/kerasga.py +++ b/pygad/kerasga/kerasga.py @@ -1,151 +1,167 @@ -import copy -import numpy -import tensorflow.keras - -def model_weights_as_vector(model): - """ - Reshapes the Keras model weight as a vector. - - Parameters - ---------- - model : TYPE - The Keras model. - - Returns - ------- - TYPE - The weights as a 1D vector. - - """ - weights_vector = [] - - for layer in model.layers: # model.get_weights(): - if layer.trainable: - layer_weights = layer.get_weights() - for l_weights in layer_weights: - vector = numpy.reshape(l_weights, (l_weights.size)) - weights_vector.extend(vector) - - return numpy.array(weights_vector) - -def model_weights_as_matrix(model, weights_vector): - """ - Reshapes the PyGAD 1D solution as a Keras weight matrix. - - Parameters - ---------- - model : TYPE - The Keras model. - weights_vector : TYPE - The PyGAD solution as a 1D vector. - - Returns - ------- - weights_matrix : TYPE - The Keras weights as a matrix. - - """ - weights_matrix = [] - - start = 0 - for layer_idx, layer in enumerate(model.layers): # model.get_weights(): - # for w_matrix in model.get_weights(): - layer_weights = layer.get_weights() - if layer.trainable: - for l_weights in layer_weights: - layer_weights_shape = l_weights.shape - layer_weights_size = l_weights.size - - layer_weights_vector = weights_vector[start:start + layer_weights_size] - layer_weights_matrix = numpy.reshape(layer_weights_vector, (layer_weights_shape)) - weights_matrix.append(layer_weights_matrix) - - start = start + layer_weights_size - else: - for l_weights in layer_weights: - weights_matrix.append(l_weights) - - return weights_matrix - -def predict(model, - solution, - data, - batch_size=None, - verbose=0, - steps=None): - """ - Use the PyGAD's solution to make predictions using the Keras model. - - Parameters - ---------- - model : TYPE - The Keras model. - solution : TYPE - A single PyGAD solution as 1D vector. - data : TYPE - The data or a generator. - batch_size : TYPE, optional - The batch size (i.e. number of samples per step or batch). The default is None. Check documentation of the Keras Model.predict() method for more information. - verbose : TYPE, optional - Verbosity mode. The default is 0. Check documentation of the Keras Model.predict() method for more information. - steps : TYPE, optional - The total number of steps (batches of samples). The default is None. Check documentation of the Keras Model.predict() method for more information. - - Returns - ------- - predictions : TYPE - The Keras model predictions. - - """ - # Fetch the parameters of the best solution. - solution_weights = model_weights_as_matrix(model=model, - weights_vector=solution) - _model = tensorflow.keras.models.clone_model(model) - _model.set_weights(solution_weights) - predictions = _model.predict(x=data, - batch_size=batch_size, - verbose=verbose, - steps=steps) - - return predictions - -class KerasGA: - - def __init__(self, model, num_solutions): - - """ - Creates an instance of the KerasGA class to build a population of model parameters. - - model: A Keras model class. - num_solutions: Number of solutions in the population. Each solution has different model parameters. - """ - - self.model = model - - self.num_solutions = num_solutions - - # A list holding references to all the solutions (i.e. networks) used in the population. - self.population_weights = self.create_population() - - def create_population(self): - - """ - Creates the initial population of the genetic algorithm as a list of networks' weights (i.e. solutions). Each element in the list holds a different set of weights for the Keras model. - - The method returns a list holding the weights of all solutions. - """ - - model_weights_vector = model_weights_as_vector(model=self.model) - - net_population_weights = [] - net_population_weights.append(model_weights_vector) - - for idx in range(self.num_solutions-1): - - net_weights = copy.deepcopy(model_weights_vector) - net_weights = numpy.array(net_weights) + numpy.random.uniform(low=-1.0, high=1.0, size=model_weights_vector.size) - - # Appending the weights to the population. - net_population_weights.append(net_weights) - - return net_population_weights +import copy +import numpy +import tensorflow.keras + +def model_weights_as_vector(model): + """ + Flatten every weight tensor of a Keras model into a single 1D + NumPy array. Only the weights of trainable layers are included. + + Parameters + ---------- + model : tensorflow.keras.Model + The Keras model whose weights should be flattened. + + Returns + ------- + weights_vector : numpy.ndarray + A 1D array with every trainable parameter of the model laid + out in layer order. + """ + weights_vector = [] + + for layer in model.layers: # model.get_weights(): + if layer.trainable: + layer_weights = layer.get_weights() + for l_weights in layer_weights: + vector = numpy.reshape(l_weights, (l_weights.size)) + weights_vector.extend(vector) + + return numpy.array(weights_vector) + +def model_weights_as_matrix(model, weights_vector): + """ + Reshape a flat 1D weights vector back into the per-layer matrices + expected by ``model.set_weights``. Non-trainable layers keep their + current weights. + + Parameters + ---------- + model : tensorflow.keras.Model + The reference Keras model. Used to read the per-layer shapes. + weights_vector : array-like + A 1D vector in the same layout produced by + ``model_weights_as_vector``. + + Returns + ------- + weights_matrix : list of numpy.ndarray + One matrix per layer, ready to be passed to + ``model.set_weights``. + """ + weights_matrix = [] + + start = 0 + for layer_idx, layer in enumerate(model.layers): # model.get_weights(): + # for w_matrix in model.get_weights(): + layer_weights = layer.get_weights() + if layer.trainable: + for l_weights in layer_weights: + layer_weights_shape = l_weights.shape + layer_weights_size = l_weights.size + + layer_weights_vector = weights_vector[start:start + layer_weights_size] + layer_weights_matrix = numpy.reshape(layer_weights_vector, (layer_weights_shape)) + weights_matrix.append(layer_weights_matrix) + + start = start + layer_weights_size + else: + for l_weights in layer_weights: + weights_matrix.append(l_weights) + + return weights_matrix + +def predict(model, + solution, + data, + batch_size=None, + verbose=0, + steps=None): + """ + Load the given solution as the model's weights and run a forward + pass on ``data``. The model is cloned first so the caller's + instance is left untouched. + + Parameters + ---------- + model : tensorflow.keras.Model + The reference Keras model. + solution : array-like + A 1D weights vector returned by the GA. + data : numpy.ndarray or tf.data.Dataset + Input data passed to ``Model.predict``. + batch_size : int or None + Number of samples per step. Forwarded to ``Model.predict``. + verbose : int + Verbosity level. Forwarded to ``Model.predict``. + steps : int or None + Number of steps (batches). Forwarded to ``Model.predict``. + + Returns + ------- + predictions : numpy.ndarray + The Keras model output for ``data``. + """ + # Fetch the parameters of the best solution. + solution_weights = model_weights_as_matrix(model=model, + weights_vector=solution) + _model = tensorflow.keras.models.clone_model(model) + _model.set_weights(solution_weights) + predictions = _model.predict(x=data, + batch_size=batch_size, + verbose=verbose, + steps=steps) + + return predictions + +class KerasGA: + + def __init__(self, model, num_solutions): + """ + Build a population of weight vectors for a Keras model so the + GA can evolve them. + + Parameters + ---------- + model : tensorflow.keras.Model + The Keras model to optimise. Its current weights are used + as the seed for the first solution. + num_solutions : int + Number of solutions in the population. Each solution is a + flat copy of the model weights with random perturbations + added to it. + """ + + self.model = model + + self.num_solutions = num_solutions + + # A list holding references to all the solutions (i.e. networks) used in the population. + self.population_weights = self.create_population() + + def create_population(self): + """ + Build the initial population. The first solution is the model's + current flattened weights; every other solution is the same + vector with a uniform ``[-1, 1]`` perturbation added on top. + + Returns + ------- + net_population_weights : list of numpy.ndarray + One flat weight vector per solution. + """ + + model_weights_vector = model_weights_as_vector(model=self.model) + + net_population_weights = [] + net_population_weights.append(model_weights_vector) + + for idx in range(self.num_solutions-1): + + net_weights = copy.deepcopy(model_weights_vector) + net_weights = numpy.array(net_weights) + numpy.random.uniform(low=-1.0, high=1.0, size=model_weights_vector.size) + + # Appending the weights to the population. + net_population_weights.append(net_weights) + + return net_population_weights diff --git a/pygad/pygad.py b/pygad/pygad.py index 4dabbf4..3a18415 100644 --- a/pygad/pygad.py +++ b/pygad/pygad.py @@ -183,8 +183,13 @@ def __init__(self, def save(self, filename): """ - Saves the genetic algorithm instance: - -filename: Name of the file to save the instance. No extension is needed. + Serialise the GA instance to disk with ``cloudpickle``. The + file extension ``.pkl`` is added automatically. + + Parameters + ---------- + filename : str + Path (without extension) where the pickle file is written. """ cloudpickle_serialized_object = cloudpickle.dumps(self) @@ -193,20 +198,36 @@ def save(self, filename): cloudpickle.dump(self, file) def push_to_vilvik(self, *, api_key=None, **overrides): - """Import this run into Vilvik (https://vilvik.com) as an editable, - continuable cloud record. - - This is a thin convenience wrapper over the Vilvik SDK, which must be - installed separately:: + """ + Push this GA run to Vilvik (https://vilvik.com) as an + editable, continuable cloud record. Thin convenience wrapper + over the Vilvik SDK, which must be installed separately:: pip install vilvik - After ``ga.run()``, call ``ga.push_to_vilvik()`` (sign in first with the - ``vilvik login`` command or set the ``VILVIK_API_KEY`` environment - variable). All keyword arguments are forwarded to ``vilvik.push`` (for - example ``name=``, ``fitness_source=``, ``callbacks=``, ``preamble=``, - ``dry_run=True``). Returns the created record, or a capture report when - ``dry_run=True``. + Call after ``ga.run()``. Sign in first with ``vilvik login`` + or set the ``VILVIK_API_KEY`` environment variable. + + Parameters + ---------- + api_key : str, optional + Explicit API key. When None, the SDK falls back to the + CLI login or the ``VILVIK_API_KEY`` environment variable. + **overrides + Forwarded to ``vilvik.push``. Common keys include + ``name``, ``fitness_source``, ``callbacks``, + ``preamble``, and ``dry_run``. + + Returns + ------- + record : object + The created Vilvik record, or a capture report when + ``dry_run=True``. + + Raises + ------ + ImportError + If the ``vilvik`` package is not installed. """ try: import vilvik @@ -226,9 +247,27 @@ def push_to_vilvik(self, *, api_key=None, **overrides): def load(filename): """ - Reads a saved instance of the genetic algorithm: - -filename: Name of the file to read the instance. No extension is needed. - Returns the genetic algorithm instance. + Load a GA instance from a ``cloudpickle`` file written by + ``pygad.GA.save``. The file extension ``.pkl`` is added + automatically. + + Parameters + ---------- + filename : str + Path (without extension) where the pickle file is read from. + + Returns + ------- + ga_in : pygad.GA + The restored GA instance. + + Raises + ------ + FileNotFoundError + If the file does not exist. + BaseException + If the file exists but cannot be unpickled (for example when + the original fitness function is not importable). """ try: diff --git a/pygad/torchga/torchga.py b/pygad/torchga/torchga.py index f7a25b1..3f06fe4 100644 --- a/pygad/torchga/torchga.py +++ b/pygad/torchga/torchga.py @@ -3,6 +3,22 @@ import torch def model_weights_as_vector(model): + """ + Flatten every weight tensor of a PyTorch model into a single 1D + NumPy array. Tensors are moved off the GPU and detached from the + computational graph before being converted. + + Parameters + ---------- + model : torch.nn.Module + The model whose weights should be flattened. + + Returns + ------- + weights_vector : numpy.ndarray + A 1D float array with every parameter of the model laid out + in ``state_dict`` order. + """ weights_vector = [] for curr_weights in model.state_dict().values(): @@ -16,6 +32,25 @@ def model_weights_as_vector(model): return numpy.array(weights_vector) def model_weights_as_dict(model, weights_vector): + """ + Reshape a flat 1D weights vector back into the per-layer tensors + expected by ``model.load_state_dict``. The shapes are taken from + the model's current ``state_dict``. + + Parameters + ---------- + model : torch.nn.Module + The reference model. Used only to read the per-layer shapes. + weights_vector : array-like + A 1D vector in the same layout produced by + ``model_weights_as_vector``. + + Returns + ------- + weights_dict : dict + A dict mapping every parameter name to a freshly built + ``torch.Tensor`` with the right shape. + """ weights_dict = model.state_dict() start = 0 @@ -36,6 +71,26 @@ def model_weights_as_dict(model, weights_vector): return weights_dict def predict(model, solution, data): + """ + Load the given solution as the model's weights and run a forward + pass on the input ``data``. The model is deep-copied first so the + caller's instance is left untouched. + + Parameters + ---------- + model : torch.nn.Module + The reference model whose architecture should be used for the + forward pass. + solution : array-like + A 1D weights vector returned by the GA. + data : torch.Tensor + Input tensor of the right shape for the model. + + Returns + ------- + predictions : torch.Tensor + The model's output for ``data``. + """ # Fetch the parameters of the best solution. model_weights_dict = model_weights_as_dict(model=model, weights_vector=solution) @@ -52,12 +107,19 @@ def predict(model, solution, data): class TorchGA: def __init__(self, model, num_solutions): - """ - Creates an instance of the TorchGA class to build a population of model parameters. - - model: A PyTorch model class. - num_solutions: Number of solutions in the population. Each solution has different model parameters. + Build a population of weight vectors for a PyTorch model so + the GA can evolve them. + + Parameters + ---------- + model : torch.nn.Module + The PyTorch model to optimise. Its current weights are + used as the seed for the first solution. + num_solutions : int + Number of solutions in the population. Each solution is + a flat copy of the model weights with random perturbations + added to it. """ self.model = model @@ -68,11 +130,15 @@ def __init__(self, model, num_solutions): self.population_weights = self.create_population() def create_population(self): - """ - Creates the initial population of the genetic algorithm as a list of networks' weights (i.e. solutions). Each element in the list holds a different set of weights for the PyTorch model. - - The method returns a list holding the weights of all solutions. + Build the initial population. The first solution is the model's + current flattened weights; every other solution is the same + vector with a uniform ``[-1, 1]`` perturbation added on top. + + Returns + ------- + net_population_weights : list of numpy.ndarray + One flat weight vector per solution. """ model_weights_vector = model_weights_as_vector(model=self.model) diff --git a/pygad/utils/crossover.py b/pygad/utils/crossover.py index fbd6bdd..a43cb31 100644 --- a/pygad/utils/crossover.py +++ b/pygad/utils/crossover.py @@ -11,17 +11,25 @@ def __init__(): pass def single_point_crossover(self, parents, offspring_size): - """ - Applies single-point crossover between pairs of parents. - This function selects a random point at which crossover occurs between the parents, generating offspring. - - Parameters: - parents (array-like): The parents to mate for producing the offspring. - offspring_size (int): The number of offspring to produce. - - Returns: - array-like: An array containing the produced offspring. + Apply single-point crossover between pairs of parents. One + random split point is picked per offspring; the genes before + the point come from the first parent and the genes from the + point onward come from the second parent. + + Parameters + ---------- + parents : numpy.ndarray + A 2D array of parent solutions, one row per parent. + offspring_size : tuple + ``(num_offspring, num_genes)``. Shape of the offspring + array to return. + + Returns + ------- + offspring : numpy.ndarray + A 2D array of the produced offspring with shape + ``offspring_size``. """ if self.gene_type_single == True: @@ -81,13 +89,24 @@ def single_point_crossover(self, parents, offspring_size): return offspring def two_points_crossover(self, parents, offspring_size): - """ - Applies the 2 points crossover. It selects the 2 points randomly at which crossover takes place between the pairs of parents. - It accepts 2 parameters: - -parents: The parents to mate for producing the offspring. - -offspring_size: The size of the offspring to produce. - It returns an array of the produced offspring. + Apply two-points crossover. Two split points are picked per + offspring; the genes outside ``[point1, point2)`` come from the + first parent and the genes inside come from the second parent. + + Parameters + ---------- + parents : numpy.ndarray + A 2D array of parent solutions, one row per parent. + offspring_size : tuple + ``(num_offspring, num_genes)``. Shape of the offspring + array to return. + + Returns + ------- + offspring : numpy.ndarray + A 2D array of the produced offspring with shape + ``offspring_size``. """ if self.gene_type_single == True: @@ -154,13 +173,23 @@ def two_points_crossover(self, parents, offspring_size): return offspring def uniform_crossover(self, parents, offspring_size): - """ - Applies the uniform crossover. For each gene, a parent out of the 2 mating parents is selected randomly and the gene is copied from it. - It accepts 2 parameters: - -parents: The parents to mate for producing the offspring. - -offspring_size: The size of the offspring to produce. - It returns an array of the produced offspring. + Apply uniform crossover. For each gene independently, the value + is copied from one of the two mating parents picked at random. + + Parameters + ---------- + parents : numpy.ndarray + A 2D array of parent solutions, one row per parent. + offspring_size : tuple + ``(num_offspring, num_genes)``. Shape of the offspring + array to return. + + Returns + ------- + offspring : numpy.ndarray + A 2D array of the produced offspring with shape + ``offspring_size``. """ if self.gene_type_single == True: @@ -222,13 +251,25 @@ def uniform_crossover(self, parents, offspring_size): return offspring def scattered_crossover(self, parents, offspring_size): - """ - Applies the scattered crossover. It randomly selects the gene from one of the 2 parents. - It accepts 2 parameters: - -parents: The parents to mate for producing the offspring. - -offspring_size: The size of the offspring to produce. - It returns an array of the produced offspring. + Apply scattered crossover. For each gene independently, the + value is copied from one of the two mating parents picked at + random. (Same mechanic as ``uniform_crossover`` but kept as a + separate operator for backwards compatibility.) + + Parameters + ---------- + parents : numpy.ndarray + A 2D array of parent solutions, one row per parent. + offspring_size : tuple + ``(num_offspring, num_genes)``. Shape of the offspring + array to return. + + Returns + ------- + offspring : numpy.ndarray + A 2D array of the produced offspring with shape + ``offspring_size``. """ if self.gene_type_single == True: diff --git a/pygad/utils/engine.py b/pygad/utils/engine.py index a2171bf..e675a47 100644 --- a/pygad/utils/engine.py +++ b/pygad/utils/engine.py @@ -6,6 +6,22 @@ class GAEngine: def round_genes(self, solutions): + """ + Round the genes in ``solutions`` according to the precision + encoded in ``self.gene_type``. When ``gene_type_single`` is + True, the same dtype and precision are applied to every gene; + otherwise the per-gene dtype / precision pair is used. + + Parameters + ---------- + solutions : numpy.ndarray + A 2D array of solutions to round. + + Returns + ------- + solutions : numpy.ndarray + The same array with the rounding applied. + """ if self.gene_type_single: if not self.gene_type[1] is None: solutions = numpy.round(numpy.asarray(solutions, dtype=self.gene_type[0]), @@ -23,17 +39,33 @@ def initialize_population(self, gene_type, gene_constraint): """ - Creates an initial population randomly as a NumPy array. The array is saved in the instance attribute named 'population'. + Build the initial population at random and store it on the GA + instance. The procedure has four steps: generate the gene + values (from the gene space or the init range), apply the + gene dtype and rounding, enforce gene constraints, and resolve + duplicate genes when not allowed. + + Sets the following instance attributes: - It accepts: - -allow_duplicate_genes: Whether duplicate genes are allowed or not. - -gene_type: The data type of the genes. - -gene_constraint: The constraints of the genes. + - ``pop_size``: a ``(sol_per_pop, num_genes)`` tuple. + - ``population``: the working population. Updated every + generation after this initial call. + - ``initial_population``: a frozen copy of the initial + population for later reference. - This method assigns the values of the following 3 instance attributes: - 1. pop_size: Size of the population. - 2. population: Initially, holds the initial population and later updated after each generation. - 3. init_population: Keeping the initial population. + Parameters + ---------- + allow_duplicate_genes : bool + If False, duplicate genes inside a single solution are + resolved by sampling new values. + gene_type : list or type + The dtype (and optional precision) for the genes. Used by + ``solve_duplicate_genes_randomly`` when resolving + duplicates outside the gene space. + gene_constraint : list or None + One callable per gene that returns the subset of a + candidate values list which satisfy the constraint. ``None`` + disables the per-gene constraint check. """ # Population size = (number of chromosomes, number of genes per chromosome) @@ -157,9 +189,36 @@ def initialize_population(self, def cal_pop_fitness(self): """ - Calculating the fitness values of batches of solutions in the current population. - It returns: - -fitness: An array of the calculated fitness values. + Compute the fitness value of every solution in the current + population. + + Avoids recomputing the fitness of solutions that were already + evaluated as parents in a previous generation: when + ``self.last_generation_parents`` is available, the matching + rows are reused from ``self.previous_generation_fitness``. The + rest are dispatched either sequentially or in parallel + depending on ``self.parallel_processing``. When + ``self.fitness_batch_size`` is set, solutions are submitted to + the fitness function in batches instead of one at a time. + + Returns + ------- + pop_fitness : numpy.ndarray + A 1D array of fitness values for single-objective problems + or a 2D array of shape ``(sol_per_pop, num_objectives)`` for + multi-objective problems. + + Raises + ------ + Exception + If ``self.valid_parameters`` is False, meaning the GA + instance was created with invalid parameters. + ValueError + If the fitness function returns a value of an unexpected + type or if a batch returns a wrong number of fitness values. + TypeError + If a batched fitness function does not return a list, + tuple, or numpy.ndarray. """ try: if self.valid_parameters == False: @@ -392,7 +451,29 @@ def cal_pop_fitness(self): def run(self): """ - Runs the genetic algorithm. This is the main method in which the genetic algorithm is evolved through a number of generations. + Run the genetic algorithm for ``self.num_generations`` + generations. This is the main entry point for users: it sets + up the bookkeeping lists, evaluates the initial population, + runs the generational loop (select, crossover, mutate, update + population, re-evaluate, callbacks, check stop criteria), and + finalises the best-solution data after the last generation. + + Calls the optional user callbacks ``on_start``, + ``on_fitness``, ``on_parents``, ``on_crossover``, + ``on_mutation``, ``on_generation`` and ``on_stop`` at the + appropriate points. + + Raises + ------ + Exception + If ``self.valid_parameters`` is False, meaning the GA was + built with invalid parameters. + TypeError + If an NSGA-II / NSGA-III parent selection type is used on + a single-objective problem. + ValueError + If the ``stop_criteria`` parameter is malformed for the + current number of objectives. """ try: if self.valid_parameters == False: @@ -604,6 +685,28 @@ def run(self): raise ex def run_loop_head(self, best_solution_fitness): + """ + Run the bookkeeping that takes place at the top of every + generation: call ``self.on_fitness`` if set (with optional + validation of the returned values), append the running best + fitness to ``self.best_solutions_fitness``, and append the + current population and fitness to ``self.solutions`` / + ``self.solutions_fitness`` when ``self.save_solutions`` is + True. + + Internal helper. Not meant to be called by users. + + Parameters + ---------- + best_solution_fitness : numeric or numpy.ndarray + Fitness of the best solution in the previous generation. + + Raises + ------ + ValueError + If ``on_fitness`` returns an iterable whose shape does not + match the population fitness, or an unsupported type. + """ if not (self.on_fitness is None): on_fitness_output = self.on_fitness(self, self.last_generation_fitness) @@ -634,22 +737,40 @@ def run_loop_head(self, best_solution_fitness): def run_select_parents(self, call_on_parents=True): """ - This method must be only called from inside the run() method. It is not meant for use by the user. - Generally, any method with a name starting with 'run_' is meant to be only called by PyGAD from inside the 'run()' method. + Run the parent-selection step of one generation. Calls + ``self.select_parents`` (the operator chosen by + ``parent_selection_type``), validates the shapes of the + returned parents and indices, and updates these instance + attributes: + + - ``self.last_generation_parents``: the selected parent + solutions. + - ``self.last_generation_parents_indices``: their indices + inside ``self.population``. + + Optionally calls the user-supplied ``on_parents`` callback, + which may replace the parents and / or their indices in place. - The objective of the 'run_select_parents()' method is to select the parents and call the callable on_parents() if defined. - It does not return any variables. However, it changes these 2 attributes of the pygad.GA class instances: - 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. + Internal helper. Not meant to be called by users (any + ``run_*`` method is part of the generational loop driven by + ``run()``). Parameters ---------- - call_on_parents : bool, optional - If True, then the callable 'on_parents()' is called. The default is True. - - Returns - ------- - None. + call_on_parents : bool + When True, the ``on_parents`` callback is invoked after + selection. Set to False on the post-run cleanup pass so + the callback is not fired again. + + Raises + ------ + TypeError + If a user-supplied parent selection function returns + objects that are not ``numpy.ndarray``. + ValueError + If the selected parents have the wrong shape or the + ``on_parents`` callback returns an output that does not + match the expected layout. """ # Selecting the best parents in the population for mating. @@ -722,17 +843,32 @@ def run_select_parents(self, call_on_parents=True): def run_crossover(self): """ - This method must be only called from inside the run() method. It is not meant for use by the user. - Generally, any method with a name starting with 'run_' is meant to be only called by PyGAD from inside the 'run()' method. - - The objective of the 'run_crossover()' method is to apply crossover and call the callable on_crossover() if defined. - It does not return any variables. However, it changes these 2 attributes of the pygad.GA class instances: - 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. - - Returns - ------- - None. + Run the crossover step of one generation. Produces + ``self.num_offspring`` offspring from the selected parents and + updates these instance attributes: + + - ``self.last_generation_offspring_crossover``: the offspring + generated by crossover (or copied from parents when + ``crossover_type`` is None). + - ``self.last_generation_elitism``: the top + ``self.keep_elitism`` solutions in the population, used + later by ``run_update_population`` to seat the elite in the + next generation. + + Optionally calls the user-supplied ``on_crossover`` callback, + which may replace the offspring in place. + + Internal helper. Not meant to be called by users. + + Raises + ------ + TypeError + If a user-supplied crossover function returns an object + that is not a ``numpy.ndarray``. + ValueError + If the crossover output has the wrong shape or the + ``on_crossover`` callback returns an output that does not + match the expected layout. """ # If self.crossover_type=None, then 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. @@ -789,16 +925,27 @@ def run_crossover(self): def run_mutation(self): """ - This method must be only called from inside the run() method. It is not meant for use by the user. - Generally, any method with a name starting with 'run_' is meant to be only called by PyGAD from inside the 'run()' method. - - The objective of the 'run_mutation()' method is to apply mutation and call the callable on_mutation() if defined. - It does not return any variables. However, it changes this attribute of the pygad.GA class instances: - 1) last_generation_offspring_mutation: A NumPy array of the mutated offspring. - - Returns - ------- - None. + Run the mutation step of one generation. Mutates the + post-crossover offspring and updates this instance attribute: + + - ``self.last_generation_offspring_mutation``: the mutated + offspring (or the unchanged crossover offspring when + ``mutation_type`` is None). + + Optionally calls the user-supplied ``on_mutation`` callback, + which may replace the mutated offspring in place. + + Internal helper. Not meant to be called by users. + + Raises + ------ + TypeError + If a user-supplied mutation function returns an object + that is not a ``numpy.ndarray``. + ValueError + If the mutation output has the wrong shape or the + ``on_mutation`` callback returns an output that does not + match the expected layout. """ # If self.mutation_type=None, then 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. @@ -839,16 +986,24 @@ def run_mutation(self): def run_update_population(self): """ - This method must be only called from inside the run() method. It is not meant for use by the user. - Generally, any method with a name starting with 'run_' is meant to be only called by PyGAD from inside the 'run()' method. - - The objective of the 'run_update_population()' method is to update the 'population' attribute after completing the processes of crossover and mutation. - It does not return any variables. However, it changes this attribute of the pygad.GA class instances: - 1) population: A NumPy array of the population of solutions/chromosomes. - - Returns - ------- - None. + Build the next generation in ``self.population`` from the + offspring produced by mutation plus, optionally, the retained + parents (``keep_parents``) or elite (``keep_elitism``). + + Layout rules: + + - ``keep_elitism > 0``: top ``keep_elitism`` solutions sit at + the front of the new population; the rest is the mutated + offspring. + - ``keep_elitism == 0`` and ``keep_parents == -1``: all + selected parents sit at the front; the rest is offspring. + - ``keep_elitism == 0`` and ``keep_parents == 0``: the new + population is offspring only. + - ``keep_elitism == 0`` and ``keep_parents > 0``: top + ``keep_parents`` selected parents sit at the front; the + rest is offspring. + + Internal helper. Not meant to be called by users. """ # Update the population attribute according to the offspring generated. @@ -873,13 +1028,34 @@ def run_update_population(self): def best_solution(self, pop_fitness=None): """ - Returns information about the best solution found by the genetic algorithm. - Accepts the following parameters: - pop_fitness: An optional parameter holding the fitness values of the solutions in the latest population. If passed, then it saves time calculating the fitness. If None, then the 'cal_pop_fitness()' method is called to calculate the fitness of the latest population. - The following are returned: - -best_solution: Best solution in the current population. - -best_solution_fitness: Fitness value of the best solution. - -best_match_idx: Index of the best solution in the current population. + Return the best solution found in the latest population. For + single-objective problems "best" is the solution with the + maximum fitness. For multi-objective problems, the best + solution is the top entry of the NSGA-II sort (front 0, + highest crowding distance). + + Parameters + ---------- + pop_fitness : list, tuple, numpy.ndarray, or None + Pre-computed fitness for the current population. When + None, ``cal_pop_fitness`` is called to compute it. Useful + to avoid re-evaluating the fitness function. + + Returns + ------- + best_solution : numpy.ndarray + The genes of the best solution. + best_solution_fitness : numeric or numpy.ndarray + Its fitness value. + best_match_idx : int + Its index inside ``self.population``. + + Raises + ------ + ValueError + If ``pop_fitness`` is provided but its length does not + match the population, or its type is not list / tuple / + numpy.ndarray. """ try: diff --git a/pygad/utils/mutation.py b/pygad/utils/mutation.py index e520f53..0b8bbad 100644 --- a/pygad/utils/mutation.py +++ b/pygad/utils/mutation.py @@ -16,15 +16,22 @@ def __init__(self): pass def random_mutation(self, offspring): - """ - Applies the random mutation which changes the values of a number of genes randomly. - The random value is selected either using the 'gene_space' parameter or the 2 parameters 'random_mutation_min_val' and 'random_mutation_max_val'. - - It accepts: - -offspring: The offspring to mutate. - - It returns an array of the mutated offspring. + Dispatch to one of the four random-mutation backends depending + on whether the user passed ``mutation_probability`` and whether + ``gene_space`` is set. The replacement value for each mutated + gene comes either from the gene space or from the + ``random_mutation_min_val`` / ``random_mutation_max_val`` range. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # If the mutation values are selected from the mutation space, the attribute 'gene_space' is not None. Otherwise, it is None. @@ -48,12 +55,20 @@ def random_mutation(self, offspring): return offspring def mutation_by_space(self, offspring): - """ - Applies the mutation using the gene_space parameter. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring using the mutation space. + Mutate ``self.mutation_num_genes`` genes per offspring by + sampling a replacement value from the ``gene_space`` of each + chosen gene. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # For each offspring, a value from the gene space is selected randomly and assigned to the selected mutated gene. @@ -77,12 +92,21 @@ def mutation_by_space(self, offspring): return offspring def mutation_probs_by_space(self, offspring): - """ - Applies the random mutation using the mutation values' space and the mutation probability. For each gene, if its probability is <= the mutation probability, then it will be mutated based on the mutation space. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring using the mutation space. + Per-gene mutation that uses the ``gene_space`` for replacement + values and ``self.mutation_probability`` to decide which genes + to mutate. A gene is mutated when a uniform random draw is + less than or equal to the probability threshold. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # For each offspring, a value from the gene space is selected randomly and assigned to the selected mutated gene. @@ -112,16 +136,38 @@ def mutation_process_gene_value(self, range_min=None, range_max=None, sample_size=100): - """ - Generate/select values for the gene that satisfy the constraint. The values could be generated randomly or from the gene space. - It accepts: - -range_min: The minimum value in the range from which a value is selected. - -range_max: The maximum value in the range from which a value is selected. - -solution: The solution where the target gene exists. - -gene_idx: The index of the gene in the solution. - -sample_size: The number of random values to generate from which a value is selected. It tries to generate a number of values up to a maximum of sample_size. But it is not always guaranteed because the total number of values might not be enough or the random generator creates duplicate random values. - It returns a single numeric value that satisfies the gene constraint, if one exists in the gene_constraint parameter. + Pick a replacement value for a single gene. If the user passed a + ``gene_constraint`` for that gene, the method draws up to + ``sample_size`` candidate values, filters them through the + constraint, and picks one of the survivors at random; if no + candidate passes, the current value is kept. + + When no constraint exists, a single value is sampled directly + from the gene space or the random-mutation range. + + Parameters + ---------- + solution : numpy.ndarray + The solution that owns the gene. + gene_idx : int + Index of the gene inside ``solution``. + range_min : float, optional + Lower bound of the random range. Used only when the gene + has no ``gene_space``. + range_max : float, optional + Upper bound of the random range. Used only when the gene + has no ``gene_space``. + sample_size : int + Maximum number of candidate values to draw when a gene + constraint is in effect. The actual number can be smaller + if the generator runs out of distinct values. + + Returns + ------- + value_selected : numeric + The new value for the gene. May be the old value if no + candidate satisfied the constraint. """ # Check if the gene has a constraint. @@ -156,12 +202,20 @@ def mutation_process_gene_value(self, return value_selected def mutation_randomly(self, offspring): - """ - Applies the random mutation. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Mutate ``self.mutation_num_genes`` genes per offspring by + drawing a new value from the random-mutation range for each + chosen gene. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # Random mutation changes one or more genes in each offspring randomly. @@ -193,12 +247,21 @@ def mutation_randomly(self, offspring): return offspring def mutation_probs_randomly(self, offspring): - """ - Applies the random mutation using the mutation probability. For each gene, if its probability is <= the mutation probability, then it will be mutated randomly. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Per-gene mutation that uses the random-mutation range and + ``self.mutation_probability`` to decide which genes to mutate. + A gene is mutated when a uniform random draw is less than or + equal to the probability threshold. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # Random mutation changes one or more genes in each offspring randomly. @@ -231,12 +294,20 @@ def mutation_probs_randomly(self, offspring): return offspring def swap_mutation(self, offspring): - """ - Applies the swap mutation which interchanges the values of 2 randomly selected genes. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Swap the values of two genes inside each offspring. One gene is + picked at random from the first half of the chromosome; the + other is its mirror in the second half. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ for idx in range(offspring.shape[0]): @@ -249,12 +320,19 @@ def swap_mutation(self, offspring): return offspring def inversion_mutation(self, offspring): - """ - Applies the inversion mutation which selects a subset of genes and inverts them (in order). - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Pick a slice of genes inside each offspring and reverse the + order of the values in that slice. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ for idx in range(offspring.shape[0]): @@ -266,12 +344,19 @@ def inversion_mutation(self, offspring): return offspring def scramble_mutation(self, offspring): - """ - Applies the scramble mutation which selects a subset of genes and shuffles their order randomly. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Pick a slice of genes inside each offspring and shuffle the + values in that slice into a new random order. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ for idx in range(offspring.shape[0]): @@ -285,13 +370,25 @@ def scramble_mutation(self, offspring): return offspring def adaptive_mutation_population_fitness(self, offspring): - """ - A helper method to calculate the average fitness of the solutions before applying the adaptive mutation. - It accepts: - -offspring: The offspring to mutate. - It returns the average fitness to be used in adaptive mutation. - """ + Compute the average fitness of the population built from the + kept parents (or elites) plus the current offspring. The + average is then used by the adaptive mutation operators to + decide which solutions are "low quality" and need a stronger + mutation rate. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions that will be mutated next. + + Returns + ------- + average_fitness : float or numpy.ndarray + Average fitness over the temporary population. For multi- + objective problems this is a 1D array with one entry per + objective. + """ fitness = self.last_generation_fitness.copy() temp_population = numpy.zeros_like(self.population) @@ -436,13 +533,22 @@ def adaptive_mutation_population_fitness(self, offspring): return average_fitness, fitness[len(parents_to_keep):] def adaptive_mutation(self, offspring): - """ - Applies the adaptive mutation which changes the values of a number of genes randomly. In adaptive mutation, the number of genes to mutate differs based on the fitness value of the solution. - The random value is selected either using the 'gene_space' parameter or the 2 parameters 'random_mutation_min_val' and 'random_mutation_max_val'. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Dispatch to one of the four adaptive-mutation backends based on + whether ``mutation_probability`` is set and whether + ``gene_space`` is provided. With adaptive mutation, the + per-solution mutation rate is high for below-average solutions + and low for above-average solutions. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # If the attribute 'gene_space' exists (i.e. not None), then the mutation values are selected from the 'gene_space' parameter according to the space of values of each gene. Otherwise, it is selected randomly based on the 2 parameters 'random_mutation_min_val' and 'random_mutation_max_val'. @@ -468,14 +574,22 @@ def adaptive_mutation(self, offspring): return offspring def adaptive_mutation_by_space(self, offspring): - """ - Applies the adaptive mutation based on the 2 parameters 'mutation_num_genes' and 'gene_space'. - A number of genes are selected randomly for mutation. This number depends on the fitness of the solution. - The random values are selected from the 'gene_space' parameter. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Adaptive mutation that uses ``mutation_num_genes`` and + ``gene_space``. The number of mutated genes per offspring is + the first element of ``mutation_num_genes`` for below-average + solutions and the second element for above-average ones. New + values come from the ``gene_space``. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # For each offspring, a value from the gene space is selected randomly and assigned to the selected gene for mutation. @@ -529,14 +643,23 @@ def adaptive_mutation_by_space(self, offspring): return offspring def adaptive_mutation_randomly(self, offspring): - """ - Applies the adaptive mutation based on the 'mutation_num_genes' parameter. - A number of genes are selected randomly for mutation. This number depends on the fitness of the solution. - The random values are selected based on the 2 parameters 'random_mutation_min_val' and 'random_mutation_max_val'. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Adaptive mutation that uses ``mutation_num_genes`` and the + random-mutation range. The number of mutated genes per + offspring is the first element of ``mutation_num_genes`` for + below-average solutions and the second element for + above-average ones. New values are sampled uniformly from the + random-mutation range. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ average_fitness, offspring_fitness = self.adaptive_mutation_population_fitness(offspring) @@ -593,14 +716,23 @@ def adaptive_mutation_randomly(self, offspring): return offspring def adaptive_mutation_probs_by_space(self, offspring): - """ - Applies the adaptive mutation based on the 2 parameters 'mutation_probability' and 'gene_space'. - Based on whether the solution fitness is above or below a threshold, the mutation is applied differently by mutating a high or low number of genes. - The random values are selected based on space of values for each gene. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Adaptive mutation that uses ``mutation_probability`` and + ``gene_space``. The probability threshold per offspring is the + first element of ``mutation_probability`` for below-average + solutions and the second element for above-average ones. Each + gene is replaced with a value from its ``gene_space`` when its + random draw falls below the chosen threshold. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ # For each offspring, a value from the gene space is selected randomly and assigned to the selected gene for mutation. @@ -656,14 +788,24 @@ def adaptive_mutation_probs_by_space(self, offspring): return offspring def adaptive_mutation_probs_randomly(self, offspring): - """ - Applies the adaptive mutation based on the 'mutation_probability' parameter. - Based on whether the solution fitness is above or below a threshold, the mutation is applied differently by mutating a high or low number of genes. - The random values are selected based on the 2 parameters 'random_mutation_min_val' and 'random_mutation_max_val'. - It accepts: - -offspring: The offspring to mutate. - It returns an array of the mutated offspring. + Adaptive mutation that uses ``mutation_probability`` and the + random-mutation range. The probability threshold per offspring + is the first element of ``mutation_probability`` for + below-average solutions and the second element for + above-average ones. Each gene is replaced with a value sampled + uniformly from the random-mutation range when its random draw + falls below the chosen threshold. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (modified in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. """ average_fitness, offspring_fitness = self.adaptive_mutation_population_fitness(offspring) diff --git a/pygad/utils/nsga2.py b/pygad/utils/nsga2.py index ae74792..7c1689c 100644 --- a/pygad/utils/nsga2.py +++ b/pygad/utils/nsga2.py @@ -8,20 +8,25 @@ def __init__(self): def get_non_dominated_set(self, curr_solutions): """ - Get the set of non-dominated solutions from the current set of solutions. - + Split the input solutions into a non-dominated set and a + dominated set. The non-dominated set is the next Pareto front. + Parameters ---------- - curr_solutions : TYPE - The set of solutions to find its non-dominated set. - + curr_solutions : list + A list of (index, fitness_vector) pairs to be partitioned. + ``index`` is the position of the solution in the original + population and ``fitness_vector`` is its objective values. + Returns ------- - dominated_set : TYPE - A set of the dominated solutions. - non_dominated_set : TYPE - A set of the non-dominated solutions. - + dominated_set : list + The (index, fitness_vector) pairs that are dominated by at + least one other solution in ``curr_solutions``. + non_dominated_set : list + The (index, fitness_vector) pairs that no other solution in + ``curr_solutions`` dominates. These form the current Pareto + front. """ # List of the members of the current dominated pareto front/set. dominated_set = [] @@ -69,18 +74,34 @@ def get_non_dominated_set(self, curr_solutions): def non_dominated_sorting(self, fitness): """ - Apply non-dominated sorting over the fitness to create the pareto fronts based on the non-dominated sorting of the solutions. - + Sort the population into Pareto fronts using non-dominated + sorting. Front 0 contains the solutions no other solution + dominates; front 1 contains those that are only dominated by + front 0; and so on. + + Only works for multi-objective problems. + Parameters ---------- - fitness : TYPE - An array of the population's fitness values across all objective functions. - + fitness : numpy.ndarray + A 2D array of fitness values, one row per solution and one + column per objective. + Returns ------- - pareto_fronts : TYPE - An array of the pareto fronts. + pareto_fronts : list + A list of Pareto fronts. Each front is a numpy array whose + rows are (population_index, fitness_vector) pairs. + solutions_fronts_indices : numpy.ndarray + A 1D integer array of length ``len(fitness)``. Entry ``i`` + is the index of the Pareto front the i-th solution belongs + to. + Raises + ------ + TypeError + If the fitness rows are scalar (single-objective problem) + or of an unsupported type. """ # Verify that the problem is multi-objective optimization as non-dominated sorting is only applied to multi-objective problems. @@ -127,25 +148,36 @@ def non_dominated_sorting(self, fitness): def crowding_distance(self, pareto_front, fitness): """ - Calculate the crowding distance for all solutions in the current pareto front. - + Calculate the crowding distance for every solution in the given + Pareto front. The crowding distance measures how isolated each + solution is from its neighbours along every objective. Boundary + solutions get a crowding distance of infinity. + Parameters ---------- - pareto_front : TYPE - The set of solutions in the current pareto front. - fitness : TYPE - The fitness of the current population. - + pareto_front : numpy.ndarray + The Pareto front returned by ``non_dominated_sorting``. Each + row is a (population_index, fitness_vector) pair. + fitness : numpy.ndarray + Fitness of the entire population. Used to compute the per- + objective range that normalises the crowding distance. + Returns ------- - obj_crowding_dist_list : TYPE - A nested list of the values for all objectives alongside their crowding distance. - crowding_dist_sum : TYPE - A list of the sum of crowding distances across all objectives for each solution. - crowding_dist_front_sorted_indices : TYPE - The indices of the solutions (relative to the current front) sorted by the crowding distance. - crowding_dist_pop_sorted_indices : TYPE - The indices of the solutions (relative to the population) sorted by the crowding distance. + obj_crowding_dist_list : numpy.ndarray + A nested array with the per-objective sorted lists used + internally. Each entry is ``[front_index, objective_value, + crowding_distance]``. + crowding_dist_sum : list + A list of ``[front_index, sum_of_crowding_distances]`` pairs + sorted by the sum in descending order (highest first). + crowding_dist_front_sorted_indices : numpy.ndarray + Indices of the solutions inside ``pareto_front`` sorted by + crowding distance (best first). + crowding_dist_pop_sorted_indices : numpy.ndarray + The same ordering but mapped back to the population indices, + so the caller can use them directly against + ``self.population``. """ # Each solution in the pareto front has 2 elements: @@ -232,23 +264,36 @@ def sort_solutions_nsga2(self, fitness, find_best_solution=False): """ - Sort the solutions based on the fitness. - The sorting procedure differs based on whether the problem is single-objective or multi-objective optimization. - If it is multi-objective, then non-dominated sorting and crowding distance are applied. - At first, non-dominated sorting is applied to classify the solutions into pareto fronts. - Then the solutions inside each front are sorted using crowded distance. - The solutions inside pareto front X always come before those in front X+1. - + Sort the solutions by fitness and return their population + indices in best-to-worst order. + + For single-objective problems the sort is a plain descending + sort on the fitness value. For multi-objective problems the + sort uses non-dominated sorting and then crowding distance + inside each Pareto front; solutions in front X always come + before solutions in front X+1. + Parameters ---------- - fitness: The fitness of the entire population. - find_best_solution: Whether the method is called only to find the best solution or as part of the PyGAD lifecycle. This is to decide whether the pareto_fronts instance attribute is edited or not. + fitness : numpy.ndarray + Fitness of the entire population. + find_best_solution : bool + If True, the method is being called only to identify the + best solution and ``self.pareto_fronts`` is left untouched. + If False (the default), the method is being called as part + of the GA lifecycle and ``self.pareto_fronts`` is updated to + reflect the latest fronts. Returns ------- - solutions_sorted : TYPE - The indices of the sorted solutions. - + solutions_sorted : list + Population indices sorted from best to worst. + + Raises + ------ + TypeError + If a fitness row is neither a scalar nor a list / tuple / + numpy array. """ if type(fitness[0]) in [list, tuple, numpy.ndarray]: # Multi-objective optimization problem. diff --git a/pygad/utils/parent_selection.py b/pygad/utils/parent_selection.py index 5922369..5ce3126 100644 --- a/pygad/utils/parent_selection.py +++ b/pygad/utils/parent_selection.py @@ -10,18 +10,25 @@ def __init__(): pass def steady_state_selection(self, fitness, num_parents): - """ - Selects the parents using the steady-state selection technique. - This works by sorting the solutions based on the fitness and selecting the best ones as parents. - Later, these parents will mate to produce the offspring. - - It accepts 2 parameters: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the steady-state selection technique. The + solutions are sorted by fitness and the top ``num_parents`` are + chosen. Works for both single-objective and multi-objective + problems because the sort is delegated to ``sort_solutions_nsga2``. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. """ # Return the indices of the sorted solutions (all solutions in the population). @@ -36,16 +43,25 @@ def steady_state_selection(self, fitness, num_parents): return parents, parents_indices def rank_selection(self, fitness, num_parents): - """ - Selects the parents using the rank selection technique. Later, these parents will mate to produce the offspring. - Rank selection gives a rank from 1 to N (number of solutions) to each solution based on its fitness. - It accepts 2 parameters: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the rank selection technique. Solutions + are first sorted by fitness; rank 1 is given to the worst and + rank N to the best. The chance of being picked is proportional to + the rank. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. """ # Return the indices of the sorted solutions (all solutions in the population). @@ -57,7 +73,7 @@ def rank_selection(self, fitness, num_parents): probs = rank / numpy.sum(rank) - probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), + probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), num_parents=num_parents) parents_indices = [] @@ -76,15 +92,23 @@ def rank_selection(self, fitness, num_parents): return parents, numpy.array(parents_indices) def random_selection(self, fitness, num_parents): - """ - Selects the parents randomly. Later, these parents will mate to produce the offspring. - It accepts 2 parameters: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents at random from the current population. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + Not used by this method but kept for a uniform interface. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. """ parents = self.initialize_parents_array((num_parents, self.population.shape[1])) @@ -94,15 +118,24 @@ def random_selection(self, fitness, num_parents): return parents, rand_indices def tournament_selection(self, fitness, num_parents): - """ - Selects the parents using the tournament selection technique. Later, these parents will mate to produce the offspring. - It accepts: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the tournament selection technique. For + each parent slot, ``self.K_tournament`` candidates are picked at + random; the one with the best fitness rank wins. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. """ # Return the indices of the sorted solutions (all solutions in the population). @@ -132,21 +165,38 @@ def tournament_selection(self, fitness, num_parents): return parents, parents_indices def roulette_wheel_selection(self, fitness, num_parents): - """ - Selects the parents using the roulette wheel selection technique. Later, these parents will mate to produce the offspring. - It accepts 2 parameters: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the roulette wheel selection technique. + Each solution gets a slice of the wheel proportional to its + fitness. A random pointer is drawn for every parent slot. + + For multi-objective problems, the fitness rows are summed across + objectives so the wheel works on a single scalar per solution. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + + Raises + ------ + ZeroDivisionError + If the sum of fitness values is zero. """ ## Make edits to work with multi-objective optimization. ## The objective is to convert the fitness from M-D array to just 1D array. ## There are 2 ways: - # 1) By summing the fitness values of each solution. + # 1) By summing the fitness values of each solution. # 2) By using only 1 objective to create the roulette wheel and excluding the others. # Take the sum of the fitness values of each solution. @@ -166,7 +216,7 @@ def roulette_wheel_selection(self, fitness, num_parents): probs = fitness / fitness_sum - probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), + probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), num_parents=num_parents) parents_indices = [] @@ -185,14 +235,28 @@ def roulette_wheel_selection(self, fitness, num_parents): def wheel_cumulative_probs(self, probs, num_parents): """ - A helper function to calculate the wheel probabilities for these 2 methods: - 1) roulette_wheel_selection - 2) rank_selection - It accepts a single 1D array representing the probabilities of selecting each solution. - It returns 2 1D arrays: - 1) probs_start has the start of each range. - 2) probs_end has the end of each range. - It also returns an empty array for the parents. + Build the cumulative probability ranges used by the roulette + wheel and rank selection methods. Each solution gets a + ``[start, end)`` interval whose width is its selection + probability. + + Parameters + ---------- + probs : numpy.ndarray + A 1D array of selection probabilities, one per solution. + num_parents : int + Number of parents to pick later. Only used to allocate the + empty parents array returned to the caller. + + Returns + ------- + probs_start : numpy.ndarray + Start of each cumulative range, indexed by solution. + probs_end : numpy.ndarray + End of each cumulative range, indexed by solution. + parents : numpy.ndarray + An empty parents array with the right shape and dtype, + ready to be filled by the caller. """ probs_start = numpy.zeros(probs.shape, dtype=float) # An array holding the start values of the ranges of probabilities. @@ -209,21 +273,39 @@ def wheel_cumulative_probs(self, probs, num_parents): return probs_start, probs_end, parents def stochastic_universal_selection(self, fitness, num_parents): - """ - Selects the parents using the stochastic universal selection technique. Later, these parents will mate to produce the offspring. - It accepts 2 parameters: - -fitness: The fitness values of the solutions in the current population. - -num_parents: The number of parents to be selected. - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the stochastic universal selection + technique. Like roulette wheel but uses a set of evenly spaced + pointers drawn from a single random offset, giving a more + balanced sampling than independent random pointers. + + For multi-objective problems, the fitness rows are summed across + objectives so the wheel works on a single scalar per solution. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + + Raises + ------ + ZeroDivisionError + If the sum of fitness values is zero. """ ## Make edits to work with multi-objective optimization. ## The objective is to convert the fitness from M-D array to just 1D array. ## There are 2 ways: - # 1) By summing the fitness values of each solution. + # 1) By summing the fitness values of each solution. # 2) By using only 1 objective to create the roulette wheel and excluding the others. # Take the sum of the fitness values of each solution. @@ -243,12 +325,12 @@ def stochastic_universal_selection(self, fitness, num_parents): probs = fitness / fitness_sum - probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), + probs_start, probs_end, parents = self.wheel_cumulative_probs(probs=probs.copy(), num_parents=num_parents) pointers_distance = 1.0 / self.num_parents_mating # Distance between different pointers. - first_pointer = numpy.random.uniform(low=0.0, - high=pointers_distance, + first_pointer = numpy.random.uniform(low=0.0, + high=pointers_distance, size=1)[0] # Location of the first pointer. # Selecting the best individuals in the current generation as parents for producing the offspring of the next generation. @@ -271,27 +353,42 @@ def stochastic_universal_selection(self, fitness, num_parents): def tournament_selection_nsga2(self, fitness, num_parents): - """ - Select the parents using the tournament selection technique for NSGA-II. - The traditional tournament selection uses the fitness values. But the tournament selection for NSGA-II uses non-dominated sorting and crowding distance. - Using non-dominated sorting, the solutions are distributed across pareto fronts. The fronts are given the indices 0, 1, 2, ..., N where N is the number of pareto fronts. The lower the index of the pareto front, the better its solutions. - To select the parents solutions, 2 solutions are selected randomly. If the 2 solutions are in different pareto fronts, then the solution coming from a pareto front with lower index is selected. - If 2 solutions are in the same pareto front, then crowding distance is calculated. The solution with the higher crowding distance is selected. - If the 2 solutions are in the same pareto front and have the same crowding distance, then a solution is randomly selected. - Later, the selected parents will mate to produce the offspring. - - It accepts 2 parameters: - -fitness: The fitness values for the current population. - -num_parents: The number of parents to be selected. - -pareto_fronts: A nested array of all the pareto fronts. Each front has its solutions. - -solutions_fronts_indices: A list of the pareto front index of each solution in the current population. - - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the tournament selection variant for + NSGA-II. For each parent slot, ``self.K_tournament`` candidates + are picked at random. The winner is decided as follows: + + 1. If the candidates lie in different Pareto fronts, the one in + the front with the lowest index wins. + 2. If two or more share the same best front, the one with the + higher crowding distance wins. + 3. If they also share the same crowding distance, the winner is + picked at random. + + Only works for multi-objective problems. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + Each row must be an iterable of objective values. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + + Raises + ------ + ValueError + If the fitness function returned scalar values (the problem + is single-objective). """ - + if self.gene_type_single == True: parents = numpy.empty((num_parents, self.population.shape[1]), dtype=self.gene_type[0]) else: @@ -313,7 +410,7 @@ def tournament_selection_nsga2(self, # Randomly generate pairs of indices to apply for NSGA-II tournament selection for selecting the parents solutions. rand_indices = numpy.random.randint(low=0, - high=len(solutions_fronts_indices), + high=len(solutions_fronts_indices), size=(num_parents, self.K_tournament)) for parent_num in range(num_parents): @@ -405,31 +502,41 @@ def tournament_selection_nsga2(self, # Make sure the parents indices is returned as a NumPy array. return parents, numpy.array(parents_indices) - + def nsga2_selection(self, fitness, num_parents ): - """ - Select the parents using the Non-Dominated Sorting Genetic Algorithm II (NSGA-II). - The selection is done using non-dominated sorting and crowding distance. - Using non-dominated sorting, the solutions are distributed across pareto fronts. The fronts are given the indices 0, 1, 2, ..., N where N is the number of pareto fronts. The lower the index of the pareto front, the better its solutions. - The parents are selected from the lower pareto fronts and moving up until selecting the number of desired parents. - A solution from a pareto front X cannot be taken as a parent until all solutions in pareto front Y is selected given that Y < X. - For a pareto front X, if only a subset of its solutions is needed, then the corwding distance is used to determine which solutions to be selected from the front. The solution with the higher crowding distance is selected. - If the 2 solutions are in the same pareto front and have the same crowding distance, then a solution is randomly selected. - Later, the selected parents will mate to produce the offspring. - - It accepts 2 parameters: - -fitness: The fitness values for the current population. - -num_parents: The number of parents to be selected. - -pareto_fronts: A nested array of all the pareto fronts. Each front has its solutions. - -solutions_fronts_indices: A list of the pareto front index of each solution in the current population. - - It returns: - -An array of the selected parents. - -The indices of the selected solutions. + Select the parents using the Non-Dominated Sorting Genetic + Algorithm II (NSGA-II). The population is sorted into Pareto + fronts; whole fronts are taken in order until the next one would + overflow the requested parent count. The remaining slots are + filled from that critical front by crowding distance (higher + crowding distance wins; random pick on ties). + + Only works for multi-objective problems. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values of the solutions in the current population. + Each row must be an iterable of objective values. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + + Raises + ------ + ValueError + If the fitness function returned scalar values (the problem + is single-objective). """ if self.gene_type_single == True: @@ -477,7 +584,7 @@ def nsga2_selection(self, num_remaining_parents -= len(current_pareto_front) else: # If only a subset of the front is needed, then use the crowding distance to sort the solutions and select only the number needed. - + # Calculate the crowding distance of the solutions of the pareto front. obj_crowding_distance_list, crowding_distance_sum, crowding_dist_front_sorted_indices, crowding_dist_pop_sorted_indices = self.crowding_distance(pareto_front=current_pareto_front.copy(), fitness=fitness) @@ -489,12 +596,12 @@ def nsga2_selection(self, parents_indices.append(selected_solution_idx) # Increase the parent index. current_parent_idx += 1 - + # Decrement the number of remaining parents by the number of selected parents. num_remaining_parents -= num_remaining_parents - + # Increase the pareto front index to take parents from the next front. pareto_front_idx += 1 - + # Make sure the parents indices is returned as a NumPy array. return parents, numpy.array(parents_indices) diff --git a/pygad/utils/validation.py b/pygad/utils/validation.py index 4f69320..10920ca 100644 --- a/pygad/utils/validation.py +++ b/pygad/utils/validation.py @@ -6,13 +6,50 @@ class Validation: - def _validate_header(self, + def _validate_header(self, logger, random_seed, suppress_warnings, mutation_by_replacement, sample_size, allow_duplicate_genes): + """ + Validate the first group of constructor parameters and store + them on the GA instance. Sets up the logger (creating a + default console logger when ``logger`` is None), seeds the + random generators when ``random_seed`` is given, and persists + the four flag-style parameters on ``self``. + + Parameters + ---------- + logger : logging.Logger or None + A logger object. When None, a default console logger is + created. + random_seed : int or None + Seed for the numpy and random random generators. When + None, the generators are left in their current state. + suppress_warnings : bool + If True, ``warnings.warn`` calls inside PyGAD are skipped. + mutation_by_replacement : bool + If True, the random mutation replaces the gene value + instead of adding a random delta. + sample_size : int + Number of candidate values drawn when resolving gene + constraints and duplicates. + allow_duplicate_genes : bool + If False, duplicate genes inside a single solution are + resolved by sampling new values. + + Raises + ------ + TypeError + If ``logger`` is neither None nor a ``logging.Logger``. + TypeError + If any of the bool flags is not a bool. + ValueError + If ``sample_size`` is not a positive integer or + ``random_seed`` is of an unsupported type. + """ # If no logger is passed, then create a logger that logs the messages only to the console. if logger is None: # Create a logger named with the module name. @@ -90,6 +127,31 @@ def _validate_header(self, def _validate_gene_space(self, gene_space): + """ + Validate the ``gene_space`` parameter and store it on the GA + instance. ``gene_space`` may be None, a flat iterable that + applies to every gene, a per-gene nested iterable, or a dict + with ``low`` / ``high`` (and optional ``step``) keys that + describes a continuous range. + + Sets ``self.gene_space`` and the helper flag + ``self.gene_space_nested`` (True when each gene has its own + space). + + Parameters + ---------- + gene_space : None, list, tuple, numpy.ndarray, or dict + See the constructor documentation for the full grammar. + + Raises + ------ + TypeError + If ``gene_space`` is not one of the supported container + types. + ValueError + If a nested gene space has an unsupported element type, + or if a dict gene space is missing required keys. + """ # Validate gene_space self.gene_space_nested = False if type(gene_space) is type(None): @@ -164,6 +226,37 @@ def _validate_init_range(self, init_range_high, num_genes, initial_population): + """ + Validate the ``init_range_low`` and ``init_range_high`` + parameters used to build the initial population when the user + does not pass one explicitly. Both may be a scalar (one range + shared by every gene) or a per-gene iterable. + + Sets ``self.init_range_low`` and ``self.init_range_high`` on + the GA instance. + + Parameters + ---------- + init_range_low : numeric or iterable + Lower bound(s) for the random initial gene values. + init_range_high : numeric or iterable + Upper bound(s) for the random initial gene values. + num_genes : int or None + Number of genes per solution. Used to check the length of + the per-gene iterables. + initial_population : list / numpy.ndarray or None + The user-provided initial population, if any. Only used to + skip the length check when the population is being + inferred from it. + + Raises + ------ + TypeError + If either parameter is not a supported type. + ValueError + If the per-gene iterables have a length different from + ``num_genes``. + """ # Validate init_range_low and init_range_high if type(init_range_low) in self.supported_int_float_types: if type(init_range_high) in self.supported_int_float_types: @@ -222,6 +315,36 @@ def _validate_gene_type(self, gene_type, num_genes, initial_population): + """ + Validate the ``gene_type`` parameter and store it on the GA + instance. A gene type may be: + + - a single Python or numpy numeric type that applies to every + gene (``self.gene_type_single`` is set to True); + - a ``[type, precision]`` pair applied to every gene; + - a per-gene list of types or ``[type, precision]`` pairs + (``self.gene_type_single`` is set to False). + + Parameters + ---------- + gene_type : type, list, or tuple + The gene type specification. + num_genes : int or None + Number of genes per solution. Used to check the length of + a per-gene specification. + initial_population : list / numpy.ndarray or None + The user-provided initial population, if any. Used to + decide whether ``num_genes`` is already known. + + Raises + ------ + TypeError + If ``gene_type`` (or any of its elements) is not a + supported numeric type. + ValueError + If the per-gene specification has a length different from + ``num_genes``, or the precision is not an integer. + """ # Validate gene_type if gene_type in self.supported_int_float_types: self.gene_type = [gene_type, None] @@ -293,6 +416,47 @@ def _build_initial_population(self, gene_space, allow_duplicate_genes, gene_constraint): + """ + Build or accept the initial population and store it on the GA + instance. When ``initial_population`` is None, the population + is generated from scratch by ``initialize_population`` using + ``sol_per_pop`` and ``num_genes``. Otherwise the user-provided + array is validated, cast to the right gene types, and + de-duplicated when ``allow_duplicate_genes`` is False. + + Sets ``self.population``, ``self.initial_population``, + ``self.sol_per_pop``, ``self.num_genes`` and ``self.pop_size`` + as side effects. + + Parameters + ---------- + initial_population : list / numpy.ndarray or None + User-provided initial population. When None, the + population is built from ``sol_per_pop`` and ``num_genes``. + sol_per_pop : int or None + Number of solutions per population. Required when + ``initial_population`` is None. + num_genes : int or None + Number of genes per solution. Required when + ``initial_population`` is None. + gene_space : see ``_validate_gene_space`` + The gene space used by the duplicate resolver. + allow_duplicate_genes : bool + If False, duplicate genes inside a single solution are + resolved. + gene_constraint : list or None + Per-gene callable constraints; passed through to + ``initialize_population``. + + Raises + ------ + TypeError + If ``initial_population`` is not a list / tuple / + numpy.ndarray, or its values are not numeric. + ValueError + If ``sol_per_pop`` or ``num_genes`` is non-positive, or + ``initial_population`` is not 2-dimensional. + """ # Build the initial population if initial_population is None: if (sol_per_pop is None) or (num_genes is None): @@ -377,6 +541,29 @@ def _build_initial_population(self, def _validate_mutation_range(self, random_mutation_min_val, random_mutation_max_val): + """ + Validate the random mutation range parameters and store them + on the GA instance. Both parameters may be scalars (one range + shared by every gene) or per-gene iterables. + + Sets ``self.random_mutation_min_val`` and + ``self.random_mutation_max_val``. + + Parameters + ---------- + random_mutation_min_val : numeric or iterable + Lower bound(s) for the random delta added during mutation. + random_mutation_max_val : numeric or iterable + Upper bound(s) for the random delta added during mutation. + + Raises + ------ + TypeError + If either parameter is not a supported numeric type. + ValueError + If the per-gene iterables have a length different from + ``num_genes``. + """ # Validate random_mutation_min_val and random_mutation_max_val if type(random_mutation_min_val) in self.supported_int_float_types: if type(random_mutation_max_val) in self.supported_int_float_types: @@ -427,6 +614,28 @@ def _validate_mutation_range(self, def _validate_gene_constraint(self, gene_constraint): + """ + Validate the ``gene_constraint`` parameter. The constraint is + a list with one entry per gene; each entry is either None (no + constraint) or a callable that filters a list of candidate + values down to the subset that satisfies the constraint. + + Sets ``self.gene_constraint`` on the GA instance. + + Parameters + ---------- + gene_constraint : list, tuple, or None + One callable per gene (or None to disable). Length must + equal ``self.num_genes``. + + Raises + ------ + TypeError + If ``gene_constraint`` is not a list / tuple, or any + element is not None and not callable. + ValueError + If the list length does not match ``self.num_genes``. + """ # Validate that gene_constraint is a list or tuple and every element inside it is either None or callable. if gene_constraint: if type(gene_constraint) in [list, tuple]: @@ -461,6 +670,41 @@ def _validate_gene_constraint(self, def _validate_crossover(self, crossover_type, crossover_probability): + """ + Validate the ``crossover_type`` and ``crossover_probability`` + parameters and store them on the GA instance. ``crossover_type`` + may be: + + - one of the built-in strings (``"single_point"``, + ``"two_points"``, ``"uniform"``, ``"scattered"``); + - a callable that takes ``(parents, offspring_size)`` and + returns the offspring array; + - None to skip the crossover step entirely. + + ``crossover_probability`` is the per-parent probability of + being selected for mating; only used by the built-in operators. + + Sets ``self.crossover`` (the operator function) plus + ``self.crossover_type`` and ``self.crossover_probability``. + + Parameters + ---------- + crossover_type : str, callable, or None + The crossover operator selector. + crossover_probability : float or None + Per-parent crossover probability between 0 and 1 + inclusive, or None to disable. + + Raises + ------ + TypeError + If ``crossover_type`` is neither a string, callable, nor + None. + ValueError + If ``crossover_type`` is an unknown string, the callable + has the wrong number of parameters, or + ``crossover_probability`` is outside [0, 1]. + """ # crossover: Refers to the method that applies the crossover operator based on the selected type of crossover in the crossover_type property. # Validating the crossover type: crossover_type if crossover_type is None: @@ -531,6 +775,52 @@ def _validate_mutation(self, mutation_probability, mutation_num_genes, mutation_percent_genes): + """ + Validate the mutation-related parameters and store them on the + GA instance. ``mutation_type`` may be one of the built-in + strings (``"random"``, ``"swap"``, ``"inversion"``, + ``"scramble"``, ``"adaptive"``), a user-supplied callable, or + None to skip mutation. + + The function also resolves which of ``mutation_probability``, + ``mutation_num_genes`` and ``mutation_percent_genes`` is in + effect and translates percentages to gene counts. + + Sets ``self.mutation`` plus ``self.mutation_type``, + ``self.mutation_probability``, ``self.mutation_num_genes`` and + ``self.mutation_percent_genes``. + + Parameters + ---------- + mutation_type : str, callable, or None + The mutation operator selector. + mutation_probability : float, list, tuple, numpy.ndarray, or None + Per-gene mutation probability between 0 and 1 inclusive. + For adaptive mutation it may be a pair ``[high, low]`` + applied to below-average / above-average solutions. + mutation_num_genes : int, list, tuple, numpy.ndarray, or None + Number of genes to mutate per solution. For adaptive + mutation it may be a pair ``[high, low]``. + mutation_percent_genes : numeric, list, tuple, numpy.ndarray, or 'default' + Percentage of genes to mutate. Ignored when + ``mutation_probability`` or ``mutation_num_genes`` is set. + + Returns + ------- + mutation_num_genes : int, list, tuple, or numpy.ndarray + The resolved number of genes to mutate. + mutation_percent_genes : numeric, list, tuple, or numpy.ndarray + The resolved percentage of genes to mutate. + + Raises + ------ + TypeError + If any parameter has an unexpected type. + ValueError + If a probability is outside [0, 1], a count is non-positive + or larger than ``num_genes``, or a callable has the wrong + number of parameters. + """ # mutation: Refers to the method that applies the mutation operator based on the selected type of mutation in the mutation_type property. # Validating the mutation type: mutation_type # "adaptive" mutation is supported starting from PyGAD 2.10.0 @@ -756,6 +1046,29 @@ def _validate_mutation(self, return mutation_num_genes, mutation_percent_genes def _validate_nsga3_num_divisions(self, parent_selection_type, nsga3_num_divisions): + """ + Validate ``nsga3_num_divisions`` and store it on the GA + instance. The parameter is only required when + ``parent_selection_type`` is ``"nsga3"`` or + ``"tournament_nsga3"``; otherwise the value is accepted as-is + for forward compatibility. + + Parameters + ---------- + parent_selection_type : str + The selection operator name. Only the two NSGA-III + variants treat ``nsga3_num_divisions`` as required. + nsga3_num_divisions : int or None + Number of divisions per objective axis (the ``p`` + parameter of the Das-Dennis reference grid). + + Raises + ------ + ValueError + If ``parent_selection_type`` is one of the NSGA-III + variants and ``nsga3_num_divisions`` is None, not an + integer, or not positive. + """ if parent_selection_type not in ("nsga3", "tournament_nsga3"): self.nsga3_num_divisions = nsga3_num_divisions return @@ -783,6 +1096,50 @@ def _validate_parent_selection(self, keep_parents, keep_elitism, nsga3_num_divisions=None): + """ + Validate the parameters that control parent selection, + retention and elitism. Resolves ``parent_selection_type`` to + an actual operator (built-in string or user callable) and + stores it on ``self.select_parents``. Also computes + ``self.num_offspring`` from ``sol_per_pop``, ``keep_parents`` + and ``keep_elitism``. + + Parameters + ---------- + parent_selection_type : str or callable + One of the built-in selection names or a user-supplied + function with three parameters (fitness, num_parents, + ga_instance). + K_tournament : int + Tournament size used by the tournament-based operators. + Clipped to ``self.sol_per_pop`` when too large. + keep_parents : int + Number of parents to carry over to the next generation. + ``-1`` keeps all selected parents; ``0`` keeps none; + positive values keep exactly that many. + keep_elitism : int + Number of top solutions to copy unchanged into the next + generation. Takes priority over ``keep_parents``. + nsga3_num_divisions : int or None + Forwarded to ``_validate_nsga3_num_divisions``. + + Returns + ------- + parent_selection_type : str or callable + The (possibly lowercased) selection type stored on + ``self``. + + Raises + ------ + TypeError + If ``parent_selection_type`` is not a supported type, or + a user callable does not have three parameters, or + ``K_tournament`` / ``keep_parents`` / ``keep_elitism`` is + of the wrong type. + ValueError + If a numeric parameter is out of range, or the selection + name is unknown. + """ # select_parents: Refers to a method that selects the parents based on the parent selection type specified in the parent_selection_type attribute. # Validating the selected type of parent selection: parent_selection_type if inspect.ismethod(parent_selection_type): @@ -911,6 +1268,33 @@ def _refresh_num_offspring(self): def _validate_fitness_func(self, fitness_func, fitness_batch_size): + """ + Validate the ``fitness_func`` and ``fitness_batch_size`` + parameters and store them on the GA instance. The fitness + function must be a method or function (or a class with a + ``__call__`` method) that takes three parameters: the GA + instance, a solution (or a batch), and the solution index (or + a batch of indices). + + Sets ``self.fitness_func`` and ``self.fitness_batch_size``. + + Parameters + ---------- + fitness_func : callable + The fitness function described above. + fitness_batch_size : int or None + When set, batches of this many solutions are passed to + ``fitness_func`` at once. ``None`` or ``1`` evaluates one + solution per call. + + Raises + ------ + TypeError + If ``fitness_func`` is not callable. + ValueError + If ``fitness_func`` does not accept three parameters, or + ``fitness_batch_size`` is not a positive integer. + """ # Check if the fitness_func is a method. if inspect.ismethod(fitness_func): # Check if the fitness method accepts 3 parameters. @@ -963,6 +1347,45 @@ def _validate_callbacks(self, on_mutation, on_generation, on_stop): + """ + Validate the seven optional lifecycle callbacks and store + them on the GA instance under matching ``self.on_*`` + attributes. Each callback must be a function or method with + the expected number of parameters. + + Parameters + ---------- + on_start : callable or None + Called once before the generational loop. Receives the + GA instance. + on_fitness : callable or None + Called after the fitness of the current population has + been evaluated. Receives the GA instance and the fitness + array. + on_parents : callable or None + Called after the parent selection step. Receives the GA + instance and the selected parents. + on_crossover : callable or None + Called after the crossover step. Receives the GA instance + and the crossover offspring. + on_mutation : callable or None + Called after the mutation step. Receives the GA instance + and the mutated offspring. + on_generation : callable or None + Called after each generation completes. Receives the GA + instance. Returning the string ``"stop"`` ends the run. + on_stop : callable or None + Called once after the generational loop ends. Receives + the GA instance and the last-generation fitness array. + + Raises + ------ + TypeError + If a callback is not callable. + ValueError + If a callback does not have the expected number of + parameters. + """ # Check if the on_start exists. if not (on_start is None): if inspect.ismethod(on_start): @@ -1224,6 +1647,33 @@ def _validate_callbacks(self, def _validate_stop_criteria(self, stop_criteria): + """ + Validate the ``stop_criteria`` parameter and store the parsed + criteria on ``self.stop_criteria`` for later use by ``run``. + Each criterion follows the form ``"keyword_value"`` (or + ``"keyword_v1_v2_..."`` for multi-objective ``reach``). + Supported keywords: + + - ``"reach"``: stop when the best fitness is at least the + target value. + - ``"saturate"``: stop when the best fitness does not change + for the given number of generations. + + Parameters + ---------- + stop_criteria : str, list, tuple, or None + A single criterion string, an iterable of criterion + strings, or ``None`` to run for all generations. + + Raises + ------ + TypeError + If ``stop_criteria`` is not a string, list, tuple, or + None, or if a list element is not a string. + ValueError + If a criterion uses an unknown keyword or its value is + not a number. + """ self.stop_criteria = [] self.supported_stop_words = ["reach", "saturate"] if stop_criteria is None: @@ -1298,6 +1748,29 @@ def _validate_stop_criteria(self, def _validate_parallel_processing(self, parallel_processing): + """ + Validate the ``parallel_processing`` parameter and store the + parsed value on ``self.parallel_processing``. Supported forms: + + - ``None`` or ``0``: no parallel processing. + - positive int N: use up to N threads. + - ``["thread", N]`` or ``["process", N]``: pick the executor + family and the worker count (``N`` may be a positive int or + ``None`` for the default). + + Parameters + ---------- + parallel_processing : None, int, list, or tuple + The parallel processing specification. + + Raises + ------ + TypeError + If ``parallel_processing`` is of an unsupported type. + ValueError + If the first element is not ``"process"`` / ``"thread"``, + the worker count is invalid, or the list length is not 2. + """ # Validate the parallel_processing parameter. if parallel_processing is None: self.parallel_processing = None @@ -1341,6 +1814,41 @@ def _validate_footer(self, mutation_num_genes, save_best_solutions, save_solutions): + """ + Validate the last group of parameters and store them on the + GA instance: ``num_generations``, ``save_best_solutions``, + and ``save_solutions``. Also re-checks the + ``mutation_percent_genes`` / ``mutation_num_genes`` pair now + that ``num_genes`` has been resolved. + + Parameters + ---------- + num_generations : int + Number of generations to evolve. + parent_selection_type : str or callable + The selection operator name (used for context-specific + warnings). + mutation_percent_genes : numeric or 'default' + Percentage of genes to mutate, kept for back-compatibility. + mutation_num_genes : int, list, tuple, or None + Number of genes to mutate per solution, kept for the + same reason. + save_best_solutions : bool + If True, the best solution of every generation is saved + in ``self.best_solutions``. + save_solutions : bool + If True, every solution of every generation is saved in + ``self.solutions``. + + Raises + ------ + TypeError + If ``num_generations`` is not an integer, or + ``save_best_solutions`` / ``save_solutions`` is not a + bool. + ValueError + If ``num_generations`` is negative. + """ # Validate num_generations if type(num_generations) in self.supported_int_types: @@ -1462,6 +1970,28 @@ def validate_parameters(self, parallel_processing, random_seed, logger): + """ + Validate every parameter passed to ``pygad.GA.__init__`` and + store the parsed values on the GA instance. This method is + called from the constructor; users rarely need to call it + directly. + + Validation is split into a sequence of smaller methods + (``_validate_header``, ``_validate_gene_space``, etc.); see + their docstrings for the details of each parameter. + + Sets ``self.valid_parameters = True`` when every check + passes. When a check fails, the method sets + ``self.valid_parameters = False`` and raises the appropriate + exception so the caller never sees a partially-constructed + instance. + + Raises + ------ + TypeError, ValueError + Propagated from the per-group validators when a parameter + is of the wrong type or out of range. + """ self._validate_header(logger, random_seed, @@ -1552,6 +2082,31 @@ def validate_parameters(self, save_solutions) def validate_multi_stop_criteria(self, stop_word, number): + """ + Validate one ``(keyword, value)`` element of a + multi-objective stop criterion. Only the ``"reach"`` keyword + accepts multiple numeric values (one per objective). + + Parameters + ---------- + stop_word : str + The criterion keyword. Must be ``"reach"`` to be valid for + the multi-objective case. + number : str + The numeric value (as it appeared in the criterion + string). The method parses it into a float. + + Returns + ------- + number : float + The parsed numeric value. + + Raises + ------ + ValueError + If ``stop_word`` is not ``"reach"``, or ``number`` is not + a numeric string. + """ if stop_word == 'reach': pass else: diff --git a/pygad/visualize/plot.py b/pygad/visualize/plot.py index 73842f1..2a8f5ba 100644 --- a/pygad/visualize/plot.py +++ b/pygad/visualize/plot.py @@ -7,11 +7,17 @@ import pygad def get_matplotlib(): - # Importing matplotlib.pyplot at the module scope causes performance issues. - # This causes matplotlib.pyplot to be imported once pygad is imported. - # An efficient approach is to import matplotlib.pyplot only when needed. - # Inside each function, call get_matplotlib() to return the library object. - # If a function called get_matplotlib() once, then the library object is reused. + """ + Lazy-import ``matplotlib.pyplot``. Importing it at module scope + would force every PyGAD user to pay the matplotlib import cost + even when no plot is ever drawn. The plot methods call this + helper instead so the import happens on first use. + + Returns + ------- + matplt : module + The imported ``matplotlib.pyplot`` module. + """ import matplotlib.pyplot as matplt return matplt @@ -32,20 +38,47 @@ def plot_fitness(self, save_dir=None): """ - Creates, shows, and returns a figure that summarizes how the fitness value evolved by generation. Can only be called after completing at least 1 generation. If no generation is completed, an exception is raised. - - Accepts the following: - title: Figure title. - xlabel: Label on the X-axis. - ylabel: Label on the Y-axis. - linewidth: Line width of the plot. Defaults to 3. - font_size: Font size for the labels and title. Defaults to 14. Can be a list/tuple/numpy.ndarray if the problem is multi-objective optimization. - plot_type: Type of the plot which can be either "plot" (default), "scatter", or "bar". - color: Color of the plot which defaults to "#64f20c". Can be a list/tuple/numpy.ndarray if the problem is multi-objective optimization. - label: The label used for the legend in the figures of multi-objective problems. It is not used for single-objective problems. - save_dir: Directory to save the figure. - - Returns the figure. + Draw, show, and return a figure that traces the best fitness + across generations. For multi-objective problems, one curve + per objective is drawn on the same axes. + + Must be called after at least one generation has completed; + otherwise it raises ``RuntimeError``. + + Parameters + ---------- + title : str + Figure title. + xlabel : str + X-axis label. + ylabel : str + Y-axis label. + linewidth : numeric or iterable + Line width. Pass an iterable in multi-objective mode to + give each objective its own width. + font_size : numeric + Font size used for the title and axis labels. + plot_type : str + One of ``"plot"``, ``"scatter"``, or ``"bar"``. + color : str or iterable + Curve colour. Pass an iterable in multi-objective mode to + colour each objective independently. + label : iterable or None + Per-objective legend label for multi-objective problems. + Ignored for single-objective problems. + save_dir : str or None + If set, the figure is saved to this path before being + shown. + + Returns + ------- + fig : matplotlib.figure.Figure + The matplotlib figure that was created. + + Raises + ------ + RuntimeError + If no generation has completed yet. """ if self.generations_completed < 1: @@ -140,19 +173,44 @@ def plot_new_solution_rate(self, save_dir=None): """ - Creates, shows, and returns a figure that summarizes the rate of exploring new solutions. This method works only when save_solutions=True in the constructor of the pygad.GA class. - - Accepts the following: - title: Figure title. - xlabel: Label on the X-axis. - ylabel: Label on the Y-axis. - linewidth: Line width of the plot. Defaults to 3. - font_size: Font size for the labels and title. Defaults to 14. - plot_type: Type of the plot which can be either "plot" (default), "scatter", or "bar". - color: Color of the plot which defaults to "#64f20c". - save_dir: Directory to save the figure. - - Returns the figure. + Draw, show, and return a figure that plots how many new + (previously unseen) solutions appear in each generation. A + flat curve means the population is repeating itself; a high + curve means it is still exploring. + + Requires ``save_solutions=True`` in the GA constructor and at + least one completed generation. + + Parameters + ---------- + title : str + Figure title. + xlabel : str + X-axis label. + ylabel : str + Y-axis label. + linewidth : numeric + Line width of the curve. + font_size : numeric + Font size for title and axis labels. + plot_type : str + One of ``"plot"``, ``"scatter"``, or ``"bar"``. + color : str + Curve colour. + save_dir : str or None + If set, the figure is saved to this path before being + shown. + + Returns + ------- + fig : matplotlib.figure.Figure + The matplotlib figure that was created. + + Raises + ------ + RuntimeError + If no generation has completed yet, or if + ``save_solutions`` is False. """ if self.generations_completed < 1: @@ -214,24 +272,56 @@ def plot_genes(self, save_dir=None): """ - Creates, shows, and returns a figure with number of subplots equal to the number of genes. Each subplot shows the gene value for each generation. - This method works only when save_solutions=True in the constructor of the pygad.GA class. - It also works only after completing at least 1 generation. If no generation is completed, an exception is raised. - - Accepts the following: - title: Figure title. - xlabel: Label on the X-axis. - ylabel: Label on the Y-axis. - linewidth: Line width of the plot. Defaults to 3. - font_size: Font size for the labels and title. Defaults to 14. - plot_type: Type of the plot which can be either "plot" (default), "scatter", or "bar". - graph_type: Type of the graph which can be either "plot" (default), "boxplot", or "histogram". - fill_color: Fill color of the graph which defaults to "#64f20c". This has no effect if graph_type="plot". - color: Color of the plot which defaults to "black". - solutions: Defaults to "all" which means use all solutions. If "best" then only the best solutions are used. - save_dir: Directory to save the figure. - - Returns the figure. + Draw, show, and return a figure with one subplot per gene, + showing how that gene's value drifts across generations. The + plot can be drawn as a line ("plot"), as a boxplot per gene, + or as a histogram of values per gene. + + Requires ``save_solutions=True`` (when ``solutions="all"``) + or ``save_best_solutions=True`` (when ``solutions="best"``) + in the GA constructor and at least one completed generation. + + Parameters + ---------- + title : str + Figure title. + xlabel : str + X-axis label (used by the boxplot view). + ylabel : str + Y-axis label (used by the boxplot view). + linewidth : numeric + Line width. + font_size : numeric + Font size for the title and labels. + plot_type : str + One of ``"plot"``, ``"scatter"``, or ``"bar"``. Used when + ``graph_type="plot"``. + graph_type : str + One of ``"plot"``, ``"boxplot"``, or ``"histogram"``. + fill_color : str + Fill colour for the graph (curves, bars or boxes). + color : str + Outline / accent colour, mainly used by the boxplot view + for the whiskers, caps and medians. + solutions : str + ``"all"`` to plot every saved solution; ``"best"`` to plot + only the best solution of each generation. + save_dir : str or None + If set, the figure is saved to this path before being + shown. + + Returns + ------- + fig : matplotlib.figure.Figure + The matplotlib figure that was created. + + Raises + ------ + RuntimeError + If no generation has completed yet, if the required + ``save_solutions`` / ``save_best_solutions`` flag is + False, or if ``solutions`` is anything other than + ``"all"`` / ``"best"``. """ if self.generations_completed < 1: @@ -427,25 +517,53 @@ def plot_pareto_front_curve(self, marker="o", save_dir=None): """ - Creates, shows, and returns the pareto front curve. Can only be used with multi-objective problems. - It only works with 2 objectives. - It also works only after completing at least 1 generation. If no generation is completed, an exception is raised. - - Accepts the following: - title: Figure title. - xlabel: Label on the X-axis. - ylabel: Label on the Y-axis. - linewidth: Line width of the plot. Defaults to 3. - font_size: Font size for the labels and title. Defaults to 14. - label: The label used for the legend. - color: Color of the plot. - color_fitness: Color of the fitness points. - grid: Either True or False to control the visibility of the grid. - alpha: The transparency of the pareto front curve. - marker: The marker of the fitness points. - save_dir: Directory to save the figure. - - Returns the figure. + Draw, show, and return a 2D Pareto front curve for a + two-objective problem. The fitness of every solution in the + current population is plotted as a point, and the points on + Pareto front 0 are connected to form the curve. + + Only works for multi-objective problems with exactly two + objectives and at least one completed generation. + + Parameters + ---------- + title : str + Figure title. + xlabel : str + X-axis label (the first objective). + ylabel : str + Y-axis label (the second objective). + linewidth : numeric + Line width of the Pareto curve. + font_size : numeric + Font size for the title and labels. + label : str + Legend label for the Pareto curve. + color : str + Colour of the Pareto curve. + color_fitness : str + Colour of the per-solution fitness scatter points. + grid : bool + Whether to draw the grid lines. + alpha : float + Transparency of the Pareto curve. + marker : str + Matplotlib marker style for the fitness points. + save_dir : str or None + If set, the figure is saved to this path before being + shown. + + Returns + ------- + fig : matplotlib.figure.Figure + The matplotlib figure that was created. + + Raises + ------ + RuntimeError + If no generation has completed yet, the problem is + single-objective, or the number of objectives is not + exactly two. """ if self.generations_completed < 1: From 1051093d3da53e266325c48d3c20f40a235da894 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 20:34:53 -0400 Subject: [PATCH 04/17] More operators & support of benchmarks --- docs/source/benchmarks.md | 129 ++++++++++++ docs/source/pygad.md | 22 +- docs/source/pygad_more.md | 8 + docs/source/releases.md | 6 +- docs/source/utils.md | 27 +++ pygad/__init__.py | 2 + pygad/benchmarks/__init__.py | 17 ++ pygad/benchmarks/classic.py | 146 ++++++++++++++ pygad/benchmarks/dtlz.py | 149 ++++++++++++++ pygad/benchmarks/knapsack.py | 71 +++++++ pygad/benchmarks/zdt.py | 134 +++++++++++++ pygad/pygad.py | 6 + pygad/utils/__init__.py | 1 + pygad/utils/crossover.py | 97 +++++++++ pygad/utils/engine.py | 24 +++ pygad/utils/indicators.py | 242 ++++++++++++++++++++++ pygad/utils/mutation.py | 67 +++++++ pygad/utils/validation.py | 60 +++++- tests/test_benchmarks.py | 268 +++++++++++++++++++++++++ tests/test_indicators.py | 137 +++++++++++++ tests/test_sbx_polynomial.py | 171 ++++++++++++++++ tests/test_stop_criteria_extensions.py | 116 +++++++++++ 22 files changed, 1890 insertions(+), 10 deletions(-) create mode 100644 docs/source/benchmarks.md create mode 100644 pygad/benchmarks/__init__.py create mode 100644 pygad/benchmarks/classic.py create mode 100644 pygad/benchmarks/dtlz.py create mode 100644 pygad/benchmarks/knapsack.py create mode 100644 pygad/benchmarks/zdt.py create mode 100644 pygad/utils/indicators.py create mode 100644 tests/test_benchmarks.py create mode 100644 tests/test_indicators.py create mode 100644 tests/test_sbx_polynomial.py create mode 100644 tests/test_stop_criteria_extensions.py diff --git a/docs/source/benchmarks.md b/docs/source/benchmarks.md new file mode 100644 index 0000000..e26551b --- /dev/null +++ b/docs/source/benchmarks.md @@ -0,0 +1,129 @@ +# Benchmark Problems + +PyGAD ships a small collection of standard benchmark problems under `pygad.benchmarks`. Each problem is a class that can be called with the PyGAD fitness signature `(ga, solution, sol_idx)` and returns a fitness value in PyGAD's maximization format (the original minimization values are negated for you). + +Each class also exposes the attributes you usually need to set up the GA: + +- `num_genes`: number of decision variables. +- `num_objectives`: number of objectives. `1` for single-objective problems. +- `bounds`: `(low, high)` tuple of variable bounds. + +For ZDT problems and ZDT4 / ZDT6, the class also has a `pareto_front(num_points)` method that returns reference points on the true Pareto front. Pass these to the IGD or GD indicators as the `reference_front` argument. + +## Single-Objective Problems + +Available in `pygad.benchmarks.classic`: + +| Class | Global minimum | Bounds | +|---|---|---| +| `Sphere` | f(0, ..., 0) = 0 | `(-5.12, 5.12)` | +| `Rastrigin` | f(0, ..., 0) = 0 | `(-5.12, 5.12)` | +| `Rosenbrock` | f(1, ..., 1) = 0 | `(-5.0, 10.0)` | +| `Griewank` | f(0, ..., 0) = 0 | `(-600.0, 600.0)` | +| `Schwefel` | f(420.97, ..., 420.97) ≈ 0 | `(-500.0, 500.0)` | +| `Ackley` | f(0, ..., 0) = 0 | `(-32.768, 32.768)` | +| `Himmelblau` | four equal minima at f = 0 (2D only) | `(-5.0, 5.0)` | + +## Multi-Objective Problems (ZDT family) + +Available in `pygad.benchmarks.zdt`. All ZDT problems have two objectives and variables in `[0, 1]` (except ZDT4 which uses `[-5, 5]` for the rest of the variables). + +| Class | Pareto front shape | +|---|---| +| `ZDT1` | convex | +| `ZDT2` | non-convex | +| `ZDT3` | disconnected (five pieces) | +| `ZDT4` | convex, many local minima in the search space | +| `ZDT6` | non-uniform | + +## Many-Objective Problems (DTLZ family) + +Available in `pygad.benchmarks.dtlz`. All DTLZ problems support an arbitrary number of objectives `M`. The number of decision variables is `M + k - 1` where `k` is a "distance" variable count. + +| Class | Default M | Pareto front shape | +|---|---|---| +| `DTLZ1` | 3 | linear hyperplane (`sum(f_i) = 0.5`) | +| `DTLZ2` | 3 | unit sphere first orthant | +| `DTLZ3` | 3 | unit sphere with hard multimodal g-function | +| `DTLZ4` | 3 | unit sphere with strong bias toward one corner | + +## Combinatorial Problems + +Available in `pygad.benchmarks.knapsack`. The 0/1 `Knapsack` class takes three arguments: a 1D array of item `weights`, a 1D array of item `values`, and a numeric `capacity`. A solution is a binary vector where a 1 means the item is picked. The fitness is the total value when the candidate is within the capacity, and a negative penalty scaled by how much the candidate is over the limit otherwise. + +The class exposes `gene_space=[0, 1]` and `gene_type=int` so you can plug it directly into PyGAD: + +```python +import pygad +from pygad.benchmarks.knapsack import Knapsack + +problem = Knapsack(weights=[2, 3, 4, 5], + values=[3, 4, 5, 6], + capacity=5) + +ga = pygad.GA( + num_generations=50, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, +) +ga.run() +``` + +## Example: SOO + +```python +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=10) + +ga = pygad.GA( + num_generations=100, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20, +) +ga.run() +``` + +## Example: MOO + +```python +import pygad +from pygad.benchmarks.zdt import ZDT1 +from pygad.utils.indicators import inverted_generational_distance + +problem = ZDT1(num_genes=10) + +ga = pygad.GA( + num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20, +) +ga.run() + +# Measure how close the final population is to the true Pareto front +true_front = problem.pareto_front(num_points=100) +igd = inverted_generational_distance(ga.last_generation_fitness, true_front) +print(f'IGD = {igd}') +``` diff --git a/docs/source/pygad.md b/docs/source/pygad.md index da18853..6913cfb 100644 --- a/docs/source/pygad.md +++ b/docs/source/pygad.md @@ -55,12 +55,16 @@ Introduced in [PyGAD 2.0.0](https://pygad.readthedocs.io/en/latest/releases.html One or more conditions that stop the evolution early. Each criterion is a string made of a stop word and a number, like `"reach_40"`. -Two stop words are supported: +Four stop words are supported: - `reach`: stop when the fitness is greater than or equal to a given value. Example: `"reach_40"` stops once the fitness is `>= 40`. - `saturate`: stop when the fitness does not change for a given number of generations. Example: `"saturate_7"` stops if the fitness stays the same for 7 generations in a row. +- `time`: stop when the time spent inside `run()` is at least the given number of seconds. Example: `"time_30"` stops the run after 30 seconds. +- `evaluations`: stop when the number of fitness function calls made inside `run()` reaches the given count. Example: `"evaluations_1000"` stops the run once 1000 calls have been made. -Added in [PyGAD 2.15.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-15-0). +You can also pass a list of criteria; the run stops as soon as any one of them is met. + +Added in [PyGAD 2.15.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-15-0). The `time` and `evaluations` keywords were added in PyGAD 3.6.0. ::: #### Fitness Function @@ -251,12 +255,19 @@ The built-in types are: - `two_points`: two-point crossover. - `uniform`: uniform crossover. - `scattered`: scattered crossover (since [PyGAD 2.9.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-9-0)). +- `sbx`: simulated binary crossover. The standard real-coded operator. Requires the `sbx_crossover_eta` parameter. You can also pass your own crossover function (since [PyGAD 2.16.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-16-0)). See [User-Defined Crossover, Mutation, and Parent Selection Operators](https://pygad.readthedocs.io/en/latest/user_defined_operators.html#user-defined-crossover-mutation-and-parent-selection-operators). If `crossover_type=None`, the crossover step is skipped and no offspring are created, so the next generation reuses the current population (since [PyGAD 2.2.2](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-2-2)). ::: +:::{dropdown} `sbx_crossover_eta=30`: Distribution index for SBX crossover. +:animate: fade-in-slide-down + +Only used when `crossover_type` is `'sbx'`. Sets how close the children stay to the parents. A higher value means children stay closer. Must be a positive number. Defaults to `30`. +::: + :::{dropdown} `crossover_probability=None`: Chance a parent is used for crossover. :animate: fade-in-slide-down @@ -281,12 +292,19 @@ The built-in types are: - `inversion`: inversion mutation. - `scramble`: scramble mutation. - `adaptive`: adaptive mutation (since [PyGAD 2.10.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-10-0)). See [Adaptive Mutation](https://pygad.readthedocs.io/en/latest/adaptive_mutation.html#adaptive-mutation) and [Use Adaptive Mutation in PyGAD](https://pygad.readthedocs.io/en/latest/adaptive_mutation.html#use-adaptive-mutation-in-pygad). +- `polynomial`: polynomial mutation. The standard real-coded operator used together with SBX. Requires the `polynomial_mutation_eta` parameter. You can also pass your own mutation function (since [PyGAD 2.16.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-16-0)). See [User-Defined Crossover, Mutation, and Parent Selection Operators](https://pygad.readthedocs.io/en/latest/user_defined_operators.html#user-defined-crossover-mutation-and-parent-selection-operators). If `mutation_type=None`, the mutation step is skipped and the offspring are used unchanged (since [PyGAD 2.2.2](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-2-2)). ::: +:::{dropdown} `polynomial_mutation_eta=20`: Distribution index for polynomial mutation. +:animate: fade-in-slide-down + +Only used when `mutation_type` is `'polynomial'`. Sets the size of the change. A higher value means a smaller change. Must be a positive number. Defaults to `20`. +::: + :::{dropdown} `mutation_probability=None`: Per-gene chance of mutation. :animate: fade-in-slide-down diff --git a/docs/source/pygad_more.md b/docs/source/pygad_more.md index 5f665a0..8fc2e57 100644 --- a/docs/source/pygad_more.md +++ b/docs/source/pygad_more.md @@ -47,6 +47,13 @@ Print a Keras-like summary and log the outputs. Pass your own functions, methods, or classes for the fitness and callbacks. ::: +:::{grid-item-card} Benchmark Problems +:link: benchmarks +:link-type: doc + +Built-in single, multi, and many-objective benchmark problems to plug into the GA. +::: + :::: :::{toctree} @@ -58,4 +65,5 @@ generations fitness_calculation logging custom_functions +benchmarks ::: diff --git a/docs/source/releases.md b/docs/source/releases.md index c0cd96a..4708d53 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -657,7 +657,11 @@ Release Date April 8, 2026 22. Two new parent selection methods are added to support NSGA-III: 1) `nsga3_selection()` for plain NSGA-III selection, and 2) `tournament_selection_nsga3()` for the tournament variant. Use them by setting `parent_selection_type` to `'nsga3'` or `'tournament_nsga3'`. 23. A new parameter `nsga3_num_divisions` is added to the `pygad.GA` constructor. It is required when `parent_selection_type` is `'nsga3'` or `'tournament_nsga3'` and sets the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. 24. When `sol_per_pop` is smaller than the number of NSGA-III reference points, PyGAD raises a warning and grows the population to match before the generational loop starts. - +25. A new crossover operator: Simulated Binary Crossover (SBX). Use it by setting `crossover_type='sbx'`. The shape of the spread is controlled by the new `sbx_crossover_eta` parameter (default 30). +26. A new mutation operator: polynomial mutation. Use it by setting `mutation_type='polynomial'`. The size of the change is controlled by the new `polynomial_mutation_eta` parameter (default 20). +27. Two new stop criteria: `time_` stops the run when the time inside `run()` is at least the given number of seconds; `evaluations_` stops the run when the number of fitness function calls reaches the given count. New instance attribute `num_fitness_evaluations` counts the calls. +28. A new submodule `pygad.utils.indicators` with four functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. +29. A new submodule `pygad.benchmarks` with built-in benchmark problems. `pygad.benchmarks.classic` has Sphere, Rastrigin, Rosenbrock, Griewank, Schwefel, Ackley, and Himmelblau. `pygad.benchmarks.zdt` has the ZDT family (ZDT1, ZDT2, ZDT3, ZDT4, ZDT6). `pygad.benchmarks.dtlz` has DTLZ1, DTLZ2, DTLZ3, and DTLZ4. `pygad.benchmarks.knapsack` has the 0/1 Knapsack problem. Each class is callable with the PyGAD fitness signature and returns negated values (for the minimization-style problems) so PyGAD can maximize toward the original minimum. 21. Instead of using repeated code for converting the data type and rounding the genes during crossover and mutation, the `change_gene_dtype_and_round()` method is called from the `pygad.helper.misc.Helper` class. 22. Fix some documentation issues. https://github.com/ahmedfgad/GeneticAlgorithmPython/pull/336 23. Update the documentation to reflect the recent additions and changes to the library structure. diff --git a/docs/source/utils.md b/docs/source/utils.md index 626e632..cc437b3 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -12,6 +12,7 @@ The submodules in the `pygad.utils` module are: 4. `parent_selection`: Has the `ParentSelection` class that implements the parent selection operators. 5. `nsga2`: Has the `NSGA2` class that implements the Non-Dominated Sorting Genetic Algorithm II (NSGA-II). 6. `nsga3`: Has the `NSGA3` class that implements the Non-Dominated Sorting Genetic Algorithm III (NSGA-III). +7. `indicators`: Has functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. Note that the `pygad.GA` class extends all of these classes. So, the user can access any of the methods in such classes directly by the instance/object of the `pygad.GA` class. @@ -342,6 +343,32 @@ The `pygad.utils.nsga3` module has a class named `NSGA3` that implements NSGA-II 8. `nsga3_selection()`: Top-level NSGA-III parent selection routine. 9. `tournament_selection_nsga3()`: Tournament-style NSGA-III parent selection routine. +## `pygad.utils.indicators` Submodule + +The `pygad.utils.indicators` module has functions to measure the quality of a Pareto front. All functions take fitness values in PyGAD's maximization format. The functions are: + +1. `hypervolume(fitness, reference_point)`: Volume of the objective space dominated by the front. The reference point must be worse than every solution on every objective. A larger value is better. +2. `inverted_generational_distance(fitness, reference_front)`: Mean distance from each reference-front point to its nearest approximation point. Reports both convergence and diversity. A smaller value is better. +3. `generational_distance(fitness, reference_front)`: Mean distance from each approximation point to its nearest reference point. Reports convergence only. A smaller value is better. +4. `spacing(fitness)`: Standard deviation of the distance from each solution to its nearest neighbour. A smaller value means the solutions are spread more evenly. + +Example: + +```python +from pygad.utils.indicators import hypervolume, inverted_generational_distance + +# After ga.run() +fitness = ga.last_generation_fitness +reference_point = [-10.0, -10.0] # worse than every solution +hv = hypervolume(fitness, reference_point) + +# If the true Pareto front is known +from pygad.benchmarks.zdt import ZDT1 +problem = ZDT1() +true_front = problem.pareto_front(num_points=100) +igd = inverted_generational_distance(fitness, true_front) +``` + ## More about the Operators ::::{grid} 1 2 2 2 diff --git a/pygad/__init__.py b/pygad/__init__.py index 2f5215a..bd9a071 100644 --- a/pygad/__init__.py +++ b/pygad/__init__.py @@ -1,3 +1,5 @@ from .pygad import * # Relative import. +from pygad import benchmarks + from ._version import __version__ diff --git a/pygad/benchmarks/__init__.py b/pygad/benchmarks/__init__.py new file mode 100644 index 0000000..1aa3d93 --- /dev/null +++ b/pygad/benchmarks/__init__.py @@ -0,0 +1,17 @@ +""" +Standard benchmark problems for PyGAD. + +Every problem class can be called with the standard PyGAD fitness +function signature (ga, solution, sol_idx) and returns a fitness in +PyGAD's maximization format. The original minimization values are +negated so the user can plug the problem directly into PyGAD without +extra wrapping. Each class also has the attributes num_genes, +num_objectives, and bounds. +""" + +from pygad.benchmarks import classic +from pygad.benchmarks import zdt +from pygad.benchmarks import dtlz +from pygad.benchmarks import knapsack + +__all__ = ["classic", "zdt", "dtlz", "knapsack"] diff --git a/pygad/benchmarks/classic.py b/pygad/benchmarks/classic.py new file mode 100644 index 0000000..51da649 --- /dev/null +++ b/pygad/benchmarks/classic.py @@ -0,0 +1,146 @@ +""" +Classic single-objective benchmark problems. + +Every problem class can be called with the PyGAD fitness function +signature (ga, solution, sol_idx) and returns a single fitness value. +The original minimization values are negated so PyGAD can maximize +toward the original minimum. +""" + +import math + +import numpy + + +class _SingleObjectiveProblem: + """Base class with attributes shared by every classic problem.""" + num_objectives = 1 + + def __init__(self, num_genes): + self.num_genes = int(num_genes) + + +class Sphere(_SingleObjectiveProblem): + """ + Sphere function. The global minimum is at the origin where + f(x) = 0. + """ + bounds = (-5.12, 5.12) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + return -float(numpy.sum(x ** 2)) + + +class Rastrigin(_SingleObjectiveProblem): + """ + Rastrigin function. It has many local minima placed at regular + spaces. The global minimum is at the origin where f(x) = 0. + """ + bounds = (-5.12, 5.12) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + value = 10.0 * self.num_genes + numpy.sum(x ** 2 - 10.0 * numpy.cos(2.0 * math.pi * x)) + return -float(value) + + +class Rosenbrock(_SingleObjectiveProblem): + """ + Rosenbrock function. The global minimum is at x = (1, 1, ..., 1) + where f(x) = 0. The minimum sits at the bottom of a long, narrow, + banana-shaped valley. + """ + bounds = (-5.0, 10.0) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + value = numpy.sum(100.0 * (x[1:] - x[:-1] ** 2) ** 2 + (1.0 - x[:-1]) ** 2) + return -float(value) + + +class Griewank(_SingleObjectiveProblem): + """ + Griewank function. It has many local minima spread over a wide + area. The global minimum is at the origin where f(x) = 0. + """ + bounds = (-600.0, 600.0) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + sum_term = numpy.sum(x ** 2) / 4000.0 + i = numpy.arange(1, self.num_genes + 1, dtype=float) + prod_term = numpy.prod(numpy.cos(x / numpy.sqrt(i))) + value = 1.0 + sum_term - prod_term + return -float(value) + + +class Schwefel(_SingleObjectiveProblem): + """ + Schwefel function. The global minimum is at + x = (420.9687, 420.9687, ..., 420.9687) and f(x) is close to 0. + The global minimum sits far from the next-best local minimum so + the function is hard for many algorithms. + """ + bounds = (-500.0, 500.0) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + value = 418.9829 * self.num_genes - numpy.sum(x * numpy.sin(numpy.sqrt(numpy.abs(x)))) + return -float(value) + + +class Ackley(_SingleObjectiveProblem): + """ + Ackley function. It has a near-flat outer region with a deep, + narrow basin at the origin where f(x) = 0. + """ + bounds = (-32.768, 32.768) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + a = 20.0 + b = 0.2 + c = 2.0 * math.pi + term1 = -a * math.exp(-b * math.sqrt(numpy.mean(x ** 2))) + term2 = -math.exp(numpy.mean(numpy.cos(c * x))) + value = term1 + term2 + a + math.e + return -float(value) + + +class Himmelblau(_SingleObjectiveProblem): + """ + Himmelblau function. A 2D problem with four equal global minima + at f(x, y) = 0: + (3.0, 2.0), + (-2.805, 3.131), + (-3.779, -3.283), + (3.584, -1.848). + """ + bounds = (-5.0, 5.0) + + def __init__(self): + super().__init__(num_genes=2) + + def __call__(self, ga, solution, sol_idx): + x, y = float(solution[0]), float(solution[1]) + value = (x * x + y - 11.0) ** 2 + (x + y * y - 7.0) ** 2 + return -float(value) diff --git a/pygad/benchmarks/dtlz.py b/pygad/benchmarks/dtlz.py new file mode 100644 index 0000000..0c771a1 --- /dev/null +++ b/pygad/benchmarks/dtlz.py @@ -0,0 +1,149 @@ +""" +DTLZ family of multi-objective benchmark problems. + +Every problem supports an arbitrary number of objectives M and a +number of decision variables n. By convention n = M + k - 1 where k +is the number of "distance" variables. The defaults use k = 5 for +DTLZ1 and k = 10 for DTLZ2, DTLZ3, and DTLZ4. + +All fitness values are negated so PyGAD can maximize toward the +original minimum. +""" + +import math + +import numpy + + +class _DtlzProblem: + """Base class with attributes shared by every DTLZ problem.""" + bounds = (0.0, 1.0) + + def __init__(self, num_objectives, num_distance_vars): + if num_objectives < 2: + raise ValueError( + f"num_objectives must be at least 2 for the DTLZ suite, " + f"but got {num_objectives}.") + self.num_objectives = int(num_objectives) + self.num_distance_vars = int(num_distance_vars) + self.num_genes = self.num_objectives + self.num_distance_vars - 1 + + +class DTLZ1(_DtlzProblem): + """ + DTLZ1. The Pareto front is a linear hyperplane where + sum(f_i) = 0.5. The g-function has many local minima so the + problem is hard to converge. + """ + + def __init__(self, num_objectives=3, num_distance_vars=5): + super().__init__(num_objectives, num_distance_vars) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + position_vars = x[:self.num_objectives - 1] + distance_vars = x[self.num_objectives - 1:] + g_value = 100.0 * ( + self.num_distance_vars + + numpy.sum((distance_vars - 0.5) ** 2 + - numpy.cos(20.0 * math.pi * (distance_vars - 0.5))) + ) + radius = 0.5 * (1.0 + g_value) + objectives = [] + for objective_index in range(self.num_objectives): + value = radius + for cos_index in range(self.num_objectives - 1 - objective_index): + value *= position_vars[cos_index] + if objective_index > 0: + value *= (1.0 - position_vars[self.num_objectives - 1 - objective_index]) + objectives.append(-float(value)) + return objectives + + +class DTLZ2(_DtlzProblem): + """ + DTLZ2. The Pareto front is the part of the unit sphere where + sum(f_i ** 2) = 1 in the first orthant. The g-function is + simple, so the main challenge is keeping the population diverse. + """ + + def __init__(self, num_objectives=3, num_distance_vars=10): + super().__init__(num_objectives, num_distance_vars) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + position_vars = x[:self.num_objectives - 1] + distance_vars = x[self.num_objectives - 1:] + g_value = numpy.sum((distance_vars - 0.5) ** 2) + radius = 1.0 + g_value + angles = position_vars * (math.pi / 2.0) + objectives = [] + for objective_index in range(self.num_objectives): + value = radius + for cos_index in range(self.num_objectives - 1 - objective_index): + value *= math.cos(angles[cos_index]) + if objective_index > 0: + value *= math.sin(angles[self.num_objectives - 1 - objective_index]) + objectives.append(-float(value)) + return objectives + + +class DTLZ3(_DtlzProblem): + """ + DTLZ3. Same Pareto front shape as DTLZ2 (the unit sphere). But + the g-function is the hard multimodal one from DTLZ1, so the + problem is harder to converge. + """ + + def __init__(self, num_objectives=3, num_distance_vars=10): + super().__init__(num_objectives, num_distance_vars) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + position_vars = x[:self.num_objectives - 1] + distance_vars = x[self.num_objectives - 1:] + g_value = 100.0 * ( + self.num_distance_vars + + numpy.sum((distance_vars - 0.5) ** 2 + - numpy.cos(20.0 * math.pi * (distance_vars - 0.5))) + ) + radius = 1.0 + g_value + angles = position_vars * (math.pi / 2.0) + objectives = [] + for objective_index in range(self.num_objectives): + value = radius + for cos_index in range(self.num_objectives - 1 - objective_index): + value *= math.cos(angles[cos_index]) + if objective_index > 0: + value *= math.sin(angles[self.num_objectives - 1 - objective_index]) + objectives.append(-float(value)) + return objectives + + +class DTLZ4(_DtlzProblem): + """ + DTLZ4. Same shape as DTLZ2 but the position variables are raised + to a power (alpha, default 100). This makes the front strongly + biased toward one corner. + """ + + def __init__(self, num_objectives=3, num_distance_vars=10, alpha=100.0): + super().__init__(num_objectives, num_distance_vars) + self.alpha = float(alpha) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + position_vars = x[:self.num_objectives - 1] ** self.alpha + distance_vars = x[self.num_objectives - 1:] + g_value = numpy.sum((distance_vars - 0.5) ** 2) + radius = 1.0 + g_value + angles = position_vars * (math.pi / 2.0) + objectives = [] + for objective_index in range(self.num_objectives): + value = radius + for cos_index in range(self.num_objectives - 1 - objective_index): + value *= math.cos(angles[cos_index]) + if objective_index > 0: + value *= math.sin(angles[self.num_objectives - 1 - objective_index]) + objectives.append(-float(value)) + return objectives diff --git a/pygad/benchmarks/knapsack.py b/pygad/benchmarks/knapsack.py new file mode 100644 index 0000000..52283fa --- /dev/null +++ b/pygad/benchmarks/knapsack.py @@ -0,0 +1,71 @@ +""" +0/1 Knapsack benchmark problem. + +Each item has a weight and a value. The goal is to pick a subset of +items so the total value is the maximum possible while keeping the +total weight at or below the capacity. + +A solution is a binary vector of length num_items. A 1 means the +item is picked and a 0 means it is not. To plug into PyGAD use the +class attributes `gene_space` and `gene_type` directly: + + problem = Knapsack(weights=[...], values=[...], capacity=...) + ga = pygad.GA( + ..., + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + fitness_func=problem, + ) +""" + +import numpy + + +class Knapsack: + """ + 0/1 knapsack problem. + + If a candidate exceeds the capacity, the fitness is negative and + scaled by how much the solution is over the limit. So infeasible + solutions still carry useful gradient information toward the + feasible region. + """ + num_objectives = 1 + gene_space = [0, 1] + gene_type = int + + def __init__(self, weights, values, capacity): + weights = numpy.asarray(weights, dtype=float) + values = numpy.asarray(values, dtype=float) + if weights.ndim != 1: + raise ValueError( + f"weights must be a 1D array, but got shape {weights.shape}.") + if values.ndim != 1: + raise ValueError( + f"values must be a 1D array, but got shape {values.shape}.") + if weights.shape != values.shape: + raise ValueError( + f"weights and values must have the same length, but got " + f"{weights.shape[0]} weights and {values.shape[0]} values.") + if not numpy.all(weights >= 0): + raise ValueError( + "weights must be non-negative.") + if not numpy.all(values >= 0): + raise ValueError( + "values must be non-negative.") + if capacity <= 0: + raise ValueError( + f"capacity must be positive, but got {capacity}.") + self.weights = weights + self.values = values + self.capacity = float(capacity) + self.num_genes = int(weights.shape[0]) + + def __call__(self, ga, solution, sol_idx): + choice = numpy.asarray(solution, dtype=int) + total_weight = float(numpy.sum(choice * self.weights)) + total_value = float(numpy.sum(choice * self.values)) + if total_weight > self.capacity: + return -(total_weight - self.capacity) + return total_value diff --git a/pygad/benchmarks/zdt.py b/pygad/benchmarks/zdt.py new file mode 100644 index 0000000..9278819 --- /dev/null +++ b/pygad/benchmarks/zdt.py @@ -0,0 +1,134 @@ +""" +ZDT family of multi-objective benchmark problems. + +All ZDT problems have two objectives, real decision variables in +[0, 1] (except ZDT4 which uses a wider range for some variables), +and a known Pareto front. Every class has a pareto_front() method +that returns reference points on the true front in PyGAD's +maximization format (already negated). The user can pass these to +the IGD and GD indicators as the reference_front argument. +""" + +import numpy + + +class _ZdtProblem: + """Base class with attributes shared by every ZDT problem.""" + num_objectives = 2 + bounds = (0.0, 1.0) + + def __init__(self, num_genes): + self.num_genes = int(num_genes) + + +class ZDT1(_ZdtProblem): + """ + ZDT1. The Pareto front is a convex curve: + f2 = 1 - sqrt(f1) for f1 in [0, 1]. + Optimal solutions have x_0 in [0, 1] and x_i = 0 for i >= 1. + """ + + def __init__(self, num_genes=30): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + f1 = x[0] + g = 1.0 + 9.0 * numpy.sum(x[1:]) / (self.num_genes - 1) + f2 = g * (1.0 - numpy.sqrt(f1 / g)) + return [-float(f1), -float(f2)] + + def pareto_front(self, num_points=100): + f1 = numpy.linspace(0.0, 1.0, num_points) + f2 = 1.0 - numpy.sqrt(f1) + return numpy.stack([-f1, -f2], axis=1) + + +class ZDT2(_ZdtProblem): + """ + ZDT2. The Pareto front is a non-convex curve: + f2 = 1 - f1**2 for f1 in [0, 1]. + The decision variable layout is the same as ZDT1. + """ + + def __init__(self, num_genes=30): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + f1 = x[0] + g = 1.0 + 9.0 * numpy.sum(x[1:]) / (self.num_genes - 1) + f2 = g * (1.0 - (f1 / g) ** 2) + return [-float(f1), -float(f2)] + + def pareto_front(self, num_points=100): + f1 = numpy.linspace(0.0, 1.0, num_points) + f2 = 1.0 - f1 ** 2 + return numpy.stack([-f1, -f2], axis=1) + + +class ZDT3(_ZdtProblem): + """ + ZDT3. The Pareto front is made of five disconnected convex + pieces. + """ + + def __init__(self, num_genes=30): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + f1 = x[0] + g = 1.0 + 9.0 * numpy.sum(x[1:]) / (self.num_genes - 1) + h = 1.0 - numpy.sqrt(f1 / g) - (f1 / g) * numpy.sin(10.0 * numpy.pi * f1) + f2 = g * h + return [-float(f1), -float(f2)] + + +class ZDT4(_ZdtProblem): + """ + ZDT4. The first variable lives in [0, 1] but the rest live in + [-5, 5]. The Pareto front has the same shape as ZDT1 + (f2 = 1 - sqrt(f1)), but the search space has many local minima. + """ + bounds = (-5.0, 5.0) + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.asarray(solution, dtype=float) + x_first = numpy.clip(x[0], 0.0, 1.0) + rest = numpy.clip(x[1:], -5.0, 5.0) + f1 = x_first + g = (1.0 + 10.0 * (self.num_genes - 1) + + numpy.sum(rest ** 2 - 10.0 * numpy.cos(4.0 * numpy.pi * rest))) + f2 = g * (1.0 - numpy.sqrt(f1 / g)) + return [-float(f1), -float(f2)] + + def pareto_front(self, num_points=100): + f1 = numpy.linspace(0.0, 1.0, num_points) + f2 = 1.0 - numpy.sqrt(f1) + return numpy.stack([-f1, -f2], axis=1) + + +class ZDT6(_ZdtProblem): + """ + ZDT6. The Pareto front is non-uniform. Solutions cluster toward + one end of the front. + """ + + def __init__(self, num_genes=10): + super().__init__(num_genes) + + def __call__(self, ga, solution, sol_idx): + x = numpy.clip(numpy.asarray(solution, dtype=float), 0.0, 1.0) + f1 = 1.0 - numpy.exp(-4.0 * x[0]) * numpy.sin(6.0 * numpy.pi * x[0]) ** 6 + g = 1.0 + 9.0 * (numpy.sum(x[1:]) / (self.num_genes - 1)) ** 0.25 + f2 = g * (1.0 - (f1 / g) ** 2) + return [-float(f1), -float(f2)] + + def pareto_front(self, num_points=100): + f1 = numpy.linspace(0.281, 1.0, num_points) + f2 = 1.0 - f1 ** 2 + return numpy.stack([-f1, -f2], axis=1) diff --git a/pygad/pygad.py b/pygad/pygad.py index 3a18415..126c8ba 100644 --- a/pygad/pygad.py +++ b/pygad/pygad.py @@ -41,8 +41,10 @@ def __init__(self, nsga3_num_divisions=None, crossover_type="single_point", crossover_probability=None, + sbx_crossover_eta=30, mutation_type="random", mutation_probability=None, + polynomial_mutation_eta=20, mutation_by_replacement=False, mutation_percent_genes='default', mutation_num_genes=None, @@ -94,9 +96,11 @@ def __init__(self, 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. + sbx_crossover_eta: Only used when 'crossover_type' is 'sbx'. The distribution index that controls how close the children stay to the parents (higher value = closer). Defaults to 30. 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. + polynomial_mutation_eta: Only used when 'mutation_type' is 'polynomial'. The distribution index that controls how small the mutation step is (higher value = smaller step). Defaults to 20. 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. @@ -151,8 +155,10 @@ def __init__(self, nsga3_num_divisions=nsga3_num_divisions, crossover_type=crossover_type, crossover_probability=crossover_probability, + sbx_crossover_eta=sbx_crossover_eta, mutation_type=mutation_type, mutation_probability=mutation_probability, + polynomial_mutation_eta=polynomial_mutation_eta, mutation_by_replacement=mutation_by_replacement, mutation_percent_genes=mutation_percent_genes, mutation_num_genes=mutation_num_genes, diff --git a/pygad/utils/__init__.py b/pygad/utils/__init__.py index e1493d7..5086a9a 100644 --- a/pygad/utils/__init__.py +++ b/pygad/utils/__init__.py @@ -3,6 +3,7 @@ from pygad.utils import mutation from pygad.utils import nsga2 from pygad.utils import nsga3 +from pygad.utils import indicators from pygad.utils import validation from pygad.utils import engine diff --git a/pygad/utils/crossover.py b/pygad/utils/crossover.py index a43cb31..4a85f86 100644 --- a/pygad/utils/crossover.py +++ b/pygad/utils/crossover.py @@ -250,6 +250,103 @@ def uniform_crossover(self, parents, offspring_size): return offspring + def sbx_crossover(self, parents, offspring_size): + """ + Apply Simulated Binary Crossover (SBX). For each gene, the + offspring value is drawn from a distribution centered on the + parents. The spread of this distribution is set by + ``self.sbx_crossover_eta`` (a higher value means the child + stays closer to the parents). + + The bounded form is used. The per-gene bounds come from + ``get_initial_population_range``. + + Parameters + ---------- + parents : numpy.ndarray + A 2D array of parent solutions, one row per parent. + offspring_size : tuple + (num_offspring, num_genes). Shape of the offspring array + to return. + + Returns + ------- + offspring : numpy.ndarray + A 2D array of offspring with shape offspring_size. + """ + if self.gene_type_single == True: + offspring = numpy.empty(offspring_size, dtype=self.gene_type[0]) + else: + offspring = numpy.empty(offspring_size, dtype=object) + + eta = float(self.sbx_crossover_eta) + near_zero = 1e-14 + + for k in range(offspring_size[0]): + if not (self.crossover_probability is None): + probs = numpy.random.random(size=parents.shape[0]) + indices = list(set(numpy.where(probs <= self.crossover_probability)[0])) + + if len(indices) == 0: + offspring[k, :] = parents[k % parents.shape[0], :] + continue + elif len(indices) == 1: + parent1_idx = indices[0] + parent2_idx = parent1_idx + else: + indices = random.sample(indices, 2) + parent1_idx = indices[0] + parent2_idx = indices[1] + else: + parent1_idx = k % parents.shape[0] + parent2_idx = (k + 1) % parents.shape[0] + + for gene_idx in range(offspring_size[1]): + p1 = float(parents[parent1_idx, gene_idx]) + p2 = float(parents[parent2_idx, gene_idx]) + y1 = min(p1, p2) + y2 = max(p1, p2) + + if y2 - y1 < near_zero: + # The two parents have the same value on this gene. + offspring[k, gene_idx] = p1 + continue + + range_min, range_max = self.get_initial_population_range(gene_index=gene_idx) + lower = float(range_min) + upper = float(range_max) + + # Beta is the spread factor that controls how far the + # child can move away from the parents. + beta = 1.0 + 2.0 * min(y1 - lower, upper - y2) / (y2 - y1) + alpha = 2.0 - pow(beta, -(eta + 1.0)) + rand_u = numpy.random.random() + if rand_u <= 1.0 / alpha: + beta_q = pow(rand_u * alpha, 1.0 / (eta + 1.0)) + else: + beta_q = pow(1.0 / (2.0 - rand_u * alpha), 1.0 / (eta + 1.0)) + + child = 0.5 * ((y1 + y2) - beta_q * (y2 - y1)) + child = numpy.clip(child, lower, upper) + offspring[k, gene_idx] = child + + if self.allow_duplicate_genes == False: + if self.gene_space is None: + offspring[k], _, _ = self.solve_duplicate_genes_randomly(solution=offspring[k], + min_val=self.random_mutation_min_val, + max_val=self.random_mutation_max_val, + mutation_by_replacement=self.mutation_by_replacement, + gene_type=self.gene_type, + sample_size=self.sample_size) + else: + offspring[k], _, _ = self.solve_duplicate_genes_by_space(solution=offspring[k], + gene_type=self.gene_type, + sample_size=self.sample_size, + mutation_by_replacement=self.mutation_by_replacement, + build_initial_pop=False) + + return offspring + def scattered_crossover(self, parents, offspring_size): """ Apply scattered crossover. For each gene independently, the diff --git a/pygad/utils/engine.py b/pygad/utils/engine.py index e675a47..f9d56a9 100644 --- a/pygad/utils/engine.py +++ b/pygad/utils/engine.py @@ -284,6 +284,7 @@ def cal_pop_fitness(self): # Check if batch processing is used. If not, then calculate this missing fitness value. if self.fitness_batch_size in [1, None]: fitness = self.fitness_func(self, sol, sol_idx) + self.num_fitness_evaluations += 1 if type(fitness) in self.supported_int_float_types: # The fitness function returns a single numeric value. # This is a single-objective optimization problem. @@ -318,6 +319,7 @@ def cal_pop_fitness(self): batch_fitness = self.fitness_func( self, batch_solutions, batch_indices) + self.num_fitness_evaluations += len(batch_indices) if type(batch_fitness) not in [list, tuple, numpy.ndarray]: raise TypeError(f"Expected to receive a list, tuple, or numpy.ndarray from the fitness function but the value ({batch_fitness}) of type {type(batch_fitness)}.") elif len(numpy.array(batch_fitness)) != len(batch_indices): @@ -394,6 +396,7 @@ def cal_pop_fitness(self): # Check if batch processing is used. If not, then calculate the fitness value for individual solutions. if self.fitness_batch_size in [1, None]: + self.num_fitness_evaluations += len(solutions_to_submit_indices) for index, fitness in zip(solutions_to_submit_indices, executor.map(self.fitness_func, [self]*len(solutions_to_submit_indices), solutions_to_submit, solutions_to_submit_indices)): if type(fitness) in self.supported_int_float_types: # The fitness function returns a single numeric value. @@ -424,6 +427,7 @@ def cal_pop_fitness(self): batches_solutions.append(batch_solutions) batches_indices.append(batch_indices) + self.num_fitness_evaluations += sum(len(b) for b in batches_indices) for batch_indices, batch_fitness in zip(batches_indices, executor.map(self.fitness_func, [self]*len(solutions_to_submit_indices), batches_solutions, batches_indices)): if type(batch_fitness) not in [list, tuple, numpy.ndarray]: raise TypeError(f"Expected to receive a list, tuple, or numpy.ndarray from the fitness function but the value ({batch_fitness}) of type {type(batch_fitness)}.") @@ -498,6 +502,13 @@ def run(self): if not (self.on_start is None): self.on_start(self) + # Reset the counters used by the "evaluations_" and + # "time_" stop criteria. Each run() call should + # only count the work it did itself. + self.num_fitness_evaluations = 0 + import time as _time + self.run_start_time = _time.monotonic() + stop_run = False # To continue from where we stopped, the first generation index should start from the value of the 'self.generations_completed' parameter. @@ -634,6 +645,19 @@ def run(self): else: stop_run = False break + elif criterion[0] == "time": + # Stop when the time spent inside run() + # passes the user limit. + import time as _time + if _time.monotonic() - self.run_start_time >= float(criterion[1]): + stop_run = True + break + elif criterion[0] == "evaluations": + # Stop when the number of fitness calls + # reaches the user limit. + if self.num_fitness_evaluations >= int(criterion[1]): + stop_run = True + break if stop_run: break diff --git a/pygad/utils/indicators.py b/pygad/utils/indicators.py new file mode 100644 index 0000000..7d3ae01 --- /dev/null +++ b/pygad/utils/indicators.py @@ -0,0 +1,242 @@ +""" +Quality indicators for multi-objective optimization problems. + +The module has four common indicators that the user can use to check +the quality of a Pareto front built by PyGAD: + +1. hypervolume: volume of the objective space dominated by the front. +2. inverted_generational_distance: mean distance from each reference + point to its nearest approximation point. +3. generational_distance: mean distance from each approximation point + to its nearest reference point. +4. spacing: how evenly the approximation points are spread. + +All functions expect fitness values in PyGAD's maximization format +(higher means better). The reference point passed to hypervolume must +be worse than every solution on every axis. +""" + +import numpy + + +def _to_min_fitness(fitness): + """ + Negate the fitness so the rest of the module can use the + minimization form that the standard hypervolume algorithm uses. + """ + return -numpy.asarray(fitness, dtype=float) + + +def _drop_dominated_under_min(points): + """ + Return the rows of points that are not dominated by any other row + under minimization. The order of the input rows is kept. + """ + n = points.shape[0] + keep = numpy.ones(n, dtype=bool) + for i in range(n): + if not keep[i]: + continue + for j in range(n): + if i == j or not keep[j]: + continue + if numpy.all(points[j] <= points[i]) and numpy.any(points[j] < points[i]): + keep[i] = False + break + return points[keep] + + +def _inclusive_hv(point, reference_point): + """ + Volume of the box whose lower corner is the point and whose upper + corner is the reference point. Returns 0 if the point does not sit + below the reference on every axis. + """ + diff = reference_point - point + if numpy.any(diff <= 0): + return 0.0 + return float(numpy.prod(diff)) + + +def _wfg_exclusive_hv(point, others, reference_point): + """ + Volume dominated only by the given point and not by any of the + other points. Uses the WFG recurrence: + + exclusive(p, others) = inclusive(p) - hv(limit(p, others)) + + where limit(p, q) pushes every other point up to the corner of p. + """ + base = _inclusive_hv(point, reference_point) + if base == 0.0 or len(others) == 0: + return base + limited = numpy.maximum(others, point) + limited = _drop_dominated_under_min(limited) + return base - _hv_under_min(limited, reference_point) + + +def _hv_under_min(points, reference_point): + """ + Hypervolume of points (under minimization) bounded by the + reference point. Uses the WFG recurrence which is fast enough + for the population sizes PyGAD usually runs. + """ + if len(points) == 0: + return 0.0 + # Sort by the last objective so the recursion stays shallow. + order = numpy.argsort(points[:, -1]) + sorted_points = points[order] + total = 0.0 + for i, point in enumerate(sorted_points): + others = sorted_points[i + 1:] + total += _wfg_exclusive_hv(point, others, reference_point) + return total + + +def hypervolume(fitness, reference_point): + """ + Return the hypervolume of the Pareto front made from every row in + fitness. The reference point is the worst case on every objective. + Under PyGAD's maximization format the reference values must be + smaller than every fitness value. + + The function negates the fitness and the reference internally so + it can use a standard hypervolume algorithm written for + minimization. The returned volume is positive. + + Parameters + ---------- + fitness : numpy.ndarray + A 2D array of fitness values of shape + (num_solutions, num_objectives). + reference_point : array-like + A 1D array of length num_objectives. Every entry must be + smaller than the matching column min of fitness. + + Returns + ------- + hv : float + The hypervolume value. A bigger value means better coverage + of the objective space. + + Raises + ------ + ValueError + If fitness is not 2D, if the reference point has the wrong + shape, or if the reference point is not worse than every + solution on every axis. + """ + fitness_arr = numpy.asarray(fitness, dtype=float) + reference_arr = numpy.asarray(reference_point, dtype=float) + if fitness_arr.ndim != 2: + raise ValueError( + f"fitness must be a 2D array, but got shape {fitness_arr.shape}.") + if reference_arr.shape != (fitness_arr.shape[1],): + raise ValueError( + f"reference_point must have shape ({fitness_arr.shape[1]},), " + f"but got {reference_arr.shape}.") + # Under PyGAD max, every solution must beat the reference on every axis. + if numpy.any(fitness_arr.min(axis=0) <= reference_arr): + raise ValueError( + "reference_point must be smaller than every solution on every " + "objective. Pick a reference smaller than the column-wise " + "minimum of the fitness matrix.") + min_fitness = _to_min_fitness(fitness_arr) + min_reference = -reference_arr + front = _drop_dominated_under_min(min_fitness) + return _hv_under_min(front, min_reference) + + +def _euclidean_distance_matrix(a, b): + """ + Return a matrix d of shape (len(a), len(b)) where d[i, j] is the + Euclidean distance between row i of a and row j of b. + """ + a = numpy.asarray(a, dtype=float) + b = numpy.asarray(b, dtype=float) + diff = a[:, None, :] - b[None, :, :] + return numpy.sqrt((diff * diff).sum(axis=2)) + + +def inverted_generational_distance(fitness, reference_front): + """ + Return the Inverted Generational Distance (IGD): the mean + Euclidean distance from each reference-front point to its nearest + point in the approximation front. + + A smaller value is better. IGD reports both convergence (how far + the approximation is from the true front) and diversity (how much + of the true front is covered). + + Parameters + ---------- + fitness : numpy.ndarray + Approximation front of shape (num_solutions, num_objectives) + in PyGAD's maximization format. + reference_front : numpy.ndarray + Reference front of shape + (num_reference_points, num_objectives) in the same format. + + Returns + ------- + igd : float + The IGD value. + """ + distance_matrix = _euclidean_distance_matrix(reference_front, fitness) + return float(distance_matrix.min(axis=1).mean()) + + +def generational_distance(fitness, reference_front): + """ + Return the Generational Distance (GD): the mean Euclidean distance + from each approximation point to its nearest reference point. + + A smaller value is better. GD only measures convergence and not + diversity. + + Parameters + ---------- + fitness : numpy.ndarray + Approximation front of shape (num_solutions, num_objectives) + in PyGAD's maximization format. + reference_front : numpy.ndarray + Reference front of shape + (num_reference_points, num_objectives) in the same format. + + Returns + ------- + gd : float + The GD value. + """ + distance_matrix = _euclidean_distance_matrix(fitness, reference_front) + return float(distance_matrix.min(axis=1).mean()) + + +def spacing(fitness): + """ + Return the spacing metric: the standard deviation of the distance + from each solution to its nearest neighbour. A smaller value means + the solutions are spread more evenly. + + Parameters + ---------- + fitness : numpy.ndarray + Approximation front of shape (num_solutions, num_objectives) + in PyGAD's maximization format. + + Returns + ------- + spacing_value : float + The spacing metric. Returns 0.0 when fewer than two solutions + are given. + """ + fitness_arr = numpy.asarray(fitness, dtype=float) + if fitness_arr.shape[0] < 2: + return 0.0 + distance_matrix = _euclidean_distance_matrix(fitness_arr, fitness_arr) + # Skip the zero distance from each point to itself. + numpy.fill_diagonal(distance_matrix, numpy.inf) + nearest_neighbour_distance = distance_matrix.min(axis=1) + mean_distance = nearest_neighbour_distance.mean() + return float(numpy.sqrt( + ((nearest_neighbour_distance - mean_distance) ** 2).mean())) diff --git a/pygad/utils/mutation.py b/pygad/utils/mutation.py index 0b8bbad..66d72e2 100644 --- a/pygad/utils/mutation.py +++ b/pygad/utils/mutation.py @@ -293,6 +293,73 @@ def mutation_probs_randomly(self, offspring): sample_size=self.sample_size) return offspring + def polynomial_mutation(self, offspring): + """ + Apply polynomial mutation. Each gene is mutated with + probability ``self.mutation_probability`` (or with probability + ``1/num_genes`` when ``mutation_probability`` is not set). + + The size of the change is set by + ``self.polynomial_mutation_eta`` (a higher value means a + smaller change). The per-gene bounds come from + ``get_initial_population_range``. + + Parameters + ---------- + offspring : numpy.ndarray + The offspring solutions to mutate (changed in place). + + Returns + ------- + offspring : numpy.ndarray + The mutated offspring. + """ + eta = float(self.polynomial_mutation_eta) + per_gene_probability = (self.mutation_probability + if self.mutation_probability is not None + else 1.0 / self.num_genes) + eta_plus_one = eta + 1.0 + near_zero = 1e-14 + + for sol_idx in range(offspring.shape[0]): + for gene_idx in range(offspring.shape[1]): + if numpy.random.random() > per_gene_probability: + continue + + range_min, range_max = self.get_initial_population_range(gene_index=gene_idx) + lower = float(range_min) + upper = float(range_max) + if upper - lower < near_zero: + continue + + gene_value = float(offspring[sol_idx, gene_idx]) + delta_lower = (gene_value - lower) / (upper - lower) + delta_upper = (upper - gene_value) / (upper - lower) + + rand_u = numpy.random.random() + if rand_u <= 0.5: + xy = 1.0 - delta_lower + val = 2.0 * rand_u + (1.0 - 2.0 * rand_u) * pow(xy, eta_plus_one) + delta_q = pow(val, 1.0 / eta_plus_one) - 1.0 + else: + xy = 1.0 - delta_upper + val = 2.0 * (1.0 - rand_u) + 2.0 * (rand_u - 0.5) * pow(xy, eta_plus_one) + delta_q = 1.0 - pow(val, 1.0 / eta_plus_one) + + new_value = gene_value + delta_q * (upper - lower) + new_value = numpy.clip(new_value, lower, upper) + offspring[sol_idx, gene_idx] = new_value + + if self.allow_duplicate_genes == False: + offspring[sol_idx], _, _ = self.solve_duplicate_genes_randomly( + solution=offspring[sol_idx], + min_val=lower, + max_val=upper, + mutation_by_replacement=True, + gene_type=self.gene_type, + sample_size=self.sample_size) + return offspring + def swap_mutation(self, offspring): """ Swap the values of two genes inside each offspring. One gene is diff --git a/pygad/utils/validation.py b/pygad/utils/validation.py index 10920ca..7d3e780 100644 --- a/pygad/utils/validation.py +++ b/pygad/utils/validation.py @@ -669,7 +669,8 @@ def _validate_gene_constraint(self, def _validate_crossover(self, crossover_type, - crossover_probability): + crossover_probability, + sbx_crossover_eta=30): """ Validate the ``crossover_type`` and ``crossover_probability`` parameters and store them on the GA instance. ``crossover_type`` @@ -751,12 +752,25 @@ def _validate_crossover(self, self.crossover = self.uniform_crossover elif crossover_type == "scattered": self.crossover = self.scattered_crossover + elif crossover_type == "sbx": + self.crossover = self.sbx_crossover else: self.valid_parameters = False - raise TypeError(f"Undefined crossover type. \nThe assigned value to the crossover_type ({crossover_type}) parameter does not refer to one of the supported crossover types which are: \n-single_point (for single point crossover)\n-two_points (for two points crossover)\n-uniform (for uniform crossover)\n-scattered (for scattered crossover).\n") + raise TypeError(f"Undefined crossover type. \nThe assigned value to the crossover_type ({crossover_type}) parameter does not refer to one of the supported crossover types which are: \n-single_point (for single point crossover)\n-two_points (for two points crossover)\n-uniform (for uniform crossover)\n-scattered (for scattered crossover)\n-sbx (for simulated binary crossover).\n") self.crossover_type = crossover_type + # Validate sbx_crossover_eta. It is only used when + # crossover_type is 'sbx', but it is stored on the instance + # in all cases so user callables can read it too. + if type(sbx_crossover_eta) not in self.supported_int_float_types or sbx_crossover_eta <= 0: + self.valid_parameters = False + raise ValueError( + f"sbx_crossover_eta must be a positive number, but got {sbx_crossover_eta!r} " + f"of type {type(sbx_crossover_eta).__name__}." + ) + self.sbx_crossover_eta = float(sbx_crossover_eta) + # Calculate the value of crossover_probability if crossover_probability is None: self.crossover_probability = None @@ -774,7 +788,8 @@ def _validate_mutation(self, mutation_type, mutation_probability, mutation_num_genes, - mutation_percent_genes): + mutation_percent_genes, + polynomial_mutation_eta=20): """ Validate the mutation-related parameters and store them on the GA instance. ``mutation_type`` may be one of the built-in @@ -870,12 +885,27 @@ def _validate_mutation(self, self.mutation = self.inversion_mutation elif mutation_type == "adaptive": self.mutation = self.adaptive_mutation + elif mutation_type == "polynomial": + self.mutation = self.polynomial_mutation else: self.valid_parameters = False - raise TypeError(f"Undefined mutation type. \nThe assigned string value to the 'mutation_type' parameter ({mutation_type}) does not refer to one of the supported mutation types which are: \n-random (for random mutation)\n-swap (for swap mutation)\n-inversion (for inversion mutation)\n-scramble (for scramble mutation)\n-adaptive (for adaptive mutation).\n") + raise TypeError(f"Undefined mutation type. \nThe assigned string value to the 'mutation_type' parameter ({mutation_type}) does not refer to one of the supported mutation types which are: \n-random (for random mutation)\n-swap (for swap mutation)\n-inversion (for inversion mutation)\n-scramble (for scramble mutation)\n-adaptive (for adaptive mutation)\n-polynomial (for polynomial mutation).\n") self.mutation_type = mutation_type + # Validate polynomial_mutation_eta. It is only used when + # mutation_type is 'polynomial', but it is stored on the + # instance in all cases so user callables can read it too. + if (type(polynomial_mutation_eta) not in self.supported_int_float_types + or polynomial_mutation_eta <= 0): + self.valid_parameters = False + raise ValueError( + f"polynomial_mutation_eta must be a positive number, but " + f"got {polynomial_mutation_eta!r} of type " + f"{type(polynomial_mutation_eta).__name__}." + ) + self.polynomial_mutation_eta = float(polynomial_mutation_eta) + # Calculate the value of mutation_probability if not (self.mutation_type is None): if mutation_probability is None: @@ -1658,6 +1688,10 @@ def _validate_stop_criteria(self, target value. - ``"saturate"``: stop when the best fitness does not change for the given number of generations. + - ``"time"``: stop when the time spent inside ``run()`` is + at least the given number of seconds. + - ``"evaluations"``: stop when the number of fitness function + calls made inside ``run()`` reaches the given count. Parameters ---------- @@ -1675,7 +1709,7 @@ def _validate_stop_criteria(self, not a number. """ self.stop_criteria = [] - self.supported_stop_words = ["reach", "saturate"] + self.supported_stop_words = ["reach", "saturate", "time", "evaluations"] if stop_criteria is None: # None: Stop after passing through all generations. self.stop_criteria = None @@ -1884,6 +1918,14 @@ def _validate_footer(self, # The number of completed generations. self.generations_completed = 0 + # Counts how many times the fitness function was called inside + # the current run(). Used by the "evaluations_" stop + # criterion. Reset to 0 at the start of each run() call. + self.num_fitness_evaluations = 0 + # Time at which the current run() call started. Used by the + # "time_" stop criterion. None outside of run(). + self.run_start_time = None + # At this point, all necessary parameters validation is done successfully, and we are sure that the parameters are valid. # Set to True when all the parameters passed in the GA class constructor are valid. self.valid_parameters = True @@ -1945,8 +1987,10 @@ def validate_parameters(self, nsga3_num_divisions, crossover_type, crossover_probability, + sbx_crossover_eta, mutation_type, mutation_probability, + polynomial_mutation_eta, mutation_by_replacement, mutation_percent_genes, mutation_num_genes, @@ -2046,12 +2090,14 @@ def validate_parameters(self, self.num_parents_mating = num_parents_mating self._validate_crossover(crossover_type, - crossover_probability) + crossover_probability, + sbx_crossover_eta=sbx_crossover_eta) mutation_num_genes, mutation_percent_genes = self._validate_mutation(mutation_type, mutation_probability, mutation_num_genes, - mutation_percent_genes) + mutation_percent_genes, + polynomial_mutation_eta=polynomial_mutation_eta) parent_selection_type = self._validate_parent_selection(parent_selection_type, K_tournament, diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py new file mode 100644 index 0000000..e5ba308 --- /dev/null +++ b/tests/test_benchmarks.py @@ -0,0 +1,268 @@ +import math + +import numpy +import pytest + +import pygad +from pygad.benchmarks import classic, zdt, dtlz, knapsack + + +# ── Classic single-objective problems ──────────────────────────────────────── + + +def test_sphere_global_minimum_at_origin(): + # The Sphere function has its global minimum at the origin where + # f(x) = 0. Under PyGAD's max convention the fitness is -0 = 0. + problem = classic.Sphere(num_genes=5) + fitness = problem(None, numpy.zeros(5), 0) + assert fitness == pytest.approx(0.0, abs=1e-12) + + +def test_rastrigin_global_minimum_at_origin(): + problem = classic.Rastrigin(num_genes=4) + fitness = problem(None, numpy.zeros(4), 0) + assert fitness == pytest.approx(0.0, abs=1e-12) + + +def test_rosenbrock_global_minimum_at_ones(): + problem = classic.Rosenbrock(num_genes=4) + fitness = problem(None, numpy.ones(4), 0) + assert fitness == pytest.approx(0.0, abs=1e-12) + + +def test_griewank_global_minimum_at_origin(): + problem = classic.Griewank(num_genes=3) + fitness = problem(None, numpy.zeros(3), 0) + assert fitness == pytest.approx(0.0, abs=1e-12) + + +def test_schwefel_global_minimum_at_420(): + problem = classic.Schwefel(num_genes=3) + fitness = problem(None, numpy.full(3, 420.9687), 0) + # The Schwefel constant is an approximation, so the fitness is + # near zero but not exactly zero. + assert fitness == pytest.approx(0.0, abs=1e-3) + + +def test_ackley_global_minimum_at_origin(): + problem = classic.Ackley(num_genes=5) + fitness = problem(None, numpy.zeros(5), 0) + assert fitness == pytest.approx(0.0, abs=1e-9) + + +def test_himmelblau_known_global_minima_all_evaluate_to_zero(): + problem = classic.Himmelblau() + minima = numpy.array([ + [3.0, 2.0], + [-2.805118, 3.131312], + [-3.779310, -3.283186], + [3.584428, -1.848126], + ]) + for x in minima: + assert problem(None, x, 0) == pytest.approx(0.0, abs=1e-4) + + +def test_sphere_integrates_with_pygad_ga_loop(): + # End-to-end check: run a few generations to confirm the problem + # class plugs into PyGAD without configuration tweaks. + problem = classic.Sphere(num_genes=5) + ga = pygad.GA(num_generations=10, + num_parents_mating=6, + fitness_func=problem, + sol_per_pop=10, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + random_seed=1, + suppress_warnings=True) + ga.run() + # Best fitness must be at most 0 (it is the negated sum of squares). + best_fitness = ga.best_solution(ga.last_generation_fitness)[1] + assert best_fitness <= 0.0 + + +# ── ZDT family ─────────────────────────────────────────────────────────────── + + +def test_zdt1_returns_two_objectives_and_pareto_front_is_convex(): + problem = zdt.ZDT1(num_genes=10) + output = problem(None, numpy.zeros(10), 0) + assert len(output) == 2 + # On the Pareto front (x_1..x_n = 0) f1 = x_0 and f2 = 1 - sqrt(f1). + optimal_solution = numpy.array([0.5] + [0.0] * 9) + f1_max, f2_max = problem(None, optimal_solution, 0) + assert f1_max == pytest.approx(-0.5) + assert f2_max == pytest.approx(-(1.0 - math.sqrt(0.5)), abs=1e-9) + + +def test_zdt1_pareto_front_values_satisfy_curve(): + front = zdt.ZDT1().pareto_front(num_points=11) + # Negate back to the original min convention so the relation + # f2 = 1 - sqrt(f1) is easy to check. + f1 = -front[:, 0] + f2 = -front[:, 1] + numpy.testing.assert_allclose(f2, 1.0 - numpy.sqrt(f1), atol=1e-9) + + +def test_zdt2_pareto_front_satisfies_curve(): + front = zdt.ZDT2().pareto_front(num_points=11) + f1 = -front[:, 0] + f2 = -front[:, 1] + numpy.testing.assert_allclose(f2, 1.0 - f1 ** 2, atol=1e-9) + + +def test_zdt3_returns_two_objectives(): + problem = zdt.ZDT3(num_genes=10) + output = problem(None, numpy.zeros(10), 0) + assert len(output) == 2 + + +def test_zdt4_returns_two_objectives_and_uses_wider_bounds(): + problem = zdt.ZDT4(num_genes=10) + assert problem.bounds == (-5.0, 5.0) + output = problem(None, numpy.zeros(10), 0) + assert len(output) == 2 + + +def test_zdt6_returns_two_objectives_with_correct_optimal_value(): + problem = zdt.ZDT6(num_genes=10) + # When all rest of the variables are 0 the front has g = 1, so + # f1 = 1 - exp(-4 * x0) * sin(6 pi x0)^6 and f2 = 1 - f1^2. + solution = numpy.array([0.1] + [0.0] * 9) + f1_max, f2_max = problem(None, solution, 0) + expected_f1 = 1.0 - math.exp(-0.4) * math.sin(0.6 * math.pi) ** 6 + expected_f2 = 1.0 - expected_f1 ** 2 + assert f1_max == pytest.approx(-expected_f1, abs=1e-9) + assert f2_max == pytest.approx(-expected_f2, abs=1e-9) + + +# ── DTLZ family ────────────────────────────────────────────────────────────── + + +def test_dtlz1_returns_three_objectives_on_pareto_optimal_solution(): + problem = dtlz.DTLZ1(num_objectives=3, num_distance_vars=5) + # Distance variables at 0.5 give g = 0, so each f_i = 0.5 * + # product of position variables (the simplex sum = 0.5). + solution = numpy.array([0.5, 0.5] + [0.5] * 5) + objectives = problem(None, solution, 0) + assert len(objectives) == 3 + assert sum(-f for f in objectives) == pytest.approx(0.5, abs=1e-12) + + +def test_dtlz2_returns_three_objectives_on_unit_sphere_pareto_solution(): + problem = dtlz.DTLZ2(num_objectives=3, num_distance_vars=10) + # Distance variables at 0.5 give g = 0, so the solution lives on + # the unit sphere in the first orthant. + solution = numpy.array([0.3, 0.7] + [0.5] * 10) + objectives = problem(None, solution, 0) + radius_squared = sum(f ** 2 for f in objectives) + assert radius_squared == pytest.approx(1.0, abs=1e-9) + + +def test_dtlz3_uses_hard_g_function(): + # When distance variables are at 0.5 the g-function evaluates to + # 0 even with DTLZ3's hard multimodal definition, so the front + # also lives on the unit sphere. + problem = dtlz.DTLZ3(num_objectives=3, num_distance_vars=10) + solution = numpy.array([0.4, 0.6] + [0.5] * 10) + objectives = problem(None, solution, 0) + radius_squared = sum(f ** 2 for f in objectives) + assert radius_squared == pytest.approx(1.0, abs=1e-9) + + +def test_dtlz4_alpha_biases_objectives_toward_one_corner(): + # With alpha large, the position variables get squashed toward 0 + # unless x is very close to 1. So with x_position = 0.5 most + # objective weight ends up on the first objective. + problem = dtlz.DTLZ4(num_objectives=3, num_distance_vars=10, alpha=100.0) + solution = numpy.array([0.5, 0.5] + [0.5] * 10) + objectives = problem(None, solution, 0) + # The first objective dominates because cos(very small angle) ≈ 1. + abs_objectives = [abs(f) for f in objectives] + assert abs_objectives[0] == max(abs_objectives) + + +def test_dtlz2_rejects_num_objectives_below_two(): + with pytest.raises(ValueError, match="num_objectives"): + dtlz.DTLZ2(num_objectives=1) + + +def test_benchmarks_module_is_importable_from_top_level(): + # Sanity check that the user-facing import path works. + assert pygad.benchmarks.classic.Sphere(num_genes=2).num_genes == 2 + assert pygad.benchmarks.zdt.ZDT1().num_objectives == 2 + assert pygad.benchmarks.dtlz.DTLZ2().num_objectives == 3 + assert pygad.benchmarks.knapsack.Knapsack( + weights=[1.0], values=[1.0], capacity=1.0).num_genes == 1 + + +# ── Knapsack ───────────────────────────────────────────────────────────────── + + +def test_knapsack_returns_sum_of_chosen_values_when_feasible(): + problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0], + values=[10.0, 20.0, 30.0], + capacity=5.0) + # Picking items 0 and 1: weight = 5 (at capacity), value = 30. + fitness = problem(None, numpy.array([1, 1, 0]), 0) + assert fitness == pytest.approx(30.0) + + +def test_knapsack_at_exact_capacity_is_considered_feasible(): + problem = knapsack.Knapsack(weights=[5.0], + values=[7.0], + capacity=5.0) + assert problem(None, numpy.array([1]), 0) == pytest.approx(7.0) + + +def test_knapsack_overweight_solution_gets_negative_fitness(): + problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0], + values=[10.0, 20.0, 30.0], + capacity=5.0) + # Picking all three items: weight = 9, over capacity by 4. + fitness = problem(None, numpy.array([1, 1, 1]), 0) + assert fitness == pytest.approx(-4.0) + + +def test_knapsack_empty_selection_has_zero_fitness(): + problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0], + values=[10.0, 20.0, 30.0], + capacity=5.0) + assert problem(None, numpy.array([0, 0, 0]), 0) == pytest.approx(0.0) + + +def test_knapsack_rejects_mismatched_lengths(): + with pytest.raises(ValueError, match="same length"): + knapsack.Knapsack(weights=[1.0, 2.0], values=[1.0], capacity=1.0) + + +def test_knapsack_rejects_non_positive_capacity(): + with pytest.raises(ValueError, match="capacity must be positive"): + knapsack.Knapsack(weights=[1.0], values=[1.0], capacity=0.0) + + +def test_knapsack_rejects_negative_weights(): + with pytest.raises(ValueError, match="weights must be non-negative"): + knapsack.Knapsack(weights=[-1.0], values=[1.0], capacity=1.0) + + +def test_knapsack_finds_optimal_solution_on_small_instance_end_to_end(): + # Classic small knapsack instance with a known optimal subset. + # Items (weight, value): (2,3), (3,4), (4,5), (5,6). + # Capacity = 5. Optimal subset = items 0 and 1 (weight 5, value 7). + problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0, 5.0], + values=[3.0, 4.0, 5.0, 6.0], + capacity=5.0) + ga = pygad.GA(num_generations=50, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + random_seed=0, + suppress_warnings=True) + ga.run() + best_solution, best_fitness, _ = ga.best_solution(ga.last_generation_fitness) + assert best_fitness == pytest.approx(7.0) + numpy.testing.assert_array_equal(best_solution, [1, 1, 0, 0]) diff --git a/tests/test_indicators.py b/tests/test_indicators.py new file mode 100644 index 0000000..2770e75 --- /dev/null +++ b/tests/test_indicators.py @@ -0,0 +1,137 @@ +import numpy +import pytest + +from pygad.utils import indicators + + +# Two-objective example used for hand-derived expected values. Under +# the PyGAD-max convention the reference point must be strictly worse +# than every solution on every objective. +TWO_OBJECTIVE_FRONT = numpy.array([ + [-1.0, -8.0], + [-3.0, -5.0], + [-6.0, -2.0], +]) +TWO_OBJECTIVE_REFERENCE = numpy.array([-10.0, -10.0]) + +# A second front used to verify IGD / GD assertions. +APPROXIMATION_FRONT = numpy.array([ + [-1.0, -8.0], + [-4.0, -4.0], + [-7.0, -1.0], +]) + + +def test_hypervolume_two_d_matches_hand_computation(): + # Negate the points to switch to minimisation: + # ref = (10, 10), points = (1, 8), (3, 5), (6, 2) + # The dominated area (computed by slicing the front from left to + # right) is 4 + 15 + 32 = 51. + expected_hv = 4.0 + 15.0 + 32.0 + hv = indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) + assert hv == pytest.approx(expected_hv, abs=1e-9) + + +def test_hypervolume_single_solution_equals_box_volume(): + # Single non-dominated point at (-2, -3) with reference (-10, -10). + # Negated: point (2, 3), ref (10, 10). Box volume = (10-2) * (10-3) + # = 8 * 7 = 56. + fitness = numpy.array([[-2.0, -3.0]]) + reference = numpy.array([-10.0, -10.0]) + assert indicators.hypervolume(fitness, reference) == pytest.approx(56.0) + + +def test_hypervolume_drops_dominated_solutions(): + # The third row is dominated by both other rows. Adding it must + # not change the hypervolume. + extra = numpy.vstack([TWO_OBJECTIVE_FRONT, [[-4.0, -6.0]]]) + hv_clean = indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) + hv_with_dominated = indicators.hypervolume(extra, TWO_OBJECTIVE_REFERENCE) + assert hv_clean == pytest.approx(hv_with_dominated, abs=1e-9) + + +def test_hypervolume_rejects_reference_point_inside_front(): + # The reference point must be strictly worse than every solution. + fitness = numpy.array([[-1.0, -2.0], [-3.0, -1.0]]) + bad_reference = numpy.array([0.0, 0.0]) + with pytest.raises(ValueError, match="smaller than every solution"): + indicators.hypervolume(fitness, bad_reference) + + +def test_hypervolume_three_d_axis_aligned_extremes(): + # Three axis-extreme solutions under PyGAD max: + # (-1, 0, 0), (0, -1, 0), (0, 0, -1). + # Negated to minimisation: + # (1, 0, 0), (0, 1, 0), (0, 0, 1) with reference (2, 2, 2). + # Each solution dominates a 1 x 2 x 2 box of volume 4, but they + # overlap. By inclusion-exclusion the union has volume + # 4 + 4 + 4 - 2 - 2 - 2 + 1 = 7. + fitness = numpy.array([ + [-1.0, 0.0, 0.0], + [ 0.0, -1.0, 0.0], + [ 0.0, 0.0, -1.0], + ]) + reference = numpy.array([-2.0, -2.0, -2.0]) + hv = indicators.hypervolume(fitness, reference) + assert hv == pytest.approx(7.0, abs=1e-9) + + +def test_inverted_generational_distance_zero_when_approximation_matches_reference(): + igd = indicators.inverted_generational_distance( + TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_FRONT) + assert igd == pytest.approx(0.0, abs=1e-12) + + +def test_inverted_generational_distance_matches_hand_value(): + # For every row of TWO_OBJECTIVE_FRONT find the nearest row in + # APPROXIMATION_FRONT under Euclidean distance, then average. + # Hand check: + # ref (-1, -8) closest to approx (-1, -8) = distance 0 + # ref (-3, -5) closest to approx (-4, -4) = sqrt(1 + 1) = sqrt(2) + # ref (-6, -2) closest to approx (-7, -1) = sqrt(1 + 1) = sqrt(2) + expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 + igd = indicators.inverted_generational_distance( + APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) + assert igd == pytest.approx(expected, abs=1e-12) + + +def test_generational_distance_matches_hand_value(): + # For every row of APPROXIMATION_FRONT find the nearest row in + # TWO_OBJECTIVE_FRONT, then average. + expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 + gd = indicators.generational_distance( + APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) + assert gd == pytest.approx(expected, abs=1e-12) + + +def test_spacing_zero_for_equally_spaced_points(): + # Three colinear points equally spaced give nearest-neighbour + # distances [1, 1, 1] (each endpoint sees its closest neighbour at + # distance 1). The standard deviation is therefore 0. + fitness = numpy.array([ + [0.0, 0.0], + [1.0, 0.0], + [2.0, 0.0], + ]) + assert indicators.spacing(fitness) == pytest.approx(0.0, abs=1e-12) + + +def test_spacing_for_single_solution_returns_zero(): + # The metric is undefined for a single point; the implementation + # short-circuits to 0.0 so the user does not have to special-case + # it in their reporting code. + fitness = numpy.array([[1.0, 2.0]]) + assert indicators.spacing(fitness) == 0.0 + + +def test_hypervolume_random_four_dim_matches_pinned_value(): + # Pinned regression for a 4-objective case. The expected value + # was computed once on this exact input array and stored here so + # the test is fully self-contained (no external library calls). + rng = numpy.random.default_rng(42) + fitness_min = rng.uniform(0.0, 1.0, size=(20, 4)) + fitness_max = -fitness_min + reference_max = numpy.array([-1.5, -1.5, -1.5, -1.5]) + expected_hv = 3.5205665111978677 + hv = indicators.hypervolume(fitness_max, reference_max) + assert hv == pytest.approx(expected_hv, abs=1e-9) diff --git a/tests/test_sbx_polynomial.py b/tests/test_sbx_polynomial.py new file mode 100644 index 0000000..bf8e75a --- /dev/null +++ b/tests/test_sbx_polynomial.py @@ -0,0 +1,171 @@ +import numpy +import pytest + +import pygad + + +def _sum_fitness(ga, solution, sol_idx): + return float(numpy.sum(solution)) + + +def _make_ga(crossover_type="sbx", mutation_type="polynomial", + sbx_crossover_eta=30, polynomial_mutation_eta=20, + init_range_low=0.0, init_range_high=1.0, + num_generations=10, sol_per_pop=12, num_genes=4): + return pygad.GA(num_generations=num_generations, + num_parents_mating=6, + fitness_func=_sum_fitness, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + init_range_low=init_range_low, + init_range_high=init_range_high, + crossover_type=crossover_type, + mutation_type=mutation_type, + sbx_crossover_eta=sbx_crossover_eta, + polynomial_mutation_eta=polynomial_mutation_eta, + random_seed=42, + suppress_warnings=True) + + +def test_sbx_crossover_runs_and_keeps_population_shape(): + ga = _make_ga(mutation_type=None) + ga.run() + assert ga.population.shape == (12, 4) + + +def test_polynomial_mutation_runs_and_keeps_population_shape(): + ga = _make_ga(crossover_type="single_point") + ga.run() + assert ga.population.shape == (12, 4) + + +def test_sbx_offspring_stay_within_bounds(): + # SBX is bounded; offspring must never leave [init_range_low, + # init_range_high]. + ga = _make_ga(mutation_type=None, + init_range_low=-2.0, + init_range_high=2.0) + ga.run() + pop = numpy.asarray(ga.population, dtype=float) + assert pop.min() >= -2.0 - 1e-9 + assert pop.max() <= 2.0 + 1e-9 + + +def test_polynomial_mutation_offspring_stay_within_bounds(): + # Polynomial mutation is bounded; the mutated value must never leave + # the per-gene bounds. + ga = _make_ga(crossover_type="single_point", + init_range_low=-5.0, + init_range_high=5.0) + ga.run() + pop = numpy.asarray(ga.population, dtype=float) + assert pop.min() >= -5.0 - 1e-9 + assert pop.max() <= 5.0 + 1e-9 + + +def test_sbx_high_eta_keeps_children_close_to_parents(): + # A very large eta makes the SBX spread factor collapse so the + # child is essentially one of the parents on every gene (within + # numerical noise). Verify the offspring values are within the + # closed interval defined by the two parents on each gene. + nsga = pygad.GA(num_generations=1, num_parents_mating=2, + fitness_func=_sum_fitness, + sol_per_pop=4, num_genes=2, + init_range_low=0.0, init_range_high=1.0, + crossover_type='sbx', mutation_type=None, + sbx_crossover_eta=1e6, + random_seed=1, suppress_warnings=True) + parents = numpy.array([[0.2, 0.4], [0.6, 0.8]]) + offspring = nsga.sbx_crossover(parents, (1, 2)) + lower = numpy.minimum(parents[0], parents[1]) + upper = numpy.maximum(parents[0], parents[1]) + assert numpy.all(offspring[0] >= lower - 1e-6) + assert numpy.all(offspring[0] <= upper + 1e-6) + + +def test_polynomial_mutation_high_eta_makes_small_steps(): + # A very large eta should produce a mutated value almost equal to + # the input value because the polynomial step collapses to ~0. + ga = pygad.GA(num_generations=1, num_parents_mating=2, + fitness_func=_sum_fitness, + sol_per_pop=4, num_genes=3, + init_range_low=0.0, init_range_high=1.0, + crossover_type=None, mutation_type='polynomial', + polynomial_mutation_eta=1e6, + mutation_probability=1.0, + random_seed=7, suppress_warnings=True) + offspring = numpy.array([[0.3, 0.5, 0.7]]) + mutated = ga.polynomial_mutation(offspring.copy()) + numpy.testing.assert_allclose(mutated, offspring, atol=1e-3) + + +def test_sbx_crossover_eta_validation(): + with pytest.raises(ValueError, match="sbx_crossover_eta"): + pygad.GA(num_generations=2, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=2, + crossover_type='sbx', sbx_crossover_eta=-1, + suppress_warnings=True) + + +def test_polynomial_mutation_eta_validation(): + with pytest.raises(ValueError, match="polynomial_mutation_eta"): + pygad.GA(num_generations=2, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=2, + mutation_type='polynomial', polynomial_mutation_eta=0, + suppress_warnings=True) + + +def test_unknown_crossover_error_message_lists_sbx(): + # Make sure the user-facing error message mentions sbx as a valid + # option. + with pytest.raises(TypeError, match="sbx"): + pygad.GA(num_generations=2, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=2, + crossover_type='bogus', suppress_warnings=True) + + +def test_unknown_mutation_error_message_lists_polynomial(): + with pytest.raises(TypeError, match="polynomial"): + pygad.GA(num_generations=2, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=2, + mutation_type='bogus', suppress_warnings=True) + + +def test_sbx_with_fixed_seed_matches_pinned_output(): + # Pinned regression: with numpy.random seeded to 0 and the two + # parents below, the SBX formula must produce exactly these + # offspring values. The expected values come from the standard + # Deb-Beyer bounded SBX formula on these inputs. + ga = pygad.GA(num_generations=1, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=4, + init_range_low=0.0, init_range_high=1.0, + crossover_type='sbx', sbx_crossover_eta=30, + suppress_warnings=True) + parents = numpy.array([ + [0.2, 0.5, 0.7, 0.9], + [0.4, 0.3, 0.5, 0.1], + ]) + numpy.random.seed(0) + offspring = ga.sbx_crossover(parents, (2, 4)) + expected = numpy.array([ + [0.19966807185839858, 0.29816798996651034, 0.49925505848096274, 0.0987922279628985], + [0.20053305524715195, 0.29888084145301086, 0.500429179839271, 0.07981285137676747], + ]) + numpy.testing.assert_allclose(offspring, expected, atol=1e-12) + + +def test_polynomial_mutation_with_fixed_seed_matches_pinned_output(): + # Pinned regression: with numpy.random seeded to 0 and the input + # vector below, polynomial mutation must produce exactly these + # values. The expected values come from the standard Deb 1996 + # bounded polynomial mutation formula on these inputs. + ga = pygad.GA(num_generations=1, num_parents_mating=2, + fitness_func=_sum_fitness, sol_per_pop=4, num_genes=4, + init_range_low=0.0, init_range_high=1.0, + mutation_type='polynomial', polynomial_mutation_eta=20, + mutation_probability=1.0, suppress_warnings=True) + numpy.random.seed(0) + mutated = ga.polynomial_mutation(numpy.array([[0.5, 0.5, 0.5, 0.5]], dtype=float)) + expected = numpy.array([[0.5264432889397432, 0.5044687436392203, + 0.5162949167026651, 0.5702829850254326]]) + numpy.testing.assert_allclose(mutated, expected, atol=1e-12) diff --git a/tests/test_stop_criteria_extensions.py b/tests/test_stop_criteria_extensions.py new file mode 100644 index 0000000..dc95da6 --- /dev/null +++ b/tests/test_stop_criteria_extensions.py @@ -0,0 +1,116 @@ +import time + +import numpy +import pytest + +import pygad + + +def _slow_fitness(ga, solution, sol_idx): + # A small artificial delay so the "time" criterion can fire well + # before all generations complete. + time.sleep(0.005) + return float(numpy.sum(solution)) + + +def _fast_fitness(ga, solution, sol_idx): + return float(numpy.sum(solution)) + + +def test_max_evaluations_stops_run_after_budget_is_exhausted(): + # 50 solutions per population means the first generation alone + # uses ~50 evaluations. With keep_elitism=1 and num_parents_mating=50, + # subsequent generations evaluate only the new offspring, but the + # total still climbs past 100 well before 20 generations complete. + ga = pygad.GA(num_generations=20, + num_parents_mating=50, + fitness_func=_fast_fitness, + sol_per_pop=50, + num_genes=4, + stop_criteria="evaluations_100", + random_seed=1, + suppress_warnings=True) + ga.run() + assert ga.num_fitness_evaluations >= 100 + # The run should stop before completing all 20 generations. + assert ga.generations_completed < 20 + + +def test_max_evaluations_runs_full_when_budget_is_huge(): + # With a budget far larger than the total number of evaluations, + # the criterion never fires and all generations complete. + ga = pygad.GA(num_generations=5, + num_parents_mating=4, + fitness_func=_fast_fitness, + sol_per_pop=10, + num_genes=4, + stop_criteria="evaluations_10000", + random_seed=1, + suppress_warnings=True) + ga.run() + assert ga.generations_completed == 5 + + +def test_max_time_stops_run_after_budget_is_exhausted(): + # The slow fitness function takes ~5 ms per call. With 30 + # solutions and 50 generations, the run would normally take + # ~7.5 s. We cap at 0.2 s and expect the run to stop early. + budget_seconds = 0.2 + ga = pygad.GA(num_generations=50, + num_parents_mating=30, + fitness_func=_slow_fitness, + sol_per_pop=30, + num_genes=4, + stop_criteria=f"time_{budget_seconds}", + random_seed=1, + suppress_warnings=True) + start = time.monotonic() + ga.run() + elapsed = time.monotonic() - start + assert ga.generations_completed < 50 + # The actual elapsed time can exceed the budget slightly because + # the criterion is checked between generations. Allow a generous + # 2-second ceiling so the test stays robust on slow CI runners. + assert elapsed < 2.0 + + +def test_max_time_runs_full_when_budget_is_huge(): + ga = pygad.GA(num_generations=3, + num_parents_mating=4, + fitness_func=_fast_fitness, + sol_per_pop=8, + num_genes=4, + stop_criteria="time_3600", + random_seed=1, + suppress_warnings=True) + ga.run() + assert ga.generations_completed == 3 + + +def test_num_fitness_evaluations_resets_per_run_call(): + ga = pygad.GA(num_generations=3, + num_parents_mating=4, + fitness_func=_fast_fitness, + sol_per_pop=8, + num_genes=4, + random_seed=1, + suppress_warnings=True) + ga.run() + first_run_count = ga.num_fitness_evaluations + assert first_run_count > 0 + ga.run() + # Second call resets and counts only its own work; the count + # should not be the cumulative total of the two runs. + assert ga.num_fitness_evaluations < 2 * first_run_count + + +def test_unknown_stop_word_raises_value_error(): + with pytest.raises(ValueError, match="evaluations"): + # Sanity check: the error message lists the new stop words. + pygad.GA(num_generations=2, + num_parents_mating=2, + fitness_func=_fast_fitness, + sol_per_pop=4, + num_genes=2, + stop_criteria="bogus_5", + suppress_warnings=True) From 33fdf847b8de210298a793161e2af3e08b4c9204 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 20:48:42 -0400 Subject: [PATCH 05/17] Use quality_indicators name --- docs/source/benchmarks.md | 2 +- docs/source/releases.md | 18 ++++--------- docs/source/utils.md | 8 +++--- pygad/benchmarks/zdt.py | 2 +- pygad/utils/__init__.py | 2 +- .../{indicators.py => quality_indicators.py} | 0 ...dicators.py => test_quality_indicators.py} | 26 +++++++++---------- 7 files changed, 25 insertions(+), 33 deletions(-) rename pygad/utils/{indicators.py => quality_indicators.py} (100%) rename tests/{test_indicators.py => test_quality_indicators.py} (83%) diff --git a/docs/source/benchmarks.md b/docs/source/benchmarks.md index e26551b..1d4b721 100644 --- a/docs/source/benchmarks.md +++ b/docs/source/benchmarks.md @@ -102,7 +102,7 @@ ga.run() ```python import pygad from pygad.benchmarks.zdt import ZDT1 -from pygad.utils.indicators import inverted_generational_distance +from pygad.utils.quality_indicators import inverted_generational_distance problem = ZDT1(num_genes=10) diff --git a/docs/source/releases.md b/docs/source/releases.md index 4708d53..eb468bd 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -649,19 +649,11 @@ Release Date April 8, 2026 19. A new method called `initialize_parents_array()` is added to the `Helper` class in the `pygad/helper/misc.py` script. It is usually called from the methods in the `ParentSelection` class in the `pygad/utils/parent_selection.py` script to initialize the parents array. 20. Add more tests about: 1. Operators (crossover, mutation, and parent selection). - 2. The `best_solution()` method. - 3. Parallel processing. - 4. The `GANN` module. - 5. The plots created by the `visualize`. -21. Support of multi-objective optimization using the Non-Dominated Sorting Genetic Algorithm III (NSGA-III). NSGA-III replaces the crowding distance of NSGA-II with niching against a structured grid of reference points, so it scales better to problems with 4 or more objectives. The new `NSGA3` class lives in the new `pygad/utils/nsga3.py` script and is mixed into the `pygad.GA` class the same way `NSGA2` is. -22. Two new parent selection methods are added to support NSGA-III: 1) `nsga3_selection()` for plain NSGA-III selection, and 2) `tournament_selection_nsga3()` for the tournament variant. Use them by setting `parent_selection_type` to `'nsga3'` or `'tournament_nsga3'`. -23. A new parameter `nsga3_num_divisions` is added to the `pygad.GA` constructor. It is required when `parent_selection_type` is `'nsga3'` or `'tournament_nsga3'` and sets the number of divisions per objective axis used to build the structured reference points (the `p` parameter from Deb & Jain 2014). The total number of reference points is `C(M + p - 1, p)` where `M` is the number of objectives. -24. When `sol_per_pop` is smaller than the number of NSGA-III reference points, PyGAD raises a warning and grows the population to match before the generational loop starts. -25. A new crossover operator: Simulated Binary Crossover (SBX). Use it by setting `crossover_type='sbx'`. The shape of the spread is controlled by the new `sbx_crossover_eta` parameter (default 30). -26. A new mutation operator: polynomial mutation. Use it by setting `mutation_type='polynomial'`. The size of the change is controlled by the new `polynomial_mutation_eta` parameter (default 20). -27. Two new stop criteria: `time_` stops the run when the time inside `run()` is at least the given number of seconds; `evaluations_` stops the run when the number of fitness function calls reaches the given count. New instance attribute `num_fitness_evaluations` counts the calls. -28. A new submodule `pygad.utils.indicators` with four functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. -29. A new submodule `pygad.benchmarks` with built-in benchmark problems. `pygad.benchmarks.classic` has Sphere, Rastrigin, Rosenbrock, Griewank, Schwefel, Ackley, and Himmelblau. `pygad.benchmarks.zdt` has the ZDT family (ZDT1, ZDT2, ZDT3, ZDT4, ZDT6). `pygad.benchmarks.dtlz` has DTLZ1, DTLZ2, DTLZ3, and DTLZ4. `pygad.benchmarks.knapsack` has the 0/1 Knapsack problem. Each class is callable with the PyGAD fitness signature and returns negated values (for the minimization-style problems) so PyGAD can maximize toward the original minimum. + 2. The `best_solution()` method. + 3. Parallel processing. + 4. The `GANN` module. + 5. The plots created by the `visualize`. + 21. Instead of using repeated code for converting the data type and rounding the genes during crossover and mutation, the `change_gene_dtype_and_round()` method is called from the `pygad.helper.misc.Helper` class. 22. Fix some documentation issues. https://github.com/ahmedfgad/GeneticAlgorithmPython/pull/336 23. Update the documentation to reflect the recent additions and changes to the library structure. diff --git a/docs/source/utils.md b/docs/source/utils.md index cc437b3..b766a13 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -12,7 +12,7 @@ The submodules in the `pygad.utils` module are: 4. `parent_selection`: Has the `ParentSelection` class that implements the parent selection operators. 5. `nsga2`: Has the `NSGA2` class that implements the Non-Dominated Sorting Genetic Algorithm II (NSGA-II). 6. `nsga3`: Has the `NSGA3` class that implements the Non-Dominated Sorting Genetic Algorithm III (NSGA-III). -7. `indicators`: Has functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. +7. `quality_indicators`: Has functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. Note that the `pygad.GA` class extends all of these classes. So, the user can access any of the methods in such classes directly by the instance/object of the `pygad.GA` class. @@ -343,9 +343,9 @@ The `pygad.utils.nsga3` module has a class named `NSGA3` that implements NSGA-II 8. `nsga3_selection()`: Top-level NSGA-III parent selection routine. 9. `tournament_selection_nsga3()`: Tournament-style NSGA-III parent selection routine. -## `pygad.utils.indicators` Submodule +## `pygad.utils.quality_indicators` Submodule -The `pygad.utils.indicators` module has functions to measure the quality of a Pareto front. All functions take fitness values in PyGAD's maximization format. The functions are: +The `pygad.utils.quality_indicators` module has functions to measure the quality of a Pareto front. All functions take fitness values in PyGAD's maximization format. The functions are: 1. `hypervolume(fitness, reference_point)`: Volume of the objective space dominated by the front. The reference point must be worse than every solution on every objective. A larger value is better. 2. `inverted_generational_distance(fitness, reference_front)`: Mean distance from each reference-front point to its nearest approximation point. Reports both convergence and diversity. A smaller value is better. @@ -355,7 +355,7 @@ The `pygad.utils.indicators` module has functions to measure the quality of a Pa Example: ```python -from pygad.utils.indicators import hypervolume, inverted_generational_distance +from pygad.utils.quality_indicators import hypervolume, inverted_generational_distance # After ga.run() fitness = ga.last_generation_fitness diff --git a/pygad/benchmarks/zdt.py b/pygad/benchmarks/zdt.py index 9278819..884a6c6 100644 --- a/pygad/benchmarks/zdt.py +++ b/pygad/benchmarks/zdt.py @@ -6,7 +6,7 @@ and a known Pareto front. Every class has a pareto_front() method that returns reference points on the true front in PyGAD's maximization format (already negated). The user can pass these to -the IGD and GD indicators as the reference_front argument. +the IGD and GD quality indicators as the reference_front argument. """ import numpy diff --git a/pygad/utils/__init__.py b/pygad/utils/__init__.py index 5086a9a..c49b969 100644 --- a/pygad/utils/__init__.py +++ b/pygad/utils/__init__.py @@ -3,7 +3,7 @@ from pygad.utils import mutation from pygad.utils import nsga2 from pygad.utils import nsga3 -from pygad.utils import indicators +from pygad.utils import quality_indicators from pygad.utils import validation from pygad.utils import engine diff --git a/pygad/utils/indicators.py b/pygad/utils/quality_indicators.py similarity index 100% rename from pygad/utils/indicators.py rename to pygad/utils/quality_indicators.py diff --git a/tests/test_indicators.py b/tests/test_quality_indicators.py similarity index 83% rename from tests/test_indicators.py rename to tests/test_quality_indicators.py index 2770e75..2e37bd8 100644 --- a/tests/test_indicators.py +++ b/tests/test_quality_indicators.py @@ -1,7 +1,7 @@ import numpy import pytest -from pygad.utils import indicators +from pygad.utils import quality_indicators # Two-objective example used for hand-derived expected values. Under @@ -28,7 +28,7 @@ def test_hypervolume_two_d_matches_hand_computation(): # The dominated area (computed by slicing the front from left to # right) is 4 + 15 + 32 = 51. expected_hv = 4.0 + 15.0 + 32.0 - hv = indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) + hv = quality_indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) assert hv == pytest.approx(expected_hv, abs=1e-9) @@ -38,15 +38,15 @@ def test_hypervolume_single_solution_equals_box_volume(): # = 8 * 7 = 56. fitness = numpy.array([[-2.0, -3.0]]) reference = numpy.array([-10.0, -10.0]) - assert indicators.hypervolume(fitness, reference) == pytest.approx(56.0) + assert quality_indicators.hypervolume(fitness, reference) == pytest.approx(56.0) def test_hypervolume_drops_dominated_solutions(): # The third row is dominated by both other rows. Adding it must # not change the hypervolume. extra = numpy.vstack([TWO_OBJECTIVE_FRONT, [[-4.0, -6.0]]]) - hv_clean = indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) - hv_with_dominated = indicators.hypervolume(extra, TWO_OBJECTIVE_REFERENCE) + hv_clean = quality_indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) + hv_with_dominated = quality_indicators.hypervolume(extra, TWO_OBJECTIVE_REFERENCE) assert hv_clean == pytest.approx(hv_with_dominated, abs=1e-9) @@ -55,7 +55,7 @@ def test_hypervolume_rejects_reference_point_inside_front(): fitness = numpy.array([[-1.0, -2.0], [-3.0, -1.0]]) bad_reference = numpy.array([0.0, 0.0]) with pytest.raises(ValueError, match="smaller than every solution"): - indicators.hypervolume(fitness, bad_reference) + quality_indicators.hypervolume(fitness, bad_reference) def test_hypervolume_three_d_axis_aligned_extremes(): @@ -72,12 +72,12 @@ def test_hypervolume_three_d_axis_aligned_extremes(): [ 0.0, 0.0, -1.0], ]) reference = numpy.array([-2.0, -2.0, -2.0]) - hv = indicators.hypervolume(fitness, reference) + hv = quality_indicators.hypervolume(fitness, reference) assert hv == pytest.approx(7.0, abs=1e-9) def test_inverted_generational_distance_zero_when_approximation_matches_reference(): - igd = indicators.inverted_generational_distance( + igd = quality_indicators.inverted_generational_distance( TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_FRONT) assert igd == pytest.approx(0.0, abs=1e-12) @@ -90,7 +90,7 @@ def test_inverted_generational_distance_matches_hand_value(): # ref (-3, -5) closest to approx (-4, -4) = sqrt(1 + 1) = sqrt(2) # ref (-6, -2) closest to approx (-7, -1) = sqrt(1 + 1) = sqrt(2) expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 - igd = indicators.inverted_generational_distance( + igd = quality_indicators.inverted_generational_distance( APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) assert igd == pytest.approx(expected, abs=1e-12) @@ -99,7 +99,7 @@ def test_generational_distance_matches_hand_value(): # For every row of APPROXIMATION_FRONT find the nearest row in # TWO_OBJECTIVE_FRONT, then average. expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 - gd = indicators.generational_distance( + gd = quality_indicators.generational_distance( APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) assert gd == pytest.approx(expected, abs=1e-12) @@ -113,7 +113,7 @@ def test_spacing_zero_for_equally_spaced_points(): [1.0, 0.0], [2.0, 0.0], ]) - assert indicators.spacing(fitness) == pytest.approx(0.0, abs=1e-12) + assert quality_indicators.spacing(fitness) == pytest.approx(0.0, abs=1e-12) def test_spacing_for_single_solution_returns_zero(): @@ -121,7 +121,7 @@ def test_spacing_for_single_solution_returns_zero(): # short-circuits to 0.0 so the user does not have to special-case # it in their reporting code. fitness = numpy.array([[1.0, 2.0]]) - assert indicators.spacing(fitness) == 0.0 + assert quality_indicators.spacing(fitness) == 0.0 def test_hypervolume_random_four_dim_matches_pinned_value(): @@ -133,5 +133,5 @@ def test_hypervolume_random_four_dim_matches_pinned_value(): fitness_max = -fitness_min reference_max = numpy.array([-1.5, -1.5, -1.5, -1.5]) expected_hv = 3.5205665111978677 - hv = indicators.hypervolume(fitness_max, reference_max) + hv = quality_indicators.hypervolume(fitness_max, reference_max) assert hv == pytest.approx(expected_hv, abs=1e-9) From 1a6c5742e25eb7cfb878c7885f279c5f05725569 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 23:36:01 -0400 Subject: [PATCH 06/17] Add more examples --- docs/source/benchmarks.md | 34 ++++++ docs/source/releases.md | 2 + docs/source/utils.md | 2 + examples/benchmarks/example_classic_ackley.py | 28 +++++ .../benchmarks/example_classic_griewank.py | 28 +++++ .../benchmarks/example_classic_himmelblau.py | 32 ++++++ .../benchmarks/example_classic_rastrigin.py | 28 +++++ .../benchmarks/example_classic_rosenbrock.py | 28 +++++ .../benchmarks/example_classic_schwefel.py | 29 +++++ examples/benchmarks/example_classic_sphere.py | 28 +++++ examples/benchmarks/example_dtlz1.py | 27 +++++ examples/benchmarks/example_dtlz2.py | 26 +++++ examples/benchmarks/example_dtlz3.py | 27 +++++ examples/benchmarks/example_dtlz4.py | 28 +++++ examples/benchmarks/example_knapsack.py | 29 +++++ examples/benchmarks/example_tsp.py | 30 +++++ examples/benchmarks/example_zdt1.py | 28 +++++ examples/benchmarks/example_zdt2.py | 29 +++++ examples/benchmarks/example_zdt3.py | 28 +++++ examples/benchmarks/example_zdt4.py | 29 +++++ examples/benchmarks/example_zdt6.py | 29 +++++ .../example_generational_distance.py | 32 ++++++ .../quality_indicators/example_hypervolume.py | 39 +++++++ .../example_inverted_generational_distance.py | 32 ++++++ .../quality_indicators/example_spacing.py | 31 ++++++ pygad/benchmarks/__init__.py | 3 +- pygad/benchmarks/tsp.py | 104 ++++++++++++++++++ tests/test_benchmarks.py | 91 ++++++++++++++- 28 files changed, 879 insertions(+), 2 deletions(-) create mode 100644 examples/benchmarks/example_classic_ackley.py create mode 100644 examples/benchmarks/example_classic_griewank.py create mode 100644 examples/benchmarks/example_classic_himmelblau.py create mode 100644 examples/benchmarks/example_classic_rastrigin.py create mode 100644 examples/benchmarks/example_classic_rosenbrock.py create mode 100644 examples/benchmarks/example_classic_schwefel.py create mode 100644 examples/benchmarks/example_classic_sphere.py create mode 100644 examples/benchmarks/example_dtlz1.py create mode 100644 examples/benchmarks/example_dtlz2.py create mode 100644 examples/benchmarks/example_dtlz3.py create mode 100644 examples/benchmarks/example_dtlz4.py create mode 100644 examples/benchmarks/example_knapsack.py create mode 100644 examples/benchmarks/example_tsp.py create mode 100644 examples/benchmarks/example_zdt1.py create mode 100644 examples/benchmarks/example_zdt2.py create mode 100644 examples/benchmarks/example_zdt3.py create mode 100644 examples/benchmarks/example_zdt4.py create mode 100644 examples/benchmarks/example_zdt6.py create mode 100644 examples/quality_indicators/example_generational_distance.py create mode 100644 examples/quality_indicators/example_hypervolume.py create mode 100644 examples/quality_indicators/example_inverted_generational_distance.py create mode 100644 examples/quality_indicators/example_spacing.py create mode 100644 pygad/benchmarks/tsp.py diff --git a/docs/source/benchmarks.md b/docs/source/benchmarks.md index 1d4b721..7c3bc07 100644 --- a/docs/source/benchmarks.md +++ b/docs/source/benchmarks.md @@ -10,6 +10,8 @@ Each class also exposes the attributes you usually need to set up the GA: For ZDT problems and ZDT4 / ZDT6, the class also has a `pareto_front(num_points)` method that returns reference points on the true Pareto front. Pass these to the IGD or GD indicators as the `reference_front` argument. +One runnable example per benchmark is available under `examples/benchmarks/`. + ## Single-Objective Problems Available in `pygad.benchmarks.classic`: @@ -49,6 +51,10 @@ Available in `pygad.benchmarks.dtlz`. All DTLZ problems support an arbitrary num ## Combinatorial Problems +Two combinatorial benchmarks are available: the 0/1 `Knapsack` and the `TSP`. + +### Knapsack + Available in `pygad.benchmarks.knapsack`. The 0/1 `Knapsack` class takes three arguments: a 1D array of item `weights`, a 1D array of item `values`, and a numeric `capacity`. A solution is a binary vector where a 1 means the item is picked. The fitness is the total value when the candidate is within the capacity, and a negative penalty scaled by how much the candidate is over the limit otherwise. The class exposes `gene_space=[0, 1]` and `gene_type=int` so you can plug it directly into PyGAD: @@ -73,6 +79,34 @@ ga = pygad.GA( ga.run() ``` +### Travelling Salesman Problem + +Available in `pygad.benchmarks.tsp`. The `TSP` class can be built from either a 2D array of city `coordinates` or a square `distance_matrix`. A solution is a permutation of the city indices and the fitness is the negative tour length (the tour closes back to the first city). Any non-permutation candidate gets a large negative penalty so the GA keeps a gradient toward feasibility. + +The class exposes `gene_space=list(range(num_cities))`, `gene_type=int`, and `allow_duplicate_genes=False` so the permutation constraint is respected: + +```python +import pygad +from pygad.benchmarks.tsp import TSP + +problem = TSP(coordinates=[[0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0]]) + +ga = pygad.GA( + num_generations=200, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + allow_duplicate_genes=problem.allow_duplicate_genes, +) +ga.run() +``` + ## Example: SOO ```python diff --git a/docs/source/releases.md b/docs/source/releases.md index eb468bd..a2ff4f9 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -657,3 +657,5 @@ Release Date April 8, 2026 21. Instead of using repeated code for converting the data type and rounding the genes during crossover and mutation, the `change_gene_dtype_and_round()` method is called from the `pygad.helper.misc.Helper` class. 22. Fix some documentation issues. https://github.com/ahmedfgad/GeneticAlgorithmPython/pull/336 23. Update the documentation to reflect the recent additions and changes to the library structure. +24. A new benchmark `pygad.benchmarks.tsp` with a `TSP` class for the Travelling Salesman Problem. The class accepts either 2D `coordinates` or a precomputed `distance_matrix`, exposes `gene_space`, `gene_type`, and `allow_duplicate_genes` for the permutation encoding, and returns the negative tour length as the fitness. +25. Two new example folders under `/examples`: `examples/benchmarks/` has one runnable example per benchmark (classic, ZDT, DTLZ, knapsack, and TSP), and `examples/quality_indicators/` has one runnable example per quality indicator (hypervolume, IGD, GD, and spacing). diff --git a/docs/source/utils.md b/docs/source/utils.md index b766a13..1a203b6 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -369,6 +369,8 @@ true_front = problem.pareto_front(num_points=100) igd = inverted_generational_distance(fitness, true_front) ``` +One runnable example per indicator is available under `examples/quality_indicators/`. + ## More about the Operators ::::{grid} 1 2 2 2 diff --git a/examples/benchmarks/example_classic_ackley.py b/examples/benchmarks/example_classic_ackley.py new file mode 100644 index 0000000..43a6d1a --- /dev/null +++ b/examples/benchmarks/example_classic_ackley.py @@ -0,0 +1,28 @@ +""" +Run PyGAD on the Ackley benchmark from `pygad.benchmarks.classic`. + +Ackley has a near-flat outer region with a deep, narrow basin at +the origin where f(x) = 0. +""" + +import pygad +from pygad.benchmarks.classic import Ackley + +problem = Ackley(num_genes=5) + +ga = pygad.GA(num_generations=300, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_classic_griewank.py b/examples/benchmarks/example_classic_griewank.py new file mode 100644 index 0000000..1c2c638 --- /dev/null +++ b/examples/benchmarks/example_classic_griewank.py @@ -0,0 +1,28 @@ +""" +Run PyGAD on the Griewank benchmark from `pygad.benchmarks.classic`. + +Griewank has many local minima spread over a wide area. The global +minimum is at the origin where f(x) = 0. +""" + +import pygad +from pygad.benchmarks.classic import Griewank + +problem = Griewank(num_genes=5) + +ga = pygad.GA(num_generations=300, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_classic_himmelblau.py b/examples/benchmarks/example_classic_himmelblau.py new file mode 100644 index 0000000..f2275fe --- /dev/null +++ b/examples/benchmarks/example_classic_himmelblau.py @@ -0,0 +1,32 @@ +""" +Run PyGAD on the 2D Himmelblau benchmark from +`pygad.benchmarks.classic`. + +Himmelblau has four equal global minima at f(x, y) = 0: + (3.0, 2.0), + (-2.805, 3.131), + (-3.779, -3.283), + (3.584, -1.848). +""" + +import pygad +from pygad.benchmarks.classic import Himmelblau + +problem = Himmelblau() + +ga = pygad.GA(num_generations=200, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution (x, y): {solution}") diff --git a/examples/benchmarks/example_classic_rastrigin.py b/examples/benchmarks/example_classic_rastrigin.py new file mode 100644 index 0000000..aa9f331 --- /dev/null +++ b/examples/benchmarks/example_classic_rastrigin.py @@ -0,0 +1,28 @@ +""" +Run PyGAD on the Rastrigin benchmark from `pygad.benchmarks.classic`. + +Rastrigin has many local minima placed at regular spaces. The global +minimum is at the origin where f(x) = 0. +""" + +import pygad +from pygad.benchmarks.classic import Rastrigin + +problem = Rastrigin(num_genes=5) + +ga = pygad.GA(num_generations=300, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_classic_rosenbrock.py b/examples/benchmarks/example_classic_rosenbrock.py new file mode 100644 index 0000000..d513627 --- /dev/null +++ b/examples/benchmarks/example_classic_rosenbrock.py @@ -0,0 +1,28 @@ +""" +Run PyGAD on the Rosenbrock benchmark from `pygad.benchmarks.classic`. + +The global minimum is at x = (1, 1, ..., 1) where f(x) = 0. The +minimum lives at the bottom of a long, narrow, banana-shaped valley. +""" + +import pygad +from pygad.benchmarks.classic import Rosenbrock + +problem = Rosenbrock(num_genes=5) + +ga = pygad.GA(num_generations=500, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_classic_schwefel.py b/examples/benchmarks/example_classic_schwefel.py new file mode 100644 index 0000000..a3e92cd --- /dev/null +++ b/examples/benchmarks/example_classic_schwefel.py @@ -0,0 +1,29 @@ +""" +Run PyGAD on the Schwefel benchmark from `pygad.benchmarks.classic`. + +The global minimum sits at x = (420.9687, ..., 420.9687) far from +the next-best local minimum, so the function is hard for many +algorithms. +""" + +import pygad +from pygad.benchmarks.classic import Schwefel + +problem = Schwefel(num_genes=3) + +ga = pygad.GA(num_generations=500, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=50, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_classic_sphere.py b/examples/benchmarks/example_classic_sphere.py new file mode 100644 index 0000000..d9e3fd3 --- /dev/null +++ b/examples/benchmarks/example_classic_sphere.py @@ -0,0 +1,28 @@ +""" +Run PyGAD on the Sphere benchmark from `pygad.benchmarks.classic`. + +The Sphere function has its global minimum at the origin where +f(x) = 0. Under PyGAD's max convention the best fitness is 0. +""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best fitness: {solution_fitness}") +print(f"Best solution: {solution}") diff --git a/examples/benchmarks/example_dtlz1.py b/examples/benchmarks/example_dtlz1.py new file mode 100644 index 0000000..0ab8b1f --- /dev/null +++ b/examples/benchmarks/example_dtlz1.py @@ -0,0 +1,27 @@ +""" +Run PyGAD with NSGA-III on the DTLZ1 benchmark from +`pygad.benchmarks.dtlz`. + +DTLZ1 has a linear hyperplane Pareto front where sum(f_i) = 0.5 +for M objectives. Use NSGA-III because the front lives in 3D. +""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ1 + +problem = DTLZ1(num_objectives=3, num_distance_vars=5) + +ga = pygad.GA(num_generations=300, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=12, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() diff --git a/examples/benchmarks/example_dtlz2.py b/examples/benchmarks/example_dtlz2.py new file mode 100644 index 0000000..c705f22 --- /dev/null +++ b/examples/benchmarks/example_dtlz2.py @@ -0,0 +1,26 @@ +""" +Run PyGAD with NSGA-III on the DTLZ2 benchmark from +`pygad.benchmarks.dtlz`. + +DTLZ2 has a Pareto front on the first orthant of the unit sphere. +""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ2 + +problem = DTLZ2(num_objectives=3, num_distance_vars=10) + +ga = pygad.GA(num_generations=300, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=12, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() diff --git a/examples/benchmarks/example_dtlz3.py b/examples/benchmarks/example_dtlz3.py new file mode 100644 index 0000000..60faf14 --- /dev/null +++ b/examples/benchmarks/example_dtlz3.py @@ -0,0 +1,27 @@ +""" +Run PyGAD with NSGA-III on the DTLZ3 benchmark from +`pygad.benchmarks.dtlz`. + +DTLZ3 has the same unit-sphere front as DTLZ2 but its g-function is +hard and multimodal, which makes convergence much harder. +""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ3 + +problem = DTLZ3(num_objectives=3, num_distance_vars=10) + +ga = pygad.GA(num_generations=500, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=12, + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() diff --git a/examples/benchmarks/example_dtlz4.py b/examples/benchmarks/example_dtlz4.py new file mode 100644 index 0000000..2b5acb0 --- /dev/null +++ b/examples/benchmarks/example_dtlz4.py @@ -0,0 +1,28 @@ +""" +Run PyGAD with NSGA-III on the DTLZ4 benchmark from +`pygad.benchmarks.dtlz`. + +DTLZ4 has a unit-sphere front like DTLZ2 but the alpha bias squashes +position variables toward one corner, so a good algorithm has to +fight the bias to cover the whole front. +""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ4 + +problem = DTLZ4(num_objectives=3, num_distance_vars=10, alpha=100.0) + +ga = pygad.GA(num_generations=300, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=12, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() diff --git a/examples/benchmarks/example_knapsack.py b/examples/benchmarks/example_knapsack.py new file mode 100644 index 0000000..651d831 --- /dev/null +++ b/examples/benchmarks/example_knapsack.py @@ -0,0 +1,29 @@ +""" +Run PyGAD on the 0/1 Knapsack benchmark from +`pygad.benchmarks.knapsack`. + +A solution is a binary vector. The fitness is the total value when +the candidate is within the capacity, and a negative penalty scaled +by the overweight amount otherwise. The known optimal subset for +this small instance is items 0 and 1 (total value = 7). +""" + +import pygad +from pygad.benchmarks.knapsack import Knapsack + +problem = Knapsack(weights=[2, 3, 4, 5], + values=[3, 4, 5, 6], + capacity=5) + +ga = pygad.GA(num_generations=100, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best subset: {solution}") +print(f"Total value: {solution_fitness}") diff --git a/examples/benchmarks/example_tsp.py b/examples/benchmarks/example_tsp.py new file mode 100644 index 0000000..da7c20b --- /dev/null +++ b/examples/benchmarks/example_tsp.py @@ -0,0 +1,30 @@ +""" +Run PyGAD on the TSP benchmark from `pygad.benchmarks.tsp`. + +A solution is a permutation of the city indices. The fitness is the +negative tour length so the GA maximizes toward the shortest tour. +For this 4-city square instance the optimal tour walks the +perimeter with length 4. +""" + +import pygad +from pygad.benchmarks.tsp import TSP + +problem = TSP(coordinates=[[0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0]]) + +ga = pygad.GA(num_generations=200, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + allow_duplicate_genes=problem.allow_duplicate_genes) +ga.run() + +solution, solution_fitness, _ = ga.best_solution(ga.last_generation_fitness) +print(f"Best tour: {solution}") +print(f"Tour length: {-solution_fitness}") diff --git a/examples/benchmarks/example_zdt1.py b/examples/benchmarks/example_zdt1.py new file mode 100644 index 0000000..337c9b5 --- /dev/null +++ b/examples/benchmarks/example_zdt1.py @@ -0,0 +1,28 @@ +""" +Run PyGAD with NSGA-II on the ZDT1 benchmark from +`pygad.benchmarks.zdt`. + +ZDT1 has two objectives and a convex Pareto front: + f2 = 1 - sqrt(f1) for f1 in [0, 1]. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/benchmarks/example_zdt2.py b/examples/benchmarks/example_zdt2.py new file mode 100644 index 0000000..fd057e3 --- /dev/null +++ b/examples/benchmarks/example_zdt2.py @@ -0,0 +1,29 @@ +""" +Run PyGAD with NSGA-II on the ZDT2 benchmark from +`pygad.benchmarks.zdt`. + +ZDT2 has the same decision variable layout as ZDT1 but a non-convex +Pareto front: + f2 = 1 - f1**2 for f1 in [0, 1]. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT2 + +problem = ZDT2(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/benchmarks/example_zdt3.py b/examples/benchmarks/example_zdt3.py new file mode 100644 index 0000000..1c2864e --- /dev/null +++ b/examples/benchmarks/example_zdt3.py @@ -0,0 +1,28 @@ +""" +Run PyGAD with NSGA-II on the ZDT3 benchmark from +`pygad.benchmarks.zdt`. + +ZDT3 has a Pareto front that is made of five disconnected convex +pieces, which makes it a good test for diversity preservation. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT3 + +problem = ZDT3(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/benchmarks/example_zdt4.py b/examples/benchmarks/example_zdt4.py new file mode 100644 index 0000000..412d8ce --- /dev/null +++ b/examples/benchmarks/example_zdt4.py @@ -0,0 +1,29 @@ +""" +Run PyGAD with NSGA-II on the ZDT4 benchmark from +`pygad.benchmarks.zdt`. + +ZDT4 has the same convex front as ZDT1 but its search space has +many local minima. The first variable lives in [0, 1] and the rest +in [-5, 5]. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT4 + +problem = ZDT4(num_genes=10) + +ga = pygad.GA(num_generations=300, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/benchmarks/example_zdt6.py b/examples/benchmarks/example_zdt6.py new file mode 100644 index 0000000..76f9946 --- /dev/null +++ b/examples/benchmarks/example_zdt6.py @@ -0,0 +1,29 @@ +""" +Run PyGAD with NSGA-II on the ZDT6 benchmark from +`pygad.benchmarks.zdt`. + +ZDT6 has a non-uniform Pareto front. Solutions cluster toward one +end so a good algorithm has to preserve diversity over the whole +front. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT6 + +problem = ZDT6(num_genes=10) + +ga = pygad.GA(num_generations=300, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=20, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/quality_indicators/example_generational_distance.py b/examples/quality_indicators/example_generational_distance.py new file mode 100644 index 0000000..bbe8787 --- /dev/null +++ b/examples/quality_indicators/example_generational_distance.py @@ -0,0 +1,32 @@ +""" +Compute the Generational Distance (GD) of the final NSGA-II +population on the ZDT2 benchmark. + +GD is the mean Euclidean distance from each approximation point to +its nearest true-front reference point. A smaller value is better; +GD only measures convergence and not diversity. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT2 +from pygad.utils.quality_indicators import generational_distance + +problem = ZDT2(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +true_front = problem.pareto_front(num_points=100) +gd = generational_distance(ga.last_generation_fitness, true_front) +print(f"GD: {gd}") diff --git a/examples/quality_indicators/example_hypervolume.py b/examples/quality_indicators/example_hypervolume.py new file mode 100644 index 0000000..4a352e8 --- /dev/null +++ b/examples/quality_indicators/example_hypervolume.py @@ -0,0 +1,39 @@ +""" +Compute the hypervolume of the final NSGA-II population on the +ZDT1 benchmark. + +Hypervolume measures how much of the objective space is dominated +by the approximation front. A bigger value means better coverage. +The reference point must be worse than every solution on every +objective; under PyGAD's max convention this means it must be +strictly smaller than every fitness value. +""" + +import numpy + +import pygad +from pygad.benchmarks.zdt import ZDT1 +from pygad.utils.quality_indicators import hypervolume + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +final_fitness = numpy.asarray(ga.last_generation_fitness) +# Reference: a little worse on every axis than the worst fitness seen. +reference_point = final_fitness.min(axis=0) - 0.1 + +hv = hypervolume(final_fitness, reference_point) +print(f"Hypervolume: {hv}") diff --git a/examples/quality_indicators/example_inverted_generational_distance.py b/examples/quality_indicators/example_inverted_generational_distance.py new file mode 100644 index 0000000..12942e8 --- /dev/null +++ b/examples/quality_indicators/example_inverted_generational_distance.py @@ -0,0 +1,32 @@ +""" +Compute the Inverted Generational Distance (IGD) of the final +NSGA-II population on the ZDT1 benchmark. + +IGD is the mean Euclidean distance from each true-front reference +point to its nearest approximation point. A smaller value is +better; it reports both convergence and diversity. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 +from pygad.utils.quality_indicators import inverted_generational_distance + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +true_front = problem.pareto_front(num_points=100) +igd = inverted_generational_distance(ga.last_generation_fitness, true_front) +print(f"IGD: {igd}") diff --git a/examples/quality_indicators/example_spacing.py b/examples/quality_indicators/example_spacing.py new file mode 100644 index 0000000..ebaab3a --- /dev/null +++ b/examples/quality_indicators/example_spacing.py @@ -0,0 +1,31 @@ +""" +Compute the spacing metric of the final NSGA-II population on the +ZDT1 benchmark. + +Spacing is the standard deviation of the distance from each +solution to its nearest neighbour. A smaller value means the +solutions are spread more evenly along the front. +""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 +from pygad.utils.quality_indicators import spacing + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=200, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +spacing_value = spacing(ga.last_generation_fitness) +print(f"Spacing: {spacing_value}") diff --git a/pygad/benchmarks/__init__.py b/pygad/benchmarks/__init__.py index 1aa3d93..2e28228 100644 --- a/pygad/benchmarks/__init__.py +++ b/pygad/benchmarks/__init__.py @@ -13,5 +13,6 @@ from pygad.benchmarks import zdt from pygad.benchmarks import dtlz from pygad.benchmarks import knapsack +from pygad.benchmarks import tsp -__all__ = ["classic", "zdt", "dtlz", "knapsack"] +__all__ = ["classic", "zdt", "dtlz", "knapsack", "tsp"] diff --git a/pygad/benchmarks/tsp.py b/pygad/benchmarks/tsp.py new file mode 100644 index 0000000..ed60245 --- /dev/null +++ b/pygad/benchmarks/tsp.py @@ -0,0 +1,104 @@ +""" +Travelling Salesman Problem (TSP) benchmark. + +The problem is to find the shortest closed tour that visits every +city exactly once and returns to the starting city. A solution is a +permutation of the city indices [0, 1, ..., num_cities - 1]. The +fitness is the negative tour length so PyGAD can maximize toward the +shortest tour. + +Two ways to build the problem: + +1. Pass `coordinates` as a 2D array of shape (num_cities, num_dims). + The class computes the Euclidean distance matrix internally. +2. Pass `distance_matrix` as a 2D square array of pairwise distances. + +To plug into PyGAD, use the class attributes that describe the +permutation encoding: + + problem = TSP(coordinates=[...]) + ga = pygad.GA( + ..., + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + allow_duplicate_genes=problem.allow_duplicate_genes, + fitness_func=problem, + ) +""" + +import numpy + + +class TSP: + """ + Travelling Salesman Problem with a closed tour. + + The fitness is the negative of the tour length so the GA can + maximize toward the shortest tour. Any solution that is not a + valid permutation (a duplicate or an out-of-range index) returns + a large negative penalty that scales with the violation count, so + the GA still gets a useful gradient toward feasibility. + """ + num_objectives = 1 + gene_type = int + allow_duplicate_genes = False + + def __init__(self, coordinates=None, distance_matrix=None): + if (coordinates is None) == (distance_matrix is None): + raise ValueError( + "Pass exactly one of coordinates or distance_matrix.") + if coordinates is not None: + coordinates = numpy.asarray(coordinates, dtype=float) + if coordinates.ndim != 2: + raise ValueError( + f"coordinates must be a 2D array, but got shape " + f"{coordinates.shape}.") + if coordinates.shape[0] < 2: + raise ValueError( + f"coordinates must have at least 2 rows, but got " + f"{coordinates.shape[0]}.") + self.coordinates = coordinates + self.distance_matrix = self._build_distance_matrix(coordinates) + else: + distance_matrix = numpy.asarray(distance_matrix, dtype=float) + if distance_matrix.ndim != 2 or distance_matrix.shape[0] != distance_matrix.shape[1]: + raise ValueError( + f"distance_matrix must be square, but got shape " + f"{distance_matrix.shape}.") + if distance_matrix.shape[0] < 2: + raise ValueError( + f"distance_matrix must have at least 2 rows, but got " + f"{distance_matrix.shape[0]}.") + if numpy.any(distance_matrix < 0): + raise ValueError( + "distance_matrix entries must be non-negative.") + self.coordinates = None + self.distance_matrix = distance_matrix + self.num_genes = int(self.distance_matrix.shape[0]) + self.gene_space = list(range(self.num_genes)) + + @staticmethod + def _build_distance_matrix(coordinates): + diff = coordinates[:, None, :] - coordinates[None, :, :] + return numpy.sqrt((diff * diff).sum(axis=2)) + + def tour_length(self, tour): + """ + Total length of the closed tour described by `tour`. The tour + is a sequence of city indices; the last leg goes from the + last city back to the first. + """ + tour = numpy.asarray(tour, dtype=int) + next_city = numpy.roll(tour, -1) + return float(self.distance_matrix[tour, next_city].sum()) + + def __call__(self, ga, solution, sol_idx): + tour = numpy.asarray(solution, dtype=int) + if tour.shape[0] != self.num_genes: + return -float(self.distance_matrix.sum()) + unique_count = numpy.unique(tour).shape[0] + if unique_count != self.num_genes or tour.min() < 0 or tour.max() >= self.num_genes: + missing = self.num_genes - unique_count + return -float(self.distance_matrix.sum()) * (1.0 + missing) + return -self.tour_length(tour) diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py index e5ba308..5feb196 100644 --- a/tests/test_benchmarks.py +++ b/tests/test_benchmarks.py @@ -4,7 +4,7 @@ import pytest import pygad -from pygad.benchmarks import classic, zdt, dtlz, knapsack +from pygad.benchmarks import classic, zdt, dtlz, knapsack, tsp # ── Classic single-objective problems ──────────────────────────────────────── @@ -194,6 +194,8 @@ def test_benchmarks_module_is_importable_from_top_level(): assert pygad.benchmarks.dtlz.DTLZ2().num_objectives == 3 assert pygad.benchmarks.knapsack.Knapsack( weights=[1.0], values=[1.0], capacity=1.0).num_genes == 1 + assert pygad.benchmarks.tsp.TSP( + coordinates=[[0.0, 0.0], [1.0, 0.0]]).num_genes == 2 # ── Knapsack ───────────────────────────────────────────────────────────────── @@ -266,3 +268,90 @@ def test_knapsack_finds_optimal_solution_on_small_instance_end_to_end(): best_solution, best_fitness, _ = ga.best_solution(ga.last_generation_fitness) assert best_fitness == pytest.approx(7.0) numpy.testing.assert_array_equal(best_solution, [1, 1, 0, 0]) + + +# ── TSP ────────────────────────────────────────────────────────────────────── + + +def test_tsp_tour_length_on_unit_square(): + # Unit square with cities in order (0,0), (1,0), (1,1), (0,1). + # The closed tour visiting them in that order has length 4. + problem = tsp.TSP(coordinates=[[0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0]]) + assert problem.tour_length([0, 1, 2, 3]) == pytest.approx(4.0) + + +def test_tsp_fitness_is_negative_of_tour_length(): + problem = tsp.TSP(coordinates=[[0.0, 0.0], + [3.0, 0.0], + [3.0, 4.0]]) + # 3-4-5 triangle: tour length = 3 + 4 + 5 = 12. + fitness = problem(None, numpy.array([0, 1, 2]), 0) + assert fitness == pytest.approx(-12.0) + + +def test_tsp_accepts_precomputed_distance_matrix(): + distances = numpy.array([[0.0, 2.0, 9.0], + [2.0, 0.0, 6.0], + [9.0, 6.0, 0.0]]) + problem = tsp.TSP(distance_matrix=distances) + # Tour 0-1-2: 2 + 6 + 9 = 17. + assert problem.tour_length([0, 1, 2]) == pytest.approx(17.0) + + +def test_tsp_invalid_permutation_returns_penalty(): + problem = tsp.TSP(coordinates=[[0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0]]) + # Duplicate city 0 and missing city 3. + fitness = problem(None, numpy.array([0, 1, 2, 0]), 0) + assert fitness < -problem.distance_matrix.sum() + + +def test_tsp_rejects_passing_both_inputs(): + with pytest.raises(ValueError, match="exactly one"): + tsp.TSP(coordinates=[[0.0, 0.0], [1.0, 0.0]], + distance_matrix=[[0.0, 1.0], [1.0, 0.0]]) + + +def test_tsp_rejects_passing_no_inputs(): + with pytest.raises(ValueError, match="exactly one"): + tsp.TSP() + + +def test_tsp_rejects_non_square_distance_matrix(): + with pytest.raises(ValueError, match="square"): + tsp.TSP(distance_matrix=[[0.0, 1.0, 2.0], + [1.0, 0.0, 1.0]]) + + +def test_tsp_rejects_negative_distance(): + with pytest.raises(ValueError, match="non-negative"): + tsp.TSP(distance_matrix=[[0.0, -1.0], [-1.0, 0.0]]) + + +def test_tsp_finds_optimal_tour_on_small_square_end_to_end(): + # Square with side 1: optimal tour is the perimeter, length 4. + # Any tour that crosses the square (e.g. 0-2-1-3) is longer + # (2 + sqrt(2) + 2 + sqrt(2) > 4) so the GA must learn to walk + # the perimeter. + problem = tsp.TSP(coordinates=[[0.0, 0.0], + [1.0, 0.0], + [1.0, 1.0], + [0.0, 1.0]]) + ga = pygad.GA(num_generations=100, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + gene_space=problem.gene_space, + gene_type=problem.gene_type, + allow_duplicate_genes=problem.allow_duplicate_genes, + random_seed=2, + suppress_warnings=True) + ga.run() + _, best_fitness, _ = ga.best_solution(ga.last_generation_fitness) + assert best_fitness == pytest.approx(-4.0, abs=1e-6) From 8cd1d900d7634f29cf88e14ea343acae25cde03b Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 26 May 2026 23:37:38 -0400 Subject: [PATCH 07/17] Remove notes --- docs/source/releases.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/source/releases.md b/docs/source/releases.md index a2ff4f9..dbbc5f4 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -653,9 +653,6 @@ Release Date April 8, 2026 3. Parallel processing. 4. The `GANN` module. 5. The plots created by the `visualize`. - 21. Instead of using repeated code for converting the data type and rounding the genes during crossover and mutation, the `change_gene_dtype_and_round()` method is called from the `pygad.helper.misc.Helper` class. 22. Fix some documentation issues. https://github.com/ahmedfgad/GeneticAlgorithmPython/pull/336 23. Update the documentation to reflect the recent additions and changes to the library structure. -24. A new benchmark `pygad.benchmarks.tsp` with a `TSP` class for the Travelling Salesman Problem. The class accepts either 2D `coordinates` or a precomputed `distance_matrix`, exposes `gene_space`, `gene_type`, and `allow_duplicate_genes` for the permutation encoding, and returns the negative tour length as the fitness. -25. Two new example folders under `/examples`: `examples/benchmarks/` has one runnable example per benchmark (classic, ZDT, DTLZ, knapsack, and TSP), and `examples/quality_indicators/` has one runnable example per quality indicator (hypervolume, IGD, GD, and spacing). From e0ac1115da04fce2098746b996df2fd941536dc1 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 00:10:42 -0400 Subject: [PATCH 08/17] Reformat comments --- .gitignore | 5 + docs/source/benchmarks.md | 26 ++-- docs/source/utils.md | 2 +- examples/benchmarks/example_classic_ackley.py | 7 +- .../benchmarks/example_classic_griewank.py | 7 +- .../benchmarks/example_classic_himmelblau.py | 11 +- .../benchmarks/example_classic_rastrigin.py | 7 +- .../benchmarks/example_classic_rosenbrock.py | 7 +- .../benchmarks/example_classic_schwefel.py | 8 +- examples/benchmarks/example_classic_sphere.py | 7 +- examples/benchmarks/example_dtlz1.py | 8 +- examples/benchmarks/example_dtlz2.py | 7 +- examples/benchmarks/example_dtlz3.py | 8 +- examples/benchmarks/example_dtlz4.py | 9 +- examples/benchmarks/example_knapsack.py | 10 +- examples/benchmarks/example_tsp.py | 9 +- examples/benchmarks/example_zdt1.py | 8 +- examples/benchmarks/example_zdt2.py | 9 +- examples/benchmarks/example_zdt3.py | 8 +- examples/benchmarks/example_zdt4.py | 9 +- examples/benchmarks/example_zdt6.py | 9 +- .../example_generational_distance.py | 9 +- .../quality_indicators/example_hypervolume.py | 12 +- .../example_inverted_generational_distance.py | 9 +- .../quality_indicators/example_spacing.py | 9 +- pygad/benchmarks/__init__.py | 15 +- pygad/benchmarks/classic.py | 42 ++---- pygad/benchmarks/dtlz.py | 32 ++--- pygad/benchmarks/knapsack.py | 30 ++-- pygad/benchmarks/tsp.py | 62 ++------- pygad/benchmarks/zdt.py | 35 ++--- pygad/utils/nsga3.py | 9 +- pygad/utils/quality_indicators.py | 129 +++++++----------- setup_venv.sh | 35 +++++ tests/test_benchmarks.py | 58 +++----- tests/test_nsga3.py | 14 ++ tests/test_quality_indicators.py | 56 +++----- 37 files changed, 266 insertions(+), 471 deletions(-) create mode 100755 setup_venv.sh diff --git a/.gitignore b/.gitignore index 35175fd..9e2575d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,11 @@ __pycache__/ docs/build/ .venv-docs/ +# ============================================================================= +# Local virtual environment (setup_venv.sh). +# ============================================================================= +.venv/ + # ============================================================================= # IDE settings: JetBrains (PyCharm, IntelliJ, etc.) workspace files. # These are personal to each developer and should not be committed. diff --git a/docs/source/benchmarks.md b/docs/source/benchmarks.md index 7c3bc07..247e3e7 100644 --- a/docs/source/benchmarks.md +++ b/docs/source/benchmarks.md @@ -1,16 +1,16 @@ # Benchmark Problems -PyGAD ships a small collection of standard benchmark problems under `pygad.benchmarks`. Each problem is a class that can be called with the PyGAD fitness signature `(ga, solution, sol_idx)` and returns a fitness value in PyGAD's maximization format (the original minimization values are negated for you). +PyGAD bundles common benchmark problems under `pygad.benchmarks`. Each problem is a class callable with `(ga, solution, sol_idx)` and returns a fitness in PyGAD's maximisation format. Minimisation values are negated. -Each class also exposes the attributes you usually need to set up the GA: +Class attributes for setting up the GA: - `num_genes`: number of decision variables. -- `num_objectives`: number of objectives. `1` for single-objective problems. +- `num_objectives`: number of objectives (`1` for single-objective). - `bounds`: `(low, high)` tuple of variable bounds. -For ZDT problems and ZDT4 / ZDT6, the class also has a `pareto_front(num_points)` method that returns reference points on the true Pareto front. Pass these to the IGD or GD indicators as the `reference_front` argument. +ZDT classes also have a `pareto_front(num_points)` method that returns true-front reference points. Pass these to the IGD or GD indicators as `reference_front`. -One runnable example per benchmark is available under `examples/benchmarks/`. +A runnable example per benchmark lives under `examples/benchmarks/`. ## Single-Objective Problems @@ -28,7 +28,7 @@ Available in `pygad.benchmarks.classic`: ## Multi-Objective Problems (ZDT family) -Available in `pygad.benchmarks.zdt`. All ZDT problems have two objectives and variables in `[0, 1]` (except ZDT4 which uses `[-5, 5]` for the rest of the variables). +In `pygad.benchmarks.zdt`. Two objectives, variables in `[0, 1]` (ZDT4 uses `[-5, 5]` for the rest). | Class | Pareto front shape | |---|---| @@ -40,7 +40,7 @@ Available in `pygad.benchmarks.zdt`. All ZDT problems have two objectives and va ## Many-Objective Problems (DTLZ family) -Available in `pygad.benchmarks.dtlz`. All DTLZ problems support an arbitrary number of objectives `M`. The number of decision variables is `M + k - 1` where `k` is a "distance" variable count. +In `pygad.benchmarks.dtlz`. Any number of objectives `M`. Decision variables: `M + k - 1`, where `k` is the distance-variable count. | Class | Default M | Pareto front shape | |---|---|---| @@ -51,13 +51,13 @@ Available in `pygad.benchmarks.dtlz`. All DTLZ problems support an arbitrary num ## Combinatorial Problems -Two combinatorial benchmarks are available: the 0/1 `Knapsack` and the `TSP`. +Two combinatorial benchmarks: 0/1 `Knapsack` and `TSP`. ### Knapsack -Available in `pygad.benchmarks.knapsack`. The 0/1 `Knapsack` class takes three arguments: a 1D array of item `weights`, a 1D array of item `values`, and a numeric `capacity`. A solution is a binary vector where a 1 means the item is picked. The fitness is the total value when the candidate is within the capacity, and a negative penalty scaled by how much the candidate is over the limit otherwise. +In `pygad.benchmarks.knapsack`. `Knapsack` takes three arguments: 1D arrays of `weights` and `values`, and a numeric `capacity`. A solution is a binary vector (1 = pick the item). Fitness is the total value within capacity, or a negative penalty scaled by the overweight amount. -The class exposes `gene_space=[0, 1]` and `gene_type=int` so you can plug it directly into PyGAD: +Class attributes `gene_space=[0, 1]` and `gene_type=int` plug into PyGAD as is: ```python import pygad @@ -81,9 +81,9 @@ ga.run() ### Travelling Salesman Problem -Available in `pygad.benchmarks.tsp`. The `TSP` class can be built from either a 2D array of city `coordinates` or a square `distance_matrix`. A solution is a permutation of the city indices and the fitness is the negative tour length (the tour closes back to the first city). Any non-permutation candidate gets a large negative penalty so the GA keeps a gradient toward feasibility. +In `pygad.benchmarks.tsp`. Build `TSP` from either a 2D `coordinates` array or a square `distance_matrix`. A solution is a permutation of city indices and the fitness is the negative tour length (the tour closes back to the start). Non-permutation candidates get a large negative penalty. -The class exposes `gene_space=list(range(num_cities))`, `gene_type=int`, and `allow_duplicate_genes=False` so the permutation constraint is respected: +Class attributes `gene_space=list(range(num_cities))`, `gene_type=int`, and `allow_duplicate_genes=False` keep the permutation constraint: ```python import pygad @@ -156,7 +156,7 @@ ga = pygad.GA( ) ga.run() -# Measure how close the final population is to the true Pareto front +# IGD against the true front. true_front = problem.pareto_front(num_points=100) igd = inverted_generational_distance(ga.last_generation_fitness, true_front) print(f'IGD = {igd}') diff --git a/docs/source/utils.md b/docs/source/utils.md index 1a203b6..1540a69 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -369,7 +369,7 @@ true_front = problem.pareto_front(num_points=100) igd = inverted_generational_distance(fitness, true_front) ``` -One runnable example per indicator is available under `examples/quality_indicators/`. +A runnable example per indicator lives under `examples/quality_indicators/`. ## More about the Operators diff --git a/examples/benchmarks/example_classic_ackley.py b/examples/benchmarks/example_classic_ackley.py index 43a6d1a..2c0260a 100644 --- a/examples/benchmarks/example_classic_ackley.py +++ b/examples/benchmarks/example_classic_ackley.py @@ -1,9 +1,4 @@ -""" -Run PyGAD on the Ackley benchmark from `pygad.benchmarks.classic`. - -Ackley has a near-flat outer region with a deep, narrow basin at -the origin where f(x) = 0. -""" +"""Run PyGAD on the Ackley benchmark. Flat outside, deep basin at the origin.""" import pygad from pygad.benchmarks.classic import Ackley diff --git a/examples/benchmarks/example_classic_griewank.py b/examples/benchmarks/example_classic_griewank.py index 1c2c638..7f76fab 100644 --- a/examples/benchmarks/example_classic_griewank.py +++ b/examples/benchmarks/example_classic_griewank.py @@ -1,9 +1,4 @@ -""" -Run PyGAD on the Griewank benchmark from `pygad.benchmarks.classic`. - -Griewank has many local minima spread over a wide area. The global -minimum is at the origin where f(x) = 0. -""" +"""Run PyGAD on the Griewank benchmark. Many local minima, global at the origin.""" import pygad from pygad.benchmarks.classic import Griewank diff --git a/examples/benchmarks/example_classic_himmelblau.py b/examples/benchmarks/example_classic_himmelblau.py index f2275fe..29f8517 100644 --- a/examples/benchmarks/example_classic_himmelblau.py +++ b/examples/benchmarks/example_classic_himmelblau.py @@ -1,13 +1,4 @@ -""" -Run PyGAD on the 2D Himmelblau benchmark from -`pygad.benchmarks.classic`. - -Himmelblau has four equal global minima at f(x, y) = 0: - (3.0, 2.0), - (-2.805, 3.131), - (-3.779, -3.283), - (3.584, -1.848). -""" +"""Run PyGAD on the 2D Himmelblau benchmark. Four global minima at f = 0.""" import pygad from pygad.benchmarks.classic import Himmelblau diff --git a/examples/benchmarks/example_classic_rastrigin.py b/examples/benchmarks/example_classic_rastrigin.py index aa9f331..6dfb838 100644 --- a/examples/benchmarks/example_classic_rastrigin.py +++ b/examples/benchmarks/example_classic_rastrigin.py @@ -1,9 +1,4 @@ -""" -Run PyGAD on the Rastrigin benchmark from `pygad.benchmarks.classic`. - -Rastrigin has many local minima placed at regular spaces. The global -minimum is at the origin where f(x) = 0. -""" +"""Run PyGAD on the Rastrigin benchmark. Many local minima, global at the origin.""" import pygad from pygad.benchmarks.classic import Rastrigin diff --git a/examples/benchmarks/example_classic_rosenbrock.py b/examples/benchmarks/example_classic_rosenbrock.py index d513627..620fd86 100644 --- a/examples/benchmarks/example_classic_rosenbrock.py +++ b/examples/benchmarks/example_classic_rosenbrock.py @@ -1,9 +1,4 @@ -""" -Run PyGAD on the Rosenbrock benchmark from `pygad.benchmarks.classic`. - -The global minimum is at x = (1, 1, ..., 1) where f(x) = 0. The -minimum lives at the bottom of a long, narrow, banana-shaped valley. -""" +"""Run PyGAD on the Rosenbrock benchmark. Minimum sits in a narrow banana-shaped valley.""" import pygad from pygad.benchmarks.classic import Rosenbrock diff --git a/examples/benchmarks/example_classic_schwefel.py b/examples/benchmarks/example_classic_schwefel.py index a3e92cd..877a550 100644 --- a/examples/benchmarks/example_classic_schwefel.py +++ b/examples/benchmarks/example_classic_schwefel.py @@ -1,10 +1,4 @@ -""" -Run PyGAD on the Schwefel benchmark from `pygad.benchmarks.classic`. - -The global minimum sits at x = (420.9687, ..., 420.9687) far from -the next-best local minimum, so the function is hard for many -algorithms. -""" +"""Run PyGAD on the Schwefel benchmark. Global minimum at (420.9687, ...).""" import pygad from pygad.benchmarks.classic import Schwefel diff --git a/examples/benchmarks/example_classic_sphere.py b/examples/benchmarks/example_classic_sphere.py index d9e3fd3..cecdaa3 100644 --- a/examples/benchmarks/example_classic_sphere.py +++ b/examples/benchmarks/example_classic_sphere.py @@ -1,9 +1,4 @@ -""" -Run PyGAD on the Sphere benchmark from `pygad.benchmarks.classic`. - -The Sphere function has its global minimum at the origin where -f(x) = 0. Under PyGAD's max convention the best fitness is 0. -""" +"""Run PyGAD on the Sphere benchmark. Best fitness is 0 (at the origin).""" import pygad from pygad.benchmarks.classic import Sphere diff --git a/examples/benchmarks/example_dtlz1.py b/examples/benchmarks/example_dtlz1.py index 0ab8b1f..856cedf 100644 --- a/examples/benchmarks/example_dtlz1.py +++ b/examples/benchmarks/example_dtlz1.py @@ -1,10 +1,4 @@ -""" -Run PyGAD with NSGA-III on the DTLZ1 benchmark from -`pygad.benchmarks.dtlz`. - -DTLZ1 has a linear hyperplane Pareto front where sum(f_i) = 0.5 -for M objectives. Use NSGA-III because the front lives in 3D. -""" +"""Run NSGA-III on DTLZ1. Front is the linear hyperplane sum(f_i) = 0.5.""" import pygad from pygad.benchmarks.dtlz import DTLZ1 diff --git a/examples/benchmarks/example_dtlz2.py b/examples/benchmarks/example_dtlz2.py index c705f22..cc3b607 100644 --- a/examples/benchmarks/example_dtlz2.py +++ b/examples/benchmarks/example_dtlz2.py @@ -1,9 +1,4 @@ -""" -Run PyGAD with NSGA-III on the DTLZ2 benchmark from -`pygad.benchmarks.dtlz`. - -DTLZ2 has a Pareto front on the first orthant of the unit sphere. -""" +"""Run NSGA-III on DTLZ2. Front is the first orthant of the unit sphere.""" import pygad from pygad.benchmarks.dtlz import DTLZ2 diff --git a/examples/benchmarks/example_dtlz3.py b/examples/benchmarks/example_dtlz3.py index 60faf14..e55625d 100644 --- a/examples/benchmarks/example_dtlz3.py +++ b/examples/benchmarks/example_dtlz3.py @@ -1,10 +1,4 @@ -""" -Run PyGAD with NSGA-III on the DTLZ3 benchmark from -`pygad.benchmarks.dtlz`. - -DTLZ3 has the same unit-sphere front as DTLZ2 but its g-function is -hard and multimodal, which makes convergence much harder. -""" +"""Run NSGA-III on DTLZ3. Same unit-sphere front as DTLZ2, with a hard multimodal g.""" import pygad from pygad.benchmarks.dtlz import DTLZ3 diff --git a/examples/benchmarks/example_dtlz4.py b/examples/benchmarks/example_dtlz4.py index 2b5acb0..4321c12 100644 --- a/examples/benchmarks/example_dtlz4.py +++ b/examples/benchmarks/example_dtlz4.py @@ -1,11 +1,4 @@ -""" -Run PyGAD with NSGA-III on the DTLZ4 benchmark from -`pygad.benchmarks.dtlz`. - -DTLZ4 has a unit-sphere front like DTLZ2 but the alpha bias squashes -position variables toward one corner, so a good algorithm has to -fight the bias to cover the whole front. -""" +"""Run NSGA-III on DTLZ4. Same shape as DTLZ2; alpha bias pushes solutions to one corner.""" import pygad from pygad.benchmarks.dtlz import DTLZ4 diff --git a/examples/benchmarks/example_knapsack.py b/examples/benchmarks/example_knapsack.py index 651d831..6159aa7 100644 --- a/examples/benchmarks/example_knapsack.py +++ b/examples/benchmarks/example_knapsack.py @@ -1,11 +1,7 @@ -""" -Run PyGAD on the 0/1 Knapsack benchmark from -`pygad.benchmarks.knapsack`. +"""Run PyGAD on the 0/1 Knapsack benchmark. -A solution is a binary vector. The fitness is the total value when -the candidate is within the capacity, and a negative penalty scaled -by the overweight amount otherwise. The known optimal subset for -this small instance is items 0 and 1 (total value = 7). +Items (weight, value): (2,3), (3,4), (4,5), (5,6) with capacity 5. +Optimal subset is items 0 and 1 (total value 7). """ import pygad diff --git a/examples/benchmarks/example_tsp.py b/examples/benchmarks/example_tsp.py index da7c20b..928ab28 100644 --- a/examples/benchmarks/example_tsp.py +++ b/examples/benchmarks/example_tsp.py @@ -1,10 +1,7 @@ -""" -Run PyGAD on the TSP benchmark from `pygad.benchmarks.tsp`. +"""Run PyGAD on the TSP benchmark. -A solution is a permutation of the city indices. The fitness is the -negative tour length so the GA maximizes toward the shortest tour. -For this 4-city square instance the optimal tour walks the -perimeter with length 4. +Four cities at the corners of a unit square. The shortest tour +walks the perimeter (length 4). """ import pygad diff --git a/examples/benchmarks/example_zdt1.py b/examples/benchmarks/example_zdt1.py index 337c9b5..fd4f4e3 100644 --- a/examples/benchmarks/example_zdt1.py +++ b/examples/benchmarks/example_zdt1.py @@ -1,10 +1,4 @@ -""" -Run PyGAD with NSGA-II on the ZDT1 benchmark from -`pygad.benchmarks.zdt`. - -ZDT1 has two objectives and a convex Pareto front: - f2 = 1 - sqrt(f1) for f1 in [0, 1]. -""" +"""Run NSGA-II on ZDT1. Convex front: f2 = 1 - sqrt(f1).""" import pygad from pygad.benchmarks.zdt import ZDT1 diff --git a/examples/benchmarks/example_zdt2.py b/examples/benchmarks/example_zdt2.py index fd057e3..80ad8b2 100644 --- a/examples/benchmarks/example_zdt2.py +++ b/examples/benchmarks/example_zdt2.py @@ -1,11 +1,4 @@ -""" -Run PyGAD with NSGA-II on the ZDT2 benchmark from -`pygad.benchmarks.zdt`. - -ZDT2 has the same decision variable layout as ZDT1 but a non-convex -Pareto front: - f2 = 1 - f1**2 for f1 in [0, 1]. -""" +"""Run NSGA-II on ZDT2. Non-convex front: f2 = 1 - f1**2.""" import pygad from pygad.benchmarks.zdt import ZDT2 diff --git a/examples/benchmarks/example_zdt3.py b/examples/benchmarks/example_zdt3.py index 1c2864e..14361f4 100644 --- a/examples/benchmarks/example_zdt3.py +++ b/examples/benchmarks/example_zdt3.py @@ -1,10 +1,4 @@ -""" -Run PyGAD with NSGA-II on the ZDT3 benchmark from -`pygad.benchmarks.zdt`. - -ZDT3 has a Pareto front that is made of five disconnected convex -pieces, which makes it a good test for diversity preservation. -""" +"""Run NSGA-II on ZDT3. Front is five disconnected convex pieces.""" import pygad from pygad.benchmarks.zdt import ZDT3 diff --git a/examples/benchmarks/example_zdt4.py b/examples/benchmarks/example_zdt4.py index 412d8ce..d44d2ed 100644 --- a/examples/benchmarks/example_zdt4.py +++ b/examples/benchmarks/example_zdt4.py @@ -1,11 +1,4 @@ -""" -Run PyGAD with NSGA-II on the ZDT4 benchmark from -`pygad.benchmarks.zdt`. - -ZDT4 has the same convex front as ZDT1 but its search space has -many local minima. The first variable lives in [0, 1] and the rest -in [-5, 5]. -""" +"""Run NSGA-II on ZDT4. Same convex front as ZDT1; search space has many local minima.""" import pygad from pygad.benchmarks.zdt import ZDT4 diff --git a/examples/benchmarks/example_zdt6.py b/examples/benchmarks/example_zdt6.py index 76f9946..86a3c55 100644 --- a/examples/benchmarks/example_zdt6.py +++ b/examples/benchmarks/example_zdt6.py @@ -1,11 +1,4 @@ -""" -Run PyGAD with NSGA-II on the ZDT6 benchmark from -`pygad.benchmarks.zdt`. - -ZDT6 has a non-uniform Pareto front. Solutions cluster toward one -end so a good algorithm has to preserve diversity over the whole -front. -""" +"""Run NSGA-II on ZDT6. Non-uniform front; solutions cluster at one end.""" import pygad from pygad.benchmarks.zdt import ZDT6 diff --git a/examples/quality_indicators/example_generational_distance.py b/examples/quality_indicators/example_generational_distance.py index bbe8787..148c986 100644 --- a/examples/quality_indicators/example_generational_distance.py +++ b/examples/quality_indicators/example_generational_distance.py @@ -1,10 +1,7 @@ -""" -Compute the Generational Distance (GD) of the final NSGA-II -population on the ZDT2 benchmark. +"""Compute GD of the final NSGA-II population on ZDT2. -GD is the mean Euclidean distance from each approximation point to -its nearest true-front reference point. A smaller value is better; -GD only measures convergence and not diversity. +GD averages the distance from each approximation point to its +nearest true-front reference point. Smaller is better. """ import pygad diff --git a/examples/quality_indicators/example_hypervolume.py b/examples/quality_indicators/example_hypervolume.py index 4a352e8..63e3faa 100644 --- a/examples/quality_indicators/example_hypervolume.py +++ b/examples/quality_indicators/example_hypervolume.py @@ -1,12 +1,7 @@ -""" -Compute the hypervolume of the final NSGA-II population on the -ZDT1 benchmark. +"""Compute the hypervolume of the final NSGA-II population on ZDT1. -Hypervolume measures how much of the objective space is dominated -by the approximation front. A bigger value means better coverage. -The reference point must be worse than every solution on every -objective; under PyGAD's max convention this means it must be -strictly smaller than every fitness value. +The reference point must be worse than every solution on every axis, +which under PyGAD-max means strictly smaller than every fitness. """ import numpy @@ -32,7 +27,6 @@ ga.run() final_fitness = numpy.asarray(ga.last_generation_fitness) -# Reference: a little worse on every axis than the worst fitness seen. reference_point = final_fitness.min(axis=0) - 0.1 hv = hypervolume(final_fitness, reference_point) diff --git a/examples/quality_indicators/example_inverted_generational_distance.py b/examples/quality_indicators/example_inverted_generational_distance.py index 12942e8..ee83a50 100644 --- a/examples/quality_indicators/example_inverted_generational_distance.py +++ b/examples/quality_indicators/example_inverted_generational_distance.py @@ -1,10 +1,7 @@ -""" -Compute the Inverted Generational Distance (IGD) of the final -NSGA-II population on the ZDT1 benchmark. +"""Compute IGD of the final NSGA-II population on ZDT1. -IGD is the mean Euclidean distance from each true-front reference -point to its nearest approximation point. A smaller value is -better; it reports both convergence and diversity. +IGD averages the distance from each true-front reference point to +its nearest approximation point. Smaller is better. """ import pygad diff --git a/examples/quality_indicators/example_spacing.py b/examples/quality_indicators/example_spacing.py index ebaab3a..220accf 100644 --- a/examples/quality_indicators/example_spacing.py +++ b/examples/quality_indicators/example_spacing.py @@ -1,10 +1,7 @@ -""" -Compute the spacing metric of the final NSGA-II population on the -ZDT1 benchmark. +"""Compute the spacing metric of the final NSGA-II population on ZDT1. -Spacing is the standard deviation of the distance from each -solution to its nearest neighbour. A smaller value means the -solutions are spread more evenly along the front. +Spacing is the standard deviation of each solution's nearest +neighbour distance. Smaller means a more even spread. """ import pygad diff --git a/pygad/benchmarks/__init__.py b/pygad/benchmarks/__init__.py index 2e28228..79b0e47 100644 --- a/pygad/benchmarks/__init__.py +++ b/pygad/benchmarks/__init__.py @@ -1,12 +1,13 @@ """ -Standard benchmark problems for PyGAD. +Benchmark problems for PyGAD. -Every problem class can be called with the standard PyGAD fitness -function signature (ga, solution, sol_idx) and returns a fitness in -PyGAD's maximization format. The original minimization values are -negated so the user can plug the problem directly into PyGAD without -extra wrapping. Each class also has the attributes num_genes, -num_objectives, and bounds. +Each problem class can be called with the fitness signature +(ga, solution, sol_idx) and returns a fitness in PyGAD's +maximisation format. For problems that are normally written as +minimisation, the values are negated. + +Each class also exposes num_genes, num_objectives, and bounds so +you can plug it into pygad.GA directly. """ from pygad.benchmarks import classic diff --git a/pygad/benchmarks/classic.py b/pygad/benchmarks/classic.py index 51da649..73f0fc7 100644 --- a/pygad/benchmarks/classic.py +++ b/pygad/benchmarks/classic.py @@ -1,10 +1,9 @@ """ Classic single-objective benchmark problems. -Every problem class can be called with the PyGAD fitness function -signature (ga, solution, sol_idx) and returns a single fitness value. -The original minimization values are negated so PyGAD can maximize -toward the original minimum. +Each class is callable with the (ga, solution, sol_idx) signature +and returns a single fitness value. Minimisation values are negated +so PyGAD can maximise them. """ import math @@ -21,10 +20,7 @@ def __init__(self, num_genes): class Sphere(_SingleObjectiveProblem): - """ - Sphere function. The global minimum is at the origin where - f(x) = 0. - """ + """Sphere. Global minimum at the origin, f(x) = 0.""" bounds = (-5.12, 5.12) def __init__(self, num_genes=10): @@ -36,10 +32,7 @@ def __call__(self, ga, solution, sol_idx): class Rastrigin(_SingleObjectiveProblem): - """ - Rastrigin function. It has many local minima placed at regular - spaces. The global minimum is at the origin where f(x) = 0. - """ + """Rastrigin. Many regularly-spaced local minima. Global minimum at the origin, f(x) = 0.""" bounds = (-5.12, 5.12) def __init__(self, num_genes=10): @@ -53,9 +46,8 @@ def __call__(self, ga, solution, sol_idx): class Rosenbrock(_SingleObjectiveProblem): """ - Rosenbrock function. The global minimum is at x = (1, 1, ..., 1) - where f(x) = 0. The minimum sits at the bottom of a long, narrow, - banana-shaped valley. + Rosenbrock. Global minimum at x = (1, ..., 1), f(x) = 0. + The minimum sits in a long narrow banana-shaped valley. """ bounds = (-5.0, 10.0) @@ -69,10 +61,7 @@ def __call__(self, ga, solution, sol_idx): class Griewank(_SingleObjectiveProblem): - """ - Griewank function. It has many local minima spread over a wide - area. The global minimum is at the origin where f(x) = 0. - """ + """Griewank. Many local minima over a wide area. Global minimum at the origin, f(x) = 0.""" bounds = (-600.0, 600.0) def __init__(self, num_genes=10): @@ -89,10 +78,9 @@ def __call__(self, ga, solution, sol_idx): class Schwefel(_SingleObjectiveProblem): """ - Schwefel function. The global minimum is at - x = (420.9687, 420.9687, ..., 420.9687) and f(x) is close to 0. - The global minimum sits far from the next-best local minimum so - the function is hard for many algorithms. + Schwefel. Global minimum at x = (420.9687, ..., 420.9687), f(x) ~ 0. + It sits far from the next-best local minimum, which trips up + many algorithms. """ bounds = (-500.0, 500.0) @@ -106,10 +94,7 @@ def __call__(self, ga, solution, sol_idx): class Ackley(_SingleObjectiveProblem): - """ - Ackley function. It has a near-flat outer region with a deep, - narrow basin at the origin where f(x) = 0. - """ + """Ackley. Near-flat outer region with a deep narrow basin at the origin, f(x) = 0.""" bounds = (-32.768, 32.768) def __init__(self, num_genes=10): @@ -128,8 +113,7 @@ def __call__(self, ga, solution, sol_idx): class Himmelblau(_SingleObjectiveProblem): """ - Himmelblau function. A 2D problem with four equal global minima - at f(x, y) = 0: + Himmelblau. 2D problem with four equal global minima at f = 0: (3.0, 2.0), (-2.805, 3.131), (-3.779, -3.283), diff --git a/pygad/benchmarks/dtlz.py b/pygad/benchmarks/dtlz.py index 0c771a1..1bb51a5 100644 --- a/pygad/benchmarks/dtlz.py +++ b/pygad/benchmarks/dtlz.py @@ -1,13 +1,11 @@ """ -DTLZ family of multi-objective benchmark problems. +DTLZ multi-objective benchmark problems. -Every problem supports an arbitrary number of objectives M and a -number of decision variables n. By convention n = M + k - 1 where k -is the number of "distance" variables. The defaults use k = 5 for -DTLZ1 and k = 10 for DTLZ2, DTLZ3, and DTLZ4. +Each problem takes M (objectives) and k (distance variables). The +number of decision variables is M + k - 1. Defaults: k = 5 for +DTLZ1, k = 10 for DTLZ2, DTLZ3, and DTLZ4. -All fitness values are negated so PyGAD can maximize toward the -original minimum. +Fitness values are negated so PyGAD can maximise them. """ import math @@ -31,9 +29,8 @@ def __init__(self, num_objectives, num_distance_vars): class DTLZ1(_DtlzProblem): """ - DTLZ1. The Pareto front is a linear hyperplane where - sum(f_i) = 0.5. The g-function has many local minima so the - problem is hard to converge. + DTLZ1. Pareto front is the linear hyperplane sum(f_i) = 0.5. + The g-function has many local minima. """ def __init__(self, num_objectives=3, num_distance_vars=5): @@ -62,9 +59,8 @@ def __call__(self, ga, solution, sol_idx): class DTLZ2(_DtlzProblem): """ - DTLZ2. The Pareto front is the part of the unit sphere where - sum(f_i ** 2) = 1 in the first orthant. The g-function is - simple, so the main challenge is keeping the population diverse. + DTLZ2. Pareto front is the first orthant of the unit sphere + (sum(f_i ** 2) = 1). g is simple, so the challenge is diversity. """ def __init__(self, num_objectives=3, num_distance_vars=10): @@ -90,9 +86,8 @@ def __call__(self, ga, solution, sol_idx): class DTLZ3(_DtlzProblem): """ - DTLZ3. Same Pareto front shape as DTLZ2 (the unit sphere). But - the g-function is the hard multimodal one from DTLZ1, so the - problem is harder to converge. + DTLZ3. Same unit-sphere front as DTLZ2, with the hard + multimodal g from DTLZ1. Convergence is harder. """ def __init__(self, num_objectives=3, num_distance_vars=10): @@ -122,9 +117,8 @@ def __call__(self, ga, solution, sol_idx): class DTLZ4(_DtlzProblem): """ - DTLZ4. Same shape as DTLZ2 but the position variables are raised - to a power (alpha, default 100). This makes the front strongly - biased toward one corner. + DTLZ4. Same shape as DTLZ2, but position variables are raised + to alpha (default 100). Solutions get pushed toward one corner. """ def __init__(self, num_objectives=3, num_distance_vars=10, alpha=100.0): diff --git a/pygad/benchmarks/knapsack.py b/pygad/benchmarks/knapsack.py index 52283fa..c6101d7 100644 --- a/pygad/benchmarks/knapsack.py +++ b/pygad/benchmarks/knapsack.py @@ -1,13 +1,12 @@ """ -0/1 Knapsack benchmark problem. +0/1 Knapsack benchmark. -Each item has a weight and a value. The goal is to pick a subset of -items so the total value is the maximum possible while keeping the -total weight at or below the capacity. +Each item has a weight and a value. Pick a subset of items so the +total value is the largest possible while the total weight stays +within the capacity. -A solution is a binary vector of length num_items. A 1 means the -item is picked and a 0 means it is not. To plug into PyGAD use the -class attributes `gene_space` and `gene_type` directly: +A solution is a binary vector (one bit per item). Plug into PyGAD +with the class attributes: problem = Knapsack(weights=[...], values=[...], capacity=...) ga = pygad.GA( @@ -24,12 +23,10 @@ class attributes `gene_space` and `gene_type` directly: class Knapsack: """ - 0/1 knapsack problem. + 0/1 knapsack. - If a candidate exceeds the capacity, the fitness is negative and - scaled by how much the solution is over the limit. So infeasible - solutions still carry useful gradient information toward the - feasible region. + If a solution is over capacity, fitness is negative and scaled by + the overweight amount. This keeps a gradient toward feasibility. """ num_objectives = 1 gene_space = [0, 1] @@ -49,14 +46,11 @@ def __init__(self, weights, values, capacity): f"weights and values must have the same length, but got " f"{weights.shape[0]} weights and {values.shape[0]} values.") if not numpy.all(weights >= 0): - raise ValueError( - "weights must be non-negative.") + raise ValueError("weights must be non-negative.") if not numpy.all(values >= 0): - raise ValueError( - "values must be non-negative.") + raise ValueError("values must be non-negative.") if capacity <= 0: - raise ValueError( - f"capacity must be positive, but got {capacity}.") + raise ValueError(f"capacity must be positive, but got {capacity}.") self.weights = weights self.values = values self.capacity = float(capacity) diff --git a/pygad/benchmarks/tsp.py b/pygad/benchmarks/tsp.py index ed60245..7642c7a 100644 --- a/pygad/benchmarks/tsp.py +++ b/pygad/benchmarks/tsp.py @@ -1,78 +1,46 @@ """ Travelling Salesman Problem (TSP) benchmark. -The problem is to find the shortest closed tour that visits every -city exactly once and returns to the starting city. A solution is a -permutation of the city indices [0, 1, ..., num_cities - 1]. The -fitness is the negative tour length so PyGAD can maximize toward the -shortest tour. +A solution is a permutation of city indices. Fitness is the +negative tour length so PyGAD can maximise it. -Two ways to build the problem: - -1. Pass `coordinates` as a 2D array of shape (num_cities, num_dims). - The class computes the Euclidean distance matrix internally. -2. Pass `distance_matrix` as a 2D square array of pairwise distances. - -To plug into PyGAD, use the class attributes that describe the -permutation encoding: - - problem = TSP(coordinates=[...]) - ga = pygad.GA( - ..., - num_genes=problem.num_genes, - gene_space=problem.gene_space, - gene_type=problem.gene_type, - allow_duplicate_genes=problem.allow_duplicate_genes, - fitness_func=problem, - ) +Build the problem from a 2D array of coordinates or from a +precomputed distance matrix. The class exposes gene_space, +gene_type, and allow_duplicate_genes so it plugs into PyGAD as is. """ import numpy class TSP: - """ - Travelling Salesman Problem with a closed tour. - - The fitness is the negative of the tour length so the GA can - maximize toward the shortest tour. Any solution that is not a - valid permutation (a duplicate or an out-of-range index) returns - a large negative penalty that scales with the violation count, so - the GA still gets a useful gradient toward feasibility. - """ + """0/1 closed-tour TSP.""" num_objectives = 1 gene_type = int allow_duplicate_genes = False def __init__(self, coordinates=None, distance_matrix=None): if (coordinates is None) == (distance_matrix is None): - raise ValueError( - "Pass exactly one of coordinates or distance_matrix.") + raise ValueError("Pass exactly one of coordinates or distance_matrix.") if coordinates is not None: coordinates = numpy.asarray(coordinates, dtype=float) if coordinates.ndim != 2: raise ValueError( - f"coordinates must be a 2D array, but got shape " - f"{coordinates.shape}.") + f"coordinates must be a 2D array, but got shape {coordinates.shape}.") if coordinates.shape[0] < 2: raise ValueError( - f"coordinates must have at least 2 rows, but got " - f"{coordinates.shape[0]}.") + f"coordinates must have at least 2 rows, but got {coordinates.shape[0]}.") self.coordinates = coordinates self.distance_matrix = self._build_distance_matrix(coordinates) else: distance_matrix = numpy.asarray(distance_matrix, dtype=float) if distance_matrix.ndim != 2 or distance_matrix.shape[0] != distance_matrix.shape[1]: raise ValueError( - f"distance_matrix must be square, but got shape " - f"{distance_matrix.shape}.") + f"distance_matrix must be square, but got shape {distance_matrix.shape}.") if distance_matrix.shape[0] < 2: raise ValueError( - f"distance_matrix must have at least 2 rows, but got " - f"{distance_matrix.shape[0]}.") + f"distance_matrix must have at least 2 rows, but got {distance_matrix.shape[0]}.") if numpy.any(distance_matrix < 0): - raise ValueError( - "distance_matrix entries must be non-negative.") + raise ValueError("distance_matrix entries must be non-negative.") self.coordinates = None self.distance_matrix = distance_matrix self.num_genes = int(self.distance_matrix.shape[0]) @@ -84,11 +52,7 @@ def _build_distance_matrix(coordinates): return numpy.sqrt((diff * diff).sum(axis=2)) def tour_length(self, tour): - """ - Total length of the closed tour described by `tour`. The tour - is a sequence of city indices; the last leg goes from the - last city back to the first. - """ + """Length of the closed tour. Last leg goes from the last city back to the first.""" tour = numpy.asarray(tour, dtype=int) next_city = numpy.roll(tour, -1) return float(self.distance_matrix[tour, next_city].sum()) diff --git a/pygad/benchmarks/zdt.py b/pygad/benchmarks/zdt.py index 884a6c6..befd10e 100644 --- a/pygad/benchmarks/zdt.py +++ b/pygad/benchmarks/zdt.py @@ -1,12 +1,10 @@ """ -ZDT family of multi-objective benchmark problems. - -All ZDT problems have two objectives, real decision variables in -[0, 1] (except ZDT4 which uses a wider range for some variables), -and a known Pareto front. Every class has a pareto_front() method -that returns reference points on the true front in PyGAD's -maximization format (already negated). The user can pass these to -the IGD and GD quality indicators as the reference_front argument. +ZDT multi-objective benchmark problems. + +Two objectives. Variables live in [0, 1] (ZDT4 uses a wider range +for some). Every class has a pareto_front() method that returns +points on the true front in PyGAD's maximisation format (negated), +which you can pass to the IGD and GD indicators as reference_front. """ import numpy @@ -23,9 +21,8 @@ def __init__(self, num_genes): class ZDT1(_ZdtProblem): """ - ZDT1. The Pareto front is a convex curve: - f2 = 1 - sqrt(f1) for f1 in [0, 1]. - Optimal solutions have x_0 in [0, 1] and x_i = 0 for i >= 1. + ZDT1. Convex front: f2 = 1 - sqrt(f1) for f1 in [0, 1]. + Optimal solutions: x_0 in [0, 1], x_i = 0 for i >= 1. """ def __init__(self, num_genes=30): @@ -46,9 +43,8 @@ def pareto_front(self, num_points=100): class ZDT2(_ZdtProblem): """ - ZDT2. The Pareto front is a non-convex curve: - f2 = 1 - f1**2 for f1 in [0, 1]. - The decision variable layout is the same as ZDT1. + ZDT2. Non-convex front: f2 = 1 - f1**2 for f1 in [0, 1]. + Same variable layout as ZDT1. """ def __init__(self, num_genes=30): @@ -68,10 +64,7 @@ def pareto_front(self, num_points=100): class ZDT3(_ZdtProblem): - """ - ZDT3. The Pareto front is made of five disconnected convex - pieces. - """ + """ZDT3. Front is five disconnected convex pieces.""" def __init__(self, num_genes=30): super().__init__(num_genes) @@ -87,8 +80,7 @@ def __call__(self, ga, solution, sol_idx): class ZDT4(_ZdtProblem): """ - ZDT4. The first variable lives in [0, 1] but the rest live in - [-5, 5]. The Pareto front has the same shape as ZDT1 + ZDT4. x_0 in [0, 1], rest in [-5, 5]. Same convex front as ZDT1 (f2 = 1 - sqrt(f1)), but the search space has many local minima. """ bounds = (-5.0, 5.0) @@ -114,8 +106,7 @@ def pareto_front(self, num_points=100): class ZDT6(_ZdtProblem): """ - ZDT6. The Pareto front is non-uniform. Solutions cluster toward - one end of the front. + ZDT6. Non-uniform front; solutions cluster at one end. """ def __init__(self, num_genes=10): diff --git a/pygad/utils/nsga3.py b/pygad/utils/nsga3.py index 0032292..6fef25e 100644 --- a/pygad/utils/nsga3.py +++ b/pygad/utils/nsga3.py @@ -203,10 +203,11 @@ def normalise_fitness(self, fitness, ideal_point, intercepts): ideal_point = numpy.asarray(ideal_point, dtype=float) intercepts = numpy.asarray(intercepts, dtype=float) denominator = intercepts - ideal_point - # If the denominator is essentially zero on some axis, replace it - # with a tiny non-zero value so we do not divide by zero. - safe_denominator = numpy.where(numpy.abs(denominator) < INTERCEPT_NEAR_ZERO, - numpy.sign(denominator) * INTERCEPT_NEAR_ZERO + INTERCEPT_NEAR_ZERO, + # Under PyGAD-max, intercepts sit below ideal so denominator is + # negative. Replace near-zero entries with a tiny negative value + # to keep the sign correct and avoid divide-by-zero. + safe_denominator = numpy.where(denominator > -INTERCEPT_NEAR_ZERO, + -INTERCEPT_NEAR_ZERO, denominator) raw = (fitness - ideal_point) / safe_denominator return numpy.clip(raw, 0.0, 1.0) diff --git a/pygad/utils/quality_indicators.py b/pygad/utils/quality_indicators.py index 7d3ae01..673e080 100644 --- a/pygad/utils/quality_indicators.py +++ b/pygad/utils/quality_indicators.py @@ -1,37 +1,31 @@ """ -Quality indicators for multi-objective optimization problems. +Quality indicators for multi-objective optimisation. -The module has four common indicators that the user can use to check -the quality of a Pareto front built by PyGAD: +Four indicators to measure the quality of a Pareto front built by +PyGAD: 1. hypervolume: volume of the objective space dominated by the front. 2. inverted_generational_distance: mean distance from each reference point to its nearest approximation point. -3. generational_distance: mean distance from each approximation point - to its nearest reference point. +3. generational_distance: mean distance from each approximation + point to its nearest reference point. 4. spacing: how evenly the approximation points are spread. -All functions expect fitness values in PyGAD's maximization format -(higher means better). The reference point passed to hypervolume must -be worse than every solution on every axis. +All functions take fitness values in PyGAD's maximisation format +(higher is better). The reference point for hypervolume must be +worse than every solution on every axis. """ import numpy def _to_min_fitness(fitness): - """ - Negate the fitness so the rest of the module can use the - minimization form that the standard hypervolume algorithm uses. - """ + """Negate the fitness to switch to minimisation.""" return -numpy.asarray(fitness, dtype=float) def _drop_dominated_under_min(points): - """ - Return the rows of points that are not dominated by any other row - under minimization. The order of the input rows is kept. - """ + """Drop dominated rows under minimisation. Keeps input order.""" n = points.shape[0] keep = numpy.ones(n, dtype=bool) for i in range(n): @@ -47,11 +41,7 @@ def _drop_dominated_under_min(points): def _inclusive_hv(point, reference_point): - """ - Volume of the box whose lower corner is the point and whose upper - corner is the reference point. Returns 0 if the point does not sit - below the reference on every axis. - """ + """Volume of the box between point and reference. 0 if point does not sit below the reference on every axis.""" diff = reference_point - point if numpy.any(diff <= 0): return 0.0 @@ -60,11 +50,8 @@ def _inclusive_hv(point, reference_point): def _wfg_exclusive_hv(point, others, reference_point): """ - Volume dominated only by the given point and not by any of the - other points. Uses the WFG recurrence: - + WFG recurrence: exclusive(p, others) = inclusive(p) - hv(limit(p, others)) - where limit(p, q) pushes every other point up to the corner of p. """ base = _inclusive_hv(point, reference_point) @@ -76,14 +63,10 @@ def _wfg_exclusive_hv(point, others, reference_point): def _hv_under_min(points, reference_point): - """ - Hypervolume of points (under minimization) bounded by the - reference point. Uses the WFG recurrence which is fast enough - for the population sizes PyGAD usually runs. - """ + """WFG hypervolume under minimisation. Fast enough for typical PyGAD populations.""" if len(points) == 0: return 0.0 - # Sort by the last objective so the recursion stays shallow. + # Sort by the last objective to keep recursion shallow. order = numpy.argsort(points[:, -1]) sorted_points = points[order] total = 0.0 @@ -95,36 +78,31 @@ def _hv_under_min(points, reference_point): def hypervolume(fitness, reference_point): """ - Return the hypervolume of the Pareto front made from every row in - fitness. The reference point is the worst case on every objective. - Under PyGAD's maximization format the reference values must be - smaller than every fitness value. + Hypervolume of the Pareto front built from every row in fitness. - The function negates the fitness and the reference internally so - it can use a standard hypervolume algorithm written for - minimization. The returned volume is positive. + The reference is the worst case on every axis. Under PyGAD-max it + must be smaller than every fitness value. The function flips the + sign internally so the WFG algorithm (written for minimisation) + can be reused. The returned value is positive; bigger is better. Parameters ---------- fitness : numpy.ndarray - A 2D array of fitness values of shape - (num_solutions, num_objectives). + 2D array of shape (num_solutions, num_objectives). reference_point : array-like - A 1D array of length num_objectives. Every entry must be - smaller than the matching column min of fitness. + 1D array of length num_objectives, smaller than every entry + in the matching fitness column. Returns ------- hv : float - The hypervolume value. A bigger value means better coverage - of the objective space. Raises ------ ValueError - If fitness is not 2D, if the reference point has the wrong - shape, or if the reference point is not worse than every - solution on every axis. + If fitness is not 2D, if reference_point has the wrong shape, + or if reference_point is not smaller than every solution on + every axis. """ fitness_arr = numpy.asarray(fitness, dtype=float) reference_arr = numpy.asarray(reference_point, dtype=float) @@ -135,7 +113,6 @@ def hypervolume(fitness, reference_point): raise ValueError( f"reference_point must have shape ({fitness_arr.shape[1]},), " f"but got {reference_arr.shape}.") - # Under PyGAD max, every solution must beat the reference on every axis. if numpy.any(fitness_arr.min(axis=0) <= reference_arr): raise ValueError( "reference_point must be smaller than every solution on every " @@ -148,10 +125,7 @@ def hypervolume(fitness, reference_point): def _euclidean_distance_matrix(a, b): - """ - Return a matrix d of shape (len(a), len(b)) where d[i, j] is the - Euclidean distance between row i of a and row j of b. - """ + """Pairwise Euclidean distances; d[i, j] = ||a[i] - b[j]||.""" a = numpy.asarray(a, dtype=float) b = numpy.asarray(b, dtype=float) diff = a[:, None, :] - b[None, :, :] @@ -160,27 +134,22 @@ def _euclidean_distance_matrix(a, b): def inverted_generational_distance(fitness, reference_front): """ - Return the Inverted Generational Distance (IGD): the mean - Euclidean distance from each reference-front point to its nearest - point in the approximation front. - - A smaller value is better. IGD reports both convergence (how far - the approximation is from the true front) and diversity (how much - of the true front is covered). + Inverted Generational Distance (IGD): mean distance from each + reference point to its nearest approximation point. Smaller is + better; reports both convergence and diversity. Parameters ---------- fitness : numpy.ndarray - Approximation front of shape (num_solutions, num_objectives) - in PyGAD's maximization format. + Approximation front, shape (num_solutions, num_objectives), + in PyGAD's maximisation format. reference_front : numpy.ndarray - Reference front of shape - (num_reference_points, num_objectives) in the same format. + Reference front, shape (num_reference_points, num_objectives), + in the same format. Returns ------- igd : float - The IGD value. """ distance_matrix = _euclidean_distance_matrix(reference_front, fitness) return float(distance_matrix.min(axis=1).mean()) @@ -188,25 +157,22 @@ def inverted_generational_distance(fitness, reference_front): def generational_distance(fitness, reference_front): """ - Return the Generational Distance (GD): the mean Euclidean distance - from each approximation point to its nearest reference point. - - A smaller value is better. GD only measures convergence and not - diversity. + Generational Distance (GD): mean distance from each approximation + point to its nearest reference point. Smaller is better; measures + convergence only. Parameters ---------- fitness : numpy.ndarray - Approximation front of shape (num_solutions, num_objectives) - in PyGAD's maximization format. + Approximation front, shape (num_solutions, num_objectives), + in PyGAD's maximisation format. reference_front : numpy.ndarray - Reference front of shape - (num_reference_points, num_objectives) in the same format. + Reference front, shape (num_reference_points, num_objectives), + in the same format. Returns ------- gd : float - The GD value. """ distance_matrix = _euclidean_distance_matrix(fitness, reference_front) return float(distance_matrix.min(axis=1).mean()) @@ -214,27 +180,26 @@ def generational_distance(fitness, reference_front): def spacing(fitness): """ - Return the spacing metric: the standard deviation of the distance - from each solution to its nearest neighbour. A smaller value means - the solutions are spread more evenly. + Spacing: standard deviation of each solution's nearest-neighbour + distance. Smaller means the solutions are more evenly spread. + + Returns 0.0 when fewer than two solutions are given so the caller + does not have to special-case it. Parameters ---------- fitness : numpy.ndarray - Approximation front of shape (num_solutions, num_objectives) - in PyGAD's maximization format. + Approximation front, shape (num_solutions, num_objectives), + in PyGAD's maximisation format. Returns ------- spacing_value : float - The spacing metric. Returns 0.0 when fewer than two solutions - are given. """ fitness_arr = numpy.asarray(fitness, dtype=float) if fitness_arr.shape[0] < 2: return 0.0 distance_matrix = _euclidean_distance_matrix(fitness_arr, fitness_arr) - # Skip the zero distance from each point to itself. numpy.fill_diagonal(distance_matrix, numpy.inf) nearest_neighbour_distance = distance_matrix.min(axis=1) mean_distance = nearest_neighbour_distance.mean() diff --git a/setup_venv.sh b/setup_venv.sh new file mode 100755 index 0000000..768b773 --- /dev/null +++ b/setup_venv.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Set up a virtual environment for PyGAD. +# +# Usage: +# ./setup_venv.sh +# PYTHON=python3.12 ./setup_venv.sh + +set -euo pipefail + +PYTHON="${PYTHON:-python3}" +VENV_DIR=".venv" + +cd "$(dirname "$0")" + +if ! command -v "$PYTHON" >/dev/null 2>&1; then + echo "Error: $PYTHON not found." >&2 + exit 1 +fi + +if [ -d "$VENV_DIR" ]; then + echo "$VENV_DIR already exists. Delete it first to rebuild: rm -rf $VENV_DIR" +else + echo "Creating $VENV_DIR with $PYTHON ..." + "$PYTHON" -m venv "$VENV_DIR" +fi + +# shellcheck disable=SC1091 +source "$VENV_DIR/bin/activate" + +python -m pip install --upgrade pip +python -m pip install -e ".[visualize]" +python -m pip install pytest + +echo "" +echo "Done. Activate with: source $VENV_DIR/bin/activate" diff --git a/tests/test_benchmarks.py b/tests/test_benchmarks.py index 5feb196..02b4db8 100644 --- a/tests/test_benchmarks.py +++ b/tests/test_benchmarks.py @@ -11,8 +11,7 @@ def test_sphere_global_minimum_at_origin(): - # The Sphere function has its global minimum at the origin where - # f(x) = 0. Under PyGAD's max convention the fitness is -0 = 0. + # f(0) = 0, negated -> 0. problem = classic.Sphere(num_genes=5) fitness = problem(None, numpy.zeros(5), 0) assert fitness == pytest.approx(0.0, abs=1e-12) @@ -39,8 +38,7 @@ def test_griewank_global_minimum_at_origin(): def test_schwefel_global_minimum_at_420(): problem = classic.Schwefel(num_genes=3) fitness = problem(None, numpy.full(3, 420.9687), 0) - # The Schwefel constant is an approximation, so the fitness is - # near zero but not exactly zero. + # 420.9687 is an approximation; expect near-zero but not exact. assert fitness == pytest.approx(0.0, abs=1e-3) @@ -63,8 +61,7 @@ def test_himmelblau_known_global_minima_all_evaluate_to_zero(): def test_sphere_integrates_with_pygad_ga_loop(): - # End-to-end check: run a few generations to confirm the problem - # class plugs into PyGAD without configuration tweaks. + # End-to-end check that the problem class plugs into pygad.GA. problem = classic.Sphere(num_genes=5) ga = pygad.GA(num_generations=10, num_parents_mating=6, @@ -76,7 +73,7 @@ def test_sphere_integrates_with_pygad_ga_loop(): random_seed=1, suppress_warnings=True) ga.run() - # Best fitness must be at most 0 (it is the negated sum of squares). + # Negated sum of squares is <= 0. best_fitness = ga.best_solution(ga.last_generation_fitness)[1] assert best_fitness <= 0.0 @@ -88,7 +85,7 @@ def test_zdt1_returns_two_objectives_and_pareto_front_is_convex(): problem = zdt.ZDT1(num_genes=10) output = problem(None, numpy.zeros(10), 0) assert len(output) == 2 - # On the Pareto front (x_1..x_n = 0) f1 = x_0 and f2 = 1 - sqrt(f1). + # On the front: x_1..x_n = 0, so f1 = x_0 and f2 = 1 - sqrt(f1). optimal_solution = numpy.array([0.5] + [0.0] * 9) f1_max, f2_max = problem(None, optimal_solution, 0) assert f1_max == pytest.approx(-0.5) @@ -97,8 +94,7 @@ def test_zdt1_returns_two_objectives_and_pareto_front_is_convex(): def test_zdt1_pareto_front_values_satisfy_curve(): front = zdt.ZDT1().pareto_front(num_points=11) - # Negate back to the original min convention so the relation - # f2 = 1 - sqrt(f1) is easy to check. + # Negate back to min space to check f2 = 1 - sqrt(f1). f1 = -front[:, 0] f2 = -front[:, 1] numpy.testing.assert_allclose(f2, 1.0 - numpy.sqrt(f1), atol=1e-9) @@ -126,8 +122,7 @@ def test_zdt4_returns_two_objectives_and_uses_wider_bounds(): def test_zdt6_returns_two_objectives_with_correct_optimal_value(): problem = zdt.ZDT6(num_genes=10) - # When all rest of the variables are 0 the front has g = 1, so - # f1 = 1 - exp(-4 * x0) * sin(6 pi x0)^6 and f2 = 1 - f1^2. + # x_1..x_n = 0 -> g = 1, so f1 = 1 - exp(-4 x0) sin(6 pi x0)^6 and f2 = 1 - f1^2. solution = numpy.array([0.1] + [0.0] * 9) f1_max, f2_max = problem(None, solution, 0) expected_f1 = 1.0 - math.exp(-0.4) * math.sin(0.6 * math.pi) ** 6 @@ -141,8 +136,7 @@ def test_zdt6_returns_two_objectives_with_correct_optimal_value(): def test_dtlz1_returns_three_objectives_on_pareto_optimal_solution(): problem = dtlz.DTLZ1(num_objectives=3, num_distance_vars=5) - # Distance variables at 0.5 give g = 0, so each f_i = 0.5 * - # product of position variables (the simplex sum = 0.5). + # Distance vars at 0.5 -> g = 0 -> objectives sum to 0.5. solution = numpy.array([0.5, 0.5] + [0.5] * 5) objectives = problem(None, solution, 0) assert len(objectives) == 3 @@ -151,8 +145,7 @@ def test_dtlz1_returns_three_objectives_on_pareto_optimal_solution(): def test_dtlz2_returns_three_objectives_on_unit_sphere_pareto_solution(): problem = dtlz.DTLZ2(num_objectives=3, num_distance_vars=10) - # Distance variables at 0.5 give g = 0, so the solution lives on - # the unit sphere in the first orthant. + # Distance vars at 0.5 -> g = 0 -> solution sits on the unit sphere. solution = numpy.array([0.3, 0.7] + [0.5] * 10) objectives = problem(None, solution, 0) radius_squared = sum(f ** 2 for f in objectives) @@ -160,9 +153,8 @@ def test_dtlz2_returns_three_objectives_on_unit_sphere_pareto_solution(): def test_dtlz3_uses_hard_g_function(): - # When distance variables are at 0.5 the g-function evaluates to - # 0 even with DTLZ3's hard multimodal definition, so the front - # also lives on the unit sphere. + # Distance vars at 0.5 -> g = 0 even for the hard g, so the front + # is again the unit sphere. problem = dtlz.DTLZ3(num_objectives=3, num_distance_vars=10) solution = numpy.array([0.4, 0.6] + [0.5] * 10) objectives = problem(None, solution, 0) @@ -171,13 +163,11 @@ def test_dtlz3_uses_hard_g_function(): def test_dtlz4_alpha_biases_objectives_toward_one_corner(): - # With alpha large, the position variables get squashed toward 0 - # unless x is very close to 1. So with x_position = 0.5 most - # objective weight ends up on the first objective. + # Large alpha squashes position vars to ~0 unless x is near 1. + # So with x_pos = 0.5 most weight ends up on f1 (cos(~0) ~ 1). problem = dtlz.DTLZ4(num_objectives=3, num_distance_vars=10, alpha=100.0) solution = numpy.array([0.5, 0.5] + [0.5] * 10) objectives = problem(None, solution, 0) - # The first objective dominates because cos(very small angle) ≈ 1. abs_objectives = [abs(f) for f in objectives] assert abs_objectives[0] == max(abs_objectives) @@ -188,7 +178,6 @@ def test_dtlz2_rejects_num_objectives_below_two(): def test_benchmarks_module_is_importable_from_top_level(): - # Sanity check that the user-facing import path works. assert pygad.benchmarks.classic.Sphere(num_genes=2).num_genes == 2 assert pygad.benchmarks.zdt.ZDT1().num_objectives == 2 assert pygad.benchmarks.dtlz.DTLZ2().num_objectives == 3 @@ -205,7 +194,7 @@ def test_knapsack_returns_sum_of_chosen_values_when_feasible(): problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0], values=[10.0, 20.0, 30.0], capacity=5.0) - # Picking items 0 and 1: weight = 5 (at capacity), value = 30. + # Pick items 0 and 1: weight = 5 (at capacity), value = 30. fitness = problem(None, numpy.array([1, 1, 0]), 0) assert fitness == pytest.approx(30.0) @@ -221,7 +210,7 @@ def test_knapsack_overweight_solution_gets_negative_fitness(): problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0], values=[10.0, 20.0, 30.0], capacity=5.0) - # Picking all three items: weight = 9, over capacity by 4. + # All three items: weight = 9, over by 4. fitness = problem(None, numpy.array([1, 1, 1]), 0) assert fitness == pytest.approx(-4.0) @@ -249,9 +238,8 @@ def test_knapsack_rejects_negative_weights(): def test_knapsack_finds_optimal_solution_on_small_instance_end_to_end(): - # Classic small knapsack instance with a known optimal subset. - # Items (weight, value): (2,3), (3,4), (4,5), (5,6). - # Capacity = 5. Optimal subset = items 0 and 1 (weight 5, value 7). + # Items (w, v): (2,3), (3,4), (4,5), (5,6). Capacity 5. + # Optimal: items 0 and 1 (weight 5, value 7). problem = knapsack.Knapsack(weights=[2.0, 3.0, 4.0, 5.0], values=[3.0, 4.0, 5.0, 6.0], capacity=5.0) @@ -274,8 +262,7 @@ def test_knapsack_finds_optimal_solution_on_small_instance_end_to_end(): def test_tsp_tour_length_on_unit_square(): - # Unit square with cities in order (0,0), (1,0), (1,1), (0,1). - # The closed tour visiting them in that order has length 4. + # Perimeter of the unit square is 4. problem = tsp.TSP(coordinates=[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], @@ -284,10 +271,10 @@ def test_tsp_tour_length_on_unit_square(): def test_tsp_fitness_is_negative_of_tour_length(): + # 3-4-5 right triangle, tour length = 3 + 4 + 5 = 12. problem = tsp.TSP(coordinates=[[0.0, 0.0], [3.0, 0.0], [3.0, 4.0]]) - # 3-4-5 triangle: tour length = 3 + 4 + 5 = 12. fitness = problem(None, numpy.array([0, 1, 2]), 0) assert fitness == pytest.approx(-12.0) @@ -302,11 +289,11 @@ def test_tsp_accepts_precomputed_distance_matrix(): def test_tsp_invalid_permutation_returns_penalty(): + # Duplicate of city 0; city 3 missing. problem = tsp.TSP(coordinates=[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]]) - # Duplicate city 0 and missing city 3. fitness = problem(None, numpy.array([0, 1, 2, 0]), 0) assert fitness < -problem.distance_matrix.sum() @@ -334,10 +321,7 @@ def test_tsp_rejects_negative_distance(): def test_tsp_finds_optimal_tour_on_small_square_end_to_end(): - # Square with side 1: optimal tour is the perimeter, length 4. - # Any tour that crosses the square (e.g. 0-2-1-3) is longer - # (2 + sqrt(2) + 2 + sqrt(2) > 4) so the GA must learn to walk - # the perimeter. + # Perimeter tour has length 4; any crossing tour is longer. problem = tsp.TSP(coordinates=[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], diff --git a/tests/test_nsga3.py b/tests/test_nsga3.py index 9170262..58d8b62 100644 --- a/tests/test_nsga3.py +++ b/tests/test_nsga3.py @@ -150,6 +150,20 @@ def test_normalise_fitness_clips_above_one_and_below_zero(nsga3): assert normalised.max() <= 1.0 +def test_normalise_fitness_handles_near_zero_negative_denominator(nsga3): + # Intercept sits within 1e-12 of the ideal so the denominator + # collapses to a tiny negative. The safeguard must keep the sign + # negative so (fitness - ideal) / denom comes out positive (and + # then clips to 1.0). A buggy safeguard that lets the denom flip + # to zero or positive would produce inf / nan or 0.0 instead. + ideal = numpy.array([0.0]) + intercepts = numpy.array([-1e-15]) + fitness = numpy.array([[-1.0]]) + normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) + assert numpy.all(numpy.isfinite(normalised)) + assert normalised[0, 0] == pytest.approx(1.0) + + # Reference points for M=2, p=3 in the order generate_reference_points # emits them (stars-and-bars enumeration). REFERENCE_POINTS_M2_P3 = numpy.array([ diff --git a/tests/test_quality_indicators.py b/tests/test_quality_indicators.py index 2e37bd8..9c99774 100644 --- a/tests/test_quality_indicators.py +++ b/tests/test_quality_indicators.py @@ -4,9 +4,8 @@ from pygad.utils import quality_indicators -# Two-objective example used for hand-derived expected values. Under -# the PyGAD-max convention the reference point must be strictly worse -# than every solution on every objective. +# 2-objective fixture used for hand-derived expected values. Under +# PyGAD-max the reference must be strictly worse than every solution. TWO_OBJECTIVE_FRONT = numpy.array([ [-1.0, -8.0], [-3.0, -5.0], @@ -14,7 +13,7 @@ ]) TWO_OBJECTIVE_REFERENCE = numpy.array([-10.0, -10.0]) -# A second front used to verify IGD / GD assertions. +# Second front used by the IGD / GD tests. APPROXIMATION_FRONT = numpy.array([ [-1.0, -8.0], [-4.0, -4.0], @@ -23,27 +22,22 @@ def test_hypervolume_two_d_matches_hand_computation(): - # Negate the points to switch to minimisation: - # ref = (10, 10), points = (1, 8), (3, 5), (6, 2) - # The dominated area (computed by slicing the front from left to - # right) is 4 + 15 + 32 = 51. + # In min space: ref (10, 10), points (1, 8), (3, 5), (6, 2). + # Sliced area from left to right: 4 + 15 + 32 = 51. expected_hv = 4.0 + 15.0 + 32.0 hv = quality_indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) assert hv == pytest.approx(expected_hv, abs=1e-9) def test_hypervolume_single_solution_equals_box_volume(): - # Single non-dominated point at (-2, -3) with reference (-10, -10). - # Negated: point (2, 3), ref (10, 10). Box volume = (10-2) * (10-3) - # = 8 * 7 = 56. + # Point (-2, -3), ref (-10, -10). In min: box = 8 * 7 = 56. fitness = numpy.array([[-2.0, -3.0]]) reference = numpy.array([-10.0, -10.0]) assert quality_indicators.hypervolume(fitness, reference) == pytest.approx(56.0) def test_hypervolume_drops_dominated_solutions(): - # The third row is dominated by both other rows. Adding it must - # not change the hypervolume. + # The added row is dominated, so HV should not change. extra = numpy.vstack([TWO_OBJECTIVE_FRONT, [[-4.0, -6.0]]]) hv_clean = quality_indicators.hypervolume(TWO_OBJECTIVE_FRONT, TWO_OBJECTIVE_REFERENCE) hv_with_dominated = quality_indicators.hypervolume(extra, TWO_OBJECTIVE_REFERENCE) @@ -59,13 +53,8 @@ def test_hypervolume_rejects_reference_point_inside_front(): def test_hypervolume_three_d_axis_aligned_extremes(): - # Three axis-extreme solutions under PyGAD max: - # (-1, 0, 0), (0, -1, 0), (0, 0, -1). - # Negated to minimisation: - # (1, 0, 0), (0, 1, 0), (0, 0, 1) with reference (2, 2, 2). - # Each solution dominates a 1 x 2 x 2 box of volume 4, but they - # overlap. By inclusion-exclusion the union has volume - # 4 + 4 + 4 - 2 - 2 - 2 + 1 = 7. + # Three axis-extreme points, ref (-2,-2,-2). In min: each point + # dominates a 1x2x2 box, by inclusion-exclusion union = 7. fitness = numpy.array([ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], @@ -83,12 +72,10 @@ def test_inverted_generational_distance_zero_when_approximation_matches_referenc def test_inverted_generational_distance_matches_hand_value(): - # For every row of TWO_OBJECTIVE_FRONT find the nearest row in - # APPROXIMATION_FRONT under Euclidean distance, then average. - # Hand check: - # ref (-1, -8) closest to approx (-1, -8) = distance 0 - # ref (-3, -5) closest to approx (-4, -4) = sqrt(1 + 1) = sqrt(2) - # ref (-6, -2) closest to approx (-7, -1) = sqrt(1 + 1) = sqrt(2) + # Nearest approx per ref: + # (-1,-8) -> (-1,-8) = 0 + # (-3,-5) -> (-4,-4) = sqrt(2) + # (-6,-2) -> (-7,-1) = sqrt(2) expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 igd = quality_indicators.inverted_generational_distance( APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) @@ -96,8 +83,7 @@ def test_inverted_generational_distance_matches_hand_value(): def test_generational_distance_matches_hand_value(): - # For every row of APPROXIMATION_FRONT find the nearest row in - # TWO_OBJECTIVE_FRONT, then average. + # Symmetric of the IGD test: same pairings, same average. expected = (0.0 + numpy.sqrt(2.0) + numpy.sqrt(2.0)) / 3.0 gd = quality_indicators.generational_distance( APPROXIMATION_FRONT, TWO_OBJECTIVE_FRONT) @@ -105,9 +91,8 @@ def test_generational_distance_matches_hand_value(): def test_spacing_zero_for_equally_spaced_points(): - # Three colinear points equally spaced give nearest-neighbour - # distances [1, 1, 1] (each endpoint sees its closest neighbour at - # distance 1). The standard deviation is therefore 0. + # Three colinear, equally spaced points -> nearest-neighbour + # distances are all 1 -> std = 0. fitness = numpy.array([ [0.0, 0.0], [1.0, 0.0], @@ -117,17 +102,14 @@ def test_spacing_zero_for_equally_spaced_points(): def test_spacing_for_single_solution_returns_zero(): - # The metric is undefined for a single point; the implementation - # short-circuits to 0.0 so the user does not have to special-case - # it in their reporting code. + # Undefined for one point; we return 0.0 to keep callers simple. fitness = numpy.array([[1.0, 2.0]]) assert quality_indicators.spacing(fitness) == 0.0 def test_hypervolume_random_four_dim_matches_pinned_value(): - # Pinned regression for a 4-objective case. The expected value - # was computed once on this exact input array and stored here so - # the test is fully self-contained (no external library calls). + # 4-objective regression. Expected value was computed once on + # this exact array and pinned so the test is self-contained. rng = numpy.random.default_rng(42) fitness_min = rng.uniform(0.0, 1.0, size=(20, 4)) fitness_max = -fitness_min From ef58ef2fdfb7fb85af8c41281535665148bdbc24 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 00:38:10 -0400 Subject: [PATCH 09/17] Plots examples --- docs/source/figures/plot_fitness.png | Bin 0 -> 20620 bytes docs/source/figures/plot_fitness_band.png | Bin 0 -> 32459 bytes docs/source/figures/plot_genes.png | Bin 0 -> 32564 bytes .../source/figures/plot_new_solution_rate.png | Bin 0 -> 24516 bytes .../plot_non_dominated_hypervolume.png | Bin 0 -> 28092 bytes .../figures/plot_pareto_front_curve_2d.png | Bin 0 -> 32792 bytes .../figures/plot_pareto_front_curve_3d.png | Bin 0 -> 66684 bytes .../figures/plot_pareto_front_evolution.png | Bin 0 -> 30886 bytes .../figures/plot_pareto_front_heatmap.png | Bin 0 -> 20892 bytes docs/source/figures/plot_pareto_front_pcp.png | Bin 0 -> 52817 bytes .../plot_pareto_front_scatter_matrix.png | Bin 0 -> 96244 bytes .../figures/plot_population_diversity.png | Bin 0 -> 28236 bytes docs/source/releases.md | 45 +- docs/source/visualize.md | 310 ++------ examples/plots/example_plot_fitness.py | 17 + examples/plots/example_plot_fitness_band.py | 18 + examples/plots/example_plot_genes.py | 18 + .../plots/example_plot_new_solution_rate.py | 18 + .../example_plot_non_dominated_hypervolume.py | 23 + .../example_plot_pareto_front_curve_2d.py | 22 + .../example_plot_pareto_front_curve_3d.py | 23 + .../example_plot_pareto_front_evolution.py | 23 + .../example_plot_pareto_front_heatmap.py | 23 + .../plots/example_plot_pareto_front_pcp.py | 23 + ...xample_plot_pareto_front_scatter_matrix.py | 23 + .../example_plot_population_diversity.py | 18 + pygad/visualize/plot.py | 749 ++++++++++++++++-- tests/test_visualize.py | 156 ++++ 28 files changed, 1189 insertions(+), 320 deletions(-) create mode 100644 docs/source/figures/plot_fitness.png create mode 100644 docs/source/figures/plot_fitness_band.png create mode 100644 docs/source/figures/plot_genes.png create mode 100644 docs/source/figures/plot_new_solution_rate.png create mode 100644 docs/source/figures/plot_non_dominated_hypervolume.png create mode 100644 docs/source/figures/plot_pareto_front_curve_2d.png create mode 100644 docs/source/figures/plot_pareto_front_curve_3d.png create mode 100644 docs/source/figures/plot_pareto_front_evolution.png create mode 100644 docs/source/figures/plot_pareto_front_heatmap.png create mode 100644 docs/source/figures/plot_pareto_front_pcp.png create mode 100644 docs/source/figures/plot_pareto_front_scatter_matrix.png create mode 100644 docs/source/figures/plot_population_diversity.png create mode 100644 examples/plots/example_plot_fitness.py create mode 100644 examples/plots/example_plot_fitness_band.py create mode 100644 examples/plots/example_plot_genes.py create mode 100644 examples/plots/example_plot_new_solution_rate.py create mode 100644 examples/plots/example_plot_non_dominated_hypervolume.py create mode 100644 examples/plots/example_plot_pareto_front_curve_2d.py create mode 100644 examples/plots/example_plot_pareto_front_curve_3d.py create mode 100644 examples/plots/example_plot_pareto_front_evolution.py create mode 100644 examples/plots/example_plot_pareto_front_heatmap.py create mode 100644 examples/plots/example_plot_pareto_front_pcp.py create mode 100644 examples/plots/example_plot_pareto_front_scatter_matrix.py create mode 100644 examples/plots/example_plot_population_diversity.py diff --git a/docs/source/figures/plot_fitness.png b/docs/source/figures/plot_fitness.png new file mode 100644 index 0000000000000000000000000000000000000000..7851ac545fd76191964747b81532182e075262e8 GIT binary patch literal 20620 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

x^ZwY_{{N5#`u~_d+T)r3^5P=p zv17*omaBr32-@E;D7Xq4CLYm=KT2~8MfI)C5%dXPD&QzQTH z+&jlMLDKd%%*@rorVN9GIFp$UjG^v)$>*XXox;PLj+`+ZY7Z2zGmsU^U0(XsAez8( zF7vbbKu$>K&YwBUG9%p_Z4Qh-Sd;jtPk*dQF-4IwMYYs9N~8#tsq+Y?V@w?NmN%E@4p(dZo4}CH3TuEbEq1e-CXR zu;MC@-eJn1kuI~xKQt?91JsXMf&faf@OaeB zRNG!fNv*3GbkbZ$%(ixl+_!yo;$$!n&*5aRQk(6CEJzg~DK|LLBw*@il7tMbAo(Yf zaa;Vkh4^z^v1Zmgnd_BA89!o_-mv#qGh{G7yxfPssD`D>^ExB1^MF{bM@gwirD}OD z%NnAa`ONSu#~z@S&IvXKALNlVVjY5ip(h%vi;6Hi*=k#DGS&S}=ZmrxbLL+*m4!c4 z2<|^qtuP$0%40+7$C4RBBt8GqV0|;g>zv~85SyaxsLpk!twQ)U z328?bF{?-YuhB`j(oI_LJ^g8D`deOS?nwwSsjjB%uU{{+3YW>6=i!gS6IPzrbXD?5 z)mFbSpFr=3WE_`>aFjFsmY#kPQ6$Q zk~5YAoJT`w{@%!-&wa#WcuXUnE|!*$Sm~%nG2Ln#FT0ZFv$mj-x=sJG<+$+xyar|A z{-*y@#mcw7>sb~z9?IRINAH}@$k1prP1Oj0?~eImX#4!37imVN$@t}gWBbw5nFg9P z%=~@VLtk+7v4`DAS5ci=z_rLqtJc};OdkIB{oY$Ca5}A@l$$n0>t>JS#F_ag-{P8S z(YmXU0mfZ_$zV}vP1n!(#k=Z&EKrh)GBs4Xnjd3w0-X>HNnspM=#BevYwA`GlRPvSg6yc_6@{n(K{4m99e=ENy-7KThBV;driiV#F5oS*_tXR4XCNktUwon zLuK*jS?d{t^6e#gSX8d%Rq|Poh=%a<;7&m%I;mYSbov(5X+Vo>a*t=oI z7jV(oT)znmRF)n^J-zwI$0E$qfO2QR z`*Z8vx#B!oze1J5+nXG%T2gCrit}6xabqa@R+6tOS5-t~1bKOIK`<)Wc7BO~r;Z_#7pXhWisc~;qEx!~JpSZw6E zd0L|FTGxv~LVHY7?lcB1(I%hN3-3(h?o11Qp&k5O`_}kCRR{1ZsOn^;YXvBxI$X6DeG0j zoHB4u@pgjJq@($|;O=JZ_V7<|d?|*jDhCRBP8(ildm7JOPI-vM=H5VFX5C>@87%Jg zGU{`64ZSyjp9nj|-7LGEq%2(i3O79E>D1lnTA>cG58*Lh+S_XMD4}VquIsgOo!ePBICeGNH7FEpmaCEOLVW(#r=SNEC!!4Q8Yh1{L!UX zcCqK4($zqh7(wu`xCUtbV;5=0WLByk41LX(2AxoUyZdCl0k^NVhR2IvF6thE_x?Tm zF;gYT#kA4!&L=y}2#UApJr56#22xo?v!ASmJAzg4{cu3OQb{`K0k*~Pk#VdUpXk4^ z$6LYtZuTuM@ct_4zjp3+SEG1z=+S#Own^(gr#uQU!4x>;t%R^qjUl@fi(?I;*-4VE ziWdFDZ*_ChB*#nXXw#85Cs_4h9gHB)P!C&?d1X#6@_hLb?FB2Zf>odHoZS2mN+F-I z*vmo?H2zT~S)lx3kv=QMz};mR*mb|nwf+nvk!B_t9{8ZAFz6gp#`E%BY~g1^DZza3 zFdzq8n`q1a`Uy1J_ee(FuU{*{hceY(3t=pus&MHcAlRM z$L7BH^D{FsBO?w1iHT3AGy19-zBRntlT5H2nd|#5GjU9otA@DDE9OFOBoWy zUR+R$VZHeNY^-3+^fqFtq!z@`=&G4sLaKRty;o;d+Y9En7`j zR~=`(_(b5}ydZIQ6TkkVu*n;H2Zu_PYwl4+}%o@wDiK zB0$9%6D*!S^g28|f|Nlw;|DrQ(%Mcg@c+k;z$V5Ij98n}JosAYsCw?jg1;>?b%+yM z^XrscT|AOa_e%F7n4+uDWBzOhX7Q{^p8d4-EDTW}Muh+N)&a2G?mJ?R;dz$Nh98JB*z}?1y9x*_|u~IWflqcQhE{U zDyAAvk+AnNfUGrZUGBgd*he(l--Fp7Gtpd*5u}C2XWR@H;h{ z=`$9-2MQP`$zQu!5p_|7=S88DqIcql3YEgl7^frGMD6vcVREEla#*V#$7HOH>z0+_ zw=`7b$WMZUX+b7)+x$RyX6iA{358g}1U7gBA(MotZS%Unn)#|ts0-Z{_*`Urki*+B z27L}DH?S-h6}o<|p&fb28BQ{eZzi!z?D{|IbL?C#z=U=w%*eQ2PTFUaRuB96!fnxbcR zY%8g=h{Y}axUZpmmAUAe5`2@4d~@}Wc?cuvru7l6%BJnNVaQx7SarV?OtzDGNKI;< zJM2dit$NKg5V6HP!Ly}Gr{&~0vejdhfhtBbFg$`Ff|rkvbZ2MBC|Uirp{?&R3B#oh zb&{9$ZjTAA)r;GjDyqGH{krjP>E!;_xCW4F#Wr1>kl1B4C^Tt=*r?FUS1;N$v;)v} z39i7V;r7u1d=Fu!ZNLiltNDEX^8EZNM3M z?yt{_w2S#0Q}a;-Qx1jEzJ3#yglwBL5dL&=_PFuM$go{>c)AyAS7K;UvgdoH6tcE2 zC4IjI|1mcRWk<1C{gqJxWdMdXgCl!-zWb$$&s^HQ-;j`k-0{VWj1YQlYM4NgyzHZyZaAo9i(@7c50Hd2ARodhDKE&im+IluLJ zx(Wr~wL5ogY(}_FYp3RZsZc?wl9(Iu<3vsmG~Ex^a#7M{pcdkVNuKk{DFjyZ(PUG2 z@?Z|c<(nDj#l^ex4MY)If-B&+Qr?Kb`_J$`+T@q#)krTLi|K~*#!HWd{gQL%&mKM@~ z+wf8)+;zVDB(TA_{+%AiKk{eCs;M0)N|T=}V{>jZEN z`x(~>jb#UkY-^RVKXRoK+c!mQdTuosk2uW=C(PM#XZAQ(Qx3!qX8np)3YX>Aad&O? zR>b#z=_Wjjg$6=mjqm0C_}ZfscgfU&S_p6w;n5$JPT}@d>4l`xn(-1XkcD^vzZV$8 zrE{M%8_-TshC_P*c#3oS61{tkyl%E8d{78*C9XY@J++KOudHQZ#O@{)8r{PMo$x{@ zI5M6EOU1W^Nyx!Mi_OP}zmiEUkDOGz14fA$-X7idRz|Pm*x$`z24z)MPY#$w>~!pr z1TRG9@=A`3!+iuJHXYrocn6WceB%tEsamS^O19q_R-9qGhzrAF=XIc&^4sN3xLLpI zr$?_7|M#a7G^*h0UBE&+U#-B!&0m-x^h*ancnawK4ZD8XDi)5AFD3NT;kKZSf5%Cb z+w}l)D>HoX24`a>*WMO=Kodn?L1r1-NBHbWf-f(4xHW#HncMms=rj^SKcWC18J`N> z(ms+P#VZc2(gP?hzAZw=GtgVsm&*#PX9IxV5*m%hmrW6dB8YtOlV;lE5-n_^8nB3% zXT6LD>{zXT`6t1dNRy9JQd#!XgvTY|@sqLVdDtve1ON32o{n+qQm}TQsSpc8HsXiT zRgflPe7x-1!ss${1)vL7DO_--vR84&`$ZoZQ9Zhl4{XIlj@>`|eC>c3Fno9C7$p6X zG(4Px>Rs^}wZe9_)WmGue@x#@KRWFgJwK9V1%7k09P+_aPmP_G0F~XiaU=fOGi>5% zooeHps~~t$1kQt&g#`;tn(SITZ+m-t?vsHm1*uM~pSUSCDd@mN9cYqMHE%Y(h0!TMl@x}6_vh;C_X?4J4S z8m9f9&%9FXrJf#102hC?%InuJz3w<4)t zg|@afUVw`*R%In6B4T1;Tp-6oggd_4Ty{ z)*Vliynp@j12V1|2#^TpvFaoicOWdj+%5g3G&}9H5Ki`Q?LHS|-YhbcgPizyT@Ccz zm#cdOtXXlz^RIWGX(ipuZUd@-6KDc#WaP)y>9$qyGs%Mr|HE#-#{Y;D=^!=nc7Xxz@WNx<-NhNy&a5UpeR_B0 z5N6d1`1EaHDl-QbR_C+hlvN|g4j`|Vke22Y4C&7-E0?+#?&;{EM=Yiu1Oz4coQLoA z!yD|f) zGdJI4f+EdY{)NiyoKKvPnH#{6?{9B76D0t{07-q?jNk()U?5FSh(3U5i7@58ImcgI zbO-}y_wrhbgdrrfU(*B?cDg&xxhciw4^I&+*i7xHbk?7^;JqVULE9%mpcB^Kei_vO zKSUVuNnkrs_YKT^NmC@8l)t{XI99YN4ZK$?4wElieNFH=AXF5IJ2zrXE>^_O3md&Z z3K`qY_#-ACMn~?JS^|6Gv-at<8~CuAjeg_h{wrn;tM4(Xg%{T&M{E=#uvozuV+8+< z1%)!AAR}%8+9z(E ztZS&ZGX(#JxrcEt%3m<83phbe!`=YNRM(EP6+ZT*uS!(<&Gk-_qpC?{GYM}#JH2_9 z8@NGa=&I`KS%AFe@%hPtV?f4qgXHq0xDQC1rzM}H zp3#)>W)its<~2Er#2vRs>qwgs8Q5Z}|CaLw+lFjZ-Cg6!ErI3?B1|00^C-(JQ*c$P zj1&6ZRj{!Ufy?4>S;s6`@`2lU9Hw$QR%X=q#J7eY#2a?`{b3`tS$zZ-n-%FMG+(p+ z?dnkq3gxZku~nEQ4j@U1QNqUMRG{{21o2Ui> z2qQWts6+@2_1rkCNFOy?G{|j@hWIa6wb7^WQd=ALx_*4a>5;_H&nhG_93VSc_bv5$U-#2_T$OeU3O@*9l|b|vJtkYdxmk|9atU2svtTS9lQ$bnI{2z z`o9ZcBc5Z3%(6w$ZNly-YqVqOPwx7@TCId7QUg@Q31F8eVGJ8fQ5tI2mzg!B__h}y& z3|3qzq)@IN4cV-Eu!m-Dfj7TZ?Rmy;<5wsE{w&akT-MT3H8gy7Q$bA^S>StSk+P2W zCUv$?xm*zGP|NX3quP3zKY5ZGhs4gpYMRv|H4M_GLo`RvL{7N}akyAWq@X!DVA2RfOhzY1&>JFPt{*WCCl}Onynv(N zJpLji>~Acqo;n~hDL6B7e(S&WIP^YgN@MVyuFPTN2W%%bUy(sbh{kYMknsZL-2o)M zX+&Uuk$D_|k0Cf$l1n0c$5u>gyUxtaqwl|bW3Z|>VL*kPuw-bm_sz8?@HCo>rJz;= z25JoXML}mU7xBjRw*q{eUF1cI=F>OXC+dmM1#Tec5c(guld-@PxXj-23o|@d@tc`HuOZ|rj_Grt zDiR0cW)Z^snVf(5O@(}XBuKS*MMaN;gu2itbmnOYje()s8S3jd4a^Bf9j9LvHxK$U z>`_&c$gII&?*I}Kl8II}muBFmqa?rkWQ*HZlo|@#4is`Qs5L@*O>m%(-91+fMRz52+J>B{6R!*Q9D`=#7rqIkViyaV*rYgn?6Ov} zbopS5V7dw#+hJRP*M9`sm1h9+CUY`^J^~>h0{?Ai6jf1mr=x*X>W%$08p05qHq0(q z!E{`Pqck)ky&ixDg_)udCeA?L_l3-i>#*R_$=n==mjuI)DKb%- zn@u(ctv=$1L0od{M+8b}`b|2|LjZ5npo~&%i{-%N^l5_d*2w9{h8ufEui^L!>6RtR zC0K$0^(yCIdA&cuE5iv12l0Xa=WB9_iHWPf@{67h+Kkr)B1rFC@Ik;^(+^Cb+5h?T zr|n?z$#NHnXhD{-Yhs|`3Ak);?M-@-Nfl|ElgwgANc2s&oS(OrD3A>wuUVBh2harI zVGJ;XgUNDE-(Fo|kq_{R2xPrz{|J$SLEr$S3+m5e@5P^n zk8+fA3hTC~C>@8_=UC!_Q6xewS5DI;?=z}3Lii%Ic0-S-lb)2{PVX3uwp@_G6J$Jh zj!O<0*9BB{97Ja6%~ivX;zg8+HhEf7n4#k85S| z+`C+OXYz?t5iSOalX9hRcdznlyfxDMFvGlIVC zPbD4H?3<+++l8bOVwBo+7&M7uje>8MxdkA3r+e`I)FY?UYi<~Do(e!odbMRvpJo>o zD#~|=WYv5^2w8l|$v6}yFa4W#$N+4Uq9;`!z@Za4H^2SB!=2>rC%u1BI65TO+*S4k zJx-O^$nGEJ`W^x^U&)%$#O6zfqz|@9k-_k|!(iG>pHg0O8Y!}OfUsLtmE^us+Z;!^ zv;J8&^dqwBa)L*lF=g=#NCgm05=j1^(XlTx83)(BkJZLyUl50?3M}cWTk^~k`>NPw zGJ*wJlc$oF7wPaeDr3*<>&>NuBeBwyIo%}ePFmG|qfG4=@Q(ySaJ%^GvM6{n?wd3Sk!0E_+l9aa4`Y%Mk_r+}Di2l)g@C;L`hie$VPL0maM zKTjcd4-9hmPtRP?+m!@r5lAAnjz6rO9`nDE>`?+Ql7lRBn^t%HUULFs7iAFgNH~vT zA!#x(8O{Y!=Bxf$jC9+r1S!JGoQLcqL`Pr*o8VPJuH0R0se*tksL1N8ey@3&r`??; z`im5@%~E$9yRT?zHG`dhFQP(U)vhe>j&Wj-28c29WudS->znnEwoKXTnmcR>NH59H zKW@iC1J5 z<3c-!XqyDt2#>Hl*FXkActl%reFkxUJdlJB(0X9#daF-TZuTvrLn?%Q&C(`Rh)S=9 z?*(Z>V&mLWRoXy4angj~*lXC3k1mGCW(oY;Tw~A%)xVx(pr>irvMz^;0EJ}#{Z0E( zY(+5SP6=&&nj-XK-I_Ulo1L6jV=XKlI&Fc2ds3pL3TBER!)mdFzbDViz7+s_(ubs! zK_L-(!ssG@WN8&{k+)1?X~0Hk`n9p_3lLA#)|{&o!jM ze-jgcwDgBvnoxVkN9YJF#&gN_Q!vC6aD+d-%Zr=;P3ZL#JgW*G5c3S6svGX^_TF^TJ7t(DNC9CC&N zvOu1&mLKhCI0(5vK}PshWiw%$d)TF1H-dpd zuSE+K2qYmu4S#vzv23TX%}H8}@vDD=ve#m^ruSu#L>t0&9B#KMbb}5OC z=+=t&jm2K-iu`93J~!Kh(4fAgO3_2`j%Zw=vM%z~t5a`{$|yiYZIt{&tg7-6@l4(@ zsOtW0{0adcp4a#OnE#h1PaWc){@F`Xc4JXLt4#HrR`8Xm5UW0f!{S*=+SnZd17)kt2>-AD_E1?kqEbe z9AvBHnOFADO97Cgla7bPCco1>Nn;qSUxvTIYK!o!2`=z@H^K{2pbb0A`2qsKs*6x+ zyXqurl4TT&FH?UnqLg9<0}5b(QPZJwGJC&+-UZ3H?}(6bhz zYo;(tTmMNby!#WnI78EaDICJ5?K|)Brm1L1`R5YD)P0dMmewBj&L8#}hQK`63i+rL z5iEcme=+}oKm;eaz|4uqPJ0ZqF5lPgarifA_>4!Y+~bn%Sg!pvg88x{k&iyS?KoLH zlpJ$Zoib1q;dgk}oM14`tM>W&VRiqRaG2SJjvlEMPHcU|;3PW35T62!uxLre?_dGN z^ndz-zjg>mpRfYW(v5J42)VqeCxyWD-+KeL6TL1#I*6&%!nYFO)G|CrOkThiABC{t zO&r4vU;$?|priZKc>UFC)xN%#fA4c>(cSY5YY`rm;se+&0mgE{`%5_oKrvj*v1M^?bw_Gd!ZO~_J2U$gHZUaP}}%SB!RP6J!r8B>4X?JQy{XV4a!d6ixg>f4%3`$ zD%ZjH%ikwBIN6p=FCs>Kfw5$&e4r6t0s{WGCRKD0x%B1Y*4zMbzUc!x|Mb5_Q;=u# zj8^A`Dgg&`5hxni8V`?3`2Eb#8;Ji;0xyV+VsUWvlkcQgp4QWc~p`bT-r?Vq?zw zX4U=^h}OD0d}51H>5rN9)8m* z!-V1&>O znWEBsfevPUFBVu~D6fTj@Z_p`ti|TykPlQ|plNBZMd-LzzmFo zwYzDSuV3&HLYLLS+i`ZLkz*c83QzOvi%j?+w=v@YAQLIghSD>(7m_Z8UT3_iM8GV3 zZ=4J1grdXOUdP~XGp}owameKG=m4JxfBgTff&cFxcFe7K&5EFjP|v>JjS+$-v)&2* z{VwvCQ&hX`xHL$zQTG85{`+R_^QTWrK0ZDr3yf#ZQtU{9kU2V<3ZSvFE<>Et06|kr z0~EL-*vz)_tDTia`D9xj_=%uG*3m9Zw)j>lmizQ+a>y=(XdCQZPPGqK)yU~RDIrn* zt(*&F+lLXjqg!78`FzN3mAzhnkjT%=+GrYeFlYbcWpf^bd>?868t#b0OpZ_25qdy= z;i_Oj?K0Sf4>|{I0D4E1v*-UbO=+6q4*kMVEX{rH94(~bw>JjN%S1lq0J%T|#RHNM z-IJ^77Tfml;Qi2zP-KXvrw_@@=p z1M>MueFFpqxw_e8NR>S}ReQY>7eA=G?0$2NZTFNtAmtV)ZBliPF+-UV2b zks=}@qIVXJ#Qqrok&dB;D&4a6t^bAs^w|O0t};$Y32JOdU7M((>Y3svaGgj+gzC2M z=Bp=980<#M3p%`vR%{@FQM|Vo;5b&z2+fpL{PdJY)|E}txvyCK&I%6baR-ZqsIKRS%Y?Sv_>dW1 zuKA;lmnVh3-$SN53*H#PMM!l8yFw8A{mtE~;qkuSUZ^QL4!;MkFn4&NFE0e*ycpb? z3zXTx-4DApwj49I|`B5FN#sFE6Z()cQ+SdoM-8u0tqP zsE6Y)DtC+keA5He~MGs^4d8Oqkh5e8wpUuiomB2mpetl z229x<3@LXWi-bb@Q~dlNEzUJqoU?$Pjck0tk7153KmjhK=D+Qo|C%{% zsh*97h8kd@mYgI~sD%s)RR;=9FTVW}e9>``7WN-z$pbi8$iR7IBqw4mKwy-D(;Rjgp?)4`I#c8}eIs_HcuI0g*e45*@zBMsi{4p7qX z0(ZTMxLxXY-Z+lenL;`jjN$paU*h4#kXmeO7`!-~L%YG^mnOA-nCZ`f9f>;fXFw|O z4sP?13jF(iKOrT>VdYOVy$*7V0Kz@2LFwid_~C1yoLTjk{Gs5;8m7)2cKuM9L-MK9 zr=zk2)_QdmB96k*u0FsCp_d(W0PH^o&P_d*Q%(>nY2)hxcQxUPf>Y{2%%Fld46HatDw!>`*o z-BsbpC*JO!1hWaug{GEPG-NmO%$80x?LtA1*piE0u&JLfPYq*(LuE_uvSp}DuR$jHLI;` zm!OQkpHDvzs50;}wx(q0BzhZgW{luFkxaWw%_`ZtpBz$EjT{=#4uCZutaRhuTpo*p z!ZV~;5V*X7>KQ>@26yN_t)G#BVFJn&A+FQV($c~+sjKpV5D$g+O=dO^KqCzThrbH0 zA{&GO+JQ(siD)RGvI?K6yh2Y)dmrv?ae$FjHQY2%y>kyPVL?J95R@4rIoJ3jsECLN z!xF2|-n>+BP?HbHITf|Er~vH2w6B5;cN%IBaX|xdc2b`6vbW?Ek! zV?!?ZxleS&;vCE32o$v*FM-PzJXgNMRU>ZX?j9b>L0z`D$Kh(hS7r??SOfon z+XRDo74Fh_?>uIN=j7rNMIkqhJWfej(EC$zyX{qR@pU}hU~*@sJ%Lye8EVc_OIzEA zfJ3zv8@N~pZUEUwEMESw&DR%vs8=A2!fnF!14mKF-8#rc7XC&?FJM>M^}l`IF>pF- z3hsSMFop6}lKYDz6Q1C(AaK~SMR8ySgw*oj!Uy#qB>@Ir#9J5VE! z+gu|{gUxviWjFNhHE?v8;C#FwcoJq56hXWB`|Eb!Dzi`ObzmqspYnCqPeB#W0aF!N<3oS~NO*k!U5UATmxWU1NhsoqUl39L+TQNE zQ}Yh7U#LuA^&mrDrVUvqxMT$K!A;<1XqlOFjK*K8kmoF!)|)GM_-QZXdK?&Yxn?o zpAxvLimoEK7VxD^XfzKDj*CguEE=4J6)1EegDe4Rv-qT>Q1J3>Oi{0!w{EbO4pE_S zZt4R<)l{{);~Sr=%?XJ<)jIlWL?H7Cgya6|y>{cTR7f?HR7g_Ax`U8i^v{1q0M>LKLjiE6!(^mC{ z-4FuR&v3uPeIRC&cYM_hWSrpQo*Tc`);FWHi^kwW3LKbC1|_F6OZ!t68PN{^tB z%ZVdQDA@c&$3PdqiK1V05@GBEo(Qc@41CFX8NHL;j$>)aO?uR__3A?SZOQ2V)L>g_;NNGr}Dv#auC9FIxeWi`{9beeX2F1WP0XKY=?l;PNt0 zgiM86OQcdz$YcN>1Er9t?C*vnJ_`jEhzJs*Cj|Kd%5H}D`OK~?eQ!A$&e3gSk33%E0@3k`EHq90nYT%3_CQr<7-4+R4 zK-z&!-)hrw1#XbNLAYfWxOs=P7a-9Z~@7UqAID?F_LZh`%TMg5U-*-=D9O zUjZtoV_-N1lN8V9T&V=YJEa|viDLq$T3Zd9j z3)K$kgs4Cr)tP9?4al)Wg#5ott^dchcmKDD1|sDD*ZcDR`-cmML~dSt_7&wkui;`q O)D<;t)k0;9hyNFYk&B-I literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_fitness_band.png b/docs/source/figures/plot_fitness_band.png new file mode 100644 index 0000000000000000000000000000000000000000..10d8eee6c70c2fc526c318bcbda5fdd7f4f71cb0 GIT binary patch literal 32459 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 literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_genes.png b/docs/source/figures/plot_genes.png new file mode 100644 index 0000000000000000000000000000000000000000..5a603ffd0e448e288ed48ae953c6e1fe954d9809 GIT binary patch literal 32564 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 z z8m2fW`5VFFO+{V@ZHv8WE20Gi_mmu~1*Ooem$Z8#x<5?wSnSSZv?j@iPNG+azkhnB zPHk#u7Zb_8sc)>en(&6F&z@0HKrgC3J-d8+WkQApmLAHQeWQs?D`X7{B{?}68;U)@ zsHDWP;xrX@Ny`Lj%5hFBZ*Nyc%T5>(U#njbpOmzU;s*w8^mvoaBVAHQ?psDae{PtT zmd3w%GmFiA%c1jMIa{qr1&(vVJ$lZ{%uJ1@0exlm`?F2j{4P=2uE{QSJGzJ6cbb)P>)Jh)g`W1F(F6jY&Es2@OykI$Qv>&*3^a-&qt z&;4#n)mcRvAhvB>TpTdya;O>DMdp|BwuXi))z#I{U%VLn{rgd;{rlGm2`!bDmNpT) zXcl_tvb;kj6Hsa6TK$(@E}$Re5?erMpk`20PD~C3`*xpX2YeSXzAjHiIn?@q=Yd_R znEg4YNIWRge$iV&+2!SD=dSNbZ&ph-*?!+r5OnEik!_W(s|Gsc6)V#Fa%nq`U*oLy z@JhrDjMjE+`36x8JL>zu`6#CY2Lxnfn60g?QS4-$Up;-QZe_)Rat|EPG)vWp4(mP`%vTTn|V=_6_IPHN1MIgJ=8@H-=!=74-B$`nUUD ztP5YWW(|b`W@hx5D~4;vw3?6v(v7DEUUznO9y+tto$-q$U>s$;)$FOw`8E9qQt~T6ImM_~O`@$Mo;tq;P;brfj`o9E$CNKm5wdwkaz{*cY|KT%{)pLSBuZ zjtU72uiLhbhb~y%oK-*Bgdcwo4-dD!=1B7gocQ{A>0W|1qV4P~7Q?3+^YEdR--#0f z;^Hfv^Eop!Gdt?5472EJ@0#F49DCLxa*&FOO4rcvO*m=IdOUU2>TEN!)Un85=B(F)}QS zGeb+FD{!=Qia()I%4f(tQ)8V#iZ(&|;CWK6?OPygFgM>Z3If{zfEV^T`j0nQub9#y}xy=C7K$NBiQ5BCdv%lPldrF!dZOK{yShr? zJHip?T`pSQ)4~Qt3qffL!B&P|KpOPn!-vBnBC4X+ZkCsb$XMGp*EhnzwY3MePTp^9 zU(ifzOUtc0ceMTXKvJO;2F@uy*jwHuB+bkeclgx&ul1CD;QJ!kmEcM&Gvk~_J|kVF zTt!7iRt0W6Ku4z3(q03GD|wYU)~;R4A>$OLY0BJIUT5n+qL@RN1Z1hRNr5x8u276# ze-;uF+6O6CyWaO(2Q3=akx*T17%An!<9NhU-h(EoKY5gnt(b#C)}ECU=lUV<;3^9L zrcJ9*eYHnGi{zLqosA9W&A^$%O(OCr)iPIBGBPq| zWM)dY^Vhe8X-$3WG_|#T&hR}f?CKTmR5fTKO*xJ_9|r~^?r6My_pYkDoA2_by>)1N z)+a7$9vkh7uIKe%34#g0d&~4U>X$Tb)ht9y?i~Ky?Eo@QN=tXozx)6i2Pr&j@cpw* z{my&|8?yC(HfE0CAQj#gO8h-|kfMU;iCqYVYW1 zECj{ve-RrqGxO@zt52gkh6_B}`-iM%yp_5jW(;@*MbaYJOmq#PmX3pi0K40@Gm!=1 z_?#IQ(ig;HVql>XnIoz;zC!#Dq=gInD?!hqxHb|%v>aub@Mw%GBm z0qcvuPW0a&LqJ2?bjy|JU>&f4B2n2pd|LOUWSaPP`mpn!7+iN9Mu6BweE@kI;C{fN zwZIV5(|(#-TI(bv82&&J9f)V3o~v0|gV%08;9;|7?FLa%3g!7VxmQkRGXvM$BW9RP zn;ijTENhQ{Z{Y|@e+l{-6cjYQBR(i-$-v7S&(dEy#RK3{_VrYp5lMJ+X36q@y{39d zyu~Ucy%Eco(92&fS2*uo+_X+OekqnfF5Sz7^8p>x(tb&>Iobzb}b^mkfX+G)@x zE!J9UYU(j)pAKD5jzeJYdHGb6ZJ&jxfU~8~=f+{^jGXkPcCU_q_cl0M#I2{Nhs7iJ zt3}~Y2Q?IH(Dm~J-k2jw8$m>PiwfvwfIeqb=cktt7_nl-c0a$umSpC9PAr55hmc>R z3JMA$tyZ&e)d1~$v~+X?;fU17@?imTC~w=w#KuM>8*IIAj%p%rjr4V*IhVm&z$2-I zV+M!9!AxI>3Qx;Px_WjBlI;~+M``#zrm88|@NWI^^HS1Zwzahxie=at>W90~FJi#B zTJQt3)1FVCf}cE5hUr4*`acopluNpcdIznNduV8=SK8SIeNM0JuU76GnM{{_{ZOz9 zFDmr@!b}RWGE{62;2?1MhbMm@118oRtk=4r>EwE}=z1%g09OULnfL)KCF%W7*JRn` z(?Lj8zm}RRNczPp)!Fk$h@xa8_2**R!|_k6O-)TXR00a69CBPgYz>(14J9;Dv*kN5 zXscCX&9A#H9Ew>nE8k&(Ing*Uw*{j{PmXk9AV3X9{MCm1hIx!y~i84!P-B_`5WepU7 z=sQh3@*dk;Vh0cC-)0^kABVre8uRP-Z@~>4!u^>b+SA5Zo!|a1r6!(k33xfF;cz3* z=--Zq*kIAy+dDQjRUa>G08|73dPdr@4q%ZQeGd!xpDQb#p-*>%bwuhOl%w!vv@4s< z|H4ZzMfy%d$;Y}y3Gfk z_e2YHGPf>cZexTBAZ57I^pE7DfVva@7a{U)6SHyj{Q6#+P(DTaD>ZRux##R3J$p!- zUU}Q#vV6N1S)4){N;kCr*5&lP*RCVo<$MsDQykePZ3$BljtFz%(a~?TMI(nctvGRF z8}IRtOij991Y?z{OYLHbXn|{b5r%6boJ$%GC{eQsYy%LZqoX4(g5UAuL{IxqJQ>kfxFtvJ2*C2{F8laFfjjWEuRktKy$1-yKEXfDq1Xpct=)`4l#9| z7?yYft@q6`eW%ZbYP{A$ScmC5lC-t8Y2Ib;jfKepoqBWTt=;;@#@YaNY@6&>!kEAN zQUE0VP?JE*yLSQ#3f4m=jddPr7sT^DdeswHYZDDu%c_!U05p%ipvyzk7JmIYH|4aU zh=z&D`KE+wx$c0SEwLGr)m00q-iw~p5^Czgu_U*~hh5pwV!*PhbPuDD02uXy z(Jm5F&`IoF@na+HvM^DqK%N1TQhe3`7W4A*zCN@i=J;5#iOk@3d$Nw?s5 z;!Q~@xFlmvXP~QlIyN>o<3)Y_a)V3aOp`>EkX@{Zyi0c8F|536ac`{sNH(o2ktAjI z)2YmkX?)Y#u4(D`-v2OMR|qL}U8VleA&C^Xl3RW?>S|w?f#!=Sh>R$#ER~;c`ZEH7 z5^=MyukRu7JTXS$qOwj33gnu1MmXRlXJN4eio-;YLjTQ4;fP!M_s-Ont_af=>+lcH zI4nD0cO`ron%O-(1ymn3fJ8LK$ex~ks51b|pkz1pYlLSsg2rT+i`k2rqp$EethT0Q ziPYZbpysqK;Hd7Uo)_zwWaaF9-D1PF1i@r;CGFB0x$nfAL8}MHlinblB2qbQT>TJe zMX&DRk>82Zjwl#OVVd(?PWjKuB;b75uk-LCuF;hVF=9cZCv4WsOG_Y^&Cd5KBWc@W|6Pk{2wA(; z$Q%Xb70)8C)pW`%ZspnO*D1~Sr$N1aSVbdy$^JoJL4jOEM1;rBuhz-;55BrN*pkTt zZCAb((pbn5an4Yzyo|QBVlLi;uhqPtV0C9bT!h2p&o{s7fiIr%;6dH`q=2(ZTT=|E!eXiydiVtUPMYqIsvQ`sj$cv8`TR zk*?~L_AN{cE_TyE1Zom@&aD$Kz%v2Tx4XLD_jnHC2Etkm5+EEE<-#N9iud z`*{7J3^NDE3JO4AJ&2&omK`eFw(VI&od6ad>-A+?vE$Ci$5T_}y$4t0>79FAywgfv z=cZv>`6*Qjhj2+h-2&oh!TGKb#?;nA_6>@*j>$F3|Z zQ}-m+jg}sJsb%^gZo$F7_2|(Wv|nQE5_9|c&23!x5=v)n7?WV3$2ABBJ`Oohs|;@{ zuf=DqN69}2qtS8jbuuLM3yNDx%zYo^8K<-4!{vMFb7%KZd;YzqoZ`sG!^1lFuh~<% zoh+nWHf(avmp?Hf3Y!Ar>ll(C{SQjMRlz}o(iT)vv7KA#Sky3e_|>>QJA&KGPL>Q# z!WXB7WzVe=z!9{3)g@7}-}@7Xxmj4q<-)lVkeBCx423&Eh#M3tTso76+0e*HG@P9^ z?CkWeHxzx;U)|hhYGziIb|H#e;b_g>xr|AvEcz`LcQ`1Ldy3CNz*%f|$F@0m=Dm4i zM%fOdLO7--@c#n7UwVlotknBL!a!Jhh+y?0`&EsHG!D0)Xt|KUoXqsK%NFMS@BK`D zS1t7-7hwg;YlNfH($iCYN4rw`ZP|5O0=}N8Ns)v`2QS?zaQfv9 zrQV^TcJtmg30RXvF~B`E3spZ>0a5~LB=6a`^nq>BS;X~jA+`cn=zX!zy_ViMhP%6I zpT2#|dU9rhSZySQ0s3ZcVL?0R$7s5T7>%d7T5rJr4r6A3u?eb!XhaVpOxqzQ-KI-$ zc@K!-F*9+vH{a&IHhwG9nlfRNFx8djKztvTC zM_atucU1C3J388nRB2X!tF;kBL$8yAOtSXZgfWqwK-@2+K6ps72x%T_3Vg+CJn6KR z7hOz1#&9W1VUxf-=Y`=@yPPlJG|88t9L&v3Rxk33W)Ti;ih+TFyMMMzYk06-c0HH- zlQTxwwypyT_3b)-5P`d_td%2hu3oQ#(3xc*k`QiJ0{G+JT_zte{jh1LjMBW9mJvQQ z1#%lnM|?b5bZE#H&zGzVFf~ZM{qS#rDYvF$g#lijZ*)Snu188UII}y%btS+vTm=OQ zy6BQ!k5M=91na;VPo)}Z z7CqIUU)zYT3Nryl7&qbDNOHX!=7g}`HW{`owD$gvOml~p3{&m;S2vVGQPqi)Dz5N> z8dVI<%j(m~A(fLfZnKryB^hsQ(Z?;1^W{nueBjQ`nal7gIx#6mg03hT*OiZ(O-yCN z?I}DldDpu#?nN;^xyS6Zr}s!ZD>?~TP`P<|o}X{{5|syTg`A{q;c2CBg&IR9BQblj za~{$>$eF%oc`x|hy^WyahJIq9fX4_y+{D77_OPjhA^g{XfPgf{ zR6DSlfbZ|A|B4rg-$+}(dF`PrC>V6@dXoh5I`*)MM8(9^(~WOvqXH=)3UH&Et{V?0=Zy0;*zqk4#6{TH65}#aVacI zL|K^|kD-bL65l(<0zNUq(NsrvX$)WXVs(v;kM}+pG0!%>q1cP%nURrEfw)bgxk;%T zZzF6+c1T7fJ9pxD(@5K-xoGYKl0&78ea(Bt`F7Ur!($2LhSnn4xKN4sSm!N6WTw`w zyqJtzKq7P%wYAHj1Xtrigkqw?Y*Ma8s$G}&q^1kTH6c0+zqYz#dbcn`NN>fp&#zgS zt{5Pr@$lj5SE>uj$G*NlQ&=b;#iz>a>FG(LqYjRardC#ma?Rl3DWFiSq>xO-;lmpc zGJq>}%S05RiwJZmQ&neqkaK>RQ{dv2Pmcc>oBi>MYs6vZ-EMc{)ff4wdkNt`i2+TDzb4Nn+-cUCLM69r?(XmQcaij~RabT927!zFFkoVW5>x~&Ev>)Hf7o630cI)v`#&e~}aPM5@g)b@LLSzlm?1yQk$MjxeyzET zUh>qN#z%$aI*WZY;8l{x2ms|h{O-l#8$iCM<>NZmQ?`e^9mxuSz#uX@4Gd?xXHPWW zsadACZ{LzHdxwYVb#!!0*V;I9bghdgi)q&bTPh0jV&UyWWe19^1!Uk$if-5-{rd+D zml&)(g!$kp_Mr``??wkl0&EpD9(0)0jEsh??A}kG_CM00Vam6IX`=yMgpQuR36bn3 zpL&!5{NC5YlkW@M`G}!F-@*t9UJWU^!F&W92w1wmyCA~3p}QkC%qANll6&G=?}jI# zQN|A@+V3=`kRJ0qa1^M+?TxM`b#*&!shxX^NJ8Veep|;TzkqWZ)T>slYB~bSipy*| z;Ka;@1n*{vzXMOBs0%ruRV>xa9n$v!ZHvO*=NEk{pJFAAKD^^tC4RQ{=;LM}fessW4T$lKpkbbk(uzV><3ne$QX_E@nB-fk0c;{&bFqn_J5Fn=RHPgozv{(QwjnDMW7u*k^`BBPuBwg69KmoBZS7N92c) zGiS$WFuUEM_I*%)hwMd{aiZdahagD$@#9B+DXG;6J*j(mJj~#WQ~N_C(Idj(VXn;w zL?Z!gXt2zh2fGuk9`RptGq><b*jJ%g_+9+*y1@3} zi|FL9!OyR&p0YbMj2OntBvrEE5WIk0Y`~G}dgytn3?B~*K6EEIo4Q#qcp}l4Ar?E< zMV&#Gi2}}e!QbY592^F!!W^|Ol5%l{08lv9<^QLoKwXOK{54g+z|f;@2EqsKdlvE| zR#^`Kg8EVWK^>>_2?C&mn~ne66AWAQ*m2N^I{7@`O-^CORG6#l%#+}ySdoK#>dEoU!9XJ{H;Xp3xBTT zCFPMLbckd#D2fQHoDmYpJ#}ez&dbB&G-$pZR6obDp33*I<`-jbIwhQ;;mhK9^4>L< z-Elf{oA=k!_^^g~>mQ>@=%vDIXcTY6r0$7snK9cyK0lIR#C~Lo6MFLG3CPr;CV%Cr z4zDWpkz(Fcvz{c`&Q@A*`SNA0q#Z5oRu`U49~IKuAC5oU4)!)o2Q+zK1Q$+$Fw9oEiAnZmTX-$(qtgq&%NI0&odKquWUidI zg5t1p)wYS%Br=W$d~cb7W`W$$t&Qy`8ijtfpSZy*yQ`-Dx)McZ`Qg4y$tFj~1u?y{ ztxS4oJX%AmGs3N9+Hb#g_C&4+6r&^K#lwdm5O78rOK;-c5FMT^E3+}@eTnZT#Cv-_ ze-0%M7W5Mxef@~nD*GxZ=&Ot2P4Td+*1I>YwS98CC~movNB&6uN0?gFR*LPDn9=w{ zQ5fE)kZBPFN!q?nx!-?&HGKj=n2cG0DM~?v_5iuyocz+7%@>0~GSAbvBbu7;*1)I- z=k-hZ zNUNegU=(~eGxJP(`oYqZ2v$7}M&xMg^GjQ;J`O}^I?+Ghvr|nj@uF3SXFU(ela!t$ zVW(HyrV?4f@npB{?%o%7Z6h;N8+#saX%wd{9U|McNWY3m4{pGqJNDe7kSA*zT(_6c2rB@>1EG z*5Sb=B}!P)xE*6j3$x3y_$s2~=)ltvJ`+?>Sc{mwCBx&}xszX3P|}641er|do_FyR z6J#2(jB$h?xt6cutpWJx1&V?fRo&X!dKF0+)6H?tL0WDPbTyq8o*Rp=#L69mO}tx> zO+X+%(VI*BC?swH|9ZWl#T)M=ou@6%8#vudGnvrn^gjQ{Wre*dZxfsqsVg?nlAmbt zJ0MI##*>eqImuvZrNQYNp zZBK2oQnDkDNg!8^ZBy5SXNYd%QV5j+T^U0zzi*_V`|-eK5+4&#+Hc_R>)9ToKY9F^jo5flh|Us?5R;;8 z%XAj+$lJ<) z+)*S}NnW0;^Rcn9hoTvEHpu1@fJ#!6Wxu~wBOY~*Y6;DjBP%r@S9NXD*K|tq^YYU$ zC{%E9d-La=US!pzz$$nbQ|;1ya*F59j-(i<2|bm|`D%!6gBhvbSk?K5UxG;)k)U;F zY_#RxQgK%$@Lu8H*9_}vr0i^Ennb$y&5K&FX(uUkuHH=C| zslZzIgnA?rnXhuEO!8FY(E3jcn|4=~>KYC;ypMB(2;QX(HkB+n&4@n8td!>)#7rkitRUOJ%Q0Mj8UD=m2 z^z+N^Y2SOEF1;O@cb%t4kKwms=&kDOK9?7uThb?IynB5Rje@uq1681^xp`-NBHS9G zU&TMaHtFzvI-t>0cfX7LsCm| z?b=FRH=zpPZJ4#3p2MMFWHic^%joPKHR&HK{vkKdy?8~qrD=CX4;(SHSd$m*l`g%v z`vJSV67tiK;jnYr0aq!A5!r*$A_bMORX*haMkn}xB}9D~2ax{7f$@yr6M_Z zlE!=&egW#|(|76iN9jb+0;D(Q0Jhg{o9g&6bxmF|V(TlAsXE8lZ6RQbkxPV7)KV^; z5xgDk=q`90WfTt>KE#^Rmq=2S=cEdvM>*@cELPdG9%+yEquCMdBQ7C9@CmQfJ_=EQ z$PMuA@LZ17dH(8EBJSKw?ZxNc~& zSkM&A^RFOsJ@n{vm>ob&bbfC1RR7yudtGxY@B|QtJ+?(Y2iBza(W5d%3|XfULcB|C zX7%5jUnvI>Wts?J*wIqQzkd{=O(d@hbJ-EZ5{Yp@V((!ToG+jN}y%;SAVWM*?r? z`Wd(6V3&gU>F zrl%L4-*xlPbtYPKeeBGFtcw;?e=zA}2!<{-vRkV$3Y@AF`?&5OZ7EMQhvcrva4~fE zUZS)QPm);`2rJ_d8>^73w(g8OhA?o2ATsZWq`HUqqo-M7xj@Z% zPm3>+xqnAe7ck8b1j-%R^v;F;er3A2*VUlXt6h8k@jKyzMvqx^c9Z``>Px88aY?( z94*UOn#I!=i;-9U$e`$fS-t)FKDA;W9u=gN1-5Afov5kM1|{N@#Bd$zH{di5)wq2e2yK{#ugoG@5pYl;Y*W&_F-*(Wo-OK zZPifO11MvV#*FeQyHLH~-nGD3&qb}#W*hdN_9X^yQQq=AO zXJ}+8Ggi5j0<@2+Zb2k?Z0N0~dY==-@@X ziRrBxTQr?kWtmE@p&(HkMa1P*qfdS?B8DP9OeD{r0{+CWl! z7119p)0=5sefFwOw(N|rIrs{aU=QEI^m5}QmCjp%ExA_11Mmyq557kq77yHeS}yeQ z-OQ)K)D>tCV^23`Tg|G7uWgqpf~QDK8aO&hW1c5JP5!+;YRui?X8vxvAQy@-D~yyb zZf4Ux&>QodRh_qiW^W9z-RqEpp>Soy24Ar4GN`COC4_F3Zb9TW*^6GEUs~t$F?44UnvUb}+1g&Du6W^XGm^IBPF^Pr#UIO)WEv!=#RCoH?F zdd_I=mSdP1Cvpj%tRAL@Q$F?$wBos*@Unt#K=FfsN!;nwpI}OkXf1G{d#PQR z0a`HKT!tqy)Jy-U_9Tk|E~4@;ldupS#{(nd{|rAj*8Pzb5jcf$(o~dcBKi=2|F=Nx zza@Jy&?ds_ZLlcIlpW8GARAnex`wtIf)R-%2F!d(CkaI$5c^y{*_Artx*ok%%P18< z7~_Po9(k8li8~kxJVM+rHRwMuxkM%eWyowX+!{ek2N5m@WOV&)S`Bqa4b9>-7rPULZDb1RT*=g& zlM{s2IJM5>---SR-W6>B30TJwROkBo9h#OFzEAgeE-RpDo+@{Ha8$SD_2HuHWgq-d z757aqYX|d$A4!;}z~2bcj~8;|%{x@XXPDkv_}&aSaiZAc`j3y{85<@bai0ECqlRvc z$x_7|#?S#xe6xuS*$+iS)5k}a094#b`x&>+z!oV|c;)OlfZO27Gswxw5hx3>Z?zlS z6|2|xA!zi+>F`z}tK#vkLxE%icRzMf175}KW|$2}^%hnH2T*@j!iy#|mVtpP>~TPa1^`$>Iq~x=ZN81G`HkD) zlNkFDCo@rCI{K_4Z4bdhd!S2J4Fd|Lg0K>!ij26~J88DO;rRL3^XSpDm@quG@O!Um zNw54=Me;RbR7;g^^zSrcCjzMa`1z$Fd+$KHBGDG;jWq<@Aa#&}#0Z%(Arqw`Y3d>g z_BgVJglYbshJ$pB1AJaH%+g3;Y?<~n7uR)iHU+>?9hpnPrcOmnp(-pmnJ=#LhHuw~ zfPf$7#l=Uc77HW1uf^eE61K&1JFsO(AkI)hm5F{G+i)u-MO{}64)E*8uDdA}@B*TD zsQg-rV|O6-@QaCwK^v9ye5BdJ%%LrSa9HoaKnOXMMtwKnAZcEfmUT?@GT*T{9MFU* zZWjbqAX$Mu5KRn82|^PGb)u`8=$Q?#ZlMKyKok;M--V2uvyBPsa}GC)AdpU6elqBL z09Q^q4P%r}FIWwx1je#9E{@_>>uRF+H=6!Lp)tiA0C1f8^!pDVxbQ<7kc~)Wyy@%+ z>D9#WLMoMH@CdKWJGg@+^f9`$f&`!@zP7QD8O%qAn+t2Vt(AVRaYNcMr12-h+kc%} z-H)UiW@#tc$%j zQ1)T2#&0CQ^;|zmqAGaZd2MXIYu`S8^2W%p5FJ!|1P6Gq6Mt9(MVX4S@Vk2fvljaw zorETiG}pv&kPWIo|(!O*^5Cj&>)hw!mSP$M6E(Z z0LqG#jUyEWUK*K#{c|V-CivqlP^lqOR^leYK}AFy;yUEQ)U>pv7$NAmo}h`W0=(E; z&0oj>2!h5ef98zH=xN-|n~cDC7|V^GQaRL7Duc;-O!%!g#Mv4{QVqs18&Xd#%#%fg zS!*&~ha2pOv3RTUz->@y!Fyh%oej&<{u5J2K9xh-;apQ#EqXI3+takOQHVc*!jSwL z@+TEo6R$C23Q^ZkH2Pa_Z>3lLO75JVuw`*?JD$V_Q%xa5e24g5e0-b4f_c$1ag&K2 z%FfZ2g*ib4Px`P7>hZur;XWt7fXj&u#1_#C)S%0r5lws%7JAGhSX!8xo`Lm2+l-?H zcGt(z2{@af#9~-RbS)<@@5}TT-Ujfe!lI+K5SRq6jk*(v8M_MTbcC=V37E#X>nNFR zibn*Y66aH$QyoK7#^8^p#C2QA&k6gTrT&hVYacq4(bO^uf)k143Z{*&n46oQ12@C{ z6GSiw4+bwgwjJ|A7z@XE3Hhx~PC^)a{hOT$TS39`SB!Xe;?}uK!TNO&wE{dmf8|Oz zKF)uMM3!I|%DgFC9Id6x-nemNZ-0Lfg513bZM<2gz18T?SQ3d}>gh3wxsZ3nlhHLY z`V??bz?m7ElE!FPsi}pJ+=XUp? zt_-No;fMgh9l!MqdQ`!X()>(C13pAi5T%V(_#5 zv;x(3g#UeIgqbvgqj3%g&NbuAKZrqOaq%eDtziv!NzTB0f&@Gupb;blPmLlcHVdY^ z=jrN38hlie9RRY#GF^&v4Q;adI95l_{%33iWvZ$srLy((xym#{6ryx+WETFa8K0P_ z0jZ2cCX1ABd9Q(}HS6M|#mEE|4gk33BF8N^flNdT!j9+CQZh1DfTK`O<8Uoj$Xg`( zjI6CEx*pE?h{FoTh>HUb$RaG8oCUJa^y{VImS8-M;8M`*a^ z7K}vSdgtaZ-biR`TJFM1yIJk^4UO86W) z_RNhX5-p9KhK3oAI&z{JVy*j-vra_Nu_d`pqWWb6E>Q_CoTe)dijY74oj{y3$yM4I zfdrg|OJRcXdpv9aJFGrIY3VpGi|__#lp`t%2#0K&TcN@hU@xhxNgUL zR1`T3jC_d~!&5F~%lGrgsEJkS3E6o_Vl<~1+1(@G-ly{cq3^>vcD2{s%QgtHiYpjQ zk|CqNKE61%FQ%=7$$Cd|T6>(?sr-&fdDJI^twYI4#Zf9~s zgX+Ss9XODMhH}o?gvMv@4hSO)^Hb%*;Z2vIfT2&6_*euh;uI8>nL$BJ621F?W1pz7 zYPKkrA$i1jdHxhRfD8g%1YFk?2snr{kx6TkqyswF=izOm{Vx$xO$qaWfLRIp7>@Q| zzL9Q^Pb~yeDpF%rB2Y`h+sOpaU}|h11fDvWHOJ>~c@AH2ajPK*w@um!QF@TDD1^y= zu9bKa&>&&?oFNk{U9Ucc;p~~Xxn}2lqT!JOL{7_Fr95`};g6prafHcok|{$xsV8GY zcnePsCeP#vG=&|L0(eIz2LP5R9yL|Bqy^cwUbb4p%1X=iq2np~F%=peWjmlI^n=yN z2$R69d1T=_s07d?<~;Z0pmQB6uR2^WI? zlJ$i3m7-M}qQ6?R<%yw1@b{@Ha*WPBb*4Crx1EX2En&;#2GVvbU`(4rAQ47%u+rIu z*N{AXi^s9wVGB?ks?eEpa7+jiK@2$Ns7h79IS~8|g`Z?9M;w`Oz5*FFzNnw6A(X;) zj>{{)C~$6a7o`GQ1-&2`Fpi|fN!A}gl1%ZFBu0smxZQ~_!f?M57Q!-)|GyXep1SK! zlGUYscuZuv1^}4^j;)H03SYl*V;oi)hLkv8x?%V@ZUpDUV8Tudo@&jD1jUzLXkUA9>pO|O;!&)K{7H<*r4jdY#w4M z*I!r!JG*7kX*m@^*~58(WI>~iYeyE`yL*?!u%N#Qrm=_!iZ@JwR>-` za$iJJ7pf>xuJ4|IeBjs~)(Dp+o8DkVHs6Rqe?%2r9{K%Vm>*rh2{mC^dXksDwp`$R zj;Dm_Z^ZMLdGwDWzMA?Fwk`(Q)fe^8XuaUIi^pXM;sN2fnfkW8gTananrkqfrI2MP zg1d}xO)`23nmDNzAQ#guc$doj=sU}fc*ts2FLbjVbU8XG0;O0pj3dnJb$XYkiJ(7FHW?1b zp>qhjEuP(pgDynH#c|5U;t560pH{Bg0U2)9AE3#~cXEOW2lLS3%O{iXcBf!XgHMtp zZ&0t25iTTIN}NDLyd}d#DJn!*uuhktXON%C)DY%!eBZVepZmWJ>Iq6plIYF_eB^cb zKF&rUN*_ zs`X*mQLGdQtfzth7z@33!DOis7 zQ2enU$a$?0wI~!Ez+qeHiW5MD$e<);9|oXB+!+@pvrmD}uk~1NE7OXhUQNB=q$EC) z5^frNhtrG{BqGAHhOpt)kCK!rk~&r#nSUcSw^zP$L$;+70eC9xL6W=Jv2F6g;J{dB z`pqf;cj7C_b@?F<-AJ?cSjD!$*}_BPk8SP`;7%BXY%`|Z0_VU~3WuBQO!&*6}Z z#HlPfm=xWS;6iS0Zj#agd6vn1NSVs%QDGDK$9NR%I?jA-HW(=2S&PRm;B=Vb|I^!< zK-HZ0fBf3UI#H>nl(fi93N=!)G`L9=3Xz>+JSK_kBSPhpkZnpB$`aXXGLfxanlhFe zqDGbx+4m*%ygs*PnCF?9|M{QuKmR%Bd5#$^_x|p8`7H1E>qGYP=Y%Mx$vNxJj*c*v zV!0YwR~;umB+6PI9&Ym8Pp~)I_6SiHde+0v-=@u}+YT;PS%+8Ei=G0JPtvzZ18SG$ zw5;c5d3%;<*-upZyTx?+RQ58dr0{G5tF*!7ysn^9AU-B+0Ava9v_jCyk)iTosrGL3 z_Y`cGK;URfJ1ANq3I-wQ8TNIGdS9=_vv1Jvk1$+<9WE@4z^k`xIdf;AuO~8WQJ^X8 z`*wkQHs<9_R*7@~zv#))yz{}CE2!d#qjWBF5{J|)DVbXtM#S)CB6bBaWR~dEDl>>%z12B)4rd2$xvlKS^d zB!G~pQ}jIGItt>0SYwxt1hx?xf%sPzH<;46#=v-_I`=Z=9m5ppeP5*dNSd(4a(Qla z`YOp=duhWVgA~hcN_{ra{TCMLJicmQYMM+6e3$cC|A4I zf+a3C?KiFb{?1IXs^@G@IX!ab+Vkx3>%3{Y~L=-hpWsPoQ7EJ?f+y$~u+ZFJ{HR^Rm-HzH$V+8Q?Xno{{G7mLN7 zgVS&ma%;#5#Ol%N-TMWS#lY{ifgunvP^Hd2eYyvg3xUXS)b7qq8X+Hsmxujsyy$5! zuP$6g#;UN-d#P_Zg&3@OG0eYox^+^5p+adxuq6i(z(AZJDF^{0vxS*uu7i3w9S1@v z;f1ub4^RKCQE-dX*_a*SV-e$|MQk7cckDo)>EkT+Czb&;4JW+Tr>4`B%!B~FecUXv z;Y|=ksrA9mQ}yxWZB#Q=dcx>2G^!e{FU(v2($sAnJiO;ky7e~1w2qxPOSV=T&P~W# z-bu>8CTpqU>;2ioo%(=olGO)ZpyS}9>Lv9HPhWBPx3iD25~wkBR3|Vnff*v25ZV+w zU(LYkt+ZY-Zcx`~w~1IzFU4Odyft^QlaLV-VGn<*2taKf=dp~HaUDs$pd<8WO=(JO zHf6P5b!=v#r}Q1d!LA5ysBIB-?7^`&6$x@*jPyyz8|~$hVmTNMVIp2h&>aK%SPq-M zK@58z;F2M2LKW0`FhgwhN{HONxuBc1D%X<5|1oWDWzV>CX-MFBn%qgyA0j(=UP5e!Ayres>ry8lQC)zmqg07y?` zl>zOb=q%@TzAN+c`hw3&Lzaui3&o3s5o;Tz?hwPpS2gDWbP&^i`up2p0`EbQR5*eX z%?X7U3vmZ96xI4*-;nUnPiqM&mt`gbclJvx`JixF@{unncmmaoF7a&ybel`_1TfCB zk3yUY6IyQxdf_cUPrU*)GfnfPVi9BCw7NnzEXlW_04&iS+`c_&cP3}EnC9b;JWjpf zz}}h2!6Ll6|AlL+ zdM;LVt3Aa^JjB#bA};@sl+;XDSL_VbwmL2hRu+zjQzKEZz5P%JOw3XnTe(KdV{O^Y zUE^vPABQYQDqWSHz#ejhp!YGY^64`C=lY{(@0FHUMZ4IJcH`4weH5;v{pEst-TQH> z&nVv3;(x}IiTEMc3z}!$uxvNdi#Zj$cS#w6Vo~yxE4tWqF%GsxnBG|lHA<=MO(nMv zJrZeT`u%#WIDQH}_mTPXS4s<*e9Hvy1%FYuXvQb9zW5q_VuCfF+e-U7X#%kzrl!^F z*40&z-5rkK|CB~dEd|YQfC8RjuJUs_31vd^S?WsShjM!RXvw4{$BY-es)cQF5gj<> zT;?<5zS;ID+eeNJtN=i%8 z;t}ni#MI-q`z8RQ52hhtVDzx20fEksm$r;sK9DE7s_T;ml<9@?Ao<+KAO+L~a=`Mp z>Qa%BWpS%so**J+a)4pCdCl?1EpfBRMc=I^tWhiNYh+sdxxCI$d7T|x|B~XH&Hj(qf|;@`3E;bFI@ z1{gpWuA!;<2n4`#Wb>2fzkgjWd?yYmh{lWATjFmgV-Yf^ol04;r3+Qe*vVmzn>8AR zE-u%I)aiI@baCRZUXu@f0AeZsx&ctMqZ-phb3kG z2mO*t12&awcsxa!pwtay76JY*>Ec326-OEm;j=EY_8ts4O8tK1VfWr--OdN@dNoft zV2pdmSOHzJrgj-C=neM0uU*Nh#Rhk&XjNms54SY#K7ZJ-D@7?&$6QODk62hrH9{O9 zK*}}v&%nGP6amkr69#b*f;m2|t7f&^S$WX5cT zJdo{ezAV!3yKR>2tp6fwNC$iG#6Bqp{oTu}O%XuLhyt+N!>!p^MED;}w%qX7 zEr!hKMgqOihgakb3%?=F@GYTj#h?)J9QNYieI@ej>x3x!zZ$b@1 zj%NjBl=N9lpQPj%10^ORj^qmf1^G4KHP+L|y}EBH;0>kDw%``uSpB-7a!O6tQp5qC&CW)2l;U?)q2|A^3KgQHuL4bUiQ*e1?@Jze4<>iKCk&bjeu8p(pQIQ+N< zUfDOERQPk+Ev;~=g0rv=r2H%mTCOIrBIZ?n3)K(~&_TwG?99rOWaP zc|=3DYP(w&X54l;k|b~^_vmPQt*lG|Ac9-!Y3kD|;!wN82MX55SYv|bVm}@vCUY5u z0Wc#j{>%|Hdsqd9G0nV~yqo144H6~OBIoz^-;nFZt6+t-7al-F3wwk6!Ck0x{azS0 zo@1Ltds-xnDJ88QLhC?u5Xc}z-R zZBD(Fo7=MRUCfY|shKCeb2yFt0?l-9Sj*?p6xzTLUYZ>&+L-ZI&XFu#@aNmH&yGSy`<1^=Gq>K5Ab$;&jD1ojzO zJ`+f84l1uM{}ufMO|$dxz83nON`#CA{_u#+*EbGD+3DW8ZV-NQ+6haLPdo*Vw5@pC zB`dI>+7iIqHm?Lp?Y&5OHMak4J*6`ZyXIn8)4%ZIn3g z`DAP*V-Xm@QPI0h`-{zfkpKFA+OB!}JI89-g^V*8^@j$mZP&9OaYRdPfP6*<_gbPf zua`MP_jl%Z|F2DAEzr{r_1r(`i2eDP5tC!XIIe8lZ`gTyI5- zn|4NOypyVrZM9B9sA{kgXaluP9x`-jCIt~Z?(7n%+~0NZOd4W%KQ^Z?g9H5h?pYsb z%U=LT&0;UvOw9kRp=q+UK($PdNm_eWpbq-(;0-8TDz+Hz76^wGyfeK75(QCV&8mrPnOyseZY;m6_pv(|!Vw zq$ZgL2UZySq`PHE;oU5)(li^d92T{`X!4Od?KJIL&;`i3K1t6zuTT|=WDP-c)W|{z z-U4L&FPQQ)y}qWCZ3z;-LMlO5me5*&3!_J$flan7Zj^7s%rjTmjKnKvXY~95Gy0-7!X&c_g)HEjjT)W9uUZImW)f6{P%Gw)Hc#0$6 zTG7H@gH%##)7*>>;BwcI!%%cV258c;V_|$ZN|E%45cbiXt9vOS|Y#wc_=T=1JOJXRG2n2UOQ4>%Mh1>qiI~9bT@X zX}61l0*~Q3%j-k0L{^bkTC##4Y4bML$Z5gIXW=`&5?+V*em>qk0C~8P>6#2aYZUNp z9A_cXzjyWIm{^7m{#1}uve#9x=u37iKRuFP+o#d*W%a+Kj%iEm?C2JgM!^&AWaMwd zv^V8v2QF1@jA0r9oNhwm)!%(r-{sWF*<;X(e-yYfx4^Z=f-LR3>|uMNs=t!}|D*U* zMCJljBqEL6w8_dNHlB>xmXDFMvF z1*_>@ub3C57P>t$FA%TxYtvrxPe4K`2s{p-^w&v0K_4Q&R7JUA}= zgZ?(S=(bhbo`Li~*(AV_4NC9B*X1V(4B24wOvb>-zwiiUdd&ajAM!ma6x(-RysIAM zsO6$IWB86}@-jE<+gopv-(*Q2R&nhlv2l>7U+iq+f)qhtn z()4OG{C15~JEa>)6G3q0R6llTEWOu2ZJH3{gxWmuhTxqbH;$DZ5D>pm$2q|`F(4q| zD^f1p8avV6KhcYjk3&{#&Hu`O@wfLJm!>B4Q-HCdUMv5|A7=EUOc~|0usf+UDbKwo zfBJ1kcmMUg8bGbeovywycoX5(=I}rNVe1I-L(=FwN5!M-tFk2y0cF93CXo?>O&2Vf zXp)HUDLjZu%oH^Sa2MFUqSxh|eMFbJkCATiB4IM&XUb?&!Dj$-vk>#N1LNI>D4 z2P86M&!y*0rITeEV+%=<{+x{M5a!x-gtj^O^TN>4$u)r0I*W%CJ#yf2vdUFo4BA;n zj3Z^Y9U8lw>H76XQ%-wRdOYVIv%a@c>eh00R_^OTLz^14jHRSfNckYQKgY8PGDF2# z>NbYV9wg&3k?E4l%*;m2!rp=c?fRnnEt{=GW*~4Mnx7&V16vlNdD$2UkQtR6si2`L zY;B14OAMCfd#N*H%o4`Dq^(!0-s@p{k_GFw>jDz9-snYhWL}ZOg0~K0YP*Ja;GM9S z#BSi@ISvTtYFBASqMA`Hc=tx2S8Rr+@`+H5^{zOZ8%D)Qlv^2hk-L}iZM`Vwpo?zW zke6=HBjki_DWiJW8?>GpsKdyi3cXnUf!e>9JHQxPm)Q97bKlpc}YRgyxHz_whCm_v~n^!KyZe8lC=KOd&C{qO(F#7gYs z9T=tyK&CO1cLnx^+(6i0CNM$N3RKGR1xk+O=brWXg)hK6OEVAe$YPRfmg_kpcRG9m z;iA9$isFIj#D#>85MjNeFU*1QD?RHIZ@nm|n+)$pOSYw4gVbAWD*|ukY6_W>Lws$k zo_w{xdNe@96Qp0#02DDK6Dj>|cPoPHx16J37LK;)A5PJx4ij82x+QttG`X0?ITbm9 zvamgJMb5_d$De6Qn^huzhRg;NpU5^R<}SQ>(V9n3_r6*4=5;X~A%6Bjazjnm>ot=@ zb2|#h!Xs|}^P-_h3q;F(7E9)p7qe%)tsGDw$O%@M_#D`@N^yVz1l!BFk}k9Er6IOo z&Y`F3?!?QW@qN4WsQu`@ly3? zBZcB(KReH>;_S zFVK}Pvlz&`S*7xikn7&AFJo{6p4@ar%cw=kYE`^7atFFlu|7lsM8A?nbign!DtA;J zo6b?*yrRdl(zbNf*9xayEZPnv2tWU7mrUm2!~0bPS7DT$Q?{tSc+Se$V_(h_rnS|W z6NUoGr_Z;;3DrPqLzz1fSwv4_{56?1f{pK>S~(~W9XfVgcgo;+jC*q^bNYqephJC< z9%L{LUznQ=4>J7nSQUMigJaWc$GvpIjPPiTT;IQ-SOU$EO`oyNfGw2zPasHNT(5CR z%)HEJ7E2K8*HNHX9rCbpsF&Art;T2>i$uD{2I@}ZsUNcVUAXmw*)S@^lkagdTMSF?=IM8VXl_`riV^%deKMNGIz^!g}d zk9t%w{d3&rkj~OMVl6d8l_H~aS6rUyXauWm%8N>EKpAT7qQQOStfAOgP(VzhY(Exx zv3RCrdK$k-ls&AHVDvcRO~*Iif3uK(zTPtT6A2YW4?V+wp6>BQ2F z8x7=kXY56e_^E&|peb{C)_LLE$Mppn@%_U0`ebL2JbMwg$?xI_kEMs9c;D^|QCte0 zqT`#(oCz{_({k#!$Yx}15j`PrSTwTTQo0-B$3~4HO*{AJH(HraE~<`|NmkTPh_!8% iBdg^9=?^ce6mhqvAHCXcg%bnp6|T?GE>Nulv0s0B{LaIQOJ;#AyZU{ zlqf?HW%`cg?s?w--uwISZ|~3V?e%cq?rUA^TI)QI^Ei%k1!)}Gx0rb~GeuF05A0Xc zq9}T0ilTeXG#|fVb7uXDZ!%8GN1U{6PdJ@B=3qe`JmzF)W9wvd>iD{|77mW5Y|m^K zm)s=2Lv)>`larmJjD*DLf8QZ)>u^#+U~i*7K4qcZetk!ZVm(Iw(IxLrIz>^Yn+_=L z(Q%3X{=xN#PIJ%v;qfJ#7v=cI`{X<_8;tMH6g+iAIPru*uxf!vzFkU_LutB(YK=<9 zDlgCQ3&fZ3j>tq2c_k$!^TnLO9ig_tp&)Sbu91KkmaP3Wli#qKKuSl3pj>ZU!g@7epUJ)dRG&a+!wI)8qt ztGajK+HhAXL!Nc(lB}X1%+Yu5*iZgCU0zYaD@^{B|N(Vx1Db9dtdb?QI+?= zGC#J7j{$2{L=UHX&(2uBxwnv7CnCZkBqa1U_atjemTB16#-yIAwccA)RsAGui=|}T ze~Etk{$0#?aazRHtLF&un&_S94lP=}W&hOgFEKK$8wCWIsd(GYr}3EJvWg1j_fO8LpKM#T`2-Vn zyg60ZV8FrAvEo}>uD_bV@+C`_bPqk7-8NA)dhC*8R`TPs--RcxYMu4+@=}P?U@|o| z{n*vDPD@)m|D|Ar%EvEXPR_ji`tdpIZg#3XE$gXpaBy&5i)oRIX0)t(fl<|_$~wJ~ zFUMV6Tnc}giPzi^TTUtI=v;6AQC6nV@Z_8=oxEC%T(J>(*r7o|LakoH%e*e=$|w5A z=jCmolYjf}9Sg6Y%kSQsjFkPS7fbI;CoqU0GY3J_d62%9Y`_ zkJ;JT`;6pVf0)zBr<*=Ac@?!)m0}aoORv{2$kWgfm6Fn;*y7^i!ZNPKU9ulsDPh8% zus3v>oSa-)ON*Y1n_KYku-(=0@Oa$<>7x6Ii9yGnUkt(`W8S%Q=Tdfdo$i1mdU`i* z$$36@=}$@WyL0D`oxS~1S@&P;ljB3J!iH1IjCWs~ z3p~S(7*oIMaOn1qdSPuXL1AIxWrztJYh;|*4jnoauM#25w`r4xsPSW+jQ5{k-)5vn zz9z+_ieUxUF;bejCl2QKjt_ONR7uow8ff{RJ;u6tF$Yy1w0t9vcTO0&0dgb5!^3O^ z1qEfDou&wJftM~V%E)=Fpn1x)ucFnVEyu!Y$hkQ9Ve9+PnhTb2vlY9KuQ+q&j6#Y| z@WsVk!PtW#h$$I47pFS>Tak4T{QkWWuOC~d=lC6Jor!BNhws2R zLJhg%`}gma&Ya2YS53XwBI2o_dG>6(Rz$ws zbqt(;_4YG}0hib847Ts747$30UocssSZoMt_w=4lC}y7<>WDw_I_h{+vgYyb@*qAL z83QI>vhD27om)9QIli)|Dr_YZ3!k9iev0jTd;W5)msHQ!w^wKvG;oVwXo<4FzkfX5s~~$^fe5y{3sX~qk#y(7qkgye$vG4Xniq@DuB>QJ`RCIK@ z3xpmm8eStBxE<6VV)%~mQAAWm$buK!9_*8 zGJ5eGkSNr5Pv0w;vNz_&{vX+TN6I3&{m1Ed1q-Qoq&BNBCfvbRt(jt(rq41ByncQ@ z__4oVI66AosYPFVWNY;1lb2f_W4>9a?$NJ}3QW9*?(Pzz0v|lsl#x?dSZI)O!a|oj z*l%L!TqY8_m4%akeD@W(iL>WAT=#LT{`T!#d7NT^PVY+5BkQO@DN5{D z8H)r{q?&-#=FPe_!G@z-o;k5FGy55dugoyW*Ajc;`t$yS?ChlPHAZbmi+CVuqtKv&VsGmQf@=V1l-?_xAQKL_XEbx6-}yfekAmuVtm9z2F~AP2S6u zSvy^Sd@`&1h)F4{tvxiLINj+z%Ynp_XW5{TpDxY5m}l2S_T<*`gt+~I0p9DVe&cp5 zqTCa&{d|3WYu!hJ2c|5o8?bj6sij<8B7SUq;^K$K+vyzrNw;y;-AtN5;A7#?9XGf-MzeUmFqv`ZxDxJnUE&x_T?NaKMr^c{5kU z4mRFD=>P25v-X@fnIA`bs+{LH9bYb>#zqMnZC@QDmsTQf^vEZ2^GSM&ote?9Dfv9F z;>DwgMV9S(DXH%t9DBYAa7I)=XC9CWJ#{ZBsi)P{TNxid+@!7k)wyV5!lij67+_(& zsHobQoS4|+cLk>vi`~W$Iu0&ZM#_3BlFcS(tfammR{K|w*5A0FphxdNDX_4Os|>51ROI95M$ z{BqfxbiHr*tm?01ahK23Jx8@ec`SYzJvUJl{ zP|3zO!yi3*6pO8RFqtkr4Ij&d!xca?ep2uq|JnkoyYQ!mhtb$i>~=tTuXw!2lLCwX3MI z;)1WQq;1Ep^78Un<0ofRJ+UX(l$Mshed_tds?&RVY^BV(!9|Ga#r?aEmCd`vBfI+D zL)$8BJhqi91J>`meDq_P|B=T|LMR7(pL$NxQ-`9Z=_r{Pc4sFirGb`=5mXUf*v(ck z+BY-|j6FR)HIojl*&ramw{s^KB5tblpP7z+v(`-GxB1pL+jEfPkK+do;Ru7?@o#Ou z5>F@S_g&`RgMxx*mrJZc($KSw!<{Gf+}s}5)?M$8$?)@=*Q{O2L8qw6*n+&%yukRB zk+JbecZkIC-#>b#J^yTp+H&ebU!UbJmtiVlUznbVVZz?U)Z=F)yJW6r_=HVr+4;0s zFS57hW>2Z_0xMG)s_WagOJ37|j*ayadv*@X4`|Ex)-6u8NGV21NlDB1 zk0etMXI;iZ6*Yaz4am!i>g?jwl*haU3vQ-#;IRS3twV*(M7?SOoVVclez6n6~`vAVmvH^*MLShYK2VzULd_*-nTpx#%qd!tkAhxgJ` zMI)75ln=k^4a!CO;+5Ro%_bfr%J~iz89Vu>87HN8PYp9rM}g}M7_McQ6dO2y%X#cR zE{+v8A7CyIwL()43R7Q~x6bKqs3dm%;zSPUX00~$`mH?hHtZ?tK!eYoyC2U2)!%qL zi{jDpbeeTZ1?H11d&`#eRoK#GvnMAD;whwh>Ag&QR13r{)4G!N(BU^L)m&wNzS@i` zpaghT$5a|9Uw;37rd_hK%`cIOIZQprILOp`&-`9s>OH;n{f7^dW|fPudt3XQCqG?N zUw5-c*YsjkaMppNM~|k=c7)BO%k12_e$ys4VDxg}TKldNI^AKR8Cx~AOIGWiX6hoI%Ew0a-4(AQkqc|$C!(MJ=}*)0t}J{0Jk&W@?|fV! zMIq2AA{GtfeIM}|@>*KUOuT+uWSj}5W0+r3UA+)-K-;;x&ll_>TD zlI0Z;n7?~=YO^0(DxJDB2qpy5vRjg74;;T7qDopa3`0#GqWB_p1d2Fzuc?uJ8Dm)R zmQBe^YwyY$-XFY$Z9&EvvO-KjPjAKJb3;qIjvdy(O=V*S}3Aoxi!k8Vp$T~+hg%LtK2b|2~c zn^F>5RLrfyHykUyz<6cDLU2f$EU!Un$s-wQpdQFS4MM_xq+2<|Gve$)wdqKU49?*F zy@0$`-`_oy1oorq`(+q-yx2Vdd`)^$Q=@2UDTpU}-_i83Tylt^kK9BTgU9UjxQuDm z(?7z@%*=UF{;J_OZw7$f=?1ysmyobNK0bbQ*Sj2%y29~+R@SFapWfQ-Ee8f7DgS9~ zEQQs)>Cu_HckjB4RIIe`tLOE=mDm(4BX&4^3alND3yFzYOLZYBTdjS3ILoBsx{$Wh znV!MHC0!qH`pY3qNV*IkH8(f6oPKh;^C{@8Z}LduFSq{q)5CtQX9jU@0_g+Xi_e!B zZ<7o)6_w!H8|B?CzWZkBB?JZK6%;OL-p@x>?N?kZdtW^!GdI8Q`@_ykJpE1J^zImQ zR##UWjESF_2H02vq}g69MRHrQ`}WH`vcZ@P&^vv)b%>1x<)_@X*>+sYJy}=Q+^p-| zd7$d@8p0S%p{kqsS+~3SrT1vVzDLdjE9SHEOud~n4OV;y_OK~a-Nq)p_Kel`?Vu;` zjn{1)9v*M0s9*$wevYf^)cCWdYJL}!JiQ<5g>A)(i^x~`j$=Q6KL7pmOS3@%XsD6T zw{24gH@oYcdX|fdKv_eB4Y9$0t96TIhJ>(i8Nzm`y^Nm!IQ!L?B3VTj#yi|ufhhJJ zJsR7ewc%javl*Gej^Yp$k8#+o$Yrwh3=AKU!3-as!7ibj{Po=zH#(hvH6p?v@4yu7 zajrWr{ycznpNw+CH_) zVUUW|5zh9ScJsS+#ucLS;$SLLn;dX$B-#VYI1^1`>M6w`#g_waK%Gi&^;~mdQ zSizck-rUS_IMZm4kr8)zc=(m5sMJ;+E)x@zzRqX6x7ob)!QMl9=1ILh@#)rb{>oq{M#<~9d+y`70R7IZWufY!?VRC<%fD08cWm;NV1R#MuGXt?A zP#9Twg2NHT$YHCuTFu+Ndw20;bJd=&UxNT*dyuSJ3TMdv`uIE`+vB$b_bwMU% zj_+ZzXP%t>UY~8Y?^{PP7k2!d^5T*; z!Fa%m0@vmMTe%M%17V-Py)Rs@z(kO$_w4k;b~zwRFwGs_ zv!2mA9Ook`q1vo?n{7r%rRilT*x79|ar?^efyhA!^HiOb3pF<-)^FRkV!Lezp_TX# zbvmg{m~-jxKh?u7duT-7rqko+YqJ^we*Pdr0)gyVh|)ajX!TwO_X-=0r~>WSSHULxxbA{xjyU zmBLQmrkSv}yZNwb^J>$DGL>UOpTB%ba`fxLdJIBr3#~keJf!Md|6Mz1Iw#pnEGJf;>eUYnn(e$r(sb9r` z4g}^e;?(F5Y^h)vlzmw*#3J{nZ+&xJ3xX85AguHj01+a zjtrG>jX!@b2c0G}VDzTWYVY2QoZD<}5vmR8Z7E^b5X=Sb*Ht101Yr%c96o%Q_ds}i zo$9Ie21D;2sw03f<9ElbtwmOEv0R76djIED7ey~yXQ9)>mB%a0tT@8%=;`Qec>4P@ zSHmNFGt{ITu~#dSH51BFrmGZPY-nhRKh=02Y-#`0jwhaz1-E3JQ=w%9C2J)H14Xir z4YaOQytrs7;93)5k;2(z+S^jzSheQ~gb$l#qt^BLI;1d3A`lBo0F4+;GED}Uc5-zO?Xhs z@$A_X5Y719%K97!SZwnI@Za?Rhe{h6-v6saC$dOcQ&ZEj@&00vQ5wZ=&VK&>A4xd} zP0~^F#4Aql$sCt2UnW8PO=F|#hb%UFMCgED^edP)pc(=$OI^Y!h79MwwvjjEC zx%tGRC2Qp_-Pw6A9w-7@g3_Twms4MXdmE{dcy<&>>g|(r5}?8^qk4&Jng%hl5}2Hy ztOf2J4)dVb^fjlg#0U<0s_?&DIc}dT$e7~)#V&D}J#)p~f+NPbobb*AOuVATL2t0l zmN%yzuEH`TTsc@OU{?l_!pokYGDt%!W+kof)1?yj|bFhax0*-#OPoN8#=9 zsQv>lU#67`r#Ke@-J>A_GVq;^MJ*);! zgWl3!^Y)WQYO%M^u7tI|xS3J2W^fb9Og)vMiU1}J_YN$l>jy1Ztf|E2*uZ zt1o#iDl|{~^;G^7*EA>A=DoFPiaZzQS2h2AV#PPC7#QL-1RsEa zZO$Pe0YnX{z-v8QGL5+aC#~LLl0Sl7_qadaz z>OlA=hzuTpb8jCziy%|`L-Q(q_l^rB$_?p*l#fEfRD26|km?n~$MjJvBuo}j zAXsj<{{Vx1Y-0E$<%2}Y4ak5RY@dk<4@uUjfm0%OpBs$suii?z3>A-GxpvLB)x>@A zxxx2)kf0uTPM$?%jU4q*NodoWM=`$erN5CzR*Z$kSP#2Ci}oe$>$*P(isw+Ui3oT zi?X+#dl8q`;4{=5)A`QE{PXwOiR80o$RB*BE;C*rTK{l@LBAXUQVv6_s2WL4kqk449!) zhkk073~v7C0*p`U@cwjqyh0oH+`XR|Uq$=lMYwXK*Plyb#J+H2Zdx5$;mp(Li2th=t|mj8U*W5ZzD zvp9oc-v4=*@6gyDJejlj>BRbK-cwVX?NZ5X{4^8Hp~oW~`AUXP`^ngnaqf{w?Yzh* z61&4^{oK903X6NeZ28X&PjLpP`*5!oQ~odSys~AZzs1}WBqO4uO+Js}RgU^WIWtu( zg{yPFFD$=-OYy0aD{~iJ#SQ%+ANE;V`M+GYWNv0f=dS6`cUc?vMFy`YUwTRo6DxX| z4CWwH&D@OVl8=i1j9~ZTN4hvW04*y}?D>Zew{JL52ISJ*l9ZHWhK&cfeG%o}UDwa6 zkXmHVJ~QVqN0Ffr4R!0)da5XNzv&pInTgK}k^d@{;@f zD$*Bv6yMgZ`Q_hcQMzUA;>) zZhxG{QKTMlH-1l^?1T|y>GI{isL5WK^T)irE9*X7y)ou!L%cFEZfraAJ`h#xF%ZK1 zXEs~BWJd-~H9_GgSs_GMKQ_8*F4DYu-9ISg77Zv}UR6bSa^w`yWb!EF3;;U2w;@tL z2Xml1&b{??JNu3uJ6yi!w+_Q*(6>lOC2<+l5$i%B!40%kbxK`FwIRXC$f)b%$Mg5@ zZGiJ74q6ZYjpB1dclCy|v$N@jhl94M(qdDuzOiZpl9Bz)lxy=OQZR<_9BCR^`N+dF zYar#3*@LNt7qEyB>utG7R=1HO;!tx01_#qq(BKxpce4*gK0FeB_)oL;yi+Jm!-To@ z!;KuHSmz!__Zu5?uB+IC!6RS2bt@1EZ#~#G zh6PJ>3{9bRIel;E!0yP+VQ$78v7L$rAwBJuRd@m1d5-jGn5 zyMlGMahH%-ma~XiIVB~97+zGw5_E*GUb|+dktn?Wb$0N?D9M`Sx~X~@f8Hj&M%mxh z+iNlR@{PYij$A_A`0-IJ5B{@Z(-=1q5fl^@Ug{RU^qb3jH!L&+|G>?p0Wk?Mr5lCC zUPv4e9@=t=oI+T|M6IB6ot~}95g9MGR0-1}nQQgpwqz`pBe^FQlZqazl8*9YBNi?{ zHVC$5;1h{kAVIHyj~1^jFjk7l4f_urs>A{#mZJAhJ-JZlGBGok1uk8$kzugatR=Us zk-H>Yey((hyjB{=L=iIDYs$r}IZ>;zUygy6L8@cjgZEzM4#E`PF!&5zt^zo1ajK3* z`CJ&UkrHHA-nVbPoZQnUDewT>Z%CM)c`+!$|1TDh+UUE{&odgfk{7+b{ddxI*u#-F zXenr;uXf0W12Q*Rc+Bd1#k{cOio%yRrbIgp+9 zAee8m>yp2dvG3mPfAQR_m$4doAlHd8kVKUyPo7x0g77Bq1W`T5^`PXp$_v(WGWc+k zhL6&*`fo~@?ghOx^Dap3ev7aUe2lv$zvV_xrZ4&w^h_~KbJ@qx76b>f&VT&;sm-$MVAPh;17&}#-s`s}l5k0U=rbJ`M2h@c`N&rcXVTa}$rd^4M zV1$8zREQ|{`zF;r?AT&Dy!VcE@MIq8a;oU7LPkhcd--Gf^l)IyV}vv~N)^XurhflS zKAd$|l2!AVko4;X2oTDV=7YJglaawdP0JQKYs&i<8VWnAHlP$G@$W^igVVRSOV6J_ zpX!Y1yS2kn0QP~47cS5@rRz76egA2-ddx!hIE`ICq2^7MyAURY&v$e_Lb8OL>Nx^O z(~W&fN=GpQ;^)LdJP*Sd(RiV=k%W24(y8mi&52FAUeiTAPiDQ1E~d|);kKdE?F-ls#@6aDo`~Y#mKkzim1ja{I$yd zA+C(&%a@P9NS8*xlp=<-W-C}7_~yqu)E70ZrXk?Z_s$6twXUeRIRC~<3G0rc!VxRo zg_3jSj9w&9_00|6pGJ3EIP9=x5@+Rl!Fy^nLY6JMp8!asm)Fg~>IFZW`J-yRisF`a zV}Crq>I}xTBlWQB{_uG_t_#X%TCJ)gyq{Ezlz)7p>doU{-y|ANSIy*M(WQXJ6b`Fo7tGO|{$CuyB1 zY9NKF!=k$tTX*kX3qx5Y!mB-8igy|@=l2{9uDk*3$G2sR&X>o)XxwrhoJs02dx0zI zsF0Ns7n71U64~Rhsi*FjvqZZ+)A=+Mjv(;pbC9`4N5b*nU|~aol(=yjB*##emEwKT z^9pY9#wBlYb!An&0F$Z}>^r_%Ddq5js4P;35TXnfgz#15zIb?eIHk;)1P(^cq@1x`cG1jJ#_7E9=Ox0fI=l5KJ5ql!QxO@8hXf$g^9^0D@)?O zTI2;NM=KBmC$N_7$NF`F>ux;yP!Y0{D1k*&KWYd_w*$X*c z2_x`emBOx$=s`qxx#`iyWr_`u*fznZ(L9-+E()6g=X5krh5cM)!Fusmh-=YpN!DBsa*7uZ6Bbs3cW@lze;K{^ z@5vroN_fSqg`A_K`atZ^MXkR*z8(}3!UFJo<@$9$fZkCok@6gH@Z}J?G<9_D8Qi#a zi%CL4;?DUOTC}=$2XInb?n$%p!4D96in9lNf!O%uc|#<;?y2ZJxjWLWIx_ zDo+#(=Y`F`taVQOfJ~Ky+cJxPxkMR;SjqBF5~VMTX3q>}+BVV+wGC~m&L&vgH^;-9 zt4WJ}`EoOjie#sD^?&v*wg4HTD5ZAI3Xyk zL>H{2xiArV@5L?57nFlalv{S=gT{9Ta&vRDk3FBi1%6+nh%_7a@L!+u{An3P6z?Uv zD#;?ij%Jv$7cX8=6vXPI(23x{VjwSV@AM#Px^IhNFtwzMND1QeWy5zvdykg3rzeIE z;z*%bzbJ|byS;5*?^i-}Gx*wjn)8;`a|H7Qdicm*#mxzv9F|rl6gNCI$&SO7cncaw z+HQ@dvu{~oJI^H-YwBv@b!(*oaN(P$IIjXS&vnsUEwmflEOMOT`;B;dTBWwaEuY=^ zsmCfx10Hq2F(=kpU)gv~HGrV3ioSG?B3a@#Zkur=Tj9H>heuJ16eTDsO03oo zj#n^mIrZk=)Yf$KyvKF4-04`qlYQ}8IioSor@-A{dJ1gX;&n40)uhAS58J?&Lt-LJ zX|&13jyMRl78K9LyKtBDiHa`5V{Q~aX=cU%Lu8(9Cl8GIm1(E=c>_L&w#;=beU3dR z$jr)mczPCaj-Z(Y6j=f(Iu`e@Z258iD~K>s{eqkQ49g8{S}@R){R zx8H;N>u+NH(B^UpB4W6J-)oqvz}$o)1d=)yB2#aMX=1{^H3&XNr`_*?0u#)ftYFY9 zuu&Ih98OGZ18kVv(XYz-)*GmX`$5=WKohU|BCs_|@g{{RcQFh};cIUV2bIHf;c)fsD@|2$Ku_Rq!mG^_<-#TWd;kf71W(#k2#aJ4Zl;kmD`-`5-y&tO=9o<)D($_* zc^+*;H=kUH2sO%`ywpSBU8Mh>I7>wPy_xeldT3R|u^g_9>P^fU_Q7+pE%o)!`L`%JOC>)iuKBe&dW0thXotxUx%k_XNE-Rftx|FX$l zvdVfFeYY>85#Xa~;bK6*g6k^$$Z_>((t^_e=Ezu@ z)0P-HhPVD?r7xMkxZ?;4`jw_0OM!nbveBPCd-ktAU}oy4Iw^a&w%L?Gj9qsvTQXIY zy?#ybb-M@hbDRsS@3NYkrd~nN>*Juhz&E%K^-=)V0C5`;mjjUyTz{VMfM2>Y)7C!; z4~SwPUPxq$YuEhP;?ueEEgR_J2Pe)YXtXVVP)cmEZdnAv3@NoTIjQ158OQGI*==q1 z4i&~l&aJAa^{+oarE~3feJ0Bl4=%#cDL65r|kA z=bW%|q-Jf+RE7_LFe3ZIH_(VAI;@a|%LTgN1c3#2E2$*_B#a6j813!tC%)y@v2k(+ zqHHk(cZLZ_jNLjLN%{o&q_+CcO)Qe53Qwusq2mp=5#a0fve60y$aPHL%%`It#4n z$g9nD>x6_33{At}xH^0Tuc+v&E}5vP7TLf2$Bs0vGcp@DE`SNI3av5uEem;xWeDi_ zIJhKI)lN-Ku`OHn<89JMY8_zsP|?pNFzDI@r*eftl%cUGvc-xG#2E+_4;}4PhU$R> zrC7nNC~YAL61TD~hjbYj&qAb8`0#=~q+XuW5y)MCDXNKB3 zaq!`T2W+sqOP#2VJ~d|SZm`_|+Z9>$)94aq;$rM?%?g8gDpjoR)hi_+^9RlYdgu*Y z50~$=>0ey1QU*gUOwijVF?3A&L2jBZ541C3ek&TUAm)}d0DoMTIbqEU%>)`y#u(e^>Zr!-Y?N$~H|9kR#3AeNlsrF!e zaa$`QA;C)gsS=J?RsR*Ins7(3yoS}f+oO`5cOZNiX1Ee`ePSM-7rFifY-ITMHv4&U zgsvd_+eh~6u_@5wwghffa4PE{2}nf_YFF3RR-$sqMuCJn`QVTljNmDc8H~YEL)}kr zbP=Vk!I+M)Pn}>QKt5a540b*Xdp0}6g$JMv69r7+fT_JNBPvsR*Td7bbnV)(SFhAQ zefjbn3N~7Bh*7=v2QdZ0Pz$Ci!2kw>c@(;$IB487m*ccc!|Nf9E1VzqsGIV9vcTr5sEQ1z6g zXeTw@ICw{f1N6v|2S@h=?b(;2qma^cH@cad#;$s~1@Nt1yOw*mm(l4qG_1h%QLEtu zWDc_AdZ7Z`}x&j2%ka7d)m$ssvIV75$_%&^|&s1>izEidc6f z&+@8X8-(Xli0da=mdW0YrX|Wd9b(E6cXk*CZ~OeZWa#%#-Jy3cP0Ra)RaM(AAUHco z9#CBx$vP)kN$m!u{}*pTYE!^E*wr=1p$SxJnEU^WSiV9R;C(%qOHW&#+#n}t%=2&Z z0*#{ZLY&smJ@FCK?K0eTK6^lsVmJ7wENKFC-hASfJYqmse?M^)t&Z{du@L?WG)`E4 z`=hG@1~HoL24ctPr;9cyYl!olnAi|&s-SqRJFtwKn;Uy)0gANs($buunlGwV@;uJ@ zJCF$Xs4&pS+|qUw%<9A{0yk%Bzn&xLZ+J>BX{v{8{<3B57Zz5t+TtYLq3>OOS<#ud zN9R(TCM~tOU5CFJ#0G-t1%$2Ra3~XN>zR(CAT$>J7<{VLElqUY&xbQLoKV1%@sW$6 zJsRZ#9q&BS?2Ps+43R7CZbb0eaeX;L-c~DYMLtTMz$B0|3tT2_EK7Lj;`Zv*!LSZH zp}_*y&MjwUML7H`Lt9FoAHCOh0hdy$G=nApn1Km!8|^z!Bsv6v&1Z{+w}LDJg|~XH z>i)_(YIy{y2F8zI!Y!l3R=Or|kdS}K8;5UkrHLIlDcG$;_)!514b=wZQC>fJRQqR# zIzr*LISPh$qCYKb-L>laB3DPyU{+)W}nN% zr4BnT&!CaX;D^I1+v?8<(MERPLc?l@*VH57dEa3h#YXaHqX&^sxX`5;JDvN@zx~l; z{$@!1@^;8&i&v^Bk_-IkXO4 z*ZG5=s;{BNqYNu0RI^Iuz&~b+$Qyg&`mlA-0!jf*t`I%q1FVspVf(H?jI1gE3(myw zh@~{0v9D|n1C7aaU3J|6zH?vj={F1n z;KZb(qnocAO#Mf?;rCS_y|4DeU3)|g3)H^+sgs*r1QM?joqhz#sqvnIls#96YfJU* z9e{kblE5T1$p<5H@*($&RJsop2fTfIgj>dmNz5Rx1dh;9gSNl2*k{NE4o*(x$Q+Vq zza1fn5s8W7DPTJg?nhuXOw<>&QaoPWP2NBQI}*P8^3FOsK8G9U67b0~;{JzIHN*u$=rFjsLED)>g|){c+34XyhiKW7R#FIqzJbRQ1;?up24;Ps*MpnS^RWjnpc%(1kmVBp zQ>uX!)>EOQG5f~_bF`2SDS5gWdAQc3Rv}X+x+ZKbne(`4=RDRx{VzvEc=)xU&jD-d z8OGebdl^3P=U}dW{rctdIr1cUPn~|bo1*#`P!&9fgn}BEY2m_BAXbaATtVbteEr0y zU56_SG1=^6nZLn+9~)6}2xV+hvx2ZjICKJkwFfOHL6h&1ZqROU2??^iva$@|0O7kF zVyBv`aPRTC8q4c%jkRx?0+Z_D_zjp!ge!a|1BE8Lc<96bno`hsbpa&1-0x4zi7CbH zJHhlABxx2R2O|_0RHOU>i3?U3`^TpK_x0x499az?qvpx+@8hur2V?awAB3M^>Gj^p zcl`#zD%Wm~KbVAl^}kwG+=jk@4-pg;^nu#gFkq<$6=Wd|OuYR6@TTYvO_PO&S;h;mO=e0A?bWokU$r|@)uOHCiLfO>nR*ljB| z|Gk#(dqMz?u%4&h3=0d(KBQ<%Y*Krz@gN#q;}w=t^XAVdd^7Rqfx9fQ?Ys=BAPyij z?8C3zI=ScI#Yh8VEFy5?4fJd?la}Btct<%0*hlYgon19Ykf`k)T6ioY6f;MmydxV0 z`%f>W7nvyp%@6QDev?OnSo_2~QEOqM)?~JeW4LNT$@+(-v>M6@Dh%nmAm=s|s~TDoGslIH33;WZkBoT%SW-S98gZ1)dKBcuGl@0^9L=%`Yk{1dae6Ie zV7(_*mLuI2FY4;5V3%!ri31ZD&@Ov_XQYFce9vBM+LOJc8>Vf3P*n0z!^v^C9;1(5 z&678;$HWJG=Q^=t8$ksc$Et)MvLzR=H z-42oDXr{usG5rVJ>Ojc51qa|pKYj#?HUHxk9fIZp{O2-^OZpJ%lB>VTM}8m7^?(yu zhe)Tvp>Z#Qp}x`4jGDBMQ(amzXEoI(w;46gPFKP}qjHy#(HBM$jrCSKP~v*C}$ex2(on4moNanKNNV!d@ED z$eon@*F6HqWJDuRQsCTl+$WcDNgxFF+(&#rB{#?6sSyrOXv1s!ztkr)xhQP{OYs-9 z%kYq2&S@KSBWe7%;+wnTKW+;lGBkhlq+fSwgPwcQ<4?N$Cxc`G0vfq6plhnDKb)j# zlp8P$+;b*QDOPgZ^^Y1J`_L+?d3Yx+MSlLDMnQX>%!jt6^Ir*uolIwowDKGuEO5*@ z?*Ehm`kFmyjPwhm-qDjM1E7F(&uO!(IB%X9kCb1^T*1K7d=XlGcQ|n$J2*fXcXhnP zyj$7Cz333d5-m>Z42-dD>%8m4eC#1_)pY}!pT<~}>_syqX*`k=r+QDaf z%V70^at%w@^+(3&enPp{bOXvKOLjKD=_p$8QH7@zi|&El4uMfBbfYjkJl-X(tt-ia zTOc(;(6NlZ)dlE1RJO9R3VN5Am>35{XjMZF9mvbeTlO$0I2ai(q`w!WOx{mH7WYS` z%Bdq0q#n}|SJx5L`fn*7dv%MK*M-pjtWylb=<%lM0abzOP45S}bgoT_Id~ACL|Olt zJg@(a#}QU{SO5(E{=k#WTe`xy4(f2|5fQumt1fb`0 zP+MIX9$@;l{~s2|aZcyHdOFg90UeNl$prM;zb$gjZ4M(nF-o7!n&F0D zt{O@#!%7#^9?b2%rIF0EZkGS`pt%3GePs@F@lkrxuLJUhc_wy>h}4vAg^7pHlf&C~ zVDouw=es$%xpWlVhAT1`B4$VE0%F5csUr5gux^wn=CppDg=jr??!;;y9vLY`EhC*3 zwQAVy_R6e>t|PQ>s~n2`|Mv1cY&Rcy{2+0^I+PBSVNzcuvG{+hTI?Av&W;`j29?A&Z*)`GU5a0aw7x6)`%TTW7}yjeT{_3O{r89J zt#}BlGaPTv(Gv}>a02J#h#Ds{oBgjWwF%RCoHa$1ZFFxDqXGIeMYY>D8lgKBiZ}z# zi$T}f8dzaLD@Gecf_#BDdOmtR{m~;#`ZGc8vNTUr7r2ZZhu)yJ)yEiiixD`c(^`HS z+-?Dk0wa#tkz`P5eP$Q%0}kZ*&cVhOYhe4*`n87n9%8V@S$&(({0{Dr8$`xFaO8G9 zm5WsmXDFaa@*nT^odJTXNTr8%z{QujchDo^jUp&O_BfIG^_nfXjQ_g^qtXlcUJl@P zSx5zh&PQ^v1xl_27>IF_%p%IfT3g0#RPgEaFGF%~r*~u(+HXDco)eC()K>UQbOzMi zG8pyMP{CBdZ=*AWqi_5lK70tLaL&;TVFBtm0D0;-_}{X|Ms3m}ooWHVxfB-Wbc6ht z^jp)9kQ1kzh8EJb=GJY7|HC?c28}uvJ_$4hrtvY1ouy zYKn$SZEQ~B!DZr|_<7m}v>O{{uC=hXsWnPWc|~|kOc=;d-VGa+h?gAS=fMiSB3-}t z3St3hf&77?xyGY)Cf@52$>vcA4h$4&n}KkYKd^?4jY6GfGUOl(l@;6sjIh3lF?gi) zxYJ=MGO5OfKD#^bqxP9+Yio<`ynu)V;-*g*m5jDVEiW_Jk17{tDs)sX&L^!&@{k_< zt#n;c{L%T;4wx2QUZjmphK^1mdJ!M1PeALtmX;MbhSAExwRrJ4geRiE;`ySfuN=9O zoC3ouCwI5CeIA;aLSgvt!3lr{1DFCMEOfML?FILCH7Y6?&VYExqo{!Ls3 zxb6Oop2~NpUQCd#0YpUj{f>h$A$~(tE@H+R%wN%kkKjh+9rPWZ{MxVM0-Jy8tSwG_ zK&xyQPF6q>M$U*6klpsAPV^o;B=G1oJT@bO55oG2RNY=pk5Jd?P-{p9Brg)jJl>UZ z!`;n|59K~qfTl>@z-eimtqecQ9uVgk&9G5#dJ1gUq8e%ZIHtVsOT|Y1*Lkv0rIohf@CqAB!2#z2_9v*!y z9Dua^9P97^rZljYV~#R6dNl?@D{64Uf}p$&!LWTrs;!)ay!Fld@x-VKrkhg+SfyDNsbR)F6t z$MI{*I9p5!OlSo}Eit2?8|#29gbDgxLpw6=5ec>YmiGI2DE!pUr)c*DRt ztN?S#j_z*KQQM8krNGo^VvUZUNf4)gSy@@2LO9UozyaGzfm4JqDbeZV2RL|m#Qj_* zj?Cb&3MCkA{m@WM4%otM=Gr92Xgto`Ol8}&N$Ey{><*co9`Y`G{rVt!)o z<{R|~;Psf%kV2Ycp*1T(YS%fxpUK49v3`+q(dWv|=+q|X@1glm8EzwT%og!j=?)xp z&EV(t6ZCc`ow*IyLTUY{IHChz|Hp@}O5L72Pt_0PhT&sjrF#t6HW8|*NIP757VjEs z(uQz+5$g<|Sz-n>>nL)4gafe>(=7E+dg2_lhfZ4qUr^j|11=(-0diUaR<&*S`9)%9RiuE>%|q%G7)y!bV|7U|Yf+;7G=Y@{2RV(AOd_?~|CeM~R=1 zn-TiQkMqGIrwtkEC{mLQ!%_+dz%Y~J_xcaX;P6t?j1Kp3DIyOT7?**JhlFR%cL?k7 zb;SPK1x3)#(GlluF#v`RqlJH9*C31)o8X!v+ZPHuQiviUM-g2zawVS!7Cjg?Q!B!))lNb3%S_j9aTmEtTH1?t)l zo1HYCV8JQl__0kmIK}9xhklw3G$JSkpc2_uty+j427rbwmh}`E(l@RL1N%k@Jg_Lh zIR((S$w_zt0RdHJH8s7no=r9%9&_MeB|h+UI1*q11UuMQb`u^5BV0mSY(WcIy-T`x zj~og`jsqf=e{68l(!jK2NhO9%VvuedeisYMg!DkW{rVOJMFa=&F%ZrdS%h?W!dIB` zeK&MgY|ASAYj|jD3g2_{98m_x6C)0und=9^9tKQUK%hH(qeNAwd~jG79FynC8Bi4I z*=(M90$I6#>;Q}jFhkhE@l9wsVsHU~8G%mQ1qVebk}?r#Grp4=2qs__1aE}rQbagn z0TpCt#yM7hvS-DW?(Jb)8lj2fL#cIWPSL&p9VcG+!55aSpL>7*fdiU`57EIzCx2

PrHosKABcn^P0U}$~ptWlqIV}*0vH3;}PN79lDlxUCijAX3o+5`C z5eX!(-vg&JjNqVzd<$TK<8X%KEIPX`pOzVrmri%RM}GSS1f+>cJiXiLHJQ==1FIiL z*uvUkRRfSOOa(&!z8V>sVsQ7$m35yS3Q>~9)%Gmc{0cmr{0dUx1}YE`#wsHuC}=65 zfQEZTc{vlWA9Ss!I6XG~NSxy{EFiK@wTmT|EJX$*a^Adt$Vs=Tb?7~qJJk+P?f}I`4r2tfs3l^0lYmrEueKwySJ}!bxZcrwQ6SCBF#khV(p8UFaaenKu{o2(X02 zv<|%uWRPOE4e^ZTQe%eeteaCAsksB#^hahI8yj`UM|KJG^6nYygoiiz#ycDhf}R+e zx{XMz#2`Rm0nS+=XC`-F4LF;HLlqr&dRA0bF;Flf;JA{emTGe;r>}1q(fy4R*aE-~ zw*NshTE;Za+k%(nrSA6lmlqK@U#6p8l*Z}DcBSY zD0tk&!QC4-?h|9jks8(!LQmCGa8{!AEU}@&Y^w5MHUYg(sACq^X@6|s{$k?;=lcMOCVFq0*5gbxn|B3^w{6>&>WpMn z37h}R!^fr$e*tE{Gtl_vP1DPzSHBKl_23iE1sjM%NIb?roP*o3-u+2;(o=Hwl9q(o z(6dJ&L*(397A1!jNLd z4jzO8VU3MiF`=XpV~7h3K@p*4BnIfoF4w^*UBC!W8~rA`P_5+P8bS z>6-m)F)=YWQ&kMG&?j1BWRJHQ+p#qU_+(lDqqK+<+M?f>Bu)^xXG?`b!D5oRtnR|o ztn+xz6`D{+b50-Io^9_neS;}NKp8%oD4*^|9ev{t<{$%#mK^qbMYYZzj_P_V`_#r6FXpdFj6+{Kjz(O6t8(BCdK=ncCr6l|@ERVs z*dGktPA1$>j;*r{HLr{dgM{NW$|V!UKp!KIWd0C{vgn$iA9!)=?^HuLUn-TKKwGi9 zFU{PCeR9yJ5~FL67o8`)4>D<%DpL;?(HR}Rfd*zY`YG#reAsWm+Ax&9Pz;FJL3s02 zdt=AFZK)TNJz}G9{5p1es$jlP~Q{^wgg`K+i(2< Dd9ASt literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_non_dominated_hypervolume.png b/docs/source/figures/plot_non_dominated_hypervolume.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d8cc113859d26e727abf4195663ffbf24b2926 GIT binary patch literal 28092 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˅oOEkaE{Zx7qA4My{w|KP2FzN0!}0Pm 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 h|Htfl{9mOx_wy3ot2&)5v?%y{{n#B92x)s literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_pareto_front_curve_3d.png b/docs/source/figures/plot_pareto_front_curve_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..89873d2c5f51788931b070766977828d0dadf489 GIT binary patch literal 66684 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 literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_pareto_front_evolution.png b/docs/source/figures/plot_pareto_front_evolution.png new file mode 100644 index 0000000000000000000000000000000000000000..b754105d222641f82bba1e65352093c400c4c9cd GIT binary patch literal 30886 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%0AfxSZM*f$)F!oAIyP_foi4q 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
jnu>I&uX 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 literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_pareto_front_pcp.png b/docs/source/figures/plot_pareto_front_pcp.png new file mode 100644 index 0000000000000000000000000000000000000000..4feadefc2e6d1c0a3c9026321dda929ff2b2989a GIT binary patch literal 52817 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

}NJvZ&7H`-y0^f`PiOox-Q;bKs$+VuiV+4n{ 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⋘*|84z!k~k}s}630zDnBMXl>v6q9@lEpMdA)8Qp3C17B~NwD(ZjZYGls zAichjg|?lpg!Ewe=rRNNZ$Cpcckvf5&qDSv(+ah2E#BmM2$D1Gij)Nj|j9auqeyf zbh;vmkFs28LH638_dCDPYbh6ux{(Mw>+9cR2mZBPS{aQXAm;djZn1fAWg(A!VBh0# zzt<(g;qW_*puq650NE4je!-eqU=G=%vnq^SUW^?7#rXbJ^#4$lbU?3V0sbA9O;L#J zG-mIK?lK2+s8|ZDiU=|Ecfrqn!)s1wcSmFF(F?(VQ)#QS$$IAg?t)mp${&uF`57_Q zqt+}h1bpj8WXf-;GFqQ16$-k&UR+A$5KEwqv-{nWzwV!E@UZAKAfR3^|H8Re`6vTv z2*LH$c$Wgk*Bc>}XZ}8Ae$?VzGfXne6qVInbmdPJ7~RRK*P10OlNZ4YYSbXi5k4=*)7i~- zF0{#~K@U@g-LB(RnoyDx#?+Xs1IsL|3TnW-YRBny!xGt?&1UT5r@?r%=FQAMvUzQ~ zX|juat@kBxJ7nzb7KdPp6vGnNi5w?*O?O~ua45O*pSpQ+i*!w_sc!HE@E4iO| zm7f$~x97)mA2JfKk=b=6skSGSvYL$V6z@c=zmbU^x~A_%eF#2!k@RA6JR-GOWt@c% z<23PVFJPA~nR%TZ3wiZpW3*#Ijiu!5!3(UlU0V3=bE))%XUzM1q=$nVvB7hb|2VPxCLB!7 zG4p@c!(p}q7{c82xUmU*ytk!wlFHkntiaoXXu9{Cd>m`rcd)=_%-sJnYXC7snNoP> zg*z!m`qf$=v*J0}biGWYA{4l^q@H@UpHjTL)p=1M8He+` zCi!MxF+zyvGfboiw{8T+vMek0X*>a{l9Sc~1`Af_%l8og}bu1MK#? zz#efStsh&yy{?Bnko(VThg!U=0++62iBK0kgu-5kjzH~MRcmn?KU%1T5%T8Rs@abL z;X@Q&-49e^XUaf65;FcrLg^&2)s%i!jxk^zfvj<+vXAV6XqbVG5qurpXDB@>OULB1$Ok!Vz} z^{|QF+YP3@oi2t!Tnm@@Dc~IA-00Z2NDX|lv7h}Nhhwm2TClsK&}+)C)CQ-frty{- z7A@30ND}PE95_+1oal=~K41A{2dT}erkcqPSxZyu`^vXFW(4cpz3RTfau0E5Xg_&y z3A(|~o|nnk;Ya^>>K~!R7C>wP9L34{Z?eHUvz#yXW0&-YSg*q_cAMCx(j|?6%OCzd zT0fzQPnv4}?|U-CXzhD8Qc(xyv#dzJFV0Bru}3M~5{Vn5NUt4lS%T-!`)AjCII9Wr zOCgKyyvEwI=6{f)q=!*AmeqZv3cy(SoZOcv(xBsMz1P!mvvh@9#s6YND#0!sl6hn3 zd6X4nXLaEIVPw3cPRVj}4z0|i zOkrU0^IlHrSAJ3vF9|!gT=kAxvD2-L<;kzqf2eU#J9`?2w`m{8XShD7It!#k*NGh^ zjIaoUDv#-3pFh^PK+m+|PX8tDwk-qe7617U_@xOaffCc`15GKnPaZ&KPXfJWEV^>n?Gi9GYSQMc-dcae^&Nv11bE zo25{S5g*Px6;jn&NjO4anT37Ji>gW|kuU*4;>J-4znw)Z$bksM525fb(;6|dN8UQE zwPAAFJ@XKCGDgd6?q6LT*n$<+Y&d@-hn)-GUVJP%NCjji3HsuF=5g>oL@Q<@in?Q^ zx2V2`zN-QUA)UP|>opbUqfea4kQas7~ZmOR)vQYKMk;zCTFhwD&?r7XO5qgtvDsWN- zSLt{5Tb(&AcV3kjOo=c!(sVdFWUXMKhA5WH>q|*0|1k_{$*v0!0+df;s)Zydtmdd~ z?zGH?9(*-7iXxK?o0NHW zjbClsiWgBkSG}u`-N#di1REJ zl7|i3oRGPY!xm*yFd|dB%3z7gA5Xf8-N^FAvCZUR-M~OVWYcreO4_a>v2j2dn2Sv- zAPTkO$Mdwd<-n;6Neo6Wtx-<^FEUt!AiF1(5j&Ev;43asnUrBhKOoQernzX$R$`Ji zLt)GCDb4kB-^_v5R_kqu1W`;jK69BaiNhniqy2r%sznnu(I&SUeQ#p5r4$*VMPs~k zAC5&9EFjD8I#+d{!f=s_oO|p}JEguy+vl?w0O%KJl7tv4;y)=Bbq2$3QhIOvF!@1qIf@^iDeG3mWJUYzHfv#TDS()Qvy^DesHpJjH4 z+>cr_bK_93sj>mFZ6IPpfMkmS3zro$T+cyt`lv(dq7euhg$VikAWDUBrU>hzEg=h4 z8u$Nl#RHUq^+BLdv0^pW2?P40oX7QQ&1Ot(r~mJW4lNQM&lm)Xp_F-ya=e;Kdm`j@ z^z?7!({pR}6oRH@z_Jbakon4CX~Mwrz&`jH>$||se5r=~j|ALGnBn{G0JtRBT!_QO z+Hfn7l{6r+y8eO%kXi7$dcaon0oZI6U;`<{yhp7uQZcdyT*23I|Sln6H4c>$MiU6aY=ASZDC@3v<6bKoc%L(0nt@{+Jrx$YB-eB9{#6}TEQ zdHE@Kk8G&PPw_>3*Zv>GI>QNztcpq(VW&wSOTaro9&O&0&&nH^ujq6>6JR z{r@(4Nq!h?lgL0Bp|97rVOzSA6Q0*g4D<}#cz$) z>kH$%S`X;42ihKF(9cm=QC~1guWNX+`1nk8=skjlEAP$wi0Elhe0~{BfbfHBqE!{3 z3Fz)x!?dCtA#`NyD-Qjh_=?w9rAnGV#sM(kuWR{tX_VMKCr-~lKu5A5$#3>3&?gmE zB1=trOhR0`^pYsWa;#VCX6DfZR?mYla|$jmZ!W;>L%1pNJ^{d@(LnRBY;hJrq06u& zm+Jl6Q8!oVH>j9}?0YG!LBI_8@?do!Y}^fG@Z9ce9Lre2LSkg7vZbrm>tKa=$lZd0 zmauyqzWT>#{2!~|CfTkkq`kh92MFVbbkau0Fp1~p;_}i>0)eq8OUU{!yR_NS+3R4b z36}~>X%I4ycdhMmt)O|Ck{8(v1&a5Fg`?Mx=m>jeTbJ(Tl{;=_u51@2+5Ym7dLdY%m4wHIUn#V$sr z`$JIVtR0%co%2;jFOl=;r+FZvs2{;uw22?to;)>MIzSfF^m!aElI&=Y!?Q~M!`(Xq zP$Pbw2biERHsVsf95W}p5$~}geo{Bv{(-Es6&sAd@>liem27Q;3YuKy)wj^kf*q4x zhqYk`@ia@$<=pYkB(*a9X%N1gr&qpX z2)$5=?M@+)%&H{wZN-WacJV#=6?f@c}}= z&E*?G*qtE94IZD+AxW@g59bjx+vv}uk>Y5y3O@yh%L%}up9 zJ_!-d((&x&`|`6Mlx;`|nHz+2FPOoh!x*C;?z}4sQ%Cq;K}U5c&H>@!t`xfZL_#xs zj7szx9Wh9H!9(_@>eE=!ZafXy)Z3x3Nb(Q&Z>1V~+4bnfYGo|mfVpFb;+14qqr@+i0G3{U!g5LyCs{_?<4fFhtZn3A@M ztW_yfvoEk2?HKr;R@#k1wis2*JM3%fue3c>E}F|Th31e{A~bN%QyGGBs1=a%guTB| z$wH<~9(e4ZS0j2`n*PC4kmH(ms7u+|kgo99!m$FX5W#jSuFD>qa8Qew2oWyeorBBi zUX8)3(4x=eyP_uec?lbBD1;V3*>9>5SPC8&bdRR$01L+;MkkwwHjIkN-!=nY56tya zFMb?st&TVzwr=F!oOhi^B*=@b`*+NIn#@nzz*46NI4y=znLGKuAk`6Y9=fag>S33{ z0G4Mr^8x9RZ~#OOov$KhOY(+XMXGy^2(hVY^m;O95~$RJUO-p>c2;q^hPe!(oVy{- zOYB$Vpd2@hKl{>GjWq3jqf2lS5>whX%P4gIi&gksQlvw8*8Xd;WFiq@yxlc>s;O7m zK9rn#+jQ!|13Qxnlmg|)4SGoVWv!6eyByatLs@LaR*+Zn9*gDn`;{EGDl3KSEK#Y?-*b$D>M5pAn8U zSx9t&Dt36r(%0ZzdlkDGM>;PrrxkY8qx5)5c!V zuH0QR!~73xJjZk0QR#hki|P%i56J_ycTuB`=_vT?`J45Aw~Rmk&yMGQwfRCO=3r4y zMAyn>`bq?sx)H4(JN<1JWy3Z~YnrAAb7g=dcA#hebPznSYb+o^jBWbmB|W1K&*}9IJ0hG0z%$0P+5}?)SQB zfkpcZX-`g2V|5IppI|p;dbrjehy#s+4V-kT@_I(1RwoXwl3g#jBOH8FNjyGEm?%pB z$qA~8!qX_L%!|sqMuLbO<*dn{BFy)UyLU)AU*CP>$OJ=TF6&dfTk>-ijm{T!|dMH|Dh3J z<3-kC@IO#c8|fw$U>kyBJN(*YY|PZpzE02cmiXby`p`rtzTMx|r6{5H#e}7MGuyGT zH~{`THd$^;bf)u_&E3sp(WZzV`R}}xb;M?~j>G@M^ zsEsgeaT6TGjX~8>}$+VEJ5xy4qUV$9y&ZKC4j``Y&+fAz@$OA0`;< z7KSk+N3&VX&Tu0iK`FqbOMb=XJ}N#ZODmLg<$bwfrkyQF{-6 z-inEb(MFx{vsKtqGs`Mna(&4F zh0AvdqhDEOw~lS*SpTB|N-MmERhM?=IL7C%aE+BJ4-u^3myb)MfXDlhTm35$`IaE{ zt+*^;(mI8HC}Ab8ch;Ia3C;9y%jzSl#P$4^Ool{sn5#-|FTmraYUX3ru_CK9SlV;kNA+o{i#q$mo*uE)t>RHO& zBtwHbrmtc#jm>u0)%S`m>O{bF8Fc=k5D~t+`!_#<$1cJ8F=RkQ4FIT+cGFMsQcw+3O)N~a=Hs zrV^fO{A}Nd8%K^_>VjI!tuB?qjOkM=$pr>hcyQth^H(I&!{ENil=Md<^ssZ&d83IT zPMXhg=65A8{;g-%x74on4_+nvwIs%0#NIn8+V43S~vdTf+htz`RXbMxe9M5<>gL43%mo#5SBIaRXC7GE^O2oJ~zL zSD|jSj38PFn}l6Qs@RW=q({>E=Bkq`dWvT!r61BTGLu$92mK#JfQJVmf@ntA$YZt+EL^)XQK~^142B%Y6T_MFAGg;G z6HO_+nV|X$&QB@}_bI`^2PeI479nfXff_Ug3p1ex;R@Y`0fxo5#&fXIljI zY-HTDv#-Md0kU?zc}xvW7AQ|EWOO+;nZNGu8uDN%U=%MzQ)kWWZt50$tR`(7l9{xTJ+YDti zSh^LCN==MBVgdqej{Iw3Z%3QU)o^Q76xv|`Kx$*FFpoVjNfM4L(Toe4mxgDl#%y!6 zG;iz3f)pSeKI>zw;jS|-PkJ_+NMKp7YA_Jc-c{4s)T>!Bb_n1 zv*#VEIKmm!zIoOU2EX6yCQ7JoSjLshtWYKDI-vCO`8G z_r==^w{puEY}YJ=FtA3wtaIJS(&HxoC+79iC7VDq}N%oF- zav~WtUY68qQoz_Brq+BTPvaBwE1>{)sV`^;|8fsug}k7C%h@nd5k2$N zKc&(6m3>ZSU}~X2NdT@Q`Rx#c0&>}hI`K!YW}G9i*r5%tx>Tb@M5Pd%TPD0?!EHL7 zT02YoqKW?bzXXI&Deqg;VX{Kg)^7 z@K(nGE>c2MTXPnYErMxoXfYCElA`H*K%p~n;2*G5lR?XeHx)6l7Ddx<+F2R~mY^8> zs++03tj|BW@Zv9p&XvViixD{HFEYp|AVAmt;#kRfzD0v$z3`k!`g}dKOA|hVzvh8W z_`|lnMUcvhe?Z`io~b`fz2lrB(YK!Mf_7xUQWy%za+|3mTx{^rG;j`jxitb6IH<;P zu->sjHp`=NpS6`Ux~EqUis$hLk{)|1?ssSJn%CVWw$6>ZDmysEeuz0Zqg%A{K*~VJ z@4s8elMe9dKl*@90oL}ZWf9jRV$ug7dWl&A+WSYsP?l7NM+lIp;YBv9f34_6XX*P7 z%%btUxz$T7zvSWgVHd5L+gN?E$?+J1ETR(pEP^ov3b8NuD zBOu^tH72j??uFFNlO|HTobpxLU>$y&vZ%=#K8P*O)mb8=b3c4AK@HS?wna zugC(C`VT&eXcoQWRatZX8jV1alk_d>#AD^S>Fo7q2dUD=Ebr;-6OV2r%OUf^2qB)W zxhxLJM|GY+3F&*(RO@RE65!Gk@eEE*^%eWYuqm+P{|wmv;qwbaecrnr@(xzw?pjtydL$~#dS~!6*w6A z744isau3&*8T5pHAWkgp;cqpT@>ki_Qk&x-veVDINRQe5YhwPBm(A^wY6QxAA@WbheX29jw&Uka>L*U1Jh7nMK zv!5H3&}^VE$5w(gUKUnB=L4@1MxR3X7YmdzAO<3Ki2`xSGlh{O@^w zC$PdEQeV7&KJd9HM(L?C=o0DQ_3Wi~z5IQySO2VhspE$@(wgXtm7Q)XyTgXASGt*m zpB=Y|4*#Csw%MQpA0w~rVZrJ=MaC>flr2@*wLbi^8o=ms$o-^eSL6lRG)LD)0=tIQI zr;zBCwf4J<*|V}*TD3-);CfN|F547#hhW!QAtpI}~p!<0Gw> zfvyixuBQ@`w=kBi4IM3fB!oXIgUk^@7zKH?!HPr>_H0=XLQs0{Pjh76;Ux97TC@6Uc^hOV)I~d)14ws_+ef?!H5r+f~;ruCh ze!_U1M>j^gF%)I%lEd%2f7i-rPd!Qnbg19#7cwwk@BM{-nZ|pfI$@Q3P4lBSo)u`E zU2PU)3WwsI)1Ww}V?zZI^DOP(jFAuj3YA&*i^RHr>sT@Kf^MSxw&>BOx6 z@nPYjq$r0d4i|$?>RdAhLbtrhAZjGZb&-H;&>CgoGJENatM72zS@|MVGIq3r65VW$ z1){RJzc25s`|}tMZ=J*SG_ld??0CH>I&@0(r{dlBz#a%GFwQVS>iEzK+_C;j{I))n z=CA$r|C;-%wz!%m+F@|FU_pZf2oAwL3>GxFYjAh>1P=svNpN?!37+8YZb1ikIXmxn z&VM*u%mvSWdUsb>t*Tm8-5V{iB0flc3vhleb?Pw}X4ZCzBwtKDiJ%QSOFZFYpQ4u- zNCv(UQsWqj+`Sb(Ie4*tu4}3g-n=~6f2Z?qAU`qg`#YF|CigIrRTTruAG;n+T2)Z%VNOd@}jK58tyzDGhO*Pw#82;=Y%pLyh=m!+TkY!+zzy=gw%gs& zGh^J3jstf5XontU$Bx%JLgSx zfj^tM;M=&_HUCtbSsD!xFGuv*P9_K7{}Fc9EFJ#hk^zPUDRy&KdTYzd$0yZ1f!s>7qC-feQNVMBS1 z3t|V3iLBP9UKcFLrpE&JbO=Qcl1#*XeI*3hA8!{87RyCk!zNdrhE=jHDJ{*~3~o$% zi*!7;&w7*nJJaAyK)(qb5NkzIiD+uS)&dEBoBf2^1%&oR(S*3nl2wfhNGbyGD6K7| z@S^X^^T|jPY$F&^o=^L|`r*nY*&%XROLm{wh*>r%ZT}=$r!)gss^4?`h!tDe;jcQH zB5zt=+iA>kuw6BCIbBge3}zRzN=1|+f=Jc1*}#!=!HF>s2 zj2i2dzTW=ihB=8?>wZJpkX)}8Rm)S2+AT$STl@VHnX|t`JW@;(R-oN7twPXkwiqu# ztW}o3&|$4_*7jFy%~Is=+1xt)CG3{tXA>hcQYV)ZKPs(R9dy|!v3W45AO5~dMHQtu zs&+pMDjPkVx+v3rLxPXejZ(1T!|)daDwMOazK=k%_E!^2EOPGHH#lv%b)KlWf1E=( zPR3ShgFSG1jQuSc&DZ;(1(w|dD)h{dLva9@i(iZ4Z@`;^3XEHUL;cBmd~{@MMLQOwlgnC`^?C3@hvMM*P?IAcG!8Zr#L3(2?2i)!%}BFRozzsU0rj*dU|%>25JMGbDPK3vu;xaGxI>3Hyp?3lUUp1365|Ag23 zB@CBJ3lb}zN6Y!{n~7`+QxEeK>HINFuALD8VxU;LcLC*)R`kfU6Eq+R{ES=zp$MrI zhF~B*rfT!NfT->gpFxPe43|a;h~f^EFhYlr) zfM5w#yybq#CmGg5-qhu|RWYP1JSAuQj2H*kFyPPU$Q=j+fEq5#XaH|i(yxOo(VR}< zZGT62v{Ym=1OXIn%3tT4cBD8Q%#=!EFw;{uK@#l%^4s+djdKGDsJyGs;G)GL#%So9 z*qu9Ruh5chZp-ifq20Q&-s>^((|tW`4z0LKqq70Zv@}5VrO@q-W9Bc9!ISMIq+7x- zasR@t`NUdMxJN?!HH>Yatpzo=YOL5BT#yB__fuI#|He@&P3hC4d-2Nb*o~XLx8c~B zSQD5iAhvlem{tx?`9XjRQg}yJH zj{AH?$}B*f#hE`4RLyg{OvmAI-kK1AlBX0DL`J!^o69U+fZx5S)Gv)DjHc&ZE`A;CWpHnegmEfo&{QX?x8M4$ za*Ip|vD+5($@>lkzlw%H|Eg314`mqK@axyTCV7W=oNb3((%*RHV>j#XAqGT#m|Vp{Wg#K$oN~)fD|bJ%*9dTRRXlsqTqVKokpEJ6K`$T zj8786@XGrRH!~&`oXepO9KxsjiM(A-NO`!ELGnc} z8o@Z9V&B9xF--#$f|B3XaWXCCv}Fax4eMYR+>}qJ2ogDaSnziS{O|hIOzF6IrrpIB z&=52ZAH))r*!kTcVud$@m`t7XE>D9+_oEu31hQ1&IDE*wf$Z2~`gsjs21R6=zb^iQ zUBqi{II~NEnkmHI6GtQ#c4k%qZC6*o7p-^8Z}GI^H)*A!5!T+~=Fbu0g2stO;Q~V- z%lbeg`rHtk!v~B=cKpDS1Fw*Ec49vU%=CN-bOepBnm;qjd)vuvm@r$B92S#TJ>A`m z&cuL*E)V(hcq6}k@uTnE$l;!a2G<0I86WGi;>PP`bKzp%+!+QJXJ8c$$^K*#GR-V= zttNjDl&5J>kI=Rk7q9WkI||TW_iL;)#ipIE1Syhgkae}!l~wsv5eguJnR;x-$wZhD zN|hpb`3K-GbEiv5$b$k&uf$uJUlf<8h}15ZxJ@WwUfMqXY|OX3p#y3crN zIDMl4Kn6H)(e#G|V@K~^g25G|iZY!9&`}k8ZGr3#W#KSG+LBOeUl_ds-K(%Y@NAY{ z)v{C*o`vw%BTZCz&%fQAFkgBU%r*?b4dMcKJb&H(J!Ajel%l81;dBu~(&YNE02Cv@ zzfg-=cz$4z!!dK~$c0aXtG~O97nMcm1F{~fr8xrzGo}|aWWG8!XzL>vBqf!ugDqakg=#EOxGUt8I?1D#mpaFaa3e=+)1HA^+pnZ!ApYPg2@g9PqEVeZpejckCW zEiWyZ1dkr7iobXuEHKCIbs#CJ#wv}|#aaKkW?Pld`JF$P8`BIf3N`9zUmd6)u9~ER z4zdbCL&6hJ`Lql60}5hOfEP zWi4?YJg$g11^778y+eO~!rrct&A~nGq-eAg*|8TsLMso6&7T$Wa6i2H3_MDJE zCgDSt`s&D)V&(wun&cZs;De9|;}H)8`08SjRYpGbN^!KIugci@x6kDSwlz2E40e+R z3|L3t$N66ACsoUd99V^xlxR@S(V_&;M`P|INXG7_TzvLWft9j4e%@|Eo+3ai{{HHD zN^rDA6?T*{9~~Tqno2m>FrmV)vFa+AKDX$!$Mby4oRR}{9#fttv4M0tP9!o6c_N8o46qQ5X%5CAMf|Ww#=qiE>*s- z@v;U_S=4{Zq5P5K5PWA)WH1g%5K~UrCc6HdhrV2k9s zSG5!CD))4lWq!bNsF0VKWp2s3s02mD%OZb8wxe`x=FL0m_ ze_FXx3zbg=_kNZEY8&*%z>^uY_l9EUmN<}=CbGLXM|nJCk!H>E4OpDEr_AX&`KJ^c zcet=`fSu28k^;DtfE$uoBEEGF zV$;nV+&41kC0=~VWq?y;>pGGWgoskt7#{&yfr{M(2V^u*HilH6=LcE}Z$bra}YMjzKtRp2K=KKCl zY5vL2r+o)I7AsdBy9YPS6lCjCCENbcOEI<>(tGJen6yr3j!W?sB5AC?o=wg&h>pN1 z$^Kah%Ak3)3J~(56qlJZY`G(%AmF+iw9V{s@Ap&}Hb1hf0Ysseb@*^GA}W$l7vGQQ z-7@g${0)a2yeTJ&4_Hfu@(V_MqJmQz;uLw>-8XRZ?$()d+a0n;`MnN^u+qIZ(lU?|lOq|tp}4BAC>1w2$_?(1&(a@ur37QYtEwc@ zznomvWHm%VtK8QoV|z%hDc$ErEgGd;Rsb)>`hh$g=Ec`Tfww1gL#X zT_MRaKlbkTteTQsu!7wd*PE9Edm_$D`oNV?!}Oug&!%#``)U1+rpw2?cZlc6-58W) zC+4}-@sx)0hzWOuio!d-Ip&W+1|r5To*erO=VO0vM9V*orntNsRSGJRwO|}yb5v|t zcof;Eq6Q~j9TzzW8gIF^sR;{i#A(`u`TtnBGj_QuaCqK#HC^h$@D;D&BDqhHM6Na7 z?F-1WI;p;aE3y6CJboG#rn~3XdaqjI=RoGgw~WrRMlvpX z`x0%zqmLGiF>*?>0TgvZ#NIB4PP`&>GkSH~EQfXp+K3odD`Oy^h*hJm(^}zBP9||k zBvjLp50@7N`zSEP{z$Mzo6#pBiyX(R0&j$HzLOc@!oA}?oKuIe^|@^8E;zF(Jfa%U$U1iDV{Zsl-_Bs=}*(72M?7lWrJDNo1&S zg3UD(Hu1jsswJA*em^uO2cEuHt6tPmw6U(>x`|`<@!=UX$9V~}iX$P~n^ouSc%BY) zH68G3#`e+%2a*izrrY>ujd4@si5mXCzC4#$FV3&Skl^jtv?aVd@}QP1M1rDh+N43H zI^lia?lU7gufJOdmq}PyM@5SzUD<`DF2DkPXWL$eGkuo%Nax!EjeUk6zv#IfXCdmf zNrp&gG~jKiFtQ*PL1c9PUoQZ0)+8pmAyU`7*`MY_p(8WsrWO1QEAy*?Q<-b(oqPlf zn)mPCIWxl2UU{7&pD!J*_p|G|IQyGM%G5NQGVd{op`R*|J|tsqA+_=kVNuHqL>9xb zo80Dj^7=hyHhVO(X3aT@*wjUw?PrI-l4$L;qcG=H`8fvi5X~zqxV|@;sj@zrXL1fe z8SGW79a|BdpHX>OOm8$a?pG>3SaOdp$)>gZ^C(>;MX~&$ zo%cnqTmGJ_ul)`grL2_Abg`f2-DMrNqx7V9sBwVGh z@KoX_sZGvUqrzhR{u8e2A359C%#cF#|Q7X{au_CJsBgC+)sa&#C0wi399}ff@)N z5jO~Lor&+&E&eFSKb&COFPb&SJ**s{R?#tb85vQ|-||{M8EH^U@hvsc+$~_^?`>Mh zb<%15VJdEWmH+wO;gU#{c68l``R|cOsi%`2*%39n-?!7t9FW@zWOfWug_{dy8YJ^k zY(*E-x`Utvy-kl5)7Ge-<0&pWlj8laxj`QXv!E$1xVSeUn4*9Z+=q2^jR915&|v}= z4Rw#1{dU{X?YL*817Y5Y2KUJE;X#%wHO?NA|F`}Am3Xx>2-I*{)W!@()^xib8FD6 zIMLqEz(0ta#7GovoG1{k>jct|w=U_)r6G|tDWi`dPmx0B0IV{DX8uB*p2-E3hhSW? z-El%yS$I}C-g@4CH6@exKm2DZOA=QwZHZKW8-yrr*EV!TmaJC0@xWT}ZcX)eR8})Q z>l7iIrf!c|^Z4|mm`-xP*+=tJr2R->N&>@{1xR9Xx6ZrDznr7F5=K=5gNmM&oWf^n z-U4Q+@>yZ3mA&hIwuwKJg3H5Z3Ab;{QS@H_&HWEzIaB7g>e|k&Lyp-5<8p7^( z4M?z0t(NF$Td#4Kh+`%y)@tnOx1LI?FReYX&`#Aw`jzX!}fbG@lg+05k~cO_k@ z05#`_1zUSKbM|UpG5+jV%5c6}-^$O;e5v-?^CDh@IL^Zs!oHh9zly!v7xMCkyUm|* z${&fe8z~P@j5>-|Fn>1eDaTX4bPizl+MHEu<0p!FU~n{zRzIA=w6Wh@wwUCYO%zg_ zX*y2$xhb;gbDqOhhu@QYple!6)K=Yc%?3^AVRpINMVxvel%~KXX(^BSrZK=DLXSx6 z9{HPHVW4>~#i?SAa_O1XG#!}EX`k9XXF7@&+EJEkwh(_m=4D;c%vnNyPq>V;int@) zIDa&r9gVj{OTfq^q|MBQ{>PHcB+;-97S)o^|9Y4=E$`83Kr=|kpY6cGeHV9Ng z=aIK={^5lp)Nb`ptS_AtcfbG{HwbMzw)$I>GkG;aF#uTE21uQ~Z_O9{g;HIKaY@A6 zZ&Y%Ns%`G%+KnTN0RQQY{b*?uHrOxTfZ{@9^sMjI{oY0@U?gz9 z{FDVb>d-x6KEhJHODqa>6+1WIrCm-F_XEPXxHrS2zO&Jk1kM#bh0PbQROh-Eee$3d z@MR|N`1`U9&0a6Qgm@X)KR}~>73}b*zL7TxT*G=V7i{`rJ&w!9Em1a`0!VeV%OM}e z20KMkvd;9%jUoBW3(WTP3f%BRU;{Y-s~h21E$}KjGbQ4&R28Q|gCT5Y9u7P1nTBvM zSwJ!;(1js$m*kl7nN+(>2vO7YT~v$)wtzB$=;;NR|O;Y(+o+3AfX=+Fru*mSphH$I^Mm8l>9TW80i;_NI7<^su|>msz@ttS$l5Atq1=KT zr}eCqekV`pQE}1`DeN-SuQN^zqqxvW0NIQ<9Z{=iQ=D3Tv{`0YNuCPZF%A2X*;&JC zA3i*AR);I-8N2L%6o?K_ta6ojfCcqjH0LwX&SxJ**Dj*3j}-EV@D~iVRlzAnlof7y z6l9LMHck_E`aBS;Xs@}4r|DxK5$b;0OEI2no*Hug^Kz&*+mvJ9kA2>L6bgi*-k-n` zgT>o1HJJ&44qzYJtRgXNd}W7+8rpp-nh0}Hdqh)hPLnfozsaA&-2iw;+^zY(1IyWw zu5gSL>FtN!YR=<{uqeF3F9vq2Zlq{ukJRcO_m1xK~9gL_~B^;n6zg%`;A1b;WQZSVC#8h2SHlUdr~Q zr6=5T0|9OwDFNUckc7tCqF+qalOv_b7x0cKiG*ZA60YI^Hefj^nX*O2-%z_ zYm0X(N^p0XoKC8#6?c#t&WOSJb-U=IsId(_ly<>=A;iCkojrWdQ|9L?lg9CCioC6o z8**tGi{ z2WN^DPaMPtSJw11%ZU#WgQ=T#(ewkqiNA>{OnRYxhwqf`1ux}rv@kmi^MHIA+Y&Zy zp!AGYq%V7pgdEw2wr{ikN$L|27rR#GWj)Tm2ovHBv)*)oR&6&CnVMkO{VZTbn#wVy zy-sL|OaC^ej_T5_E3q%hO%>cyzt)|S_$y!U`lswdQjJdJ{tCo*VZLz}L)8VlUp5Qy z;%fe61rqpv2}kF^k_VtiAP6=!(8m)-lz^rB(X=MXC%*V=zh3hC6 z&=ruk7r%I&Y8_)_zu$lD#fJ`EB{JO@iP2w9ieUXw(rD4#SNd8oCUO}&w*6)CB)J36 z@FBg@;eo^4tKx+>cmW7WW=+iSaN$lhu#jE{#VY&Xq+|q@ktkhgX)Eg6zXYRg#!UR# zAl?HFyv?Fl!Ukzp$K)&x>?;8V7%dLu|5N-v;CcQo^ruXAT_3YgoOa@coqnRco&C^k z)}W2GK{K0-P4d2qTH}%ZP(zHPSE>^zH#vyn)zx(^-szIqW2hf9aqk`3V(`shk{sK7k%4j9V0bs?q+4Nj3&&u zalEHyM-gXqNalYO0C8vYZ0e07R1zP53;eVK0wSb!ZpFTqz;m6vN%Z9}PH7`1UI4^H zI5Ce6U7H2QhP(rNx@|`!`UWq}LrC+v;ps18$C}s)u1;!!*lW}Fb_#&9uzj}8Sx`Gy z|DT)GrJa^ilCB@We-a-i8%%9RUha~M90cW<&3~$y4|?R|-|PU+Y2P;Tw)Ajva6 zrR3du)SXxHGn2isv$W1g9j)PnE#Og*ku?r`=E{^nAgjr1W3-c*!53ymRrwd&Rz^}{ z*xG{Ont-Fi$g7202W%>`E-(PGQAt3FVita_Ao!)$@7CtuBAy4JQ{xTW!svk(DkV;J zJZ!1YO(wnfZStlA(koBM(CN9C_BQ>c8I`9ylNd}f)urA)dX9}7L^v?->jtB_!k^is zk+Z!F@qaFs)=1S(yH@U)&qm^jjUH!cSP!gAI)9|{Zs8wj9>3N)a5CunJpM#)tiFqp zUYNAqyyEKj(8SUCeNNK;CX{6+jEFHleDM37vpL+}dL~9R;BqN=;OAodg~3t^@K6Wp zzV{*@pnFa+Kig+-s-P|D2L9H_xNm`kVY}k<>!q&s(WZ;8NlKKSv#@~%q?ZvShi8W^ z79LlYyVrk1xf3QS{0J|qdfPiYh?-Y2VSCw?olzNf5LVQT#oO(~@wQlaMUKdG?ZEPBq^3w9xA{ezLQ|oKDfteV3$Ol+1f-w_{Ugu1G{j9l6XHP$pU)u^fO zE(newqD97;Skr)#V`l`y@SIwX$GBv}A|w`gLG4K%a2B8(_-DEezB^CMtsEM{|@SFx{YE=V6f3q(nF&%Zr zWfV8^vs@{SaR@1}DIQJ{%7?ip^JkA(6!|&)%DBuBUP$Cmy2 zaiKudmxc7uCa;RmZ+RMLuBCrju!~~ObM#N*p5p8_N%pg~63vR>njSaJ)i+ajcs*$6 z2e*Wdx$P;R^QW_l#s(UanOpm3PaB}9lICPi?yRt#CU;4-aSm(b;6LOlL@`Zf39f$i zdgeXf4f`_Ea5In%Ox?UQ745Clv=P@jA61rX;hR?Mt=E}L>^uvdj2- z02MuaLc(Zb7&jj;-YHFnq*Z5bMEI*7D0ARI;0>W;gWz*XrR{O-R(QOXt>Eg4|CxK0 zw7s-jliCYwOpVC|FyE<`tqGBFlv{Ro#$DWO9$Tkvf5WeJCKtU#a~LoC^}0JiTQR0k zse4mLkVK$Fgy_TJ&TtDI+O5B)%T)k9XULYqB<67whhu4PMoSBMicLu;&Fa}AVNg~M z%q?bZCaFSLV3e7fx?sKHvtx|$`Wsjclt568Rc{};mmmxTKr>7uCFX%CnU_O`ZVB)dEpBph}25l6D>vh4~0*dVCz!9@w- zEzfS_H&WFRThisVV|(sYP1Vx8%;jWl9KQf?lBiFE*W5Qc5|{AFZ+4Ue$Nf!ScMb%M zWvlhM-hM)+4LQ*lQ^Bk;zKS)95FA`ag06^Huq`no3P=wM`LS_T}+YvH5woX)Iwf{TOMYnV5d1NBBZ9Su{o#8(yasgnv2ho24Jc@)d{ez zmaXf%A@e>z%n+`g%cNE;RE^)$&1{PomiZO>uoK<1n3EkCXw)r-Zm|(JAS=wbqy%(M6v2-iU?k_eFAix zQ(thjH?MVYVXRskBQsA(WZ#m*6Kl_a_rwL(Rn=xzMW2B6UTr`08aXgzb$4el*izAc zBYOy~!q9D^l>BGsvt;bOvewGB6VC>8i?$j8u;*bxG(jG;Np#qL81k@Y?B)~&W|9bfa@;tT`Fn-i*;kE0 zI_jna25}FB9_wyN#v}Ndk;eex7SEUvyP!Mh?RT9d9Ve9`s zBkqoE?@E9}$BCj>`vdRI(y!>@t9)u|y5zJj??&lgDxqiECbvY+3yZLAZhMJ`8{hTY zxu!jL>v1y-I+r$pR@cSn0OuH3k(^1Gk5nnQg?+_-q4zsyyri zld6+VCK`V)pRyUueB9WI{oA33k`O7(t{ho4PJB;M_<>Uj1ltVT(f~a0jnT3qVi&_z zHk_m#=vG4hZ67MJG$*@c9&rX)pBer*Tsc@L!ZTb^BQ~+*H8nNOr`FCVr05O#2AJDp zDga}`5?&Yi7nDntY%?!Jjpx0B!8C1k+#c98DTAbHqXCb8gjaTUzq=&>IYZwNW$l$* z*2hr7(G!skH#6H-@>i|@n;8dSt5frsrVi0*Py;?6_%>RyW0<#7ve9ykiw~nBKEp?N zBS*V_-k>p+c`2U0S735tJ4kuIC5NVcB0Y6{&amV$>}L*l&vLze0zTPVQdW(p zjYE04L)+kRXG6nH8W+=?N}UOD8f3ND%1Kh7Nn%igCx`R#R#!B> zG2b}f+v|hU%_U|Etj(C18v^Mkb1*~eU*+=wa|P-Ltpr-pw(TjBIwFrA3-w7{JKb+l zP+cPhR^`ToFUi=`bj<}?I6ViSX+~Rwdxi#fftAi_l?b+YRUn_sKk~X~hCR^rFi)A8 zQ;ubp26rV(Iw*9^ZH>fkZcqQ%mX5I;(@MXZ>by6;8v{*N%wN`gw2Is zMd9GawSTE{H%LlL=kLi%H%=^Zz0m~%dQ5odq~@5oxL#Smko%OdpFM|mB33^l znbK#HJGs*u>1LKd6M3KJ%}=WWa&Sc>0+s`mkW_TTH$$o@!*HP}cA$A%id{Pq;wRk3 zH&=vQSl;utZkPRO5&+))ZEan(^j})o<;iz@)MdwNW(Mq{y zl+Pd#cK-IplHxQJ3Hs&Et_?BHZzW5q?|U9wc<|WN=T8_75C|=Hh~TX#$F1qSF9$)v zvIlF8DM%9X*;SUe{srR}BELhu&bzCZu$0=?W_{j!z!0v1b!Bo4N7V=HmLZs|_R8bF zm0h=uNueSQHA@{Cc{c}9(PT);Cv?>A6JYw3axA#GB&sG^a8%UPrkctV0gBTp0%Y^7 zG0xB$d$Nqxw{>r*y*YBCXegbep9lX|FO9F7!vG3cR3^rcBL~L@e8X+LmR~iXqYCI{ zG}S(cnwnF<)u4SYiqDYs!@gah@OcYVrRMz`$ny{55!!RzCQ;<@n_bF#c99V?!7z?F z0^B%`511fa+z5qv6&IS_rngz}wkcoW2N@E6*P*Iom@{M4HDJ?c0doD5@){T(uPm}N zaxA1H@iUUg8u#xrvr8vm#co`R(SoN8R0}{&IE#=1!^3;6r|5jzqaQTmhmERz;n|39mE5xmsCE z?p!`>MTHMC{A81+rdE0N^vSXWTTJmiOhGava@>UIlc1*1xL--Wx7;+%4>@r)a)Cd5&nC_pLi@_$MOu# zBp$etWZ#1g!cj!Vv$D>#z^1V>|47(hd672|KM`*BGFQ`f>1Q2f<0`4@&coj%V}A=> z#0qPkXigr%#SCZTY|@NA0XM-119C!@fJ~hKlgSykuzK3)*C^Rt*@Lo}oRy@CJJeKq zc7Nw|9WM2(eTh71Os|(Hd=ZUpT~e8MU{N5}0L9zzWOwy*c7=ur<{g=jW_}O*=DtM4 zhMPYGBOXs3KOIlv#WDd(7Wi)yRq*iH^d3f^pI1e}ZFC%+;$c15xi>%=WVcTCGsD+2 z%(7Bd4X5Z9%40_qWfF-63a(_&UI*&tytV>!I}C2=?83%~wC_r-OGH5(_%h=*y90aa zHZXZ3TR@xPr$K-g#HX=$*)>tsih^PC?4j^wP*{x6t-go)4qkep8(pe})_;Y?Wh~da zyx~X7^$t2>cb0w!@X_e#bM}Mw`?@*=Q^EluC3Quc7cnFEQbBsKD&9vte&0eST^EV} zl!7?-pPnVEwf^wKa%B6iC@_?p*+Yr(Vi!=l=^>2n9$=f#N|5UMY`P>#Fj4M*BM>5R zDo}kxOIAjtWxabNMaXrhH(ah!&tPy(@S1AfRONqCO<{eYTch~NaL;Q6)I8Sbi zy=-n|fPSPLkI{n<4(RnG3969aDB~$I^o}lU@r$4n@HyT_P4aV5Atc|XAPc^G2ttk6 zxwE+Fu~l%Hd;`4p^1s*O#aaF3n>w>$h^4V=!<=oo;M-MNzmCr6lK;$Bh+=SlHnG+( z>8DTHR^;xqFuEbC?{~tr&xmhOadbAFPi3;?FQ>qLW5;rO9Fzr|tK(hsI<6?YGPpkU_Z}=7Ykli4+36|#Qa)Yj?IY&A`l`tA$+xDCY+gueLVJYUA$M4`iD$kiWxzY%~hUJM|jnB?lV<`Dd9a6`AYzT;0_Mh3xs_i_+U~6qR z)m&}uL!_c8hD8Z@=2jD3ae$ZV{_myVx=w3IN}it$IUN-{1}(2^k$I|YjIaD;k#TY3 zYW}l+5|Y=m@*jO(VmTfxCqF?VKPO55I@6Cb7fSkXpp5?piZjhF;)L0}w6^(u!)>+d zgMEAl0wGxbyB8osMts--bILcgaB)Od`roi}|7J(xgmi;=%K=Z?7Li!Tnt2B_J|r1s z1N8`8lBNHK#I^d5f>ZkTfHgW0KT55VE3LX)WN%+-Cnpdd9*$D{59w+2T5Gn{maD*x z3Ib7sI9KTtnQ}#4l2i4S0Ff3R{+RX8Mmaatfr=9GFS^vMbXUT-3Qu+dr`=si?y>|d zYQWJ0bwmI>7m97QxOl7ob}g640z+j8IgHM^sL#v+?&}}L0$Gjx&)f~t2{k`E3;NHV zy-LIkpXbi|_x&LN=K0VD-!)dYiIul)9K_DiYKf|#Swg1X+ z(d*2B?H}I(`ONUY2i>n1fA7n$5jl+_u8HjPaUOKo-p&wo=-mN#;8oH7dy;TD+Yy<&lj(hMP_+rlSu#eiM$qu@P+E~`(8e&Z)BXEjxp4-E% zpLRL2xB%$HpQQgpaiBKqL1qrIFuCRcGVSbqzIu}9CFq@>WNE;D|5u+bf$gX<13|A3 zW^0*=cR#SCL3M#@6WuW~&&-adM*b2O7uie+iZp;s_5L>}H(>Tj``P%I544WN%5kpw z)JvdipMe0I%T)q%3lUPyjo*8Xc1yayHtgNM{ECD6Y?TUkKa%Y6X4hu4zO!JShUmKu*ss!d1uDEP=y<6R4hFX5OlPTVhm?;)m8{Is$+WJJn#G#)r9@qhW= zLlz$G+~D1=qPbDx_I7W`QQPVRPcic(;I{ zz&ah!CR&Amii^AaRf@<7@KvcQ#QKcnQ zlgn zw%rmnxcGKbe)H;3_2e+mAb>7&xx>F#XoT%6;9&3tj`f2c8iP2v(Sq%q8r>{((S6rp zXQwa+-oJ1UIT;=vJQ+0$S(@M@f&qgowNqcsqNgOFBuak~g$FG7|L;G>;TPmf50>?j UCRStM;(L&+q#~s9gHiDR0rpld8vpo`Z}no{npYNmv-VcyxYVz*QE7gc+A`ab^8DR z{D0g6d!2H`xFd{`sbU>ejaGl46|5riI|pUr!#gKxGQGQ7v(f)M;=4BdFIu{jI$iH4 zEMsCKO#0$>1E4$XjBJ<}P-jWs*KSY>RillHkNJn<*a1d<^)12b(q+Hz_3Qr=A!mXA z;U%bDqKC1;`V0IehV%ebq~-ck)S0r1O@3=blqB8Ug@W(4|C_W?^jbMJZMiB%< z!I!msX~)0vL90{a~DP0|cZLo_ikI;(7)XUSV{(Ex9>HSvlJKcnJuM>Bx^TmDU zT|ey#L2s*X>^(_>W!43)ZWF{|qZf+1&Zb%iYjF`7vea@Z^@>sNZEWcMA&8KX8=?&k`av=!Z>}4`4Zt zPdnGp@mS9I{9JG(MrxZmp?&G}ohA56AOwRu5CA+V0k4XrOy@4*{*gT#o*k9n!hT{? z_+OwFy&z9mH2BH}!9S9_0*XQ9CjOx=V-Y3p7a6J-W=(<~jRG|)%lAMTSs4#;q5!q9 z%8}1;J(e4yN6+C9`6V^d5lvNURL!!-dYas4@SUc@u47Xt@pFlSDt?a3iQJ=Hm^+bs zdFY~UyXF6If|xD^t-bc`!cKoSu|En|vsHmSfN9d64s)bwaGQO76}U_Z0GpuF!vb1& z&G`#iVO>m->Or1P12Rd2j3Yd@ZkIZlJ-F2A$?;lt>+IqoHHV};I=x>?zxuwIjP>`j zRqJS8QcMPL*N%(k{beEHE%(U zZSrH3Rl=|-+#Jq{t7L8G-6h$^;J-72f_8Hr?cW(1m5(^6<2KhY5YR8ReGIz^KCM-Z zJ01XdwZR+4(c0U&<=?uIjq*!ZUyfTOELXMZGd5pG5CXvYy+6ja+WFLS-rb*0*e^b# z?G|-RT@w0nW|1vCjE%P+t{qvw)7@WI52bz=a@iXQG$J#Y1s!1jt2R!iebH+8$;I{nM7#o=p70dnK>1 zaVdZYb`^X+DGi!=!&I9!)#Q9YPt{i)BI#p%UO3GGw!B2LjI2?C*l%1gRmK#N zwlc2823HD3LZHPduA6S!3QZyBJ;ag}C_bQfv^?rNMG@+Pd$$b(Uj5`hi~J4#neLNl zK}_K6*_PhqbBFbSa(B8gasuGRa0l5pWcw}eTA0&vywL)hL%1vP7}CU&5{AXgAW_1p z@M2iyfKEfOo!^nI(R}hWvuI9tf^>s~kpNTy&Y*hAD}Irg2KDbcgX?)M|DNCe5#28Z zKGvf4kA)Mb38Jox_#mxdv|0H$t)HLFBG7)YI@c358_|Cs07U9{(Q?D4f!UHPYN&4M z=WDCApQdnc?Z=w|getfR#HRu!kg)m{e7J45SI2y@qW?DdWQEm6KetU#9#UaBv3|b( z2j3RfB52@!KR5WaY!yBjLdNbJC#S(P1;>cxK8vu#VR;sX1+PyL0J6CbW)PUu&oerx zhg{829jDsyi-(zY_)7(}$Z#GEWc|ylbTpfdJU2zZ>F590Z4vz3O@G8WTM_{5L@=6@ z9<}1?(>$0>P_5RrRrZ6*_&z5xyxXaL=7QlQXi2%Crhm4Z45-g82LJK3+8_asCYzg5 z8E^==rhb108q*BB0fjb0_sAPrU^t@l05OU)JwR5tJ~?w&uTUgdw{+yaONwF!Ulj+1 zerY2O&SjtW4@KC+}cs1)`*)ZKVNXTh&Jw3GnIG6S89DR1=L7@gD4U-?U2?4_%q+31lh4sd`MnwKX0 z9lOIN`s|PxCCwh)K+>6~?jG27>%1>7!So;$bd#(MHh*GsN1F={ObaNaJJ)3&>u$dE z2ZuF4Na1B}BYTP6{&B{^ju@uee`)N9rxptqCRVdL#*` zYUnjpF8s{klp`hpC>45h6KDI)pO)sq%@`oW!L!h)^|Lm8#0)7IbO5l%gNGEYO!q7N zh2{BC>@ut{lKqZaRhj5+L06`jvX>z6J-CCcY~8WmlAJt~0`tPbUx~Vu!0bnKdn>bw z3wUg6>AkdWy|C@kCP7?6XE4-HahXo77z(XPJ)*FzDegS#*1`dMzABh2?d-Q{g#9a# z)a;7cXSS~EJZPTk5@r`w{dxrMPc_yz$ zwN=k^#ybjLV$r$yrOD{gs$q$BC%&^%d|q6R?XoTEOecb=shk(Kmsm^!JRnV%_-;`2 z$NaBbKza(J?e?6>O5zX=giN?S&)k^iOyAzRT^R@Yz+X(Q4;U{Y}_BdzV(jWeC;8_;i zE#FQ6IQ+U@oTht%^{n;J<8)v3DpZopSl)mSG1QV*^|3FgmLQgJ$r+ajL-0X8gsh%^ z{gyYeRs}uV&u{lgvt!Ru*qB=NE!~7sRBrYx5$Q-6`4vD<+vSDEsv!$?SN*(OO`5e+ zd(XL7d7#Yxr@A1m52-UHO}XM>E}+Dgwcns@Fk@@DkG04}rIjWIyj-U1=CMwh;T;Px zVRbjAW}kgsj@lwrx&g?Z+4azof1E2Y*0z3aMXEMDx9tK|f<_W9WtWq+y9JCN7GY=J zljFr+hMR+m17_Tyb8Z7VE)FBzlq^Sj!rz89|r3A!s`+aL|GeQ%dS&rtFu3)R@$FI z9oda}?K{-u=?sRWtB#Ct@DzO|q~7cI%HsUA2OXQ0smt`gQgSGw`NU23FXV4sEi#yI zK~jc41<%)7)_z`^K@QBu4~0$dRWB;e`RJg-)mYulEnTi8Zc;_l03kABI6c)0e4m&^ z_*qT!4-(eVDX+xFlS~n-C8!$2bB<5vkx~f0zqITRyvU!OzVS@P{;^#$3=pE^`{l?J z_B&!nUy=VtolEp?3)DzGE}D#p%f3SJVw}IOxTLDEs+HF*EX}(kA+}IHpS*6L1VOAf z;H>U8SUB;FKY$HK8UPz&d^}M0VltGgC<33O{pCLcq82*nGa=?!B~}jRh@O#T_G>B! z0!E*^N^U_Yfed}@?|ePXS5}ciqDUUx-7QYJ8{fllm3L9tl#$(tId}IDZZE?dIcp0~ zDMKFg-qqkR=4`eGi3@^oC;|>`-5T^F|D@O&q2OzG8FAz-Yq8S)%MV=l$x-xmInl~1 zFyAnw7qln)B*e%Hy*PSWvd~oOC|?6=omGA*H>C!Q4n3A5(>k*|5F)$l`TXu=s?vOw z{_{aGDetKh7X3%v|7(d42!L%24;_O15WF`y#Kg!-Ck!d^dNssP6q8@s8JHr7_chtM zOP3IK#5C^cNN>qQ1t}1O-6Z+^*!p&)e+C1n@WImv)W7nbdS=j=_p&DKimZ*@Udlx% zMt*P2Qyh1D+pLRz4GR9f&{Q#$DPbT43IHSScPst|ZMw~DDb^&X(`${;QQ$#7u_dre z-P@t^FrM2cXp5i{wMWJq!7_1-=<3%n&}RALrw`N}UK>wZ+DujWyq=^}hN$S!)KVrR zCYzr-OdJL+Xr$xWWytSKx3f_&-e~zz&VD|TXDL?$jIz(c#X15Mm_8;4D3nsE9(E+x zOy=T37JNbLcWdtr;p{~svvMLK{#RpfK2OcN(vJj(q*|30N5(n3{s|4EzcjboCfPmk z1VsW>PMch91D<2(5_2AO01OsPVpZ942Ap~6 zq!=KS1roMjTr_&qyx-N;@cvtOuTl;Arb^oLO{=s~j+3x}JPuotf4FD4zmz>LkfF5dd#%X<&R zC3XPNAE>bE*~#ImH$%S$tBN6n68lFLhJ=#>wOj$_gw-bZv@%^>O>u8iZ6D(QVg_Y3 zge|Y?I_0XXYWOy1A2g^9*U7#^FeK#vD4Lh^W7*2N^D?dnGbD(Qu?Oo$iR8Nq8MRL) zPl+F#SwJaP3jc*DA8-#B+^W~4mNu$yc6^Jg>Xbza*uAT&d{$$J=hwGY8jxNo;|s$~ z&~&`ZAWL@Kos(c-1$Gj3cT*xw^q>rfA+0t#!!~Lk{6tKXjq|` z`35@gi}6=G%(9ICC4GCc$hvK(5XlVR{kuVY^_c)eLbtq94vBkip`QJ$7U-wl6rwxw zCe^ZZ8?|*CUh&A`ud%?_x2kD5kNiyC^xFkNj|5}4>5^^O|L6$@$a45FuRmYAswT}c z63!lgd```pW*~im>VNHH)3CWKeGyEkWuP|B*H*@hD>bHY!E}5Hhx?-&F6T2@jN*ns zR%`;B)S=oHLd%J?_nuoh{MlFT4Csm<@RrK=c!pa^x~!xzv(ym5qdyJNJfa4QUN*1< zTiRQXXkLPp^rb>l=!yU?YW>rv>yPMf12zpxR?<8*C-c%Pu~^+N+M<{ycOlPa_w~H~ z*H!r?-hW@z{0cxV8q6yxr@B@g!I?`L#rG*kSy)m<8-{G#0^inkdL6as*gj*5YDoaJD5_PDyL6;IEb)wCNbJ(f*bA-SDsfk* zvG-6+2}L=@?>eG_tg+3Jv={Z0GoCS40??ABQVFYyTaBZWW>lz)pLv$Q{DZQ{$65t~ z@4>~Cy_)CmOzwuXpDW*0q!9nOT0Z+7rIfIGnp3{h)jHv*%{2+<>eoS=yk+wVI z?X+kSj574(s`J$c)&kB#gN)eyJG$SW#STA>r4XfUG*KDNPW;-+H+)}6(xkMN&9ife zA7tn2WKP|*nMS?d=Ja3@0RUA|QLn)dFqMt{%r4&*hAM@**uQ!UpW@p|Q%}gGJ@LcN zAOu}j86VYJM2L5sx-NL-AQciI1n*vqvy422#-!{fr!mDj<+k~Cvjz`YBv|?mJl3vw zm()EwJC97t&Ch>$Cx*kw=yx?#$2Z4bP*j}#7VY{%gbGVy&!82}bDE8H9rPsmhaQTD z2XC#sK0(9k*JM!?pJ+nQ)PV;dGd``h3td3d!-F0+K{;;0fym};vVEg!nd z{o*-`OOy3PQD}_Xh-wYuB<<}iYSFuHmulUIhaPNsxr1$vwVB6}7sc`8K2cy>*v2L1BWfNAB1{QFu^*s34b)dL{d+DgB>INcdH{y<(-^=Cr zYufN#-K2|-oL@1jypm6gnr6YI&#eDQ-zL)?Gg?$e46?VF;=eZZNnoljH0i6pZGHjM zL{1Q!&ohBNIVjwWr_lPhO%A3%-+-`{_tPo&j?>#F+VMPS;Fp8w(iR096Wf$ z)F5%9dM0afw)`HgL=3vEDtNB6Po?RBGN@eg%l)rvnLHn10s2YC?695!L z5$I>-)H{$u4YgzpV_Q?Vw;YbHWqDl&DMHfYQHlfNG<#Bm1fdh7Hok_H+2lI*IzpAm z46sLW%88#%r?jH}1o$YAg}14e0K0T?6ut8e#+`IL898Iq4M=U!m@5cD z6eS-uLu#*smJ3W?kGTiaGUkZxn;6ee}_aoqleVQg?rY=S{daNEHVnWHsbe$Wo5Vva&PMB<+EDST&f4uFcs@JHrn*k7oA z_Q5Xx1V+e@Jc=|}(J1X-j0NhVDSo5=lB527iSuQkkE;r{d4XDI2AfQ^RNjG2PRB*t zDJ9vK`MMCv$20mzf>1&7sax>6Cd0M9fJ4lMKoznd8yl#wec&PR5a@oC1Z#lKM5J;w zRh@meWIB)Qdo)E|xSw5Nv-dS|LFK6Tg1$ay9BoU%xX8bC+Z}9J{>b)sc-OF&yAZI{ z{0<+?|6STdldV#oS?owA3|sKBCi(Q|tlc7U{UlGeWzk~yKdTDQZR5rL#C~pq1oeo} zw$mK4;O$s2YKQi#n`6g_*&3Y|2fR z7tTwg$Cw3vG5AsbN#hHg-@` z-0sTds(;~Ry>#&|I_05lndaxzc9-OyC9X7>AJ|r!t&{$2jgi%qi=e1oU5D>yW{UuJ zR^{Cn?MU7Lw4fkjrqRWq`2oUo=avD?Sai-IA%$OX-?Q}Q6qQY3X zbzKTS_r9kYB|d6|qd=?!fKxLb$z29iFdO&n`n>mQoohlhs9>J5wK`6i+I5e_Nsqr) zBED%zqHJTiSD1~iqwZ!bnlrP!UP7X5-AcI8v_f1}#h`{9VCaNEM^Z5L`5k35^*O6s zh2NFyy*JAy*CdE*7~o^Rc}=~V?|Tbq3)vktb!e8@&U}{>KXrfmHkyPA!-9IWbYJ=m z964~&GvQeHqISaE zdvVjOP%ofJX{&J2s{%QUiMbL2u^G20&HTN+8s8tBWB@BcL?@~5(@ERp_o=r#{-HQ| z#yxXX-A`M^RR`O&@;Lc`qz`ks@%t<;@4R$J&K6YYg$*9R0CxWoKA|X=Sg>`R$nfC) zhyiUoua|AZzp;A>{OMd61}J~Fu?;*$fM?%Yx=BgUeg7C%VLbs|+_!-SbDtYuc_3Mm zuqIY>D3%l?Ee(I3+f^bo6~*RHdS+uJG*xC?Y%)GHBoaFoH2shw%%#v8*M{ocy&cC$ zU(bHMMl@$Ig!Bk#|r|=nfdrwnAkW9#m&_3lhARf_3@J|@T?9gJ~l<}2y^@V*FYO)8VPd#ttE_f=9g7ZLpI zBZ7v($VDW9i8ojc?Vhw4+M5E!8tG&EcHiTiM|KZ?R}YL4pkr1YOfo~y>9chSk4ucd zeVH8D%I&|u*9OAXv3O6$XWk9I1>q=LtGsljp0=uXh4RdMgEu%DbGgF>H`irS`aheV--oJa``bjO zn3}Au9wu8c;Y*uAd}$N%90j%v*9{iVGy2(IKgMhabJe(<8sLgRM%^S_y@*a&Wdpmn zoi_~)I&Gs#D%^W>tJhomV)&(>lu|!NThx)0qTl$5-?yLe2>7n9({-~dOZrQk$Z`ci z97XEvYm0KDtYJoDlU2pxnwn@)n z_4F%Pt7?Fe-?EEmIWOo`tcg9~fe@GyP;O;zU%DJ8>`Cs%nueR+L`0sMkOjrHA$!^a zY&QBCHSIw*=Og4GJ#8T~-5ujSxOJ1Ln}J$Lisk53Mkq31CPma2W`+ap2I_a1az6CEw^Z0+W z&Vi4)zwD#VmS+ev2GL9m>I)5fUz&11DbYx>?**=Dl2v}`AYDj5(v3I_x}T9?lEF7% z*f97&P(Dlqp13w%s=Ou0)qnI!jwhnfEFLwcSnkwrOYfyp5S|LhXq}?S-It|Fh ze&(cAQ6Yidw=19oLOfZI64qLx&WCbpmqb#Jt~#mF@I5uUI{iM>Oa~Snvg@8N7v}Z zidh@2mid{Ef(u_aH*;0FIO@7=87@apx&OayF@X(Op>Bl$N|J5;4#d@~B5Wb3Ic*pk z)NHlNHZ?Loa2A1zIJt8KoyLt|c-sa}mA9yLVDIX{!bx+K=`Z><2V)kajLu8d)u+$V zxp1-6)0at7EMrd%PP42IICFj-cYMo!=(@S_3+=y@7ho~s-B_UNrCGT5Lm>KLQR(os zsNfgFUF$fr|LXI`)%HUzn&$YXdBHP@yno*)i$fNf;d-aT+DE06$lpOaC&4EN`L!78 z%TAbbt|~v{F=t)oo%&p(Tk6!rt}+|RVe;N;NfKRQ6a~NBJ~xanZ2jX%6Rd1ymqF(p z!S`=W8QT74bN&>NJ1JIs^t&UMOy~Omt@A5=vBU}VY694ACNJ@=do5Au9C1Z$;B~n^ z`2+jlsBgh*13&V81XI@eNA5yBOdL+8wyt=vR~1fs-G1O4>!^lKR!vjmNnL|_&sfDu zVIng{YB){LkzE-gQDSYSN`u<=bBhUm!9uX05*2>#Z@g&b_MeHFhYhH_zJ#5WN_lVaieL2MyJinakxArt|7FywS1vss)bo;WGoatT*c9_Jh5_+J^eGs+yL7E=pWWHNO6yM~iAGDgwV6eBy&F=XsZ1K-iE ziy!?hT&ydsHFS5ZjNlgbr5x1i@cCy@#fooi+!gQqzmH%At!O=*kIpowI83Ye?3pvd zZ;kH{X>yv*#j;nc>cou=JEOL8+@&Vo71^zu?))6hk(Bq=8*l|1-R+4+4oQp|WQ%_2%%QN^j0?OPs-C#~J+x7f&(HU)65>@fECM&$bMe#Sqy zP}4$*8>d0b(PJq71pWZo3Vnxp#;WdK-aXGCAsDU=kRJ`66`alC+SWtT&N7J;&}?0s zmT*2l*TS+n+iZE8N-M7(^W+@IKXx;YwT%@+Grk^RB5v_e-KR6N%`XOxi9+NBEJZ!~ zEcInb!ZBKprCty1C|9Ew^?!U2XU)P0{8%~5Xi{fqF(8m`^3+?np?0W#{XduUFaxl< zUqUNpOXjDEZ^s1z{j!h!#!Feqeoyr+EC&1J?KF%eY$JmIZ3|afa;CnY!}7w%vMDb4 z+YlaM`?GW!LwBtFj6q~>&_p{%1|n?BoxRt&YB-Y8cGLP92e~UARqgZ<0`C&FTFHS) z9qh*OMn9ELq_4!x9+Bpu8~j;VY2mdv^K>I4AEjk-&?sxt_&y1PmXPt`r|!g1Yyr=p zfhu}O^+>HXW5>A0eVsjSnv{nnfgAxA(GoEw_lc`n#*VV@Y<}(pyM~Ek&i*M# zX;Jh^1|v&d({L&yL=;cSy)MgcGLA7xSR|AlEDsn4>4by*3k7$A7KDxEm;R=FTo5i^ zICfu-#>_6NXM?*X4OtJpoo+MUS+51h@EL7j4Xbk0Ed=F+j#ENxQ$^dhFVqAW{qTzy zz#8OIcV%$)INIIJTBz;%Y`O?_c+}QZdU2ic4Z_i7TT{i457sVXe}fUH`oV8W!j>t) zp@nBRrd}^S>$G)oN-4OziawC9QLCi$xX@X~CA9yOs{j^KGGc+|I>yV1JO#=t;DUjd z1?Cj%nQi&i5m$ej*et!rCezt`gy>xX$k;1>LkL^))EBA`9kV6DZ1nteZ*S`->%y71onl>Y<;H5NjG$G)M5|gi zalqO$+`)B&kox|RVDsSTbs5gttY0O&yUtRgtOlTPCK6K+(?iC>@c!-R4f?lU1*~qe zUjDP*kBGy}#U1N|dBeSN)dvSoHyPhb>8i-=IztcMV@IjA z=bZvc0ne5%vDKyrype%Y2VtcxL(azK%L6)obF1uo&~5zQK{6x0G`DIua*WKtSTo3F$cCo-!V zpDDD$bjGqrl)WN`9xY9#u14hzcNVvArx456WRbW_%?X?w^xxK{ZSMu27`o#4sku!3 z;c4y7jBNoor3E&L@fGw?N}|X62KHtX9o6MTd!57y zVsJ1=!8;<%1iAKSPVA_vpG=odv>RuVQ3k7aI&V|DdIEj8qhP{zN^{)lTR4Z@(pt7M zx@+oee5m4QF>dh+cyT$)T2WrDb0m+rmB6ez&I#-K_CV@|+isCgFsJQgFX3FE)D<}P z=F~&>>3f>-gtBjiMSryn_bde1aKWw?6@xVC7j5&8JarKEpA=h|wo!s|Wu0GuKfx6R zT!$;;Ln#~_`N!M4d$2ro3&6Lv!(J@bo~~x!$^SX;)Or)xyBEEB7U2Lre!2{Fe{gR) zff#`6Y6sxv#I=%0Piq{IPTyAH!n^e^DLy7dMs&$5y;%IPBzY~3`rH=o0$w87`27Cc#Jsod z_+~|N&!u-k8!?NWpqTI@CMU;DwH_FYhT;Gf%o(=CeQuam@C84T zQ8Ulix&p*u*MACOjG*9xOSxosj$d#N4PZkQ6&S?_Ya2=#JCGCCYn}9Xzn^JW-I#H{ z@m(lIS=nRGFeYj7cn;hyB>iJR4LTS*<_acH{w+2mDgHX*8*y|2ms_5Dv8EP|dxB>R z8GDaM0fxk0y7Te805G~XwP?oD+Mn5+bHbGO>hfgVHUeBzO}HvU;mr3(?k__6d&obX z0#JVVqOyvr3Ur(YQ^>zqQ+s+tcQ=_v2J3Q%#$I8Y>Un^x#2=}g^gk!QyCW(_3=j+N zUv7^ZTvfpFefX5P(w-!sB@nGBL(ce+9o$JA)`6+rUG))O^%}VkCy#>_Amuscx!ZyR z2tPeX8p3bsIH>7VYbEa1LSq_MwNqvs(OPQ*S?pi5RQT)52&S*B>y?-7yqQP;c-^rs zW131|Z`-LRs1nn2);Eg@DiRR)(gCfV{ABNhp9*xwx2l4-0}7SA8oegjN{t0B^pW}E zv^!B^U=PC!*X=R>9UUVT^crQB#i&_zVArmG<}k*A8L_D!%=;6&`o271@dr<-_!)j> z` z?f~Z8Wf9CX=n1&XNG%Z9d^c$(Tff}}98~aEgw{cKsA(p6dv=%L(FS{hUK`*7oyQ4u zt-k)d@5Elc)t16C5`nAb;V_luXj59nCLbs35d`i9l3QB?jk^2`obtA6p=rSdlOub1 z{fvFfVD~zj$uB{Fcfe1GFT{T{Aei8(FDQ)?lK-X zfb$f4Tuuxbdvobr|67VVT*3`KE5PNffby!HHNTmnD%^&PI(k)VKdx#nKiFeAAK_zy zJ}}wx?#wk6A6iK)E?j$|QK1P2ufBjaeuah{XwgW=M(CaNzgyWzHMlF|bX-dc<2HyDARiv_5&U>v$8S(`iZ3Kio=SkpqN)X|MwY$_;#rJ)G z4133h0XGNrcB;MW*WPk8K7jQy`Sc@s`L}KVrSGTg$m7QJ))bEmJ2Z>iE75UX#FBi~-kp2oP^D08ij8%hK+N2)$gLgv zk{gVyP+WJ~fKOXjQ$jikF1mr=G{J&g#e~PW)*SsWThc2GI%Xj~$XxLfKU!hir9#QD zU_w6e>u(yz1y7}($~ZVDg_9X=ytvAt;5DJ@DC{zv)3f4re>}KH$ejc6xiqPr-1{$_AVFOVFmru=b&` zb#=Gdp390ARciMf(jOO|+kDV5%{^k4?N1nPz2BqoxGumyxbL?X70T(KKL>)r;mp)# zTxX@Ln-oC+jEbW2-p+{D)V#xvlEow#NmA(a&fYfN`|zg+(>T%VKE}zuE}ZK)^8UWK zsa|P(b0ID^87n105`KW%Wd|Em#`(*Rc>#-o*{q=181!ktC2-(HwW>{+v`L@%g=u|` z$iVT6U+qz*8Dw`G=CxeZLEY?D8PknUyMWW6&ZKBnC*wNF7vt~P-Jp6|@jw%T6&T6Q zrUqHCK;+(w<@Zw-^=|pD=bTC88R@CwOD;(z=(X=)V;`}2oTL|TlDWpen^)Po_mwx6 ztq|-?6dA*ckmddSy1Ub`>i# z%}*>brG(fS#GgQdtRl@>F%h7y|InR@d7$}{mv;e5Wryeg{zUFsf)gu#T`jkr znD~?WCK|~6bFkw|A9fD$;upsd34dEbA{*4a(s<3BBd8vF{Qm}c z!C)9_FVzB1>v@T+fKeh%hHI>gko^Yk&_WnQTfkyu|NTC$C2a?%^$GTiW;mqi`#2Ig z!Dh-E9 z-RjUZ{hgVl!z9(CQeim*aQ$1|0W}^+(>4-{9aTI4JKC(pjo?&axx^)?5LxX|#%_<8 zblvW75g+`N;9TJIa%srRy2Ceq`ujemYb3o94dVt@Fmcxw9-Z3z*H&9>#DG;_y0Wp^ zcJAgEach)Q_8@YVt>-XWWAN{jw6FARjQYxgA(r*gZx~i$-Y~k|Zp|MDvrk%-tT5!*Q(7pGScYMK3Fv=Cp zc^8B?ipPtW9;-MDp2l@27O9L7sE@Cq6WmWCW;@k!MYz5t;&WQ%e8!czg6#^!^J`Go zc-Sl2qzMjtYx|t_H%8L?Jm4g)RCz=doDv8TdB<~%YZNTZn1lG~hcE3~ZaU!B`SOhQ zGU*qen)(GwWER$WOvH6vqvLT|5k9j2;}e)92GTy$t(q>(#}QtzvJo8~W0b7k`lDoW zZl-=Q7%(yKrBc|uvuGbQB@?^CKgl(C;Kec}$NIk-9~jE0*xmNUIqpN9Veyb^AKB!=s|$)Y;OJzTs3Ij^Odt zOn7D_XzvS-YM9}^3B#kTn6=G-gHBH&Yq^>=ftriHX+(Rwe!|6-i^tv^DJe*d%4?R6 zVUf6}`z%phQEv!INC+eEv0RTdr*umDmL>DM#F>L%zu278nu-!>txrW%9{xsdkVQ2O z8JgHg(}@;KsjHk?I#BxI>RdS~>0#T8*xfnzSWNejfu=>9()A)?s2vgmx?asIX+c#sGOl%Zri*F7=0s)rT<&6 zH(t+7${;LVwh$vpwi_mrhCspCKZw9CYhpEOISIYqQXWJ>K300;U95=d{Ivxm+oNB*53oxr!dd+ORLQ->Y0KK|1-W0BG>>F;> zdj#|X{eMr0XjB!_Ro{$LIsW>#|l~OE%&x*Q^4{F_a1l^Jd?wPBwt( z2MEjS8>6Uvx1bG$ruuI{C!u32qNCd5hO?l{jpTV%K`Ch!(M+b z18lMbi4>|$3p8@fUA>Mb|5}YE!mGW4Z?y0)7*2>MR@F$^q8$bwhKF}F+8G~sY6bj( zMc+Ri)A%j3u=K{WWJ>q$-#*~?@wfRIKGposiz576_EM}lgU^BpXHB%;b=A#;I2lHRU_HoqVKaACm>7Ub0W?;=X&iq^4mZ0%7yGX*W z07Lh5T7k!uh=Hmw3PgTdA^_GL6Z-u{kLj-`gqF_y9Z#qU0E11^%FE%$)RT$+{Ji~7v zr9V;qojnyBbn}xrP;l@PO5Eal*N`7$HE6q57k56}n)(`^I(TT6U;64lz0#|nxa}Xd z5o>)qQR?yW`yhj4q`=rddsO4}YmlM(sNGx$pXUziD^!93H{ z!2i}&isa~7ZTTPW=ai17RmGTlxRd?80Uqsr3XjA@fTJ%!KZ-ge%YO^_Y#hG3 zp-X$nbSg1oM&zEEw>{Mq4ZYZZ*;quGQXY^)BiGE=xLzV{F(T1^JWk6}&cUE=t#f^C zhT}LK;UtZQk+86A=X;GuQan%G`+&Lowms4r2jef9jVy~k^pAel3>!Vw{QvseZj_DTQN(y;kia=x*a4^ykatOQ>nk{ z;MyP*cPB+RBmqh)DyoDhFuxH4nq+54m=ZVbYULB(LuSxVlte`T4ID&rsRSJg_MgZ( zFeYn=1={%g9Z~=(68wE*d+N;eFRq2$@~Z4=&nfKJ3?RJ*L`XRUu1EFxW%G)IH^AU% zSPLKZ00;xV#5~?;Z@uXFut3e9K&B`tFOuFp!dQJb zy{82DG`&k`VzOU7$~P|uWJ3(jO!{mElgU94Q5-dSLHCzM!1UP)37M|H7bWMeEg+fn zX^v_h*`^_8ekVRRlZRhY{2a!?D1DQq@@w6lXDFKgh&lvwN=$3+4?JILPi0SQHXiSd zesrTnK0nt77QiR^V}?)<7t}AKFGE5)va0lvUWhS)-k?CjNUH-Q0vj&l0J(lEsuhgz zcX_p>c{SyM#1npbvMlh_xJ z6Z=PnNE*AcZ)(5P$C)^?DCb8X(imy-gw_xIk2lBdgF9(&Ou`LrgPF+7e~^~$RWczv zz3nOUksO=;MU3IZHpOv`&5gy4#OhVQ;?nD~ucKH>rjn8`0ha%NMvoh}pE`kj#S&|| zLZXO^_2reWzO)U1twc`c7Mh-ucO-DFdla!o7PCI{vdCvWr)G=Zx8@xA3jg3*0m72} z!d)Ox@rzb&;v~f3_h25KJpj;b*E6rihgwV7LI|m-Xq7~2iGW#UC=oEAx6A-A^Sk?% zarJhvrG4J^KnJU`&mmGo)tR3yw~>5bZBHeXkQF^u_)@ZTU1pf~xrIt+>8jL?$S`%K zExC|l7H3{fk;`ny@D-o!I*14Cr~HlR&e>Y*2A@yHEx_YqtRW1l_QV@e%ElwMlog2t zes8g11^;iD#7WbfLDRoZtX(}S_UC=TFEY7FX}GYFsvjLwuN7E1FWQOZ zDC1SLy~mO>TM!;2S$DP&z6UG!$Ss*#B6w8Of$5X{DxHoE7v$MLZk=Y~wu1M_kcN4< z6--}k3CpE|aq0(hK^m7%(IeYWa0l3sqKa%zjh=m?Japu&Zrm4?{}vaoM2w^WE`C)+ zEEbElzP^$PxshL4%W>?Z-XS4$o!{Kj*>q50feElwHRRxD5gy#wXNu35IMr;faHgnO z=kId<`+^9&2{Cvbm*dQ<+7!#5NIOIrA}-eBXygjH3L5@%KBbWZq!rLfIgW6QOfj4o zuA&GbYU|d2@tiCDL|IItusHc>BCYB9$(KsW)V|lDnt|UYp;NM!*%qxwhyDEj}f=yL~$#t+A1)pp^X*UMw9?5WSLC)mP85=rXb< zvDG}TVPj4ZMACB7JW*X5UcGlp64CaOd6-8XXMf)GtAE*xz(fvQ?gD6od2LityY@~* zFJ$lu?h4*SUdC{n3SZgB-|3Q9AN9j%YOWq45aftAzvANu?v+fD4M_P1m9fn5y-c`E zGgGxX9K;s)fqw93MzsZJS{czM6nIWCxYBmRH0B-MSxxA*-Rr<>0dd4@@Pb*%-+12) z3AK$(p(})*0dHy#QjU!qN?#Gex76EAl7Q~1GC{bg) zufS6iKKL8d-Mv8rY?;ns65$DLWB6Y`$zktTMV9V=U6v{6Q=;=Td0xdNN#q<3gxmM6 z8+PyMA!O-*@C97_7jzb0b2X^E;ovQP-}?Tc zZ_Xpe7D@I}FT;F}U9Hxk493&&XOZeVsl&$obAWFzjE-VF2Mq2Mavb%f5xFb}wz<&5 zp4kN^Hjpr5!lUQ)xtKJtLo(d63@NzRE3Xxh)xnO|I!c{llIc67y4IRu$8kr3zJ-Az z?)Q9&Tt#wmUM1_5=Ky8mt3PXRSXpw;6}NjWH8m}wtZeTw;5ctNMf;h(}9>A&vn z-zR2zDv_QiIUA)wa&pDz8;;}1Fr&kscAJP!f3{NuQL+pw4Z9gauV%aTcg4=JuU$P1 zSF@1ZqQfVDUrKvp-<*QeNf^z@ff3e^R_TO z*=)Oi6Ys0utDnG%sQIqrDr9n}3d|DM`j>pod>e-)8yEB2EuB4R6H>Gm< zX67)-+MwfYMD{kLYtkp;!M#|)zvJ9YL1DTN(d+zzW1fyNg#Bin5R$dDK6<9YhJd!K z!Ejo^z(2o|{_xx-eNlqp6Zj*$TRL97!2dr0B)SAZlOo6U43?Ei@{M%^b*T7tRI8iPW_AA4SYOLVDh}<17A!&KNJ_T-~ zk8f(@YM6>Ln*wYve$sLZe_oJK+KmII#Sm?@ZOW>x2Uq`b5#iGOy%z)kh=)>ps!-QhPvHe9`Ifp=#*WT*3Zc3aWD-ahjqkV{Y2ZmaQ$fZA! zy~KT6){PmMYj88+0^Bt?ZeJ8)?t$7X6|Q6gA~X*hHA4p1tpcvyy7kq=zeX4&5np#% zoCG>vwY~2BX}?ma`=0R5V_RNUqKpSP6g$07umarsv}6)PdkV;owr(HTPRt$nX(|Sx zdJ(5i>dF)Zn>7|AS}$fk3{S@V+NP3z%By1Djtq`6w zBqDS32N_eoNc;Y>^wga7n<0W0(8_uF@|0AuGCHV3M=ocBYS+8^21G!Wu7Udd*&U`t zjqJYxxgCb{x$2c^GZll`nuJ{E!gZbZ2lNh0@2%O?OmIr&SRk(5vxP*d+A4iMFnNhf zpj5HYOC(_UqyifXUnK~bgx#XwW_dK|5;J1~QMUTM9pQj#1Xe%-L6UekBXzJltc*Z6 zjbDv;Gk^64i}2(1CiK0kqyzyb$tMaTYgcngL#*p~fUiG$VSt&}!@im&^`P=vt@#F` zkGCbqVB~tGd_h!FVme99WD#v<^|JAb`GM%bkaS`S#_SKb0%XJ*mu}*U)$nk&mw0a+ z0CGyCX5RhPz7?APR-}84fm36d0{HEp@x}0#*H5KU4~~+3ncE2tbEk)ZXh=4b2xQ3+SH zzVF~I5@`O~72sM?=G8tj5s~^ge2<0zto_r74y!SD1tKD+wZwCmUR)+rwaaMHmchX) z;bAHG1*^7LVKifpcPjatU#WJb_nNQt&-<4CB`_9NI_O0lzQ6dC)e@SA$}I)OPWyD8kXf!~m-Lsfa#N#+#7;P^nE+)Bzr_8C0p;`o1F zQv3NiYHkdOo>U(W#YUE9r77?&n+qWU(uLQwR42bmUjURH$G@AqtmEb;*=5~@RS?`58Wc+p3_#@Y z(wayJ%I4ca++WEu;jl*lnsMRs$s`q#GFrF!+>%U%2I63m-dE$aDa@%)< z`1(0MekBA!KuuEcvAW5ZeO9S~(!KYo(L3TP7%)K1%%8CcleF0nC`~L64#&H3@0cpd z4mb-`%_BX`C=7$l-I+#z6$mIMuW1?vsqVFN{&EwejUJ7V>w16_B?;T62_~isH*o{h z?x)@0sHvGTou}*|(4pA=z2Y?yOqRCPlH-=jPtuyER~a|PicBzo(`(jgp4BlW8C}}X zN`~u-z@wc|I19CLbe)GXFWG-&*_(eG3kMLm%~*8j$Us$Il35}VX^HZJZ|?&d0Od^m z{YRAhu5;;$c8gy#sf`{Am1s4k;bMWAb-2c}DoeSUI$^9U2q!P$FeRLM@c5;i5aBSX zKdss_94J|^965QtgsITJ@>0OKJ_3}8`lCf80F0MntrgM+pL`D$u4 zD**I+={P}fKzcb=Dfo*X+}92|aMSp*%|9f+8(eU2EdsoLy5aHT#Yfgwh)lR)Ja4$d zKNrJ>?iFLBQf4_crp2mHBz*jKP657Baj-wCNqIxq8HezWuY-?+c3BKnVWxnw@F^DS z512I@z!+v+U{AWU|7&9#4iRFV918VD+lkaggcK(7YY249b`Am!eb=Z*3ok*=>ETyr zMD+W};FTC^#}U!7UtLqzm?Gvjg&&Hr4MX&#O6_|F|I*Axt>leYM?I2;;kIr}{>6&U zf$ZJ=m-4@JP_el)=ka`0?yE{&h@rXRruZpj_D6z?yE-d$h521MP|{nw1^kFgq& z!_4KI!qQ77z%gZ%8xQhY(dduN;`uA_v#4h$r~NMyyF2 ztEo-|Jjpp7@6unPK}Szvp}|dQ)vgrKA7Qp-mK7v>tv`Y2 z?C}-Ept1`FLYR+4>onT6+? zQsPB=V|~Hhj>NI0tt3OY<=+5EmI?#I({O{yV`w5LKg?SHLYV#q)6`%5Vm1#;cXa(>8MXE$p9)p8RKNCy)Rl&3X1Kw__4@Cu@@Q8(pms%HDgDj=3-~U(VerGHkY}zuX#Fdy zh64X>`-7me6i5!fmH6oEst$PwUM6qvb&F+_(O_vu?c_4r2_3+nzq)DN9>SAuhGXdN z{H}(!aMcDUoc!MKn2$i95xeB0uWyGZuIw%(-*-?GPF)0Q;hRu$h>NYhJ+)IIY-*DH zEpzN@6+$_oi)ga88uv7U{5f+CFXS;hRQ0gObe+pET*FtdN+EP%{>~K;QD5>E<@+W( z#%fH1Kd91I^>Od|Iklaf&($V|q(ncLSX=!6q0|WvhI;KWk!M!3pHdTkwKid7HVxxj z!Mnww7|5Mr%p|!&gQ^XO;#c6;XQcNGI}%R(P_kjK62qa!dInkBYvU@v zp{=J3fIX1^Gr7#?*s8_(nSX`sx$*18keWeD%mI{jwLQ$>N@ZzjgkrgZ7|340wK$+N zs_sCbj*9w#v|0Aj%u+{-vhj`ZDem;q?xW?iBPA6S0o4&H?4^xu&s_6uW?2g3)j=Vu zv^u(B2fYB}QpB(kd;gR9GwPC(J#a#eds-W`Xj;k2C=gf%GykyA4MD3bOlL$xDmv?t|8me>a>x|9>_Ca%aJ@9lCYg7^P;)KSZ^L=-3Dislf?w68~xK`!Cl~xBnyi>QN_3 zSUf_6JUi@tv}i7T_M;1L3pMQ6el57xpr~B&DU#O;(;I4MNq6Qdo|t|*!32EXo_q_m zdC-Ttwh!lQY<0<^-Bjwmjt2YwC*+0CIOx*7_6Noq1^y37jckBPSG_lUT86XUkR<=yP8H2=}I}=n#vm6&>D{>y@v)2<~dag_QG=S<3zY_+kL_ zUrb-;sG$#!b!UK{7UrQz!->}^m+GCl_`K7)LVS< z#Mav!ZsdqGf0eY2_2a;*oQB&30+oy+1w{i|wMBH))a_ySg=VvFjv4^UG#ddliJlQ0 zm=7JZO8!h=>R>ypg1WJ~y6+r)zy6*@K?0j)Y>Y{GJldM<=yR>?LbKR=A;f1&ujC&l>Na|r2-eq#siRz!aU_#R%E_tGHBmhq)$qHoI~J7< z0}bM{R<{mJop>kd1Rx!mzyY(rb0;c(`;Ho^-@phb(U!G3fC~?(&be;dq8TKIhN6AP zHbSB_46`lKdGG|VM29Y^Uj*rb#UzU1zSMwu4SP2`esh*?SQ4w`3_hg~_q@u|9cOO_@$!R)7sT@{XSaUqv^6EbVGPn+G8q7j6Y=!zIG%p-{F7wYn zHtLHlG`O-rF`wy`)kUyI8OCGcTv@ygATand$MR7txKfx?k=%_}rJCaFgBYWlNkUbs zfm&QTv!60Zsf1p&@&kHt?3_t^BoA#lH^swrb}bwi#Q|ZyUu1KFv~53qe*jA#u%-$= z;1ADeQ>-^JJhc6alfTRNG>PqtUA*^{Y!<1dc-&*jk$n9Q6p|b(P_PVx5+FatX#S zK3E;&pIO7>;`YamrdRc0E^aezk>(df9I8%u!$KJ)G|R*Bf=YNKAmFWOE@2EcU%585 z$&EiVKT3Gwklt$vbLDi+@=}AO0tu8PJe6f!!)&spZO=77*Agt_VZ7t^Nu{s{AQNeA z#{ader8Qaq1-WX?fLk8nlI5GGj1;c1?xyBPPqSuO-9g*>(#oIW^?2EjD|60tmP+w?kKYRRTQat^ge z!Q3N#G0a%$_c%JSp!AizadA*yTVm_=q+l?0c=j{7)$=d5RsGNFRA}p5g`qUcyM!Ig zim3he8LMaY`;-qQne`h|Sgl=)th(Czu~mr->YRHxzv0(j0k7snFKbDoe(YmCV275$ z06K5mkD_Jrn~}{NZ?$Tc9-?_)vG{))OA>=a zygqb^5KUFrPqeSTqr@SuyccMF92xcqNQVy z-nXe`iRG5|rz#=*1Yjex+K9lgmO;A4V zv(xIQCmAr)btC>qGQOKDe%?rC@63JD2W%6mS6gsCD(9$$-_d9n79K2-qR+Tx@!C}z z`U#Sl;+>nZsDK6_1%$ByjO1Korj#D64QS9!vv=)e0I6KB2bPf5xJMF*=j65sEDc(r z78>F*4$);80LsxT$)$ULUP%>Mh{Vu4q~6na9n-IQG`oWO&`4Xc{)jo+A4%14U9O%9 zzmZ?KUV-}FNFy2Xf~BXd>>FIGe+2Z_i+@Y@dUxbd&1y>p^`2C}i*sMgNCI)^kXvkE zX_ z?{c6S+43s>Ao}mL$XL(?L^AD5n0Y1#`?QDf1_ca*IA9uk+@dSohI4eRg?dcj_MCZG z_0ktV91>KhS%Ud_jUllS16*yKv?7P5Bh%!;@zr&%dDG+X?H$ju_niV53a3(r;op_| z85n`4*wYDa2G5sfYElqEgFo+(5->jJQ+!M;Nq1A$g@K2Pg}p`!y187o7V1zV zHAzf&rv5fOQ-x1jA`R(4-RC{^VR0e@wL{$S!%T{(AIMBRe+Uq6IzT>5%t~yZHtqw* z*o>8vDx~&8a)Qr3&8Mj!k;>8`6SrS>btMcAkXZO~;jKOkX=uvT)-h^5`2X=!FA4t( zW9nKFqkCcqL7(0#sLu|PLllL z9y{xFHg=GJj;>Gk#wdvoU?1ucEh1m-&mjnSE(hxySP@S!+h_5Q+F=2>JOlQVZ`mJ) zdajT4k!>JLIWgv{ldpyb|AamfcWh7>&V&nyp9sfL{Eoi41YlC_QAfCXN1);Vv=gxZ zSV*l3ox@VY^|gkRtCMDKyoQCr!qh@@G`i;gAy@%e^a}~yl*4^8GfY{POLH;kd#9(UZm7cn02bf{;03gqBqyeRq1LS{} z-9A-B${=~}n}?=iyb;S)p}G(UTvm1u2v!bZUI>7vs375QFVt_M>Eu#g;ZwR#`rncN zZ<$3P)r|Lf5faHyW=Rr+_#3^|7$U7KOEhK4(NF1J(67s}=>C}^iB1*R!|}!L_yFeU zHBT2In08k~?xg1cJLfSwwMQ_d2T+#s+kt24Ay@@gGt+FDD63)Aqi-o9i?4j(00R$_ zp{;XUzetT2E}U;+y?Q}A{~d$mZz?1$Xt~Q<2|f5hT^PPO5aWxvg{t1d9sr@lOjF?| z)Ji4GoN)j0Z_N+?TXVrc%AE%gl0G^SQ{YkV1S(_R^r&PEg$Mg^z*d(f3&OPGg(WFu zOd2`g3DCcS@k_WNpM)&Qjb&fxO(Z;*bQbrD=f+dmx@v`WVIZTUGoBK7;O@`PlvHO5 zZCG*x22B3=TZ&WnGsL7~RHOIKH^UL6MXRfL_^o0B`1E*ugXn{d(FT?tH?Z`3szX-mk^*Yr!wR*uX|eR@?~f{rcqe3G|1l%@_vtuY>pT zYk_XxZY#NExD|xeL$Ln9jGG7z1Ku^rn5h`+(TvbH&BkB0sX|cx4AE|iZtJ9jdK>~< z*G`?8s!L7xMH&Dn(;cu0&SHZlqrejB6h<)N>4Y&1ib;u9=L=(EQqMH{ITd6Qyz1Em1=F1l|bLROM~E zgZhDikV|1u#m7lk7Opt-V&I1^pr;f<7`q`RNL;^9NdDywpcV~7EQ@;MPc%aZYCjkg zBij*rCEI6k=dX~U*s1E5mGotxyde4;Dts+?9ckcN!yTT-OR{`}Uu35(!2RT*h`Mj3 zhn4CNv^d`h;g(b7Iur&NuWq*_NC_!U1b!v=fAr-4t@I#H2lul%+r`aVGtOD`!Txhq zQ24PC`&s_Q-1f&l=_g5LOOZPf2JDGAXszqBg|J?D%Y0Y4#i z@+<>BBlHX}>`pQ;0&FE(|HFkBV*diubZ8-uIKcp<(A7>EJ{e?NC^$2_dHd7gI~3E0 z`0bDzl3AkV7s7-DZg`=w`>Y>zLX1S-34N0773Wl6b^Ifw0ujIX0K#qJofQ^RpShSi zxVaswHjQ-m>v^fTQyM9{(2l^3v1gnt&Dt$fDD_3Lxpkic=Dsqt#9F4Pa&GxrLQDY^ zk5oHx`--G>JC?dA|HmHw*Kh{@tuYZ4`(>l{YAf%~rNNM;UfoO=x;EA^MWI81|7ihk z3%_KoTSkXJiq{?+infgXP`gKx$lE9Uh;y$O{d&a>EryhU=8gjgYZVpvv-T$dq@RPs zN3YGvWE(_bfDgmlDsF?faXDsi*XhxmjJ*a&Jz|CCUlen&(vZKdIqOB~y&Z2c?aab` zV$p0v$QE+_^6Der7Js8xVzQ*|b6xQ5Upj&}I;#ES2f6I5T}cnsh~s{ZGZfjT$WVqr4? z7}q)w%89KT!3M%(7st$}wSd^(?6n7o8=VYfsWbwcmn@(3+c~i|(Aaq>f}Ii3lhzTS z`a8NXU3$v}OoLo>Z?y@NGM^QH#m)ap@1TmKTlFM5PncpJGD{X!ivzyQs849ElY)$( zEQ3C_$}2T@L#dY<`Am5!ch5|EeN70i`gGGEoGf6en3sVU< ze!N@$Dl($*TTvoS%<8k6MEV35TyAc-;(?xznC*X6to`c0Xap(5nOKSfY5hzK77nmT zPl!#~xa><)2MZhyfbh_CD4XYKOoc5*fvsaVNKl=R zWc7rz)0@?DznRqNH=iOzBDIF&kCWKKUfscAAUKtPEws4-_^ZAh=xdAD(=9~&YGnb~ zH!g5cX8$y>O8ym72SzyIq?GuegBV5KTn=%UbQl1-R)<{x2KC=-Y84P}x%94BP&1nYjN!QO4NZ$(CqMbOYPb zpe`XEP%2luPiZs_N+FOs@ESJp8~J&Q-pdow5apntzIZ{oSMkK(qKMJISSaO{IJRRz zHfxIR1_$km!2nB>@-&LOY7p9C+X>(Ez^{O6FpP6gMaKs-d;6j7V_~v0oy-nFBvlx% z5jQjfF+k>*Tj)2P@y42zuEgp*f+QLhT?1h{>)A_x@(y#5R9Wke(+tg)1xefiq<>Do zHf8+yQw6IDUt-QJiH&J19^_AL<|b;<+13m=y2;|Co4yg&q3yy7^thpE!_B5ftDzzC zRtf=Is5y{mKuuf-Fo?ctZJ4*02Vuw;_$U&Yt$>J(<>TW#bVuuDd_eBf9l#2dJVgYX zuGqfH$!m<0Tthj0#|E%oEajT0#*${rwMudK$tm%r$ouj@vy$w73@`~Q?-)}5Q{F97 z{99)=?TZl9+q6ZY+BWBW;RPMG{;j#7cIRgI)V1C3>uKAf zEx;l;qhcnMx{?SkLJ84Hp0d#>JE&}oW7^`sW^m)mByI12&X8D+QrwW)?F*&wSY`->h&nLXLxe#< z*6OmuMIWT=^yJ5RGsXZW zsmS1+u93&|M%UO?ZBD}hbx=_ zHYknL&63^*Z*b%zxx%ewM8pwMT`Lza)HQhBA+u^pu}(VoBaQcQP68iBR@7Qo;l>*np9 zE~NP)spUy(6UjJ(c|)F&>tWBt$t&7k;*H7xrWxkq;6=!mK@1{-FwECg2Lb&u3Vf2? zEAK!TN^*qi88${o zo7tY3?sICz`9}~&MihJ_gAwciO+kR!+se3~){%b*MviS4ZPq-nY5S*HkcSx_p7_hm z?vMCqruQRmp}z)3rJ~e2n*&$A=ZDe&aG0RV;ZSr8w68P9$%z{gVAc?jMmPf2O2;*& z>a=b<)Zj3nEy}wm(x;+F(pvuQh&0qsht5O&&iiSU_|`sV44eEw<1e>p`+XIa(PsFf z_wH`=&(>Pn```Ib|bJ-j|JAs1IwCNLXfRXYCmoZWS zmSiW>rx}RETiewaabj$gyTz3w?*#s4x>lP0RRiCbJHqd8)3W9{KLl%1x8BL{Kj{>b z@w+{=#>bU|rS&U7E7_Dl;JKedenB0Qt{lRcDCrqb^|;7{zz$TSmk{Q^ymA@O3VNMf7!-hk_OIB??xDvpjm|e58l%Vokyl9<8n2?iyo{ z+vY|tS_&qpK;KN8-<6=xvfviQn{Dn*WK@!K8aEAp={A0X;ezuTB|VybH?bLO0vjJ5 zm7`#ToSkL6wyO%#E=Q}ntEeEos@;q<-gFn5X58J!8$*qGFcOq@y(j+VG*$(P1i2>E zfQCa9u&cRF0KZiKWNbSt*pSE@i42Yff#9zDWBS(kt3^0%=!3@633tOW7#|0 zwWoShEhagZFz7))h=9NEfQ&-0NbE9T$*N%i19Au;$15uG#Ni@@(hSG{%Bg9el^lum zUWs6%8~jsY_e}xi9gAYGJNU7Pewv&YI2&I$v{LD!M;F6JCv!`JLjch!w+yyVUtJWt ze^x&5jX3xZyAgsm^XBKn$cGmF&s}YCPL)k!cE^SUD#tHS3q0Q=T}P2%t4z<%=I5fX zx1|NAt*A)}VCO5F(EYtU(D)AM0BXvt&YaCwd6AX#Iv)vbs&98r2^-EA$*ZRMc{W{+ ztz--NEM)EGzElOUXoa>WvG*8_;@N0hW-cW9OpC6bmn1yh8r-&lV;s3_;eVzRpd0VN ztXC~Wijo;Fy`&{P`!zzzxQ<^^STai~Bkd|5a&TZglqPe#8Tc*LWN6*b1YJ z&fygZ`E#MENN;DWa!5l(oyDN08t+o<9sTKlEnMbHU^od{_UqVee|dQ#t@|-i-%Np7 z#C2N!R&re(=)Bc^<4bwCmJFzHJ?n_xQHDu(5!duL!yZt#hRl5adsT&b$roL6v}|v1 zBrF_RxlFjo)!at^qIuL!=>Q~5hiJ_#EobKz77Wd8Z6T2e)xuEN2J(jeY_1=vWXa31 z_HykBWS67Dsc}_TFAjX(++wRHW3QdGdooIONM=4asheQ0Vkfx=3&|&6-RI|KI}2V^fj#2x zQkpoiKpN~?SFsSY^#EnrlaG2c(v5RNgedz^G60m+lj^m&0yZl?1;7NkR@0cv#h;6% zoA$=TY*5-x$!mMIAZI%}4Rd=XVGfrA5e6)%Cz5kZlpuunzeylz3ZX=3K_p+b-U2|R z6b27an~JfKoaVGQ>9pdCsrdBZ*ErE2GWJ;>~ZB}KZdZYmzFWPB=D zXnw~0tl4>YlkT}Viy3-QXf8XGe??^Y_m7yc%tm{s=eQ`m%oEBI{4lV+mO{tD64(!pEMKFFS4tZSCfIRs8r^7;k1_(`R;mbEYkk z==;WU*FgWT&s^8a!sph@eUhL84PB1Tc<+`MYN*8UAv@eC<9&>{g-}ST7d>Jw`qS=DRWlD>&acZ6xIEM20uDtG$^)sua z6Ur}Hr1Dh|mBoN+YQafUa38(omQE7)=JYZ+zgbN(^vkR~o>aP59XHK}CcozUR8>+) zlM2J4QQSL8vf+5Sb3nnDX-OH#1~lH3r#m1z`D_F$${wq=Ja!?wJ7z6RReNXe#Er>( zCh>nX@87!{kDj>9t8Vgbb{3j@QQxH2 znxtH4B!o#t0|+Y*Pg(0XuJRU3?}>@)u6bzAlcru|$h9Vn&3^92afTvnNtt3>qkT2S zf5}K|1L4B2z)iGAaUwPO2&9v~s-l~-pt``w=xWwnUf_=v5OUlYrr|E|{L{k^)FxL; zV+J#VW8Ot-i%4H>j`s)r_a+N;;6SR!`jio6?Jv+~CJ+*!8GwrI2@hT~F%?d31KV9_ zB9v*@#`0_7K^aoXm$@wthbY_slGbhwWl|l)pm($mHwtbBJ-7FJY0BB81RoAN3=fS~ z{f@C4rX9!9%ZArSe(LNFdeVzuD;%?XR+Xi52ArSI6e;%;t4(Wp|7^Ln4LK$>e2Nk! zHWIR0RbR#>?();R=1s|E_Ug@w^(pb}(s#7zuUIjO(K~aff6R$$IdTrz*n@NY^(;jI z%W1(m=L-tJM%ntq7{w8 z)D_v2g0u`%5xU9x)`ix2Jn08MAdrAl1(Rf_V{e&pC!D4@zuRUcU>+qkxCIFia%@C; znkZwr_eoj&ko0^pz-YJfo&wJ4+#TLW6MP3y-+9z&akYsMh^d4GkTl< zmf7DJFjL^!YpG-OFEglRC*Ay8)j^v)-XA6aVsn{a?;Mh8#WFaz!+LzB+Y~Mhd9vlT{2Q2nR`Ac1YNAINKhidX2b-f?I4^7LkJnZOk$ z=$3#D`eXIZLG}<1aCX;xhjZ=&~{kbT%Vm39!vMW;-KKkEYZ<2 z1gh(z(?|b~-|V#z9IHQ_AtOflUBO~v3^_+FIh-i~@w6?|QF^YzE8v=u{RUmBjrQ_t^t zfBbxsMg9BpV8K|=So2;qTSM`fJ9AT1x0swiW0AQ}uZ2U)q%9(6cX9B>-4auisu|80 zy2b|*!s<)xh?}T|<~MZzMw57^1cp(_Qqm>|95iYT!A{`LV4fSk62KYotjkDv#Q!8bs=zx8cYtE8e6X4u#);s7kkgad2## zer^PpMwU5<9cyeJ&Scl=+a1X=#CSW*lG&{8z&>&NFbFFow|yTg3ljWL~mvx}1=MxtXEegc`uKBeq zOU5W9tptj@#&Yqr@_mXPx5PFbuYo!lYe)wr+FRGmb7@4bc+viAa$JW>6P+5Am!D=o zbbV1n_-lXtgaA}XTO(^&4|RFwN=b*a^ztG(S7Fd%`(yw9O6_*_ zs}m+dWnT$$K#3V5#Ge4=MKNxMF>n^~125Z-eU*JL#h3PVvP9OoEiN@t_^c^2A!g{P zI#Z;6G3*L184Zpd`;!Z_YKA8%j2vl4$mpd|0^{Ij_=1hzJAA0-gf3J=b_Xh10o%mp z88%8SA5SY|w34x|Y@-_^KF4Tz991#ttGtb1<$AA|R9Nw_z0q~Vz@FyHnIh23l1U&#r)(UW2knb;c7ibq(bP&;J3DX89u zX`+;fr!8SN|JHOr3@sL9IhUV4^zAA)8{E7nt94NjUViEiuNU5PzoRjl`p(^H^lOb1 zwy5H73tUz4%1>qq(nQZbE7aAaOcN?~;8dIw#cJ7_cTe>&pL;qsb{FvS zu1;9_U?j~v6yhOA+^t?c3g_~G50c+O&cknAPdTv~|FdWQc387z*b@;p0+LZ;Icr`z zd+WA!cqh!=*hRLT&y)#^%d=s&E7%S}P1}$KR3>!0B=_WxPTTefv3aZ-mXo~Bv^D2m zClQpa{PZuhh^K|T`Q9+Yq9N&t)yM%IcHUWqeY4Fa!IHAq^i}jBPscHYT^=y;yj?<5 z8s~B=I&kOX5{X3?pcr;8rBPsQj{1gme%u(pl&;TgcdI_8gV2WQoq0r)+4<+{+H&VJ z@DlI`%H;Db1E+AaI}$AK6!mw z6GNb-%9s=&hF!~{#-Zu-<92j8FqndZx$+^ycJG3EB9#_=iaBi*n@x_6f$$PISLAq2yaUHNKlbw z%^qjGrtV!p49ttS3t2yhbsU{&yHACd(4yzx-ihamF7$MN&luTWL|&sNlTw`CQsec~ zdwl_a=ZISLbk-UQH8;sZlsQjZMp(_#IDx^9;{Lv)Tbx$t&X_qTIV*|&Y$4^RRpP#b zGFKmCYK#B0w@DpExyOIuo`@?&(^Bjz%p1){jYuC^d|`9)rD&{{`RPHep7Ne-Y%LiR zW&k1f=)>mY)VZWAxkE;?wOaoI$)qhUd2$3~R2}y3D@EA9omRl>&pJfzmuEjWWqOs{ z#J=*Sa5X>uOfeQ@10ViigWp zl@vCLUFateSU5#ix_AoncSbGG+w^zdLUZ3VMIW7GbbAk(W z#e9uIc0z$#^|Lk~{n?8K`-~q9>TX%3pHi#$Q#NlvgSGq{e)uHiK`hQA7)M4wc8EFq z?%kqz{rft@2jS_*oc9Wn5^nj8xJbG+w>o`s75(YHr>H#Z{9zz39eBxyL& zg^GpT@Wk-KPnGo?au#(*T8E6h#W4uf*cH{zm%9|=p(dl^^|5VTA?Z2zKP`Yu!My~0 zw+_0Fjfu_OsoX39xSOb0l~|cHte+5zMUC*tXmVc@=-OY6R~0uN_Q#aYeyAaeqh;Fg z{@yz?wTc;e3UJHx$1%Hw1~LQ*lUA7^f0ho3qZPGtSXJWu119N2HE$=$;fmMR+{C*y z=pCxSFKO!%yw{Eg(1Kj^4Aj4bPq!HZJ{OUeeLW^wJh`Z?_TVj}K-IV(#JpKAiyJ|M znCMY*hOhD~*GoNEX_@3~7Z^kG6QP+<3^2EAYKig(?6ILAiO0M*_8BgSO1P#C8`YR5 zRXhCD_IEqJPG8mFMEdHhZg%)6F6tHx)b-?I2^*c5{^9IX-d+9T;`D-nYSu3Hho5k( zVTE+?{b?18Wqe-yosZuM!bhKjXl9^~ep=KppTsIrd@!|%LC4`w-ZCQr4m$|z+t$&x zxKR`LTW_2b2l(##G9&Bn|CwVh4N^_LoD+q@L?pYEK?P-96KWM;Ypf{}Z&hs6FSm&+ z{|4@ZP7R{3pKf0NE2r>in$JhFR^%iPFZmm8#A-rOw+F zpl2;krKnuir0#F0h}wG5zmX-)zC3oPwsiskBl6heHQ7aCbT-*{=v zJ2Afjk4^Lau72z1!D2Jap7$gH!Oy#Oxt+AuKvagPKjM=ahMAz7$FuXX`(Uec-eQjb zhR&L z>6#zxS%0olW)LK$xzq`9Nd=@UW|ljwzA?KHI;8Be~z)&#u3@71OL`3E`9*aX+wOBN-8(sDdS=7LrXN&u3M_C!_xL z`_Bjgx4uX2#xZ_~R#hIk1lKaPcDQ4`^JitId}XUHw%qS>2xjHzOm3>WmF6G!7~?Oj z-)eW#!ieTtvtmb~Zwb+pWDcVJc%l62gyyYqA`W}O)y-SC$RPz60)ui+`zfBJ`ClR_ z$!%=$m-g(dO{~DJ%w(-Y0j@sb;{H#tV0im$%^c7s(v!_TvT-R!7h#K#L5!o754UX3 zZf`07BV=7FGrF3pY!1Krv~V`imlr+n6FuYolgH(C*q+iUEgwa>`KO|mBGQhRz+_gM z-|;QFz3k)kx8SF%@-!0LSl??R^^rH8y6FXfnsGW3MYZ|f@KcQ4ob4uDX0^3HNs{eO zfR-q~o68zl6iDT9mhEJK`d&1mRmGM5sneqFuQm0L!2r(c&d|XCFONAj96O^4PBVMk z9^3TDc3G)+dmP|iUTwe`VUu+s5#u<}JM~tC2R;o91~A!tI7_gnV`6`omX6Ff;Y|Ax zTSzD6oUJmbXqs%4!IB?fDy=>v3Uy}#Oy2ncJz(qj0DANTL$Py@MM$xLvkzvEP3W~{ z;=(n-oC0w%G;1|5#|^+X1Ue!;!b|-J$6jCioE~1BUTWG zyb3W`zh?i)TbHDhg$82|w+n{FaQSD~9FZCH$=b6^ohf;B_exNfx#JnPIAYd4xLB`= zcwTkr+6F4;()7|b<;pE{mTCwFCEq$uAU zCFkT}*V_b>iA)0H`v>FEpZo~t+{%Z5`PgZU=|;72Bln5j_+jKtMB0|Kj6E-#rs?6Z zH0rG2snQNdT%{wuQAkn8P0Jpssdvh^lZ-vA*VRpa*-+=G=$vk?D%ZmGKw2iHD^g=e zdL@`~Iky+`a7Lf8Fr$zf383D&-#?j(D@=T0mjd56)b+M>9x4TtQqJ!43MJ@zk%_@= zdQS*4@8b`3Ax%&*5AU3{qL`#a=QNeh3bOyYJQ9TG;G8ISZ9;^Qz(N$Ym6XNFOALz4 z-3bg7m4*SG$nv~y3|_%0J#u(T`FJ<0|FXj5l;P9wH~j7975RBCJe5E@oUM&9g+sg5 z;c21Z{6}kFIw4gp>VP%)vy0TXBKM;OF>XIRG>&%fJ&m7M#zfmh_1+p*!f-;T--NRq zR5Y1*oy){T{W$m>@42#nI^t34yup-8dUR$OG8tGP589|P}255h6jb$|YN zwJMR}DD4N+?ooMd^0jW{g*QQ7#Dz%qTRl$xb6iPHH(FaWOxm8ab|TPiq`Y>bDjyFv zgz2kpw>FH)hrAvVvUb5svl*U78n$)5$KMJ&reEhe$}Q_V8akI`-1BGu2Cyt&D_u|R zYvy(Myw9xj%badll-UilCT5v)`EjfMbh@MHnauAb{>yp?`@eG8OeTKOGos5&)+y3) z3R)msSco{nm~{6}efcc5{*H9i_g?Q(s73nal%t)))1e8uOFb8wH_M*;1$Sy@(DC&Q$DWj;9YF-xzIwg7CO@9e#>D|*Ax^0lzCHWXlK(uj zOF2V$>mc%=#ieCxq&@%jhO^)`Q^%l-aGTiDind#MiSG9!<9{_aV& zFv05bM(NQY$1P&i&3%XEVh~jmawihX`*(?Nb@H_HFhej!pQ5^lSK3`Br{F&#hL6(8 z$KxHnp7Tqv-^IE87!K1EovXR_b5*nB=H3BTjQ%##CnHDQ`<5gu6!N@o?V+tX-Q`jbNC zVh+P?N+sa8_G4^S(Pndi02Mh)h-EhWM=Wqb?U>AB^nb_D$zWcD!GOM^dj&szBEA$#zPtppf9NK z?S)=+9}%U^gKX?b#?dP_PpyQP`ZWe{K^0Yv_`Q8U*W*c>JN)k?4h*e;5^-xC|i}>3Z9rxn(UVnj4 zH+SIHR@H{jiItWRw|UDZOn5TFo@^%mf6y;p&EwFcrqxn9C3S+ybpwRMn?E$hShF39og!L2nnk#Ec7B?v#ly;)F&+Sv- zmKyGAEUF3tr)Qrfb904tuC7f@v{eof2X*MV3^PgW%wKlMGi0wkISRL)xkf8I{V~KE zXk(5>MHqJSGeY2ZFfhNzaEE$|*v0+I#`o3T;>S5}DOLX0s~pHM?Y>nCd(`T;=Cs4t z09Pa2JSkqb2Q*69_)I~82KVD7C6Ah(gV)$OzXkEbO2h#EbZ57LhV;3bqA;4rYaLa3 z-bCQvhF=(dJW18Lpy<5`4>!&)Jg^Y7(d6kI&lm{0%XKt2c6g%D``|44P#Z&W(cITH zu`g-POnA7f1408-l!&xc7_lkIcvye~vC@hM2$&%p*<1P!Pqr0GlOFDEbKJM!RAVMST%u|zWI{j-%T^ns2suW;PYm(?a0Lk>tDsbeyB}4zh7yxGA#NH&gnYk9V7*;mPgwIgS zsJ(5KNU&%V)!jD*T8mFDm3Gdixtd?XIdn^LIy~VB1^*4}aaAvSABD`;Cb60GVaX&{ zrLrRR0B?Qm2?b}ssOAO&IAikfho5l>No^Trz4Zw&=5#gVyqr=xQ3?2IebQZo9-vV1 zLwKmruN1stMWXnXuI4hrNQ9o(68snS$=Dao>g=Tqbk^_(u*i)sZy>?JUXk$n0*=*@ zLAcOfLmmuo58wyGTV^8;9`H=4x|z(xa~fNS-Y$NKq2Wwawms(FH5t-8?TJD_C9hQq z>mdAeh@l*rY0G>m0^*Bmz>3R*NOgEu?j=SNeByXM{y+k?MRJr^=rA)01Z=9Izd{WE z1$_n=tM`iupE7_zCXx9jh&nceIAqL2mraxVz8|8NRS-FaeTAsXFUC^52~H^7rhAls zWHkZ!g*ekXRfU6I+-dc6l^f^2ydD`i35>lgLGp(XLaF>?ZQtD}%`Zr*Kq^+D!q|TK zhHB~G{%P57W;tNaBX)}74-Fq^FnZKA(qIW35h&a0v&EAF=(NtiH{Tl%|GY`;x%HfL zB62>?H!I+a-;{qW-SIZ1tNlMRhZr$5dvI1Q>=nFt%=f8^n>J8h;&N~`?YEcn3ViF_ z)-`=>13OEe&9h+E4Q+g!zy^Bn6&(_kL?rV>=7xvf?@ePn<4J3$+IvvL%+m*yYcl&d=qR|vREW9I$}ws^Bj!tOKWRhy zmnyJWJ!4QYIru+e*#%#bz|9GO2*aE$c%qhAJ{bjDTU;#dj=u2|v@>8jPKS>MF8@S0GPnfe%7(&sJa%^LX>!0s z;kWif`QAlLXh4a0vV}<4bHGNuT7B;OEx-bwY2PcxFP_T@ze1BHn@*!+!?&CdAE-&= zhQfoKO>8eEj_;%x4e#ZCzHV0t%Ed?=CiTAkBE5FAgx7oq6#)V15I5YA|SjprnMpO z5WU#8Sh-bC@skRyYm!)#g&o8XuCB!vPP$ki@1l{u>~bz5MWGE5C|NK8P^#hRYto?x_!}b9iKS6>7JBUACnlV#Jo+- z)p}hhLM6pc&lUQ`cE6vQV+h-*y#uYAu=N zJO9hLHGnK%X`M@0zij%KU)nIX<)a_K*72#;aED`1O(+4e9e1Yr<8Db6%*n_cEAqun|CCUd5RZiHeY)81? zdtc?I59ZA|=<>vLVX<;Sp5)uCu)oBmkml;d{nS2kxi%ktB&SOJWb^Gyk$cpsFBR+s zEIWUdqT8{J1j%`_!K)s}#hT9uo0AbRL0kDLZ@KHo54SA>a4!?mpjcWYmbs1o<9|1l z+ZzDlwpO1x$+R@b)k~NzWHj!QMWNI;+q(mcxAw$`KiGo$S2eKaD1!N=!nZKq@kQTW z`#`O&Mw9Vzn)?!ahO3ULb@g@*h5enwee?b<+I7xV_7T6T`A-;-v%{}-Uq)MA(Olzm0k8q0lBps*Wek*pt&1pZ;+phxPTHfNP%o^3 zRHg}OH7NJVi#RiEZTD9SxzvUk7*nrfJDBP}@aqDoBXE&kV$gq8Vg+Cj57OSA_A6Ff zZvmrPqZ?kc1`9`XZ_e^nNCdS${=q^-p(?|}A=nK*>SY5xUba+EheE%X&gX68=7=r*o?}imB0vE1!#1<6JK-W84MBl z<(BW}1F;yX+K(y3L_}_yd}2;L87D6Cr;Sst@5(op$jmOmc^eu|e4**0>z#L)mU1V? zh8=!PbTX>*J^`;^*Yrwo4h(e8*UHlGz1^be2tR4NmP`h_N3QX+`fOLjfUl&JN~2Ie z64;&=YH1pIUS%-k-=Umz_ysP7xTH&!;n!IHVmV&0en`7(&eytr?c7*W%H=8vJ(33+ zRoZWztis@Ov6(%gpms}z*R^4XcIn_2B8-4Oaq$Qt{;NQ}&jkh(3`GZ|%22|mxunxx z3_VpjbK_rUvnYY`LOihtq6W5yKQR&O+W5#2k*mX1a#AvdEx|E zhZH#a60)Qy8A^tGVpGC|!g@}EOAl+Rp=D0jN zPQ+b7fC&`Q`DsscTh24{BJnGz2hsB<6uPt(Od8y$vfK&o&$DQ=_x&Wqk*20Hx6XhC z#MUt%=f3TvZ$b{8f$EQ^TyL6z&AHEbh4ON}hj5H*uU&yhHyH+Z1KuwGgak)nKpNt= z+XO}i{|h!+$H5g;hCN!t^EWPCSy6sm=s*pPFXi<;Qw#}V0arv zz!^B;WWF&q$r4+3a#I%#*Mf&UkkfevOzTSF2fzyUMh)&L)AF06x3C#BVVCe-@IWH1 zq<-_-3!7d`9Rj?+8|qfAqEmp0bs?>l`vVc#wpvim2Lm}MPp%G0c0i&U$h2kwbsl}j zS)T4~GCnIibDCGX$_<5VpW^zucA9x)tnvjRd>$d|4PlR$MEyqs62fY!xEE?~9k@6z zB0h8T`yuw=lxedxdH2sSdYzIlTUwXlxFFj(&`|)J;`TjXLevFhkmxK6eGyz>B=RiT zbt7%b$q{w9o8Ma$h`zN8x)_(0EwQ!z!zK6fWg)|95d8!-g$L# zsu{S!qhb<50SeHDsZxC`&rq>Xch_jWilu6MCtLxqL zo_h!^d5)6Au)m`I*y|+(wh`QbRha7}FyKv|Pv>yn%iAy&E2%{ha+ovNRUNV~1OqH~ zq@ilMbn_D1SN0hMFYnO(!F(G7ae|4UqxYwnZV)DH$PQbzBur-7=sSAA)-Xz@L;#gB zoe2fZ#l&Hm5!EUFQRNc4O}LJRqT1*5ySUm~6zFl6UUT58cHZ0yG)de1uA%|da*b5q z8M$+}_SYvLCL9zeJX|i8fDnlgQ9|Cu&6$g{gV=+*w|Q^7;r?!=|HgoBKJq0q?7}01 zE_;=OZobh=?MoN3W*%$yxBu=CtgU{&$Yh!P^nZ&pSzw_rqb~PmAOe~058db=N435F zPGt>H^FK2Bs-lRnNX>DKHV0{8$CRdHpj)5M;Fydn~xKIcTjuUp#?{9&N_8xraZb$U~f zSHy+}dLZALyJ>uR1e;-#HIJkPM)>NkJ+mNIUNL5bQ&R1r`=#i<&lXztlD|}OeZcL2 zIa%351W9@7+9^KG1q1rxXv7H|$G4xw@W4pE-%y`<`_+A1@6|_X4o0a}{*ydTUO7Ge z0%pT|{r$2A*ZkM}Ay_-Erp1tbL?;Ol@R>cx{XnzH;g3$p@`ClCo zb&nSZu_R9>-UkhTke*(}+(>|`vDLJH9~n{^`So|43Phb*{EoZi9?dFNYzD|JTm%Pk ze*KyWrQ?pY9()o`PC!DLjJ?jl8=^Q8oVgy4oBr?LV8hGA^GBA66L@i@Z=XL=IS)i#kxtm&&)IG9TVkYMSvaF00kC-+;P5!5T`GEzXO3XoI z2Onv}f9;Kf@o4R-JNoDxhtEEHcH1rvhe4Kks2{6cK0mG&~u~?M>qu}hk@gY29M`vl{*#e2@(uf17 z$e8>jN`DGB9npMlGDJ|eHeGMDsP@S@{WKNqZE)3l${)z5hn0wF4E2|V^!|&hjoFL4 z@J}3-oM3*A>4)r{aQ^CLo04vaJxXFIrkn*xgW0boX4>Bil3r|KS)%^W3n0{miC{b^ z`)Qws7Rgy)C6Cj=Oabz2!9TdH%f>jj!qW5M>|@9SA7fTkFC>WCSFsPt*hkbYd21GA zSfWyqcI@tfu*Z|}6Zh>vmB#!GsJ=naLawG3T=&)Bv0_<;kKD`G&&Gs>^rodbG_Q^ zg#Am0q3@MeO=D!&cSWFG5w(Ma9}9Z6{;dZaw)(H$41qg&{l34&^rMfHqBVW5+EMyZ z_Yl&BQox(g-ElPa^v;ngkLlI!c|h*+O!C?!>pNcaajLf|-G>m!%=O|j_478mNNx%y z0(>&2hZag4`bdRENBF#U5tmF9;Ybmf1|Z;B7DIgb(fj3}{Im2tR&so>2g35L@!XE3 zKh0eq%2{Sn6w{SBIKw~?wPU>!P_2{)be)uf|{QaMCP>jC< z+Ty(Vi6|&CzPeA?R?o#60k~>}8Wdj-Ga)ZNNpAE&qUO|ejgb@swu**#yNcT+4IXL0 zN3+}SjP6SdxbHXL3Q3dbNR_>LyY^G(*1f@S#j9&KW}XbD($s});0_7Dz}s++7EjqD z?A`P21r;2iCd)F`?kIJ3uKdPZ@^iUlQo}<|NZUvRP7J{|;hY!!5sCJ%R_G$%-VpPl z(S~&OHeJ)-3v7I<=f~Q)hC8Py`u8ww=bARkQciKb^?GdMJJ?1W#W_rydWqrd>fy9>fkjGe-u zhUql`u6t^sSzP-xNj^0_TiiMJNZYU`1xK#p2NN|YgklIkd-HfUa-Rua2Ul0JW-6H& zxs*fH&NHEL-m~tWhv%h68~bFew~#&3_WPgX5}`f@u5(%hD`J+ln0Zn$B*2i{O%l*T zZeA^x>gwK9XF;AO&M83v29VLLQD{DM6!bhhPFy<+4A`9E6MxT0M0^8ts(#n9B`TsN z+WGM~1lMnCo}|4b#V6=j>2MbUm zI}4W{@(Go7F=mTF;{J)vn3p-uf+7q)eOlzfo6@6nUE)rtt_>FCL4}(;&TB9qk>)^t zG`y0TXO;>7?&`~Nkx#VQC(1}6L~$*6Cmz-bEIo1XTh#(=e3)6pTOpTCwBy;D)PDX$ z>?P;b1f~g6)KedR?d;xlI(YZ8oD{zgwSp#iAk-dH;-&INjOYoOt9F}nY=pRt7xjPx zo~7v^l*&RA{rZNRkK9kXdP=5exB`{^4n|Niri~c_3qjG?3Ri*g;M5n z+;VOm#46AD!Bp9ZZIx!t)$d32Wyq{Ms2a(O*jB#c>J9to4+!++Y{^krL z1p#r`l{1muL`59dd1KT!$6TtCrpIjaNhTAqFm?tVc|dm|2DsXzZfKUbrxaNAm*^YIDj-4EWf zje(#dVhNec%G0T3S@9*tbR_ z3EGmK7#~|kufjj4IHZ9y7FVh56sysIbxPH*p_9u9-ZW#yJ=#m3dFe7~*8SZ{N<9%y zFfH(TTi#2-2oBVky2!yh#$$$zLtG>pCPj<%BtF7SNH;bYbQZl|7~Y%_KY%W zSg;!S-s6ab!6ZAj`D?5Kk_zir;KvJN`1{Wm;87<>IkwJPN|}anw!=*y$1eYkatd80 z+GFq6m?@9gGfQz*=ohzt&y7p1TP*Hyv>U{6=zAgF~k!CTzC#Q1=gBnChrXJQ6WP27? zJYx!fZJ|Jrr%8XU3v5Ca-B4^??NvsH_>j+VxUhTNlnbL5iY}xzAmYFXO7Tr#68Brb zBW>d_SLoUG6mN#R54g05D=yCl2<$R$30qN_^Xzd82F%GpRxpzHNl~2@hKJi&)8?<_ z%#qkEgH>FvuuY4&g^n=L(w1eOHH-yf!uAvrll}Oxx@)qk1$cP_pO3@h{u+nfOvs2& z_cy6dubeedgtZcBP9+?>N5?e`-l@PKpt7@wb@|Wb9LYEz4dH0 zP@5C2!p|itcS5mO)%ve(K^;JMz@L^?>OZAw{o&!5QtEr&w!KTTfEBZkK@LeoS5w4r z|0jK@>4j?%-{bHXoB)Z^Jb$Fztisf$Y#M9J*0_+q=ap6hUJJ^PFAIGMzJNF_dz${y zLGZ1q+Ls9F*|E!gATr;(_*?9ImYy~OHcsQh@=6H;+l7DF1D=z*qzpf2*dNh_If{XY z9Yr%ylr*CWngbFG|6~`EgOAQYg~m}w@Hn&)FauFw%aLLh{_1+L0GjYQ-V-`h1k*t@ zb&E4hyvQ?k5ap~+fZ5|=g39U2>sr(wiKDlN*bMDq3y{Zhut*2Zw5o~u zZ6Qhwn=DUFU8oQR%Om>3%dk^_Th5YAmE^JyPW!+8qpd0qWlJUDJt3((L&{gTC;l52v&B4 zlS`KGe*cCrd$M*-K(l$io$+ZIz@7E30t3)<{MKWO+19GA4C>sgwa#iUuI=HBDNBqI z^mS@9Gk`6_z0+BtSgYkW&~#)}vSaFFIynWyCG^JZ(ZC5Dm(SD1r`WT&PPP|H8P;H{ z$awhaEPZ#O-=|DUENth8w^I@mpo=pHp|!ArdprAJesPu)HNTW zThiWGVuQ2^7bOPYLabb?SfU4uK7R(8gdY)gV8F&CI8oysRJ{4g)@xh#u1^=7wPaVq zk_ZSB$usuE2E`9AaMwUf6yZUncY0IFJVKr4?r`~aSI=!eWlt3xRd;VN0v3(tgA7jJ z@&`DN&WH5040E*1hZI0Yv`a<;l|2e{VWm8yTw_x|?dFo#Xaa`dx1s zJ5uvhvXFF$x4xkC4&_ZF|C(1KZ68ple}yuTS{tZ^l_H&G2(Tsgc>b0(v6MkX)o!So zKT=u_Qne$p>C6g38{ZOa$`|6z@BNO2@}8^3l6<|XVAWh{;yu#`nLEn3UwYy5H}fbgyPaa*g0If$Z&k0L}aYn z^Pc;xYcbF!OEc}R!?$nS5CdoDUvwtOYG{H&BNn(BI{FW8(U@DyC}n2H`25A2{Y z_)y(nzR3E(lv{`lv*n4@ZkFd^L{}}eSUo?Y8|VuX=!g**5(eLPqduWf37{MWTp}?W zs?nI+aWSg6HMAq1#S9zxBA;UA?dVf>`k~-hlR`23F723DcF=9R$Kg8r#Znr6Y~5!B z+&(B_OY)5V?LSIZe{*vuzLXq+%7^Cr^VO3-@kS7YOq=6EVsB0}QPBKR>6t5(?pLNc z1?{NJ^0>(gd%Jmb|H9sw4vs`YQN;*HSx*Y|fzCE{w{Ksqc>0#2`z$X01C+UDkoJX~ zWK(5eJ{$0x;Y@$HD`yP28b*`+Zm2we^^B93g1v&S5LN(nGj3&n^0J;|gi;X@*wfAw zGet23$0PPhBG+ng57^l?aK4n&gS#;bWWUM;&LCQpuw&t^<-uR!@TGpQ#`bmB+g*OX z)e-1W=#&5WgRrqaO`#m{#^+Ia7l-mH1~K+LrCc%Tbe zO3)D%?+5`)e&H=GI`M$@=q}!PUGh;ja|nA(Z#?8scB`lLH5lousvZqtMHo?1^PREK5Lr(N4Eh|S~x zu9~O&MEsCB6!Mj(e=Xi#L-aXB#XHO<@(UNFO92fhY&~mjiG6J+$!Vz1(fL$^%g6(aIU} z+!9nVA&=hmYYL(()G43hCAY*8inkiMPz zTrE>y(0j=LO&qCG{{6-C-C13cU42AD*sVnbrk*5>4lIW6ARa(&%Z_D|`$KV}4%S8Q z_+=&5K7Ue1ylBW+9gle54WB3n3B;e1V%IXW2A#Rm9z*a`P3_j8OwsL(xuF(&A3#>f z)ZJOZ#nkDhL203eSmehKDC0`M*xWy+`kQN)`u|45sbx zbuz8G*S5c}PrnWiIpsDi0GX-k@iwCc&XAFCz4`9%c&B%SpzXmOdS%Sll#t{d$!opq z`-%S7n~byWo#K@J(a%81b;m3_t)Yw8cx<;H<5Po^|do+fkgwm@33Zj8IPZ z<`b1@DAn*y4R$ho#8D#`vez!8HDi#u=L)(7yXGRW*yH3CvD!h5%YA&F989KR@3$AJ z0|YbAc5a==SYw9+8W1lOv%NDs1P^egvz807v}I6W3iUz}Wx0RAlnu6do)_XVA13g8 z1<-9C6JMe+=23-$lPGv28Og4(hy;B4l&GO!OH!1ATo$j;+B$a@@vZtB&&f^ z5{3Zupa!YKm!zS7ehzxPSU?(9$>+IS)cd!{@kWr=ZR~xxDm0G=#B?>FQRUCL1k|vR z#|GM=1zP@P8qk%Vfv!ZU<`tpD^Xu>y%`vmVT{uGnj_(Wu_#0ocG*ew1uV9!0TB@%S zx>g4CfU&+zGIvX|F>3Fm0=*V2SP;Uoqp0A?qxB6VBoohH{<(Yh&A-D1#CHRHpdz7a z3!;lahPmN`gf@Pn8lT$6Ww(+{VkAWqfk)PR_YOKC{OBv5 zn_Gsv%aJ>u0Pq0Ku!9P+^jJH#@x+rn>9>(`(VX#p2L`lmxnOqCU;}(TiNbc-pqnp~XZk0hl^EGL zyGrw0(Dh%<`Tn(idw!fH$O@|W>!oP|M;)DD!aY3(y{~@q=9G`%@ojYIGVn7b$lOty ztSkdU{K|oru^|mN8WjWe-7;ax>8!$I1kfos#@;$zYa#E#STXN4G$tnpISk*ELFn=EUqMt zTqT(rO39S2@_Ae(fpv^X2^$Mue+1lXr1ty@L4=>~&9`v$4CzkK+nSc(eh7$Jje4_; zV*exUq8#*pIS}lzUP|M@`+NFu8~qR4`*TqAFH9xnx7f{-x$=|TVy4eTb_Y|RWRjtG zq4Pn#xlGq_-hj)=X_^8h_T4iKkC9ksq9C3Rv0=1tkFx%iD3R72dc+PI21XUec<&DU$eB;0Kia8+H$leQYwKGS z;7Xf+uis({WQ5Em1?UpIbaB5?rRRe-nJdA0IDd)PmKpG})X&#ha@yH$h@4yji%P}W z9wtV9da3+aCUc#tFgwz_!kH}du>)EtGzsudg<~UQ6YumSFO<0bFypXRX#mj{(w~F+ z6DU4fPRP4BI($(Nes}CddozQYHggP()sjtj;eicFdiF0nFY%j!txu1>YzGsLS(=&j zK!w!MUZ-UK;nW*-;#+I;hmcpG4EJ2FK?wl(VVB5xrMK@WYOeLp@$Mmbyd@S`2jc$b z*t)f5w>g1Bs^2pC^eDYybPbqA6h?XUR)c4@;&hR#wbWvy2z3U4jva^K2vtv@b7&X! zhbjnchLO|XF$JP=(km`L8v0}c<s(cmvhVSE!+$_3w!7`ya7D1I5k{U=RW^W4 zWw@7uv=;B)Cwdtzs6OVtm*FA+)xr#Cf3A5wF7qs9x}5y~9bX8Gl1}kU2|t``!1z=zLOO>4gSA=JAf$xwQ5sinVPthr*%l zdQ$A&M<0L051`+4fssI(AV%s`L>AXTcko%20DYFVCg&>-WN zynb+1sMR0wLrK_0B$U3k;l=s8Fq6Bxuek7(*Kn7(12)epqAp?Vu82bF8X_CMGYa<&4 z8@$h}?oy0`@6{qj!&a?E<&Uf2!`=(y){l$D?NvZvO~!@*Odizv#*%cVV+aQpj9k^i zjxEbdWsD#-ngN?5@fq+p|D{T{-qt^a<8AB9%)I2x*dVT$sY|~7kH{sA06&bHJ*^E{ zgFr^R0<0x5zgfwZzQ0R_KPTR>^Tf(k7s~bldo4!JS|FP6U8b@PP17P3GmBWabrP~L z(Y0j)%n?BfB5L#gJqcUoV!JjOuP}a;SWzI*`6E8=(1Cmhx~gk6)45;f5$G?&c}*GM zXP?jiv}`2|V~z|U1}#3qx~c;{NKiO%I}eWwO&a;d2;Z|hA)EIg093z?n(QFDg?T5 z02JkMcYs8op2b;-h9{H~K>IrwjBcB51uBV|Dw^Z!VR((!{ZIJIxA7wT&7dx6@ZU~B z9hJtHswI|u0zHeiwPmm9mjZxo=ATH9^CidrvWy2wxXnGsR2(crn1}jorOPYvk+6% z7SCmm)z)$l+9-@^1%;GuNb=4<&ykYpLcA5ZpuDM5$t|TK;Yw_>qw1`qv@QjR+4%MBG@L8F|N3k{NDCF=;>Tt4H`*ACW&X zXkLaP0P-UKhzPj^Au_Df5YITz)@b)W}o=)(BoQ%NU-8ZqN9;D_NgN z?+@3%Pb!RqY1<%FTT0a7(j=su`*4(R{jt6d*()b;GECj)aWl?*kBS+O3i;VxTzy=z zeMC!Mag<8UkV78Q*3jJkCC4`)FzCvRXpr)UQhtf|X5G>=$0!de&g!1vIKks7F&+cm zkB9ZUCi8L`O`HW@&44+Jn;EXGKi@0rss*ggsrhGkc-K zD`YF)$&(x?TwDYjcAJad<368n?Jg=d!eWwzMHea)$<|YdX88ykXF=G_40sE@Nhc@M z@|TUmwk4$({3~RN;aNfmSEahmxXC_a@Lzq${!qdt#gMUsnqRNNiv#k?A;cerdx)sd zaFb|A!he1ih4dF9SAKQ?;kQz8r~@v4VY9wGPW(SbQ==|o;g~`phE^o_Ov8m~Q`s%5 z(@bA*Lk*Lz+-j+fD*>yj@rC^tZz{a;DGVgeG9d|P12052rfRmz>Y}g8n6no5B-9Zg z=ZE$>8b`5+!PmTjfYRZec;Z+V*l|)Qr`)-OF)i_gIp(e@8qjB4jW#5W}eqJPacr2yHXRQl0(B>*o;_X=*Uu>o&i-y;pA&{g zvuE590{0jY;v2gOJAMJa@U$0cXyLr(pk%}q3Hl`NR_rucie}$mtRIzZvPEH?RFY;4 zj1Fm-HT@@#iP!;3c4r^UHapfbm>NS(V5P7w!rMq_crngm*A%Q{lEwM!;^y%_|84kvrg_EXW_>ZF z(|ASsZ6M9v`!#>_s`jX{W@m7RX=uw@S>hq>-Yc_~)+C$z{^5r~N6*$lIPm}pk1=~( zEZXhppoU|Hnf~}g(^7Z9-||f=id`#@CNS;Wz%VWJ$J-*}oy)?dW?6M_Uk4o|OG5}@ zyafu=7VaOfq#*v45#i@AUQ7piB?9x!J3fOWRx>@yzFky&Vb*^hEHXk^D1LLX3L=z{ zdg%(6++%|yEu^BLS!%)}!=?k{BhGG7EVc#v?8odXH8ytKiE-AYR047$<;}ECSdewe zI&h%yPI@uDI0rZ4?I0X;6hLFib_&d<#AGH?o#vg|FmGqy9h0n*PF5hO&Jnn9D!qS**^c-x8 zx{;$^&x;1;^U>GER8r@>Ec>GRpqQQyl|r*?j`NaK$xb~m_OCffPVaB3iCa4(?u>Z! zJ#ZxuwD|e`G*Y8B_`LG1`j!NAE7m}!OyQzOKCiwRn*p2Ij+Trh%9KE2)4qLTm|ns% zc1HV<;5)Lse;q|{=m~za1JC$?F5O;^6wP8z1b{mqne|F=Aot;Da=aFk@Ss&$Key2^ z)FYD|h~^D7HW%~c3?e82eoMD6Z0EwQ7B}hBCinVU9cagAg@?Q^yItQSLQTf=X%$Mv zjyoFKgjDoEVTAPhQ;fMB9d@-WX@oVdHpSAAp|hb0@}sy}(kTeTMZNrjxKV5{EK(k8 zl^Z0v=UDdUy7%~~moLLg&Rhk&bE>(b^NLjT!BKdE>*4EU7vm`&TR$-mwaj`P1PByg zIO!^XVf3*|#7XuR6@3deNaBV&0gmUNY%TU05K5z~E^bEu(HMu5;b!gnUL8-ZlC3{D zvCsJYbGgm7!m~H64&6?_qYh;)4pma6D^NhP{bK~YSKk;nwj9}94|_*?&^V*Uv6P#2 zC|=;!Dh}kR9rTwjPrxvNE~8V$v||YQD0GCy!cG}=YGUm0axxPNpRsOvtL(aPg+Gzq z6pM!ufDi)ORK+HC96+E39%b{?twD?ld>k`8JA6gTN0BV^-Ifx~vek5uHSQlhg47S! z9nXuAF>2KaU0{uvd6>_#3nU6K} z^H_sx60PLh5Wa?^dEh5;`8i7p#oA3&ywDWO?*^r>E><<1Ct7phTL^tx5?d1V^d&S#6qoHUpP>CFRq9} zae!1gZy>r_zKjw>AdIjS%T2Ln=}MJh8u9Nt=x^6(=m$_^gz++KZa+P(&-k`x8PF?JbYLN6uh+=M*nZEP< zN=%^%iMo_xY!~;t26b^_i3sh?+SHwT<%rb}rVuSic11@KbBzV$U}ONulI?`fep{dm z^#d}<7cq}Gqd(?C#b@S8C~+H8LSoNCo-~o2C5hW4G0E2fJU2q!Hxn?m9efLwfikFC zi~A40KGU6Ni<1g25&S19c~UCiQXrVk{eu|OX@(p2Cl9V3cX=v?d4`=z*F#0HUn0M+ zv1KGaUBt_w$s2erl{Q|{%Kpl(UxI+oH&bBmHjPnR4kZ<6y*2^4D3%q#Vrfzhy3dVR zxddPzeEYC6J{|wJ`LME$D5xvTJ|wh%C3zx zNWmjPI+HV-fo~x2&on2T7a3F_`f_P<^b>51Zs6zoNbtP$_Gr4V0-`&_Mas5jWp$R^ z9QDKQF)nAz4#5fm`4DwtY95&-zj^;~u`oC0Q0Fv;v;ldg7nM##ofEPvk1x*A%%oXUn&O#&X{ zhrH?3gf5e{qH43oCd%SZQ;(;)eA!c59d<(urdB=lF)p$R-(#L2*m0LlYgM-WWYnFd z9Au2peZ?2*2ykzw?K#M+QQw-`rOngTzIunB%FRPGQQjs-yS4VY(D18qLIyLdQm@+IWMFr?2r?jx>WA@a4@yVRRf3Pm5^ND?a~Zq*gnDEz~zB zg`AoZ?PA<5Vw%QS0n!nBsT10dj8BRZe;$uSG5gSTIJH{9m>+-A7olxX#Uv;3HCH+3 zpkIXe;xqo`KjdNp$G)Kkn_=-CM{Z-kgf9w^kh|I;=srq7q5cRviQDdcqOCF>I%p{r z^Q~v%n6c+Zh-SB=$q)b zRK=*DtQbS*bmbK2IaQ_h!C_U3d~5m9XHeT}5ecsq)m+a70v!eZKAv8lDT()3j*wkv zs`Q*FIdtfmfSwj}E4Z|R?b7*FJ%v4eJ^xP-c|IeL0(0=X`V^UFZlik^n*U=9(%U4h z+Y|=S0;;iSZC+T|&>%lP9%))u@VcY8v{=BOVR6C=(eR0x-xH0n7}exB2J%KMaioZ- zymVUui_m`pOEn#`rANFzDk>(hbqtqGU#6_@-2M7}X7i#}_4DT=QSWr4Yp$q)UQ|YJ z6P1B_Xi)1Uwdok11}P}&V#x<9=0g;4kfVE94-`+x{DFUiN$|S-!{g;woRb$93z%NN z9GrD$Y_S;s@d6TYNVfT0tP>2nh|9J|K5D96n=lAH-z2rhHeypv8N{*j_n7*Lgy)de z-e%Nq08>dDEvGOj4DrL_&r9A`q-q+1EROz4pY$MMCBc;!w@M#M%BLUAbeNRmT%B7saPUNyhP} ze69khB~CX#KoWebHf=xpg%*AZI|ntYAVB>H;>O33Xd}b5cl+VP9CX12nRB4``=QVW(f7p7VY*alSZ>imd1)&t_FdHmgi# z#J@ScP;KE%c6a8T^2ey^m3I0cLZLT%S+UMCo5?PckS)-hx@Y#vGBcv9Zb8}&K)x5K zLJgCi<-G>T;%7KVQ32552zV)wY+dYc1KWYW*-ydBl4jiBo}knmwQkMH zW+88o%mz%r<%GZfZ27$|IS&f-Yoq%X+MXv!J=lJe3waGcNZS}q0%Mrgts5CkBYwvd zK;L=oJ?r1kS|bxgz-BQL1@G*+f?-^PR- zlwxIwoaWv*>#2%dJ3*gw+n8sPB8;1HfW3&IoQSTZ1(t*)&5``n<846kNDzb^*1=37SX}fy ztO9oxc;lOoZA;#uuH9S8abX^t%iu^yZXbGz zTrR;cAkZVf{!?D*mZgceR4B+Sgtvsuyy`^hJ&#k5XM>!?NBvA>GIAVtSr>AQA>J`JR8zGm*2e;S-(W;DO zahTnR{ma1WxEzw!`hv6vi9{vCdsLwOA`AbW#K$crB2=MB8OoschDt27LSjv)<&hBv zi!Sx_!aqGWqG#R3Ot^-8f)!BIgoVN~eGh5-nqHF3Ir&%)PUd~3u*srJtQi$F`SB+{ zF>!n)()@pLf3EC^&l-oJyI=~7dO5e))*J*_8J=i>m{Lhb#gD~dfH-5%279rkY6A<8 z1bb+AXvpJm&Q=ZLRB(3KEzdUWw5v=Ow!P`(4m{48OzBw;*aD!bKKRe$D z?C_|b%8WBb;O^Zj#P}9q-IO-Ks+xTK??>A|g`xHZrZap$$GiLwjF-q>h6m@~643~N z{vkt;w)y&RLW0lt`^xoh>FiXen$6LwBx&pMoblgHtHVShM!s0^JgoUIGmt8D>MQTU z@W2k4ny~#5PbnAc95zNX1NMBS?B26@5j<_&_Wl5yOKfqwpdhAV-;I)G&`culjy1CH zaB9BMuQ=%^srg;DC?Qnd2|pmBVZ140gpfy+d{WEsQosHmPha6sRrf@DE{$}TbV^7| zr-XEOOE*aOrKC|1kdTm)2I=l@q&pPplFs`M-+RCJ2M}lP*%NE6nJJM}8H!i)QXkS& zoOOn?VXjj89O;LMW-z<|lUzPAZH~_Lx2g(Yf_9wGc~*M0l9+*beH-vSX(;laug@!D zxhAlxiH)5M07N7I9U=TBI`Vnab)buT)r@W+zKiP9plA5Hq)Nn;3}d4kWlbH2BedHo z3~%ekOLvp3(yqwIlIchb8ov6OkjecuL+)P4@E2S4;GCss_0mzpm6J41wyyy*?Ok6n zEUe|MU=QuT=M_4RrXSX*&wrb{r{wlRmw+5P^8eoa5~y2|_VX<(jnEM20_Z9?qkj4xVIvH}?wNkx} zgugY$X`6m>Lxj2zO&wAzwHR1XPz{Ig?<(ea-q3&^VK~cR4vygwFF~YLWHGR0=8oZ) zR)zKpEuHm9e%S4~39*WT7)EvtTi$T5K1UtS%HFZK#9Ty(ACvrOGLaP}hmt#Tn6qLH z-juv-mdQTDkIpY_*CA)oqv#17!7P^6pZmWUrM)k_K&)aJejznFO@5phrQIKmJcD@> z!a)lCj4}12FGL1VTsWZWe~V+~gCXrW68;A#s=EV2iIBm4-YwvZ)D;SUi5sv)SM-2! z)tYF4Fsq#uc73zry3_XaZvQARot?}??9!%efSQ>RLDG|TY1(|-WA%**zw7C_-*aiH zt4;9-lOH$3Q8=+9VQ_%xS z1s%WcX<@$^fTH@5bJ&tVYr(sfcf-qcklO4$!R70V-cQBf-%5!j^y|#A^XIwpo7!aY1ILCTlv90pf#J>T$&Yh4ukj^gotqB6Kp|{Gp{vC(-LiRxpY$ z#+wr%Ss%Y#@p=c-3b3$N!zYocD~(v&ugxk7_)zSu$Iu|(o-fK zFncK!jSCU^aUlcnp)j@a?~eIuiyHyZEd4V$s8lL}4FYqmNA=qoO^(N12S6QARkoC1VQz_v#KExPNV|`(`rg!#T}ZN#_=cshL6C;6 zvyrX%ikq7dewVp%S_m@m^s)<#M$M+*4=}7EVKw7L)^G>Y|DtQcukSDjRB9Ko#P4nr zISL96w0=Dq^@W<6m1auKAVYBi2(EUW*4J6l2pEgt2}9@{;7siYtQQ%RYmsRAx*Lu- ze;GJeamkkDyD+VRy*ZM!g^0d^a@=Yda4PjH3b8FxGgdj}c`JOXQjXGcQlJ3J@&7>{ zJO|ye0mUFHSL4;u@?k#Yv4N-EdH0Z@x`rv5)eat-c=23Z8eFTbpQoI(-HK>9>L=$u zgPn`-Z&%6YJy#5Pg4}E8Nm%4ROx>tKv=ri?N()8`tW1O_lYAb=8 zCKnUsPCD;s={PF^9o1Enm*Ow()L3k5^uy&rhw!7zA1fhiNswg9qURvp*{Gy9Ph};L zI(J&$L7IYQz`cD6yyC%^VKjM|d=xSbD#iDe;M!!Hnr5 zj@Na9qtf-YOOjlw0ccwHLaaOAqWaid`IucnfT$0%Ztxt0QLRyQs=N9xCed-~(so^g z*Qp8U%@i|*u7}W?Ov@XZMS1cO%+mW*V6g>^+IG9+vIC;kI2bjWp z3nxF`w|cCWWx`Vk8R~tt+>z6s=UG~54El0u36c~d)PyJm(u95$9b}z4x`y>D`Kpv^ zF>AiYd%WoBG`aOCQo65&LbcQ#Q^z~MbC|5nP)y3`Wd@UwLXouRMdaueFA5Y?St{%1 z&jaQ&7#x8~jwMp`Rx5seF$c4|J9|Ft{3aGpEjnkadQWNH1 z4Cs5|zUS)Fe|Ft~0M3yoy*t=dYiAqrHUs@LqZit;#5ZEE+Gu-CZOQ1jpPQd8}G z75Z%2wpw{z?)UX^nUz(MS>en%pd|}DwN5>`wDV%v8yPhI2GS)Ml7zA5;iyp`(11?& zrXI5wW<&(KVDvMA-hilLZzq=%WZ?Mzg(Vj{A)%=hp0cQ;wOSK1eJN ze;Yqix6@y#y`h?_W#O(_Jo6iQT<2d&@J?}=l1k2e7pcoWJVzzcQ>n&E#=;0zv96y4 zf>MFUbPrL2TW`%S=|6yAV^6Ojpe828XllSA!XvDv;-WW1=l(g9S}`URQCUDNLb%U1 z{=+gZk}t|}uN1M7-XGjEDt)!Bj2~`w5OnNX>~s6HZ|aZjA`NBI=)RAiOq<=1J_9i> zVJX$Ly)ok7-AE(teUo8qo*UWEm0C(zG~NtkM0^*%cccGRzd*{&(6U~3RCa7GY~`6U zsHF>~BmIpBdg`tXvAw3JL zU8=_?910Ibr&V1ok1vCpWG;OKdaM{{CIY2#`-_wB&!{fnL0p(GGv+KO5|I)LQl6-bk?ldhHNu$AA&JUNsW?uP@oyPK2& ziMv=Wfoz{Cd`UYip3T$Ptfl7{kUYs&?!^@nv9w7K9%=Q?-LZ8yjg-I9fm~!mUbIs< zqk*Fng80T&HFwx1lh%~ftIUC~i{u1LFBmRjB^n0c5G&}P*_yMV1HobH8f5YHzMSQ7 zsqbD#w|zfN{#<=7w!L7SIn?*rM46HI{OJ82-{LVj_=lZ(C{#glBd_+`5s_Xp3x%ps z8N{5b*BOp~BAP}}XH5LhdY>e^TM5CVB^OE5wc)3m+uGJG2eoY$wCb3&8wp4O*@k39Avcx=kl@=X|xvne=Jo<>MQRE%z!%Yi>RCSwhyj?Ok$exM^U1#Pnl> zy%6dlvJ#tk=S5$P&t5EcsZ<3$<*B&P7rB? z!_)nZ8K3yef3*s7jOnq+(n`rKz-yIqFqsSoajUqd_u%Mv=NN$KZ~uWz^E7Sqr`%p4 zbGwX6p0QQ}IA!xJNewQ?lNdwYJ2nE1Z`nX9!9jb%CLyD!Jqsg3+c+{?D#;o+@8%N- z^oc1*_Mz@W=eu@8P6r&Me;=k3R_)v#BXLk|@!^hP5Z1pcwGCPvEKD9A#|}r2b7VIx|%f*4!)n1!?`kH^cT%xfj_^Z3cF6Ajeq*OpjjifmyDF?E#wc^4C%))L`P zA>tyZG(hx9zC0g9Gly+gIBjl4xIHo2JO+MReFV9-ec^$wq@Qert@$!=;CiLO%S-AF z+|qqcmq^}ntU_K?U9EGAE8!p=;EU7@VN~i`QlA4tN>rxnuY3UwkayqDo};f zS7K%GA@*7L!ounu1#oV!TZ9R(;NAd3y|B(87}|n(bjqaeBDe-s*z+W^fD1a1-%ABv zim8qjUg;|N4xpJ^msSFFTj#CXo)x}&e+udH)WO(55i>GZUahrlV5p(CHEdqF=F!z+ zFBItE_xGRc-m9pa-vw9R2c5I@3fEpjCtcL+ZH!=b)5}tqTFBI4zBT!Eo=xOe&0=o!up1szyU1|k%=${3QI^Z@UK`^YvYt@sCyXI_h9!nk~N=H zP{WnUnXJR#5F02Y%g(c1`WU;SKJq5{qor>t?WpGTn4=_O=|UpQynS*3K9{GEEY!vm zg9WGa%Y`Cr2?W{f$7Im8)7qksHiPl8v;Yg=qqrm27P|JuEFM>A)8Pb z6A0nPf!)m@RQIt&LnMU*z>CA zLOXZo7XwvI_#wiN0lW~6YOmhvJdut@%SZ3b zYD$Mza(0r9@$v!zsOfh%a%j`fLlV?qWob>u2do93H*G|gLO?3oMZvPfQDKxX2Sw`W zj2GPyvEMF6LDmZ%8o}!qencR3mX-+ZdG!tVYN1N1(}H1(7}WK^BVsmm zvTUz2kiOW@W>ZU_c?&P)Za0*ZF2C zb`CEiJjJxFT=946M3%7Qa*HNrO7LWiy`0#bU?KlK`0Ca?E~9YH1|EuPib1TSDzu{f zb@QHdCyMcLv9Lu!xc7pT_|i`GRd44br1IeD_m9jZm<0Yr0}2~wtDZJ%Sr{8z<)8PU z1BFBmy<(&JfQ(kN7A?&#EvMN(Av*x^W+ZGw;fHr<-yS^2ik9v$A%-kx11L?wC50&U zZkE=O1{7Qv&Ic{T-oqhwY1CX|9~uLEPG{or2xm}brzk|aynDN=)dB)N5gt@mS##qKKE}~_A-gRgG?KcPw|i<#8hV1!}XN03%&KH#q>486R&zN z+B)8e-`3r+RGpxah!b24FKmjAWZFku`0w3%&dwd|6Ume@nF;PYz8|u;Yd6wKAkXk^ zk|(vW4V?qExIIZyQ>h1dFg4T4h^u8}E&IWwE?i^UyJ0q_ebin!^|v47hPbV|O9J?u zd`H%5T*oKVOrA;LC@ByqO=4Q%J507z@Vp**I@~#QQBh@vGn}_^n>JILKh6{kQse_I zSDNnqh%$^D4}-g~9_L?h)3Fq6adK2Ap);F(u#o-^KDUb4cwPZmLqFdZQbDOum zpvG8+0U)6`hbAE75vlnZDw3b_8%2w#UB{U}gGZ%x`|MqfO&<%|fAK8ON>th>(|6f% z(nJqnfU#=~lDfuhRf9(EL;p4>%^ornr#6BW=YHQve5sxk=4GLOr84^05eSS`1M9jU zM@{W;W@w5X>YRPIsHq}9cL`8S7L|nMdYD{9(EDuwZ3m`f!V=}jUs*c8Rzvh%g9S}- zh>sxtdU=wuc?qqCUSDJ3U2FNUQ>Az?vkr%u)+rkzixfRSrqdLzT^V*%#pwszjt40E zBLnp%40z2#AV*(Yl9k)LbVwgy(n{-g7E-vkUihEu)wVtzU4>`7-oLz}6v-6X=P1mT zVltzgWQlgblNHu!_BDw(pF8QeLIVK;z4O>MTk~{w!}DLc!Cx#vfB@(4_=r!>GgH(} z0>q-%67^vQ-%1>X@qP*^F-wJ$$R{q&^y)_oyx7dXm`wF4={fSld|V`SZF!F%-gw>% z`v^}Am;xvPosFoSvqe(yb`cpx@U1gAeK^5UhJi7h*7RIT8GWpFxZ=R&w5gf%TJgB}%WIxn?)_3!@rENil$cFvr$mzV5s6F{)t$0y>h^|c) z!Y8u6E}{8oDlunA<2yH;K5DT|3<5o<6C-$}tv^e?oLr4=|Nf;hqeGk~|H*=s{e;xJ zr!hE&A`v9;akUgZy;$TOuZOn+(IR;K96zTc(qVC%tv=a{p&*bM^O<(4^WN(g^SXNt z`2j{6za@Jq$;7^z#E~3@8#dT^-JejOy3yDTOiJ_|lo05A{`jmz(J(KQvdBhVe^+-_ z1y(%oJ-B|(y#vX0j>T^ng>QIS`$n12k6lH>3i1PY!sRAdUe#}`w^>I16ja?kMEz{} zqdai>rrH-XLLj@V0rlh(ts4jLI}4c9+n;=-kj5EJ_C5Wt)TK-rwSxw>5=L@x z*#%WAun{}mS_apNOx22kH&P7m8E#-Q!RCV^^@;kH0oDKU#z;@to z`8AV%(NTEe>>!AuJwMZW5dAD$mY{%8gAZVeMwG!YeB=GMqATc*)4TAMkU}-h`xW1( ze&x7>lq2?U+zc8ZQSdV)%j82QI2)kzlV4IafWrmW))*R>=iXJxXsctj?yi){Zz@ESuIUQ(NiS4}4WAcWEO;;S$UDZpu6 zEt~(mah_na|1LC&W!`*)6}Ir_yWN?InjM4cA460Z2cmq`d9B5p>5GR%&u%{@XOCXR z?`sGz3D;QA%Ot=B9jZA@2ecta>VP)eDQ|?;)7y!2wql_vN-w@^sZh{^K$Qh9F|oar zVnP@}!QUAWVtD_Zktnw9s{Z`xOlCyT&;1!})Y&G|EMN1Q&bj|MZcP157=&dV_#uZK z*z0~&k~|rPn?FbiyW^d3T2;e&NDUT4DW)_qK(AC-sEc+j6oQ#(4$mSLK`<(W}mq4Ity%7$pL!E{@?K5O) z^Y=Y~A$2WC5;}m~rk7$&Tgo(~=ygv4f4W25z{Y55(RrZH(3}8XIJu%P{O49+LU@2_ zl$4tHZSL@5%6I!KJ$})@L(Irgx4|IgBZ+1|hndB;7ynNXEp@Vn!7}nQ5tEBgc{D+# zdxJAFl(5=OH$3eGjnGPoNNYVy=K~|><7(~)hxEUc%rQ$3%elVM?_Yfy$g8{U`O6zX z+A*c2@rgH|xl(zj&(G;Ro}?8V$)t`SQ$z;f_eo-5`s}q8tgoy*l5pioFvEgo zcTryfk6M+dmF3Se&`6u8vgh)$d6^H{!Kv2tESuyZKY^lIo$X2X6PxguCVcW_V-PDL zjNEA*esc6O@^K6H<=IZlEWI)xG-F`V@7X}oN{#huXOsI1X09<&cyMiU9}d=Pth5CoGFGnxHZJF#7Y=3WYl;0uk-ML~e%5dl#yKJ8l7>ze2;wu(o%{Ec zjVFHwtBote^~YKLI;>8YnTP)JleF4n3FkQ}?`jsdcd4US3da*b94B}f_)FWttJVwW z{v*VxNL11`l_ut+Xud`QoJYk>a={Dl*2Ut3=ijdq$9C{DKd^ANmt_sg1jFsn(2V0P z{=Vkmw-rOv4_!F5QnLD60qFTK<+4CbmR8$sFV8#pr@Na`2eNir49u4q(G3lI)C*(^ z0&J>Rwxo0P>mUHsX}Z>j*o5J54nJe;4N@m0W*8%6nMftC5g#$!ZD3WfYB8NWlhjE- z2ehZ_KI-|+Z9hK~VXMiI0uaWQcgzEEglGWlSNS(baZ+bg`(r>}!`@FRh_RVvx-W`fO~*Lfx$a*gZhg!AWrHC9g3FYmMzCI`d^? zowpe_I!KIn3=_y-9v|uK+ICGuPU%==ub+N&y;&d!euk|@tKa(w>LA0{O8{$89`;DS zyO?hFAe1kZ5CDg$Cymf3eZ^0n7yvK9hQm7Q%hFe9gl?J{ZmEIlO=VMfR0RTS5!P=V z_!@_8WvxkVB*>+I_QpzwQj#ox=-Mar=uifsz{NI?js3*=!1ngD8)|O<|Bf|Zn}I+& zhx$?HGOZ~OHY5J-n5oBN9^?+KFYTMxV58kQ4bOGOrfL0ZXnN+71p|ed;?R=0T0RU! z>3rbC?bR+VsZ_}qNi4WuWS($qm;h6bFU?laryqVL?6@&bhwAxNRK^@%Ia`4%9PL^m zA;E7=NpYCmFPVe3-t%e?(x69?0VoO>p#H=aBlTH`_V%6;YPEIufVA}qgL?ssdr7CS zwIP@8%U*eijBgQ9q*#1_o0Dz&1-oCxNg&kTw`I)vg||_-)MpPoaaHwo{hftB+UsP- zJC2M`2Ku)x-yt|zzgWiaM?t3-6YlXlg?55ZTm_8~zUn=sEe!~+hM~QmC&M1Zgj#xJ=VL7-UGh?NtjId)rii@Ll+oso+?51#4Ot~X?0{0R`-f&ad@1^o+WoH z{N3%HfISc_tE_`5i{X_N6us&-glKftE|XK6XftV468UruJH*0{~fQKw0?^Dy64 zIeP0TJ6te?sEj6lI*OyQ*psY-+Y%2RDYbPc5Z7ksH<40w2EFHf^YZ-S){-mrGvp;Q z-w;d!!XD0YYK1MK;mRz|R;qt~b*5@KOS-~?G!}_(ymW`NpdiBydsR++uGIEVos;H` zkDdE%Z6HBPP>eS6U&vW(L3(i1?aB#Buy-{7n27UZCY>KP8i>k` z2koIw_up4~mgZviR{51*Ec@t4*pKj9Tc1KB;+3mkPgVYL7%}ZGEy~QMeo4}_49Y`j zC^Wq@E7QWBBAs4#x*`zar7WzrmtPqM@g4k<`@2|v;Iz&pvT>g%F#^%`ApfUgN@0o5 z--6Iu-u|gFS@qc)p!zBPsL*ctasX_rNt!WH zOVp5v>8ZzWC&(e^TH^lhrxhtW?e?e>v;Pd!gxb=TiHHR1gUS*>swj2qp_kwNLLKg( z*`pk|ePV5PwH?cDLq$1wD~#V&$&{^Lrr-t=yuIcJI`P>3z$j@*?c2UZ*%Lcat$SX(gHCn zIi$L?&9>a$f~dFFj=J>+b207we*|fS6u4>gWERj}(7^wsQ4H8Ixi zxl4R<23b*k7{^yyjLdriR8E_!M)(w2A!YQ+9SB0}a!I+f*c(xEp-U_Q$v+$U+ZOA6Zi=nR^; zgA?(T-45@jtC`Gw33Oh|)coiJk|@#SCiBa6l&ZCaos*=`*?g<*&6o}B>^6nTTrQM$ zZ*Y$-W)T|u;%TDY!g}w|v2jTA!PbnZ5(-ua4H>E5cKQ)%c6|)w^gl!_ z@^!S`m8{^f2R)~o0Ce@p4OcZ}H&CnwXD!tQJbnPCNw)uoL} zNLF}gkgbhQ>Mt{({kX<#_LnF`f9WNDEx&`B5+^8f7W~c#-85Z6IpCWJ92>nxLaUk6 zHPpGqXkKoB&*kIf6g5kI8yfByw!&{Z!O|3-Y6aLZ=LV*>2NxRIE84axyhoB&1Ni?% zXK*dQ0Y2A9B|zEbeyb5^RM$rrWxp9Z`BmaWkMbJlGN=pP87vtXt0Uk{S5h6nX-0dPyA)Z%Sc-Z`Ee)x*C?-5^w;x zCuhE;gTr(ibg)-+JWnp7@U1vGp;{q1x+i(io6PV?OHRYzZtxbSC?BJIQ@J;N6IVex zyQUzH+xK55&-nFM*yco!^&rW}4<=gfp1UD>Rzx4(S=uI)&F}6=4s()JP{~ixG zRu@?i;)vwA&GJ3}V_?)n>Gor4?zg_%Nw>|H2fj%=m#Z&_IEcUE!(^hPOY6Nks~O zX*O*PX2T)}d|ZcE9Q^xabtvw^$v)sY3t#OU5v@$RUbcfzzPJy@{~xQkwlH%KS9ep% z^i!vla*IX2HKU<+-ahoT;jBggal!~F%{)9X$Zlza4T}wp=hFRra+uDz?|`FCXYVtJ zg_eIQBAEtqS`-){7oc|FEF^d$)EHE$yYHA z*9}2_b@TxRz%fUDnmBEyAW+p2hy%4vZK%Q+8^gr4%V--)?^~1g$$fVQYY(&EPoDFG z|1@8SPIvDmP=P!NnKL>Ms;0sb!Dq4&QHo0u96!DakP-KH6eJ9jxJGJIHX}1WYO-XD zl*|CWk@qbt(TejDu@v=50HslTl%uVSOdpQw zYn!d#$~U_@Eo0m3V4rXEi*mmqoM-sTH3i=Vw{u5)p|0EmYF~N7ci{mHd)<;38`}tu z`keW; zn=)f%|DIH5d@&`VVzEZixz)#TN7E*_8g_o{5$) zVJNik8T03^e`q*l)&5VT2)HbuaAq}YiU?_LrQewqF}ZFuh4(O`PZ)~U#g|JyW+okG zuY0YuoGq8WK8sBwZ21C2!*y<6saU)8HmG7xZHNcEB}6KAxHLYNlK5u~Qk;baXFa2} zhcC}YpHDO`6~1u9eDW9>$Oaa=d$XaVi5n`xl^l5iv$pHouas+a7PuU9SQ(tgpm?#Y zFN2C$55r)uUea#-6!*1B7d*lh@z%IrbWw?}ESJ z>+&%}cOG`bA_H#AcU!&^dl&)zljR@6Z2QC`wo;;jybHEe29ogd9sNLDAOAEX6|6_Z z*q2frMRp-KcpT;RKkMsTt1fr6Wi-L<4TIpIH@r{Kjl@KNUn(bnY7M#Yk!nq0G=iA_ zZoM*}*=mNiTd#KoifRp+!5-jCdGppGyGa{+12z978%bqnpZF>+h+^*IMG)}b2_s79 zgxGjTiN+b~^5@2{rauOIvqQ%~ezxhkUoJC8R~|Q`CV&20Fi{0bR!K2sa5Z^F*$7(4 zG4E4Wms|Fi%syNY#%lZKggj*fEZ%J23v5QJebzFudn0{IZue77ZL7Bi&54q;aq*yL zTv3G8!T2j~RuH8tMSwjlS?3SBpJmG-t9-TTuhpkYoU_^Si;_)`c>IK2qIg4-AO=>P zMcOs&%{}qp1IVJlmT^$M0N0}cx-eYlKc9{cT7(TUU>)~2^4zHiu_v$-dh?Pa6MmzN z*!qqa$(&m2ix9_HlgbCeZTy!41z&5dp5T9&n2Monu@m1Uif0#wsjmrY&-}|7H1uq! zM24tHKB2CeJS_Kr&zP}gla_nw!FV@OQGG@REDeo+=tlY?`TJSAQ2yHC8IVi3)lALM zDiwct75oNrGf61F$aH7jj9c*J;Kp-}!9yZ|p#Hl_IaJ(UagIXucY!h+ZNtq9_F|&T zG0!KSR=vvTL(_?KFZ#dRksAz9O|tBO|KywIujKlFpXD2U7(za|Y}`0v0VQ|PfMBVmw_fB>Xgu-@;rC-9dJ z>pfp=dznX~rVvyhyQHOA9WiHeb}ziNuCoULS&p_@ zoYI&BFuOvvGG~~vWQdTNl+f(k2sK@D{#g5%T-Z)FosLj;TpkG$d|vNQ157Udn--d?h3!2KYuaesH938QP=q zbXqg0DF4s<;qrc>>CI8-M5VCbK@*rCiZ4!C_3t}ZwlG*P9I9AY7juH>A_YelRsSQP z9H6TKRynxOvRo$DLYwhM<$#Qefb0K6eKm9~&mB2kd?FuC$oWmif;GcH<;{yo>>kJ9(T{udQD!@-9 zmytu?!*Ue+RJuE%$U}JMA#x-n(>W*GE18+g#F<#b_ICbo1aMCv-=;%O-Tj%9cSp}l zDjOx0-oi7||JVBqM=F%tVkg0dD3y|z3v*Os{t+fB>ojD_pidE>*=$zBKkWNvBl4mRfMz!&w99c z7F?)p&P_zXW;hj40X}gyS$_?wO6v!u3lJWs>xc<%k-mzwRx~rBE&WCZHaISEggT-O zGHz5I3Ug{haykLSk9_tY^&fP))t<}LRiiD=QeH8<)fjL62kR{J{D|gaFnyDA0rkRh z7mur5-fEsnU%n}fPV5uZbFCV2y-sUCVByu+b2P$ba$m(O8|J6XS%$PCi!a2U^J~87 zxA{HE`4!a98?Ze^MDQNbERy7##r|?rs32JV`;6#)ocCejyoOi(kp2~EW~<|U__K;# zwD#;5o86h1r~|)uUlwmfrL8_0A?$J`(Vk@1AkYg$JaNOCpT`0CW}R>lV*)1Fr|ecs zc6PG{EaZ;z8`K(}qH51#uh#95>jopuiJ<1DTKU+r$NKa7^2-Xxlf6SVlWGEm*$LRz zXinM{eD_MyKcLR2kxn2=Yc@j!XRt4y>V)H5qYHh$dFcUN5$r`c;bpi; z%6yv}L>3Wm^pWJK^!=}LvE`Rz0q|+I{LqY36LXS%~Lm3zR0~Z-i1V1>GM{e671gPosAKn4W0(>z}^}Z@;}+ zd#k?r`M>DyH`&pn7GBOBQ8{h&)v|CXqwQT>75TWqG2x#x2WY4P zXS}Jy&I#GC1BYhmi8sQ1>Ip+N|I-3^yo4-^jJm)_4orB?0>@mf6=~I>OwlwSvkqF| z!-ydHgX14wz(R_BVsq!5M=*2g7@kwVh|y!IU91h}MIXCe1Gtp%NRtZI!8>)&R4Gu^ z-2zw)k5l8}D52x?XUBT1$40aZGiql3!pl(xDuB+9^V_i=m<3n5pz0zTLR7I=UfibY zYBt+W#&`Kl%UbRfajLkIi{y;KV86{mtdtKYtVlaX;cYbvyA$qXjz+(n?8s@O+^+@wMaNFxZJ z`vE?azmo$|oxYuqwMl2D?P%igi$2OxE@55pAz*{$aC|OPwC+Bmpjads*xtJ=DFVj_-}lNnG2v?fNPBzTeQ1w$I|vvg-W(n$s-U{>opdC65^L=Rb=ERKe){-(;hcsH zQlS2^>^UH15t1tBZXc}>lGK4~gyfI`$52=^DVH+#RadXyWR+-L`r7BGPDMHXtB0+W zbX&5CPTk&14C30J{C(qO#KpeqFHF(6WS$KZa-9dj)-B!N*H*%KW#g&TcjuMrBXP@# zCG(Yjh>^~4E*Q`&fQ#-2925|z#NITbY1R1NuvYS>O?M!()|2 zC?Z#?#AQ5nbbQBQ$yYBlDEpOA47i80C#2GMoOCK^+XnRby*=q|D`HuZZJjXllkwkq z%oEpVCf8}K+|-BFL!?x6)Wh-7`UItoEHp7tCT6?R0*_#*qgY3lv)H31Ue!|WoDoYk zeI!&Np;=p6N{^R;T6_UPLQgU!O^$2l=@G|Jl?v73ufP|>lX-h%eXdbATP1M(pT{w> zE8_(zE1-&R3V|A)AfN$2i9rS2kmt9_vgow7j-nHX1dHW*-YVF=eFgvJYI|V~wo6WR z6SwmLuh)asO3Xy+xTIQ{FKsPC9lwdZ^lL1u!Uv&IpLCyq?~;IHPqXsH0{Ni)-r%`S zkHZHuZs(9IjorQ6UHBZVoW01yO#K4jP2~GFNu5{kMN!7zt-b8JEQXvZFMDV4kK+>< zLOQuJe;_&c8xWYsP#(H{WFQjav#Flj@LB(?UXDxM3@?qvd5$CjHhf-}yK>&9df#Bq#o6h6g zbk33%t1X(eY;e5?R0HuB#jJF)z7i&Oj&5)paK&`WE9C{uS#>TVFj{F;$xYC#xk@uy zelV-?HnDjLT}B`_6;yU)x^V8wok5Q$X0Yo$^fLEeF|=u8f2Z5^=9-0mDD*!DTZeN)c2gaRWO_jrNN31uz>DgTpIH zk35$mX0;tcqw^M_fw448!I7a;r7_BaTopL}+bG=snPTPI3t(20y0Wt*ozR~nKtrU> zs&~8f!;tK}hwr(=v_O&X#Z-u+j@3Gc-5&9@9@CxokH1P`gXg>=DpC_?)`jIL)+u4J z4;tjAc!nZ{OObr=dc|MUF(n3Eywqa;uHm9;_tlBVdi37wkCgoT`n5O3O#2_T##zzk zxzdP`fffUV7{emu^ znQ&!pOYvs6f4A(63Xq2;Twdk=|Buf?1J;XG2g|4~VAL#i`B^4HG=#57uhwxgzrwmf zd%C)-_{D536j7*57xjJNI~n`%qs!5g)&7kL^}2@il0ik5Yf{BY6#8 zrPN2I*A9Qj1}RTQ22IpS5-ah&`Ip|n2y}^04d9z@RitD!o=pEOiGTSO3>9@0R3PVp zxUjtRnKv-5ViV0Xwd$T>&)Xs!-sLk2PxSeoICx z)Zv;2evsqQ(==vl1FW_EIxfIJVvqF?xH$ZQ23U>1^iX3xn|Mb~@%&v61Ne>H;4S@> z*VVS$=rT4?M5fL~sdmE)u$^f-$T%1;^0k9zQdZ9h-4DH;rb`T^v4z` zSF{$8KvYdD|oJkd)nQH;Ues`4&W03T5opqh_S1^YCk zd#BEx(rhVZP0M}zaG@;@%txe#)xW#Xf2`d+Fc#K)j#;$x89{phw&EZ2PqQa>GE%^P z>>3=k4}VJ~CXlPuojJ)vBD+iX9(~G7OE^Yx?DNIh;WxN5_vjq)25o}0U$BSZsby-a zM7|jNxB)k;?{;Ed2}5`^N%^vQwNZljgtRs}xQLNFpDYX2Q9w)U&i4%M*l zQ~V#Z%r#hpn~K#Qtp2;^T0^eNc+v62U{yX>`u#~a3>v8QtHws$=BcLd_ooNtGLT6O(e)^ zYP^=1dtgrYy}fXv`=mQAO|*Kw{#y0J9`;X2Z+g527AA1VKvmi2>#jEhZ+owZOq1)I zlCVC5b_n;`MlgD$9MhrzlZ!lrv>~mA(b(T;2iCe)H>88HDIybERa|TDGIRxoVc%(P zGSC)q)@*$mBskF$8i%6(7o4OULG1?i2IW(3l3xPt_jeV3)qmMq_v1K?Ot$HOuS^*9 zHsj+gg{y*G)*nG573Gbi$4|I_OnZg(kvr7O*O-rA9r|0DI)~Cn>~k_#QXXzp?($}f zeuRVzDl`VWjke;GvI|PQBIbX75}(G7*k9vKR&fe9vN+bX-o6@2r+#=Vmg^c8QX6Fz zhcy19Kgq2Z%W2i#%PHyyJmjeO?Wv~UClt$5eW3j+yg)(!U{_)*Cd!%r5sWOYnQ4(1J{%xJ){Z-g*y{8jJ&7^z=i^}UnQaEidYTZHI z>`9DJZ|5bCj@<8j{m*wKGz0R@PEbC{oBMOJZ}A@X%*_MK&eBf5yU)>I{?cFW_=06Q z`7N+nN22So#@iuD@Q7GxJBqOcb%FJw38}h>y+rr6z?=4yWPiO5ta4rCVO~>`&5~LU*f)w!*hKQ&W8^Bd|Iq3cgI* zXq$KWL6%m-zS9y#u2qi9@+UQ0nFoUGV(adNcM?3#PXj7!ht!~0jmcNm-<1$xdI5fD zg>^NEHNVmIm1sQaEq6vUZrZw3%QWs-amT#tB5R4LfH{oaS})WanF*pLfcaVw@UZ9} zZ<9Y+*M)GhSoH-COh$S2uMbb@ds7O8qD7hcjiA$z3q+UbJsYG$jak<&65A0a(3$pA z2l_gx@Mpb*+@+1b@5EFqQ|m&)86%RAXrd)cNY;NZNUUZ)cbK)JP4F|T&Sv3DR=1fa zn3u^+Qx|R4)SNiLMtW7|vZk#({HFDGk;xRkJSa3^#te@Ioy@G5h?jkZ)N~#;77281f@Y z)BHSdT3szaNxH`DF;!6Ayuf^cz~lmj6Mw;rWWX$6PBSWxnI11Y^ZE98bw!1WwN@E;V9=#>U{(6p(f;`F`SC5tfYv#j zakgC!6^2mt>!SSc=5`X{0AP_Wxv>-GGOSbhWu|YdkEp!0`L}^J`1-^K*^agD{;rvY z{)qMC0ZqW}TdT%7gXABdX@T7AQ8fI^bm&XeG-XNrP(qg|qklNK4GCAg+!lcR2NeD<|;|pL$ zo9+=}*s38i$8gj*r|m(doVG`9{;`H%l0xSSYowZ5#kH9$Nz~i?JiB(&%$r%;*r`AM zU~HBHU)w!b`?tc+$Vxi^xJFSLkq{WXG}HzM(zl9BKP-CF?d9xI)me7f4}3GIclaHC zq|J~vE-7|XpPT%p?Q%b=g9O&?Fs)Z~cB(wlfsMKLCNqy3$29cgw^Del%QY)OG_~G^ zCf75FdoZmWO_meTERld3i`zx;V391#$& z65d!2kmkvJbXfLWL9}lDx!3xpl%H@+dbq?twZZWw+qolfEgQ7>{;scTrzMh=JeheA zL8=n3TkHHWZt}3AcDgl_1qS?*LrB7L$uIcN6i`syOrAv!afvmzKtvQA&rYr%1nYv_ zyy}?Nwd#!;>{xE{f`lTtD!gbmYZHC)V7y~QCKrG#B}N1vLk|+ zY@jGB0QY}*dh58TzVCbZ&QJmpLn=}df~153gOm&*J<<&#A>AEA$q<6HG=j90bc09; z(k&fIclUF7f4;xRKY96@nRCxRYp=cb+UMf`A1iY*g=GGz0L!e`xss#7X+Gvl9g1Re zyen~4Hh0H3X!O-dWYNFK7TaI$;9eRZ&YhZSx_{$b$ki7#?fS4%^1rMVlrMeKz%wV_ z#kHY!jFNS`vWPWA(E`cIk+Spb!6y2TK2L3Of{YU#soWv#vV1E(id`y{baK59?RV?C zpKps~F_RBo=KRr~cAbksG6w$CpDcgPaaRmRkW|!dU&QP3IL(-G6lK1wJwMDz@gmwR zd;9l&AKsbJuxWK-hE84CTJmGnCpS)2>l`j`S35frbq_Hg7{hx8{!4^(onYYV0jT_$ z&5Y;+kTJLzi#aJ571eXh&$O7@;)7@`Te?eC@9R==h%+U*ou9-ZG1QR~eJcjsSi@x) z%MAU+FiGE}2XIENKO03)S)TU@q~ST#KdpR3?HriNj%biz#ue8DcydkNe3X+qBJnf( zgLk)DOLkGlTTSRoYzpOBYXMZ&F3Y`qTYnr~h&6$G%iKdnQlf%I`NozqMRivGN3G1c z75r*=dZfSQ^ey2yQh5)ZY#Y|F72M?z;?w(`;2*fI@}HEj6? z-DeZ(nxM~< zGp$9ODSKeHLWH$Pf>Kp9f4}e#6Xf#GXaceZOz=DB1xgNwANHBZ*G{bP&TCXUJG$!m zPU%k!gw_wlHox~!RpV)Qjx_m?cl)u%Zq_vd02X1V<_Aw|PeGp+aMSk(8-;}p|D5z) z{a*rNES~cF<8Nx1;dMc0=efiV2Jhk?s0h)HddxdVN*CU54S_atCN!(=DC+nA0@Sjn z#lnx7t1XC>)hV^s?#aO6S^9`USXd-b4_FY*watGLVt4@F_S^S@CJ4QTIM1bsKn_hU zXwMQTlB3dqYKd};fKs(%_9!i3vPtH_w7`2464mNAHnR6)w|tsK|ofWRtI^Xi590k|O_ zKuP768kGW;IY6s#a3fBeFs*||f>+vr(Bn*p*LM*ZtU5G~*Wrrlde0q32*8E1(xh@2 zQA+u9GpoV<(hB~DI2CU)o}~q%*WR7y{*BV;c)2%F)tQUeIssI(m-Ui(V~x=eZ)vn~ znf)osby9KG+Up_jm3Hw= z>vF6eZ0j+D=UM#x{A<~;8-)3irJdgG?R_nFGW*ki@c)Na;h_I$fzsXcyduUenedG! zpJB3~yLF;~=+46Q=A5)XV^vk7YDZRZ3ZaF0`Pk2sU}xUNj|AR~*1I{D-8{l_|GM@Q)5^ob3-)nCj?{r%Rbt_jK3?sm6$u zM!tAH4%56=eDlG{niuw*zxn-nRQ{41xRr6F)B$hlPwr|>(-(<@LuksnSx zIHq=6o#?CI5XHyEkyQvTC^?Kcj&ziBk#*m@*N?#x{5gTLTW;G1j#)Q-l~}3=ukW?e z1gmE;&BdQfhPpD>i;+A|x0dkU&^@!20UYOub?T}gcPGL2BzjXy9s-EJZrxoE(*6~q zfFlGW8fbPI{+jNTVN0?sKojhn^{prGu*UHDaW&6Wqsa#)w43G4G_jrq9B1rNun{Ho z7RgW(-V}cH?8e&M?oP}>&`TUiTI#TP6^GaF6`tOuoDf2G-Qs`#11ZAs`{_Me?{gzb zH_Q2l3JxmC*hdxoa|{ zqp+#n31w9R9roJ}miqGOUPT5e++s+@{=CGW7F3T<8;em>-{kktWnWR4Ti+FhDz93k z+RH`r+$m}kZn`~UUHYtFL6<7Oir|EXymijGaJY=F3w zFDWQu{C18cJs!O(zqNaNx^>I_A;Ux;e04?pj7>XTor}VW2q^Z%JnT2AU;Y2;60^i_0NKSqKcwb84F|>jFtOp0g29Nq*NzbVe$LNp8Sd* zo2?IU-)qPAk;g(5-U=WkRW@YTzJ>ih(z|;~Kc0Y9ETtBHX2?1#f~A0DY`0XN==R#} z_7V8B_%Y-0?iJ4KvJ*l`NHSl2k!hT#SZGx?obivlms*%{<*1_86Gh$)Tg?>YdEP8T zshqEeDZ_bBSUo-A`L%EFFhc!fa87xltQviP06%gF6Z!s&xID5_MFL+O4*bDI)qrm( zPE=_Udd9eoHNw;Fv$e|N={I8Kpj}iOm^!-1TNoguTbksvyw)L*-0#S+l>0YV*U|^C z)f_HgTn?7p^qtN?)(3=|9~QkOK2T#QwyRu@FJ0Zhv;J2Yp=4_qvZ2|S2NeL{1R%_1 z?%sf#O%cVH76QtyZzPoM4>M4LKrv7WU&?FH*lnS!!#6w}xXrMg&L9@*)RECOh-#)! z`8N6q-Sah!!}f+0iIE7_oQm8JHU%$WD6J6(w9+dMR6+=y*y-%$1mnCn-F5K}(zm$Y z>hjR7q03#@`|MN;rGAL}st_tNu6v_%<%<)NeZ5u@L`!%&+k5jVb|N7wvO5?sct#UA zlPCGAqiN>KEic$m|3f?NGMG0XBl9(=zl zi&bVjut*YHh2bnWaMCuo?@Q68fcVo+a`ZgSA7n!ew+92V+D33J7?LSY?DIjvy&Lc( z!eBIG^dpe&wE8F3Ex(+xFY0m(^(!5JSCtwX!@EMmxOeUIpvb0-S1TGE0Pz@~ylKSx zeHN=xv?*m%v(*|Ltc%x5cFxANdkuwaT77*PWY&-$)f|%7?;{Y-dcshWL*bFfXf(sG zUHK$jREHA-!|8hP)6JC6gc3V%#l(h$^T#Mf6jw7Do0?X)`ZmYYydu}BS$_8`lC5PZ zbkSSpgW_eO+mInx_>A@S(_PIsnQ!r@1xD^EjLpCR ze-dmm8*nG-2NJ`i;y5D<53Lr~RzH!#qIqaDexCBt1kB{vc>filzTM^eucDX9AlS5- zcI`8-sf{aDu$4S^h)0lNUwu(j+pWxVyXf4>RZZpa%GWpsN@dSEi}p|GeZSQcJwSQ0Hpesd17R> z^Un7e7-FGH3%89LR|J5Tn6vGIfq;G{I;zq3T~VJI45?wF3cZSKkxfy8t`ER>I|+^7s|}(CuZ_lygGt z-+Y&1u#}V-&D_5SWIZE}cTzOZSAMvhVUSp{-BU!U@nSinhih!8hQ;hvjpmKWW=`m` z0=Pvg#cyL1(A{Zsr{=l81wbvko8T(xsSw^b9`Ki-n;G>LSu(qOeg7WZMs8hU3*71# zek}~;`s4d|^76^crXS7;7xaT)z)gPc3?7Ey;Oaw=T}XU<*68-5qW7O&gPG$qGIKZ{ zjpXJT#&{4dzM-e}&Y3V68*ao}+luD&437S3#4Er7_lN{xkt2d71#Ez<&}Jnt`thVe z!%l&hL{g$a!hC2x&*r^LeIlfCtuN@pe zX|?se6&wSG3{nTazwwtrJd-YbTMyO*!Z^IDGLq#T&Vm4OHz|42`wS3L5Gzk^lA0(m z&VE?jlTZL9wS?A)(aOnBmFh!9UoPlTM8MfcGe)qf`@rsf2)2s}DNUNq^mry@x3unH z)D0UXK{9!4pKFejS$3%eSbD*SxKz=&zOcW7Fz&MB&3cBEzr=9waE`oi-TWNfVsqY8 z=G!jJY0f^HL-H0{TcF#2+rjl<>L7s!KQFmo@*i4Oc;q3Ns;qG^*|ENp*lS$)%smH% zL>a$AcIo>G+C1d{b{&}+9BGh4jV*=UdV!Dof6Pj8?#T|f-IdE&dmD>5_Lt`6&1QYr zt&SfATZN#h1Pf|`+M(zl?9vTTR$iLGA6?bkwNBWaw+D&a8hdB5;FYot9m6SI99LjJ z=J@s4I>DTwESc+F5GaSO1B>5{ucs*a!`Y|2ji;j;Kp{qk(p>%RtKqDt<>0#zl^!&? z$E?467gmimk0eF5FXEKxJkHSC@Qz@!%DG*PE44fp-kn+uj7uY*bAPVdVPfhh;uEz_ zjX>D0%qJ&rE3%bAj(Eu)cTzq&%b{~WH#hXKRLP+`!yJo}0a}GcN*_@R$*6@0GOXUS zhXcy*7)fElA%c!!>-Wh-PYy|&C@a0P7eL{p9^8tqYU_#fI+IebZK@HWjkMr*wABbQ z-@Ao`CO25XT&rz_T~E^TYF^q~$lNB>aVo5S$v#8}I?N`_Y-qcyZ#pm zu+THWaZ@1Q)YjyP-kF}a4IjH(s{9RY{3Ot9eUI9GQ^-(1{-+QxqlF+QEZXX?tSsLF z9qGbuE(7bzTk2xKp3EO-q#8PjXG93lgS2C!ygz7dikOC>l^82Igq>uS+GX;N59sH$J!c#Y{JdQ#r?-pxG1gYRq^B8LzSxMubtu=P0d>4t6Rnp897qe5DzB%lHpM&79C*pwYxBYPx(y1JSPDYRiknZ0PcBq zTalmA@!N!mSM~D0`ZLy}S@H5wSSal7YMae(!!-i;ZCbvktaCV9r^q#6i^1*tfy;kg zQ4Wpzqsu&U2pCvYAkUcio9s+BV?qXvxR1;C=t%zzr&jrnHa*i zIub9`Sdz62P|lN529vLk9ot0qj7m9yYQP-^BwyVey6TV%Fkz;$4?YI4K}%Uw708!k znJMrAf{6c}WSa-$H-Y?MbvxONTS?edy?J%G^XT@Ba76ou)MJ|<0S;L39sC%R1&vWy z)M5cZ?HwX6{hM_@Eq;A?L%Un>j3y+~#C^4 zaR6^Pi2xLIzCbMgvd`Qgy%zi@Qb>kg60o6+tO`YM{5XRF;77eKTk53S>@C+Y zRoV~qAw=-LsoWf~>nQ9MZcMa=z6e zUijy8KQV60!^=`XrhgHF*PXWEcZzG5z_<1gpJyt~W%E^+lakwPBOa{3sWF9&;?N8n zOs$lKA-g+KfaQp%{yHZ0fAV-Ow(G(( zr*j8;&k~bSs!FOwTE;|fba?X(#1#O~H3OK+oS zj*bh>rkEYyiVs%}al06(%dHsPC$PGeplTl1yVMs>V@7>Ylsd8hN&yQ_+=8vK;OXPy z)8RDso0pBqE9PDBIJ_(Sl@Wy3NRpbQ^X?fGhCG6KU>8PFY3nkNb=QYr(J9Ph8j%vx zJwm-tN$C=fm;5>WSVahDOw}ftDnb_V5d}yO&~g(z!SrtKG4Y*s7^LF>M&h<~~*(v8l&2DxTSJC%^2b?jpIzf>?>zU)XPF0W*5^N3#wMgkX3}M-5x`0xC zq@C6!kypo-1D^G?QiV;5xj-tbut2{i*R=gNCt;eIjf|mKW3u_hZ{tIAm_k>^&H=^2w~Ur_{d;GCs4Pl|vas8ywd1 zdXeGyo96ohK;wvjtBmXb`H(+eDn_Q5ATtWRp*gs=QOpiy6+3Bghi%if@gp}owic%* zTnxOM*QuSo?RJHP{bpR`Ws>?~61ce-{|8^u`6H~6z*(ftbR=k<@KFwBpL5U&hgO&e zBR_Ik*JOG9eyE!Y(5QY)2it?4yTp@$t^7QUP%UOYR&00W2-7 zj=V^C5nFZ6-^Vhqas$WWfj|PT+aypK?ZTd5VF;7UA!71d?(6mgbx-UBWu7v#G)&s9 zDy&utZvkc_(BoA)@bLbcc9x(jmO0cyO@N6Qc}=)^;N+lM|^|incimO@y8<`S&==&)T`BRSiatL2Mgi3R7)z% zoysAQuOMX5Gc|wpgzSt9(k3fomZYXNO``um>wF9JHtoK z0jhGea_28%{IfbtoVv^-wqtw}nIqR(ovDR;r!||d`?v?bcZqBinjHPu?8PMHWC*+e z-?1VGJulCUHxvh~_xhV0mik^#Re(2}?|Jw~u6`T0nubhvleFRzr@G8=hnrRc#1>26 zP7=Ic0a~4pv*@Nd!_?W%)YQcYG(0sIqrV2`N(M`+oBlQm6v_XN5;JQq9|Q41Pkf2O ztBMz(A9f4%@aFWPxoSPRSE^g;%g=1Y1%Tb_3ptEyV;{qNg80w0V;C6(NYw=t!d@Cc zfOwJ(oQ2})~N#fSOn~<7Ne0XZnyv`9F_aNd>y=|>k zElV0~VQ1OLbY6 z4KgCn%y^5BbwSl9f%tciu&vD;RYFpw(e_>R*qnKnpN9Pn=9-E9KGx^>-(sqvXeBjJ zqUmFGm&{~jXs+%lKp#L`2PR)b#P)a!=>XIdRi|l9ope6V4x@Y6k~|N@<((dfc5`y{ zR`fe#t5E`xuQ`rz@Bx|6&rin}mmB`R9AoO-5|@LE%5eUk_w2h>qP-k`GosC)$ZX`G z8^g+bmL^Rm%|>Mf4}4vt-$I|=k!5VIH{o%94yr4C{nkw-AI0%~oflob9lN!Dy|LCTT%xA=IsdV9A2R`eh zp!2_!sjU{ZA|RP2KPUJzt)(v}fCOq^KqWLId1B=IyRvLvEmRwDu`KAeK!OZZd(&LE ziaqieAXso;<M)_iCeGm<22+R#9;mz)wSTGTPqJ89eXl^KtZ+uRiq_RLc-@FA*7}{gRP!BbJQs@w zYs#+DHi1SGx_uLXdSO(yWR*6n?IA0s3VJt+&|TokxSwTxSDO*q>BB2*e0wT)#prxU zYDxX%NuOe!&MfT}xn#&}wi>lE17Lg_oW6}|id^7V(o%xatC*oKy=Y3Zh|T{vzSR>L8?gcVzlR<1CvMaaIRe`9)5$(XP}z<# zXRXl(xG9(ez}PY!1c){$b0Rg)6WDm9wY4Qo%5AaVWcRV-Fy!(b;S+o+FaxxvAMM?o3AKpc#+_kgRGN@JXG`_!G0($uHmTS`{yL59 z=Mn9k%jqv%$IVjj?6Rf1>$ZRv3QiyqBp!&WEZ_x1r)i4&`x9ccVIWBKk_jntlz7VX zUx5+IP{_hIPLeNO31lwuN3D1wR~P$z#mb;#QQ$kvtI$!0L=^FDmd2m*?*oy3@2FsP zF_yBFp9vi%_wfPL-$PxWE3q5x(eBA=o3ymDt3!WIF>{B$zjr3Oxtoit!)@FODwk+O zHfk(495h3~9Y~P;J)JZ@jk;ak$OYT<*9kj^8OJ)Ec44_Xf~#?3G?IH{lLN|Irt?>? z6zS@z5|JB_1MJZw{?Lz3QhDms9y*++5LCAhHR}tg7GuIU4To{ep10$B{WqSD1B7%c z2@lpy$?IQyj@KYwcL_yPvGtOA_7!}m&dkNA-H6JsM33qabTYoi32gPdqviZfVx=yo zIe9Hw{o+{InHP;a=?h;01_9lNpFyqy#{|Tg0in5v080Ea8%7CS9ADaZNNsC4gNj6C z>2PS7T5{ocqzM{R1o{#X^uM0Y#AgC|6%rcZGuv_>= z(=TkQZr)XXM?9)+Qu;o&FU2&kVYyqr9R9IPRJ+7kEaos#GU^Fbi28XHGOqVl=)tO!6a+XKWJ^o9 z%>=DPG{O1Ndy@NDi1ETTIQ!SltNck6DDo)aSSh5ku~3klH(^%svn+*!XV5u}8DOaX z^_Z<$ws>sqx11;$Feh`I{U`2N(L24iIr1$^9Gi8}5ao>OVk4273=8``%A70dEn_JP z1w!(|`Qgd~bcc!iuZ2uN!kf%F?_=8*w3#qt1P{@b^_E?{V;;D7#bLZ!veJU|Bb`() zgA_Z$Ey29LjS~>?xAi7>mTA=uy&P@s2;=lw-AQKwU#5mCJ9|oP?lTz2>C4sQ;9UPz zdy=slA7H%TZSlQvArc+U#c5r@E8nX5_7OV^8D042?wk3{*7}9O_qvSrtS}_w0=i=K z&43|eEt5bx<9oCD@9pO9x6eAg9F4sLxSi`UXn=S~StXsC5{Ak$(+dXpV>X5ng%H62 zOW@6NRiZO!%_tjr)Hm8AvpVNKa;)!kvj8(lcWU4!%#AB~IeL44L2?ACmn}&A#*TX4 z3?>B{3J{AO&{iZ^ffPbLr;rLCv0r~Z^s3fC}<}G6ThK65k zB@!0^p0NwDsvhpBMhE9+6HApdkn6KVRw+qMXp`uy4k*mq!pUgT{vK-v6*71kOVEci z*3*MaLq;d1Z}xT1Lo>aC5>}3RN5Do+um6C`b-q~@-GdUZxHjNdiBd9=v2Ld6*=J7#+M^iiw(&~bP%ROvgflp*ppune!TsckS=c(USPo%8Rl$iM;l&pi8DQ3bt+;_! zHS{=)tG#ZF+;AjU;-Ii?St@x-dRzC$nPLJrUZX9HFD)P+X#_#BMo=%pfG(%`pgc`? zaPwC=XII5wyT*syIuUD))@xT%n#~T^=m{=?v<}R>=>kCu?IM0H}bx&L4aE02!1Sw%%xzMsO5V)d5k6cwj1$wsL$hR# zU@H>)KDNhCF9LlZ@jat1Z>-GK?%T$n6?TfzEb;#S-qjf)*Ar6EZvN)20&@>INnlC+ zA7SwaQ7o{bv+3+z?A9js%;%$n?YqPHapUO1G@jd#&+dndd}ne$$$JvK#c@6* zixo&Gry0N=(<_MY6XMy_GA2NC$nH;aRE&bl?(lWM{4Zn1l# z-z!~WFtw;cUC?N%BBNJpG6%QarJ!G=_O^D@h%1kxy}XtD;3v4;X<~ByMG&A!lGKjGbsO_nUkdt7?jZ7&3wSI5tt<9m~eIe8Nn>0zC zQX6xSct)b%Dojk+;&MD_@*DoVC0!Bv?bC=AUjQMh)pr16y4Z~<6uaWnVsH0+UMt3e z6la)dJTWIG6J?=cn4E1lo{x5Uj+C!CBF(}uB*I;Ebzp{uQ5G!F3#bd%7{ORUgzjy9Aqn= z%?VTD%(JoerLT~2sO6K=xxJzL)|fvV(xd?94j)qMzZ~-piz;4A-y}h6p1&Nh56%(% zPw9^q*8=jH!5$E~@a4&k%@UFIdQ$C}6`W`+QieKWv-+Lfdbq%D{blDW-HS99-i<*H z?wyDDiBUwy<~e4a%Duv@Y*GG{W!-7Mwb_Pg+=$|rGOr9VYjSNCrNzd6l-w&m6y1_| z`Rfy!^>-m6!9$Ji{we$iE^tI6+>{0FmO5r!4Kd_Cc=5DI!G%Ln-J%})K5LC2Q@FN3 zVy6m&&5!WKYY)O|!QA#y1xqgxDd-n*Hea2EP{*lKy^D+@CH)tZ;Jk@;4rySbo8JEP z|8OUPwGAYqnE%!0k!<*Y%U%es^7cu8-QRLZuAjwCT)M~D6rBKozZ+k7z_ zwEA6f6_@?80yB=Wpjz4P%X}vt=G9_^8eKrrd*x2$=~~s%BqI7DXIjh3E4)5Rt@D|+ zJWms2`RxzYsnig`n+!B7l#S2JX73%@7B=xXvb%6$*2~%3^-bn|tq?F$r3<>It1`oN zl$2Xz?>l(vgc;zy#{Ps!KaS9|JZgq5l->lLu^6#P^;OBqxT$k%a_UlUDPFz${b1)5 z@zIPYhqw7M%i~L;t&saJ!2qW~8jBuD56K&KOFwD#?pWgIe*M^dUQOxGn)Y6H;c`L- zr@#evzaz>#N7<6KNq3bulSQrIH2%`fUgjbTV~e!?5Y(djAmG?+lJYSF1CaG8K;R3U z=UWk)`u^&sDnnpD zncpc(&m|^_4>rkl>Y$IXChxUL16T>N5_O%{2#lAB z(KEmQMA%0G#NO)BQ|#Q0;b8OA4YS{mjF%_XiZyOmGyevxrvh5d)Wjm4!H&y*A89=# z{hfF$r^R=jnEO)7fPSl0tr`y0S|vUNimQHToF}s#{e&U^+qSL;mZhIwcDRU$-*3Yw zOq|IZ#sZ>j-Ug{U-`PI)yeC-Xj(C6i|008;ZeWtv^pizfPK-H{DM zv7im}&*s)NxtD2|n+BX)X+z|=(>zRJwZQI87g3y2cWC{7qwpj~e+uIupV9u06;onX#PPE1ydvSJo*m+K!gyL@=a8%rwc9G~6^vN?c#Igv z0CTYMNS92g%3XOPwz}!r)cG;}v)eVD-CFe;kpqQYWF$6d#dEx=a9RTqX?aLMzy0Nn zj1n2-j?G4A_b>uVKf>&=(}vm_%*{Oye>}O%E6f738%6n~M#JI(S8%aw6tJR;(lAb*_%ECxv`X`KaC)R- z&yD8=t(|lmt@w1X!$UBcp&9b;WDIcDiJMGNM9(UJLtxR|NQ%hlXW!TMtWFs zyZmvM^4hMEyb9wHRXp3V(PDM)PCD;?MvqVlMj=>RL5$PDEUts=y>HuhzQOi?GZL1>FMwJ>>(UbN+hJ14 zj28*{L8Sn&g*RbEI#%<)HX+9Csso!H{16QiQm0jbLHDZu6rnuEV6< zB2)N!og>$B;-X}Rw>!N@!&vK7rD;5R2i5Rm|v+W zKm96)pfDV&$oRSW@ibd2wz@V!JUOKI98yZmWT!Eb7hXQHOf5U~BD_*&?; z3w$I->yRnKscC< z*g68Qe&%=}Vgiyd@Gq(NyY`QQMz{M41TDyO1*PwNoKW}1i!UU8e!kz;gZ=T?9}d3j zJ~daYhAi+=jem1gn~!r4N0DI3?OjU}7H&NDkMll#?oT0{Kzo3$nlBi(!;lyd1*`UV zCv^U-7asJFUKuyk(%&7LB%{1U21Y+-lwr`~*flfJ*BzqvO%kaL?OzgNWi(?^%N0(` zBt0T|YN6HDYDzGPM>0b_(BvXnK1gz*WfoLXsuHUZA4BoWFqt?5Dq-=3A(H@{eqtJ0z?i&ew2W-AUVY*z zFJi;tpaa)X$bu(ZNTlR5b7n>Ys8<~LXE&ERLu~Vw#87)LNxi1iC?ob6Sm{kI@TK>0{u$QSJQ4ik1wuwiu2>x zRX7SmM!$!F!{UWFQY)DloYk+=14%Tinm}pF}?6BvnhXen#Q7O^wO+3-YFVkb>;1~Qa1u;(WBxA(rZ0> zf+%lH-~*v5nKJtGDRRqofs2z{N5g;$9?JY3Y4k&|ks1@7QQEqGeAN>i!jeS{i-s_` z>yo?rw3LKVjGtPOAUREQ62Nn-xco#2lHj?)-z`5>-Z5*XOYQyjwyn$*{@O1?*x`Uc zzv6a?DR;)1tT0f@Q2*fOYx&fO;%a^<8;AFY#J$5lKR4Lvju`QCrWtWYJVqE|ggTFX z5Q9%4B>#2iS>6Qaq;Fp-dukc=v8?eZZ}lYAnCbZ@(LhF=8R)Jh9`%8uv~I<`+-T?3 z;!hw~r!&sK6m?G|ToI;ET_|TLRm5jB#Z`zCAu=7XV6yqCgXZN3Yr;r4_^$*74cpAm zX5`A>DpHid))RjLll$_zenoVbPD+L*)5bA2_G`=TDrx)+q1BMVJ4H+A;};A7hTKp! zioeYMek}%ze!ZygMUmzDWl%rzo12dU1B0a?ju3&5tf`W14=v5bs(ESC-wUpao79ZH zj$7yN&J)qXuC}|QpqJlM`$GY-o-JHj&a?9M73FZh^=6i&`{Ovau_qzn1v9A?z>pK+<(SE+ z5*`F%R0WUUX3c~{s)rm&pyZGauif<(m6muDReS&X7yD6j=qZlG6XiZezpT zi2;ss)=OoQqoeILfxn6%l%V*x246`gbbRK&xx=2)P(JU`P?(%MfyBoI)_l zq`G>5uTT1k=}FW}KlOz_?Pj+b6NS9sQ(ODUXCWOM%Vz-iRW*=G?=X`M+9E z{hVK3|J;}rIpLTaz9s`#D4DqQ3IMg5AtP{+ab$WtjB-q`dl>=WwI})k#^C&x>F+Z0 zo4w%)j5)B2@YV@=SrgLdzPKa?E+a&VN3`!O|J68 zlAX9Gb?Jr4|AJ`;45p`C#lnF1Doj6O=kDid93NkcUge%@+#Na&2YZhYft}>@rQn*+ z{foEjoLAYk^JAdl1+W8a5Q=eyi5lIAVeK)?w*ildlUeu z5cFzMqQv^n&b0%Do8S%a`_uXL;%sK9tDar<;`_O+?zQ+>gL6@8kMld10njc(g7063 z0U$}<{a9i`ZWNaDE}C=D1+3Q-*5w9L|K4f~%%-ywUX0^r|5H(;LDf@U=-@l;LG;^u zF(4fDo}#pbflT}5Z3=vfj%3UxvnQgaQSyyX9KUKi4MDQ&e|lVmSaJLKWv)Dk64l(z2$Zl@`(EyVuI z`U3|e93YEnAsmK;z6W1-xR*v+_9zwv?Oy$f>*Mgm7X%M9kR~aSuXtFy3qL_Ze)~C` zY~d?CPcs#J%LS-d{ElK~V4xKFQ$*Ez;2wgECeoLcL?B9F>TQ=?5fx-3@OmVxGy>t! z^KsIFx_~vLo-AA9!u84?X&igp$eQ#)BaS@Y=UV;LNntggNI&e=y(cN)r9(2U{~^TF zyG>@#fPI2hz9S+rg!U~sHssDYMMK=RnNxUx0d@|;%G8!Qfl2lF z`D<0pA7CQ3BID(req-JK{sC-RwU^Jj!f{8Jv$y4GF=iHdRPF|8;!EB0sTv11<5lm z1gK(%`>?PT^8q(@BJlsbUe@`ktb>CRr#DKwsgP3kEG~Sf_?pXeebWhi$xru@7f1q# z^dk;|8Dn?|JK0+}6lntXc(X8ve{TSLX|WK6=QLSd{#LZCex|)Be-J(k*Ez^iOi~i7 zx3;!)M6AZax8m`W*w9V1fBA2(VDYMvlYo)Tw)|WMA0I{L4@A0<=J24ctDBMB% z!*mO23edd`MiQeU7~i+|{m$AcU!>o9sW%JAX@Z^g8Rq%9>X~=g{*~cQL6SVKCiNM8 zQi!<62(0>N|72ve@38$lCJ!Z$e{i0LX07_^iwU3t%xbum&$6yoSft%VTDH9yNkoY1 zc2jyN`WuV$j%Y+KhAhGP^Q^;9!5qIa2YbMN$36Uq=$OZeJ4A)o=v8&G)@~4~zEww~Up*}ixV1cFQ;*qdZoQl3%O z%X`Q20T?oLU+L1 z8s55jTnY?$x%M+FrzFiL+Ow^UTi=)l1O&l*9d>Eh{fHlNXQ zFo69}l<9`YKH!ly7$CmU$vxmpDyS|59bWzyQ$D)_M-ZsbV;DH(!}`KwS^f{einb$L zUy%EZA;{p@9%xX+7OkoR<(PEXIvI{{;^w^zA>7D-rHAhpsM2!?K>`&+znuOO&ANWE z{OoGn8C`#M@&QMqe@bw#KmXu8x4!n$!iJ<_{dV+fDISxPfy~g09f{G`=gYic_vK?j zmm2Hddki{tSV0^SX$%PDs=pc-~My9Z(kf*VcRdZZ61Ef zWa%vz!MQj-bgrum7a_j)^$MFuKWGk^!+O(l$OX$O;Q;3(c$0%W-}IeW=||)YKPvqU zQk5FQ6ko&5It=dG@9inq-~{I6JKg8CcX?fiFJ$+sW6*p@xib~|a~1-8GU1UG`OGS+dc6T`YYebHXoFbv5 zaQTHftr}_^((G>Ne9^66V{pB~hnr?S8eOFYM-Qx6qaqh#eATvW2LggGYOJMAD zClagrmW4qMWAU|=p~tnAD9&Jx=qcqwD5ea!R_r$t$VN)Fj$lII@W$cKFZH2E^P<_u zS>B}`It$J(+(zn3XW&QcE#RmcrG7*>QLi=0D1#DwMM~4>T7{q>)=O zkT%%JS~J{X%hIgp+~HG9&tQ^da6W~~?03ChEfSzFcL4^2EehoKbgJ|I`H3v?S8vuo zH23P25UN0*p)Oo{4D4dVu$1iy7!gs16o|MOX$;d>G|dS zpC5oz_8NTASX&^G(%a^wwiO+4bBVasJhBE=O z%V+guErAS1aG5u+v#0rAzXPu%M3ek_Um2ejSVmR^xtasFCP|;~;D@VlwXJB?81ICu zhw6dLflYt&*KIM1h0r0H^HQ&OX(=Y*GP>gWmpr0Ot0e>VnzMm%HwzMoQLX$n7SyOV z0GL9=zw>h&%=1$h+Zvm`$H!4pWoI)8{`XYHDAb*tm6%=`Qu-+NMMK3Ff9Uz3h%`r}jAR|8Ny|%BMCB4lvkEkdzLjJ-lv{dvn?(2{8{z86Z5yLQCF)CagYN`yWy+6 z`Lmk=gQ}AOJ>RR%-5Ww&%neo!NGcW478TtBku)R@gB7Dp7gJcR93#xGW7tl8zZg32 zNj6{T?kbqDgLY4&xkt9Gc((ibZQf@bA$tfa|1j@eCz#?dknyTiZ<^f)%RfzHAF~33 zQN~s;!0T70<3oSd8hK2J7-|SSG=g`vt&v>Oww5ZcJ`187M8|;caYX35=NpuK;GJGv z(gjDIjw8l|OwTryGpf=Zjwc^Qx$oR?oUivY%CX42xaKHjOD3H;91LoIGWXIU@sSBU zjACgCoDMd?T#z`G2E_m^Da%3%ui_ah>J`3d*0~N0efHP~?8TEN6V(&e+h(sTACaYz z4@20tA$c?ixK!ov>Fn@kl!0=vrZ;PjJHS8hcB#zc57d{E#sT@;+yBI=TM2O&h%}&Q z6s)^NHuLLCT2FLTw!~Z{?-oh`c@B1FUGc-u2N+Z&s2-2O>DIE$(cS;V@pma!= z)F36@Lzi@SOGtxsJeT+9`+NQYUYxn-?7i38Yp>1xR_4UHmU@Ifc5hk3gdx#4i#hk= zLGkvDVA0l>7mrchbF{_o8&UPhuc6sbZMn1Gv9qG|PGfZ%i!ski*vzr(PE&f?U6%!} zG-$Mgy|O`m1PkBnEr_XAX=m|%PttGGHn<5hhR<(t-Tzh6+M7jWPBvBws6y>FD1WMZ6d z%@m6e*P z1s4TGk>77`k4_$cr7zblY_ykkwrR8yCHubqCkrf1pJSbbQEsFuGsuEv$Nql9Wb?yRRE+t(ds#oG(L6LwhGUEmiFI70CC46?lXNa3v> z!rr})xv;wyZ#wf_Z&+98V{gQ|!q!ZtkHEtr+QU$GO)ZIt9s&I`@WnG86WuwGK>=SA z{(gVtYgDU~jFxO=^W|w4J+IbkaOmsu%=%8XXE)_1ag=z}LM`#@m+-mv{fpcjCw%Sy zIG&uy({i)EekAWkPR@$?;2)@R`J(SycvyR|evoQ-LAFtNWkjV~y!O@Y`l;pe|G+J9 zvbHWn0%=ubRFmVd=BXAiRq38tO*io6*s|m z9-zKL?%p&02kmxAT)z;Z!LvnIDa>+6pwqNo_r@Qb0h?{j`wnFX2eJt&9xJK9JR6ZC z7K5+EW6wFjT9A5OM)2P9{`abhy`cAXrqJ5=NC`*&vc(&rOuysXAPM%Ku-CY2C-|V; z7%S=Hp7ir^{`?IcQ%T8h?Q@nZ=grj`F_Rp%@! z4&9op_GJ`JmFrNPv|P_;oSky+n5x!|86(}Xd1=nC1}FMLRJa^>Pbq#*HrSjNT^(|`!L z$R=C{{3T{2-nP=Tu3mS1|K8KfP83EwEGZe!@7)5g)XYN+zIGK!<#(a{rSXaohyn(w zIqaTYcFtr+wc7Fb+;4NHLD8a8hGKMC&1m>l*Z%t`8Xm6ydN8xT=dn2cA`id>kMZNj zY~Nku-a^$K7+5IFHOca#XwnTucsT#|>rCTjys68MB1TN&W-hD$wE`<-5H4&Osjs-E z#aX#u<{EM7`j8`&=&9jzTk&BMK^ZlAH}Qft(f3p=6Nu0rO2YF1Ims6mQpF?(>7Kvc z#{I)W3mu&_*xhb~iV@dkP=JBT4{wDlsem?MY2J6N+Zt`KdC4X6Zq&>I4XqNgkunr3 zXN6l2meM95kwQNoQ`pS~7>B}2<$Ywo?*!F~(f>vckW)qHEtnjccGHIrxv9oRWa8r=uS5|NHc zU^3Dta_ab6#O34oy%?R0Ns@CAA_zBpQttgj+2z&h&4iFoyw_0c62Lb!W@(+RA{R zB-_lIIy)XNmYbb9eyQK&Bqg76sKnCI=&xPZU9aN+4MYru9dGxNO-nEBaRc#y0JhqueZ)RLx0cfV0Sr6*rwZF zN;~fR0mwMoCXw2?=Hs$7?(9BowM0k|jzfUn(&LFINDh8qx*2G56bKpnj-`L9vq|~6 zj@2Uex5`z*GW#!Q41w`FACm- z8`cq;JF`m#{V%d;sWsjRmV6>xZi@KOP|gsZz+y<1tB>(0p?6nXEd=p}F3&9K>|oSX zXj#NO)QSPC%m&=Md(0hW3;O;RJZ6-h>}}AMmf49q@(3J64}82Y$uu6?q^op%_)K2M z+kcAlA4*SI%ndvZ=P#n(rU$Jh*-jc?u5#Qqc>Xy`HwhMgQ!<41RVN7x#KG(_3s1mB zMJx)Tp%xD(Jt$FMF|UiWS_2(kW_`wl(dRR>IjZX6=Vcb9f3>%co4=W z`xXX?4rzAP!^EYGZvvh}SW(MmKd^-d3dtXfPCJc@g@rO=qfGn~&s!&S`S7EN`5J=g z?f8==6ZbDHIq0j$XZ45Lo+n=C7~_2B)=Vz}GAn-RUA6z8rjO-q67(__2|&Yz){TJ$ z{}r{Ai~Rr70)*_(*5!G%q0WPD+L`-Boz(`0b<@d?2D2O?LXIQ27${fVSKOn4 z-8&gP!X9>AL`}&fkKBeW(L#NVW_7_IeR(q&=C#ble&E{k{&-dF6?uFc2cqZ5Ge811 z-rcjwjBl%oi!~o>$j=rf<~aT^$Y*I45@?6a%|otkt>=nzBEp@?G#a!M$E7rJkVa6d z_urS8cG?E=A2b@UI~dPL(%rA<0uj{L?-a3xe>T*bGhrEkfrP!q;fOYf=%rI+)6ZAF z?i-ned?@s@;lJ7!+a?(d(3?QtGrv(YUP7GvVV6jv9*_upVf=V2a_hvCR@8Qal0g5r z=yw4O`*v?mgT*NJ*vdA|f)smbNH@I1ofNl7siFi=BMiDasD!~C;#N{(Ii&hIv?c&p zq~UYxLaM!EVhPg6VZ(xIf@O7Czs+^M(ONm4!xr^h(PHD8bznjcHtwgG+`Jh80Gzh@Vb}H#Xnz_UE5`;`OWWp?c1sROtZyU`!lr-sS+S+%VUTGH1?tZ{ zuH!40v}*3~3Q6BxfYG0y)tNy~P#7PdKEBJUra|b(z;On72x_&sVt$1Lm0$Db-atmn zpOJbx(38QPYj~EegMT>P;Pgzf=gz9rNMv!@=a&_iNXm+k3G~Tt3aUL_zPv3l_gaui z`(yE66pefWTk{T_N-HkcjbQXZ{y4S|sK7_mRCP>r2)<%YNxwY5jBNz{0{**8r%sIR@j8K3P4Xsx(3$l00&Ml1D4kFj0) z=hL<=8Q(1}y6p!4MIEdkd`y%e_YxkVxFw5)8G;Q$`zR1qVQ9<`1@Eqs7zDQVg)zRS z*f4&-$9Hg6ijrx+y)xgwHT1+$p>pgCMFLx*5;XF1=Ym}RG|tiDCqUP{KD9uYJhy)O zLILbz_Tha`+Wb}}tggWxy!KJ1Is(1S;YHh)%1;7$Ex0brQ7!xN-B%J`^7Yo|EaB3CKJQk=J6#bSbVcmc#}@& z^BCVvS7=F8Y55kWG?jJAU*RL99{X775>#^*LS7x)sg1(_JZieuS>ANpgtdoAl~=dw(4CJ@JS3c91GFr8(eS$6gv+qh3-RlgJi%4E7E^-%`a_0#gBBCGmWli-RSY4GuD(3UN?MO zxb?qIMILQE4(fC6o^K8N)VDtTl3&WWU7XhFQhNUy4y9`%6uvPr{aB0LmkiDgF09;S z8tX|qGQs3Ei*H2fLu~H|#cGfmv^7a|5-Vp+bRy0d)GzmO58Djx;%y%3O2{SVGBL_m z-PnEWM87AUeD8=EAiNl&JOTLQX*I#Uul#Y;8Jq5n!zSF&F3lNrPa*k~>L2)NK=|3M zhfmH#EA!Gb18Z(bB2qIQyu28He1%r-GI7)INx@VllazxO9+U6ZoYw@xvqxK=iY@d5J|imA+akz-hEmC!?sf3qP`jE3kt0EsQz*V55*9 znN@6mp94^F(6St`&=^(`qhcI_I&fX4;S)l_0ivS*{h9=Wu;V-`u`^AX+_Lvdd{)gn z-jb3U$|h6X_(k_7oca8%i;aEXg9-M=e;s(q_s=~6U4mfb3SS)3OFsO^Dj$V~F~(>Q zOuY(McYS^R&b|r6d2RpUyi5wdm64`zSgB@7r;BpI;EQ%DNz+@}93r!M%~q6+Xw%=W9|sa1Pga=IUGT8r*}n-kJrw$ajT-P4sq02uBCB!} zJBB_>hCL=$Nx8N2)vq*{Y|(SzX!)yy6b90*VKUE$!qPW>pwzj(prpBEb56+M6ExEZ zj%OcRK&tITl~n+3-vZ5;I-Cx4=R4qGhD={T)sfzfX6a3%@pH*739}YN3e}0N&T&Uq zLv)|19VYAX>}EY1eUH`Vgsi-Lbnb{C@rK?Pa!t#8=6c%Q0MOx{k5CUZUVF~L-q%(Ts_m7Hte!nrF z?@S(z){4B`*ab6)`+s+zw2~|>JHj#NteX~8pg4_}C)c|B+-=BT*BCk!f?o0&rB_D! zCs$38NhB>aHU7^s;+ogxLuB$-c1)EOBqeX$uDu+HsU`5gQFh4lmCj&ydBN^kc2|rv zFGx@n(Zc7yyDECSRi#>0VNp{UXTQm!0CoT=J)i{d3$D&hik|NBzCAuVuy}DU-co!K z=c9#PeQ-e`;_Yp4k(7ChGDRiCTjAn&T70{G0~1G9DQT|lL9)O$o(_cgy?SDt1Z_l~ zL76mw*{HQmtJnl;Ki5oGOlXuaS{XIm@v1vSG8m9R{4H#zIrMu^MNo451h2OqxJH_r zvq8B0DA9Bjg8j8+5rFy~8PQ%dPn=pks%i4a@$tD0nMvdxzPxa4;mf|-HC2$n;Ce_k zOqIs*Jl+C-#n2%c2n-(#BJ@(6sig$mx?q=0?nTcU`_jx;$g2gH&}(f~-`nIx%$Avv zrKSF@@h3Dn<(1;f+{5gCl=L=TvLv(6ZwixRRZ|svlqWQtdf*9I7R+=r@MHMxNx{^GX z8gB2s<7m|f@OrW%7kueK;fg0kpun9VD}pvR0rE5_U!*s$dM79|Q*mS@C%${!fDf9cy-qE~_d+L3b%wfZz19iG=ddS$!u=nipV zec-5XKtADn?lPBO?4-tpNN3=5Pdd{#sq9}*at`?st<1$(e@t|H%6C+-3u2wk%U=!9 z`Di$XYx5csFG6}w?+o1xbLFITfQG514e>>-CX*0vRVJKL&4f)Lv7@bL^(35rXOc~n ziwk7{U`2X`?;q=Jgl;YnjfGN&F8aI!GX4$NMwvAHxFd9aIo4I4rlU(&`Pc{?bKwQy z>z~KOR?;?MIyB34_}5fPhTUnRokj2Z8c>hSM=~c(>L~iuJqO&RT_u z8`QfexK-wOVq_%&PME-eL%RztpcK4fN_}HEZ*=k+rUM;L8`+>tRScn{m2+P@rk`f; zI;H~VZffYg z_vSEg7$<;`f}N29XT`x#*P`4?bW37G5$i;{>qka07<6TZ(&>eSD4#;&an!Turf)1W zKLNp_uClH*6Eo`pr(Lm6`4VDgccvzDPBPku0R_k_dcTGKDem{@Qa~wQ78T5=V!k zdtvm27e}zGFA8o+V|VW@yl#m{_)^?LZrG0u1Js>Jr!2NK>1al}my3sV6!Bp%sEw$Y zsobH#lG@ik6UKS%y{2HKRP0WyDjcc_7JCiNX$B{sU zYFffXm!FNVKKr;V{%;+ih@C@{(J{jih#(PzeNCkBGwE8Agruq#8A z26oqj=)?U<5yr$6HX%5(Irl3aIvIPd2h9b4dGZ6eCo;S+TTzY}VKS%PNmY)W4FsUs zml8@8hDE4Ns6O(xRET|CSFx{isT3nVnx;oVfqf9`nzt*)Nxo~tqLU2UD352eQ@U>c zz(IMevLkPVd)drfn`RasG50XAeGAo35@GlFF^VTCng2~U);0>u@Y78|8I8bo9^f7j z@$j!&!oL+x@6*xJ9=X~V)cQo3?e+yB$wPBj+Z$WIK5ze1yL}u3-|oD?BW8zy+=l+Y zxGe|IsRWl?vOEGAs4AHRi;k36`-GIkJq3eQ($U+d^PTgaqhMxx;zr-)mGNFCP8&IK zL*>2mo$>LLO`}+Zq+qSze~)n13ifQ=PQ2pq=056sEs^OB5>%e2*#aI5`reYc|M}=O z@ruWb=1{(`>>6lG&Zq1Acow|{wYL>oR|hS(DGKgv!gkOz3WFZFAFVS3(;BDF%X^ZP zDpEIXzXXv&^nnZ$11fxAIBfgs!*WecOrMY+ezNu@B^3OA%0BA>JzjTt_MvM&qDr9g z?lWA-kX9Q(W1XqeW3W=(3e%btTAU6nAX+3|Qkj`m6T(F}7y8_1T~}(n7Ns7(Zf{|0 zSzB2LgRS{@98i~LQ{!ibrhN^C>BsS|AiJ;pzn+FjG=_IE%*OW50_o#9g6@kt4>VDYTQWA zDV^mM)DtjZF zs^hNtCZ>F}(~pbS;$>Sf@)$hs+CuiD?JGqyksTU#6f8eRfQ>Ao#rC)eC0s>zZ?1Kc z2c*+qd&g}RqHcHyyz>2*d8k+j2U8jO{k1UxkgCB?WqqtPShg5}%<4C{@{k9p;jIOAotOV?PVC3=vk(rC zW}pjGd*_>j-uEkmH6nEi6b7^iMR5JaPy#AB$`UMKprge$T|Ca~zQIXOd419<%s7gL zuMdaf7ugpP2;-~t5DO8^EYC6ue$!+F{aDo?dCdzKBf^XYXYrXWmq24i&}!0LPC_`y z5KW$B=6;1Uv(<$NN`D2ePr|SN811>YC-esR@q3g3B?C{uF~82wPUx-@q{@;(0nFF0 z?)9=>w5sFyU>*ClP>CVuNdYejLO$Q56J9m@j+A}A`Z#qx)o<=MNP;hZKru>*1R&uj z5%S^ZO3ZStn3l9TRI0}$Nf|WZ&sqFgAT#-dc`<{umyPNHJ+v3+Tn}sUvbl+-^NOeU z=%WINHCH)Y8L>^IGLcK|&H{I8m8xkM>S^R~css%w$QY=v{87L#(0~D_LwqR-=2yy& znxRRC->BC?1BIZ);q#zt@#oen^1*6+q@G;E{?tR9iK=ZZBJEMi( zF5vVrd)=mh<|yw1;a(A6R^J8H2Kl%>FT_DTqZ>~iQ}G9Q_^e9678m{FUw=eM{6zSw z&Dd&DJ{CK1KyXUriTY=qJs=uRUVU`^=iZ$J_wMG?xXu~^3gg89>yp?n6ktD`f+z(C zugq~;u)c0{kAGERaR0VM>DA7S}&x_ScFyyDtw;!bCO|7a|lozK2;G^=DQLoJ>jYD=QJ`tzPP-LE`I3v;AxcMnVVW4MF``p*KN zZeDuNJ&$yafNDWj+T}aavPNWVSiES%1C+h8{7iZ{Xyq*ZKkK*^p6LKg^Xa`1xt2CeFp-1>>z-udE-jWn%QxZo8^xJ}=LXwq(3CT2Xf(eU*B^UmVzOiQuemy~dq&ua?$4 zzN@tY8s#nNZ`%kU?^#T%b%#!5&Ek|_m6+5C$DH((*ickE`R0whMkv3ems6gFF4(#= zQ7{t9+2bm*>g#5rZAR(M&K+;)=fINyi^{_RO3~EYEyGweYBW*$EE-WF(WiiDg$(ON zA*huQn5b|=IMo!8 z%HnX>Cej_E-|z0^21=PQHwPs64EJL4!YKG(VEXkXspzofh!N`$R|~Sh4|ZzYj9!Z= z{I4Xl{A&v;41+&A8DP-pV5)m-5-Rp*LfCB7VpoNm-P-{lY%oc&u09drEdwq|h zV*Ol{iIX7tVRe}U*!Jv!q)k;K`i4DCuY$rsMUM*^t(CshA@lwxsee=e4o`X>`v9t8 zd6ie&76Z6K}(?;2J4$(2qgT`S8W_~>c25y?S8_oYe*6ADl> zMkz3xilOIm9f;EBoKaiY@_*5@qj-DQGQ@GweE!AlH1cuzP=0eWHww5*^Hu0jc_Z>+ zaI1^%Op)hWfdETbC;^S1{!wpXZ*}w-sMko}5!{i5)l#%A#=H{}k=+p7wEz%7VQIM# zWKnZbewJaMAJX!A#X0A+9=qIfmNeD2>BAhoWuGl@@ysDGUYZqGpls_K2j6=d6HN!= z-=uVTxrUhgW)g>*en))%_iTdo7BL`)9DfCN-m$pg!%z!w>x$2YdC)9`I_M{p2y0bE z{t7MVu+xrW#G}0{s(v8!O0^plaN*~nNy(4nFI2f~z4r0q(rNv7bX%sDl_@x>C9_O2 zj*lY_vZavu{+8$WV+AU4oCuUOGKr}6LF5l&JO^ep@>pjQmD4sWgD1e;` zOTRUSWLVN$js?kyZE&QACnP0pc3b)CJ10_alEc8 zw0P3f<0Bq6BHi3{i2(1O_q~UEdndz9>j88M;A-2m^;8wlFZ&$G1w(@WPYZBYX{%+A zZ2DG`U3@o9HT}KhQ6!^h2*X7aEmwub=h!XEwBJ`??k)Z(H#&6`-+sL6;N}Go0^lkL zrf;*%WHiz4dn!B9^G4U^jddF?U>UuEHs~jZ4>;wi1+zOFWTWMtMx(y)AoO-Hk@1h6_ED#ZNc(W zls|NZsjSuXyXVh&=0m32-!5QV+RE<8QZ|va^OqK`kBt# zo4JRJH?MiXdPHcXTJVWN`*&B|`IeN_Y%(kh>+y;)Z2?jHfPUMSHRBOS7kMUlOBBj;xQ>3OXKh9)!ItS>{ZH2L+AGT`+GCCyZJB#Q< z6_d>P5WuOYOjzF-8$YHPAn%G=WmjoJllLP`*5Fz;{VMBr(A9qaAQ{hYg#~#@TfX5d zu<;zF*MJo{G>X|Xyq9Wadl5_=F`@SEh>A^!**637rhYI)a`v2;?HQ9MEq#dMFfa|N>kIC8v7+aH^GuXK)S8p zk=s1gEne?E0sKO|s&+^J>Bn4g>0qCr9!&)%&vBRUhk*>FhJ@#{HMyg78vhjV7oHf0 z?dXF8Sa9O&L{Vuk!C6~(Wx=^U=Kcv2W?J>|`|o<1pT7fs00QUzK`-R&W1-;Tz-;BD zmi|c~$Oqs+`>g{dzbTZ8%q-&sX^EObIe(}-M5J+!<3Fob`9^x$!ngTrG?!}d_uB$i zz#-&U6jYVdv=d7JpBvNi^SQPUN~ss;m}xh*1n$7i3GuwTB|i=YEHp>)faj8PV#$Tb z9sQaY&H@7823;Nh-cGyc3ZNj_eRD~3ZqUhrPooTQfLgf&v0nYubqxBNM?k*olT@5a zBY*Z7Ib$I!dn%~M4A1KL(yqrX%n)*)PHnZPL1Pc`V4sHjc3tK?_{J}~>pz7VZAIyQ z_M7N$!2%H;2cl7oSP^*2gpd``Xn1-*#>adu-pQU81uGZgPz^p&y4-u^Xmx<%P_)Bp zXWfMZNDnS@IZVxbP;LSz!`soF6l6f3RE|geb3^YoxH7cPWM;jr#&7k@G@7gD9k{=G z8!>lPW2OWVWdlL4qg617{!C(n8YTSp>bqPRX~PYc>bPZ!iJSFllIY-jCoyEIDEEo` zF-C{=1t41Z@Qj)3xVH;H1yu%0UxK_Ke1k48Y2}22nk;ojmxHY{3GrT26ykUlP*zeP zwC7t-45g;*k)0@DHskf2vS4T+?6P$$bYZz|Bb^*0rTy#G5;bcxDIbpy3a-~qCy9#H zozXa}qIb>f1r%j0suK4Fou;p2O+ug?$&s8IG!t2@XUJjwq_+(v3#Q)U!elo!=ohEvbqNWaof`Iha!FQ1m$<_l9-te_>@G+ zU%iYTid=bT9rGMD5`*2^^ohKYb8F3t;+-__xi^TLrwX#4YwF?G}^LVH`|X%=U+2kAeewiw2=-M^{3jUIoL(rBSNtFp*u`fM~bY` zj93qhL}5&0((!ka@jL^P4xldOvTi3@-@=x%g$$AGCb33RxP-ofH?Bwzj}mbXer}WE;#Ezn=&4nD_R_5#q(@%ccnSMtSa>kRcj(&$UpvVxP*XrlFmg(nm zo@vOr7~_sf#i73i%fsB{h-F;nt&o&7R3!nkh{Jw;tJgv1K-A|E7c|>>*jy|X=-_T9 zq7qYNH&;7R8ubw6XY~=b^D@UtOMqVZcVy@DJ=xn$7ildF2OiiPM8w0@6l&J2zh;uv zlZU(??Du|QZ|E*PQIk6$cbzU+_?unJE*>J+97{!?GDK` zT+ECUIHG@xoD^0Z2mN>4nos|xxx~_=-GxY%Z~N`loxwP9vWes-FR>7N?n>W3sQR`# z=CWpqqU&L*9aCUU{%RP!uVURtxakQjQ!G?2fO(^*D8FGRj~`K$TsZ!y6(#*t;&TOsayq{5 zGjGbrT*P%|qe~}AMV|Y7?Blp=CDsCZu?N%`MPA}^5WuXgLf2n2clOYrt3Zsl2x?>5dD$;jMN>7((9)<9m_>bHqct;kQhGRR&z6 z)O#H*O{K*@FcGCiac~*Xez8vLKBCK)-?RR6F^y>*O3x|jpAF}nAn;+GCA(G>_BEXU zwp!OJ>;?}N#L8l(5(x;!+)dF?Kl;-obn_=du{Fr}o9IV4|FR?VdUs-Q6pjL)sQP|& z#QpcaDjA3Zbl8XZ3qZz(uyFmi<@TaN?#20!29KPE=KW+>o+y2D{^-K^+3DYhxS5Ae z=)UM#TJ^r}g(b2%?!-oRm^(4bkuLhfwqAGomqtoPC>9JLJ9K}XZ{{z1F&GC@?Cv2!@@VY`4?1h#@! zqB&_PK;TD=h)c8j}Hn#jIltxaYgfXXvgbr{XR4|zHItrY14^< z=*U;c3}FHAVnX5-w1=e?MZFz#%^K(PP-)oelC?4WE(>o)xJ`FKlLk~LpvwtVGZZ^$8 zTC;?AOI;>n)^u%!+7)azQQI0C31gw7ZV-VjVFnTPJ*6*T@`#|&;l&xTPqm}T86s?} z?90pki*;P7HXgtM-pfpkqf?H%EeP}p0B#Of(K2R8=b}CS3@oXvVE^k&z49Gg{N*|s zb{>CeS?)jxYd*a?wMbi%g7dYx&j`N?jQDCZoG=@WwDG?X|Q8m+Xds%2t z;2gHiEyvy2nOhCR$@rdRS{$jwg$pBD(Wrn~W11HJ3^urV;HA~Ga=Hq7OhJ}#^K^|# zb$y+$+YfNt&>({@k01q=IthgfqT+l1&3wZC?v6}K_rnB2^A?+i+?6`0s9mAcszeTy zaURP`a)ZyT9;}TdhgzJKGSQS;_nRQNhM&M|GhaL33c*Qq-vH2YEXv|7!DtrUer*D` z+{Tjf4vJuO&l%R5>1)ZQCc{dgi&h}d@IOOLVKr;G5OKOr#z=NGHs+jr%Q}WqMFVYrN$G*vr`e z0N=*xB?C+}h%Jqzkzy{zHJgCmR_5`8Q@-cS%|)$o$T^eKFAoyF-dOvSXU1*ivB!!* z6}}k9+Sb<668NcS4L2S&f43_8jKuTLU4fK=avm zI=@vSq*#lmGJPj8j$w!gyi#3Js-iolrwzM#LFZ?ktjaU&LZ&*TUr{)R^8*)n^yStt14Cgc&GmYehQgL zDW%ETSC=pNo+d1(h}*If)#>*VG3}ykXL30ta{9)A-&uH+-X9gzOuw0R*QU%IpJACyWi4n+tWL68@KMIN6g!$d6)QN zQ&zONSwz@M>ERg;urV(p%y-aM%y4^;GEUL$fC5Xy!|I>r&$(R(0Q}EA8Jj}D$gAVT z3-_zPPX|f&y!--o5}io*j%g%`;PjrLS(W52(Pa^COXgh6r8f%YQIYW67=i?=IsaUrNu)_7UVjvS+d)nAz`uo_BW|w+Ky&n1MQ0CRma_ z=`hJjNPa$=$gjWawPJWo8^iQDN(4>GR!^Eu`RN{m3it*~5fz_3u9tw9qAud8dZPzX zotZ)XclYNLB2$ZkPT<_SZFeXMT3wBm)84RfCOD%vl18e|u8G8}PZJ_Rw4adUAMDYt z*@W3!48PX3b_O{+*__BTEA53`;vzat$0tNRqACTLvPDBNBr}GOu|;lf!L{ul)d9a1 z^hkM}>5l^nKzoAs-#vMu3dx#u34TYaROh#w)q|VtV7kmxr;sPM$gDd8uBxD_-TT1b z^*0#n)dKNVJw+Htz}oAIv(XWG|9`x8adPM+0J9q{UP)fR*y7 zEsTvQP1_=Cx7{@ruJ>m4v2h>za5+Z^AsRU=anucxlh=gabpqT%m#Y4LVDM)(Xm8`m zp)Jt1<%a-x#9F1PBC7ujF+G_YOo%W%p^9qwwHx?`p3(Y&R`SaNH#)!eyB)|?g%<3> zj8J2YpxcQBpZeKUrDS1vSt3M`Jy~yJjb*i7Jz@E!(&+QrhF@yPs!5V2n)f7sQxmsG zG0Ee`rjQ`B-ohDF#ZK_K>2B~@F@n#^hy|CDDxHjN{&^(;UMTW+5qTuj0Cm5>e?M5& zDK{3dWaxb4*x}VgwVdb4RttT_IN^hj1~?UqASV^})4PpXioLl18amXEem}`C^jnCO z(Y?F4%&P2Cr5Ktk`I-PBD=OWtcyT-Yj@K8Ljot{|;R6UQqD&cZ&y*t%*%I|5f7}Bk zZro?2xdvI|u@D6bu9;7?DVRc26p;?9@j5WQ-J=Pmsr+>VKL*IeahS?sNFAPqXH zzW1XN2P~e$wf$t@g1cI;pXRLbBTC#P_V6{Y(gB7)97!jIRFW<9h+2KkD$5}7)`!5F zP$p}$PZHyb(gRYj1@a||kQI~l)@$LoUv^g$^GvwHUgMRlPDk9%7o0C2z3X<7?z`S9 z=(#uP?@S*4e()-i1=t8=9B#lPhH~WN$GDqbrl8m?VP+j76+HZT%u^p4^3sC5SlfRR z%X}YV)Z_+~G!xX>P(YZnOnaFmes6X)_OQF#vZx`QQvnz4e-`;QQlm{4$c1(K!jLar zE6>7KbP8P!e-)LgTl<6mF%3|PdSoD~=zH!lOmK0V*!{s7`|WKAltqyTZ}gn0eAJ~Q zDK8(*sJx(aI56m@{0i!meHOSv5abm`5jIS^ZTpVr&ipsoXzXB{lF6kBz;N~a<5pPu-6X29P)W#PZftp$@tc@69f&cDx%Bp`sLz@g^ELI`!(~H@4&oEN zd3X~fW`=44eyeD89Zf$={{0a(p3g}sn~mA>NNoJ{4p9@+1julVd65ZG*maBHA7s|# zAx#Aca;)!}6)s}MB2~z$j@TD!uj@Xly89`5#uo}aV@3nW_VX(^l5kmYBzS>n(voCm z!Pe_k!qTSg$eb%fae741i6FM>y(8G8YsyVfPc%Beo>OJO`Fq^fC=>uROS6l}OmfUYf^x zz};!494a>QD;3xwGcZ6r(-&B2Rt+OV#zGFQr>&ScYw&abG!osEw-vSYHyK{Kq)eT= z+JGjy0c820>!W*2!Ws7mAh0Hnjq&x2I;ZwbN}feA`fjzLlj?Yo5daJ1r8a}a7FwtC zbZ585hekhM^Ofa?0T+3`XLGg~AlhsXKGz**`f-U0dqd4DVSwdEU>n*=%6L>t@1gbP zx-@P_IO@jRv-ihr!esM)vk$Wb@r-x&a& z@1XS$l~HNPT`zIT{ew?Ib^U?QIL$n*RbJb3>ag&%OGQ$bA9=4Y^MEZEqTC) z3F|ijDV^ubqmx}E#e$IsO%&sJAXfvT4V|C+J|*j&4Pa^D6Ux%k?Rd;LOyNdYhV474 zdF|&2C!g1d9rcO2x<=D;%4P=uPmzt4>yB*iK9%4t8B5Jq>SmGhE3W!|I$cS*p0Q(| z;?nvjn8hoshkm4>srUD3SJOrLCFj$nJTZ+0NtG&)0*Owc^c`Bp6M07z1=;@8AmeW$ zb*2sGH!021T3bu7U%tv733@OD>Vo@@-C*DMG(b1Z`5sZe^xhQ zDlwO$PK5$GFqA!uT@rc^~#R14h4>1 z$m>tI8rksY{;2u{Ke~m#HkZj&EiIL;?_mQ%F~1-Ik{cAZU5>FWGlGq~sSMMuMkmr2 za&{;x7HDU>2ncXkh-XX&`;e-9!03I{cJS0SN795F&6P-B#pos6Qau1-_vxCR5nVfk)%^gzRR(~IqmYGIk zSkZwdlUY_CcgODT&zL22Vw6OIlHme9caKxdj^9b#@6#rR7`-&%4+yQ1n4CGe){*B9 zHvCoaB9b(7NKMLpTu6`nWzHj>W%&Pi`s%nUyI|{wMnFOY3>p-qBqR@|97O2`X$7RD z4~Gs>;1Gg{ptOL5ba%HP-Q98M?)WzEz4!aipNj5h@0m4gX0O@fk?UmL8B*yw;hsN0 z?U9itew4}Xz~ZAuF!(AV*%RYHV|Da;QZyG+{k@UQogB%F83KKRc2!n!zjog8vp-pt z)mK{MKr}Hq%2IzB#&n_7vBud>QZWTe27G zV22bQoTST$c@K?wdo&|t`cw?cyKi--D<{}6{VzASBlNMZysDn5;h$}=opBzXzK%1h zOq~oFH?2iuuT{!oG%DX-_ue|T!=N)_AqPGzq1t|j_3E~fuum9;c5d$ZYhB$TmU5>Z z+>}ETo#kIay%rngQ-9PEmWdMT=+l~@4_rcUGwbt`m&HfXvAyekf0m9w zP1alm{s5cqWiF8_ueo~)m1S7?RKGZ_2t>mj*y@7QKIWw9BAb7_c3v5CNPfri_{VTh z3@8{@PJI<3>rKx;#5*_`^$-*7K^)+0&e4d4@N#!qt z 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 H4gLNPFkuo< literal 0 HcmV?d00001 diff --git a/pygad_logo/pygad_icon_256.png b/pygad_logo/pygad_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..48207f850bca690b906cab82d2f9cdec5f9005b2 GIT binary patch literal 21954 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 NlIP}xBqNDl9H6MA9dP1Oah=> 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

36fkk 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

ZVyMRQUr~1u0r($7^fD_k0$zeI?%0RY=(Y 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 literal 0 HcmV?d00001 diff --git a/pygad_logo/pygad_logo.svg b/pygad_logo/pygad_logo.svg new file mode 100644 index 0000000..32b3484 --- /dev/null +++ b/pygad_logo/pygad_logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pygad_logo/pygad_logo_4k.png b/pygad_logo/pygad_logo_4k.png new file mode 100644 index 0000000000000000000000000000000000000000..a22ee404499b94ccb028d095c622e692eaf0492b GIT binary patch literal 569136 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 z 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

Y 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 z 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

-o^e)eClG1_e%3F-m~|jFVnQFamxk9RmRVP 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

eq3KwlG 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

TQ{{VZxAH!yrgBbpb%gh9k#6ZrFz3fjiK8w0w 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 literal 0 HcmV?d00001 From d0f52f9b57d1382026cc262aef172664b5a4a6b8 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 3 Jun 2026 10:22:35 -0400 Subject: [PATCH 16/17] Fix issue https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/351 --- docs/source/gene_values.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/source/gene_values.md b/docs/source/gene_values.md index 58752a4..b604237 100644 --- a/docs/source/gene_values.md +++ b/docs/source/gene_values.md @@ -174,6 +174,19 @@ lambda solution,values: [val for val in values if val<5] The first parameter is the solution where the target gene exists. It is passed just in case you would like to compare the gene value with other genes. The second parameter is the list of candidate values for the gene. The objective of the lambda function is to filter the values and return only the valid values that are less than 5. +#### What does the `solution` parameter hold? + +The `solution` passed to the callable is **not** a fixed snapshot taken before the operation started. PyGAD processes the genes one at a time and writes each gene's chosen value back into the solution *in place* before moving on to the next gene. So the `solution` is updated incrementally, and the state it is in when a given gene's constraint runs depends on which genes were already processed in the current step: + +* The genes that were **already processed** in the current step hold their **updated** values (i.e. the value just selected for that gene). +* The genes that were **not processed yet** still hold their **previous** values: the values inherited from crossover (when mutating offspring) or the values originally sampled (when creating the initial population). + +When the genes are processed in index order (this is the case while creating the initial population and when using probability-based mutation via `mutation_probability`), this means that for the gene at index `i`, the entries `solution[:i]` already hold their updated values while `solution[i:]` still hold their previous values. + +This is exactly why dependent genes must be ordered so that a gene appears **after** the genes it depends on: by the time a later gene's constraint runs, the earlier genes it reads have already been finalized. See the note at the end of this section. + +> **Note:** The callable receives a copy of the solution, so modifying it inside the callable has no effect on the actual solution. Only the values returned from the callable are used. + A lambda function is used in this case but we can use a regular function: ```python From f3414aa846f3312db0b35c76e03474fe1a8a9f8c Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 3 Jun 2026 10:23:44 -0400 Subject: [PATCH 17/17] Fix issue --- docs/source/releases.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/source/releases.md b/docs/source/releases.md index 0f7d626..bc7bbde 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -668,11 +668,11 @@ Release Date ..., 2026 5. The `wheel_cumulative_probs()` method in the `pygad.parent_selection.ParentSelection` class is refactored to reduce its computational time. 6. Use `numpy.where()` to decide which the source parent of each gene within the `uniform_crossover()` method in the `utils/crossover.py` script. The same was already applied to the `scattered_crossover()` method. 7. Add tests for the following modules: - `nn` - `cnn` - `gacnn` - `kerasga` - `torchga` + `nn` + `cnn` + `gacnn` + `kerasga` + `torchga` 8. Fix a bug in the `visualize/plot.py` script where the `labels` parameter of `boxplot()` has been renamed `tick_labels` in Matplotlib. 9. Fix a bug where the `best_solutions_fitness` list (instance attribute to `pygad.GA`) has the fitness of the last generation duplicated when an early stop happens inside the `on_generation()` callback. This made its size incompatible with the `best_solutions` list. 10. The documentation is refactored to solve many language issues and the Furo theme is applied. For easy navigation, the index is reformatted to only show the main sections. At each page, its index is shown at the right side. A new theme toggle button to change theme between light and dark. @@ -699,3 +699,4 @@ Release Date ..., 2026 31. A new `Report` mixin in `pygad/utils/report.py` adds `ga_instance.generate_report(filename, ...)` to build a PDF report of the run. The report bundles a configuration table, a run-summary table, the best solution, and every applicable plot (auto-selected based on the run's properties: SOO vs MOO, number of objectives, `save_solutions`, `save_best_solutions`). The report uses `reportlab` and `matplotlib`, both available through the new optional dependency extra `pip install pygad[report]`. 32. A new example `examples/example_generate_report.py` shows how to build a PDF report after running a multi-objective GA. 33. The `pygad.md`, `releases.md`, `visualize.md`, and `utils.md` documentation pages were updated to reflect the new module layout, the renamed methods, the new `generate_report()` entry point, and the new NSGA-III instance attributes (`nsga3_num_divisions`, `nsga3_reference_points`). The "Other Instance Attributes & Methods" section in `pygad.md` is now grouped by area (Lifecycle, Population, Fitness, Parent Selection, NSGA-II, NSGA-III, Crossover, Mutation, Elitism, Gene Constraints, Saving) so each method or attribute appears under its topic. +34. Fix issue https://github.com/ahmedfgad/GeneticAlgorithmPython/issues/351 by updating the documentation to clarify what the `solution` has.

wwY0jnQ5j1THi)-aSiMs1aFLJub=J* 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 literal 0 HcmV?d00001 diff --git a/docs/source/figures/plot_population_diversity.png b/docs/source/figures/plot_population_diversity.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ce865dfa3cfafd1c7fa652d046f49c0df3b1b5 GIT binary patch literal 28236 zcmbrmcQ}`S|3CaDEwV#ouL>DuucVM!_TH40y|)lDBT+)g-m>@JL$-o(ecbo`$9)~gb@X}beV)$qHJ;DMdKL6cP68W~3=@SyVM{)FtbjtHv!PIEJy$Nl zPkt1{J%c~^?ZwpW6|J7zJL%gRqh$5%tu3tVEldrl9gS`6Osy>MvvRPr^082x*xOs% z@w2hL{LeR7t!!VgF^UhU!(FagKT)?sp>Xw)|D$C*NH;~HUY1KfeyHU9>Gy<_v(nIy zOB?$#vhhk+u72siC`uT(XSz zPE$aOddAuswpt-{{_*sOq|Zusx66g$6!WHO~9P$2H9VufNRtzSt9YSuzrCr9b>lpV_~K zjF9kxWF)(Oqn}i8Hp{D5ukfy4R~pripwQnERTiIQn?9yuipD%WJ-s31$|)DmZydE$ zVY`6&y!TVkk6g{Brlt#0sRSivL!xDt6C0;T>vMm1S6hTn$E@nO+MMRw-_quHxkYsx zMRYA#J2^?rwT5z7jIifulwgvQl5)GqhHqI{FmW6(=B zR=aF730!BQag(~8IeUjm0F@lTWzvT-Yz;v}eMwKBn{Mz``}!Q)^XNCv+RqZKcmb!< zzmw82tSxJ!Uz3JcH=7Bc>UGC*^qFuzk&|ofPm$oTniO>3Xt+F5W<~Y0%u07zNF_%N zO)`?&uf8*yIk=kjTVK+n{$w#Ml($N@n2gLd7}|~1{JPni{mCY$DUX1H0`_cOMM)PI z7yX~brYP^VHH*g*5{4&#cSj2JFL?g_b?e$q?woPMjI1=-xYuv#BxtFrKNmeJl$xk? zu=z92S6)$}?08#cw8UK1I6%blbqAI*ANEadmJO0Ef%R%%+y}>aXU9tqa!;k#y4dQP zbJV}$k&}lcdYzK~{#n9o-P00GvN`Ft{xExp*fkv9l!l23^QqA8_1?q>;auiF^nQI$ zwYIls*>Xwr*i#Q7=ledZCMSm@e0pG5eX=)pgV&mRZ+$BK{asCs-Abv>v9T(VDpuWE z@^25$1Sj3Md&uIeo!#7;;O9k61s@eM9}lF-G7DVGhEa#NpcZJ-rz^r5NPl`6wawlW z%V9_@Nq|EothKzmUb9aL6ZVnI9EIBdGtm@hReQBWBQ#gDjQC?YN(5%T(DAp1{rY50 z-!`*q9tJApCJ&BbTbP)c8I$M9?yy1~C47DK>x(%U=||$?mlnG}D6Y7TG=7ncnqFHA ziH*H6UgI|G?mm>Id<7fZKR6gmOG^unjO@)&wknCU`{_(>`@MrPX^_N^hL z5%gCD9M=kXDT#>uANpQu7#q83Rzem^#?^={gzj#c;MFa!^?jHvVUNG{6B87X^dItJ zfN)`ZU4HQ3LB^2T!NI|2^WnUMmF#?$Kf4?ILh$U1AIe8^4~dgaxL+%$)M@2@Hxje=+$Q_XHPFI_`gVS zxr9PizG(K40W58k?_WCT5+#yukK8e3zp>H7GgS{8|H5UQ=8-}}8c71!M*6#}AGpkk zKYjYNv6SdV%f&Ucax@~UGu9i+aUqIPw(<8^83zoIOoAY3nblNla}eQXCv*Pwzauay z$uGVoSlih(?fe?(uW@rahBC4|m`RwYQ=`GU2{nhv>CgDXe4Uz&pXT}c)Ac^Q*3&50 z-4*}c)#12&EG(?1gUvZK)I^n2+jxat57nPPe_DjwzNboW4k|vK8O&5fN>`d({F|H{ zmhO*SSWU07eesg(4GjzoHlRjO^YM|w6NEHocxh0&YqjTc~WeQ9H3vpiBr_ajd` z7>9yi4`vPK^f7$RW@Ea6V8U>1q!3SZI)KXawzXXTupw;GjqUA6u%vq0V(x0bhGMZc zR)%}w(zW^!()-Wyb%fjxW&)Ncs(5Ve?6Aho&rVOSU}5>vOFGZ^ldu~!UqRJFaqj>6 z;wd@5{S}X+y%yO28}JG=w{BgY^4QldEPNWv-f(=m8D6(%DqmICgXrFeYi9>-4dz!j7R85}KI(DI3Rq6*W7gs>?+c$7_>}qDE%b!Tlz;1sk}C2i>SiqJs%C$$Dp2}i9ikRS{b3d=nbny(q|6#`E}G|YwH3$(ZKfhCukyq zdn1Ol3=A#q+P1buCgbIWDC*?o84^>+>GWaWAL}=-$pyw0hcl z6NH$rWBQv6Wko-cktr_sY%0;}m)&$SIxE}{@4-?CaM@m*3FVn&|AuaB zZCwuw&7{_{^WB{%($Y;oOU&<5CJx`+KHmNo7v9p=b^&#Ke2gimYj0nCc(?^6e=Zz- zcwx5yDs8X31q{Vvqqg}%%e&ZElU*SxS`Lo>cf0RbQq~sJ9D6>p>(6^ zk%@Qc9{-w|@u{#|LKjJDk_f%YQ)*&WKX{5%D0sBHufJF@@bZ?|bLi^oUZdc@4r{`7 zKBrLP5MBg&FNgULmV=|CxbW;DGZu~FDyF#_Hs^r6+n~ zvazuRuTHsd%MNBKcL`pL(;X{)$ze0wOgncwhjMM^DCT`)BGn~qGCx>+!AX+wasgI# zC&ab2wKv%HL_Q?=W^og*DMZ^XbP{blmnmfWg@@ychf{{~*)3Aj(>J?Ml-ta)zvv}* zhv`}52@r7lqX*p(DNE4hRFap1!@{^9=qA9jLD1V`{@mPLq09DjPKyz|cz%a_R8-s+ zH`1OahFR4fUOM|bTt^+#mFqDYew~m|ak}R_6!iSszh*&{iSOPSdB)pTkWWrd-Vk(V zhyCQAr(K1PlKaGqhVuXMWqv61eC-TZ*u7{sdhdnRVRX;_&p0UzcwvcJ$!f|r-~`cGmg{j7b&E=?qN?%WA? zpTr_zr4|slDdf82?d$8?QgQrJg87Aj%kjX72)tsmp-%Ug zlh%U(NYt0ts8SVzpx==2>I_;`0oIu>kXNbeRvYro7H5 zx?8b)Dmqm|OH2lZL4 z%JFXL%dzJ}x^6BU02{JLR-xWw(yROU_%O)neB?A$SdM$@sgX;3??XX%CeXh#6PEPh zW)H2c*=r9MZz5>++3o9UweEcMlK0Ly9u1KMgtq6^z{M!<{JK*zZ&MQq7?6XF8Dgjg z?*#=3Q@?Dz_Fsf@sn<|etcSY7yh92 zXuU2Rir1(`r}gA2%Ua1*8fz%fqGQQ9TR)j-Xp;K28SehQC?jN%A|5L0?k?!~XZ&hC zrxATr2fOQzNwE30POwV$-3`0W;UhgQ~{2k9UW4%bhoA$v92)52zIk>`_YWJ0)LOG!)8qkxF`c9*ayDu1~2;4EmND~9CnX1LdJlNO5_ z0etJ=o7br?RA?$zR#v2sUe$eh*cqoF=ymEIJd-pysI(oSJjr#aUG3aIeiXd~c(N53 z42NDlDp)@Qb_^XO&`YFt#Zn5*#sOj+x_AG#k~EU9Sl7U zfz&ThoU#2yeNv@kG_LV1E-o7Et&O6dvASK&95TB`B}{(x>Q%KOqo9@wc+9!kmf+M% zq$Bj_sNYBMb|VZFTix-!>zEgj;tVV1I&WfRq(R;Vrl5?B3{k@HYK*fP z*MxxRdAG&6IbWJbul3+AYNZyW)ipJD&4x1m8uY-haTvBv0}6f&MV8X**k)U|8#nHr zG3NJy0S>o4i(>O(9M}rYuoZAZ#eKhgq5t&2i&9=*{uxvBVx4G-#$C_D1rneQBvt6Y z{jL%g=ry3{s1>5ahOKO=(DgbQ(lU=sNC*RTk1)KTprDQY{WchAt4ZO{MF8}$frKGV z@D1@@4ZY>QBs@_)s14-~tHjT{V|^?qDv6x6rfNOlDX&?K7F~o*(FWY1&}L2?_}yI8 zQ{lpLM`->dwH^Y0_t(SaQ^XrOIuJtQT~#IE?%^SQeF@N5pmMf~KHU9=usd&cb+t8= zTk;2<h5^*Z;foOKi^>;pxG|cN+o0_7xdRBlFYS z+dEQjL&vIB?%m*fS+n~`VJb|r0hCDRrFf?Tph?B11DBvoGyy;DOMgmbF;!cmw0~2; zk!8|#^)ArjGoPp^!q+$y8q*))y{EUoJ!q3=tMOx${rK7I>=ZaE+V}6@t#?YV4f=Nf4%zrnfghjA5@XqjhQCr*`Ql}u$&C263cieK(Gk?`r=z- zPY*WmhsC?BTh(y=0YE`0T@(myV2aL~$9}Yz-FWK-AyHDfgAS!Js0;piTne#3#e)Ej zD;HagDnQLldUhK~SIqMF)ZkbFr@X+RAP(KQvOMwA-TQC8LmvmMJXZGf%BEiYn`+z- zGK`#Lp(Y~*NzQwtFIu2e!Q+c(>Sl92YvyMYQ?Ia1HGz?^wzVaYlaosZUf`d%@Yd_( z9drwL^J5rc z|Lp8+V96vWNBbmgVHC_;e}RO(`7=?4rK+mBy+04&vPC!mPc%ojZt|EHmaC|!Xmcck zw4Yr1*YdoA5|yn-9IIp37lDf!Gza20PE2S+Aq@iD@}|ALUDVKH&~B>S=25%RJv5OJ zGOnzVC7?b9H~4J706`*@N>zYW7!1w%4S=mcyQSU_`EG+h`CzpZLFXsICga3|H-(vy z1;il*@bSr))KqmX&5?cWD>Tq%kjL?Z#*MX0@lLQ~%2U>V{yg-Zqw_<8waPT7$5fs1Uni`$slUsy8sv{=GDjk@6 zKk@l4CAftJVaa1}1B!i=KRlNjqm#AvECao8(SPknk#U#x_M$8c2qsXSqf0Aj@Rf6* z$gyaaUK`HWZQEMtf@<>>y^HSIZtFZ;kSrE#z53%Wr|EYLDEut;70$F-o-oP*Ws|O0 za0^%;ShcXoY_%soW>NmA22t*NBuAGXM}44l7m7w?Jd_{?#((+Jg%a z7zkj>(?nsYL)21Omi@W+ea1qNo=7A&RutsE^FGZPrh?naZrD9X#W&Zqjl zS`}V43kovc5`FwwNjAKu zXr~(2_6{E1_*n^HTTEc8*u92LR}ouPZ(bs1(+Pn} zMaR!i23(lwJ*)N`VACY!wFLxEU4)L0LiC82G3sWdvpDhm2c~f^H#8s z1xo`!{s9O(n=tIEj<*@oY~D9@$%cJVx{%khLha{GFB$Gh4a+oIBRboqP<3~Gzt-e_ z$P+0pC0kBd)I%guBsZ^aE&SVBJ{`fKgZbtaZEyj8G%h0>ccj-N@javqMN`2i0yPP= z(G#+X?0*|?95x<)iPY=L64|J-ytZF@>`Iy1BuF>HhA+QUEzTae;H3Dknh3&oX{?+o z4!4c&B92t@R{ea-Ye6pDNRqr=q*MyWR*yua-*iJftWM1jWtR_tG1{CSyBHZ6=>elJ z4eYR7Sa*?p{tYSP6$O<`3ov=Wf4QLbvx9*o0|J0MD_~=2O`uQv-Zdz`N!)?;?}q-$ z9bEu-L59H9s&d56uh}C5r1HY177)h9-d-z=wLuj1Z~qvvErXoqC&)XnWk<#!S{DkI z+G~WNL!&I?Ws@WTm=H)O5%x|F9+qpBEXI|4V(a94}22K0hRTrE0L(a{%ulNM`ypioRm->)~BXF{r6 z>2u|++4c2s0QDqpJ+KG*KR>*X{i^7Ni&&NGg^2eZNWr4j{L17)3Jy-G)l?W*UBs@Z zptH9El;$vMk0@$>9wYc~@U_&Vs}Z*c(V{_O-UNYgZn-}N1lNjeN%#h#I1<15m;e%I`Pn1BVaTPpVAA zDBZ2gq~wEXLg>5}@MR-66$UmQ%W)A-J?@3r#7(W>f6lJl-SnxNbfOfT8q z(Q#+*BUl<_6+);DY8T0G1nomM!O(GNHH(;BOo9IZioHaG>1D`G7CHhT5|NeCrq_tl zr3sO31gi?T)eNxFSWZ&{c+tDPscC5jptqKTyaa}VA*@5}U`MF^o#D!>)iQD1*sDKs zn-K8}&czK?p%n(jdW`nHSyR!XzX0-nqmjx@;!1+&BL?pp6$8sM z8JJjxayBtM(!8yU53YZ5H!$Ij39(BZ#qF%;7^H|JyC@h)tUgeOe-0JmGn!i@E8M8i zdQ}yCZU1}7`66p?&FSQw^g8o^HfsQD4Hj-du3;9j;KY1+%=5=ZKTtFnU#jzNz;rMX zX1@+as3qu-_iXNn>-6VMqD=0q6-&c(GsAT2=;#20Dso^M!c-k)fD5SLhu?&cSPV-Tr0L_o6_C+sZVe3haoGvE$h_;D5A^u z{N#epcwWbwm&Ye2W)>G!ruii!trt3@?_D+xKVNK0!Z}hpA>wqPIH04WcenZBUCd)% zQq08RUG(8z z?k}(DdbG9i3c|v|LS%_r>qOFne2~oYRKJW~@>PI%Sovcir}qHUifFPUNosTuf{@My(MOl~9E0*Fwb zCBi9V?-{@8c~!zgNu0e#_N*;fzzW$Q(aJ(>VAzPOsl^_eOGbVk_|>h;0}T`DpFp=d z$v+Ftg+RTf9fRU0pQ%KA^L}M{IW-MU!|ccUdJ(Nk`%H`eQNDcl4y>{()bPI8@V3J$4E1j$v9p<;+>-r>;oIO1?oEnLjccs12S3~kltD%dP+U;pIbUYc zD(_2c_<1upK6MnCO(Q~BW}u>%+-_B7ibg^LVU$8|fDKZ!v*S_l+k4BXd?nd%aEg8u ziK6*eoS3=etH$!Q1wcgVeP32=j#+`h^MX|2d+0gBw`k7F!-u`-b+W44qO&~{KqZBzk0IIJxS+zNeF7`V`D{2u{%!dlm00whAtD6 zmTGb_&(D{c3IpZv;og|l-P*9QFjnhpsB4!lSWZ?4A%4kSjpEyGevYhX_P^$pF1&J& zj=q5nH1&kpX6v4QBgT_RQ&l6$$O6w3R}c$o>m6JkiNQ@`d8`tkR~R0qOMf+qffBMN z^{E;OeR$vD`v8^j^)=F0(78y;^rDX*_2+8x zd=hjaNRbFHEnfu79Pw3^A5PSI+=RG|4f72b19S!s^el6|#-yJX97RnQKN50s3)xuZ zOaJyI1(a$*ve2}?IdISb-IcB+AO;hnegaMeDJ>bM)A?{A1_44Ot{y;S!b8(sM0 zaronVvu?bJbgKJ4sXDhqtuHB4=%Fawdp_72=BtskJO4p`mIu*JX(m3pip2- zHG@%OJ>QOBz17K#$c!v|s-5?(CaXmQ(mjtiB|r^}cB^K1n~>Z5rkxn&{kKGsJ)@^Y z3h5mgW*yz#&CtuVFJ_1W|@L1K4to@!QFL1}!Z{eS69di76@?4d@8`#kQD4tgCLBA(*HHPKkh`i3i> zAB<9yA2}ad3fm~%uECr!@3@v|V3%lUPnRoXvXoIxf1lLM#2D8ydLqk1%h%I>rpBO@ zF!jjQ`@cNQVgd$EH7GJBHa6Cvt~3==6?5PK61TDHRGSpO4iVb=-v0KZWwTH&nrI*a zgBR2&r3gSl@6v~L+^{d>Qa0C}omgqrx|2RQJ)o=oyTU9J&tFpXh&ihIF1o!dwNSQH zG$|~e(P&_m#a2_4b!Vpn2wO(fVcoO8BuMZ{aDUt`nnL5l{L9`eD9Lj!({9E<#_bAj zN^WHZq%WWZNS~BL;=ll+B`QKMl%u`8QjBuZ9@dgaAsts7-T=%jBHs6P&*{AMEhjgt zD{;&tV^-SfrbHd~%f*29y&aNzS3N)F$MFqh(gHA`5D2YZ<>(Kl-=Fac-;9jgh<&p> zR>lU&In!P0yb1K=Ll|WL@c@61I2t#~5 zqhy8qjW_GJslztFjUhEvC9}p&D(St=v zLr;$Z<*yzZpOH;1tXh-NA_mBU;A%Fjp2k4XLEXa-sLVMphMW&Q&4)IhB`!wy;pKl+YAJc#GZZ^cZ~!poxyxiGx;+D-rAt zW;^epPlR9xGV>?P}EIM7?J4L2$xC}ra&BF#EYi#JV1j^i}Idn3P8v(I5H0t zg+16IkQR4IQyb&(j?G^w927O9TmUgPZ#6JVB?Xn;>f6y$$A?RavG-r#L`FthFLsk& zp+Qn{w2&ABuc-Ak_RVsXCO&9CeCH}EXO51(YO2BvqLf{xa`#5!74TIE4ulKs-I%vM zOtE_Ad-2E?krLmQbQTMt^s;75eimomHOS<6bxz-5S7P5xO--Fy8OrYa#WLmW1))-; zhQ$iH+zX?6U>SwVrsE;u6XZ%ut0T+y#T#ct==c{HaY%3?hDj%_i#phqNR|bOgu?oP zAOP8 z!i`m2+3~>M{%+VKL|A1o2JM4{Bmnf!?P0{P1A7s18bNowh%l-I*Ofbu#l%Kg`c~3} zUyvi+y(Md&0YYp{(VfQ*0O;r?MPc;2+g672!(oTV2sN6$IoE%G6f(JFs^(K7Ipb4T z!0$-l4s83LHW>fu*;$3XE7_T!`9HA&5HrHgPLtYS9ma*MD=D%jpcWur?Zr}b#JmTx zWkF!%FuzRgn;%1NBYCO0`IjCiX1kHrV0d8QvV6{pi_2YRm36zXVHD*-fQRlOOmj^cw#JkX1+_ zYxCUU8COe_8@alE;0en^nvSdBaT*{}R zvhRazZFH~R#ONH#D=HBx+X=z=rXWt70Olk;RYox@S1ZZnY3LU@GpAc~B;G!f@J|Hq)8djpQwW}hM z`Ys}y@SOih)x%PvrA3GI!APCg1IPgQLhl5Mh>p0|^pZ%UfoK$9j&X-r}KTqqBQM31Smn zzqL5GRFw@7G&D4B?7XysCpxp|qfXS8^^t@I!w(PA-hN<;Lp7d(Ec)t**)=OC zzE2dgW9ZEVONddR2Br3Yn3pq*@3ZkDh^H2Ap%qdY~PjoD|wFNL?enhXL9O5PszG zRSK+5qa8<&5b@&Oy>Hx+9YzRrg{-_U;QeXnZOw>_3Mc@ig+XGDA6JOSFq(h$CHqto zq#$lkWsaPVA0Dsc+6~9`$xuj4Bl{3MWoVL^{^$U29|P^WYnc0kN(uzJ`J0--te`Fl%oL-;0FOGFt6&U!%u_^wEghoRGNc!?6#pQ{8>;6B4 zG-2oTUw+6?xq&r0@$>OOs+C8$%;&hWaRYxywRqE3(|>@+{Zb? z0?(uC8YcRAaR<)t|HA>6Z!dZb-l`H|=s671aA*vMG3X3{!Mp1AR&2FjUwMx@vs@YPzp z(Ju65tFj>)L5ogYRFv=qfA9 z|JE8PJonNNOHIzD#KH8BYTEolz0U=N-9aSbE_A8{lTGat}HF4gpZYwJ0(Il5YxrNnwh=Q3!=Di{p~ zRIioVwde_`e%dla%tk9Kt1oG3!doX}SqU)=((jRA5+Z)d)XZ)*{OIcb*pd(|cotXZ=M=EpxFH;A$--F|g3mU~HK9CEG3$LiE zq60qz8q)Gq-2(`CdQ%Fy>OrWQq1Fl{3!A??roo0_&?1sFM7h?`gQOka*O~0Qe!^++ z%#sRu4f|}Rz^t?%?uJiH{QOiSl0H~84y19zzRwRKC#IhHXLV%-31+FeLox@r7Zzw} z1&m5n|MXJ-|4}kq3LrH1B>kx0F!J=cx%RobY|Wibza5OAoEb(UZ(uuK6Aa7A{-lRO#J>UA0Fo?zIrby@hH9pg0UWVF z;)|eQyaJupez_0ro_h4SN4=$>*8cffwf0u9gkU+qp^2{xcg>4M9-QAqD5txl3&6hh zZ1YuEMo1d#<+x!@G zvs6Fw_ceRz1ONaN@dq9}#ykJ<5n~kI zGYKDQ9*4l12XjwSbNJ3t4N)slk=(M$SKvoO{y7Mob`st*u;2_}-VufXPLRqXwRw@= z10vRm!G_!3H#hk?cV6_fLWQzWk-hvA;0h216_Z(X6mq!Z>o?(G2w=tB;VsH>t7vUO z+<+Wu9mFR9s8z!V>3Z>(U(|H|c^E*}5Wk<-e)(D9Fyc9ASK1dc-FBr897qM~$O2su ziEe^q+4R2;5ZQhB@Bz`{AQOKTNzWBZMsTUW#N`7cj8^-6bX17fJa_sf5RM3bxVLfF z`y@C7vN$S^sBThHn3ayd-$3Ki6qGwR7#bOUhOZYLxshv^Cj=kR3l-UgT0gT{Fo3>Y z0bLVt=gZS$7?%-X>pteNXz@UOw+ZP8c6jA33zBqwsIw5+Wov}}3~9l}gy`Q_2Xdur z!O0UNTF3(_rNAN*G)u!DRVko4x6l^!H~lE4&l~t<@Qi&lC~bKK&hLN^mNF}Z`Rb2q z*qkD<+dH{c&T})-5Fv>#xWWJC1)_)!Y02oUJ*Hko)BzN@(l_4^q<#S0iX?MdrFsU+k-1(ko2~OcbGPfC4Z1CiR&^KT>(0{`shSeBRpTT|@#y`48llCh+Lsioh|N zgPnn=Z{NRHSt}7^;8Nm;v`hO_|NE-8);ulVJ1lfs1qWuo7%`mgSvYTt@jBnHrmz zf8PV!H2GtDmQBFHfir+FzaZ(0bKGdKgH;&WKsV?!D=7{0r}Q~r6|neqTz@fG{453m z;c97Ez?+$*w-4tm{=P3nz@ZrvxUZLRDMKJhhy{lh8r{}w0$>@7ru1KTeJLU$@&WzJ zW#DQN`2^{#OVoFUyo+V%wBpZssu?lpuD}4FL}JijFv@*Wn|Fw$f0#e4NkLBZE~XkK zB4fcSO2+>$%S42@vmo9?(0BYOe0CM%P@VXHUIaFkF)$Qv9ABw7h_jZFX4v2tf36a6 zLCY4H`@Ejch0GhUfQxx=>94{`n>&i$O3&a)`(tda zpPD~5t3MSiS`+iYYo4PtXPeZjL2F;EPj$x%+^vfr4 z_S!m|{hJy_m>LK?K)Sm1*a1o>((D1bqoLruK>=id|ClRX%U_RWv|! zA68d`@#)0t$HvCoEkMBqN&B&u7CFSJ5jx$zpylpC+4zy-dRM4`>!%6@>$f6s z@k)Ez*abMa08H1q?HA^~&tHQNw`JW1m^lcLTPp(ef|G{M+dVu8*GdAJV{s12YC`V_ z0c3IS@)NPuAFcR#a%ooj^Fb_MjLH5HpRE@TTU!v>N(K!VInRZde839Z+~uwy$6Mwg z|MgWeLWvgwF_RRZP^b!iABq6Aa&Vi65@EN4CA85mL3Mss(P8B}f@6cXVVNL3l-puN zFN!+TC1QL9>{wA3xb#HSMChpack9-Gq_wZ5Chx7aQz}IeH z$DCgzJ|po&!lYVSZ)#p!q_}C`;uVN}?);nYeNYGs@gD+w`CUZb0jCFOb(7w0clE!J zbwbSM@CT>PA6}(I+9-APW&4`;SFUOKXiNNi=NNcrII4>z(U8=1dq<%bxhxzVg%EaN zcz7EmwXLG4fAzEca35_;0@jvQ`-WBHPAgneV7DZPMBg8r>=1&5j)nqLv>uW;5pUo6 zTqR_jh66Aq#yLtMuTPmcuPV(n?rLe(W;V6ltS}*eRuBQ{g!W1Gn%*vWxIl>Y5I_Yi z_c-DP3JK@~B%lI|(R*<6_xpPrg{#&rkWKE5Z>>iG=xedR|CtRuN_R3y_11RKQ8S!sK_OLjSVEWZO2 z{95+s-8Y~KqzD>70G#ECzup4|)b!er*0@}s@_Fknl~2q34oo*z$c-DkBE-$A2Xh!i zvWIZ0F|?5mA_9I1zdv>BCYHx4b`L?*+e_(QJqLqqH9G_eaOfQlzuolo^o00x!d-)u zduBr;4abL>(xc~jTre!T*7-O%@ZmHqg-Wi5KZv-ZNze2U1PAi!-@V^hA41HhlrPGn zD_cL4Z0{ustbKQZ2L3IAthE9d`A!%bNMkp{0fhq4J}f4yNx?+~cwY~$5Au4DYma&H z$>^fLmgx3hGjf5%(B|tG3PT~VY$0H>41<AC>bwy%h%LD1Sr>93&z+E2vy=0Um`5E&cpzi284;&q-&dx6YZ(Se_ z7zM1rQVUKF7aVj81^$+#S!PK@@W>%q>4}MsuKyf~ZA65Hhl)&DZ=TUTlPWD_S|L(B#dpTB(hq6fO7zYaLEg58M^>gqSC zypHkZ zSK)IA^N{RY6)1|Wo1s_Co*Xs zvx9tuATu}?)RH%n{eL7;wG#GOaitjgSkyw7gZav%EJPwzL@Dx_j&gavmN}NH{x`I5 zxLV5EQe&C)_0eEQiElX?bp2La~VnZGvv0Wgk z03n;(+US^>vx^>mHP5{%v>gAYwpo@eD6riV0>;LWTZT-S7^nnrCa8xBYP6zp!1G~B zER{ztUSF2!5!zW~sGPTvggJ~m#ucp~`c;ohPN(ysRx;()4%flG9NQ^R=))37CRWK) zW8o&h0fNd$!8qf3(&a8zb&KshAF@Um6+`w#y7g24b?5KDj<*wAJ;?aiG@tq!Xd)=N@N`?!K*%PPoxsgi^G7vb$s^ZCMdnuiOg&^!o3!#?sW6 zw~A>nh+)WIYj8S0+iyhZU3&uZ`4hR33AtXDTTsvd4MXnns*b|Xg*K;QF#LW0t zE#Q0nZ#r?jnVx39Hv1IbaS^`z>ql$mc*3f?49=oQe4w9O+Lwi~yP3;V9i-p(20w?9 zcwK|`F+Z}c;JYxjlp$D#Ia19=kJa(2>i@vLDTF%Gg_($0el*bhvgOG2xR~3NFi& zj!#@#`}zUx0GOZXD4h77)}*ha&<%oG6Y{u&d|@k6od#((ffK^% zCG6!wOPnM3*!6v(%)X$b@J&VH<~Txx;+2}yY zoxu+;rT44<_*)}qJOVR?onm`8((n|k1iG~HvLX4l#TEdv)>$X>G9>o_PCpxg_q<=j;ka$3Ecto>T zkB8rX0j%mLk#}rNMxTU=P0`c*RlxB>d5%WEHe4#&{DHy7nepO-_m{Mr)&~~cI0-$C z{dHg8zBlC?`1%3)Gdi%a8vfhv(?roVDz5e~q-0ba{ z+^dtsC7h`Yk_44pHKDGj4@ZjG2*uId%lWU`Rw(6}_aoa_Z%dTe=-$;PH`Bg99G8#X z90>9ze>_aTT>F>qqV9?Of#D|#hGMU7{HMj%B5m*GtR0w+Ouo>gDJBlpU%9HeXIyWB zA*}Wx(B+$3ilQ_lJFsceC=w>6lS(G{)8`a9lkZ+7I;IgV8(-Z~o()>WaZdK9`^fX` z5e?hK1~hOZg6CmdehsK&7xoLTzNX@Xb!mg50gFHO*OcDpkkip$wSHDO7}D8R8})(L znGwq@6@%o~hhI(dmxhnd7AXdJyQVW1ztN1cF|sMq!?MGA>PB7cPp9%y#y>?v)C5aH zu)nde@%>Ir2Yt10DZ*e;vJH!mrKQGUM<+Jij`(Q#Sn4AhQz{14 zQ-2q-vb(7-NDJ4E8289~n)|m$tsNp~QbGGnUcI zjBGnka>@9n=RW+ng=x$XBk62jO|o;zCxcKOp3jT5DwwC$wNaWbpqKjdFbs|NB=zTk z3$7{NI&2Z|O`B^t6(en*n%CEG()}^Te$vCPvBTIw|G6}s+;bB1U`S!|OjZAMIP-el z$XB~iUT1zR;DWP#>WbAaKq?RRSLj*dv@bI;cx@_-n%=+W4Es1t_x2&vs3e>r z8qR}t8DFhSg2XxEajj;>rnBD98_c%9y?9=VU+A%h75Ltr#P6iE@5ZH1o`ql@9`aL|Yo6BZx853UO1=-R0`TJtSZyhNkh zJF+5kEWTxNOe47DILMZA$(cQ!>{! zJc-~Qjv%SI>0d1F1x)xKM$;12ok&O*>!w2^UNanhkdo!0{%e3Er`6sX6g*n)vho>{LST)p?^S1^j~WNYGA=>`f@-${l{QdQ=(Oi$ydzkwdxljf@rCBj5XxWll_<{b z1%i275lHt$#D(3NC-_8RykQ;PFrkbCqtuI|P&o1R=QZDo;PH2TvBGt3Ps6_``L^Ia zlh=wjS_Va7=J%)mthZ!a?&cFRWbXWUaHg?BqtsQe*OD+vX!=FRsa5kbou8`d^$JtKF%jEU)qfg>h^y)*jaLWBI6SAMKaR# z#=6QY$^nw8h5)vqM#BbWy2-2%_=g54pnL{SezdJ9YgNYy{aW3p>nM5!Ih-WJLCrDb z{pIM4G3`b~Y;r(VHu;2xz|3YF`5Tr~kJ5DJy+rPlp&N-t^+gW*8-H))+q&H4QqGe@ zvO1ta&l2pWc}496J{_bJ9@X1?PP&}kypfQ%JUThbY8GMZfKGK1;TIopzo)IT#HM-8 zM#nfoNU2NPXEF(M2gl(xUK+*JLU^p$GN6dWqvC_A-DN*SWWHlz$ilp!)?F3L-GQb%wRx{&-iVy`Sfv@9T4YKUY07Jbd2CvFY1Zls=?`~nHKKzUhPCob+h2xyze4F95(ls{-AUAhDC|z z9Q9#QFFd2;n03hXnBD^xvfv8wN#?g4d%PAu&vNd9;(nLi6)pBz0&iQH1qad(c(|$V zq(8Qm?D1~!yYr!r)2-_LMZvgf5xs~9(s}o<863tuB|A>NSg-<%Lai1}-X}#=#pySe zJlSP*#zTU2Jqe~(hd)-VntNg${N?wQdNaQ}*M%{8!MCP|-Bc}{T8!%7Vtv>z5*N60 zRilpC8L3}q&(s#rpWNR%j)Bcb=e~Vkt(ik#hTl+A14H)pN&oDkukj12FBiLGA{{i? zj5TQKw7D48cjfrhbZ_LJU)#K@sW)ghmXRn{k4vdMaoZtfd+k9()4rESHV40`{t}Sp zJL|PxVd?;<_oTKW#qKL-y_3kpD(tth82KJhY3887(Q#g?o-c~xnd5GHe{Rd;1>=`^>STnWFR z>?zg3tFg?nD^=L4Lti0e+U9X`)f*f;T`09$x8nijO`hS?y>Zh=?drM>mwY`b$g*C~ z#PxJKgS7my-dl%`7kl>Z$o-laZvRVxlMF!3Okci9R8<}?cr^1{Vpu(bP4v=UpJ#!X zl1mk;pEiAJh~-N9};d`UHL_@x8+!G4P{TsHcb9Ns;xE4{Pk>fSf}Pb$53M);=< zbGaCRKE@5--%YoRMm}!VbI7sz=;zh?lELXO42+x{MHi87uy{}0lkk%K)75kQrNNnX z8wC~>iaakbvfd|G+wf9LQq``5;<03O#O7OB0|o@kaqWnj;fKG@Mh(7s!F|YD18bzC z;n{U|E7aUKFD{`U75k{36pcrKBef?v>7mPhCI~VGLY5Rm3qf&IOKJ1bf;M4rIW6=74ieui*U#sI@It~ znMtKHfjQDA_SF20l`2hhV1MY~+c%HOSM*{u{h9Dut9s0E)kUZDt#+|*7AkHec{pe5 zzflYUmgSdF#2A0F@8do5x1&q_Ozb|_%RX$+!bts?k4`n#b28q0wU$9J24t+@=bTS{JM7 zWAx(P8~C`q(hHe&RIs28bd-(WSy%Z!|+{8Pc_ej>vy*sClyW z`1=dW_cSX-Z>_Xf;G0irl`syF&ot!NKF@pSDmFMAa)+mAx5S6%V`W4nhm$k(M5fMb zvtEwGl@jn!?=4@PR@~Ln6h8W>VAF%IEadHsav$gWY|3e|^2(Kx9-AlJ&HQ9 z*^eJ?bKa++d*^v|X*Lf-^nAMYd}wx!TRn!`nVzEaLC>5X|1=!h<@|QSB=%hlHL_}G zz6=Xnr`vMp1r+nh{m+`st(PP+aY&lEsPhkF<>I!V&ZGYP31e%=vmH!Bb}yfQ_Ooll z`w#J_C%<=HKQfRf_if|&gj>{(%n0_(4aVyw&n%(pcxp(`c*?j9y6`Q#{aR++hLdcd zoj8|bn3tcBdGz3GN`dx#(C(_I`ISS*Zm{1y9wsO!l-8V-D7g7CW7&va)q|HeKa0mK zI&-owsN#??_0OFAjOtgsk+bhT6nQ)%3~m;mb0*6wwr;vc%yLbQxRvJNFD9mIJI{N0 zmq_wjb2>!xTuXZHpozK3N>wG(rsGNYuke7zfX&#|jb`tb9jDW!7-S}gyZnFD-RU;3 zw8`A`v0&yGeZ@qZlJ5D#cDHA`^f7>)5GXJ~(h#M{c5a*gmeyI(# z%#?zO%2N?Je~eiucQLVVi!~8qn_go1Sd>|VZpo*i!m+=*#&L`Ol*K`lGwL{9ZujG% ziWa;5sjv-wy==MEk~39d-?RE{pLqF|e;BdyF51-Ev!SV?)96t5x%FJ1jhc@v)XNTU zjR`=g0l6amSP! z`?L1g4RnL}h$L6g?85J4t_9!opTBcR;eN^bZ=UPe=eBT&y7k>$c7AUxpR)H%HqC?I zv~u~+VjeBQbl3S0=^58%o>F^5mu0A=h>g$qE!>(dvcl;IgPc&hL4lYDmF$5&CP+tf z(Em8EYsz@arzzS-TkNZD~hc1``-^-pU@gL9uUjs*XsHxXXTx@xz+ojkF>P1 zTYKPTCYO)zlFuz1tB^O5j8o}gLRSfQYs`0gf4lK}&zEGEV2O%0>&pXy#rMt&>Bh;6 zfA75+K-cxOuM0mYYn#C6dW9QT6bXM~eO(tT{dmE;H_d!GpU*A-m$RQ7hFbS`O>K;K znr-rRD(K)9=;-A2D=86^YsojN{DiIjxQEK=DMr^gwKb)8c%I~YO@8l<7u<~2xuYyp z{&_1KIh4_Mgfp09(q;5||CD)O;r%E2$MrRTdC)F%F{+LZ5$#O>J>?7%v zL2CcCb>a2R*rxaT*Ttz@ZhB~1XJGQ}15^4z>}#CNb}+ZZpFF)pzIXWU9PYGkq;`f! zuFu&fBaFkM97XO?Y`pgRZ<$$0R%Ml)lVU5GFgojVJWb=u)LYHeyl0m0_k(#gXTa<0 zigB};E0kV(=|NUcjDp3M>HF4?@_1b8U+oNStMg2>mFD-(RcY^NiMUn#cG|Qj>-VvnY}W!amKfMh zJczi;QBI(Sv|Xm_BpYxV;2InKt^J#4{aC$h0{eRXLYBWF7H74^QA>hT+iEe1q}dkz zFu$LH0|Ok9FN!hLYPp-c;nD%_zfn~kS^$Xw{!3Q$mraJkh@j~IpWjUWFd`%8PoX#! zSjBy|PHhoYQsM!6sh|9&e_ER7AKdU?)ZtL+^hoLSSPx`Jl5%oODP5zZw)NqFIZciu zNKx_XRp$E>5+)HV>OuuVc2(Eb64hUXMEm3?{7A&-h*A#%E~8N+&VSu2{ksf>Lp1E> zO%~{upF7l86quF7^T!xo!S!9#kUP+e`GGXbziwh+QBvz`enPx62`>CDTc|=T_Of>1vWoWhmE;f8Xf$SB=Q3CiH{$w=pl^iq-;=5hJQ|dM{j>gp zHk+#25TP-|ch@K?E=MZfvp>dBW~1|OGhkMPG9_3Xunl4aSt7DU02m;1Ijyh&PK7R# z`9;D+E;R3sYbw42^k7Op!<{8<-dS%x9%vFjJJ_@XvBTE6f(kn>+$B%hs(7 z6g&k#7~Gr&@QNU&M^cl8#g743&pTmU#})r`THzy-doI7kz&FD7W1#&Vp#4Q?{cp2v zS2u2*UUjmgnBlH-zI(yP=;n7I73>uRx_Wz$P&*LR9cWC*zMqy}hC4;d+WgLm*Ct=l z-H1D2u;Z~3_*;hZx33Z2gB^gcE%#2QJ4jo|Te;iY+uf+tiqW!#P`GbJ)zxE1T*UF2 zYT!YkqJ9A5z|4e;26$cKw1Aqz7nT*=>8{2%t%2|&T?Y+KG+mVFz0uMvuUkjDZh~+P zv;(d#YhY9)QXz3g#oXMgbQO|nCoBYML4JPPM*~eW5xs4kJBJp)jqU_il~7mcF%PSs z8>+cXvVQvX2{{zz^t4f=IMvYr_nEcY+I-CIbUlJp1A${n1O-Dv4884v>0*d1ckAgr zDvlp<5suOi0Pop@yVg3GdH=R_SOr`hg*GGJ0K%rJ(A64D4*o*|t7l<;bm6Y?T0GAx zn!Gfgl2b?VM#%XON?weQDc$0$pIix@WGKFN44wEzQSbmQ1s^lL2pAsj@avK~VLgIw zp_;aVS#%L8KtQy+B_5-@AmOf=g;sVIM$n`?8=%QR=p*NjYq^uMn6z{t9ypQ~)n8ju zxrK#Y=SgCN0P+(9E(7D?&`^SXD{pHna-Q2_vHL*I9qSTWCTZp1_ImKz_%@XO@Fg}u zw7V$b*h2;e2H>Y}bCF+^YG{vY!1Gq)F$ZvIp)VR2my`tK|AIlYUWEgIXtaQ^nAeAY zq~pe24{5^u&n81)kW{h8T`qw{fdljRki-&g&?d2-@ zdGHCc>P1u|SQNm845Uyc_mCMvpv)ns<00hYLJ zxZCFD;#y-S69q`iPtEg(-O)gYX}nx<%8D6*?H5bADwPlYf)tq-gbK#-U<7%tffhA8 z*+fgp`N_NnJju~#QtQ_nl+KO6tgNciCQ3x)*{y*0ncFncoMC+tQ&2EQj@2Y%zZ~(r zyZ4AK`uMnX%k5IUj3dOP*w$u2ejiN!Mu;g;!rgKQIfDH6(uqB4hCV+UP#WA6@tNU$jcije_AdATLje=vW9sOMA{M zwt7sb51oP# zPhb}k_dVbe5C}pG7hkuo9`zeGiT&608xkAi!on_*SQN@~z%hBHs7RGeg&0~^6sw$y zmIfOPHp;K8Y&$@0lC-0cuoCHPApXm7m<9UEfV~73tmwG_KyDp!os;op&4eTEYa|&B2ysAX)2H^Z$qN|n; z9r}_a=V3V7F9XzvliwIzkgiR(@s^n=7ztR2XBC+n*gUV`6B3MP4h+^`UY*RSsMgXm zwsGUezvfdU%nf6e2|8PW4@8W@uqsv5)zx{A0Fve6 zd|Nz%Ny#;1;OGn~Tu`p(sNp+#FlhQ;xpIxTlE*-CaiA&yaYzkL@R&gE$Yp*6$>C_q z8sK6UT^$&5$Wlsf8yS}TxejARhjIhJ06CtXLLd!nQPJ#Bsp@YGshFB&vtDUTHz+km z(}lNRJV@a}yhCPkp0s2N8S7uwjYr%91bK62ibJ#-11g>ec&XstWFwm_+cJ4d5awgH zd(BSNr&#%bL*=DZqYOYp-9*GKu%Y~(p{4FtnT2NAfkFOVIou{odEr?_1r>fZ5wsmN zLEs(2>i(EKRuoG?GLHcOSg$|%jGkx+qLBw~zCk3ClM)91^0u2E3s`PO4;hYY_{^8i zenxMKrfaCFt&xzp-_#Zv7Z<$nXViyC-AS#R$;mT8-jVB21A^niLA{;2x=a+*Sy`qR zA^V!>@gYdYazq!70;Ck>Uc(;I%l!RT*&&$0Uak-_F{;A#fZ)W~SOu2kTtY(Dc0U_X zYpCHWsj9Hi`R&??$H<^j%HadrKm12YQBgL6KV+9_S8S=epkIY?*F506T6EChr#=^v zoRtq#`*IFzSfW=ZomG6-bxp)t&?3VlB7FC5n_UFNt>)QH-Dc+kik(SOr0u60-%5wZ z*B>w8GN~sU%UUcfpdw`jVZ0a(W9?Y)_$L?iJlEz4`}OCh7cd^8spc==o|RTjM0g}O z2v{)~jHR~xt++;EEQ%An$MxD7YyG0JP%#~x#WE~-2YPF;L$<*poZ;XW~jB%Mt;*@M20i$>R?mfw${{*H+}hmQoPH$`uG@gl8)$DM>a< zJZb#zqdS4637G+q?Y|4U6)v;WiEVw^x(t^v)syWNDPlxLBV}xJJa#O0X#c}z2y)QQ z$;x=#QhwQ=t zq2@iK0P4BnDGPC4p!*YzAlZ=M1xa95xrTrrggRscK`=_7jSoXl;Ny~X5FR;EF5bgP zfTbbn1#U2KVW29izPdATnK04+kaZ*W4u1Uv#+B11fQU_l~t@K;Prs)>})KS881P4{axI4FSKUSC?tbuGcPK# zpv2cTG!H&YPTiozEr}dTXp{_^5Hw~!Z`08U=&ikuslvhH|G2y%=H&muu|wYiLoDT3 VrV4G17z(>l^mgvi$` stops the run when the time inside `run()` is at least the given number of seconds; `evaluations_` stops the run when the number of fitness function calls reaches the given count. New instance attribute `num_fitness_evaluations` counts the calls. +18. A new submodule `pygad.utils.quality_indicators` with four functions to measure the quality of a Pareto front: `hypervolume`, `inverted_generational_distance`, `generational_distance`, and `spacing`. +19. A new submodule `pygad.benchmarks` with built-in benchmark problems. `pygad.benchmarks.classic` has Sphere, Rastrigin, Rosenbrock, Griewank, Schwefel, Ackley, and Himmelblau. `pygad.benchmarks.zdt` has the ZDT family (ZDT1, ZDT2, ZDT3, ZDT4, ZDT6). `pygad.benchmarks.dtlz` has DTLZ1, DTLZ2, DTLZ3, and DTLZ4. `pygad.benchmarks.knapsack` has the 0/1 Knapsack problem. Each class is callable with the PyGAD fitness signature and returns negated values (for the minimization-style problems) so PyGAD can maximize toward the original minimum. +20. Update the documentation to reflect the recent additions and changes to the library structure. +21. A new benchmark `pygad.benchmarks.tsp` with a `TSP` class for the Travelling Salesman Problem. The class accepts either 2D `coordinates` or a precomputed `distance_matrix`, exposes `gene_space`, `gene_type`, and `allow_duplicate_genes` for the permutation encoding, and returns the negative tour length as the fitness. +22. Two new example folders under `/examples`: `examples/benchmarks/` has one runnable example per benchmark (classic, ZDT, DTLZ, knapsack, and TSP), and `examples/quality_indicators/` has one runnable example per quality indicator (hypervolume, IGD, GD, and spacing). +23. `plot_pareto_front_curve()` now also supports 3 objectives (3D scatter). M >= 4 still raises and points to the new high-dimensional plots. +24. Seven new plot methods on `pygad.GA`. The first three work on the final population (no extra flag needed): `plot_pareto_front_pcp()` (parallel coordinates, any M >= 2), `plot_pareto_front_scatter_matrix()` (M-by-M pairwise scatter, best for M >= 4), and `plot_pareto_front_heatmap()` (solutions-by-objectives heatmap). The other four require `save_solutions=True`: `plot_fitness_band()` (per-generation min / mean / max with a shaded band), `plot_non_dominated_hypervolume()` (hypervolume of the non-dominated set per generation), `plot_population_diversity()` (mean pairwise distance per generation), and `plot_pareto_front_evolution()` (non-dominated set overlaid every k generations). +25. Fix a latent divide-by-zero in `NSGA3.normalise_fitness()`. The safeguard for near-zero denominators used to collapse to `0` for tiny negative values (the realistic case under PyGAD-max), which silently produced wrong normalised values. The safeguard now keeps the negative sign. diff --git a/docs/source/visualize.md b/docs/source/visualize.md index 5d2889d..2945278 100644 --- a/docs/source/visualize.md +++ b/docs/source/visualize.md @@ -1,317 +1,163 @@ # `pygad.visualize` Module -This section of the documentation discusses the **pygad.visualize** module. It offers methods to visualize the results in PyGAD. +The `pygad.visualize.plot.Plot` class is mixed into `pygad.GA`. Each method below is callable on a GA instance after `run()`. -This section explains the different ways to visualize the results in PyGAD through these methods: +Every method returns the `matplotlib.figure.Figure` it created and optionally writes it to disk via `save_dir`. A runnable script for each plot lives under [`examples/plots/`](https://github.com/ahmedfgad/GeneticAlgorithmPython/tree/master/examples/plots). -1. `plot_fitness()`: Creates plots that show how the fitness evolves over the generations. -2. `plot_genes()`: Creates plots that show how the gene values change over the generations. -3. `plot_new_solution_rate()`: Creates plots that show how many new solutions are explored in each generation. -4. `plot_pareto_front_curve()`: Creates the Pareto front plot for multi-objective problems. +## Plot inventory -In the following code, the `save_solutions` flag is set to `True` which means all solutions are saved in the `solutions` attribute. The code runs for only 10 generations. +| Method | Works for | Needs `save_solutions=True` | +|---|---|---| +| `plot_fitness()` | SOO + MOO | no | +| `plot_new_solution_rate()` | SOO + MOO | yes | +| `plot_genes()` | SOO + MOO | yes (`solutions="all"`) or `save_best_solutions=True` (`solutions="best"`) | +| `plot_pareto_front_curve()` | MOO (M=2 or M=3) | no | +| `plot_pareto_front_pcp()` | MOO (any M >= 2) | no | +| `plot_pareto_front_scatter_matrix()` | MOO (any M >= 2; best for M >= 4) | no | +| `plot_pareto_front_heatmap()` | MOO (any M >= 2) | no | +| `plot_fitness_band()` | SOO + MOO | yes | +| `plot_non_dominated_hypervolume()` | MOO | yes | +| `plot_population_diversity()` | SOO + MOO | yes | +| `plot_pareto_front_evolution()` | MOO (M=2 or M=3) | yes | -```python -import pygad -import numpy - -equation_inputs = [4, -2, 3.5, 8, -2, 3.5, 8] -desired_output = 2671.1234 - -def fitness_func(ga_instance, solution, solution_idx): - output = numpy.sum(solution * equation_inputs) - fitness = 1.0 / (numpy.abs(output - desired_output) + 0.000001) - return fitness - -ga_instance = pygad.GA(num_generations=10, - sol_per_pop=10, - num_parents_mating=5, - num_genes=len(equation_inputs), - fitness_func=fitness_func, - gene_space=[range(1, 10), range(10, 20), range(15, 30), range(20, 40), range(25, 50), range(10, 30), range(20, 50)], - gene_type=int, - save_solutions=True) - -ga_instance.run() -``` - -The next sections explain how to visualize the results with these methods. - -## Fitness - -### `plot_fitness()` - -The `plot_fitness()` method shows the fitness value for each generation. It creates, shows, and returns a figure that summarizes how the fitness value(s) evolve(s) by generation. It was previously named `plot_result()`. - -It works only after at least 1 generation is completed. If no generation is completed, an exception is raised. - -This method accepts the following parameters: +Every method requires at least one completed generation. Each one raises `RuntimeError` with a clear message if it is called too early, on a single-objective problem when MOO is required, or without the `save_solutions` flag when one is required. -1. `title`: Title of the figure. -2. `xlabel`: X-axis label. -3. `ylabel`: Y-axis label. -4. `linewidth`: Line width of the plot. Defaults to `3`. -5. `font_size`: Font size for the labels and title. Defaults to `14`. -6. `plot_type`: Type of the plot which can be either `"plot"` (default), `"scatter"`, or `"bar"`. -7. `color`: Color of the plot which defaults to the greenish color `"#64f20c"`. -8. `label`: The label used for the legend in the figures of multi-objective problems. It is not used for single-objective problems. It defaults to `None` which means no labels used. -9. `save_dir`: Directory to save the figure. +## `plot_fitness()` -#### `plot_type="plot"` +Best fitness per generation. For MOO, one curve per objective on the same axes. -The simplest way to call this method is as follows leaving the `plot_type` with its default value `"plot"` to create a continuous line connecting the fitness values across all generations: +Parameters: `title`, `xlabel`, `ylabel`, `linewidth`, `font_size`, `plot_type` (`"plot"` / `"scatter"` / `"bar"`), `color`, `label`, `save_dir`. ```python ga_instance.plot_fitness() -# ga_instance.plot_fitness(plot_type="plot") ``` -![plot_fitness_plot](https://user-images.githubusercontent.com/16560492/122472609-d02f5280-cf8e-11eb-88a7-f9366ff6e7c6.png) +![plot_fitness](figures/plot_fitness.png) -#### `plot_type="scatter"` +## `plot_new_solution_rate()` -The `plot_type` can also be set to `"scatter"` to create a scatter graph with each individual fitness represented as a dot. The size of these dots can be changed using the `linewidth` parameter. +Number of previously-unseen solutions per generation. A flat curve means the GA is repeating itself; a high curve means it is still exploring. Requires `save_solutions=True`. -```python -ga_instance.plot_fitness(plot_type="scatter") -``` - -![plot_fitness_scatter](https://user-images.githubusercontent.com/16560492/122473159-75e2c180-cf8f-11eb-942d-31279b286dbd.png) - -#### `plot_type="bar"` - -The third value for the `plot_type` parameter is `"bar"` to create a bar graph with each individual fitness represented as a bar. +Parameters: `title`, `xlabel`, `ylabel`, `linewidth`, `font_size`, `plot_type`, `color`, `save_dir`. ```python -ga_instance.plot_fitness(plot_type="bar") +ga_instance.plot_new_solution_rate() ``` -![plot_fitness_bar](https://user-images.githubusercontent.com/16560492/122473340-b7736c80-cf8f-11eb-89c5-4f7db3b653cc.png) - -## New Solution Rate +![plot_new_solution_rate](figures/plot_new_solution_rate.png) -### `plot_new_solution_rate()` +## `plot_genes()` -The `plot_new_solution_rate()` method shows the number of new solutions explored in each generation. This helps you see whether the genetic algorithm is still finding new solutions. If no new solutions are explored, then no further evolution is possible. +One subplot per gene showing how that gene drifts across generations. Three views: line per gene (`graph_type="plot"`), per-gene boxplot, per-gene histogram. -It works only after at least 1 generation is completed. If no generation is completed, an exception is raised. +Use `solutions="all"` to plot every saved solution (needs `save_solutions=True`) or `solutions="best"` to plot only the best solution of each generation (needs `save_best_solutions=True`). -The `plot_new_solution_rate()` method accepts the same parameters as the `plot_fitness()` method (it also has 3 possible values for the `plot_type` parameter). Here are all the parameters it accepts: - -1. `title`: Title of the figure. -2. `xlabel`: X-axis label. -3. `ylabel`: Y-axis label. -4. `linewidth`: Line width of the plot. Defaults to `3`. -5. `font_size`: Font size for the labels and title. Defaults to `14`. -6. `plot_type`: Type of the plot which can be either `"plot"` (default), `"scatter"`, or `"bar"`. -7. `color`: Color of the plot which defaults to `"#3870FF"`. -8. `save_dir`: Directory to save the figure. - -#### `plot_type="plot"` - -The default value for the `plot_type` parameter is `"plot"`. +Parameters: `title`, `xlabel`, `ylabel`, `linewidth`, `font_size`, `plot_type`, `graph_type`, `fill_color`, `color`, `solutions`, `save_dir`. ```python -ga_instance.plot_new_solution_rate() -# ga_instance.plot_new_solution_rate(plot_type="plot") +ga_instance.plot_genes(graph_type="boxplot") ``` -The next figure shows that, for example, generation 6 has the least number of new solutions, which is 4. The number of new solutions in the first generation is always equal to the number of solutions in the population (the value of the `sol_per_pop` parameter in the constructor of the `pygad.GA` class), which is 10 in this example. +![plot_genes](figures/plot_genes.png) -![plot_new_solution_rate_plot](https://user-images.githubusercontent.com/16560492/122475815-3322e880-cf93-11eb-9648-bf66f823234b.png) +## `plot_pareto_front_curve()` -#### `plot_type="scatter"` +Pareto front of the final population. With 2 objectives it draws the population as a scatter and connects the non-dominated points with a curve. With 3 objectives it switches to a 3D scatter and highlights the non-dominated points. With 4 or more objectives it raises and points to the high-dimensional plots below. -The previous graph can be represented as scattered points by setting `plot_type="scatter"`. +Parameters: `title`, `xlabel`, `ylabel`, `zlabel` (only used for M=3), `linewidth`, `font_size`, `label`, `color`, `color_fitness`, `grid`, `alpha`, `marker`, `save_dir`. ```python -ga_instance.plot_new_solution_rate(plot_type="scatter") -``` - -![plot_new_solution_rate_scatter](https://user-images.githubusercontent.com/16560492/122476108-adec0380-cf93-11eb-80ac-7588bf90492f.png) - -#### `plot_type="bar"` - -By setting `plot_type="bar"`, each value is represented as a vertical bar. - -```python -ga_instance.plot_new_solution_rate(plot_type="bar") +ga_instance.plot_pareto_front_curve() ``` -![plot_new_solution_rate_bar](https://user-images.githubusercontent.com/16560492/122476173-c2c89700-cf93-11eb-9e77-d39737cd3a96.png) - -## Genes - -### `plot_genes()` - -The `plot_genes()` method is the third option to visualize the PyGAD results. The `plot_genes()` method creates, shows, and returns a figure that describes each gene. It has different options to create the figures which helps to: +For M=2 (NSGA-II on ZDT1): -1. Explore the gene value for each generation by creating a normal plot. -2. Create a histogram for each gene. -3. Create a boxplot. +![plot_pareto_front_curve_2d](figures/plot_pareto_front_curve_2d.png) -It works only after at least 1 generation is completed. If no generation is completed, an exception is raised. +For M=3 (NSGA-III on DTLZ2): -This method accepts the following parameters: +![plot_pareto_front_curve_3d](figures/plot_pareto_front_curve_3d.png) -1. `title`: Title of the figure. -2. `xlabel`: X-axis label. -3. `ylabel`: Y-axis label. -4. `linewidth`: Line width of the plot. Defaults to `3`. -5. `font_size`: Font size for the labels and title. Defaults to `14`. -6. `plot_type`: Type of the plot which can be either `"plot"` (default), `"scatter"`, or `"bar"`. -7. `graph_type`: Type of the graph which can be either `"plot"` (default), `"boxplot"`, or `"histogram"`. -8. `fill_color`: Fill color of the graph which defaults to `"#3870FF"`. This has no effect if `graph_type="plot"`. -9. `color`: Color of the plot which defaults to `"#3870FF"`. -10. `solutions`: Defaults to `"all"` which means use all solutions. If `"best"` then only the best solutions are used. -11. `save_dir`: Directory to save the figure. +## `plot_pareto_front_pcp()` -This method has 3 control variables: +Parallel-coordinates view of the final non-dominated set. Each objective is a vertical axis. Each non-dominated solution becomes a polyline that crosses every axis. Values are normalised per objective so very different scales remain comparable. Useful for any M >= 2 and especially for M >= 4. -1. `graph_type="plot"`: Can be `"plot"` (default), `"boxplot"`, or `"histogram"`. -2. `plot_type="plot"`: Identical to the `plot_type` parameter explored in the `plot_fitness()` and `plot_new_solution_rate()` methods. -3. `solutions="all"`: Can be `"all"` (default) or `"best"`. - -These 3 parameters control the style of the output figure. - -The `graph_type` parameter selects the type of the graph which helps to explore the gene values as: - -1. A normal plot. -2. A histogram. -3. A box and whisker plot. - -The `plot_type` parameter works only when the type of the graph is set to `"plot"`. - -The `solutions` parameter selects whether the genes come from all solutions in the population or from just the best solutions. - -An exception is raised if: - -* `solutions="all"` while `save_solutions=False` in the constructor of the `pygad.GA` class. -* `solutions="best"` while `save_best_solutions=False` in the constructor of the `pygad.GA` class. - -#### `graph_type="plot"` - -When `graph_type="plot"`, then the figure creates a normal graph where the relationship between the gene values and the generation numbers is represented as a continuous plot, scattered points, or bars. - -##### `plot_type="plot"` - -Because the default value for both `graph_type` and `plot_type` is `"plot"`, then all of the lines below creates the same figure. This figure is helpful to know whether a gene value lasts for more generations as an indication of the best value for this gene. For example, the value 16 for the gene with index 5 (at column 2 and row 2 of the next graph) lasted for 83 generations. +Parameters: `title`, `xlabel`, `ylabel`, `linewidth`, `font_size`, `color`, `alpha`, `grid`, `save_dir`. ```python -ga_instance.plot_genes() - -ga_instance.plot_genes(graph_type="plot") - -ga_instance.plot_genes(plot_type="plot") - -ga_instance.plot_genes(graph_type="plot", - plot_type="plot") +ga_instance.plot_pareto_front_pcp() ``` -![plot_genes_plot](https://user-images.githubusercontent.com/16560492/122477158-4a62d580-cf95-11eb-8c93-9b6e74cb814c.png) +![plot_pareto_front_pcp](figures/plot_pareto_front_pcp.png) -As the default value for the `solutions` parameter is `"all"`, then the following method calls generate the same plot. +## `plot_pareto_front_scatter_matrix()` -```python -ga_instance.plot_genes(solutions="all") +M-by-M grid of pairwise scatter plots for the final non-dominated set. The diagonal shows a histogram of each objective. The best fit when M >= 4 and a single 3D scatter no longer reads well. -ga_instance.plot_genes(graph_type="plot", - solutions="all") +Parameters: `title`, `font_size`, `color`, `marker`, `alpha`, `grid`, `save_dir`. -ga_instance.plot_genes(plot_type="plot", - solutions="all") - -ga_instance.plot_genes(graph_type="plot", - plot_type="plot", - solutions="all") +```python +ga_instance.plot_pareto_front_scatter_matrix() ``` -##### `plot_type="scatter"` +![plot_pareto_front_scatter_matrix](figures/plot_pareto_front_scatter_matrix.png) -The following calls of the `plot_genes()` method create the same scatter plot. +## `plot_pareto_front_heatmap()` -```python -ga_instance.plot_genes(plot_type="scatter") +Heatmap of the final non-dominated set. Rows are solutions, columns are objectives, colour is the raw objective value. Rows are sorted by objective `sort_by` (default `0`); pass `sort_by=None` to keep the original order. -ga_instance.plot_genes(graph_type="plot", - plot_type="scatter", - solutions='all') -``` - -![plot_genes_scatter](https://user-images.githubusercontent.com/16560492/122477273-73836600-cf95-11eb-828f-f357c7b0f815.png) - -##### `plot_type="bar"` +Parameters: `title`, `xlabel`, `ylabel`, `font_size`, `cmap`, `sort_by`, `save_dir`. ```python -ga_instance.plot_genes(plot_type="bar") - -ga_instance.plot_genes(graph_type="plot", - plot_type="bar", - solutions='all') +ga_instance.plot_pareto_front_heatmap(sort_by=0) ``` -![plot_genes_bar](https://user-images.githubusercontent.com/16560492/122477370-99106f80-cf95-11eb-8643-865b55e6b844.png) +![plot_pareto_front_heatmap](figures/plot_pareto_front_heatmap.png) -#### `graph_type="boxplot"` +## `plot_fitness_band()` -By setting `graph_type` to `"boxplot"`, then a box and whisker graph is created. Now, the `plot_type` parameter has no effect. +Per-generation min, mean, and max with a shaded min-max band. Reveals selection pressure and diversity collapse at a glance. For MOO, pick one objective via `objective_index` (default `0`). Requires `save_solutions=True`. -The following 2 calls of the `plot_genes()` method create the same figure as the default value for the `solutions` parameter is `"all"`. +Parameters: `title`, `xlabel`, `ylabel`, `font_size`, `color`, `band_alpha`, `linewidth`, `objective_index`, `grid`, `save_dir`. ```python -ga_instance.plot_genes(graph_type="boxplot") - -ga_instance.plot_genes(graph_type="boxplot", - solutions='all') +ga_instance.plot_fitness_band() ``` -![plot_genes_boxplot](https://user-images.githubusercontent.com/16560492/122479260-beeb4380-cf98-11eb-8f08-23707929b12c.png) +![plot_fitness_band](figures/plot_fitness_band.png) -#### `graph_type="histogram"` +## `plot_non_dominated_hypervolume()` -For `graph_type="histogram"`, a histogram is created for each gene. As with `graph_type="boxplot"`, the `plot_type` parameter has no effect. +Hypervolume of the non-dominated set per generation. Uses `pygad.utils.quality_indicators.hypervolume`. Pass `reference_point` explicitly, or let the method pick the column-wise min across all saved generations minus `0.1`. Requires `save_solutions=True`. -The following 2 calls of the `plot_genes()` method create the same figure as the default value for the `solutions` parameter is `"all"`. +Parameters: `reference_point`, `title`, `xlabel`, `ylabel`, `font_size`, `color`, `linewidth`, `grid`, `save_dir`. ```python -ga_instance.plot_genes(graph_type="histogram") - -ga_instance.plot_genes(graph_type="histogram", - solutions='all') +ga_instance.plot_non_dominated_hypervolume() ``` -![plot_genes_histogram](https://user-images.githubusercontent.com/16560492/122477314-8007be80-cf95-11eb-9c95-da3f49204151.png) +![plot_non_dominated_hypervolume](figures/plot_non_dominated_hypervolume.png) -All the previous figures can be created for only the best solutions by setting `solutions="best"`. +## `plot_population_diversity()` -## Pareto Front +Mean pairwise Euclidean distance between solutions per generation. A drop signals the population is converging or collapsing into duplicates. Requires `save_solutions=True`. -### `plot_pareto_front_curve()` +Parameters: `title`, `xlabel`, `ylabel`, `font_size`, `color`, `linewidth`, `grid`, `save_dir`. -The `plot_pareto_front_curve()` method creates the Pareto front curve for multi-objective optimization problems. It creates, shows, and returns a figure that shows the Pareto front curve and points representing the fitness. It only works when 2 objectives are used. +```python +ga_instance.plot_population_diversity() +``` -It works only after at least 1 generation is completed. If no generation is completed, an exception is raised. +![plot_population_diversity](figures/plot_population_diversity.png) -This method accepts the following parameters: +## `plot_pareto_front_evolution()` -1. `title`: Title of the figure. -2. `xlabel`: X-axis label. -3. `ylabel`: Y-axis label. -4. `linewidth`: Line width of the plot. Defaults to `3`. -5. `font_size`: Font size for the labels and title. Defaults to `14`. -6. `label`: The label used for the legend. -7. `color`: Color of the plot which defaults to the tomato color `#FF6347`. -8. `color_fitness`: Color of the fitness points which defaults to the royal blue color `#4169E1`. -9. `grid`: Either `True` or `False` to control the visibility of the grid. -10. `alpha`: The transparency of the pareto front curve. -11. `marker`: The marker of the fitness points. -12. `save_dir`: Directory to save the figure. +Overlays the non-dominated set every `every_k` generations on a single figure. The colormap goes from early to late so you can see the front converge. Works for 2 or 3 objectives. Requires `save_solutions=True`. -This is an example of calling the `plot_pareto_front_curve()` method. +Parameters: `every_k`, `title`, `xlabel`, `ylabel`, `zlabel`, `font_size`, `cmap`, `marker`, `alpha`, `grid`, `save_dir`. ```python -ga_instance.plot_pareto_front_curve() +ga_instance.plot_pareto_front_evolution(every_k=20) ``` -![plot_pareto_front_curve](https://github.com/user-attachments/assets/606d853c-7370-41a0-8ddb-857a4c6c7fb9) - +![plot_pareto_front_evolution](figures/plot_pareto_front_evolution.png) diff --git a/examples/plots/example_plot_fitness.py b/examples/plots/example_plot_fitness.py new file mode 100644 index 0000000..bc9b6d5 --- /dev/null +++ b/examples/plots/example_plot_fitness.py @@ -0,0 +1,17 @@ +"""Best-fitness curve for a single-objective GA run on the Sphere benchmark.""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=5) + +ga = pygad.GA(num_generations=50, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1]) +ga.run() + +ga.plot_fitness() diff --git a/examples/plots/example_plot_fitness_band.py b/examples/plots/example_plot_fitness_band.py new file mode 100644 index 0000000..e87acaf --- /dev/null +++ b/examples/plots/example_plot_fitness_band.py @@ -0,0 +1,18 @@ +"""Per-generation min / mean / max fitness band on the Sphere benchmark.""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=5) + +ga = pygad.GA(num_generations=80, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + save_solutions=True) +ga.run() + +ga.plot_fitness_band() diff --git a/examples/plots/example_plot_genes.py b/examples/plots/example_plot_genes.py new file mode 100644 index 0000000..83eacae --- /dev/null +++ b/examples/plots/example_plot_genes.py @@ -0,0 +1,18 @@ +"""Per-gene value drift across generations on a single-objective GA run.""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=5) + +ga = pygad.GA(num_generations=50, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + save_solutions=True) +ga.run() + +ga.plot_genes(graph_type="boxplot") diff --git a/examples/plots/example_plot_new_solution_rate.py b/examples/plots/example_plot_new_solution_rate.py new file mode 100644 index 0000000..4b11c93 --- /dev/null +++ b/examples/plots/example_plot_new_solution_rate.py @@ -0,0 +1,18 @@ +"""Count of new solutions per generation on a single-objective GA run.""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=5) + +ga = pygad.GA(num_generations=50, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + save_solutions=True) +ga.run() + +ga.plot_new_solution_rate() diff --git a/examples/plots/example_plot_non_dominated_hypervolume.py b/examples/plots/example_plot_non_dominated_hypervolume.py new file mode 100644 index 0000000..900f0ab --- /dev/null +++ b/examples/plots/example_plot_non_dominated_hypervolume.py @@ -0,0 +1,23 @@ +"""Hypervolume of the non-dominated set per generation (NSGA-II on ZDT1).""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=80, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + save_solutions=True, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_non_dominated_hypervolume() diff --git a/examples/plots/example_plot_pareto_front_curve_2d.py b/examples/plots/example_plot_pareto_front_curve_2d.py new file mode 100644 index 0000000..a24d460 --- /dev/null +++ b/examples/plots/example_plot_pareto_front_curve_2d.py @@ -0,0 +1,22 @@ +"""2D Pareto front curve from NSGA-II on ZDT1.""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=100, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/plots/example_plot_pareto_front_curve_3d.py b/examples/plots/example_plot_pareto_front_curve_3d.py new file mode 100644 index 0000000..5262439 --- /dev/null +++ b/examples/plots/example_plot_pareto_front_curve_3d.py @@ -0,0 +1,23 @@ +"""3D Pareto front scatter from NSGA-III on DTLZ2 with 3 objectives.""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ2 + +problem = DTLZ2(num_objectives=3, num_distance_vars=5) + +ga = pygad.GA(num_generations=100, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=6, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_curve() diff --git a/examples/plots/example_plot_pareto_front_evolution.py b/examples/plots/example_plot_pareto_front_evolution.py new file mode 100644 index 0000000..8cf3132 --- /dev/null +++ b/examples/plots/example_plot_pareto_front_evolution.py @@ -0,0 +1,23 @@ +"""Pareto front overlaid every k generations (NSGA-II on ZDT1).""" + +import pygad +from pygad.benchmarks.zdt import ZDT1 + +problem = ZDT1(num_genes=10) + +ga = pygad.GA(num_generations=80, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=30, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga2', + save_solutions=True, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_evolution(every_k=20) diff --git a/examples/plots/example_plot_pareto_front_heatmap.py b/examples/plots/example_plot_pareto_front_heatmap.py new file mode 100644 index 0000000..912a931 --- /dev/null +++ b/examples/plots/example_plot_pareto_front_heatmap.py @@ -0,0 +1,23 @@ +"""Heatmap of the final Pareto front (DTLZ2, M=3), sorted by f1.""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ2 + +problem = DTLZ2(num_objectives=3, num_distance_vars=5) + +ga = pygad.GA(num_generations=100, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=6, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_heatmap(sort_by=0) diff --git a/examples/plots/example_plot_pareto_front_pcp.py b/examples/plots/example_plot_pareto_front_pcp.py new file mode 100644 index 0000000..8a5157a --- /dev/null +++ b/examples/plots/example_plot_pareto_front_pcp.py @@ -0,0 +1,23 @@ +"""Parallel-coordinates view of the final Pareto front (DTLZ2, M=3).""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ2 + +problem = DTLZ2(num_objectives=3, num_distance_vars=5) + +ga = pygad.GA(num_generations=100, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=40, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=6, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_pcp() diff --git a/examples/plots/example_plot_pareto_front_scatter_matrix.py b/examples/plots/example_plot_pareto_front_scatter_matrix.py new file mode 100644 index 0000000..615aac8 --- /dev/null +++ b/examples/plots/example_plot_pareto_front_scatter_matrix.py @@ -0,0 +1,23 @@ +"""Pairwise scatter matrix of the final Pareto front (DTLZ2, M=4).""" + +import pygad +from pygad.benchmarks.dtlz import DTLZ2 + +problem = DTLZ2(num_objectives=4, num_distance_vars=5) + +ga = pygad.GA(num_generations=100, + num_parents_mating=20, + fitness_func=problem, + sol_per_pop=60, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + parent_selection_type='nsga3', + nsga3_num_divisions=5, + crossover_type='sbx', + sbx_crossover_eta=30, + mutation_type='polynomial', + polynomial_mutation_eta=20) +ga.run() + +ga.plot_pareto_front_scatter_matrix() diff --git a/examples/plots/example_plot_population_diversity.py b/examples/plots/example_plot_population_diversity.py new file mode 100644 index 0000000..572707b --- /dev/null +++ b/examples/plots/example_plot_population_diversity.py @@ -0,0 +1,18 @@ +"""Mean pairwise distance per generation on the Sphere benchmark.""" + +import pygad +from pygad.benchmarks.classic import Sphere + +problem = Sphere(num_genes=5) + +ga = pygad.GA(num_generations=80, + num_parents_mating=10, + fitness_func=problem, + sol_per_pop=20, + num_genes=problem.num_genes, + init_range_low=problem.bounds[0], + init_range_high=problem.bounds[1], + save_solutions=True) +ga.run() + +ga.plot_population_diversity() diff --git a/pygad/visualize/plot.py b/pygad/visualize/plot.py index 2a8f5ba..3f604b1 100644 --- a/pygad/visualize/plot.py +++ b/pygad/visualize/plot.py @@ -408,7 +408,9 @@ def plot_genes(self, matplt.tight_layout() elif graph_type == "boxplot": - fig = matplt.figure(1, figsize=(0.7*self.num_genes, 6)) + # Width scales with the number of genes so the boxes do not + # crowd, but never shrinks below a readable default. + fig = matplt.figure(figsize=(max(8, 0.7 * self.num_genes), 5)) # Create an axes instance ax = fig.add_subplot(111) @@ -503,12 +505,13 @@ def plot_genes(self, return fig - def plot_pareto_front_curve(self, - title="Pareto Front Curve", - xlabel="Objective 1", - ylabel="Objective 2", - linewidth=3, - font_size=14, + def plot_pareto_front_curve(self, + title="Pareto Front Curve", + xlabel="Objective 1", + ylabel="Objective 2", + zlabel="Objective 3", + linewidth=3, + font_size=14, label="Pareto Front", color="#FF6347", color_fitness="#4169E1", @@ -517,120 +520,700 @@ def plot_pareto_front_curve(self, marker="o", save_dir=None): """ - Draw, show, and return a 2D Pareto front curve for a - two-objective problem. The fitness of every solution in the - current population is plotted as a point, and the points on - Pareto front 0 are connected to form the curve. + Show the Pareto front of the current population. - Only works for multi-objective problems with exactly two - objectives and at least one completed generation. + For 2 objectives: scatter of the population plus a curve + through the non-dominated points. For 3 objectives: 3D + scatter with the non-dominated points highlighted. + + For 4 or more objectives, 2D / 3D scatter no longer reads + well. Use ``plot_pareto_front_pcp``, ``plot_pareto_front_scatter_matrix``, + or ``plot_pareto_front_heatmap`` instead. Parameters ---------- title : str Figure title. - xlabel : str - X-axis label (the first objective). - ylabel : str - Y-axis label (the second objective). + xlabel, ylabel, zlabel : str + Axis labels. ``zlabel`` is only used for 3 objectives. linewidth : numeric - Line width of the Pareto curve. + Line width (2D mode). font_size : numeric - Font size for the title and labels. + Font size for the title and axis labels. label : str - Legend label for the Pareto curve. + Legend label for the Pareto front. color : str - Colour of the Pareto curve. + Colour of the Pareto curve (2D) or non-dominated markers (3D). color_fitness : str - Colour of the per-solution fitness scatter points. + Colour of the population scatter points. grid : bool - Whether to draw the grid lines. + Draw grid lines. alpha : float - Transparency of the Pareto curve. + Transparency of the Pareto curve / population markers. marker : str - Matplotlib marker style for the fitness points. + Marker style for the scatter points. save_dir : str or None - If set, the figure is saved to this path before being - shown. + If set, saves the figure to this path before showing it. Returns ------- fig : matplotlib.figure.Figure - The matplotlib figure that was created. Raises ------ RuntimeError - If no generation has completed yet, the problem is - single-objective, or the number of objectives is not - exactly two. + If no generation has completed, the problem is + single-objective, or M > 3. """ if self.generations_completed < 1: - self.logger.error("The plot_pareto_front_curve() method can only be called after completing at least 1 generation but ({self.generations_completed}) is completed.") - raise RuntimeError("The plot_pareto_front_curve() method can only be called after completing at least 1 generation but ({self.generations_completed}) is completed.") + self.logger.error(f"The plot_pareto_front_curve() method can only be called after completing at least 1 generation but ({self.generations_completed}) is completed.") + raise RuntimeError(f"The plot_pareto_front_curve() method can only be called after completing at least 1 generation but ({self.generations_completed}) is completed.") - if type(self.best_solutions_fitness[0]) in [list, tuple, numpy.ndarray] and len(self.best_solutions_fitness[0]) > 1: - # Multi-objective optimization problem. - if len(self.best_solutions_fitness[0]) == 2: - # Only 2 objectives. Proceed. - pass - else: - # More than 2 objectives. - self.logger.error(f"The plot_pareto_front_curve() method only supports 2 objectives but there are {self.best_solutions_fitness[0]} objectives.") - raise RuntimeError(f"The plot_pareto_front_curve() method only supports 2 objectives but there are {self.best_solutions_fitness[0]} objectives.") + num_objectives = self._num_objectives_or_raise("plot_pareto_front_curve()") + + if num_objectives not in (2, 3): + self.logger.error(f"The plot_pareto_front_curve() method supports 2 or 3 objectives but there are {num_objectives}. For higher dimensions use plot_pareto_front_pcp(), plot_pareto_front_scatter_matrix(), or plot_pareto_front_heatmap().") + raise RuntimeError(f"The plot_pareto_front_curve() method supports 2 or 3 objectives but there are {num_objectives}. For higher dimensions use plot_pareto_front_pcp(), plot_pareto_front_scatter_matrix(), or plot_pareto_front_heatmap().") + + last_fitness = numpy.asarray(self.last_generation_fitness) + non_dominated_fitness = self._last_generation_pareto_front() + + matplt = get_matplotlib() + + if num_objectives == 2: + fig = matplt.figure() + matplt.scatter(last_fitness[:, 0], + last_fitness[:, 1], + marker=marker, + color=color_fitness, + label='Fitness', + alpha=1.0) + order = numpy.argsort(non_dominated_fitness[:, 0]) + matplt.plot(non_dominated_fitness[order, 0], + non_dominated_fitness[order, 1], + marker=marker, + label=label, + alpha=alpha, + color=color, + linewidth=linewidth) + matplt.title(title, fontsize=font_size) + matplt.xlabel(xlabel, fontsize=font_size) + matplt.ylabel(ylabel, fontsize=font_size) + matplt.legend() + matplt.grid(grid) else: - # Single-objective optimization problem. - self.logger.error("The plot_pareto_front_curve() method only works with multi-objective optimization problems.") - raise RuntimeError("The plot_pareto_front_curve() method only works with multi-objective optimization problems.") + fig = matplt.figure() + ax = fig.add_subplot(111, projection='3d') + ax.scatter(last_fitness[:, 0], + last_fitness[:, 1], + last_fitness[:, 2], + marker=marker, + color=color_fitness, + label='Fitness', + alpha=0.6) + ax.scatter(non_dominated_fitness[:, 0], + non_dominated_fitness[:, 1], + non_dominated_fitness[:, 2], + marker=marker, + color=color, + label=label, + alpha=alpha, + s=60) + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + ax.set_zlabel(zlabel, fontsize=font_size) + ax.legend() + if grid: + ax.grid(True) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + + matplt.show() + + return fig + + # ── Helpers shared by the Pareto-front plots ───────────────────────────── + + def _num_objectives_or_raise(self, method_name): + """ + Returns M for a MOO problem and raises for SOO. Used as the + first guard inside every MOO-only plot method. + """ + first_best = self.best_solutions_fitness[0] + if type(first_best) in [list, tuple, numpy.ndarray] and len(first_best) > 1: + return len(first_best) + self.logger.error(f"The {method_name} method only works with multi-objective optimisation problems.") + raise RuntimeError(f"The {method_name} method only works with multi-objective optimisation problems.") - # Plot the pareto front curve. - remaining_set = list(zip(range(0, self.last_generation_fitness.shape[0]), self.last_generation_fitness)) - # The non-dominated set is the pareto front set. - dominated_set, non_dominated_set = self.get_non_dominated_set(remaining_set) + def _last_generation_pareto_front(self): + """ + Returns the non-dominated rows of last_generation_fitness as a + 2D numpy array. Order matches the order returned by + get_non_dominated_set, which is the order the solutions appear + in the population. + """ + last_fitness = numpy.asarray(self.last_generation_fitness) + remaining_set = list(zip(range(last_fitness.shape[0]), last_fitness)) + _, non_dominated_set = self.get_non_dominated_set(remaining_set) + indices = [item[0] for item in non_dominated_set] + return last_fitness[indices] + + def _require_save_solutions(self, method_name): + """Raise unless the GA was constructed with save_solutions=True.""" + if not self.save_solutions: + self.logger.error(f"The {method_name} method requires save_solutions=True in the pygad.GA constructor.") + raise RuntimeError(f"The {method_name} method requires save_solutions=True in the pygad.GA constructor.") + + def _per_generation_fitness(self): + """ + Return a list of length (generations_completed + 1) where + each entry is the fitness array of one generation. Only valid + when save_solutions=True. + """ + per_gen = [] + fitness_flat = numpy.asarray(self.solutions_fitness) + sol_per_pop = self.sol_per_pop + num_blocks = fitness_flat.shape[0] // sol_per_pop + for g in range(num_blocks): + per_gen.append(fitness_flat[g * sol_per_pop:(g + 1) * sol_per_pop]) + return per_gen + + def _per_generation_solutions(self): + """ + Return a list of length (generations_completed + 1) where + each entry is the population array of one generation. Only + valid when save_solutions=True. + """ + per_gen = [] + solutions_flat = numpy.asarray(self.solutions, dtype=float) + sol_per_pop = self.sol_per_pop + num_blocks = solutions_flat.shape[0] // sol_per_pop + for g in range(num_blocks): + per_gen.append(solutions_flat[g * sol_per_pop:(g + 1) * sol_per_pop]) + return per_gen + + # ── Pareto-front views for M >= 3 ──────────────────────────────────────── + + def plot_pareto_front_pcp(self, + title="Pareto Front - Parallel Coordinates", + xlabel="Objective", + ylabel="Normalised value", + linewidth=1.5, + font_size=14, + color="#4169E1", + alpha=0.6, + grid=True, + save_dir=None): + """ + Parallel-coordinates plot of the final non-dominated set. - # Extract the fitness values (objective values) of the non-dominated solutions for plotting. - pareto_front_x = [self.last_generation_fitness[item[0]][0] for item in non_dominated_set] - pareto_front_y = [self.last_generation_fitness[item[0]][1] for item in non_dominated_set] + Every objective gets a vertical axis. Each non-dominated + solution becomes a polyline that crosses all axes. Values are + normalised per objective so axes with very different ranges + stay comparable. - # Sort the Pareto front solutions (optional but can make the plot cleaner) - sorted_pareto_front = sorted(zip(pareto_front_x, pareto_front_y)) + Works for any M >= 2. + + Parameters + ---------- + title, xlabel, ylabel : str + linewidth : numeric + font_size : numeric + color : str + Polyline colour. + alpha : float + grid : bool + save_dir : str or None + + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed or the problem is + single-objective. + """ + if self.generations_completed < 1: + self.logger.error("The plot_pareto_front_pcp() method requires at least one completed generation.") + raise RuntimeError("The plot_pareto_front_pcp() method requires at least one completed generation.") + num_objectives = self._num_objectives_or_raise("plot_pareto_front_pcp()") + + front = self._last_generation_pareto_front() + min_per_obj = front.min(axis=0) + max_per_obj = front.max(axis=0) + spread = numpy.where(max_per_obj > min_per_obj, max_per_obj - min_per_obj, 1.0) + normalised = (front - min_per_obj) / spread matplt = get_matplotlib() + fig, ax = matplt.subplots() + x_axis = numpy.arange(num_objectives) + for row in normalised: + ax.plot(x_axis, row, color=color, alpha=alpha, linewidth=linewidth) + ax.set_xticks(x_axis) + ax.set_xticklabels([f"f{i + 1}" for i in range(num_objectives)], fontsize=font_size) + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + ax.grid(grid) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() + return fig - # Plotting - fig = matplt.figure() - # First, plot the scatter of all points (population) - all_points_x = [self.last_generation_fitness[i][0] for i in range(self.sol_per_pop)] - all_points_y = [self.last_generation_fitness[i][1] for i in range(self.sol_per_pop)] - matplt.scatter(all_points_x, - all_points_y, - marker=marker, - color=color_fitness, - label='Fitness', - alpha=1.0) - - # Then, plot the Pareto front as a curve - pareto_front_x_sorted, pareto_front_y_sorted = zip(*sorted_pareto_front) - matplt.plot(pareto_front_x_sorted, - pareto_front_y_sorted, - marker=marker, - label=label, - alpha=alpha, - color=color, - linewidth=linewidth) + def plot_pareto_front_scatter_matrix(self, + title="Pareto Front - Scatter Matrix", + font_size=14, + color="#4169E1", + marker="o", + alpha=0.6, + grid=True, + save_dir=None): + """ + M-by-M grid of pairwise scatter plots for the final + non-dominated set. The diagonal shows a histogram of each + objective's values. Helpful when M >= 4 and a single 3D + scatter no longer reads well. - matplt.title(title, fontsize=font_size) - matplt.xlabel(xlabel, fontsize=font_size) - matplt.ylabel(ylabel, fontsize=font_size) - matplt.legend() + Parameters + ---------- + title : str + font_size : numeric + color : str + marker : str + alpha : float + grid : bool + save_dir : str or None - matplt.grid(grid) + Returns + ------- + fig : matplotlib.figure.Figure - if not save_dir is None: - matplt.savefig(fname=save_dir, - bbox_inches='tight') + Raises + ------ + RuntimeError + If no generation has completed or the problem is + single-objective. + """ + if self.generations_completed < 1: + self.logger.error("The plot_pareto_front_scatter_matrix() method requires at least one completed generation.") + raise RuntimeError("The plot_pareto_front_scatter_matrix() method requires at least one completed generation.") + num_objectives = self._num_objectives_or_raise("plot_pareto_front_scatter_matrix()") + front = self._last_generation_pareto_front() + + matplt = get_matplotlib() + fig, axes = matplt.subplots(num_objectives, num_objectives, + figsize=(3 * num_objectives, 3 * num_objectives)) + if num_objectives == 1: + axes = numpy.array([[axes]]) + for i in range(num_objectives): + for j in range(num_objectives): + ax = axes[i, j] + if i == j: + ax.hist(front[:, i], color=color, alpha=alpha) + else: + ax.scatter(front[:, j], front[:, i], + color=color, marker=marker, alpha=alpha) + if i == num_objectives - 1: + ax.set_xlabel(f"f{j + 1}", fontsize=font_size) + if j == 0: + ax.set_ylabel(f"f{i + 1}", fontsize=font_size) + ax.grid(grid) + fig.suptitle(title, fontsize=font_size) + fig.tight_layout() + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() + return fig + + def plot_pareto_front_heatmap(self, + title="Pareto Front - Heatmap", + xlabel="Objective", + ylabel="Solution", + font_size=14, + cmap="viridis", + sort_by=0, + save_dir=None): + """ + Heatmap of the final non-dominated set. Rows are solutions, + columns are objectives, colour is the (raw) objective value. + + Parameters + ---------- + title, xlabel, ylabel : str + font_size : numeric + cmap : str + Matplotlib colormap name. + sort_by : int or None + Objective index to sort rows by (ascending). Pass ``None`` + to keep the original order. + save_dir : str or None + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed or the problem is + single-objective. + ValueError + If ``sort_by`` is out of range. + """ + if self.generations_completed < 1: + self.logger.error("The plot_pareto_front_heatmap() method requires at least one completed generation.") + raise RuntimeError("The plot_pareto_front_heatmap() method requires at least one completed generation.") + num_objectives = self._num_objectives_or_raise("plot_pareto_front_heatmap()") + + front = self._last_generation_pareto_front() + if sort_by is not None: + if not (0 <= sort_by < num_objectives): + raise ValueError( + f"sort_by must be an integer in [0, {num_objectives - 1}], " + f"but got {sort_by}.") + order = numpy.argsort(front[:, sort_by]) + front = front[order] + + matplt = get_matplotlib() + fig, ax = matplt.subplots() + image = ax.imshow(front, aspect='auto', cmap=cmap) + ax.set_xticks(numpy.arange(num_objectives)) + ax.set_xticklabels([f"f{i + 1}" for i in range(num_objectives)]) + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + fig.colorbar(image, ax=ax) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') matplt.show() + return fig + # ── Per-generation diagnostics (need save_solutions=True) ──────────────── + + def plot_fitness_band(self, + title="PyGAD - Population fitness band", + xlabel="Generation", + ylabel="Fitness", + font_size=14, + color="#4169E1", + band_alpha=0.2, + linewidth=2, + objective_index=0, + grid=True, + save_dir=None): + """ + Per-generation min / mean / max fitness with a shaded band + between min and max. For MOO problems, picks one objective + via ``objective_index`` (default 0). + + Requires ``save_solutions=True``. + + Parameters + ---------- + title, xlabel, ylabel : str + font_size : numeric + color : str + band_alpha : float + Transparency of the shaded min-max band. + linewidth : numeric + objective_index : int + Which objective to plot for MOO problems. Ignored for SOO. + grid : bool + save_dir : str or None + + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed or save_solutions is False. + ValueError + If ``objective_index`` is out of range for the problem. + """ + if self.generations_completed < 1: + self.logger.error("The plot_fitness_band() method requires at least one completed generation.") + raise RuntimeError("The plot_fitness_band() method requires at least one completed generation.") + self._require_save_solutions("plot_fitness_band()") + + per_gen = self._per_generation_fitness() + first = numpy.asarray(per_gen[0]) + is_moo = first.ndim == 2 and first.shape[1] > 1 + if is_moo: + num_objectives = first.shape[1] + if not (0 <= objective_index < num_objectives): + raise ValueError( + f"objective_index must be in [0, {num_objectives - 1}], " + f"but got {objective_index}.") + min_vals = [gen[:, objective_index].min() for gen in per_gen] + mean_vals = [gen[:, objective_index].mean() for gen in per_gen] + max_vals = [gen[:, objective_index].max() for gen in per_gen] + else: + min_vals = [gen.min() for gen in per_gen] + mean_vals = [gen.mean() for gen in per_gen] + max_vals = [gen.max() for gen in per_gen] + + matplt = get_matplotlib() + fig, ax = matplt.subplots() + generations = numpy.arange(len(per_gen)) + ax.fill_between(generations, min_vals, max_vals, + color=color, alpha=band_alpha, label='min-max') + ax.plot(generations, mean_vals, + color=color, linewidth=linewidth, label='mean') + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + ax.legend() + ax.grid(grid) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() + return fig + + def plot_non_dominated_hypervolume(self, + reference_point=None, + title="PyGAD - Hypervolume per generation", + xlabel="Generation", + ylabel="Hypervolume", + font_size=14, + color="#4169E1", + linewidth=2, + grid=True, + save_dir=None): + """ + Hypervolume of the non-dominated set per generation. + + Requires ``save_solutions=True``. Uses + ``pygad.utils.quality_indicators.hypervolume``. + + Parameters + ---------- + reference_point : array-like or None + Reference point passed to the hypervolume function. Must + be smaller than every fitness value on every objective. + If ``None``, uses ``min(per_gen_fitness) - 0.1`` across all + saved generations, which is usually a safe default. + title, xlabel, ylabel : str + font_size : numeric + color : str + linewidth : numeric + grid : bool + save_dir : str or None + + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed, the problem is + single-objective, or save_solutions is False. + """ + if self.generations_completed < 1: + self.logger.error("The plot_non_dominated_hypervolume() method requires at least one completed generation.") + raise RuntimeError("The plot_non_dominated_hypervolume() method requires at least one completed generation.") + self._num_objectives_or_raise("plot_non_dominated_hypervolume()") + self._require_save_solutions("plot_non_dominated_hypervolume()") + + from pygad.utils.quality_indicators import hypervolume + + per_gen = self._per_generation_fitness() + all_fitness = numpy.vstack([numpy.asarray(g) for g in per_gen]) + if reference_point is None: + reference_point = all_fitness.min(axis=0) - 0.1 + reference_point = numpy.asarray(reference_point, dtype=float) + + hv_values = [hypervolume(numpy.asarray(g), reference_point) for g in per_gen] + + matplt = get_matplotlib() + fig, ax = matplt.subplots() + generations = numpy.arange(len(hv_values)) + ax.plot(generations, hv_values, color=color, linewidth=linewidth) + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + ax.grid(grid) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() + return fig + + def plot_population_diversity(self, + title="PyGAD - Population diversity", + xlabel="Generation", + ylabel="Mean pairwise distance", + font_size=14, + color="#4169E1", + linewidth=2, + grid=True, + save_dir=None): + """ + Mean pairwise Euclidean distance between solutions per + generation. A drop signals the population is converging or + collapsing into a few duplicates. + + Requires ``save_solutions=True``. + + Parameters + ---------- + title, xlabel, ylabel : str + font_size : numeric + color : str + linewidth : numeric + grid : bool + save_dir : str or None + + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed or save_solutions is False. + """ + if self.generations_completed < 1: + self.logger.error("The plot_population_diversity() method requires at least one completed generation.") + raise RuntimeError("The plot_population_diversity() method requires at least one completed generation.") + self._require_save_solutions("plot_population_diversity()") + + per_gen = self._per_generation_solutions() + diversity = [] + for population in per_gen: + diff = population[:, None, :] - population[None, :, :] + distances = numpy.sqrt((diff * diff).sum(axis=2)) + # Mean over the upper triangle (each pair counted once). + n = distances.shape[0] + if n < 2: + diversity.append(0.0) + continue + upper = distances[numpy.triu_indices(n, k=1)] + diversity.append(float(upper.mean())) + + matplt = get_matplotlib() + fig, ax = matplt.subplots() + generations = numpy.arange(len(diversity)) + ax.plot(generations, diversity, color=color, linewidth=linewidth) + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + ax.grid(grid) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() + return fig + + def plot_pareto_front_evolution(self, + every_k=1, + title="Pareto Front Evolution", + xlabel="Objective 1", + ylabel="Objective 2", + zlabel="Objective 3", + font_size=14, + cmap="viridis", + marker="o", + alpha=0.7, + grid=True, + save_dir=None): + """ + Overlay the non-dominated set every ``every_k`` generations. + Colour goes from early generations to late so you can see the + front converging. + + Works for 2 or 3 objectives. Requires ``save_solutions=True``. + + Parameters + ---------- + every_k : int + Plot every k-th generation. ``every_k=1`` plots all of them. + title, xlabel, ylabel, zlabel : str + font_size : numeric + cmap : str + marker : str + alpha : float + grid : bool + save_dir : str or None + + Returns + ------- + fig : matplotlib.figure.Figure + + Raises + ------ + RuntimeError + If no generation has completed, the problem is + single-objective, save_solutions is False, or M > 3. + ValueError + If ``every_k`` is not a positive integer. + """ + if self.generations_completed < 1: + self.logger.error("The plot_pareto_front_evolution() method requires at least one completed generation.") + raise RuntimeError("The plot_pareto_front_evolution() method requires at least one completed generation.") + num_objectives = self._num_objectives_or_raise("plot_pareto_front_evolution()") + if num_objectives not in (2, 3): + self.logger.error(f"The plot_pareto_front_evolution() method supports 2 or 3 objectives but there are {num_objectives}.") + raise RuntimeError(f"The plot_pareto_front_evolution() method supports 2 or 3 objectives but there are {num_objectives}.") + self._require_save_solutions("plot_pareto_front_evolution()") + if not (isinstance(every_k, int) and every_k > 0): + raise ValueError(f"every_k must be a positive integer, but got {every_k}.") + + per_gen = self._per_generation_fitness() + # Pick generations to draw. Always include the last one. + indices = list(range(0, len(per_gen), every_k)) + if indices[-1] != len(per_gen) - 1: + indices.append(len(per_gen) - 1) + + matplt = get_matplotlib() + colormap = matplt.get_cmap(cmap) + fig = matplt.figure() + if num_objectives == 2: + ax = fig.add_subplot(111) + else: + ax = fig.add_subplot(111, projection='3d') + + for plot_idx, gen_idx in enumerate(indices): + fraction = plot_idx / max(len(indices) - 1, 1) + color = colormap(fraction) + gen_fitness = numpy.asarray(per_gen[gen_idx]) + remaining_set = list(zip(range(gen_fitness.shape[0]), gen_fitness)) + _, non_dominated_set = self.get_non_dominated_set(remaining_set) + front_indices = [item[0] for item in non_dominated_set] + front = gen_fitness[front_indices] + if num_objectives == 2: + ax.scatter(front[:, 0], front[:, 1], + color=color, marker=marker, alpha=alpha, + label=f"gen {gen_idx}") + else: + ax.scatter(front[:, 0], front[:, 1], front[:, 2], + color=color, marker=marker, alpha=alpha, + label=f"gen {gen_idx}") + + ax.set_title(title, fontsize=font_size) + ax.set_xlabel(xlabel, fontsize=font_size) + ax.set_ylabel(ylabel, fontsize=font_size) + if num_objectives == 3: + ax.set_zlabel(zlabel, fontsize=font_size) + if len(indices) <= 8: + ax.legend() + if num_objectives == 2: + ax.grid(grid) + elif grid: + ax.grid(True) + + if save_dir is not None: + matplt.savefig(fname=save_dir, bbox_inches='tight') + matplt.show() return fig diff --git a/tests/test_visualize.py b/tests/test_visualize.py index a2900d0..8b50406 100644 --- a/tests/test_visualize.py +++ b/tests/test_visualize.py @@ -187,6 +187,162 @@ def test_visualize_save_dir(): print("test_visualize_save_dir passed.") +def _build_three_objective_ga(num_generations=4, sol_per_pop=10, save_solutions=False): + def fitness_func_three(ga_instance, solution, solution_idx): + return [numpy.sum(solution ** 2), + numpy.sum(solution), + float(solution[0])] + + ga = pygad.GA(num_generations=num_generations, + num_parents_mating=4, + fitness_func=fitness_func_three, + sol_per_pop=sol_per_pop, + num_genes=3, + parent_selection_type="nsga2", + save_solutions=save_solutions, + random_seed=0, + suppress_warnings=True) + ga.run() + return ga + + +def test_plot_pareto_front_curve_three_objectives_returns_3d_figure(): + ga = _build_three_objective_ga() + fig = ga.plot_pareto_front_curve() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_pareto_front_curve_rejects_four_or_more_objectives(): + def fitness_four(ga_instance, solution, solution_idx): + return [float(solution[0]), float(solution[1]), + float(solution[2]), float(solution[0]) + float(solution[1])] + + ga = pygad.GA(num_generations=2, + num_parents_mating=4, + fitness_func=fitness_four, + sol_per_pop=8, + num_genes=3, + parent_selection_type="nsga2", + random_seed=0, + suppress_warnings=True) + ga.run() + try: + ga.plot_pareto_front_curve() + except RuntimeError as exc: + assert "2 or 3 objectives" in str(exc) + else: + raise AssertionError("plot_pareto_front_curve() should reject M >= 4") + + +def test_plot_pareto_front_pcp_returns_figure(): + ga = _build_three_objective_ga() + fig = ga.plot_pareto_front_pcp() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_pareto_front_scatter_matrix_returns_figure(): + ga = _build_three_objective_ga() + fig = ga.plot_pareto_front_scatter_matrix() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_pareto_front_heatmap_returns_figure_and_validates_sort_by(): + ga = _build_three_objective_ga() + fig = ga.plot_pareto_front_heatmap() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + try: + ga.plot_pareto_front_heatmap(sort_by=99) + except ValueError: + pass + else: + raise AssertionError("plot_pareto_front_heatmap() should reject out-of-range sort_by") + + +def test_plot_fitness_band_requires_save_solutions(): + ga = pygad.GA(num_generations=3, + num_parents_mating=2, + fitness_func=fitness_func, + sol_per_pop=6, + num_genes=2, + random_seed=0, + suppress_warnings=True) + ga.run() + try: + ga.plot_fitness_band() + except RuntimeError as exc: + assert "save_solutions" in str(exc) + else: + raise AssertionError("plot_fitness_band() should require save_solutions=True") + + +def test_plot_fitness_band_returns_figure_when_save_solutions_true(): + ga = pygad.GA(num_generations=3, + num_parents_mating=2, + fitness_func=fitness_func, + sol_per_pop=6, + num_genes=2, + save_solutions=True, + random_seed=0, + suppress_warnings=True) + ga.run() + fig = ga.plot_fitness_band() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_non_dominated_hypervolume_returns_figure(): + ga = _build_three_objective_ga(save_solutions=True) + fig = ga.plot_non_dominated_hypervolume() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_non_dominated_hypervolume_requires_save_solutions(): + ga = _build_three_objective_ga(save_solutions=False) + try: + ga.plot_non_dominated_hypervolume() + except RuntimeError as exc: + assert "save_solutions" in str(exc) + else: + raise AssertionError("plot_non_dominated_hypervolume() should require save_solutions=True") + + +def test_plot_population_diversity_returns_figure(): + ga = pygad.GA(num_generations=4, + num_parents_mating=2, + fitness_func=fitness_func, + sol_per_pop=6, + num_genes=3, + save_solutions=True, + random_seed=0, + suppress_warnings=True) + ga.run() + fig = ga.plot_population_diversity() + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_pareto_front_evolution_returns_figure(): + ga = _build_three_objective_ga(save_solutions=True) + fig = ga.plot_pareto_front_evolution(every_k=2) + assert isinstance(fig, matplotlib.figure.Figure) + plt.close(fig) + + +def test_plot_pareto_front_evolution_rejects_non_positive_k(): + ga = _build_three_objective_ga(save_solutions=True) + try: + ga.plot_pareto_front_evolution(every_k=0) + except ValueError: + pass + else: + raise AssertionError("plot_pareto_front_evolution() should reject every_k <= 0") + + if __name__ == "__main__": test_plot_fitness_parameters() test_plot_new_solution_rate_parameters() From e767267b345cdd803ee41fa01ad6261f98843fa1 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 06:06:23 -0400 Subject: [PATCH 10/17] Comment on reference points --- pygad/utils/engine.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pygad/utils/engine.py b/pygad/utils/engine.py index f9d56a9..99dd689 100644 --- a/pygad/utils/engine.py +++ b/pygad/utils/engine.py @@ -533,6 +533,13 @@ def run(self): elif type(self.last_generation_fitness[0]) in [list, tuple, numpy.ndarray]: # Multi-objective problem. if self.parent_selection_type in ('nsga3', 'tournament_nsga3'): + # The reference points are created before starting the evolution and after the initial fitness is calculated. + # The number of reference points is determined based on: + # 1) The number of divisions (passed by the user). + # 2) The number of objectives (only known after the fitness is calculated). + # In PyGAD, the number of objectives are known only from the length of the returned result of the fitness function. + # This is how NSGA-III knows the number of objectives from the calculated fitness. + # It is time to build the reference points. self._bootstrap_nsga3_reference_points() best_solution, best_solution_fitness, best_match_idx = self.best_solution(pop_fitness=self.last_generation_fitness) From 1d8ed98869a38294cada214ea10fe356bef4c7df Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 08:40:20 -0400 Subject: [PATCH 11/17] Use American English --- pygad/benchmarks/__init__.py | 2 +- pygad/benchmarks/zdt.py | 2 +- pygad/utils/nsga3.py | 25 +++++++++++++------------ pygad/utils/quality_indicators.py | 8 ++++---- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/pygad/benchmarks/__init__.py b/pygad/benchmarks/__init__.py index 79b0e47..8af9da7 100644 --- a/pygad/benchmarks/__init__.py +++ b/pygad/benchmarks/__init__.py @@ -3,7 +3,7 @@ Each problem class can be called with the fitness signature (ga, solution, sol_idx) and returns a fitness in PyGAD's -maximisation format. For problems that are normally written as +maximization format. For problems that are normally written as minimisation, the values are negated. Each class also exposes num_genes, num_objectives, and bounds so diff --git a/pygad/benchmarks/zdt.py b/pygad/benchmarks/zdt.py index befd10e..2fabe52 100644 --- a/pygad/benchmarks/zdt.py +++ b/pygad/benchmarks/zdt.py @@ -3,7 +3,7 @@ Two objectives. Variables live in [0, 1] (ZDT4 uses a wider range for some). Every class has a pareto_front() method that returns -points on the true front in PyGAD's maximisation format (negated), +points on the true front in PyGAD's maximization format (negated), which you can pass to the IGD and GD indicators as reference_front. """ diff --git a/pygad/utils/nsga3.py b/pygad/utils/nsga3.py index 6fef25e..d47bca0 100644 --- a/pygad/utils/nsga3.py +++ b/pygad/utils/nsga3.py @@ -66,7 +66,7 @@ def find_extreme_points(self, fitness, ideal_point, epsilon=ASF_EPSILON): """ For each objective axis, find the solution that best represents the corner of that axis. This is done by running the Achievement - Scalarising Function (ASF) once per axis with a weight vector that + Scalarizing Function (ASF) once per axis with a weight vector that puts weight 1.0 on the target axis and a tiny weight (epsilon) on every other axis. The solution with the smallest ASF score wins. @@ -105,11 +105,11 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): """ Fit a hyperplane through the M extreme points and return the intercept point on each axis. The result is the point we use to - scale every objective to the [0, 1] range during normalisation. + scale every objective to the [0, 1] range during normalization. The NSGA-III paper define the intercept as the point that - normalises to value 1 on its own axis (i.e. each extreme row lands - on a simplex corner after normalisation). The math is: + normalizes to value 1 on its own axis (i.e. each extreme row lands + on a simplex corner after normalization). The math is: (extreme_points - ideal_point) @ b = 1 intercepts = ideal_point + 1 / b @@ -117,14 +117,14 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): When the linear system cannot be solved, when any coefficient is too close to zero, or when the resulting intercept ends up on the wrong side of the ideal point, fall back to the worst observed - value per objective (the column minimum under maximisation). + value per objective (the column minimum under maximization). Two extra safety steps run after the linear solve: 1. If an intercept value extrapolates past the worst observed value for that objective, clip it back to the worst value. 2. If the gap between an intercept and the ideal point shrinks below INTERCEPT_NEAR_ZERO after clipping, replace that - intercept with the worst observed value so the normalisation + intercept with the worst observed value so the normalization denominator stays non-zero. Parameters @@ -145,7 +145,7 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): ideal_point = numpy.asarray(ideal_point, dtype=float) extreme_points = numpy.asarray(extreme_points, dtype=float) fallback_fitness = numpy.asarray(fallback_fitness, dtype=float) - # Worst per objective under maximisation is the column minimum. + # Worst per objective under maximization is the column minimum. worst_per_objective = fallback_fitness.min(axis=0) translated = extreme_points - ideal_point try: @@ -158,8 +158,8 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): if numpy.any(numpy.abs(coefficients) < INTERCEPT_NEAR_ZERO): return worst_per_objective intercepts = ideal_point + 1.0 / coefficients - # Under maximisation a valid intercept sits strictly below the - # ideal. If it does not, the normalisation denominator would flip + # Under maximization a valid intercept sits strictly below the + # ideal. If it does not, the normalization denominator would flip # sign and produce nonsense values. if numpy.any(intercepts >= ideal_point - INTERCEPT_NEAR_ZERO): return worst_per_objective @@ -188,7 +188,7 @@ def normalise_fitness(self, fitness, ideal_point, intercepts): Parameters ---------- fitness : numpy.ndarray - The fitness array to normalise. + The fitness array to normalize. ideal_point : numpy.ndarray The ideal point. intercepts : numpy.ndarray @@ -370,10 +370,10 @@ def nsga3_selection(self, fitness, num_parents): def _pick_critical_front_survivors(self, accepted_indices, fl_indices, fitness, K): """ - Run the NSGA-III normalisation and niching steps on the pool + Run the NSGA-III normalization and niching steps on the pool P_next U Fl, then ask niching_select for K survivors from Fl. - The ideal point, extreme points, intercepts and normalised values + The ideal point, extreme points, intercepts and normalized values are all computed on the combined pool (accepted plus critical front) because that is what the NSGA-III paper specifies. """ @@ -590,6 +590,7 @@ def _enumerate_compositions(num_objectives, num_divisions): if num_objectives == 1: yield [num_divisions] return + # 13 for first in range(num_divisions + 1): for rest in _enumerate_compositions(num_objectives - 1, num_divisions - first): yield [first] + rest diff --git a/pygad/utils/quality_indicators.py b/pygad/utils/quality_indicators.py index 673e080..38fa922 100644 --- a/pygad/utils/quality_indicators.py +++ b/pygad/utils/quality_indicators.py @@ -11,7 +11,7 @@ point to its nearest reference point. 4. spacing: how evenly the approximation points are spread. -All functions take fitness values in PyGAD's maximisation format +All functions take fitness values in PyGAD's maximization format (higher is better). The reference point for hypervolume must be worse than every solution on every axis. """ @@ -142,7 +142,7 @@ def inverted_generational_distance(fitness, reference_front): ---------- fitness : numpy.ndarray Approximation front, shape (num_solutions, num_objectives), - in PyGAD's maximisation format. + in PyGAD's maximization format. reference_front : numpy.ndarray Reference front, shape (num_reference_points, num_objectives), in the same format. @@ -165,7 +165,7 @@ def generational_distance(fitness, reference_front): ---------- fitness : numpy.ndarray Approximation front, shape (num_solutions, num_objectives), - in PyGAD's maximisation format. + in PyGAD's maximization format. reference_front : numpy.ndarray Reference front, shape (num_reference_points, num_objectives), in the same format. @@ -190,7 +190,7 @@ def spacing(fitness): ---------- fitness : numpy.ndarray Approximation front, shape (num_solutions, num_objectives), - in PyGAD's maximisation format. + in PyGAD's maximization format. Returns ------- From 8496c99088ba59bed4cdac13f634d78bdc757e1b Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 09:28:06 -0400 Subject: [PATCH 12/17] Formatting issues, support PDF report, more tests --- docs/source/pygad.md | 306 +++++++++++--- docs/source/releases.md | 10 +- docs/source/utils.md | 49 ++- docs/source/visualize.md | 4 +- examples/example_generate_report.py | 40 ++ pygad/benchmarks/classic.py | 2 +- pygad/benchmarks/dtlz.py | 2 +- pygad/benchmarks/tsp.py | 2 +- pygad/helper/activations.py | 8 +- pygad/kerasga/kerasga.py | 2 +- pygad/pygad.py | 2 + pygad/torchga/torchga.py | 314 +++++++------- pygad/utils/__init__.py | 2 + pygad/utils/engine.py | 181 ++++++++ pygad/utils/nsga.py | 127 ++++++ pygad/utils/nsga2.py | 171 +------- pygad/utils/nsga3.py | 487 ++++++---------------- pygad/utils/parent_selection.py | 244 ++++++++++- pygad/utils/quality_indicators.py | 2 +- pygad/utils/report.py | 566 ++++++++++++++++++++++++++ pygad/visualize/plot.py | 24 +- pyproject.toml | 1 + tests/test_nsga3.py | 183 +++++---- tests/test_nsga3_dtlz2.py | 22 +- tests/test_nsga3_pipeline.py | 215 +++++----- tests/test_nsga3_population_growth.py | 198 +++++++++ tests/test_report.py | 164 ++++++++ 27 files changed, 2350 insertions(+), 978 deletions(-) create mode 100644 examples/example_generate_report.py create mode 100644 pygad/utils/nsga.py create mode 100644 pygad/utils/report.py create mode 100644 tests/test_nsga3_population_growth.py create mode 100644 tests/test_report.py diff --git a/docs/source/pygad.md b/docs/source/pygad.md index 6913cfb..f7432b8 100644 --- a/docs/source/pygad.md +++ b/docs/source/pygad.md @@ -497,25 +497,29 @@ To keep the library modular and structured, the code is split into several scrip Here is the list of scripts and the classes that the `pygad.GA` class extends: 1. `utils/engine.py`: - 1. `utils.engine.GAEngine`: + 1. `utils.engine.GAEngine`: Runs the GA loop and owns the run-time lifecycle helpers. 2. `utils/validation.py` - 1. `utils.validation.Validation` + 1. `utils.validation.Validation`: Validates every constructor parameter and dispatches `parent_selection_type` / `crossover_type` / `mutation_type` to the right method. 3. `utils/parent_selection.py` - 1. `utils.parent_selection.ParentSelection` + 1. `utils.parent_selection.ParentSelection`: All built-in parent selection operators, including `nsga2_selection`, `tournament_selection_nsga2`, `nsga3_selection`, and `tournament_selection_nsga3`. 4. `utils/crossover.py` - 1. `utils.crossover.Crossover` + 1. `utils.crossover.Crossover`: Built-in crossover operators. 5. `utils/mutation.py` - 1. `utils.mutation.Mutation` -6. `utils/nsga2.py` - 1. `utils.nsga2.NSGA2` -7. `utils/nsga3.py` - 1. `utils.nsga3.NSGA3` -8. `helper/unique.py` - 1. `helper.unique.Unique` -9. `helper/misc.py` - 1. `helper.misc.Helper` -10. `visualize/plot.py` - 1. `visualize.plot.Plot` + 1. `utils.mutation.Mutation`: Built-in mutation operators. +6. `utils/nsga.py` + 1. `utils.nsga.NSGA`: Building blocks shared by NSGA-II and NSGA-III (`non_dominated_sorting`, `get_non_dominated_set`). +7. `utils/nsga2.py` + 1. `utils.nsga2.NSGA2`: NSGA-II specific primitives (`crowding_distance`, `sort_solutions_nsga2`). +8. `utils/nsga3.py` + 1. `utils.nsga3.NSGA3`: NSGA-III algorithm primitives (reference points, ideal point, extreme points, intercepts, normalization, association, niching). +9. `utils/report.py` + 1. `utils.report.Report`: Builds a PDF report of the run (`generate_report`). +10. `helper/unique.py` + 1. `helper.unique.Unique`: Routines that resolve duplicate genes inside a solution. +11. `helper/misc.py` + 1. `helper.misc.Helper`: Generic helpers used across the library (population dtype handling, per-gene value generation, constraint sampling, lifecycle summary). +12. `visualize/plot.py` + 1. `visualize.plot.Plot`: All plot methods. See [`pygad.visualize`](https://pygad.readthedocs.io/en/latest/visualize.html). Since the `pygad.GA` class extends such classes, the attributes and methods inside them can be retrieved by instances of the `pygad.GA` class. @@ -527,53 +531,222 @@ Since the `pygad.GA` class extends such classes, the attributes and methods insi ### Other Instance Attributes & Methods -All the parameters and functions passed to the `pygad.GA` class constructor are used as class attributes and methods in the instances of the `pygad.GA` class. In addition to such attributes, there are other attributes and methods added to the instances of the `pygad.GA` class: - -The next 2 subsections list such attributes and methods. +All the parameters and functions passed to the `pygad.GA` class constructor are used as class attributes and methods in the instances of the `pygad.GA` class. In addition to such attributes, there are other attributes and methods added to the instances of the `pygad.GA` class. > The `GA` class gains the attributes of its parent classes via inheritance, making them accessible through the `GA` object even if they are defined externally to its specific class body. -#### Other Attributes +> Names that begin with an underscore (for example `_bootstrap_nsga3_reference_points`) are internal helpers. They are listed below for completeness but are not part of the stable API; do not rely on their signature staying the same across releases. -- `generations_completed`: Holds the number of the last completed generation. -- `population`: A NumPy array that initially holds the initial population and is later updated after each generation. -- `valid_parameters`: Set to `True` when all the parameters passed in the `GA` class constructor are valid. +#### Lifecycle + +##### Attributes + +- `generations_completed`: Number of the last completed generation. - `run_completed`: Set to `True` only after the `run()` method completes gracefully. -- `pop_size`: The population size. -- `best_solutions_fitness`: A list holding the fitness values of the best solutions for all generations. -- `best_solution_generation`: The generation number at which the best fitness value is reached. It is only assigned the generation number after the `run()` method completes. Otherwise, its value is -1. -- `best_solutions`: A NumPy array holding the best solution per each generation. It only exists when the `save_best_solutions` parameter in the `pygad.GA` class constructor is set to `True`. -- `last_generation_fitness`: The fitness values of the solutions in the last generation. [Added in PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). -- `previous_generation_fitness`: At the end of each generation, the fitness of the most recent population is saved in the `last_generation_fitness` attribute. The fitness of the population exactly preceding this most recent population is saved in the `previous_generation_fitness` attribute. This `previous_generation_fitness` attribute is used to fetch the pre-calculated fitness instead of calling the fitness function for already explored solutions. [Added in PyGAD 2.16.2](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-16-2). -- `last_generation_parents`: The parents selected from the last generation. [Added in PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). -- `last_generation_offspring_crossover`: The offspring generated after applying the crossover in the last generation. [Added in PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). -- `last_generation_offspring_mutation`: The offspring generated after applying the mutation in the last generation. [Added in PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). -- `gene_type_single`: A flag that is set to `True` if the `gene_type` parameter is assigned to a single data type that is applied to all genes. If `gene_type` is assigned a `list`, `tuple`, or `numpy.ndarray`, then the value of `gene_type_single` will be `False`. [Added in PyGAD 2.14.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-14-0). -- `last_generation_parents_indices`: This attribute holds the indices of the selected parents in the last generation. Supported in [PyGAD 2.15.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-15-0). -- `last_generation_elitism`: This attribute holds the elitism of the last generation. It is effective only if the `keep_elitism` parameter has a non-zero value. Supported in [PyGAD 2.18.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-18-0). -- `last_generation_elitism_indices`: This attribute holds the indices of the elitism of the last generation. It is effective only if the `keep_elitism` parameter has a non-zero value. Supported in [PyGAD 2.19.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-19-0). -- `logger`: This attribute holds the logger from the `logging` module. Supported in [PyGAD 3.0.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-0-0). -- `gene_space_unpacked`: This is the unpacked version of the `gene_space` parameter. For example, `range(1, 5)` is unpacked to `[1, 2, 3, 4]`. For an infinite range like `{'low': 2, 'high': 4}`, then it is unpacked to a limited number of values (e.g. 100). Supported in [PyGAD 3.1.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-1-0). -- `pareto_fronts`: A new instance attribute named `pareto_fronts` added to the `pygad.GA` instances that holds the pareto fronts when solving a multi-objective problem. Supported in [PyGAD 3.2.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-2-0). +- `valid_parameters`: Set to `True` when all the parameters passed in the `GA` class constructor are valid. +- `run_start_time`: Monotonic clock value captured right before the generation loop starts. Internal. +- `logger`: Logger object from the `logging` module. Supported in [PyGAD 3.0.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-0-0). -Note that the attributes with names starting with `last_generation_` are updated after each generation. +##### Methods + +- `run()`: Runs the generation loop. The main entry point. +- `run_loop_head(best_solution_fitness)`: Per-generation pre-loop bookkeeping. Internal; called from inside `run()`. Added in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). +- `run_select_parents(call_on_parents=True)`: Select parents and call `on_parents` when defined. Internal; called from inside `run()`. Pass `call_on_parents=False` when refreshing the parent set at the end of `run()`. Added in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). +- `run_crossover()`: Apply crossover and call `on_crossover` when defined. Internal. Added in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). +- `run_mutation()`: Apply mutation and call `on_mutation` when defined. Internal. Added in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). +- `run_update_population()`: Replace `self.population` with the crossed-over and mutated offspring. Internal. Added in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). +- `summary(...)`: Prints a Keras-like summary of the PyGAD lifecycle. Added in [PyGAD 2.19.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-19-0). See [Print Lifecycle Summary](https://pygad.readthedocs.io/en/latest/logging.html#print-lifecycle-summary). + +#### Population and Initialization + +##### Attributes + +- `population`: A NumPy array that initially holds the initial population and is later updated after each generation. +- `initial_population`: Frozen copy of the initial population, set after `initialize_population` runs. +- `pop_size`: A `(sol_per_pop, num_genes)` tuple describing the population shape. +- `gene_type_single`: `True` when every gene shares the same dtype; `False` when `gene_type` is a list/tuple/numpy.ndarray. Added in [PyGAD 2.14.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-14-0). +- `gene_space_unpacked`: Unpacked version of `gene_space`. For example, `range(1, 5)` becomes `[1, 2, 3, 4]`; `{'low': 2, 'high': 4}` becomes a finite sample. Added in [PyGAD 3.1.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-1-0). + +##### Methods + +- `initialize_population(allow_duplicate_genes, gene_type, gene_constraint)`: Build the initial population, apply gene types and constraints, resolve duplicates when not allowed. +- `initialize_parents_array(shape)`: Allocate an empty parents (or offspring) array with the right dtype. +- `change_population_dtype_and_round(population)`: Cast a 2D population to the dtype encoded in `self.gene_type` and round non-integer genes. +- `change_gene_dtype_and_round(gene_index, gene_value)`: Same as above, but for a single gene value. +- `round_genes(solutions)`: Round genes in a 2D array according to `self.gene_type` precision. +- `get_initial_population_range(gene_index)`: Return the `[init_range_low, init_range_high]` window for a specific gene. +- `get_random_mutation_range(gene_index)`: Return the `[random_mutation_min_val, random_mutation_max_val]` window for a specific gene. +- `get_gene_dtype(gene_index)`: Return the `(type, precision)` pair for a specific gene. +- `generate_gene_value(...)`: Sample a single gene value from the gene space or from the configured range. +- `generate_gene_value_from_space(...)`: Sample a single gene value from `gene_space`. +- `generate_gene_value_randomly(...)`: Sample a single gene value from the configured numeric range. + +#### Fitness + +##### Attributes + +- `last_generation_fitness`: Fitness values of the solutions in the last generation. Added in [PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). +- `previous_generation_fitness`: Fitness of the population one step before `last_generation_fitness`. Used to skip re-evaluating solutions PyGAD has already seen. Added in [PyGAD 2.16.2](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-16-2). +- `best_solutions_fitness`: List of best-solution fitness per generation. +- `best_solutions`: A NumPy array of the best solution per generation. Only populated when `save_best_solutions=True`. +- `best_solutions_fitness`: Fitness for every entry in `best_solutions`. +- `solutions`: All visited solutions when `save_solutions=True`. +- `solutions_fitness`: Fitness for every entry in `solutions`. +- `best_solution_generation`: Generation at which the best fitness was reached. `-1` until `run()` completes. + +##### Methods + +- `cal_pop_fitness()`: Compute the fitness of every solution in the current population, reusing previously calculated values where possible. +- `best_solution(pop_fitness=None)`: Return the best solution, its fitness, and its population index. +- `adaptive_mutation_population_fitness(offspring)`: Average fitness used by adaptive mutation to split solutions into low / high quality. + +#### Parent Selection (general) + +##### Attributes + +- `last_generation_parents`: Parents selected in the last generation. Added in [PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). +- `last_generation_parents_indices`: Indices of the selected parents in `self.population`. Added in [PyGAD 2.15.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-15-0). + +##### Methods + +- `select_parents(fitness, num_parents)`: Active parent-selection method. Bound during validation according to `parent_selection_type`. +- `steady_state_selection(fitness, num_parents)`: Steady-state selection. +- `rank_selection(fitness, num_parents)`: Rank-based selection. +- `random_selection(fitness, num_parents)`: Random selection. +- `tournament_selection(fitness, num_parents)`: K-tournament selection. +- `roulette_wheel_selection(fitness, num_parents)`: Roulette-wheel selection. +- `stochastic_universal_selection(fitness, num_parents)`: SUS selection. +- `wheel_cumulative_probs(probs, num_parents)`: Build the `[start, end)` ranges used by RWS and SUS. + +#### Multi-Objective Optimization (NSGA-II) + +##### Attributes + +- `pareto_fronts`: List of the Pareto fronts of the last generation when running a multi-objective problem. Each front is a NumPy array of `(population_index, fitness_vector)` pairs. Added in [PyGAD 3.2.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-2-0). + +##### Methods + +- `non_dominated_sorting(fitness)`: Sort the population into Pareto fronts. Defined in `utils.nsga.NSGA` and shared with NSGA-III. +- `get_non_dominated_set(curr_solutions)`: Split the current set of solutions into a dominated and non-dominated subset. Defined in `utils.nsga.NSGA`. +- `crowding_distance(pareto_front, fitness)`: Per-solution crowding distance inside a Pareto front. Defined in `utils.nsga2.NSGA2`. +- `sort_solutions_nsga2(fitness, find_best_solution=False)`: Sort population indices best-to-worst using Pareto fronts and crowding distance for MOO; descending fitness for SOO. Defined in `utils.nsga2.NSGA2`. +- `nsga2_selection(fitness, num_parents)`: NSGA-II parent selection. Defined in `utils.parent_selection.ParentSelection`. +- `tournament_selection_nsga2(fitness, num_parents)`: K-tournament with non-dominated rank + crowding distance as tiebreakers. Defined in `utils.parent_selection.ParentSelection`. + +#### Multi-Objective Optimization (NSGA-III) + +##### Attributes + +- `nsga3_num_divisions`: Stored value of the `nsga3_num_divisions` constructor parameter. Used when building the reference grid. +- `nsga3_reference_points`: Structured grid of reference points on the unit simplex. A 2D NumPy array of shape `(n_points, num_objectives)` where each row sums to 1. Built once before the generation loop starts (`_bootstrap_nsga3_reference_points`). Re-used for every generation. + +##### Methods (algorithm primitives in `utils.nsga3.NSGA3`) + +- `nsga3_generate_reference_points(num_objectives, num_divisions)`: Build the Das-Dennis grid. +- `nsga3_compute_ideal_point(fitness)`: Best fitness per objective across the input rows (column max under maximization). +- `nsga3_find_extreme_points(fitness, ideal_point, epsilon=NSGA3_ASF_EPSILON)`: For each objective, find the row that best represents the corner of that axis using the ASF. +- `nsga3_compute_intercepts(extreme_points, ideal_point, fallback_fitness)`: Fit a hyperplane through the extreme points and return per-axis intercepts. Falls back to the nadir on singular systems. +- `nsga3_normalize_fitness(fitness, ideal_point, intercepts)`: Scale each fitness row to the unit hypercube and clip outliers to `[0, 1]`. +- `nsga3_associate_to_reference_points(normalized, reference_points)`: For every normalized row, find the closest reference line and the perpendicular distance to it. +- `nsga3_niching_select(critical_front_indices, critical_front_associations, critical_front_distances, accepted_associations, num_reference_points, num_to_select)`: Niching loop that picks survivors from the critical front to preserve diversity across reference points. + +##### Methods (selection in `utils.parent_selection.ParentSelection`) -#### Other Methods +- `nsga3_selection(fitness, num_parents)`: NSGA-III parent selection. +- `tournament_selection_nsga3(fitness, num_parents)`: K-tournament with niche count + perpendicular distance as tiebreakers. +- `_nsga3_pick_critical_front_survivors(...)`: Run normalization and niching on `P_next ∪ critical_front` and return the picked survivors. Internal. +- `_nsga3_pick_tournament_winner(...)`: Decide the winner of one K-tournament round under NSGA-III rules. Internal. +- `_nsga3_build_parents(final_indices, num_parents)`: Copy the chosen rows out of the population into a new parents array. Internal. -- `cal_pop_fitness()`: A method that calculates the fitness values for all solutions within the population by calling the function passed to the `fitness_func` parameter for each solution. -- `crossover()`: Refers to the method that applies the crossover operator based on the selected type of crossover in the `crossover_type` property. -- `mutation()`: Refers to the method that applies the mutation operator based on the selected type of mutation in the `mutation_type` property. -- `select_parents()`: Refers to a method that selects the parents based on the parent selection type specified in the `parent_selection_type` attribute. -- `adaptive_mutation_population_fitness()`: Returns the average fitness value used in the adaptive mutation to filter the solutions. -- `summary()`: Prints a Keras-like summary of the PyGAD lifecycle. This helps to have an overview of the architecture. Supported in [PyGAD 2.19.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-19-0). Check the [Print Lifecycle Summary](https://pygad.readthedocs.io/en/latest/logging.html#print-lifecycle-summary) section for more details and examples. -- 5 methods with names starting with `run_`. Their purpose is to keep the main loop inside the `run()` method clean. The details inside the loop are moved to 4 individual methods. Generally, any method with a name starting with `run_` is meant to be called by PyGAD from inside the `run()` method. Supported in [PyGAD 3.3.1](https://pygad.readthedocs.io/en/latest/releases.html#pygad-3-3-1). - 1. `run_loop_head()`: The code before the loop starts. - 2. `run_select_parents(call_on_parents=True)`: Select the parents and call the callable `on_parents()` if defined. If `call_on_parents` is `True`, then the callable `on_parents()` is called. It must be `False` when the `run_select_parents()` method is called to update the parents at the end of the `run()` method. - 3. `run_crossover()`: Apply crossover and call the callable `on_crossover()` if defined. - 4. `run_mutation()`: Apply mutation and call the callable `on_mutation()` if defined. - 5. `run_update_population()`: Update the `population` attribute after completing the processes of crossover and mutation. +##### Methods (bootstrap and population growth in `utils.engine.GAEngine`) -There are many methods that are not designed for user usage. Some of them are listed above but this is not a comprehensive list. The [release history](https://pygad.readthedocs.io/en/latest/releases.html) section usually covers them. Moreover, you can check the [PyGAD GitHub repository](https://github.com/ahmedfgad/GeneticAlgorithmPython) to find more. +- `_bootstrap_nsga3_reference_points()`: Build the reference-point grid once, right after the first fitness evaluation. Calls `_nsga3_grow_population` when `sol_per_pop` is smaller than the reference count. +- `_nsga3_grow_population(required_size, num_objectives)`: Append random solutions to `self.population`, update `sol_per_pop` / `pop_size` / `num_offspring`, re-evaluate fitness. +- `_nsga3_generate_extra_random_solutions(count)`: Build `count` random solutions respecting the gene space, init range, gene type, gene constraints, and `allow_duplicate_genes` rules. +- `_nsga3_generate_single_random_gene(gene_idx, partial_solution)`: Sample a single gene value using initial-population settings (not mutation settings). +- `_nsga3_apply_gene_constraints(population)`: Enforce `gene_constraint` on the new rows. +- `_nsga3_resolve_duplicate_genes(population)`: Resolve duplicate genes in the new rows when `allow_duplicate_genes=False`. + +##### Module-level helpers (in `pygad.utils.nsga3`) + +- `NSGA3_ASF_EPSILON`: Off-axis weight used by the ASF inside `nsga3_find_extreme_points`. +- `NSGA3_INTERCEPT_NEAR_ZERO`: Threshold under which an intercept gap is treated as zero. +- `_nsga3_pick_target_reference_point(niche_counts, critical_front_associations, remaining_positions)`: Choose the next reference point for the niching loop. Internal. +- `_nsga3_pick_candidate_at_reference(candidates_at_target, critical_front_distances, niche_count_at_target)`: Choose a candidate at a given reference point. Internal. +- `_nsga3_enumerate_compositions(num_objectives, num_divisions)`: Yield every non-negative integer tuple summing to `num_divisions`. Internal. + +##### Module-level helpers (in `pygad.utils.parent_selection`) + +- `_nsga3_validate_multi_objective_fitness(fitness, supported_int_float_types, method_name)`: Raise when the GA was set to NSGA-III but the fitness function returned scalars. +- `_nsga3_accumulate_fronts(pareto_fronts, num_parents)`: Walk the Pareto fronts and split them into the accepted set + the critical front. + +#### Crossover + +##### Attributes + +- `last_generation_offspring_crossover`: Offspring after crossover. Added in [PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). + +##### Methods + +- `crossover()`: Active crossover operator. Bound during validation according to `crossover_type`. +- `single_point_crossover(parents, offspring_size)`: Single-point crossover. +- `two_points_crossover(parents, offspring_size)`: Two-point crossover. +- `uniform_crossover(parents, offspring_size)`: Uniform crossover. +- `scattered_crossover(parents, offspring_size)`: Scattered crossover. +- `sbx_crossover(parents, offspring_size)`: Simulated binary crossover. Uses `self.sbx_crossover_eta`. + +#### Mutation + +##### Attributes + +- `last_generation_offspring_mutation`: Offspring after mutation. Added in [PyGAD 2.12.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-12-0). +- `last_generation_offspring_mutation_indices`: Indices of mutated offspring inside `self.population`. + +##### Methods + +- `mutation()`: Active mutation operator. Bound during validation according to `mutation_type`. +- `random_mutation(offspring)`: Random mutation (replaces or adds a uniform random value). +- `swap_mutation(offspring)`: Swap mutation. +- `inversion_mutation(offspring)`: Inversion mutation. +- `scramble_mutation(offspring)`: Scramble mutation. +- `adaptive_mutation(offspring)`: Adaptive mutation. Uses `adaptive_mutation_population_fitness`. +- `polynomial_mutation(offspring)`: Polynomial mutation. Uses `self.polynomial_mutation_eta`. +- `mutation_change_gene_dtype_and_round(...)`: Round and re-cast a mutated gene to the configured dtype/precision. + +#### Elitism + +##### Attributes + +- `last_generation_elitism`: Elitism solutions from the last generation. Added in [PyGAD 2.18.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-18-0). +- `last_generation_elitism_indices`: Population indices of `last_generation_elitism`. Added in [PyGAD 2.19.0](https://pygad.readthedocs.io/en/latest/releases.html#pygad-2-19-0). + +#### Gene Constraints and Duplicate Resolution + +##### Methods + +- `validate_gene_constraint_callable_output(selected_values, values)`: Sanity-check the return value of a user-defined `gene_constraint`. +- `filter_gene_values_by_constraint(values, solution, gene_idx)`: Run `gene_constraint[gene_idx]` and return the filtered list. +- `get_valid_gene_constraint_values(...)`: Sample candidate values until one satisfies the gene constraint. +- `solve_duplicate_genes_randomly(...)`: Resolve duplicate genes by sampling new values from the random range. +- `solve_duplicate_genes_by_space(...)`: Resolve duplicate genes by sampling new values from `gene_space`. +- `solve_duplicates_deeply(...)`: Slow, exhaustive fallback for duplicate resolution. +- `unique_int_gene_from_range(...)`: Pick an integer gene that does not already appear in the solution. +- `unique_float_gene_from_range(...)`: Pick a float gene that does not already appear in the solution. +- `unique_gene_by_space(...)`: Pick a unique value from `gene_space`. +- `unique_genes_by_space(...)`: Pick unique values for several genes from `gene_space`. +- `select_unique_value(...)`: Sample one value uniformly at random from a list of candidates. +- `find_two_duplicates(solution)`: Locate the first pair of duplicated indices in a solution. +- `unpack_gene_space(...)`: Materialize the unpacked `gene_space` (used to build `gene_space_unpacked`). + +#### Saving, Loading, and Reporting + +##### Methods + +- `save(filename)`: Pickle the GA instance to disk (uses `cloudpickle`). +- `generate_report(filename, ...)`: Build a PDF report of the run. See [`generate_report()`](#generate-report) below. +- `push_to_vilvik(...)`: Optional convenience wrapper around the Vilvik SDK. + +Note that the attributes with names starting with `last_generation_` are updated after each generation. The next sections discuss the methods available in the `pygad.GA` class. @@ -585,6 +758,33 @@ Accepts the following parameter: * `filename`: Name of the file to save the instance. No extension is needed. +### `generate_report()` + +Builds a PDF report of the current GA run. It bundles the configuration table, a run-summary table, the best solution, and every applicable plot. Requires the optional `report` extra: + +``` +pip install pygad[report] +``` + +Call it after `run()` finishes. A minimal example: + +```python +ga_instance.run() +ga_instance.generate_report("my_run") # writes my_run.pdf next to the script +``` + +Parameters: + +- `filename` (`str`, required): Output path. `.pdf` is appended automatically if missing. +- `title` (`str` or `None`, default `None`): Title shown on the first page. Defaults to `"PyGAD run report"`. +- `sections` (iterable of `str` or `None`, default `None`): Sections to include and their order. Valid entries are `"title"`, `"configuration"`, `"run_summary"`, `"best_solution"`, `"plots"`, and `"notes"`. When `None`, every section is included in their default order. +- `include_plots` (iterable of `str`, `"all"`, or `None`, default `None`): Plots to embed under the `"plots"` section. `None` or `"all"` auto-selects every plot whose preconditions are met by this run. Pass a list of plot method names to include only those. +- `figure_size_inches` (`(float, float)`, default `(7.0, 4.5)`): Width and height (in inches) used when each plot is drawn for the report. +- `notes` (`str` or `None`, default `None`): Free-form text rendered in the optional `"notes"` section. +- `page_size` (`str`, default `"letter"`): Either `"letter"` or `"A4"`. + +The report skips any plot whose preconditions are not met. For example, `plot_pareto_front_curve` is included only for multi-objective runs with 2 or 3 objectives; `plot_non_dominated_hypervolume` is included only when `save_solutions=True` is set on the GA. A full example lives at [`examples/example_generate_report.py`](https://github.com/ahmedfgad/GeneticAlgorithmPython/tree/master/examples/example_generate_report.py). + ## Functions in `pygad` Besides the methods available in the `pygad.GA` class, this section discusses the functions available in `pygad`. Up to this time, there is only a single function named `load()`. diff --git a/docs/source/releases.md b/docs/source/releases.md index f52dee2..0f7d626 100644 --- a/docs/source/releases.md +++ b/docs/source/releases.md @@ -690,4 +690,12 @@ Release Date ..., 2026 22. Two new example folders under `/examples`: `examples/benchmarks/` has one runnable example per benchmark (classic, ZDT, DTLZ, knapsack, and TSP), and `examples/quality_indicators/` has one runnable example per quality indicator (hypervolume, IGD, GD, and spacing). 23. `plot_pareto_front_curve()` now also supports 3 objectives (3D scatter). M >= 4 still raises and points to the new high-dimensional plots. 24. Seven new plot methods on `pygad.GA`. The first three work on the final population (no extra flag needed): `plot_pareto_front_pcp()` (parallel coordinates, any M >= 2), `plot_pareto_front_scatter_matrix()` (M-by-M pairwise scatter, best for M >= 4), and `plot_pareto_front_heatmap()` (solutions-by-objectives heatmap). The other four require `save_solutions=True`: `plot_fitness_band()` (per-generation min / mean / max with a shaded band), `plot_non_dominated_hypervolume()` (hypervolume of the non-dominated set per generation), `plot_population_diversity()` (mean pairwise distance per generation), and `plot_pareto_front_evolution()` (non-dominated set overlaid every k generations). -25. Fix a latent divide-by-zero in `NSGA3.normalise_fitness()`. The safeguard for near-zero denominators used to collapse to `0` for tiny negative values (the realistic case under PyGAD-max), which silently produced wrong normalised values. The safeguard now keeps the negative sign. +25. Fix a latent divide-by-zero in `NSGA3.nsga3_normalize_fitness()`. The safeguard for near-zero denominators used to collapse to `0` for tiny negative values (the realistic case under PyGAD-max), which silently produced wrong normalized values. The safeguard now keeps the negative sign. +26. Refactor the NSGA classes to keep each script focused. A new module `pygad/utils/nsga.py` hosts the `NSGA` mixin with `non_dominated_sorting()` and `get_non_dominated_set()`, which are shared between NSGA-II and NSGA-III. `nsga2.py` now only carries NSGA-II specific code (`crowding_distance`, `sort_solutions_nsga2`). `nsga3.py` now only carries the NSGA-III algorithm primitives. The `nsga3_selection()` and `tournament_selection_nsga3()` methods have moved to `pygad/utils/parent_selection.py` next to their NSGA-II counterparts. The engine-time helpers `_bootstrap_nsga3_reference_points()`, `_nsga3_grow_population()`, `_nsga3_generate_extra_random_solutions()`, and `_nsga3_generate_single_random_gene()` now live in `pygad/utils/engine.py`. +27. Rename NSGA-III novel names to start with `nsga3_` so the algorithm-specific surface is easy to spot. Algorithm primitives become `nsga3_generate_reference_points`, `nsga3_compute_ideal_point`, `nsga3_find_extreme_points`, `nsga3_compute_intercepts`, `nsga3_normalize_fitness`, `nsga3_associate_to_reference_points`, and `nsga3_niching_select`. Module-level helpers gain the same prefix (`_nsga3_pick_target_reference_point`, `_nsga3_pick_candidate_at_reference`, `_nsga3_enumerate_compositions`, `_nsga3_validate_multi_objective_fitness`, `_nsga3_accumulate_fronts`). The constants are renamed `NSGA3_ASF_EPSILON` and `NSGA3_INTERCEPT_NEAR_ZERO`. Names that already had NSGA-II parallels (`tournament_selection_nsga3`, `pareto_fronts`, `non_dominated_sorting`) keep their original spelling. +28. Spell every name and docstring in American English (`normalize`, `maximize`, `behavior`, `color`, `optimization`, ...) so the library stays consistent. +29. Expand abbreviated names introduced by the NSGA-III refactor: `fl_indices` to `critical_front_indices`, `fl_assoc` to `critical_front_associations`, `fl_dist` to `critical_front_distances`, `st_indices` to `selection_pool_indices`, `st_fitness` to `selection_pool_fitness`, `accepted_assoc` to `accepted_associations`, `K` to `num_to_select` (in `nsga3_niching_select`). +30. The NSGA-III population auto-growth path now respects every initial-population rule: `init_range_low`/`init_range_high`, `gene_space`, `gene_type` (single dtype or nested per-gene `[type, precision]`), `gene_constraint`, and `allow_duplicate_genes=False`. Previously, only the gene-space / init-range sampling step was applied; gene constraints and duplicate resolution were skipped, which could leave the grown rows in an invalid state. +31. A new `Report` mixin in `pygad/utils/report.py` adds `ga_instance.generate_report(filename, ...)` to build a PDF report of the run. The report bundles a configuration table, a run-summary table, the best solution, and every applicable plot (auto-selected based on the run's properties: SOO vs MOO, number of objectives, `save_solutions`, `save_best_solutions`). The report uses `reportlab` and `matplotlib`, both available through the new optional dependency extra `pip install pygad[report]`. +32. A new example `examples/example_generate_report.py` shows how to build a PDF report after running a multi-objective GA. +33. The `pygad.md`, `releases.md`, `visualize.md`, and `utils.md` documentation pages were updated to reflect the new module layout, the renamed methods, the new `generate_report()` entry point, and the new NSGA-III instance attributes (`nsga3_num_divisions`, `nsga3_reference_points`). The "Other Instance Attributes & Methods" section in `pygad.md` is now grouped by area (Lifecycle, Population, Fitness, Parent Selection, NSGA-II, NSGA-III, Crossover, Mutation, Elitism, Gene Constraints, Saving) so each method or attribute appears under its topic. diff --git a/docs/source/utils.md b/docs/source/utils.md index 1540a69..6ec0487 100644 --- a/docs/source/utils.md +++ b/docs/source/utils.md @@ -320,28 +320,45 @@ Selects the parents for the NSGA-III algorithm to solve multi-objective optimiza Selects the parents for the NSGA-III algorithm to solve multi-objective optimization problems. It selects the parents using the tournament selection technique where the within-front comparison is based on the niche count (instead of the crowding distance used by `tournament_selection_nsga2()`). Requires the `nsga3_num_divisions` parameter to be set. +## `pygad.utils.nsga` Submodule + +The `pygad.utils.nsga` module has a class named `NSGA` that holds the building blocks shared by NSGA-II and NSGA-III. The methods inside this class are: + +1. `non_dominated_sorting()`: Returns all the Pareto fronts by applying non-dominated sorting over the solutions. +2. `get_non_dominated_set()`: Returns the two sets of non-dominated and dominated solutions from the passed solutions. The Pareto front is the non-dominated set. + ## `pygad.utils.nsga2` Submodule -The `pygad.utils.nsga2` module has a class named `NSGA2` that implements NSGA-II. The methods inside this class are: +The `pygad.utils.nsga2` module has a class named `NSGA2` that implements the NSGA-II-specific primitives. The methods inside this class are: -1. `non_dominated_sorting()`: Returns all the pareto fronts by applying non-dominated sorting over the solutions. -2. `get_non_dominated_set()`: Returns the 2 sets of non-dominated solutions and dominated solutions from the passed solutions. Note that the Pareto front consists of the solutions in the non-dominated set. -3. `crowding_distance()`: Calculates the crowding distance for all solutions in the current pareto front. -4. `sort_solutions_nsga2()`: Sort the solutions. If the problem is single-objective, then the solutions are sorted by sorting the fitness values of the population. If it is multi-objective, then non-dominated sorting and crowding distance are applied to sort the solutions. +1. `crowding_distance()`: Calculates the crowding distance for all solutions in the current Pareto front. +2. `sort_solutions_nsga2()`: Sort the solutions. If the problem is single-objective, the solutions are sorted by their fitness values. If it is multi-objective, non-dominated sorting and crowding distance are applied to sort the solutions. ## `pygad.utils.nsga3` Submodule -The `pygad.utils.nsga3` module has a class named `NSGA3` that implements NSGA-III. The methods inside this class are: - -1. `generate_reference_points()`: Build the structured grid of reference points on the unit simplex using the Das-Dennis (stars-and-bars) method. -2. `compute_ideal_point()`: Return the ideal point (column maximum under PyGAD's maximisation convention). -3. `find_extreme_points()`: For each objective axis, return the solution that best represents the corner of that axis based on the Achievement Scalarising Function (ASF). -4. `compute_intercepts()`: Fit a hyperplane through the M extreme points and return the per-axis intercept point used as the normalisation denominator. Falls back to the nadir (worst per objective) when the hyperplane cannot be fitted or when the intercept is degenerate. -5. `normalise_fitness()`: Scale each fitness row to the [0, 1] range using the ideal point and the intercepts. -6. `associate_to_reference_points()`: For every normalised solution, return the nearest reference index and the perpendicular distance to that reference line. -7. `niching_select()`: Pick K survivors from the critical front using niche counts and per-niche tie-breaking rules. -8. `nsga3_selection()`: Top-level NSGA-III parent selection routine. -9. `tournament_selection_nsga3()`: Tournament-style NSGA-III parent selection routine. +The `pygad.utils.nsga3` module has a class named `NSGA3` that implements the NSGA-III algorithm primitives. NSGA-III novel names start with `nsga3_` to make the algorithm surface easy to spot. + +1. `nsga3_generate_reference_points()`: Build the structured grid of reference points on the unit simplex using the Das-Dennis (stars-and-bars) method. +2. `nsga3_compute_ideal_point()`: Return the ideal point (column maximum under PyGAD's maximization convention). +3. `nsga3_find_extreme_points()`: For each objective axis, return the solution that best represents the corner of that axis based on the Achievement Scalarizing Function (ASF). +4. `nsga3_compute_intercepts()`: Fit a hyperplane through the M extreme points and return the per-axis intercept point used as the normalization denominator. Falls back to the nadir (worst per objective) when the hyperplane cannot be fitted or when the intercept is degenerate. +5. `nsga3_normalize_fitness()`: Scale each fitness row to the `[0, 1]` range using the ideal point and the intercepts. +6. `nsga3_associate_to_reference_points()`: For every normalized solution, return the nearest reference index and the perpendicular distance to that reference line. +7. `nsga3_niching_select()`: Pick `num_to_select` survivors from the critical front using niche counts and per-niche tie-breaking rules. + +The selection methods `nsga3_selection()` and `tournament_selection_nsga3()` live in `pygad.utils.parent_selection`. The engine-time helpers (`_bootstrap_nsga3_reference_points()`, `_nsga3_grow_population()`, `_nsga3_generate_extra_random_solutions()`, `_nsga3_generate_single_random_gene()`) live in `pygad.utils.engine`. + +Two module-level constants in `pygad.utils.nsga3` control the numerical safeguards: `NSGA3_ASF_EPSILON` (default `1e-6`) and `NSGA3_INTERCEPT_NEAR_ZERO` (default `1e-12`). + +## `pygad.utils.report` Submodule + +The `pygad.utils.report` module has a class named `Report` that adds the `generate_report()` method to the `pygad.GA` class. It builds a PDF report of the GA run, bundling the configuration table, a run summary, the best solution, and every applicable plot. Requires the optional dependencies `reportlab` and `matplotlib`: + +``` +pip install pygad[report] +``` + +See [`generate_report()`](https://pygad.readthedocs.io/en/latest/pygad.html#generate-report) and the runnable example at [`examples/example_generate_report.py`](https://github.com/ahmedfgad/GeneticAlgorithmPython/tree/master/examples/example_generate_report.py). ## `pygad.utils.quality_indicators` Submodule diff --git a/docs/source/visualize.md b/docs/source/visualize.md index 2945278..99c1e94 100644 --- a/docs/source/visualize.md +++ b/docs/source/visualize.md @@ -80,7 +80,7 @@ For M=3 (NSGA-III on DTLZ2): ## `plot_pareto_front_pcp()` -Parallel-coordinates view of the final non-dominated set. Each objective is a vertical axis. Each non-dominated solution becomes a polyline that crosses every axis. Values are normalised per objective so very different scales remain comparable. Useful for any M >= 2 and especially for M >= 4. +Parallel-coordinates view of the final non-dominated set. Each objective is a vertical axis. Each non-dominated solution becomes a polyline that crosses every axis. Values are normalized per objective so very different scales remain comparable. Useful for any M >= 2 and especially for M >= 4. Parameters: `title`, `xlabel`, `ylabel`, `linewidth`, `font_size`, `color`, `alpha`, `grid`, `save_dir`. @@ -104,7 +104,7 @@ ga_instance.plot_pareto_front_scatter_matrix() ## `plot_pareto_front_heatmap()` -Heatmap of the final non-dominated set. Rows are solutions, columns are objectives, colour is the raw objective value. Rows are sorted by objective `sort_by` (default `0`); pass `sort_by=None` to keep the original order. +Heatmap of the final non-dominated set. Rows are solutions, columns are objectives, color is the raw objective value. Rows are sorted by objective `sort_by` (default `0`); pass `sort_by=None` to keep the original order. Parameters: `title`, `xlabel`, `ylabel`, `font_size`, `cmap`, `sort_by`, `save_dir`. diff --git a/examples/example_generate_report.py b/examples/example_generate_report.py new file mode 100644 index 0000000..aa5c675 --- /dev/null +++ b/examples/example_generate_report.py @@ -0,0 +1,40 @@ +""" +Build a PDF report for a small multi-objective GA run. + +Requires the optional ``report`` extra: pip install pygad[report]. +The output file ``pygad_report.pdf`` is written next to this script. +""" + +import numpy + +import pygad + + +def fitness_func(ga_instance, solution, solution_idx): + return [float(numpy.sum(solution)), + -float(numpy.sum(numpy.asarray(solution) ** 2))] + + +def main(): + ga_instance = pygad.GA( + num_generations=30, + num_parents_mating=8, + fitness_func=fitness_func, + sol_per_pop=20, + num_genes=4, + parent_selection_type="nsga2", + save_solutions=True, + random_seed=42, + suppress_warnings=True, + ) + ga_instance.run() + output_path = ga_instance.generate_report( + filename="pygad_report", + title="PyGAD multi-objective demo", + notes="A short two-objective example with 30 generations.", + ) + print(f"Report written to: {output_path}") + + +if __name__ == "__main__": + main() diff --git a/pygad/benchmarks/classic.py b/pygad/benchmarks/classic.py index 73f0fc7..b8d9b87 100644 --- a/pygad/benchmarks/classic.py +++ b/pygad/benchmarks/classic.py @@ -3,7 +3,7 @@ Each class is callable with the (ga, solution, sol_idx) signature and returns a single fitness value. Minimisation values are negated -so PyGAD can maximise them. +so PyGAD can maximize them. """ import math diff --git a/pygad/benchmarks/dtlz.py b/pygad/benchmarks/dtlz.py index 1bb51a5..9ba2dbf 100644 --- a/pygad/benchmarks/dtlz.py +++ b/pygad/benchmarks/dtlz.py @@ -5,7 +5,7 @@ number of decision variables is M + k - 1. Defaults: k = 5 for DTLZ1, k = 10 for DTLZ2, DTLZ3, and DTLZ4. -Fitness values are negated so PyGAD can maximise them. +Fitness values are negated so PyGAD can maximize them. """ import math diff --git a/pygad/benchmarks/tsp.py b/pygad/benchmarks/tsp.py index 7642c7a..65c86b6 100644 --- a/pygad/benchmarks/tsp.py +++ b/pygad/benchmarks/tsp.py @@ -2,7 +2,7 @@ Travelling Salesman Problem (TSP) benchmark. A solution is a permutation of city indices. Fitness is the -negative tour length so PyGAD can maximise it. +negative tour length so PyGAD can maximize it. Build the problem from a 2D array of coordinates or from a precomputed distance matrix. The class exposes gene_space, diff --git a/pygad/helper/activations.py b/pygad/helper/activations.py index 3123d8a..5e3e877 100644 --- a/pygad/helper/activations.py +++ b/pygad/helper/activations.py @@ -54,20 +54,20 @@ def relu(sop): def softmax(layer_outputs): """ - Apply a sum-normalised softmax: divide each value by the sum of + Apply a sum-normalized softmax: divide each value by the sum of all values plus a tiny constant to avoid division by zero. Note that this is not the canonical softmax (which uses - exponentials); it just normalises the inputs so they sum to one. + exponentials); it just normalizes the inputs so they sum to one. Parameters ---------- layer_outputs : numpy.ndarray - The values to normalise. + The values to normalize. Returns ------- activated : numpy.ndarray - The normalised values. + The normalized values. """ return layer_outputs / (numpy.sum(layer_outputs) + 0.000001) diff --git a/pygad/kerasga/kerasga.py b/pygad/kerasga/kerasga.py index 2a91ed4..98380b7 100644 --- a/pygad/kerasga/kerasga.py +++ b/pygad/kerasga/kerasga.py @@ -124,7 +124,7 @@ def __init__(self, model, num_solutions): Parameters ---------- model : tensorflow.keras.Model - The Keras model to optimise. Its current weights are used + The Keras model to optimize. Its current weights are used as the seed for the first solution. num_solutions : int Number of solutions in the population. Each solution is a diff --git a/pygad/pygad.py b/pygad/pygad.py index 126c8ba..21d9654 100644 --- a/pygad/pygad.py +++ b/pygad/pygad.py @@ -8,8 +8,10 @@ class GA(utils.parent_selection.ParentSelection, utils.crossover.Crossover, utils.mutation.Mutation, + utils.nsga.NSGA, utils.nsga2.NSGA2, utils.nsga3.NSGA3, + utils.report.Report, utils.validation.Validation, utils.engine.GAEngine, helper.unique.Unique, diff --git a/pygad/torchga/torchga.py b/pygad/torchga/torchga.py index 3f06fe4..6a50bbb 100644 --- a/pygad/torchga/torchga.py +++ b/pygad/torchga/torchga.py @@ -1,157 +1,157 @@ -import copy -import numpy -import torch - -def model_weights_as_vector(model): - """ - Flatten every weight tensor of a PyTorch model into a single 1D - NumPy array. Tensors are moved off the GPU and detached from the - computational graph before being converted. - - Parameters - ---------- - model : torch.nn.Module - The model whose weights should be flattened. - - Returns - ------- - weights_vector : numpy.ndarray - A 1D float array with every parameter of the model laid out - in ``state_dict`` order. - """ - weights_vector = [] - - for curr_weights in model.state_dict().values(): - # Calling detach() to remove the computational graph from the layer. - # cpu() is called to make sure the data is moved from the GPU to the CPU. - # numpy() is called to convert the tensor into a NumPy array. - curr_weights = curr_weights.cpu().detach().numpy() - vector = numpy.reshape(curr_weights, (curr_weights.size)) - weights_vector.extend(vector) - - return numpy.array(weights_vector) - -def model_weights_as_dict(model, weights_vector): - """ - Reshape a flat 1D weights vector back into the per-layer tensors - expected by ``model.load_state_dict``. The shapes are taken from - the model's current ``state_dict``. - - Parameters - ---------- - model : torch.nn.Module - The reference model. Used only to read the per-layer shapes. - weights_vector : array-like - A 1D vector in the same layout produced by - ``model_weights_as_vector``. - - Returns - ------- - weights_dict : dict - A dict mapping every parameter name to a freshly built - ``torch.Tensor`` with the right shape. - """ - weights_dict = model.state_dict() - - start = 0 - for key in weights_dict: - # Calling detach() to remove the computational graph from the layer. - # cpu() is called to make sure the data is moved from the GPU to the CPU. - # numpy() is called to convert the tensor into a NumPy array. - w_matrix = weights_dict[key].cpu().detach().numpy() - layer_weights_shape = w_matrix.shape - layer_weights_size = w_matrix.size - - layer_weights_vector = weights_vector[start:start + layer_weights_size] - layer_weights_matrix = numpy.reshape(layer_weights_vector, (layer_weights_shape)) - weights_dict[key] = torch.from_numpy(layer_weights_matrix) - - start = start + layer_weights_size - - return weights_dict - -def predict(model, solution, data): - """ - Load the given solution as the model's weights and run a forward - pass on the input ``data``. The model is deep-copied first so the - caller's instance is left untouched. - - Parameters - ---------- - model : torch.nn.Module - The reference model whose architecture should be used for the - forward pass. - solution : array-like - A 1D weights vector returned by the GA. - data : torch.Tensor - Input tensor of the right shape for the model. - - Returns - ------- - predictions : torch.Tensor - The model's output for ``data``. - """ - # Fetch the parameters of the best solution. - model_weights_dict = model_weights_as_dict(model=model, - weights_vector=solution) - - # Use the current solution as the model parameters. - _model = copy.deepcopy(model) - _model.load_state_dict(model_weights_dict) - - with torch.no_grad(): - predictions = _model(data) - - return predictions - -class TorchGA: - - def __init__(self, model, num_solutions): - """ - Build a population of weight vectors for a PyTorch model so - the GA can evolve them. - - Parameters - ---------- - model : torch.nn.Module - The PyTorch model to optimise. Its current weights are - used as the seed for the first solution. - num_solutions : int - Number of solutions in the population. Each solution is - a flat copy of the model weights with random perturbations - added to it. - """ - - self.model = model - - self.num_solutions = num_solutions - - # A list holding references to all the solutions (i.e. networks) used in the population. - self.population_weights = self.create_population() - - def create_population(self): - """ - Build the initial population. The first solution is the model's - current flattened weights; every other solution is the same - vector with a uniform ``[-1, 1]`` perturbation added on top. - - Returns - ------- - net_population_weights : list of numpy.ndarray - One flat weight vector per solution. - """ - - model_weights_vector = model_weights_as_vector(model=self.model) - - net_population_weights = [] - net_population_weights.append(model_weights_vector) - - for idx in range(self.num_solutions-1): - - net_weights = copy.deepcopy(model_weights_vector) - net_weights = numpy.array(net_weights) + numpy.random.uniform(low=-1.0, high=1.0, size=model_weights_vector.size) - - # Appending the weights to the population. - net_population_weights.append(net_weights) - - return net_population_weights +import copy +import numpy +import torch + +def model_weights_as_vector(model): + """ + Flatten every weight tensor of a PyTorch model into a single 1D + NumPy array. Tensors are moved off the GPU and detached from the + computational graph before being converted. + + Parameters + ---------- + model : torch.nn.Module + The model whose weights should be flattened. + + Returns + ------- + weights_vector : numpy.ndarray + A 1D float array with every parameter of the model laid out + in ``state_dict`` order. + """ + weights_vector = [] + + for curr_weights in model.state_dict().values(): + # Calling detach() to remove the computational graph from the layer. + # cpu() is called to make sure the data is moved from the GPU to the CPU. + # numpy() is called to convert the tensor into a NumPy array. + curr_weights = curr_weights.cpu().detach().numpy() + vector = numpy.reshape(curr_weights, (curr_weights.size)) + weights_vector.extend(vector) + + return numpy.array(weights_vector) + +def model_weights_as_dict(model, weights_vector): + """ + Reshape a flat 1D weights vector back into the per-layer tensors + expected by ``model.load_state_dict``. The shapes are taken from + the model's current ``state_dict``. + + Parameters + ---------- + model : torch.nn.Module + The reference model. Used only to read the per-layer shapes. + weights_vector : array-like + A 1D vector in the same layout produced by + ``model_weights_as_vector``. + + Returns + ------- + weights_dict : dict + A dict mapping every parameter name to a freshly built + ``torch.Tensor`` with the right shape. + """ + weights_dict = model.state_dict() + + start = 0 + for key in weights_dict: + # Calling detach() to remove the computational graph from the layer. + # cpu() is called to make sure the data is moved from the GPU to the CPU. + # numpy() is called to convert the tensor into a NumPy array. + w_matrix = weights_dict[key].cpu().detach().numpy() + layer_weights_shape = w_matrix.shape + layer_weights_size = w_matrix.size + + layer_weights_vector = weights_vector[start:start + layer_weights_size] + layer_weights_matrix = numpy.reshape(layer_weights_vector, (layer_weights_shape)) + weights_dict[key] = torch.from_numpy(layer_weights_matrix) + + start = start + layer_weights_size + + return weights_dict + +def predict(model, solution, data): + """ + Load the given solution as the model's weights and run a forward + pass on the input ``data``. The model is deep-copied first so the + caller's instance is left untouched. + + Parameters + ---------- + model : torch.nn.Module + The reference model whose architecture should be used for the + forward pass. + solution : array-like + A 1D weights vector returned by the GA. + data : torch.Tensor + Input tensor of the right shape for the model. + + Returns + ------- + predictions : torch.Tensor + The model's output for ``data``. + """ + # Fetch the parameters of the best solution. + model_weights_dict = model_weights_as_dict(model=model, + weights_vector=solution) + + # Use the current solution as the model parameters. + _model = copy.deepcopy(model) + _model.load_state_dict(model_weights_dict) + + with torch.no_grad(): + predictions = _model(data) + + return predictions + +class TorchGA: + + def __init__(self, model, num_solutions): + """ + Build a population of weight vectors for a PyTorch model so + the GA can evolve them. + + Parameters + ---------- + model : torch.nn.Module + The PyTorch model to optimize. Its current weights are + used as the seed for the first solution. + num_solutions : int + Number of solutions in the population. Each solution is + a flat copy of the model weights with random perturbations + added to it. + """ + + self.model = model + + self.num_solutions = num_solutions + + # A list holding references to all the solutions (i.e. networks) used in the population. + self.population_weights = self.create_population() + + def create_population(self): + """ + Build the initial population. The first solution is the model's + current flattened weights; every other solution is the same + vector with a uniform ``[-1, 1]`` perturbation added on top. + + Returns + ------- + net_population_weights : list of numpy.ndarray + One flat weight vector per solution. + """ + + model_weights_vector = model_weights_as_vector(model=self.model) + + net_population_weights = [] + net_population_weights.append(model_weights_vector) + + for idx in range(self.num_solutions-1): + + net_weights = copy.deepcopy(model_weights_vector) + net_weights = numpy.array(net_weights) + numpy.random.uniform(low=-1.0, high=1.0, size=model_weights_vector.size) + + # Appending the weights to the population. + net_population_weights.append(net_weights) + + return net_population_weights diff --git a/pygad/utils/__init__.py b/pygad/utils/__init__.py index c49b969..0aedc3f 100644 --- a/pygad/utils/__init__.py +++ b/pygad/utils/__init__.py @@ -1,9 +1,11 @@ from pygad.utils import parent_selection from pygad.utils import crossover from pygad.utils import mutation +from pygad.utils import nsga from pygad.utils import nsga2 from pygad.utils import nsga3 from pygad.utils import quality_indicators +from pygad.utils import report from pygad.utils import validation from pygad.utils import engine diff --git a/pygad/utils/engine.py b/pygad/utils/engine.py index 99dd689..19e75bb 100644 --- a/pygad/utils/engine.py +++ b/pygad/utils/engine.py @@ -1131,3 +1131,184 @@ def best_solution(self, pop_fitness=None): raise ex return best_solution, best_solution_fitness, best_match_idx + + def _bootstrap_nsga3_reference_points(self): + """ + Build the reference-point grid once, right after the first + fitness evaluation. The number of objectives M is read from the + length of the first fitness vector. + + If ``sol_per_pop`` is smaller than the number of reference + points, grow the population to match and re-evaluate fitness so + the GA loop can carry on with a valid population. + """ + num_objectives = len(self.last_generation_fitness[0]) + self.nsga3_reference_points = self.nsga3_generate_reference_points( + num_objectives, self.nsga3_num_divisions) + required_size = len(self.nsga3_reference_points) + if self.sol_per_pop < required_size: + self._nsga3_grow_population(required_size, num_objectives) + + def _nsga3_grow_population(self, required_size, num_objectives): + """ + Append random solutions to ``self.population`` until the size + equals ``required_size``, then re-evaluate fitness. The new + rows follow the same gene space, init range, gene type, gene + constraints, and ``allow_duplicate_genes`` rules used to build + the initial population, so the grown population is + indistinguishable from one created with ``sol_per_pop`` set to + ``required_size`` from the start. + """ + original_size = self.sol_per_pop + if not self.suppress_warnings: + warnings.warn( + f"sol_per_pop ({original_size}) is smaller than the number of " + f"NSGA-III reference points ({required_size}) for M={num_objectives} " + f"objectives and nsga3_num_divisions={self.nsga3_num_divisions}. " + f"Growing the population to {required_size} random solutions " + f"and re-evaluating fitness." + ) + extra = self._nsga3_generate_extra_random_solutions( + required_size - original_size) + self.population = numpy.vstack([self.population, extra]) + self.sol_per_pop = required_size + self.pop_size = (required_size, self.num_genes) + # Shared helper on the Validation mixin keeps the rule in one place. + self._refresh_num_offspring() + self.last_generation_fitness = self.cal_pop_fitness() + + def _nsga3_generate_extra_random_solutions(self, count): + """ + Build ``count`` random solutions that obey every initial- + population rule: ``gene_space``, ``init_range_low`` / + ``init_range_high``, ``gene_type`` (including nested per-gene + type / precision), ``gene_constraint``, and + ``allow_duplicate_genes``. + + Steps mirror ``initialize_population``: + 1. Sample each gene from its space (or init range). + 2. Cast and round to the configured gene type. + 3. Enforce gene constraints when present. + 4. Resolve duplicate genes when not allowed. + """ + extra = numpy.empty((count, self.num_genes), dtype=object) + for sol_idx in range(count): + for gene_idx in range(self.num_genes): + extra[sol_idx, gene_idx] = self._nsga3_generate_single_random_gene( + gene_idx, extra[sol_idx]) + extra = self.change_population_dtype_and_round(extra) + + if self.gene_constraint is not None: + extra = self._nsga3_apply_gene_constraints(extra) + + if not self.allow_duplicate_genes: + extra = self._nsga3_resolve_duplicate_genes(extra) + extra = self.change_population_dtype_and_round(extra) + + return extra + + def _nsga3_generate_single_random_gene(self, gene_idx, partial_solution): + """ + Pick a single random gene value for ``gene_idx`` using the + initial-population settings. When ``gene_space`` is set, the + gene-space sampler is used; otherwise the per-gene init range + is used. ``mutation_by_replacement`` is forced to True so the + sampler returns a value drawn from the configured range rather + than an offset to add to an existing gene (which is the + mutation-time behavior). + """ + if self.gene_space is None: + range_min, range_max = self.get_initial_population_range( + gene_index=gene_idx) + return self.generate_gene_value_randomly(range_min=range_min, + range_max=range_max, + gene_idx=gene_idx, + mutation_by_replacement=True, + gene_value=None, + sample_size=1, + step=1) + return self.generate_gene_value_from_space(gene_idx=gene_idx, + mutation_by_replacement=True, + gene_value=None, + solution=partial_solution, + sample_size=1) + + def _nsga3_apply_gene_constraints(self, population): + """ + Walk the new rows and replace any gene that does not satisfy + its gene constraint, using the same logic that + ``initialize_population`` runs during the initial build. + """ + for sol_idx, solution in enumerate(population): + for gene_idx in range(self.num_genes): + if not self.gene_constraint[gene_idx]: + continue + values = [solution[gene_idx]] + filtered_values = self.gene_constraint[gene_idx](solution, values) + result = self.validate_gene_constraint_callable_output( + selected_values=filtered_values, values=values) + if not result: + raise Exception( + "The output from the gene_constraint callable/function " + "must be a list or NumPy array that is a subset of the " + "passed values (second argument).") + if len(filtered_values) == 1 and filtered_values[0] != solution[gene_idx]: + raise Exception( + f"It is expected to receive a list/numpy.ndarray from " + f"the gene_constraint callable with a single value " + f"equal to {values[0]}, but the value " + f"{filtered_values[0]} found.") + if len(filtered_values) < 1: + range_min, range_max = self.get_initial_population_range( + gene_index=gene_idx) + values_filtered = self.get_valid_gene_constraint_values( + range_min=range_min, + range_max=range_max, + gene_value=None, + gene_idx=gene_idx, + mutation_by_replacement=True, + solution=solution, + sample_size=self.sample_size, + ) + if values_filtered is None: + if not self.suppress_warnings: + warnings.warn( + f"No value satisfied the constraint for the " + f"gene at index {gene_idx} with value " + f"{solution[gene_idx]} while growing the " + f"population for NSGA-III.") + else: + population[sol_idx, gene_idx] = random.choice(values_filtered) + elif len(filtered_values) > 1: + raise Exception( + f"It is expected to receive a list/numpy.ndarray from " + f"the gene_constraint callable that is either empty or " + f"has a single value equal, but received a list/numpy." + f"ndarray of length {len(filtered_values)}.") + return population + + def _nsga3_resolve_duplicate_genes(self, population): + """ + Apply the same duplicate-resolution path + ``initialize_population`` uses, so the grown rows never carry + duplicate genes when ``allow_duplicate_genes`` is False. + """ + for solution_idx in range(population.shape[0]): + if self.gene_space is None: + population[solution_idx], _, _ = self.solve_duplicate_genes_randomly( + solution=population[solution_idx], + min_val=self.init_range_low, + max_val=self.init_range_high, + gene_type=self.gene_type, + mutation_by_replacement=True, + sample_size=self.sample_size, + ) + else: + population[solution_idx], _, _ = self.solve_duplicate_genes_by_space( + solution=population[solution_idx].copy(), + gene_type=self.gene_type, + mutation_by_replacement=True, + sample_size=self.sample_size, + build_initial_pop=True, + ) + return population diff --git a/pygad/utils/nsga.py b/pygad/utils/nsga.py new file mode 100644 index 0000000..a9e907c --- /dev/null +++ b/pygad/utils/nsga.py @@ -0,0 +1,127 @@ +""" +Shared building blocks for the NSGA family of selection methods. + +The methods here are used by both NSGA-II and NSGA-III. They live in +this module so neither algorithm has to depend on the other. +""" + +import numpy + + +class NSGA: + + def __init__(self): + pass + + def get_non_dominated_set(self, curr_solutions): + """ + Split the input solutions into a non-dominated set and a + dominated set. The non-dominated set is the next Pareto front. + + Parameters + ---------- + curr_solutions : list + A list of (index, fitness_vector) pairs to be partitioned. + ``index`` is the position of the solution in the original + population and ``fitness_vector`` is its objective values. + + Returns + ------- + dominated_set : list + The (index, fitness_vector) pairs that are dominated by at + least one other solution in ``curr_solutions``. + non_dominated_set : list + The (index, fitness_vector) pairs that no other solution in + ``curr_solutions`` dominates. These form the current Pareto + front. + """ + dominated_set = [] + non_dominated_set = [] + for idx1, sol1 in enumerate(curr_solutions): + is_not_dominated = True + for idx2, sol2 in enumerate(curr_solutions): + if idx1 == idx2: + continue + two_solutions = numpy.array(list(zip(sol1[1], sol2[1]))) + # PyGAD maximizes, so domination uses >= and >. + greater_or_equal = two_solutions[:, 1] >= two_solutions[:, 0] + strictly_greater = two_solutions[:, 1] > two_solutions[:, 0] + if greater_or_equal.all() and strictly_greater.any(): + is_not_dominated = False + dominated_set.append(sol1) + break + if is_not_dominated: + non_dominated_set.append(sol1) + return dominated_set, non_dominated_set + + def non_dominated_sorting(self, fitness): + """ + Sort the population into Pareto fronts using non-dominated + sorting. Front 0 contains the solutions no other solution + dominates; front 1 contains those that are only dominated by + front 0; and so on. + + Only works for multi-objective problems. + + Parameters + ---------- + fitness : numpy.ndarray + A 2D array of fitness values, one row per solution and one + column per objective. + + Returns + ------- + pareto_fronts : list + A list of Pareto fronts. Each front is a numpy array whose + rows are (population_index, fitness_vector) pairs. + solutions_fronts_indices : numpy.ndarray + A 1D integer array of length ``len(fitness)``. Entry ``i`` + is the index of the Pareto front the i-th solution belongs + to. + + Raises + ------ + TypeError + If the fitness rows are scalar (single-objective problem) + or of an unsupported type. + """ + if type(fitness[0]) in [list, tuple, numpy.ndarray]: + pass + elif type(fitness[0]) in self.supported_int_float_types: + raise TypeError( + "Non-dominated sorting is only applied when optimizing " + "multi-objective problems.\n\n" + "But a single-objective optimization problem found as the " + "fitness function returns a single numeric value.\n\n" + "To use multi-objective optimization, consider returning an " + "iterable of any of these data types:\n" + "1)list\n2)tuple\n3)numpy.ndarray") + else: + raise TypeError( + f"Non-dominated sorting is only applied when optimizing " + f"multi-objective problems. \n\nTo use multi-objective " + f"optimization, consider returning an iterable of any of " + f"these data types:\n1)list\n2)tuple\n3)numpy.ndarray\n\n" + f"But the data type {type(fitness[0])} found.") + + pareto_fronts = [] + + remaining_set = fitness.copy() + # Pair every solution with its population index so we can keep + # track of who is where as we peel off fronts. + remaining_set = list(zip(range(0, fitness.shape[0]), remaining_set)) + + solutions_fronts_indices = [-1] * len(remaining_set) + solutions_fronts_indices = numpy.array(solutions_fronts_indices) + + front_index = -1 + while len(remaining_set) > 0: + front_index += 1 + remaining_set, pareto_front = self.get_non_dominated_set( + curr_solutions=remaining_set) + pareto_front = numpy.array(pareto_front, dtype=object) + pareto_fronts.append(pareto_front) + solutions_indices = pareto_front[:, 0].astype(int) + solutions_fronts_indices[solutions_indices] = front_index + + return pareto_fronts, solutions_fronts_indices diff --git a/pygad/utils/nsga2.py b/pygad/utils/nsga2.py index 7c1689c..a724ba6 100644 --- a/pygad/utils/nsga2.py +++ b/pygad/utils/nsga2.py @@ -1,151 +1,12 @@ import numpy import pygad + class NSGA2: def __init__(self): pass - def get_non_dominated_set(self, curr_solutions): - """ - Split the input solutions into a non-dominated set and a - dominated set. The non-dominated set is the next Pareto front. - - Parameters - ---------- - curr_solutions : list - A list of (index, fitness_vector) pairs to be partitioned. - ``index`` is the position of the solution in the original - population and ``fitness_vector`` is its objective values. - - Returns - ------- - dominated_set : list - The (index, fitness_vector) pairs that are dominated by at - least one other solution in ``curr_solutions``. - non_dominated_set : list - The (index, fitness_vector) pairs that no other solution in - ``curr_solutions`` dominates. These form the current Pareto - front. - """ - # List of the members of the current dominated pareto front/set. - dominated_set = [] - # List of the non-members of the current dominated pareto front/set. - # The non-dominated set is the pareto front set. - non_dominated_set = [] - for idx1, sol1 in enumerate(curr_solutions): - # Flag indicates whether the solution is a member of the current dominated set. - is_not_dominated = True - for idx2, sol2 in enumerate(curr_solutions): - if idx1 == idx2: - continue - - # Zipping the 2 solutions so the corresponding genes are in the same list. - # The returned array is of size (N, 2) where N is the number of genes. - two_solutions = numpy.array(list(zip(sol1[1], sol2[1]))) - - # Use < for minimization problems and > for maximization problems. - # Checking if any solution dominates the current solution by applying the 2 conditions. - # gr_eq (greater than or equal): All elements must be True. - # gr (greater than): Only 1 element must be True. - gr_eq = two_solutions[:, 1] >= two_solutions[:, 0] - gr = two_solutions[:, 1] > two_solutions[:, 0] - - # If the 2 conditions hold, then a solution (sol2) dominates the current solution (sol1). - # The current solution (sol1) is not considered a member of the non-dominated set. - if gr_eq.all() and gr.any(): - # Set the is_not_dominated flag to False because another solution dominates the current solution (sol1) - is_not_dominated = False - # DO NOT insert the current solution in the current non-dominated set. - # Instead, insert it into the dominated set. - dominated_set.append(sol1) - break - else: - # Reaching here means the solution does not dominate the current solution. - pass - - # If the flag is True, then no solution dominates the current solution. - # Insert the current solution (sol1) into the non-dominated set. - if is_not_dominated: - non_dominated_set.append(sol1) - - # Return the dominated and non-dominated sets. - return dominated_set, non_dominated_set - - def non_dominated_sorting(self, fitness): - """ - Sort the population into Pareto fronts using non-dominated - sorting. Front 0 contains the solutions no other solution - dominates; front 1 contains those that are only dominated by - front 0; and so on. - - Only works for multi-objective problems. - - Parameters - ---------- - fitness : numpy.ndarray - A 2D array of fitness values, one row per solution and one - column per objective. - - Returns - ------- - pareto_fronts : list - A list of Pareto fronts. Each front is a numpy array whose - rows are (population_index, fitness_vector) pairs. - solutions_fronts_indices : numpy.ndarray - A 1D integer array of length ``len(fitness)``. Entry ``i`` - is the index of the Pareto front the i-th solution belongs - to. - - Raises - ------ - TypeError - If the fitness rows are scalar (single-objective problem) - or of an unsupported type. - """ - - # Verify that the problem is multi-objective optimization as non-dominated sorting is only applied to multi-objective problems. - if type(fitness[0]) in [list, tuple, numpy.ndarray]: - pass - elif type(fitness[0]) in self.supported_int_float_types: - raise TypeError('Non-dominated sorting is only applied when optimizing multi-objective problems.\n\nBut a single-objective optimization problem found as the fitness function returns a single numeric value.\n\nTo use multi-objective optimization, consider returning an iterable of any of these data types:\n1)list\n2)tuple\n3)numpy.ndarray') - else: - raise TypeError(f'Non-dominated sorting is only applied when optimizing multi-objective problems. \n\nTo use multi-objective optimization, consider returning an iterable of any of these data types:\n1)list\n2)tuple\n3)numpy.ndarray\n\nBut the data type {type(fitness[0])} found.') - - # A list of all non-dominated sets. - pareto_fronts = [] - - # The remaining set to be explored for non-dominance. - # Initially it is set to the entire population. - # The solutions of each non-dominated set are removed after each iteration. - remaining_set = fitness.copy() - - # Zipping the solution index with the solution's fitness. - # This helps to easily identify the index of each solution. - # Each element has: - # 1) The index of the solution. - # 2) An array of the fitness values of this solution across all objectives. - remaining_set = list(zip(range(0, fitness.shape[0]), remaining_set)) - - # A list mapping the index of each pareto front to the set of solutions in this front. - solutions_fronts_indices = [-1]*len(remaining_set) - solutions_fronts_indices = numpy.array(solutions_fronts_indices) - - # Index of the current pareto front. - front_index = -1 - while len(remaining_set) > 0: - front_index += 1 - - # Get the current non-dominated set of solutions. - remaining_set, pareto_front = self.get_non_dominated_set(curr_solutions=remaining_set) - pareto_front = numpy.array(pareto_front, dtype=object) - pareto_fronts.append(pareto_front) - - solutions_indices = pareto_front[:, 0].astype(int) - solutions_fronts_indices[solutions_indices] = front_index - - return pareto_fronts, solutions_fronts_indices - def crowding_distance(self, pareto_front, fitness): """ Calculate the crowding distance for every solution in the given @@ -160,7 +21,7 @@ def crowding_distance(self, pareto_front, fitness): row is a (population_index, fitness_vector) pair. fitness : numpy.ndarray Fitness of the entire population. Used to compute the per- - objective range that normalises the crowding distance. + objective range that normalizes the crowding distance. Returns ------- @@ -179,18 +40,18 @@ def crowding_distance(self, pareto_front, fitness): so the caller can use them directly against ``self.population``. """ - + # Each solution in the pareto front has 2 elements: # 1) The index of the solution in the population. # 2) A list of the fitness values for all objectives of the solution. # Before proceeding, remove the indices from each solution in the pareto front. pareto_front_no_indices = numpy.array([pareto_front[:, 1][idx] for idx in range(pareto_front.shape[0])]) - + # If there is only 1 solution, then return empty arrays for the crowding distance. if pareto_front_no_indices.shape[0] == 1: # There is only 1 index. return numpy.array([]), numpy.array([]), numpy.array([0]), pareto_front[:, 0].astype(int) - + # An empty list holding info about the objectives of each solution. The info includes the objective value and crowding distance. obj_crowding_dist_list = [] # Loop through the objectives to calculate the crowding distance of each solution across all objectives. @@ -205,7 +66,7 @@ def crowding_distance(self, pareto_front, fitness): # This variable is the sorted version where sorting is done by the objective value (second element). # Note that the first element is still the original objective index before sorting. obj_sorted = sorted(obj, key=lambda x: x[1]) - + # Get the minimum and maximum values for the current objective. obj_min_val = min(fitness[:, obj_idx]) obj_max_val = max(fitness[:, obj_idx]) @@ -213,42 +74,40 @@ def crowding_distance(self, pareto_front, fitness): # To avoid division by zero, set the denominator to a tiny value. if denominator == 0: denominator = 0.0000001 - + # Set the crowding distance to the first and last solutions (after being sorted) to infinity. inf_val = float('inf') - # crowding_distance[0] = inf_val obj_sorted[0][2] = inf_val - # crowding_distance[-1] = inf_val obj_sorted[-1][2] = inf_val - + # If there are only 2 solutions in the current pareto front, then do not proceed. # The crowding distance for such 2 solutions is infinity. if len(obj_sorted) <= 2: obj_crowding_dist_list.append(obj_sorted) break - + for idx in range(1, len(obj_sorted)-1): # Calculate the crowding distance. crowding_dist = obj_sorted[idx+1][1] - obj_sorted[idx-1][1] crowding_dist = crowding_dist / denominator # Insert the crowding distance back into the list to override the initial zero. obj_sorted[idx][2] = crowding_dist - + # Sort the objective by the original index at index 0 of each child list. obj_sorted = sorted(obj_sorted, key=lambda x: x[0]) obj_crowding_dist_list.append(obj_sorted) - + obj_crowding_dist_list = numpy.array(obj_crowding_dist_list) crowding_dist = numpy.array([obj_crowding_dist_list[idx, :, 2] for idx in range(len(obj_crowding_dist_list))]) crowding_dist_sum = numpy.sum(crowding_dist, axis=0) - - # An array of the sum of crowding distances across all objectives. + + # An array of the sum of crowding distances across all objectives. # Each row has 2 elements: # 1) The index of the solution. # 2) The sum of all crowding distances for all objectives of the solution. crowding_dist_sum = numpy.array(list(zip(obj_crowding_dist_list[0, :, 0], crowding_dist_sum))) crowding_dist_sum = sorted(crowding_dist_sum, key=lambda x: x[1], reverse=True) - + # The sorted solutions' indices by the crowding distance. crowding_dist_front_sorted_indices = numpy.array(crowding_dist_sum)[:, 0] crowding_dist_front_sorted_indices = crowding_dist_front_sorted_indices.astype(int) @@ -257,7 +116,7 @@ def crowding_distance(self, pareto_front, fitness): crowding_dist_pop_sorted_indices = pareto_front[:, 0] crowding_dist_pop_sorted_indices = crowding_dist_pop_sorted_indices[crowding_dist_front_sorted_indices] crowding_dist_pop_sorted_indices = crowding_dist_pop_sorted_indices.astype(int) - + return obj_crowding_dist_list, crowding_dist_sum, crowding_dist_front_sorted_indices, crowding_dist_pop_sorted_indices def sort_solutions_nsga2(self, diff --git a/pygad/utils/nsga3.py b/pygad/utils/nsga3.py index d47bca0..546b93d 100644 --- a/pygad/utils/nsga3.py +++ b/pygad/utils/nsga3.py @@ -1,4 +1,13 @@ -import warnings +""" +NSGA-III algorithm primitives. + +This module contains the math used by NSGA-III: reference point +generation, ideal point, extreme points, hyperplane intercepts, +normalization, association to reference lines, and niching. The +selection routines (``nsga3_selection`` and +``tournament_selection_nsga3``) live in ``parent_selection.py`` and the +engine-time bootstrap helpers live in ``engine.py``. +""" import numpy @@ -6,11 +15,11 @@ # Weight used to amplify the off-axis terms in the ASF score when looking # for the extreme point of each objective. A very small weight makes any # deviation on a non-target axis huge so it dominates the score. -ASF_EPSILON = 1e-6 +NSGA3_ASF_EPSILON = 1e-6 # Numbers smaller than this are treated as zero when we check for a # singular linear system or a collapsed axis range. -INTERCEPT_NEAR_ZERO = 1e-12 +NSGA3_INTERCEPT_NEAR_ZERO = 1e-12 class NSGA3: @@ -18,7 +27,7 @@ class NSGA3: def __init__(self): pass - def generate_reference_points(self, num_objectives, num_divisions): + def nsga3_generate_reference_points(self, num_objectives, num_divisions): """ Build the structured grid of reference points on the unit simplex using the Das-Dennis (stars-and-bars) method. @@ -40,14 +49,14 @@ def generate_reference_points(self, num_objectives, num_divisions): A 2D array of shape (n_points, num_objectives). Each row is one reference point and its values sum to 1.0. """ - compositions = list(_enumerate_compositions(num_objectives, num_divisions)) + compositions = list(_nsga3_enumerate_compositions(num_objectives, num_divisions)) as_array = numpy.array(compositions, dtype=float) return as_array / num_divisions - def compute_ideal_point(self, fitness): + def nsga3_compute_ideal_point(self, fitness): """ Return the ideal point: the best fitness value for each objective - across the input fitness rows. PyGAD maximises, so the best value + across the input fitness rows. PyGAD maximizes, so the best value per objective is the column maximum. Parameters @@ -62,7 +71,8 @@ def compute_ideal_point(self, fitness): """ return numpy.asarray(fitness).max(axis=0) - def find_extreme_points(self, fitness, ideal_point, epsilon=ASF_EPSILON): + def nsga3_find_extreme_points(self, fitness, ideal_point, + epsilon=NSGA3_ASF_EPSILON): """ For each objective axis, find the solution that best represents the corner of that axis. This is done by running the Achievement @@ -101,13 +111,14 @@ def find_extreme_points(self, fitness, ideal_point, epsilon=ASF_EPSILON): extremes[axis] = fitness[numpy.argmin(asf_per_solution)] return extremes - def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): + def nsga3_compute_intercepts(self, extreme_points, ideal_point, + fallback_fitness): """ Fit a hyperplane through the M extreme points and return the intercept point on each axis. The result is the point we use to scale every objective to the [0, 1] range during normalization. - The NSGA-III paper define the intercept as the point that + The NSGA-III paper defines the intercept as the point that normalizes to value 1 on its own axis (i.e. each extreme row lands on a simplex corner after normalization). The math is: @@ -123,14 +134,14 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): 1. If an intercept value extrapolates past the worst observed value for that objective, clip it back to the worst value. 2. If the gap between an intercept and the ideal point shrinks - below INTERCEPT_NEAR_ZERO after clipping, replace that + below NSGA3_INTERCEPT_NEAR_ZERO after clipping, replace that intercept with the worst observed value so the normalization denominator stays non-zero. Parameters ---------- extreme_points : numpy.ndarray - The M extreme points returned by find_extreme_points. + The M extreme points returned by nsga3_find_extreme_points. ideal_point : numpy.ndarray The ideal point. fallback_fitness : numpy.ndarray @@ -155,13 +166,13 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): return worst_per_objective # A near-zero coefficient means 1/b is huge and the intercept is # essentially undefined on that axis. - if numpy.any(numpy.abs(coefficients) < INTERCEPT_NEAR_ZERO): + if numpy.any(numpy.abs(coefficients) < NSGA3_INTERCEPT_NEAR_ZERO): return worst_per_objective intercepts = ideal_point + 1.0 / coefficients # Under maximization a valid intercept sits strictly below the # ideal. If it does not, the normalization denominator would flip # sign and produce nonsense values. - if numpy.any(intercepts >= ideal_point - INTERCEPT_NEAR_ZERO): + if numpy.any(intercepts >= ideal_point - NSGA3_INTERCEPT_NEAR_ZERO): return worst_per_objective # Cap the intercept at the worst observed value so we never # extrapolate the hyperplane past the real data range. @@ -169,11 +180,11 @@ def compute_intercepts(self, extreme_points, ideal_point, fallback_fitness): intercepts = numpy.where(overshoot, worst_per_objective, intercepts) # If capping leaves the gap |intercept - ideal| too small, reset # that axis to the worst observed value. - collapsed = numpy.abs(intercepts - ideal_point) < INTERCEPT_NEAR_ZERO + collapsed = numpy.abs(intercepts - ideal_point) < NSGA3_INTERCEPT_NEAR_ZERO intercepts = numpy.where(collapsed, worst_per_objective, intercepts) return intercepts - def normalise_fitness(self, fitness, ideal_point, intercepts): + def nsga3_normalize_fitness(self, fitness, ideal_point, intercepts): """ Scale each fitness row to the [0, 1] range using the ideal point and the intercepts. @@ -192,11 +203,11 @@ def normalise_fitness(self, fitness, ideal_point, intercepts): ideal_point : numpy.ndarray The ideal point. intercepts : numpy.ndarray - The intercept point returned by compute_intercepts. + The intercept point returned by nsga3_compute_intercepts. Returns ------- - normalised : numpy.ndarray + normalized : numpy.ndarray Fitness scaled to the unit hypercube, same shape as the input. """ fitness = numpy.asarray(fitness, dtype=float) @@ -206,15 +217,15 @@ def normalise_fitness(self, fitness, ideal_point, intercepts): # Under PyGAD-max, intercepts sit below ideal so denominator is # negative. Replace near-zero entries with a tiny negative value # to keep the sign correct and avoid divide-by-zero. - safe_denominator = numpy.where(denominator > -INTERCEPT_NEAR_ZERO, - -INTERCEPT_NEAR_ZERO, + safe_denominator = numpy.where(denominator > -NSGA3_INTERCEPT_NEAR_ZERO, + -NSGA3_INTERCEPT_NEAR_ZERO, denominator) raw = (fitness - ideal_point) / safe_denominator return numpy.clip(raw, 0.0, 1.0) - def associate_to_reference_points(self, normalised, reference_points): + def nsga3_associate_to_reference_points(self, normalized, reference_points): """ - For every normalised solution, find the reference line it is + For every normalized solution, find the reference line it is closest to and the perpendicular distance to that line. The reference line for reference point z is the ray from the @@ -230,8 +241,8 @@ def associate_to_reference_points(self, normalised, reference_points): Parameters ---------- - normalised : numpy.ndarray - Normalised fitness, one row per solution. + normalized : numpy.ndarray + Normalized fitness, one row per solution. reference_points : numpy.ndarray The structured reference grid, one row per point. @@ -244,7 +255,7 @@ def associate_to_reference_points(self, normalised, reference_points): A 1D array of length n_solutions with the perpendicular distance to the nearest reference line. """ - normalised = numpy.asarray(normalised, dtype=float) + normalized = numpy.asarray(normalized, dtype=float) reference_points = numpy.asarray(reference_points, dtype=float) # Turn every reference point into a unit direction vector once. unit_directions = reference_points / numpy.linalg.norm(reference_points, @@ -252,388 +263,140 @@ def associate_to_reference_points(self, normalised, reference_points): keepdims=True) # Dot products of every solution with every reference direction. # Shape: (n_solutions, n_references). - dot_products = normalised @ unit_directions.T + dot_products = normalized @ unit_directions.T # Project each solution onto each reference line. # Shape: (n_solutions, n_references, n_objectives). projections = dot_products[:, :, None] * unit_directions[None, :, :] # Perpendicular component is what is left after subtracting the # projection from the original solution. - perpendicular = normalised[:, None, :] - projections + perpendicular = normalized[:, None, :] - projections distances = numpy.linalg.norm(perpendicular, axis=2) nearest = numpy.argmin(distances, axis=1) - nearest_distance = distances[numpy.arange(len(normalised)), nearest] + nearest_distance = distances[numpy.arange(len(normalized)), nearest] return nearest, nearest_distance - def niching_select(self, fl_indices, fl_assoc, fl_dist, accepted_assoc, - num_reference_points, K): - """ - Pick K survivors from the critical front Fl using the niching - rules. The result preserves diversity across reference points. - - The niche count rho_j is the number of already accepted solutions - associated with reference point j. The procedure repeats K times: + def nsga3_niching_select(self, + critical_front_indices, + critical_front_associations, + critical_front_distances, + accepted_associations, + num_reference_points, + num_to_select): + """ + Pick ``num_to_select`` survivors from the critical front using + the niching rules. The result preserves diversity across + reference points. + + The niche count of a reference point j is the number of already + accepted solutions associated with j. The procedure repeats + ``num_to_select`` times: 1. Pick the reference point with the smallest niche count that - still has at least one Fl candidate attached. - 2. If that reference point has rho_j = 0, pick the Fl candidate - closest to its reference line. - 3. If rho_j > 0, pick one of its Fl candidates at random. + still has at least one critical-front candidate attached. + 2. If that reference point has niche count zero, pick the + critical-front candidate closest to its reference line. + 3. If the niche count is positive, pick one of its + critical-front candidates at random. 4. Add the selected candidate to the survivor list, increase - rho_j by 1, and remove the candidate from Fl. + the niche count by 1, and remove the candidate from the + critical front. - Ties on minimum rho_j go to the lower reference index. + Ties on minimum niche count go to the lower reference index. Parameters ---------- - fl_indices : list[int] + critical_front_indices : list[int] Population indices of the candidates in the critical front. - fl_assoc : numpy.ndarray - Reference index each Fl candidate is associated with. - fl_dist : numpy.ndarray - Perpendicular distance from each Fl candidate to its - reference line. - accepted_assoc : numpy.ndarray + critical_front_associations : numpy.ndarray + Reference index each critical-front candidate is associated + with. + critical_front_distances : numpy.ndarray + Perpendicular distance from each critical-front candidate to + its reference line. + accepted_associations : numpy.ndarray Reference index each already-accepted solution is associated with. Used to seed the niche counts. num_reference_points : int Total number of reference points. - K : int - Number of survivors to pick from Fl. + num_to_select : int + Number of survivors to pick from the critical front. Returns ------- picked : list[int] Population indices of the selected survivors, in selection - order. Length is at most K. + order. Length is at most ``num_to_select``. """ - rho = numpy.zeros(num_reference_points, dtype=int) - for ref in accepted_assoc: - rho[ref] += 1 - remaining_positions = list(range(len(fl_indices))) + niche_counts = numpy.zeros(num_reference_points, dtype=int) + for reference_index in accepted_associations: + niche_counts[reference_index] += 1 + remaining_positions = list(range(len(critical_front_indices))) picked = [] - while len(picked) < K and remaining_positions: - target_ref = _pick_target_reference_point(rho, fl_assoc, remaining_positions) - if target_ref is None: + while len(picked) < num_to_select and remaining_positions: + target_reference_index = _nsga3_pick_target_reference_point( + niche_counts, critical_front_associations, remaining_positions) + if target_reference_index is None: break - candidates_at_target = [pos for pos in remaining_positions - if fl_assoc[pos] == target_ref] - chosen_pos = _pick_candidate_at_reference(candidates_at_target, - fl_dist, - rho[target_ref]) - picked.append(fl_indices[chosen_pos]) - rho[target_ref] += 1 - remaining_positions.remove(chosen_pos) + candidates_at_target = [ + position for position in remaining_positions + if critical_front_associations[position] == target_reference_index + ] + chosen_position = _nsga3_pick_candidate_at_reference( + candidates_at_target, + critical_front_distances, + niche_counts[target_reference_index], + ) + picked.append(critical_front_indices[chosen_position]) + niche_counts[target_reference_index] += 1 + remaining_positions.remove(chosen_position) return picked - def nsga3_selection(self, fitness, num_parents): - """ - Select num_parents parents from the current population using - NSGA-III. Solutions are first sorted into Pareto fronts. Whole - fronts are accepted in order until the next front would overflow - the requested parent count; that front becomes the critical front - Fl. Survivors from Fl are picked by niching against the structured - reference points stored on the GA instance. - - Parameters - ---------- - fitness : numpy.ndarray - Fitness values for the entire population. Must be - multi-objective (each row is a vector of M values). - num_parents : int - Number of parents to select. - - Returns - ------- - parents : numpy.ndarray - Selected parent solutions copied from self.population. - parents_indices : numpy.ndarray - Indices of the selected parents inside self.population. - """ - _validate_multi_objective_fitness(fitness, self.supported_int_float_types, - 'nsga3_selection') - pareto_fronts, _ = self.non_dominated_sorting(fitness) - self.pareto_fronts = pareto_fronts.copy() - - accepted_indices, fl_indices = _accumulate_fronts(pareto_fronts, num_parents) - if fl_indices: - # Need to pick K survivors from the critical front Fl. - picked = self._pick_critical_front_survivors(accepted_indices, - fl_indices, - fitness, - num_parents - len(accepted_indices)) - final_indices = accepted_indices + picked - else: - # The accepted fronts already fit exactly; no niching needed. - final_indices = accepted_indices - - return self._build_parents(final_indices, num_parents) - - def _pick_critical_front_survivors(self, accepted_indices, fl_indices, - fitness, K): - """ - Run the NSGA-III normalization and niching steps on the pool - P_next U Fl, then ask niching_select for K survivors from Fl. - - The ideal point, extreme points, intercepts and normalized values - are all computed on the combined pool (accepted plus critical - front) because that is what the NSGA-III paper specifies. - """ - st_indices = accepted_indices + fl_indices - st_fitness = numpy.array([fitness[i] for i in st_indices], dtype=float) - ideal_point = self.compute_ideal_point(st_fitness) - extremes = self.find_extreme_points(st_fitness, ideal_point) - intercepts = self.compute_intercepts(extremes, ideal_point, st_fitness) - normalised = self.normalise_fitness(st_fitness, ideal_point, intercepts) - assoc, dist = self.associate_to_reference_points(normalised, - self.nsga3_reference_points) - # The first |accepted_indices| rows of st_fitness belong to the - # accepted set; the rest are the Fl candidates. - split = len(accepted_indices) - return self.niching_select(fl_indices=fl_indices, - fl_assoc=assoc[split:], - fl_dist=dist[split:], - accepted_assoc=assoc[:split], - num_reference_points=len(self.nsga3_reference_points), - K=K) - - def _build_parents(self, final_indices, num_parents): - """ - Copy the chosen solutions out of self.population into a new - parents array of the right dtype, and return it together with the - index array. - """ - if self.gene_type_single: - parents = numpy.empty((num_parents, self.population.shape[1]), - dtype=self.gene_type[0]) - else: - parents = numpy.empty((num_parents, self.population.shape[1]), - dtype=object) - for slot, idx in enumerate(final_indices): - parents[slot, :] = self.population[idx, :].copy() - return parents, numpy.array(final_indices) - - def tournament_selection_nsga3(self, fitness, num_parents): - """ - Select num_parents parents using K-tournament where the within- - front comparison is based on NSGA-III niching. - - The full population is sorted into Pareto fronts and normalised - once at the start. For each parent slot: - 1. Pick K_tournament solutions at random. - 2. Keep only the ones in the best (lowest) Pareto front. - 3. If more than one is left, the winner is the solution whose - reference point has the smallest niche count. Ties on niche - count go to the smaller perpendicular distance. - - Parameters - ---------- - fitness : numpy.ndarray - Fitness values for the entire population. Must be - multi-objective. - num_parents : int - Number of parents to select. - Returns - ------- - parents : numpy.ndarray - Selected parent solutions. - parents_indices : numpy.ndarray - Indices of the selected parents inside self.population. - """ - _validate_multi_objective_fitness(fitness, self.supported_int_float_types, - 'tournament_selection_nsga3') - pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) - self.pareto_fronts = pareto_fronts.copy() - - # Convert the fitness rows to a clean 2D float array. - fitness_matrix = numpy.array([list(row) for row in fitness], dtype=float) - ideal_point = self.compute_ideal_point(fitness_matrix) - extremes = self.find_extreme_points(fitness_matrix, ideal_point) - intercepts = self.compute_intercepts(extremes, ideal_point, fitness_matrix) - normalised = self.normalise_fitness(fitness_matrix, ideal_point, intercepts) - assoc, dist = self.associate_to_reference_points(normalised, - self.nsga3_reference_points) - # Niche count is the number of population solutions attached to - # each reference point. - rho = numpy.bincount(assoc, minlength=len(self.nsga3_reference_points)) - - rand_indices = numpy.random.randint(low=0, - high=len(solutions_fronts_indices), - size=(num_parents, self.K_tournament)) - parents_indices = [self._pick_tournament_winner(rand_indices[slot], - solutions_fronts_indices, - assoc, dist, rho) - for slot in range(num_parents)] - return self._build_parents(parents_indices, num_parents) - - def _pick_tournament_winner(self, competitor_indices, fronts_indices, - assoc, dist, rho): - """ - Pick the best solution among the K-tournament competitors. The - best front index wins first; ties are broken by lower niche count, - then by smaller perpendicular distance. - """ - best_front = fronts_indices[competitor_indices].min() - finalists = competitor_indices[fronts_indices[competitor_indices] == best_front] - if len(finalists) == 1: - return int(finalists[0]) - finalist_rho = rho[assoc[finalists]] - finalist_dist = dist[finalists] - # lexsort sorts by the last key first, so this orders by rho first - # and breaks ties by distance. - ordering = numpy.lexsort((finalist_dist, finalist_rho)) - return int(finalists[ordering[0]]) - - def _bootstrap_nsga3_reference_points(self): - """ - Build the reference-point grid once, right after the first - fitness evaluation. The number of objectives M is read from the - length of the first fitness vector. - - If sol_per_pop is smaller than the number of reference points, - grow the population to match and re-evaluate fitness so the GA - loop can carry on with a valid population. - """ - num_objectives = len(self.last_generation_fitness[0]) - self.nsga3_reference_points = self.generate_reference_points( - num_objectives, self.nsga3_num_divisions) - required_size = len(self.nsga3_reference_points) - if self.sol_per_pop < required_size: - self._grow_population_for_nsga3(required_size, num_objectives) - - def _grow_population_for_nsga3(self, required_size, num_objectives): - """ - Append random solutions to self.population until the population - size equals required_size, then re-evaluate fitness. Also refresh - num_offspring so the next generation produces the right count. - """ - original_size = self.sol_per_pop - if not self.suppress_warnings: - warnings.warn( - f"sol_per_pop ({original_size}) is smaller than the number of " - f"NSGA-III reference points ({required_size}) for M={num_objectives} " - f"objectives and nsga3_num_divisions={self.nsga3_num_divisions}. " - f"Growing the population to {required_size} random solutions " - f"and re-evaluating fitness." - ) - extra = self._generate_extra_random_solutions(required_size - original_size) - self.population = numpy.vstack([self.population, extra]) - self.sol_per_pop = required_size - self.pop_size = (required_size, self.num_genes) - # Shared helper on the Validation mixin keeps the rule in one place. - self._refresh_num_offspring() - self.last_generation_fitness = self.cal_pop_fitness() - - def _generate_extra_random_solutions(self, count): - """ - Build `count` random solutions using the same gene-by-gene logic - the GA uses for the initial population. - """ - extra = numpy.empty((count, self.num_genes), dtype=object) - for sol_idx in range(count): - for gene_idx in range(self.num_genes): - extra[sol_idx, gene_idx] = self._generate_single_random_gene( - gene_idx, extra[sol_idx]) - return self.change_population_dtype_and_round(extra) - - def _generate_single_random_gene(self, gene_idx, partial_solution): - """ - Pick a single random gene value for index `gene_idx`. Uses the - gene-space sampler when gene_space is set; otherwise samples from - the init range for that gene. - """ - if self.gene_space is None: - range_min, range_max = self.get_initial_population_range(gene_index=gene_idx) - return self.generate_gene_value_randomly(range_min=range_min, - range_max=range_max, - gene_idx=gene_idx, - mutation_by_replacement=True, - gene_value=None, - sample_size=1, - step=1) - return self.generate_gene_value_from_space(gene_idx=gene_idx, - mutation_by_replacement=True, - gene_value=None, - solution=partial_solution, - sample_size=1) - - -def _pick_target_reference_point(rho, fl_assoc, remaining_positions): +def _nsga3_pick_target_reference_point(niche_counts, + critical_front_associations, + remaining_positions): """ - Among the reference points that still have at least one Fl candidate - attached, pick the one with the smallest niche count. Break ties by - the lower reference index. + Among the reference points that still have at least one critical- + front candidate attached, pick the one with the smallest niche + count. Break ties by the lower reference index. """ - candidate_refs = {int(fl_assoc[pos]) for pos in remaining_positions} - if not candidate_refs: + candidate_references = { + int(critical_front_associations[position]) + for position in remaining_positions + } + if not candidate_references: return None - min_rho = min(rho[ref] for ref in candidate_refs) - return min(ref for ref in candidate_refs if rho[ref] == min_rho) + min_niche_count = min(niche_counts[reference] + for reference in candidate_references) + return min(reference for reference in candidate_references + if niche_counts[reference] == min_niche_count) -def _pick_candidate_at_reference(candidates_at_target, fl_dist, rho_at_target): +def _nsga3_pick_candidate_at_reference(candidates_at_target, + critical_front_distances, + niche_count_at_target): """ - Choose one Fl candidate at the given reference point. If the niche - count is 0 (empty niche), pick the closest candidate. Otherwise pick - a candidate at random. + Choose one critical-front candidate at the given reference point. If + the niche count is 0 (empty niche), pick the closest candidate. + Otherwise pick a candidate at random. """ - if rho_at_target == 0: - return min(candidates_at_target, key=lambda pos: fl_dist[pos]) - return candidates_at_target[numpy.random.randint(len(candidates_at_target))] + if niche_count_at_target == 0: + return min(candidates_at_target, + key=lambda position: critical_front_distances[position]) + return candidates_at_target[ + numpy.random.randint(len(candidates_at_target)) + ] -def _enumerate_compositions(num_objectives, num_divisions): +def _nsga3_enumerate_compositions(num_objectives, num_divisions): """ Yield every non-negative integer tuple of length num_objectives that - sums to num_divisions. Used by generate_reference_points to build the - Das-Dennis grid. + sums to num_divisions. Used by nsga3_generate_reference_points to + build the Das-Dennis grid. """ if num_objectives == 1: yield [num_divisions] return - # 13 for first in range(num_divisions + 1): - for rest in _enumerate_compositions(num_objectives - 1, num_divisions - first): + for rest in _nsga3_enumerate_compositions(num_objectives - 1, + num_divisions - first): yield [first] + rest - - -def _validate_multi_objective_fitness(fitness, supported_int_float_types, method_name): - """ - Raise an error if the first fitness value is a scalar (which means - the problem is single-objective and NSGA-III cannot be applied) or if - it is some other unsupported type. - """ - if type(fitness[0]) in supported_int_float_types: - raise ValueError( - f"{method_name} requires a multi-objective fitness function " - f"(an iterable per solution), but the first fitness value " - f"({fitness[0]!r}) has scalar type {type(fitness[0]).__name__}." - ) - if type(fitness[0]) not in (list, tuple, numpy.ndarray): - raise TypeError( - f"{method_name} expects each fitness value to be a list, tuple, " - f"or numpy.ndarray, but the first fitness value has type " - f"{type(fitness[0]).__name__}." - ) - - -def _accumulate_fronts(pareto_fronts, num_parents): - """ - Walk the Pareto fronts in order and add each whole front to the - accepted list while the running total stays at or below num_parents. - The first front that would overflow becomes the critical front Fl. - - Returns a pair (accepted_indices, fl_indices). When the accepted set - fits exactly into num_parents, fl_indices is empty. - """ - accepted_indices = [] - fl_indices = [] - for front in pareto_fronts: - front_solution_indices = front[:, 0].astype(int).tolist() - if len(accepted_indices) + len(front_solution_indices) <= num_parents: - accepted_indices.extend(front_solution_indices) - if len(accepted_indices) == num_parents: - break - else: - fl_indices = front_solution_indices - break - return accepted_indices, fl_indices diff --git a/pygad/utils/parent_selection.py b/pygad/utils/parent_selection.py index 5ce3126..31eebe0 100644 --- a/pygad/utils/parent_selection.py +++ b/pygad/utils/parent_selection.py @@ -404,7 +404,7 @@ def tournament_selection_nsga2(self, parents_indices = [] # If there is only a single objective, each pareto front is expected to have only 1 solution. - # TODO Make a test to check for that behaviour and add it to the GitHub actions tests. + # TODO Make a test to check for that behavior and add it to the GitHub actions tests. pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) self.pareto_fronts = pareto_fronts.copy() @@ -554,7 +554,7 @@ def nsga2_selection(self, parents_indices = [] # If there is only a single objective, each pareto front is expected to have only 1 solution. - # TODO Make a test to check for that behaviour. + # TODO Make a test to check for that behavior. pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) self.pareto_fronts = pareto_fronts.copy() @@ -605,3 +605,243 @@ def nsga2_selection(self, # Make sure the parents indices is returned as a NumPy array. return parents, numpy.array(parents_indices) + + def nsga3_selection(self, fitness, num_parents): + """ + Select ``num_parents`` parents from the current population using + NSGA-III. Solutions are first sorted into Pareto fronts. Whole + fronts are accepted in order until the next front would overflow + the requested parent count; that front becomes the critical + front. Survivors from the critical front are picked by niching + against the structured reference points stored on the GA + instance. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values for the entire population. Must be + multi-objective (each row is a vector of M values). + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions copied from ``self.population``. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + """ + _nsga3_validate_multi_objective_fitness( + fitness, self.supported_int_float_types, 'nsga3_selection') + pareto_fronts, _ = self.non_dominated_sorting(fitness) + self.pareto_fronts = pareto_fronts.copy() + + accepted_indices, critical_front_indices = _nsga3_accumulate_fronts( + pareto_fronts, num_parents) + if critical_front_indices: + picked = self._nsga3_pick_critical_front_survivors( + accepted_indices, + critical_front_indices, + fitness, + num_parents - len(accepted_indices)) + final_indices = accepted_indices + picked + else: + # The accepted fronts already fit exactly; no niching needed. + final_indices = accepted_indices + + return self._nsga3_build_parents(final_indices, num_parents) + + def _nsga3_pick_critical_front_survivors(self, + accepted_indices, + critical_front_indices, + fitness, + num_to_select): + """ + Run the NSGA-III normalization and niching steps on the + candidate pool described below, then ask + ``nsga3_niching_select`` for ``num_to_select`` survivors from + the critical front. + + The candidate pool is the union of two sets: + 1. The already-accepted solutions (``accepted_indices``). + These are the solutions taken from earlier, fully-fitting + Pareto fronts. + 2. The critical-front candidates (``critical_front_indices``). + These are every solution in the first Pareto front that + would not fit entirely into the parent quota. + + Working on the union (and not just the survivors) is what the + NSGA-III paper requires: the ideal point, extreme points, + intercepts and normalized values must be computed on this + combined pool so the geometry stays stable as the niching loop + accepts or rejects critical-front members. + """ + selection_pool_indices = accepted_indices + critical_front_indices + selection_pool_fitness = numpy.array( + [fitness[i] for i in selection_pool_indices], dtype=float) + ideal_point = self.nsga3_compute_ideal_point(selection_pool_fitness) + extremes = self.nsga3_find_extreme_points(selection_pool_fitness, + ideal_point) + intercepts = self.nsga3_compute_intercepts(extremes, + ideal_point, + selection_pool_fitness) + normalized = self.nsga3_normalize_fitness(selection_pool_fitness, + ideal_point, + intercepts) + associations, distances = self.nsga3_associate_to_reference_points( + normalized, self.nsga3_reference_points) + # The first len(accepted_indices) rows of the pool belong to the + # accepted set; the rest are the critical-front candidates. + split = len(accepted_indices) + return self.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=associations[split:], + critical_front_distances=distances[split:], + accepted_associations=associations[:split], + num_reference_points=len(self.nsga3_reference_points), + num_to_select=num_to_select, + ) + + def _nsga3_build_parents(self, final_indices, num_parents): + """ + Copy the chosen solutions out of ``self.population`` into a new + parents array of the right dtype, and return it together with + the index array. + """ + parents = self.initialize_parents_array( + (num_parents, self.population.shape[1])) + for slot, idx in enumerate(final_indices): + parents[slot, :] = self.population[idx, :].copy() + return parents, numpy.array(final_indices) + + def tournament_selection_nsga3(self, fitness, num_parents): + """ + Select ``num_parents`` parents using K-tournament where the + within-front comparison is based on NSGA-III niching. + + The full population is sorted into Pareto fronts and normalized + once at the start. For each parent slot: + 1. Pick ``self.K_tournament`` solutions at random. + 2. Keep only the ones in the best (lowest) Pareto front. + 3. If more than one is left, the winner is the solution whose + reference point has the smallest niche count. Ties on niche + count go to the smaller perpendicular distance. + + Parameters + ---------- + fitness : numpy.ndarray + Fitness values for the entire population. Must be + multi-objective. + num_parents : int + Number of parents to select. + + Returns + ------- + parents : numpy.ndarray + Selected parent solutions. + parents_indices : numpy.ndarray + Indices of the selected parents inside ``self.population``. + """ + _nsga3_validate_multi_objective_fitness( + fitness, self.supported_int_float_types, + 'tournament_selection_nsga3') + pareto_fronts, solutions_fronts_indices = self.non_dominated_sorting(fitness) + self.pareto_fronts = pareto_fronts.copy() + + # Convert the fitness rows to a clean 2D float array. + fitness_matrix = numpy.array([list(row) for row in fitness], dtype=float) + ideal_point = self.nsga3_compute_ideal_point(fitness_matrix) + extremes = self.nsga3_find_extreme_points(fitness_matrix, ideal_point) + intercepts = self.nsga3_compute_intercepts(extremes, + ideal_point, + fitness_matrix) + normalized = self.nsga3_normalize_fitness(fitness_matrix, + ideal_point, + intercepts) + associations, distances = self.nsga3_associate_to_reference_points( + normalized, self.nsga3_reference_points) + # Niche count is the number of population solutions attached to + # each reference point. + niche_counts = numpy.bincount(associations, + minlength=len(self.nsga3_reference_points)) + + rand_indices = numpy.random.randint(low=0, + high=len(solutions_fronts_indices), + size=(num_parents, self.K_tournament)) + parents_indices = [self._nsga3_pick_tournament_winner(rand_indices[slot], + solutions_fronts_indices, + associations, + distances, + niche_counts) + for slot in range(num_parents)] + return self._nsga3_build_parents(parents_indices, num_parents) + + def _nsga3_pick_tournament_winner(self, + competitor_indices, + fronts_indices, + associations, + distances, + niche_counts): + """ + Pick the best solution among the K-tournament competitors. The + best front index wins first; ties are broken by lower niche + count, then by smaller perpendicular distance. + """ + best_front = fronts_indices[competitor_indices].min() + finalists = competitor_indices[ + fronts_indices[competitor_indices] == best_front] + if len(finalists) == 1: + return int(finalists[0]) + finalist_niche_counts = niche_counts[associations[finalists]] + finalist_distances = distances[finalists] + # lexsort sorts by the last key first, so this orders by niche + # count first and breaks ties by distance. + ordering = numpy.lexsort((finalist_distances, finalist_niche_counts)) + return int(finalists[ordering[0]]) + + +def _nsga3_validate_multi_objective_fitness(fitness, + supported_int_float_types, + method_name): + """ + Raise an error if the first fitness value is a scalar (which means + the problem is single-objective and NSGA-III cannot be applied) or + if it is some other unsupported type. + """ + if type(fitness[0]) in supported_int_float_types: + raise TypeError( + f"{method_name} requires a multi-objective fitness function " + f"(an iterable per solution), but the first fitness value " + f"({fitness[0]!r}) has scalar type {type(fitness[0]).__name__}." + ) + if type(fitness[0]) not in (list, tuple, numpy.ndarray): + raise TypeError( + f"{method_name} expects each fitness value to be a list, tuple, " + f"or numpy.ndarray, but the first fitness value has type " + f"{type(fitness[0]).__name__}." + ) + + +def _nsga3_accumulate_fronts(pareto_fronts, num_parents): + """ + Walk the Pareto fronts in order and add each whole front to the + accepted list while the running total stays at or below + ``num_parents``. The first front that would overflow becomes the + critical front. + + Returns a pair (accepted_indices, critical_front_indices). When the + accepted set fits exactly into ``num_parents``, + ``critical_front_indices`` is empty. + """ + accepted_indices = [] + critical_front_indices = [] + for front in pareto_fronts: + front_solution_indices = front[:, 0].astype(int).tolist() + if len(accepted_indices) + len(front_solution_indices) <= num_parents: + accepted_indices.extend(front_solution_indices) + if len(accepted_indices) == num_parents: + break + else: + critical_front_indices = front_solution_indices + break + return accepted_indices, critical_front_indices diff --git a/pygad/utils/quality_indicators.py b/pygad/utils/quality_indicators.py index 38fa922..6a79b95 100644 --- a/pygad/utils/quality_indicators.py +++ b/pygad/utils/quality_indicators.py @@ -1,5 +1,5 @@ """ -Quality indicators for multi-objective optimisation. +Quality indicators for multi-objective optimization. Four indicators to measure the quality of a Pareto front built by PyGAD: diff --git a/pygad/utils/report.py b/pygad/utils/report.py new file mode 100644 index 0000000..1bd06e5 --- /dev/null +++ b/pygad/utils/report.py @@ -0,0 +1,566 @@ +""" +PDF report generation for a completed GA run. + +The ``Report`` class is mixed into ``pygad.GA``. Call +``ga_instance.generate_report(filename)`` after ``run()`` finishes to +get a PDF that bundles the run configuration, the best solution(s), +and every applicable plot. + +The report relies on two optional dependencies, ``matplotlib`` and +``reportlab``. Both are installed by ``pip install pygad[report]``. +The imports happen on first use so users who never call +``generate_report`` keep the lean install. +""" + +import io + + +# Default order in which sections appear in the report. Used by +# ``generate_report`` when the caller does not pass an explicit +# ``sections`` list. +REPORT_DEFAULT_SECTIONS = ("title", + "configuration", + "run_summary", + "best_solution", + "plots", + "notes") + +# Inventory of every plot the report can include, in the order the +# report renders them. Each entry has: +# name : section label that appears in the PDF +# method : name of the GA method that draws the plot +# requires_moo: True if the plot only works for multi-objective runs +# requires : tuple of attribute names that must be truthy +# kwargs : dict of keyword arguments passed to the method +REPORT_PLOTS = ( + {"name": "Best fitness per generation", + "method": "plot_fitness", + "requires_moo": False, + "requires": (), + "kwargs": {}}, + {"name": "New solutions per generation", + "method": "plot_new_solution_rate", + "requires_moo": False, + "requires": ("save_solutions",), + "kwargs": {}}, + {"name": "Per-gene drift", + "method": "plot_genes", + "requires_moo": False, + "requires": ("save_solutions",), + "kwargs": {"graph_type": "plot", "solutions": "all"}}, + {"name": "Min/Mean/Max fitness band", + "method": "plot_fitness_band", + "requires_moo": False, + "requires": ("save_solutions",), + "kwargs": {}}, + {"name": "Population diversity", + "method": "plot_population_diversity", + "requires_moo": False, + "requires": ("save_solutions",), + "kwargs": {}}, + {"name": "Pareto front", + "method": "plot_pareto_front_curve", + "requires_moo": True, + "requires": (), + "kwargs": {}, + "max_objectives": 3}, + {"name": "Parallel coordinates of the Pareto front", + "method": "plot_pareto_front_pcp", + "requires_moo": True, + "requires": (), + "kwargs": {}}, + {"name": "Pairwise scatter matrix of the Pareto front", + "method": "plot_pareto_front_scatter_matrix", + "requires_moo": True, + "requires": (), + "kwargs": {}}, + {"name": "Pareto front heatmap", + "method": "plot_pareto_front_heatmap", + "requires_moo": True, + "requires": (), + "kwargs": {}}, + {"name": "Hypervolume of the non-dominated set", + "method": "plot_non_dominated_hypervolume", + "requires_moo": True, + "requires": ("save_solutions",), + "kwargs": {}}, + {"name": "Pareto front evolution", + "method": "plot_pareto_front_evolution", + "requires_moo": True, + "requires": ("save_solutions",), + "kwargs": {"every_k": 10}, + "max_objectives": 3}, +) + + +# Names of the GA constructor parameters the report shows in the +# configuration table. Grouped by topic so the table reads well. +CONFIGURATION_GROUPS = ( + ("Population", ["num_generations", "num_parents_mating", "sol_per_pop", + "num_genes", "init_range_low", "init_range_high", + "gene_type", "gene_space", "allow_duplicate_genes", + "gene_constraint", "sample_size"]), + ("Parent selection", ["parent_selection_type", "K_tournament", + "nsga3_num_divisions", "keep_parents", + "keep_elitism"]), + ("Crossover", ["crossover_type", "crossover_probability", + "sbx_crossover_eta"]), + ("Mutation", ["mutation_type", "mutation_probability", + "mutation_percent_genes", "mutation_num_genes", + "polynomial_mutation_eta", "mutation_by_replacement", + "random_mutation_min_val", "random_mutation_max_val"]), + ("Stopping criteria", ["stop_criteria"]), + ("Run-time", ["fitness_batch_size", "parallel_processing", + "random_seed", "suppress_warnings"]), + ("History", ["save_solutions", "save_best_solutions"]), +) + + +class Report: + + def __init__(self): + pass + + def generate_report(self, + filename, + title=None, + sections=None, + include_plots=None, + figure_size_inches=(7.0, 4.5), + notes=None, + page_size="letter"): + """ + Build a PDF report of the current GA run and write it to disk. + + Parameters + ---------- + filename : str + Output path. ``.pdf`` is appended automatically if missing. + title : str or None + Title shown on the first page. Defaults to ``"PyGAD run + report"``. + sections : iterable of str or None + Sections to include and their order. Valid entries are + ``"title"``, ``"configuration"``, ``"run_summary"``, + ``"best_solution"``, ``"plots"``, and ``"notes"``. When + ``None``, every section is included in their default order. + include_plots : iterable of str, "all", or None + Plots to embed under the ``"plots"`` section. + ``None`` or ``"all"`` lets the report auto-select every + plot whose preconditions are met by this run (the right + number of objectives, ``save_solutions`` set, and so on). + Pass a list of plot method names (e.g. + ``["plot_fitness", "plot_pareto_front_curve"]``) to include + only those. + figure_size_inches : (float, float) + Width and height (in inches) used when each plot is drawn + for the report. The figures inside the PDF preserve this + aspect ratio. + notes : str or None + Free-form text rendered in the optional ``"notes"`` + section. + page_size : str + ``"letter"`` (default) or ``"A4"``. + + Returns + ------- + filename : str + The path of the PDF file that was written. + + Raises + ------ + ImportError + If ``reportlab`` or ``matplotlib`` is not installed. + RuntimeError + If the GA has not completed at least one generation. + ValueError + If ``sections`` or ``include_plots`` contain an unknown + entry, or if ``page_size`` is unknown. + """ + if self.generations_completed < 1: + raise RuntimeError( + "generate_report() can only be called after at least one " + "generation has completed. Call run() first.") + + reportlab_modules = _import_reportlab() + matplt = _import_matplotlib() + + section_list = _resolve_sections(sections) + page_size_obj = _resolve_page_size(page_size, reportlab_modules) + + if not filename.endswith(".pdf"): + filename = filename + ".pdf" + + story = [] + styles = reportlab_modules["styles"].getSampleStyleSheet() + for section_name in section_list: + if section_name == "title": + story.extend(_build_title_section( + self, title, styles, reportlab_modules)) + elif section_name == "configuration": + story.extend(_build_configuration_section( + self, styles, reportlab_modules)) + elif section_name == "run_summary": + story.extend(_build_run_summary_section( + self, styles, reportlab_modules)) + elif section_name == "best_solution": + story.extend(_build_best_solution_section( + self, styles, reportlab_modules)) + elif section_name == "plots": + story.extend(_build_plots_section( + self, + include_plots, + figure_size_inches, + styles, + reportlab_modules, + matplt)) + elif section_name == "notes": + story.extend(_build_notes_section( + notes, styles, reportlab_modules)) + + doc = reportlab_modules["SimpleDocTemplate"]( + filename, + pagesize=page_size_obj, + title=title or "PyGAD run report", + author="PyGAD", + ) + doc.build(story) + return filename + + +def _import_reportlab(): + """ + Import reportlab on first use. Returns a dict with the names the + report builder needs, so the calling code does not have to repeat + the imports. + """ + try: + from reportlab.lib import colors, pagesizes, styles + from reportlab.lib.units import inch + from reportlab.platypus import ( + Image, + PageBreak, + Paragraph, + SimpleDocTemplate, + Spacer, + Table, + TableStyle, + ) + except ImportError as exc: + raise ImportError( + "generate_report requires reportlab. Install it with: " + "pip install pygad[report] (or pip install reportlab)." + ) from exc + return { + "colors": colors, + "pagesizes": pagesizes, + "styles": styles, + "inch": inch, + "Image": Image, + "PageBreak": PageBreak, + "Paragraph": Paragraph, + "SimpleDocTemplate": SimpleDocTemplate, + "Spacer": Spacer, + "Table": Table, + "TableStyle": TableStyle, + } + + +def _import_matplotlib(): + """ + Import matplotlib on first use. The Agg backend is forced so the + report can be generated in headless environments. + """ + try: + import matplotlib + matplotlib.use("Agg", force=False) + import matplotlib.pyplot as matplt + except ImportError as exc: + raise ImportError( + "generate_report requires matplotlib. Install it with: " + "pip install pygad[report] (or pip install matplotlib)." + ) from exc + return matplt + + +def _resolve_sections(sections): + if sections is None: + return list(REPORT_DEFAULT_SECTIONS) + requested = list(sections) + unknown = set(requested) - set(REPORT_DEFAULT_SECTIONS) + if unknown: + raise ValueError( + f"Unknown report sections: {sorted(unknown)}. Allowed: " + f"{list(REPORT_DEFAULT_SECTIONS)}.") + return requested + + +def _resolve_page_size(page_size, reportlab_modules): + name = page_size.lower() + if name == "letter": + return reportlab_modules["pagesizes"].LETTER + if name == "a4": + return reportlab_modules["pagesizes"].A4 + raise ValueError( + f"Unknown page_size {page_size!r}. Allowed values: 'letter', 'A4'.") + + +def _is_multi_objective(ga): + """Return True when the last fitness row is iterable (MOO).""" + if getattr(ga, "last_generation_fitness", None) is None: + return False + first = ga.last_generation_fitness[0] + return hasattr(first, "__len__") + + +def _num_objectives(ga): + """Return the number of objectives, or 1 for single-objective runs.""" + if not _is_multi_objective(ga): + return 1 + return len(ga.last_generation_fitness[0]) + + +def _build_title_section(ga, title, styles, modules): + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + inch = modules["inch"] + title_text = title or "PyGAD run report" + import pygad as _pygad_module + subtitle = f"PyGAD version: {_pygad_module.__version__}" + return [ + Paragraph(title_text, styles["Title"]), + Spacer(1, 0.15 * inch), + Paragraph(subtitle, styles["Normal"]), + Spacer(1, 0.25 * inch), + ] + + +def _build_configuration_section(ga, styles, modules): + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + Table = modules["Table"] + TableStyle = modules["TableStyle"] + colors = modules["colors"] + inch = modules["inch"] + + elements = [Paragraph("Configuration", styles["Heading1"])] + for group_name, parameter_names in CONFIGURATION_GROUPS: + rows = [[Paragraph("Parameter", styles["BodyText"]), + Paragraph("Value", styles["BodyText"])]] + for parameter_name in parameter_names: + if not hasattr(ga, parameter_name): + continue + value = getattr(ga, parameter_name) + rows.append([ + Paragraph(parameter_name, styles["BodyText"]), + Paragraph(_format_value(value), styles["BodyText"]), + ]) + if len(rows) <= 1: + continue + elements.append(Paragraph(group_name, styles["Heading3"])) + table = Table(rows, colWidths=[2.2 * inch, 4.0 * inch]) + table.setStyle(TableStyle([ + ("BACKGROUND", (0, 0), (-1, 0), colors.lightgrey), + ("GRID", (0, 0), (-1, -1), 0.25, colors.grey), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ("LEFTPADDING", (0, 0), (-1, -1), 4), + ("RIGHTPADDING", (0, 0), (-1, -1), 4), + ])) + elements.append(table) + elements.append(Spacer(1, 0.15 * inch)) + elements.append(modules["PageBreak"]()) + return elements + + +def _build_run_summary_section(ga, styles, modules): + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + Table = modules["Table"] + TableStyle = modules["TableStyle"] + colors = modules["colors"] + inch = modules["inch"] + + rows = [[Paragraph("Item", styles["BodyText"]), + Paragraph("Value", styles["BodyText"])]] + rows.append([Paragraph("Problem type", styles["BodyText"]), + Paragraph("Multi-objective" if _is_multi_objective(ga) + else "Single-objective", styles["BodyText"])]) + rows.append([Paragraph("Number of objectives", styles["BodyText"]), + Paragraph(str(_num_objectives(ga)), styles["BodyText"])]) + rows.append([Paragraph("Generations completed", styles["BodyText"]), + Paragraph(str(ga.generations_completed), styles["BodyText"])]) + rows.append([Paragraph("Final population size", styles["BodyText"]), + Paragraph(str(ga.sol_per_pop), styles["BodyText"])]) + rows.append([Paragraph("Best solution generation", styles["BodyText"]), + Paragraph(str(ga.best_solution_generation), + styles["BodyText"])]) + if not _is_multi_objective(ga): + rows.append([Paragraph("Best fitness", styles["BodyText"]), + Paragraph(_format_value(ga.best_solutions_fitness[-1] + if ga.best_solutions_fitness else "n/a"), + styles["BodyText"])]) + + table = Table(rows, colWidths=[2.2 * inch, 4.0 * inch]) + table.setStyle(TableStyle([ + ("BACKGROUND", (0, 0), (-1, 0), colors.lightgrey), + ("GRID", (0, 0), (-1, -1), 0.25, colors.grey), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ])) + return [ + Paragraph("Run summary", styles["Heading1"]), + table, + Spacer(1, 0.2 * inch), + ] + + +def _build_best_solution_section(ga, styles, modules): + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + inch = modules["inch"] + try: + best_solution, best_fitness, best_idx = ga.best_solution() + except Exception as exc: + return [ + Paragraph("Best solution", styles["Heading1"]), + Paragraph(f"Could not compute best_solution(): {exc}", + styles["BodyText"]), + Spacer(1, 0.2 * inch), + ] + elements = [Paragraph("Best solution", styles["Heading1"])] + elements.append(Paragraph(f"Population index: {best_idx}", + styles["BodyText"])) + elements.append(Paragraph(f"Fitness: {_format_value(best_fitness)}", + styles["BodyText"])) + elements.append(Paragraph(f"Solution: {_format_value(list(best_solution))}", + styles["BodyText"])) + elements.append(Spacer(1, 0.2 * inch)) + return elements + + +def _build_plots_section(ga, + include_plots, + figure_size_inches, + styles, + modules, + matplt): + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + Image = modules["Image"] + PageBreak = modules["PageBreak"] + inch = modules["inch"] + + plot_method_names = _select_plot_methods(ga, include_plots) + elements = [Paragraph("Plots", styles["Heading1"])] + if not plot_method_names: + elements.append(Paragraph( + "No plots were applicable for this run. Set save_solutions=True " + "for over-generation plots and use a multi-objective fitness " + "function for Pareto-related plots.", + styles["BodyText"])) + return elements + + for entry in REPORT_PLOTS: + method_name = entry["method"] + if method_name not in plot_method_names: + continue + elements.append(Paragraph(entry["name"], styles["Heading2"])) + figure_data = _render_plot_to_png(ga, entry, figure_size_inches, matplt) + if figure_data is None: + elements.append(Paragraph( + f"Plot {method_name} could not be drawn for this run.", + styles["BodyText"])) + continue + image_width_inches, image_height_inches = figure_size_inches + image = Image(io.BytesIO(figure_data), + width=image_width_inches * inch, + height=image_height_inches * inch) + elements.append(image) + elements.append(Spacer(1, 0.15 * inch)) + elements.append(PageBreak()) + return elements + + +def _build_notes_section(notes, styles, modules): + if not notes: + return [] + Paragraph = modules["Paragraph"] + Spacer = modules["Spacer"] + inch = modules["inch"] + return [ + Paragraph("Notes", styles["Heading1"]), + Paragraph(str(notes), styles["BodyText"]), + Spacer(1, 0.2 * inch), + ] + + +def _select_plot_methods(ga, include_plots): + """ + Return the set of plot method names that the report will include. + When the caller passes ``None`` or ``"all"``, auto-pick every plot + whose preconditions are satisfied by the current GA state. + """ + if include_plots is None or include_plots == "all": + requested = None + else: + requested = list(include_plots) + valid_method_names = {entry["method"] for entry in REPORT_PLOTS} + unknown = set(requested) - valid_method_names + if unknown: + raise ValueError( + f"Unknown plot method(s) in include_plots: {sorted(unknown)}. " + f"Allowed values: {sorted(valid_method_names)}.") + + is_moo = _is_multi_objective(ga) + num_objectives = _num_objectives(ga) + selected = [] + for entry in REPORT_PLOTS: + if requested is not None and entry["method"] not in requested: + continue + if entry["requires_moo"] and not is_moo: + continue + if not all(getattr(ga, name, False) for name in entry["requires"]): + continue + max_objectives = entry.get("max_objectives") + if max_objectives is not None and num_objectives > max_objectives: + continue + selected.append(entry["method"]) + return selected + + +def _render_plot_to_png(ga, plot_entry, figure_size_inches, matplt): + """ + Call the requested plot method on the GA, capture the matplotlib + figure, save it as PNG bytes, and close it so the figure stack does + not grow unbounded. Returns ``None`` when the plot method raises. + """ + method = getattr(ga, plot_entry["method"]) + kwargs = dict(plot_entry["kwargs"]) + try: + figure = method(**kwargs) + except Exception: + return None + if figure is None: + return None + figure.set_size_inches(*figure_size_inches) + buffer = io.BytesIO() + try: + figure.tight_layout() + except Exception: + # tight_layout fails on some figure layouts (e.g. those with a + # nested gridspec); ignore and keep the original layout. + pass + figure.savefig(buffer, format="png", dpi=150, bbox_inches="tight") + matplt.close(figure) + return buffer.getvalue() + + +def _format_value(value): + """Compact, human-readable rendering for the configuration table.""" + if callable(value) and hasattr(value, "__name__"): + return f"" + if isinstance(value, (list, tuple)) and len(value) > 8: + head = ", ".join(_format_value(v) for v in value[:6]) + return f"[{head}, ... (+{len(value) - 6} more)]" + if isinstance(value, float): + return f"{value:g}" + return str(value) diff --git a/pygad/visualize/plot.py b/pygad/visualize/plot.py index 3f604b1..345b467 100644 --- a/pygad/visualize/plot.py +++ b/pygad/visualize/plot.py @@ -61,8 +61,8 @@ def plot_fitness(self, plot_type : str One of ``"plot"``, ``"scatter"``, or ``"bar"``. color : str or iterable - Curve colour. Pass an iterable in multi-objective mode to - colour each objective independently. + Curve color. Pass an iterable in multi-objective mode to + color each objective independently. label : iterable or None Per-objective legend label for multi-objective problems. Ignored for single-objective problems. @@ -196,7 +196,7 @@ def plot_new_solution_rate(self, plot_type : str One of ``"plot"``, ``"scatter"``, or ``"bar"``. color : str - Curve colour. + Curve color. save_dir : str or None If set, the figure is saved to this path before being shown. @@ -299,9 +299,9 @@ def plot_genes(self, graph_type : str One of ``"plot"``, ``"boxplot"``, or ``"histogram"``. fill_color : str - Fill colour for the graph (curves, bars or boxes). + Fill color for the graph (curves, bars or boxes). color : str - Outline / accent colour, mainly used by the boxplot view + Outline / accent color, mainly used by the boxplot view for the whiskers, caps and medians. solutions : str ``"all"`` to plot every saved solution; ``"best"`` to plot @@ -645,8 +645,8 @@ def _num_objectives_or_raise(self, method_name): first_best = self.best_solutions_fitness[0] if type(first_best) in [list, tuple, numpy.ndarray] and len(first_best) > 1: return len(first_best) - self.logger.error(f"The {method_name} method only works with multi-objective optimisation problems.") - raise RuntimeError(f"The {method_name} method only works with multi-objective optimisation problems.") + self.logger.error(f"The {method_name} method only works with multi-objective optimization problems.") + raise RuntimeError(f"The {method_name} method only works with multi-objective optimization problems.") def _last_generation_pareto_front(self): """ @@ -712,7 +712,7 @@ def plot_pareto_front_pcp(self, Every objective gets a vertical axis. Each non-dominated solution becomes a polyline that crosses all axes. Values are - normalised per objective so axes with very different ranges + normalized per objective so axes with very different ranges stay comparable. Works for any M >= 2. @@ -723,7 +723,7 @@ def plot_pareto_front_pcp(self, linewidth : numeric font_size : numeric color : str - Polyline colour. + Polyline color. alpha : float grid : bool save_dir : str or None @@ -747,12 +747,12 @@ def plot_pareto_front_pcp(self, min_per_obj = front.min(axis=0) max_per_obj = front.max(axis=0) spread = numpy.where(max_per_obj > min_per_obj, max_per_obj - min_per_obj, 1.0) - normalised = (front - min_per_obj) / spread + normalized = (front - min_per_obj) / spread matplt = get_matplotlib() fig, ax = matplt.subplots() x_axis = numpy.arange(num_objectives) - for row in normalised: + for row in normalized: ax.plot(x_axis, row, color=color, alpha=alpha, linewidth=linewidth) ax.set_xticks(x_axis) ax.set_xticklabels([f"f{i + 1}" for i in range(num_objectives)], fontsize=font_size) @@ -842,7 +842,7 @@ def plot_pareto_front_heatmap(self, save_dir=None): """ Heatmap of the final non-dominated set. Rows are solutions, - columns are objectives, colour is the (raw) objective value. + columns are objectives, color is the (raw) objective value. Parameters ---------- diff --git a/pyproject.toml b/pyproject.toml index 059b331..aeead8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,7 @@ dependencies = [ [project.optional-dependencies] deep_learning = ["keras", "tensorflow", "torch"] visualize = ["matplotlib"] +report = ["matplotlib", "reportlab"] # PyTest Configuration. Later, PyTest will support the [tool.pytest] table. [tool.pytest.ini_options] diff --git a/tests/test_nsga3.py b/tests/test_nsga3.py index 58d8b62..0c502d1 100644 --- a/tests/test_nsga3.py +++ b/tests/test_nsga3.py @@ -13,8 +13,8 @@ def nsga3(): return NSGA3() -# Six solutions in PyGAD maximisation form. The same numbers under the -# usual minimisation convention would be (1, 6), (2, 4.5), (3, 3), (4.5, 2), +# Six solutions in PyGAD maximization form. The same numbers under the +# usual minimization convention would be (1, 6), (2, 4.5), (3, 3), (4.5, 2), # (6, 1), (4, 4). Solutions s1 and s5 are the two axis extremes; s6 is a # dominated interior point. The expected NSGA-III values below were # derived by hand from this fitness pool. @@ -29,27 +29,27 @@ def nsga3(): def test_generate_reference_points_count_matches_binomial_for_M2_p3(nsga3): - points = nsga3.generate_reference_points(num_objectives=2, num_divisions=3) + points = nsga3.nsga3_generate_reference_points(num_objectives=2, num_divisions=3) assert points.shape == (math.comb(2 + 3 - 1, 3), 2) def test_generate_reference_points_count_matches_binomial_for_M3_p4(nsga3): - points = nsga3.generate_reference_points(num_objectives=3, num_divisions=4) + points = nsga3.nsga3_generate_reference_points(num_objectives=3, num_divisions=4) assert points.shape == (math.comb(3 + 4 - 1, 4), 3) def test_generate_reference_points_count_matches_binomial_for_M5_p4(nsga3): - points = nsga3.generate_reference_points(num_objectives=5, num_divisions=4) + points = nsga3.nsga3_generate_reference_points(num_objectives=5, num_divisions=4) assert points.shape == (math.comb(5 + 4 - 1, 4), 5) def test_generate_reference_points_rows_sum_to_one(nsga3): - points = nsga3.generate_reference_points(num_objectives=3, num_divisions=4) + points = nsga3.nsga3_generate_reference_points(num_objectives=3, num_divisions=4) numpy.testing.assert_allclose(points.sum(axis=1), 1.0, atol=1e-12) def test_generate_reference_points_M2_p3_matches_expected_set(nsga3): - points = nsga3.generate_reference_points(num_objectives=2, num_divisions=3) + points = nsga3.nsga3_generate_reference_points(num_objectives=2, num_divisions=3) expected = numpy.array([ [3 / 3, 0 / 3], [2 / 3, 1 / 3], @@ -67,35 +67,35 @@ def test_compute_ideal_point_takes_column_max(nsga3): [3.0, 2.0], [0.0, 4.0], ]) - ideal = nsga3.compute_ideal_point(fitness) + ideal = nsga3.nsga3_compute_ideal_point(fitness) numpy.testing.assert_allclose(ideal, [3.0, 5.0]) def test_compute_ideal_point_on_negated_six_solution_set(nsga3): - ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) + ideal = nsga3.nsga3_compute_ideal_point(GUIDE_FITNESS_NEGATED) numpy.testing.assert_allclose(ideal, [-1.0, -1.0]) def test_find_extreme_points_picks_s5_for_f1_axis(nsga3): - ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) - extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + ideal = nsga3.nsga3_compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.nsga3_find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) numpy.testing.assert_allclose(extremes[0], [-6.0, -1.0]) def test_find_extreme_points_picks_s1_for_f2_axis(nsga3): - ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) - extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + ideal = nsga3.nsga3_compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.nsga3_find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) numpy.testing.assert_allclose(extremes[1], [-1.0, -6.0]) def test_compute_intercepts_six_solution_set_returns_minus_six(nsga3): # Intercept point sits at ideal + 1/b, where b solves # (extremes - ideal) @ b = 1. For this dataset both axes give -6. - # The extreme rows then normalise to the simplex corners (1, 0) and + # The extreme rows then normalize to the simplex corners (1, 0) and # (0, 1). - ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) - extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) + ideal = nsga3.nsga3_compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.nsga3_find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) numpy.testing.assert_allclose(intercepts, [-6.0, -6.0], atol=1e-9) @@ -109,20 +109,20 @@ def test_compute_intercepts_falls_back_to_nadir_on_singular_extremes(nsga3): [-3.0, -2.0], [-1.5, -4.0], ]) - intercepts = nsga3.compute_intercepts(duplicate_extremes, ideal, pool) + intercepts = nsga3.nsga3_compute_intercepts(duplicate_extremes, ideal, pool) numpy.testing.assert_allclose(intercepts, pool.min(axis=0)) -def test_normalise_fitness_places_extremes_at_simplex_corners(nsga3): +def test_normalize_fitness_places_extremes_at_simplex_corners(nsga3): # With intercepts = (-6, -6) and ideal = (-1, -1) the denominator # (intercepts - ideal) is (-5, -5) and the formula # (f - ideal) / (intercepts - ideal) maps each row to a point inside # the unit simplex. The two axis extremes (s5 and s1) land exactly on # the simplex corners. - ideal = nsga3.compute_ideal_point(GUIDE_FITNESS_NEGATED) - extremes = nsga3.find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) - normalised = nsga3.normalise_fitness(GUIDE_FITNESS_NEGATED, ideal, intercepts) + ideal = nsga3.nsga3_compute_ideal_point(GUIDE_FITNESS_NEGATED) + extremes = nsga3.nsga3_find_extreme_points(GUIDE_FITNESS_NEGATED, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, GUIDE_FITNESS_NEGATED) + normalized = nsga3.nsga3_normalize_fitness(GUIDE_FITNESS_NEGATED, ideal, intercepts) expected = numpy.array([ [0.0, 1.0], # s1 -> simplex corner on f2 [0.2, 0.7], # s2 @@ -131,11 +131,11 @@ def test_normalise_fitness_places_extremes_at_simplex_corners(nsga3): [1.0, 0.0], # s5 -> simplex corner on f1 [0.6, 0.6], # s6 (dominated) ]) - numpy.testing.assert_allclose(normalised, expected, atol=1e-9) + numpy.testing.assert_allclose(normalized, expected, atol=1e-9) -def test_normalise_fitness_clips_above_one_and_below_zero(nsga3): - # First row sits "above" the ideal under maximisation (raw values +def test_normalize_fitness_clips_above_one_and_below_zero(nsga3): + # First row sits "above" the ideal under maximization (raw values # bigger than the ideal) so the formula would produce a negative # ratio. Second row sits below the intercept and would produce a # ratio above 1. Both must be clipped back to [0, 1]. @@ -145,12 +145,12 @@ def test_normalise_fitness_clips_above_one_and_below_zero(nsga3): [0.5, 0.5], [-2.0, -2.0], ]) - normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) - assert normalised.min() >= 0.0 - assert normalised.max() <= 1.0 + normalized = nsga3.nsga3_normalize_fitness(fitness, ideal, intercepts) + assert normalized.min() >= 0.0 + assert normalized.max() <= 1.0 -def test_normalise_fitness_handles_near_zero_negative_denominator(nsga3): +def test_normalize_fitness_handles_near_zero_negative_denominator(nsga3): # Intercept sits within 1e-12 of the ideal so the denominator # collapses to a tiny negative. The safeguard must keep the sign # negative so (fitness - ideal) / denom comes out positive (and @@ -159,13 +159,13 @@ def test_normalise_fitness_handles_near_zero_negative_denominator(nsga3): ideal = numpy.array([0.0]) intercepts = numpy.array([-1e-15]) fitness = numpy.array([[-1.0]]) - normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) - assert numpy.all(numpy.isfinite(normalised)) - assert normalised[0, 0] == pytest.approx(1.0) + normalized = nsga3.nsga3_normalize_fitness(fitness, ideal, intercepts) + assert numpy.all(numpy.isfinite(normalized)) + assert normalized[0, 0] == pytest.approx(1.0) -# Reference points for M=2, p=3 in the order generate_reference_points -# emits them (stars-and-bars enumeration). +# Reference points for M=2, p=3 in the order +# nsga3_generate_reference_points emits them (stars-and-bars enumeration). REFERENCE_POINTS_M2_P3 = numpy.array([ [1.0, 0.0 ], # ref 0 [2 / 3, 1 / 3], # ref 1 @@ -178,7 +178,7 @@ def test_associate_picks_nearest_reference_line(nsga3): # The point (0, 1) lies on the f2 axis and is collinear with ref 3. # Perpendicular distance is zero. point = numpy.array([[0.0, 1.0]]) - nearest, distance = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + nearest, distance = nsga3.nsga3_associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) assert nearest[0] == 3 assert distance[0] == pytest.approx(0.0, abs=1e-12) @@ -187,7 +187,7 @@ def test_associate_breaks_ties_by_lower_reference_index(nsga3): # The point (0.6, 0.6) sits on the diagonal and is the same distance # from ref 1 and ref 2. The lower index wins. point = numpy.array([[0.6, 0.6]]) - nearest, _ = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + nearest, _ = nsga3.nsga3_associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) assert nearest[0] == 1 @@ -195,77 +195,80 @@ def test_associate_perpendicular_distance_for_diagonal_point(nsga3): # Same diagonal point. Expected distance ~ 0.2683 computed by hand # from the formula || x - (x . z_hat) z_hat ||. point = numpy.array([[0.6, 0.6]]) - _, distance = nsga3.associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) + _, distance = nsga3.nsga3_associate_to_reference_points(point, REFERENCE_POINTS_M2_P3) assert distance[0] == pytest.approx(0.2683, abs=1e-3) -def test_niching_with_single_fl_candidate_returns_that_candidate(nsga3): - # Only one candidate is available in Fl, so it must be selected. - fl_indices = [42] - fl_assoc = numpy.array([1]) - fl_dist = numpy.array([0.224]) - accepted_assoc = numpy.array([3, 2, 1, 1, 0]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) +def test_niching_with_single_critical_front_candidate_returns_that_candidate(nsga3): + critical_front_indices = [42] + critical_front_associations = numpy.array([1]) + critical_front_distances = numpy.array([0.224]) + accepted_associations = numpy.array([3, 2, 1, 1, 0]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked == [42] -def test_niching_picks_candidate_in_lower_rho_niche(nsga3): - # Two Fl candidates. The first is associated with ref 1 where rho=2; - # the second is associated with ref 2 where rho=1. Niching prefers - # the lower rho, so the second candidate wins. - fl_indices = [60, 70] - fl_assoc = numpy.array([1, 2]) - fl_dist = numpy.array([0.224, 0.10]) - accepted_assoc = numpy.array([3, 2, 1, 1, 0]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) +def test_niching_picks_candidate_in_lower_niche_count(nsga3): + # Two candidates. The first is associated with ref 1 (niche count 2); + # the second with ref 2 (niche count 1). The lower niche count wins. + critical_front_indices = [60, 70] + critical_front_associations = numpy.array([1, 2]) + critical_front_distances = numpy.array([0.224, 0.10]) + accepted_associations = numpy.array([3, 2, 1, 1, 0]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked == [70] -def test_niching_picks_smallest_distance_when_rho_is_zero(nsga3): - # Both candidates are at ref 1 and rho_1 = 0 (empty niche). The +def test_niching_picks_smallest_distance_when_niche_count_is_zero(nsga3): + # Both candidates are at ref 1 with niche count 0 (empty niche). The # closer candidate wins (distance 0.158 < 0.224). - fl_indices = [60, 70] - fl_assoc = numpy.array([1, 1]) - fl_dist = numpy.array([0.224, 0.158]) - accepted_assoc = numpy.array([3, 2, 0]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) + critical_front_indices = [60, 70] + critical_front_associations = numpy.array([1, 1]) + critical_front_distances = numpy.array([0.224, 0.158]) + accepted_associations = numpy.array([3, 2, 0]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked == [70] -def test_niching_picks_from_candidate_pool_when_rho_is_positive(nsga3): - # Both candidates are at ref 1 and rho_1 > 0, so the pick is random. - # Run 50 different seeds and verify that the chosen candidate always - # comes from {60, 70} and that both candidates show up over the run. - fl_indices = [60, 70] - fl_assoc = numpy.array([1, 1]) - fl_dist = numpy.array([0.224, 0.158]) - accepted_assoc = numpy.array([3, 2, 1, 1, 0]) +def test_niching_picks_from_candidate_pool_when_niche_count_is_positive(nsga3): + # Both candidates are at ref 1 with niche count > 0, so the pick is + # random. Run 50 different seeds and verify that the chosen candidate + # always comes from {60, 70} and that both candidates show up over + # the run. + critical_front_indices = [60, 70] + critical_front_associations = numpy.array([1, 1]) + critical_front_distances = numpy.array([0.224, 0.158]) + accepted_associations = numpy.array([3, 2, 1, 1, 0]) seen = set() rng_state = numpy.random.get_state() try: for seed in range(50): numpy.random.seed(seed) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked[0] in {60, 70} seen.add(picked[0]) finally: diff --git a/tests/test_nsga3_dtlz2.py b/tests/test_nsga3_dtlz2.py index 98b4e1c..e1c6bd0 100644 --- a/tests/test_nsga3_dtlz2.py +++ b/tests/test_nsga3_dtlz2.py @@ -3,8 +3,8 @@ DTLZ2 is a multi-objective test problem whose Pareto-optimal solutions lie on the unit sphere in the first orthant of objective space. The -problem is naturally a minimisation; this test file negates each -objective so it fits PyGAD's maximisation convention. +problem is naturally a minimization; this test file negates each +objective so it fits PyGAD's maximization convention. The Deb & Jain 2014 paper checks convergence by asking whether every final solution is non-dominated and whether at least 12 of the 15 @@ -46,7 +46,7 @@ def _dtlz2_max_fitness(ga, solution, sol_idx): """ Standard DTLZ2 objective function, negated so larger values mean - better fitness under PyGAD's maximisation convention. Decision + better fitness under PyGAD's maximization convention. Decision variables are clipped to [0, 1] before being used so mutations that push genes out of range do not produce non-finite outputs. """ @@ -112,14 +112,14 @@ def _evaluate_final_fitness(ga): dtype=float) -def _normalised_distances_per_reference(ga, fitness): +def _normalized_distances_per_reference(ga, fitness): nsga3 = NSGA3() - ideal_point = nsga3.compute_ideal_point(fitness) - extreme_points = nsga3.find_extreme_points(fitness, ideal_point) - intercepts = nsga3.compute_intercepts(extreme_points, ideal_point, fitness) - normalised = nsga3.normalise_fitness(fitness, ideal_point, intercepts) - assignments, distances = nsga3.associate_to_reference_points( - normalised, ga.nsga3_reference_points) + ideal_point = nsga3.nsga3_compute_ideal_point(fitness) + extreme_points = nsga3.nsga3_find_extreme_points(fitness, ideal_point) + intercepts = nsga3.nsga3_compute_intercepts(extreme_points, ideal_point, fitness) + normalized = nsga3.nsga3_normalize_fitness(fitness, ideal_point, intercepts) + assignments, distances = nsga3.nsga3_associate_to_reference_points( + normalized, ga.nsga3_reference_points) nearest_per_reference = numpy.full(len(ga.nsga3_reference_points), numpy.inf) for solution_index, reference_index in enumerate(assignments): if distances[solution_index] < nearest_per_reference[reference_index]: @@ -168,7 +168,7 @@ def test_dtlz2_reference_directions_have_neighbours(): ga = _make_dtlz2_ga() ga.run() final_fitness = _evaluate_final_fitness(ga) - nearest_per_reference = _normalised_distances_per_reference(ga, final_fitness) + nearest_per_reference = _normalized_distances_per_reference(ga, final_fitness) covered_count = int(numpy.sum(nearest_per_reference <= COVERAGE_THRESHOLD)) assert covered_count >= MIN_REFERENCE_POINTS_COVERED, ( f"Only {covered_count} of {len(ga.nsga3_reference_points)} reference " diff --git a/tests/test_nsga3_pipeline.py b/tests/test_nsga3_pipeline.py index b0a6bc3..bb7b950 100644 --- a/tests/test_nsga3_pipeline.py +++ b/tests/test_nsga3_pipeline.py @@ -2,18 +2,16 @@ Pipeline-level tests for NSGA-III using hand-built ground-truth values. Every test in this file pins the output of one NSGA-III step (reference -point generation, ideal point, extreme points, intercepts, normalised +point generation, ideal point, extreme points, intercepts, normalized fitness, association, niching, or the full pipeline) to a hardcoded value derived from a small dataset whose answer can be checked on paper. The main dataset is THREE_OBJECTIVE_FITNESS: seven solutions in M=3 space whose hand-derived ideal point, extreme points, intercepts, and -normalised positions are all simple round numbers. This makes the +normalized positions are all simple round numbers. This makes the expected outputs easy to verify without re-running the algorithm. """ -import math - import numpy import pytest @@ -21,7 +19,7 @@ # Three-objective dataset used by most tests below. Values are expressed -# in PyGAD's maximisation convention, so all fitness values are <= 0 and +# in PyGAD's maximization convention, so all fitness values are <= 0 and # the ideal point sits at the origin. # # s0..s2 : axis extremes (best on one objective, ideal on the others). @@ -52,13 +50,13 @@ def nsga3(): ]) def test_reference_point_count_matches_binomial(nsga3, num_objectives, num_divisions, expected_count): - points = nsga3.generate_reference_points(num_objectives, num_divisions) + points = nsga3.nsga3_generate_reference_points(num_objectives, num_divisions) assert points.shape == (expected_count, num_objectives) numpy.testing.assert_allclose(points.sum(axis=1), 1.0, atol=1e-12) def test_reference_points_M3_p2_match_expected_set(nsga3): - points = nsga3.generate_reference_points(3, 2) + points = nsga3.nsga3_generate_reference_points(3, 2) expected = numpy.array([ [1.0, 0.0, 0.0], [0.5, 0.5, 0.0], @@ -73,13 +71,13 @@ def test_reference_points_M3_p2_match_expected_set(nsga3): def test_ideal_point_for_three_objective_set(nsga3): - ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) + ideal = nsga3.nsga3_compute_ideal_point(THREE_OBJECTIVE_FITNESS) numpy.testing.assert_allclose(ideal, [0.0, 0.0, 0.0]) def test_extreme_points_for_three_objective_set(nsga3): - ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) - extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + ideal = nsga3.nsga3_compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) expected = numpy.array([ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], @@ -89,9 +87,9 @@ def test_extreme_points_for_three_objective_set(nsga3): def test_intercepts_for_three_objective_set(nsga3): - ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) - extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + ideal = nsga3.nsga3_compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) numpy.testing.assert_allclose(intercepts, [-1.0, -1.0, -1.0], atol=1e-12) @@ -111,7 +109,7 @@ def test_intercepts_cap_at_worst_observed_per_objective(nsga3): [-0.5, -0.001], [-0.1, -0.1], ]) - intercepts = nsga3.compute_intercepts(extremes, ideal, pool) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, pool) numpy.testing.assert_allclose(intercepts, pool.min(axis=0), atol=1e-12) @@ -127,15 +125,15 @@ def test_intercepts_fall_back_when_extremes_singular(nsga3): [-1.0, -1.0], [-2.0, -0.5], ]) - intercepts = nsga3.compute_intercepts(extremes, ideal, pool) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, pool) numpy.testing.assert_allclose(intercepts, pool.min(axis=0)) -def test_normalised_fitness_for_three_objective_set(nsga3): - ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) - extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) - normalised = nsga3.normalise_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) +def test_normalized_fitness_for_three_objective_set(nsga3): + ideal = nsga3.nsga3_compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + normalized = nsga3.nsga3_normalize_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) expected = numpy.array([ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], @@ -145,12 +143,12 @@ def test_normalised_fitness_for_three_objective_set(nsga3): [0.0, 0.5, 0.5], [1 / 3, 1 / 3, 1 / 3], ]) - numpy.testing.assert_allclose(normalised, expected, atol=1e-12) + numpy.testing.assert_allclose(normalized, expected, atol=1e-12) def test_associations_for_three_objective_set(nsga3): - # Reference points produced by generate_reference_points(3, 2), in the - # order our enumeration emits them: + # Reference points produced by nsga3_generate_reference_points(3, 2), + # in the order our enumeration emits them: # ref[0] = (0, 0, 1 ) # ref[1] = (0, 0.5, 0.5) # ref[2] = (0, 1, 0 ) @@ -160,12 +158,12 @@ def test_associations_for_three_objective_set(nsga3): # Each on-simplex solution sits on one reference line and has zero # distance. The centre solution is the same distance from ref[1], ref[3] # and ref[4]; the lower-index tie break picks ref[1]. - nsga3_ref_points = nsga3.generate_reference_points(3, 2) - ideal = nsga3.compute_ideal_point(THREE_OBJECTIVE_FITNESS) - extremes = nsga3.find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) - normalised = nsga3.normalise_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) - nearest, distance = nsga3.associate_to_reference_points(normalised, nsga3_ref_points) + nsga3_ref_points = nsga3.nsga3_generate_reference_points(3, 2) + ideal = nsga3.nsga3_compute_ideal_point(THREE_OBJECTIVE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(THREE_OBJECTIVE_FITNESS, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, THREE_OBJECTIVE_FITNESS) + normalized = nsga3.nsga3_normalize_fitness(THREE_OBJECTIVE_FITNESS, ideal, intercepts) + nearest, distance = nsga3.nsga3_associate_to_reference_points(normalized, nsga3_ref_points) expected_nearest = numpy.array([5, 2, 0, 4, 3, 1, 1]) expected_distance = numpy.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1 / 3]) numpy.testing.assert_array_equal(nearest, expected_nearest) @@ -173,51 +171,54 @@ def test_associations_for_three_objective_set(nsga3): def test_niching_picks_one_candidate_per_empty_niche(nsga3): - # Three Fl candidates, each attached to a different empty niche. We - # need three survivors. Every empty niche must take its only - # candidate. - fl_indices = [10, 11, 12] - fl_assoc = numpy.array([0, 1, 2]) - fl_dist = numpy.array([0.01, 0.02, 0.03]) - accepted_assoc = numpy.array([3, 3, 3]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=3) + # Three critical-front candidates, each attached to a different + # empty niche. We need three survivors. Every empty niche must take + # its only candidate. + critical_front_indices = [10, 11, 12] + critical_front_associations = numpy.array([0, 1, 2]) + critical_front_distances = numpy.array([0.01, 0.02, 0.03]) + accepted_associations = numpy.array([3, 3, 3]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=3) assert set(picked) == {10, 11, 12} -def test_niching_picks_closest_candidate_when_rho_is_zero(nsga3): +def test_niching_picks_closest_candidate_when_niche_count_is_zero(nsga3): # Two candidates at the same empty niche. The closer one wins # deterministically. - fl_indices = [20, 21] - fl_assoc = numpy.array([0, 0]) - fl_dist = numpy.array([0.5, 0.1]) - accepted_assoc = numpy.array([1, 2, 3]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) + critical_front_indices = [20, 21] + critical_front_associations = numpy.array([0, 0]) + critical_front_distances = numpy.array([0.5, 0.1]) + accepted_associations = numpy.array([1, 2, 3]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked == [21] -def test_niching_picks_candidate_in_lower_rho_niche_with_unique_owner(nsga3): - # ref 0 has rho=2, ref 1 has rho=3. We want the candidate at ref 0 - # because its niche count is smaller. - fl_indices = [30, 31] - fl_assoc = numpy.array([0, 1]) - fl_dist = numpy.array([0.4, 0.2]) - accepted_assoc = numpy.array([0, 0, 1, 1, 1]) - picked = nsga3.niching_select(fl_indices=fl_indices, - fl_assoc=fl_assoc, - fl_dist=fl_dist, - accepted_assoc=accepted_assoc, - num_reference_points=4, - K=1) +def test_niching_picks_candidate_in_lower_niche_count_with_unique_owner(nsga3): + # ref 0 has niche count 2, ref 1 has niche count 3. We want the + # candidate at ref 0 because its niche count is smaller. + critical_front_indices = [30, 31] + critical_front_associations = numpy.array([0, 1]) + critical_front_distances = numpy.array([0.4, 0.2]) + accepted_associations = numpy.array([0, 0, 1, 1, 1]) + picked = nsga3.nsga3_niching_select( + critical_front_indices=critical_front_indices, + critical_front_associations=critical_front_associations, + critical_front_distances=critical_front_distances, + accepted_associations=accepted_associations, + num_reference_points=4, + num_to_select=1) assert picked == [30] @@ -225,23 +226,23 @@ def test_full_pipeline_recovers_simplex_corners(nsga3): # Run the full pipeline on the THREE_OBJECTIVE_FITNESS dataset and # verify that the six on-simplex solutions cover six different # reference points with zero perpendicular distance. - nsga3_ref_points = nsga3.generate_reference_points(3, 2) + nsga3_ref_points = nsga3.nsga3_generate_reference_points(3, 2) fitness = THREE_OBJECTIVE_FITNESS - ideal = nsga3.compute_ideal_point(fitness) - extremes = nsga3.find_extreme_points(fitness, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, fitness) - normalised = nsga3.normalise_fitness(fitness, ideal, intercepts) - nearest, distance = nsga3.associate_to_reference_points(normalised, nsga3_ref_points) + ideal = nsga3.nsga3_compute_ideal_point(fitness) + extremes = nsga3.nsga3_find_extreme_points(fitness, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, fitness) + normalized = nsga3.nsga3_normalize_fitness(fitness, ideal, intercepts) + nearest, distance = nsga3.nsga3_associate_to_reference_points(normalized, nsga3_ref_points) covered = numpy.unique(nearest[:6]) assert set(covered.tolist()) == {0, 1, 2, 3, 4, 5} assert numpy.all(distance[:6] < 1e-9) -# Three solutions used by the wide-range and narrow-range normalisation +# Three solutions used by the wide-range and narrow-range normalization # tests below. The first row is the f0 extreme, the second is the f1 # extreme, and the third is the middle point of the front. Both versions -# of the dataset must produce the same normalised positions because the -# NSGA-III normalisation is invariant to positive affine transforms of +# of the dataset must produce the same normalized positions because the +# NSGA-III normalization is invariant to positive affine transforms of # the fitness. WIDE_RANGE_FITNESS = numpy.array([ [15.0, -10.0], # s0 — best f0, worst f1 @@ -256,40 +257,40 @@ def test_full_pipeline_recovers_simplex_corners(nsga3): ]) -def test_normalise_fitness_for_wide_range_input(nsga3): +def test_normalize_fitness_for_wide_range_input(nsga3): # Fitness values cross zero and span 25 units per axis. The # algorithm must still map the two extremes onto the simplex corners # and the middle point to (0.6, 0.6). - ideal = nsga3.compute_ideal_point(WIDE_RANGE_FITNESS) - extremes = nsga3.find_extreme_points(WIDE_RANGE_FITNESS, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, WIDE_RANGE_FITNESS) - normalised = nsga3.normalise_fitness(WIDE_RANGE_FITNESS, ideal, intercepts) + ideal = nsga3.nsga3_compute_ideal_point(WIDE_RANGE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(WIDE_RANGE_FITNESS, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, WIDE_RANGE_FITNESS) + normalized = nsga3.nsga3_normalize_fitness(WIDE_RANGE_FITNESS, ideal, intercepts) numpy.testing.assert_allclose(ideal, [15.0, 15.0]) numpy.testing.assert_allclose(intercepts, [-10.0, -10.0]) - expected_normalised = numpy.array([ + expected_normalized = numpy.array([ [0.0, 1.0], [1.0, 0.0], [0.6, 0.6], ]) - numpy.testing.assert_allclose(normalised, expected_normalised, atol=1e-12) + numpy.testing.assert_allclose(normalized, expected_normalized, atol=1e-12) -def test_normalise_fitness_for_narrow_range_input(nsga3): +def test_normalize_fitness_for_narrow_range_input(nsga3): # Fitness values are all inside [0.3, 0.7] (a 0.4-wide window). - # Normalisation must still pin the two extremes to the simplex + # Normalization must still pin the two extremes to the simplex # corners and place the middle point at (0.5, 0.5). - ideal = nsga3.compute_ideal_point(NARROW_RANGE_FITNESS) - extremes = nsga3.find_extreme_points(NARROW_RANGE_FITNESS, ideal) - intercepts = nsga3.compute_intercepts(extremes, ideal, NARROW_RANGE_FITNESS) - normalised = nsga3.normalise_fitness(NARROW_RANGE_FITNESS, ideal, intercepts) + ideal = nsga3.nsga3_compute_ideal_point(NARROW_RANGE_FITNESS) + extremes = nsga3.nsga3_find_extreme_points(NARROW_RANGE_FITNESS, ideal) + intercepts = nsga3.nsga3_compute_intercepts(extremes, ideal, NARROW_RANGE_FITNESS) + normalized = nsga3.nsga3_normalize_fitness(NARROW_RANGE_FITNESS, ideal, intercepts) numpy.testing.assert_allclose(ideal, [0.7, 0.7]) numpy.testing.assert_allclose(intercepts, [0.3, 0.3]) - expected_normalised = numpy.array([ + expected_normalized = numpy.array([ [0.0, 1.0], [1.0, 0.0], [0.5, 0.5], ]) - numpy.testing.assert_allclose(normalised, expected_normalised, atol=1e-12) + numpy.testing.assert_allclose(normalized, expected_normalized, atol=1e-12) @pytest.mark.parametrize("scale,shift", [ @@ -300,25 +301,25 @@ def test_normalise_fitness_for_narrow_range_input(nsga3): (1.0, -100.0), # pure shift down (5.0, -12.5), # mixed ]) -def test_normalise_fitness_is_invariant_under_positive_affine_transforms(nsga3, scale, shift): - # NSGA-III normalisation should not care about the absolute scale or +def test_normalize_fitness_is_invariant_under_positive_affine_transforms(nsga3, scale, shift): + # NSGA-III normalization should not care about the absolute scale or # offset of fitness as long as the transform is a positive affine # one. Verify by transforming the base dataset and checking that the - # normalised positions match the untransformed reference. + # normalized positions match the untransformed reference. base = NARROW_RANGE_FITNESS transformed = scale * base + shift - base_ideal = nsga3.compute_ideal_point(base) - base_extremes = nsga3.find_extreme_points(base, base_ideal) - base_intercepts = nsga3.compute_intercepts(base_extremes, base_ideal, base) - base_normalised = nsga3.normalise_fitness(base, base_ideal, base_intercepts) - - transformed_ideal = nsga3.compute_ideal_point(transformed) - transformed_extremes = nsga3.find_extreme_points(transformed, transformed_ideal) - transformed_intercepts = nsga3.compute_intercepts(transformed_extremes, - transformed_ideal, - transformed) - transformed_normalised = nsga3.normalise_fitness(transformed, - transformed_ideal, - transformed_intercepts) - numpy.testing.assert_allclose(transformed_normalised, base_normalised, atol=1e-9) + base_ideal = nsga3.nsga3_compute_ideal_point(base) + base_extremes = nsga3.nsga3_find_extreme_points(base, base_ideal) + base_intercepts = nsga3.nsga3_compute_intercepts(base_extremes, base_ideal, base) + base_normalized = nsga3.nsga3_normalize_fitness(base, base_ideal, base_intercepts) + + transformed_ideal = nsga3.nsga3_compute_ideal_point(transformed) + transformed_extremes = nsga3.nsga3_find_extreme_points(transformed, transformed_ideal) + transformed_intercepts = nsga3.nsga3_compute_intercepts(transformed_extremes, + transformed_ideal, + transformed) + transformed_normalized = nsga3.nsga3_normalize_fitness(transformed, + transformed_ideal, + transformed_intercepts) + numpy.testing.assert_allclose(transformed_normalized, base_normalized, atol=1e-9) diff --git a/tests/test_nsga3_population_growth.py b/tests/test_nsga3_population_growth.py new file mode 100644 index 0000000..91b8a47 --- /dev/null +++ b/tests/test_nsga3_population_growth.py @@ -0,0 +1,198 @@ +""" +Tests for the NSGA-III auto-growth path in the engine. + +When ``sol_per_pop`` is smaller than the number of NSGA-III reference +points, the engine grows the population to match before the +generational loop starts. The grown rows must follow every rule that +applies to the initial population: per-gene init range, +``gene_space``, ``gene_type`` (single or nested), +``allow_duplicate_genes``, and ``gene_constraint``. + +The tests here exercise each rule with a population of size 1 so the +auto-growth path is forced to generate fresh solutions. +""" + +import numpy +import pytest + +import pygad + + +def _two_objective_fitness(ga, solution, sol_idx): + return [float(numpy.sum(solution)), -float(numpy.sum(numpy.asarray(solution) ** 2))] + + +def _three_objective_fitness(ga, solution, sol_idx): + return [float(solution[0]), float(solution[1]), float(solution[2])] + + +def _build_ga_and_grow(**kwargs): + """ + Create a GA with sol_per_pop small enough to trigger NSGA-III auto- + growth and run a single generation so the population is grown and + re-evaluated before the test assertion runs. + """ + defaults = dict( + num_generations=1, + num_parents_mating=3, + fitness_func=_three_objective_fitness, + sol_per_pop=4, + num_genes=4, + parent_selection_type='nsga3', + nsga3_num_divisions=4, + random_seed=7, + suppress_warnings=True, + ) + defaults.update(kwargs) + ga = pygad.GA(**defaults) + ga.run() + return ga + + +def test_population_growth_respects_init_range_low_and_high(): + # With per-gene init range, every gene in every grown row must sit + # inside its own [low, high] window. + init_range_low = [0.0, 1.0, 2.0, 3.0] + init_range_high = [0.5, 1.5, 2.5, 3.5] + ga = _build_ga_and_grow( + num_genes=4, + init_range_low=init_range_low, + init_range_high=init_range_high, + ) + population = numpy.asarray(ga.initial_population, dtype=float) + for gene_idx in range(population.shape[1]): + column = population[:, gene_idx] + assert column.min() >= init_range_low[gene_idx] + assert column.max() <= init_range_high[gene_idx] + + +def test_population_growth_respects_gene_space_discrete_values(): + # Every gene in every row must come from the discrete gene space. + allowed = [10, 20, 30] + ga = _build_ga_and_grow( + num_genes=4, + gene_type=int, + gene_space=allowed, + ) + population = numpy.asarray(ga.initial_population, dtype=int) + assert set(population.flatten().tolist()).issubset(set(allowed)) + + +def test_population_growth_respects_single_gene_type_int(): + # gene_type=int means every gene in the grown rows must be integer. + ga = _build_ga_and_grow( + num_genes=4, + gene_type=int, + ) + population = numpy.asarray(ga.initial_population) + assert population.dtype == int + + +def test_population_growth_respects_nested_gene_types_per_gene(): + # Mixed dtypes per gene (and a precision for the float gene). The + # int gene must round-trip to an int, the float gene must have at + # most 2 decimals. + gene_type = [int, [float, 2], int, [float, 3]] + ga = _build_ga_and_grow( + num_genes=4, + gene_type=gene_type, + ) + population = ga.initial_population + for sol_idx in range(population.shape[0]): + assert isinstance(population[sol_idx, 0], (int, numpy.integer)) + assert isinstance(population[sol_idx, 2], (int, numpy.integer)) + float_gene_one = float(population[sol_idx, 1]) + float_gene_two = float(population[sol_idx, 3]) + assert round(float_gene_one, 2) == float_gene_one + assert round(float_gene_two, 3) == float_gene_two + + +def test_population_growth_respects_allow_duplicate_genes_false(): + # When duplicates are not allowed, no row may contain the same gene + # value twice. + ga = _build_ga_and_grow( + num_genes=4, + gene_type=int, + gene_space=list(range(20)), + allow_duplicate_genes=False, + ) + population = numpy.asarray(ga.initial_population, dtype=int) + for row in population: + assert len(set(row.tolist())) == len(row) + + +def test_population_growth_respects_gene_constraint_callable(): + # Constraint forces gene 0 to be >= 5 and gene 1 to be even. Every + # grown row must satisfy both constraints. + def gene_zero_at_least_five(solution, values): + return [v for v in values if v >= 5] + + def gene_one_must_be_even(solution, values): + return [v for v in values if int(v) % 2 == 0] + + ga = _build_ga_and_grow( + num_genes=4, + gene_type=int, + gene_space=list(range(20)), + gene_constraint=[gene_zero_at_least_five, + gene_one_must_be_even, + None, + None], + ) + population = numpy.asarray(ga.initial_population, dtype=int) + assert (population[:, 0] >= 5).all() + assert (population[:, 1] % 2 == 0).all() + + +def test_generate_single_random_gene_uses_initial_population_range_not_mutation_range(): + # With gene_space=None the helper must sample from + # [init_range_low, init_range_high], not from + # [random_mutation_min_val, random_mutation_max_val]. Set the two + # windows to non-overlapping ranges so any leak from the mutation + # range is detectable. Seed numpy so the helper's draw is + # deterministic. + ga = pygad.GA( + num_generations=1, + num_parents_mating=3, + fitness_func=_two_objective_fitness, + sol_per_pop=4, + num_genes=2, + init_range_low=100.0, + init_range_high=200.0, + random_mutation_min_val=-200.0, + random_mutation_max_val=-100.0, + parent_selection_type='nsga2', + random_seed=11, + suppress_warnings=True, + ) + numpy.random.seed(11) + drawn_values = [ga._nsga3_generate_single_random_gene(gene_idx=0, partial_solution=numpy.empty(2, dtype=object)) + for _ in range(50)] + drawn = numpy.asarray(drawn_values, dtype=float).flatten() + assert drawn.min() >= 100.0 + assert drawn.max() <= 200.0 + + +def test_generate_single_random_gene_uses_gene_space_when_present(): + # With gene_space set the helper must draw from the gene space, not + # from the init range. Use disjoint init range and gene space so a + # leak is detectable. + allowed = [50, 51, 52] + ga = pygad.GA( + num_generations=1, + num_parents_mating=3, + fitness_func=_two_objective_fitness, + sol_per_pop=4, + num_genes=2, + gene_type=int, + gene_space=allowed, + init_range_low=-100, + init_range_high=-50, + parent_selection_type='nsga2', + random_seed=11, + suppress_warnings=True, + ) + numpy.random.seed(13) + drawn_values = [int(ga._nsga3_generate_single_random_gene(gene_idx=0, partial_solution=numpy.empty(2, dtype=object))) + for _ in range(50)] + assert set(drawn_values).issubset(set(allowed)) diff --git a/tests/test_report.py b/tests/test_report.py new file mode 100644 index 0000000..ffe0b05 --- /dev/null +++ b/tests/test_report.py @@ -0,0 +1,164 @@ +""" +Tests for the PDF report generator. + +The full check here is structural: we verify the report writes a +non-empty PDF, picks up the expected plot methods based on the run +configuration, refuses unknown sections, and works for both single- +objective and multi-objective runs. +""" + +import os + +import numpy +import pytest + +import pygad +from pygad.utils import report as report_module + + +pytest.importorskip("reportlab") +pytest.importorskip("matplotlib") + + +def _single_objective_fitness(ga, solution, sol_idx): + return float(numpy.sum(solution)) + + +def _two_objective_fitness(ga, solution, sol_idx): + return [float(numpy.sum(solution)), + -float(numpy.sum(numpy.asarray(solution) ** 2))] + + +def _build_soo_ga(**overrides): + defaults = dict( + num_generations=4, + num_parents_mating=4, + fitness_func=_single_objective_fitness, + sol_per_pop=8, + num_genes=3, + random_seed=0, + suppress_warnings=True, + ) + defaults.update(overrides) + return pygad.GA(**defaults) + + +def _build_moo_ga(**overrides): + defaults = dict( + num_generations=4, + num_parents_mating=4, + fitness_func=_two_objective_fitness, + sol_per_pop=8, + num_genes=3, + parent_selection_type='nsga2', + random_seed=0, + suppress_warnings=True, + ) + defaults.update(overrides) + return pygad.GA(**defaults) + + +def test_generate_report_writes_non_empty_pdf(tmp_path): + ga = _build_soo_ga(save_solutions=True, save_best_solutions=True) + ga.run() + output_path = ga.generate_report(str(tmp_path / "soo_report")) + assert output_path.endswith(".pdf") + assert os.path.exists(output_path) + assert os.path.getsize(output_path) > 1000 # PDF header alone is > 1kB + + +def test_generate_report_appends_pdf_extension(tmp_path): + ga = _build_soo_ga() + ga.run() + output_path = ga.generate_report(str(tmp_path / "no_extension")) + assert output_path == str(tmp_path / "no_extension.pdf") + + +def test_generate_report_refuses_unknown_section(tmp_path): + ga = _build_soo_ga() + ga.run() + with pytest.raises(ValueError, match="Unknown report sections"): + ga.generate_report(str(tmp_path / "bad_section"), + sections=["title", "does_not_exist"]) + + +def test_generate_report_refuses_unknown_plot_name(tmp_path): + ga = _build_soo_ga() + ga.run() + with pytest.raises(ValueError, match="Unknown plot method"): + ga.generate_report(str(tmp_path / "bad_plot"), + include_plots=["plot_nonexistent"]) + + +def test_generate_report_requires_at_least_one_completed_generation(tmp_path): + ga = _build_soo_ga() + with pytest.raises(RuntimeError, match="at least one"): + ga.generate_report(str(tmp_path / "empty")) + + +def test_select_plot_methods_filters_out_moo_only_plots_for_soo(): + ga = _build_soo_ga(save_solutions=True, save_best_solutions=True) + ga.run() + method_names = report_module._select_plot_methods(ga, include_plots=None) + assert "plot_fitness" in method_names + assert "plot_new_solution_rate" in method_names + assert "plot_pareto_front_curve" not in method_names + assert "plot_pareto_front_pcp" not in method_names + assert "plot_non_dominated_hypervolume" not in method_names + + +def test_select_plot_methods_includes_moo_plots_for_moo_with_save_solutions(): + ga = _build_moo_ga(save_solutions=True) + ga.run() + method_names = report_module._select_plot_methods(ga, include_plots=None) + assert "plot_fitness" in method_names + assert "plot_pareto_front_curve" in method_names + assert "plot_pareto_front_pcp" in method_names + assert "plot_pareto_front_heatmap" in method_names + assert "plot_non_dominated_hypervolume" in method_names + assert "plot_pareto_front_evolution" in method_names + + +def test_select_plot_methods_omits_save_solutions_plots_when_flag_is_false(): + ga = _build_moo_ga(save_solutions=False) + ga.run() + method_names = report_module._select_plot_methods(ga, include_plots=None) + assert "plot_fitness" in method_names + # plot_pareto_front_curve does not need save_solutions. + assert "plot_pareto_front_curve" in method_names + # plot_non_dominated_hypervolume does. + assert "plot_non_dominated_hypervolume" not in method_names + assert "plot_pareto_front_evolution" not in method_names + + +def test_generate_report_for_multi_objective_run(tmp_path): + ga = _build_moo_ga(save_solutions=True) + ga.run() + output_path = ga.generate_report(str(tmp_path / "moo_report")) + assert os.path.exists(output_path) + assert os.path.getsize(output_path) > 5000 + + +def test_generate_report_honors_section_order(tmp_path): + ga = _build_soo_ga() + ga.run() + output_path = ga.generate_report( + str(tmp_path / "ordered_report"), + sections=["title", "configuration"]) + assert os.path.exists(output_path) + + +def test_generate_report_supports_explicit_plot_list(tmp_path): + ga = _build_soo_ga() + ga.run() + output_path = ga.generate_report( + str(tmp_path / "fitness_only"), + include_plots=["plot_fitness"]) + assert os.path.exists(output_path) + + +def test_generate_report_unknown_page_size_raises(tmp_path): + ga = _build_soo_ga() + ga.run() + with pytest.raises(ValueError, match="Unknown page_size"): + ga.generate_report(str(tmp_path / "bad_paper"), page_size="A12") From a73974807edec811fa097938c8265bbce2a9190b Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Wed, 27 May 2026 19:32:21 -0400 Subject: [PATCH 13/17] Format --- examples/example_generate_report.py | 40 ++++++++++------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/examples/example_generate_report.py b/examples/example_generate_report.py index aa5c675..6d43489 100644 --- a/examples/example_generate_report.py +++ b/examples/example_generate_report.py @@ -6,35 +6,23 @@ """ import numpy - import pygad - def fitness_func(ga_instance, solution, solution_idx): return [float(numpy.sum(solution)), -float(numpy.sum(numpy.asarray(solution) ** 2))] - -def main(): - ga_instance = pygad.GA( - num_generations=30, - num_parents_mating=8, - fitness_func=fitness_func, - sol_per_pop=20, - num_genes=4, - parent_selection_type="nsga2", - save_solutions=True, - random_seed=42, - suppress_warnings=True, - ) - ga_instance.run() - output_path = ga_instance.generate_report( - filename="pygad_report", - title="PyGAD multi-objective demo", - notes="A short two-objective example with 30 generations.", - ) - print(f"Report written to: {output_path}") - - -if __name__ == "__main__": - main() +ga_instance = pygad.GA(num_generations=30, + num_parents_mating=8, + fitness_func=fitness_func, + sol_per_pop=20, + num_genes=4, + parent_selection_type="nsga2", + save_solutions=True, + random_seed=42, + suppress_warnings=True,) +ga_instance.run() +output_path = ga_instance.generate_report(filename="pygad_report", + title="PyGAD multi-objective demo", + notes="A short two-objective example with 30 generations.",) +print(f"Report written to: {output_path}") From 0e45d9dacf54c99380502a8e81dd8fdd98a959f9 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Sun, 31 May 2026 23:12:32 -0400 Subject: [PATCH 14/17] Warning when both keep_parents and keep_elitism are on --- pygad/pygad.py | 6 +- pygad/utils/validation.py | 13 +++ tests/test_keep_parents_elitism.py | 129 +++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 tests/test_keep_parents_elitism.py diff --git a/pygad/pygad.py b/pygad/pygad.py index 21d9654..37eba68 100644 --- a/pygad/pygad.py +++ b/pygad/pygad.py @@ -37,7 +37,7 @@ def __init__(self, init_range_high=4, gene_type=float, parent_selection_type="sss", - keep_parents=-1, + keep_parents=None, keep_elitism=1, K_tournament=3, nsga3_num_divisions=None, @@ -90,11 +90,11 @@ def __init__(self, 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 has 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. + keep_parents: It defaults to None, which is treated as -1 (keep all selected 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. IMPORTANT: This parameter has an effect only when the keep_elitism parameter is 0. Because keep_elitism defaults to 1, keep_parents is ignored unless you also set keep_elitism=0. If you explicitly set keep_parents while keep_elitism is greater than 0, a warning is raised to flag that keep_parents will have no effect. 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. nsga3_num_divisions: Only used when 'parent_selection_type' is 'nsga3' or 'tournament_nsga3'. It is the number of divisions per objective axis used to build the structured reference points (the 'p' parameter from Deb & Jain 2014). The total number of reference points is C(M + p - 1, p) where M is the number of objectives. Must be a positive integer. Defaults to None. - 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. + 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 it takes precedence over the keep_parents parameter, which will have no effect (a warning is raised if keep_parents was explicitly set in this case). To use keep_parents instead, set keep_elitism=0. 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. diff --git a/pygad/utils/validation.py b/pygad/utils/validation.py index 7d3e780..62c4653 100644 --- a/pygad/utils/validation.py +++ b/pygad/utils/validation.py @@ -1250,6 +1250,12 @@ def _validate_parent_selection(self, self._validate_nsga3_num_divisions(parent_selection_type, nsga3_num_divisions) # Validating the number of parents to keep in the next population: keep_parents + # keep_parents defaults to None (sentinel) so we can tell whether the user + # explicitly set it. Resolve None to -1 to preserve the historical default + # behavior (keep all selected parents) byte-for-byte. + self.keep_parents_explicitly_set = keep_parents is not None + if keep_parents is None: + keep_parents = -1 if not (type(keep_parents) in self.supported_int_types): self.valid_parameters = False raise TypeError(f"Incorrect type of the value assigned to the keep_parents parameter. The value ({keep_parents}) of type {type(keep_parents)} found but an integer is expected.") @@ -1273,6 +1279,13 @@ def _validate_parent_selection(self, self.keep_elitism = keep_elitism + # keep_elitism takes precedence over keep_parents: when keep_elitism > 0, + # keep_parents is ignored. Warn if the user explicitly set keep_parents while + # keep_elitism is non-zero, instead of silently ignoring it. + if self.keep_parents_explicitly_set and self.keep_elitism != 0: + if not self.suppress_warnings: + warnings.warn(f"Both keep_parents (={self.keep_parents}) and keep_elitism (={self.keep_elitism}) are set. Because keep_elitism is greater than 0, it takes precedence and keep_parents is ignored. To make keep_parents take effect, set keep_elitism=0.") + self._refresh_num_offspring() return parent_selection_type diff --git a/tests/test_keep_parents_elitism.py b/tests/test_keep_parents_elitism.py new file mode 100644 index 0000000..0247933 --- /dev/null +++ b/tests/test_keep_parents_elitism.py @@ -0,0 +1,129 @@ +import warnings + +import numpy +import pytest + +import pygad + +# Global constants for testing +num_generations = 10 +num_parents_mating = 5 +sol_per_pop = 10 +num_genes = 3 +random_seed = 42 + +# A substring unique to the keep_parents/keep_elitism conflict warning. +CONFLICT_WARNING_SUBSTRING = "takes precedence" + + +def fitness_func(ga_instance, solution, solution_idx): + """Single-objective fitness function.""" + return numpy.sum(solution ** 2) + + +def make_ga(**kwargs): + """Build a GA instance with the shared defaults, overriding via kwargs.""" + params = dict(num_generations=num_generations, + num_parents_mating=num_parents_mating, + fitness_func=fitness_func, + sol_per_pop=sol_per_pop, + num_genes=num_genes, + random_seed=random_seed) + params.update(kwargs) + return pygad.GA(**params) + + +def conflict_warnings(record): + """Return the keep_parents/keep_elitism conflict warnings in a record list.""" + return [w for w in record if CONFLICT_WARNING_SUBSTRING in str(w.message)] + + +def test_default_no_conflict_warning(): + """ + With neither keep_parents nor keep_elitism set, keep_parents resolves to its + historical default (-1) and no conflict warning is raised. + """ + with warnings.catch_warnings(record=True) as record: + warnings.simplefilter("always") + ga_instance = make_ga() + + assert ga_instance.keep_parents == -1 + assert ga_instance.keep_parents_explicitly_set is False + assert ga_instance.keep_elitism == 1 + # Default keep_elitism=1, so num_offspring = sol_per_pop - keep_elitism. + assert ga_instance.num_offspring == sol_per_pop - 1 + assert conflict_warnings(record) == [] + print("test_default_no_conflict_warning passed.") + + +def test_conflict_warning_fires(): + """ + Setting keep_parents while keep_elitism is at its default (1) raises the + conflict warning instead of silently ignoring keep_parents. + """ + with pytest.warns(UserWarning, match=CONFLICT_WARNING_SUBSTRING): + make_ga(keep_parents=2) + print("test_conflict_warning_fires passed.") + + +def test_no_warning_when_keep_parents_intended(): + """ + With keep_elitism=0, keep_parents takes effect and no conflict warning fires. + Offspring count must reflect the kept parents. + """ + with warnings.catch_warnings(record=True) as record: + warnings.simplefilter("always") + ga_instance = make_ga(keep_elitism=0, keep_parents=2) + + assert ga_instance.keep_parents == 2 + assert ga_instance.keep_parents_explicitly_set is True + assert ga_instance.num_offspring == sol_per_pop - 2 + assert conflict_warnings(record) == [] + print("test_no_warning_when_keep_parents_intended passed.") + + +def test_keep_parents_minus_one_preserved(): + """ + The distinct keep_parents=-1 behavior (keep ALL selected parents) is preserved + when keep_elitism=0: offspring count = sol_per_pop - num_parents_mating. + """ + with warnings.catch_warnings(record=True) as record: + warnings.simplefilter("always") + ga_instance = make_ga(keep_elitism=0, keep_parents=-1) + + assert ga_instance.keep_parents == -1 + assert ga_instance.num_offspring == sol_per_pop - num_parents_mating + assert conflict_warnings(record) == [] + print("test_keep_parents_minus_one_preserved passed.") + + +def test_suppress_warnings_honored(): + """ + suppress_warnings=True silences the conflict warning. + """ + with warnings.catch_warnings(record=True) as record: + warnings.simplefilter("always") + make_ga(keep_parents=2, suppress_warnings=True) + + assert conflict_warnings(record) == [] + print("test_suppress_warnings_honored passed.") + + +def test_explicit_minus_one_with_elitism_warns(): + """ + Explicitly setting keep_parents=-1 while keep_elitism>0 still warns, because the + user expressed an intent that the precedence rule overrides. + """ + with pytest.warns(UserWarning, match=CONFLICT_WARNING_SUBSTRING): + make_ga(keep_parents=-1) + print("test_explicit_minus_one_with_elitism_warns passed.") + + +if __name__ == "__main__": + test_default_no_conflict_warning() + test_conflict_warning_fires() + test_no_warning_when_keep_parents_intended() + test_keep_parents_minus_one_preserved() + test_suppress_warnings_honored() + test_explicit_minus_one_with_elitism_warns() + print("\nAll tests passed!") From 44e4d24f273f567f9d95c3e9925ffb5d6b39de08 Mon Sep 17 00:00:00 2001 From: Ahmed Gad Date: Tue, 2 Jun 2026 05:32:46 -0400 Subject: [PATCH 15/17] PyGAD logo SVG --- pygad_logo/pygad_icon.svg | 27 +++++++++++++++++++++++++++ pygad_logo/pygad_icon_1024.png | Bin 0 -> 99651 bytes pygad_logo/pygad_icon_2048.png | Bin 0 -> 212180 bytes pygad_logo/pygad_icon_256.png | Bin 0 -> 21954 bytes pygad_logo/pygad_icon_4096.png | Bin 0 -> 459842 bytes pygad_logo/pygad_icon_512.png | Bin 0 -> 46631 bytes pygad_logo/pygad_logo.svg | 32 ++++++++++++++++++++++++++++++++ pygad_logo/pygad_logo_4k.png | Bin 0 -> 569136 bytes 8 files changed, 59 insertions(+) create mode 100644 pygad_logo/pygad_icon.svg create mode 100644 pygad_logo/pygad_icon_1024.png create mode 100644 pygad_logo/pygad_icon_2048.png create mode 100644 pygad_logo/pygad_icon_256.png create mode 100644 pygad_logo/pygad_icon_4096.png create mode 100644 pygad_logo/pygad_icon_512.png create mode 100644 pygad_logo/pygad_logo.svg create mode 100644 pygad_logo/pygad_logo_4k.png diff --git a/pygad_logo/pygad_icon.svg b/pygad_logo/pygad_icon.svg new file mode 100644 index 0000000..c3e71e0 --- /dev/null +++ b/pygad_logo/pygad_icon.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pygad_logo/pygad_icon_1024.png b/pygad_logo/pygad_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2bb5db3a6d022a1c028913d96dc5d3bfc6be40 GIT binary patch literal 99651 zcmdSA^;=Z!_XfI$7#fD|mXZePE)i*w?vPGtB!(0a0gEnCK)Oq6K)Sm-rMslg=KY-S z`5(^3bus+Hp0(Gr;$HW?o+u49MI1~DOaK6IlwQcc0ss{7Pb4XHDEP6xQrHT9KrNIN z<$;ICpRA_5F91LXD9Ovb_DS1Y@b!PaaV~W_RWk9r z#?!7^r%<6VCtQ}f)n(Vk{)U)OraW6azhUy@Wbvd+v9`gknzW3iH31!~nBJ2o;6sw% z4IRb-5mul3tq#&t!%hR6e43WIwy5MIdLl^gu)lF9F84lP7dJ&yBU?HV@&F@-D{p+u z&1Y6JQ+U}o={cEc+p=aO?auS3+X5Y zHet3bf~G-?bM2rK$rARr%g9|)B8JL?oi`m1G1JB4fbhwb=I)3zmFZq`wEhU1T15Y! zp@4XBM0tNts&uaa5LdxP_@H^}T#w&sr?mSPo!$}OXy^40OJ|5H|7a%XSKN>AAfBV5 z&51-hy#yZK8t`Zdm5`;;>HqN#aqGr~@{7C=-Ui0!t#YQSl1?Nzo-Te%^_NBOLv_F! z|FxzMZ0V)hQ6erkw|f@`YHym$gcD)1k=Xxx0=>GzzK?a65g-L!uJ|72E#T5ej;{7` zHr^23oUfYU_9>ao2G5(ANE%nxUKhhnVwWLv6Yz8-;-PTRDJ;Ye(c-o@IQ)T_@1Xb8 zP1*a7^)I}zU>0Ut?0@oF5xZXN%vl)nr2}N|98Us;v1ezy7k4e zK&>%o~N`j-M_kbY`rqAbEXq->ZYO(2SZ{pBS`0FOt*b|ItTNZxs5ZbH{q^A`T z5`bE5LjsY9!uL|et($}y<472T`$2TKNc(N{g6Cdq`;b^tAhTf{CViNM)uXl3Om*Y= z(47#JBH0J3TV%ML(3K=S$DE@bSj+!Kt=^9}W2~sy?op0AUa;|LcdtYNo&G}cBwP(V zk1U-@YRpg?v?J992c-{fV^!BV4;2mA^ztbo)uT0bka`a?&qu$KDr1 z#b(<0CDa3`wObshWf11H^X8RB=S}+WeBUArXI!hy{|-Tf#}5oD#$PPIv%ol)nHMq7 zTj)TiZ~km*67*H3lkx7ZCkSsb!rAEig5(B&0~Wq)Wa~=`u#lMZ3c#9?5Eg(*g9EQ7 z_A+TQm3q4brRldkFWKoXLR&J2GRaW%N??7)SY428Iv-XNr+uAS-9Q2+W6VzoT^LLU zgUj>x56c3KBs*_5k~!!wmP%*ev3#r4V?Z2)gpr+rK0HX`!$AnNdq@I#3rxu$NF1CN zlTUoXP}uzZcyxMMX3l@Qf0jrgo24vNuj|DiT;SiPdcNPX7pR#;(UE(RGPT2nD&2nV zMAPCNu>t9jWgqOLyt^iPvu_Y13cPDZuPN|hq2Z57+-6l$kKdAg$__A38!Jm4F$FJ~ z4`YUw&5vvv;Wt>G_%(bW$bPVRWi$2BrbF|2yCVOJtpyd1S@y!WnV;cgQnA`MiPK=T z$znrCfyZ3T-}v-J`W6X}yjPM#JBMqAD$S1GC@U1>%8)SySLkqSz#?R@3HfMm!m;8W z63~AHdEIM93y}n_y%MK}c=(;;wp=pUcRzxW;`N`$n2*0Ia#^k_LhANQ-Tl$4MQnR|MGD7BALkIY3lJ+|*L zTWcGL9;@R29(#n+wt@XxMp9R`3!#Rz1Ca;hBZsBeZ6gb!peTI?dnM}VC=SLYwu?{R zw+6BrwS^Jzs6wXE%#s#1aQHIGBiu|ZTED9Aaml08Lm95KpMr^Me)3wLgl~=1OSd9( zHs)ee8X2D=ODpu?#Ux91$;8RaU>@ywVr{HAo6rw3y;krKQ9WoH7>M^4!^Le&arj>4 z!F{U}_bqeA(V#b|X6Zv++WoJX5;c-_WHXb;?(@ zq?(#}2QUPn%oAf>TO+mq7fHy$kCDWn#ZNKs9C!Z=LONp{T_)eV38d*27PH-BE5E31 zkREA>4fTgH^JzfMFyRD1xL_hn|9M?a<%R)A#;mnBy)633(tlaXhhN00@gp`7l4jw} z)<)t6IAByk!=97bK9ObQEq2hR`uHnl+{!!n=Htcl`R`^b@DL0$6@VugjzLEh%G-WG zpl|>?dR4^v@Roy$wDK|c{to?jw*({`YPy8T+f@0{Y+4c_9AzDAYNR#+0C*QsHcEtXigszZ@ zzDy@gj?Bj#V#feKj{kP9u(>#C5$j(5%O`Om96X<(|GM{I)w0gQ8j@R_FfH(yui6DR0dL&F?}{v{f?QD{M1ftznTVM`u9qVZk)w)_cR<1y za+KB_HT6A2D6r*&Aj2EhgLj5p!=Sj%4+3!&jkxrF7r_axnIFYi_Np3Spoi7}d-{Ui z($1j*uvF3T6}t+_2XDEStV)*t?uVZC%vMtM;*ZVhjN#@$NG6(D!9qBuvOk6yW3ZIv ztD4HzIigjk{$4L=v#W5Kv5*fb+sjnBs9I4RwP$Y4n)1ajQ&&#NqO&RHH#Osh(hz9m z&^U%8TNpL=vPPA9pA;FNKoE~T@)0g!DIIbl(NTe|2q+L zk!bpif5RbGg9F$+?z5HxG_dHy?vln&x|`^XT)deUhGl%Hp&4$X)ImgI_9S+IaR zpS)2=rx(@i+uaQQHF_ZW+bk^E)g@!a|M#2Lbtmfx9rhh{XbelM@N|D&@|uv$88ev_ zD$o3)K^V`(9LjtT0tt9Ot&ffz6sxu9`IuS?{+?<+NJPz4S+sy~e>7EqMxOA;u^+Xn zGmejGYR>Xs6+z30c7>B`drghVe3s$HKSJYteG);gzVlm)r`FtRbT|`O<0yRlvy~?@ z?xl~xRGnq`6zr4(JI4EC_}>sXGqfoSei$2ZD*$|=CD=*v%CC4WFlTf|rFk^D+y;8WndI%3TlI zA*JqnMZheMiZFL)GljvTeGLzKdJ>%TRZ4rb-jm$Y!pEF?@EWtjZW%6H zj3C28W)GR)U_cgf6}HuFXjUW1siPlWt6k4)Qa^UeSV8Ong%T_jz?vgc_oi>ZdqGok zqrluvf*Z)r{L_s3Vv1mU%tHH3=G<3P5Qi~>*ttD$$XL@`khcj1@kSR1X@~|*%6rWeIb^5A!&_irwy!c@Cl_Us0hJSDz zjxjyMV6d>|y8md%KDb@T6sXt9^F99o<4~TC7h^gc$c*Lv+{+1+pvK$CVeFbMKXVFh z8Ht$xzcaaTSd{iDfZSq9H>)yLh4_AAw|jkA+f*>o`&-VO^$;TdG%qSjYNFs}-)M6n z2-d_(uT$k?wOak3!q?1(;Ii0~nS_>1gq${QXeCb)-c+Wi8JKtrMA8UWBA)TU$ExFl z>|#%IJB;r45*OIWRHPdRVJs@oWa9}mMi5AqX(X5C zmo^P4{}60#|1g5dV6plAX0a0uHfF1HCCx*PvMdc8%qM2@yCLo1$V%`|AU_X7;3s~L zc{U)ms?1O5`;?)@YIANNCOJaNj{f1B$Y3&Wb>jgMYym6lSy#Rgud9Lhdfd8jDTu>m zL0}nqHyW>BjrJrhwpQk7EslX80R&T;80OhA2|=Zy;1wQBmPDUZ#0u+vxZ z=bBeM)+dmo!+YMgesPhXp=GEsL*&!wW}$6oA_z)EV=&P_j-7KSnRsliiUCKeowrZ$ z7!+vLv&uDM+~9mP{cFQ@8W00HcIEjfeS;7rolESHo|cKB#@;hqrEaeZ4W`B{!-)B);loJK zYg3-BYS>_CJ18ilgK01s^MWT%#!Y~y1->^P*S z7Os+i3p*I2zWKu%us2!vsT*Ih^AZ4NtmCqx)ewNKQCaBhmzJiNeA59ny4vvG)k4&~ zCh|%baLdEegWhoR`59ZP0M=eEv~3Ewl7P2Sn> zc)EnRtKB^={xKA<@(E^*IOvNau+?r?z~KS`x^{s_Y*Qq5qa? zfz{KOyBKMy5LC94!!KkW=o;={pC%-}CfQ(3%&9`Xf6los7EaC&(YrT*A>JsVJ-Bxl z%_0{KF@?eESxn2qU^l4Vbp8UFFHn8om^&huEtWi|k} z(4DvJOYjGaiF-=?G>U3b(?QOR+0J$$!wf|hUjns~7qgq@fHqLXTyKbh;hNKfht+ht~pscf1q1D*?z=upb zWBeY5jO)f_g8EO%&>Jxe3jbeu5BiEilE zF^FT$6Vx>VvQ7#CSjjO;8}TnaEh{A&`mk=^$JPnW+ZOP3`%{e~o!^nX+MkrKop^7n zp>};3(K%}hJezwo6{B?)3P4oL!!8xr-OpGIw0lx9d5B})kmQOa1YbKlzmp?@68*me zAGWNDy=JQ%NIwXVknnxg0wXVq#!^JyLc`dL`(+R>8SWg)QJD@6 zlk=n)!|$#2UDIbOre&wYunTPljS(+CqIEY)nLSAtIZfAR`Q2a!o_mG0#w|uB3#YLGf`n&k+ zu%U5iw&IbUNaBrSIc`uFoh(PI&5uQ9Orc9JeQvAKKbw0QbG>XNu}Q?m^3v5v8@$`} z#4LZHQ?Rqx^)sBS_Pnp{$KBy_Ns|AWiD>U47}EqkB43$FU$)~+E$)tE;M2kG2@oVu z1{8U~A3J<$ax<}nzoDcgvij-mtd^#3mkJ)zq+@+|7}i4hQHb!7GW#lsA1ACnF@Z6+ z!WEaM+|CV5I#qWd(vP1nQE|}s>744Y@3K@lr>Tck0#tZr@`A_cwn$f;%zg%^RpK_A z2B-(pJ|d8=Bw`o5ygzPceT}R8)?LJHYW50OwPv@y*++Qx^belaD81aJQZL^Jk`oyL zxorAqPaIL!a4c>Ga{oh1#>`)5I3GJ1vtKa$yUvE$D&?wn&ZQwSh)0ST9`Q)la)=768y25VtYe!iOIRx$k-ATT}SD@D4s zRdH{Q0Z9e+&vj3CaCMXJahK`XSCL=v#kjA1XDihw0`1~> zlznJT>@0j~Dj?uorg>h~Ib;)_7rO1Se!-tCbHz^?TR-Dy{7XkZ5NWf+ngp7qigj(= zWXjx*$c8dVpT(;RWeSFypwEc;1*--yEC{@n%6H{#B{VT>StOf zW-@7z6t2b411l|&0c0`q-l!-IrF7!QG{^ie&21N@ujr6{&=B+_IeIRzATdqtf93iR ztgT5L7ycu6o&kWT2#=ls5X=rJFZ>S7|Gnvdj}m$q+m$ACxuGufDz(^G&_p&B8=jRjmAAlE!(_rk zx=P*xsdfnkiI9;PUwxhsN>Oz9tzrtfR^&ZGKxkFhqh{HT7qvS6P$+qRg{}04i~S5n zCdXH&ihPA^Q6K=1L~`Woo>p3qk$e9k${2+TWmQgw6|&}IHJSE?S-k5vz6wXui4t>5 zCe46;a_Q3pQuCR~vfJEEfkF8)4s%t1`Y@ijN16gz>px`Dg4}(TubXmTthpEt7UQp; zKlOJd3MxGX(TQKUXgC8t?-AT(t3D==z-BG2)gVzUH%(PV3e{C`bmrpQF*m2F6m4ro zg37D>;3GkRk-wz;U8w{8137aiVRjID7?w8T7WL?bh(h60U;bhTZu9r=WCMtUgQCuw z(VUsvDzP_2IA0#xh-$Gux(j#1P^I@8MUrxRKxY&Z*xlO6Sv>K^kgsQ|*zCtnlzou( zaII?86!{3F!M8&SWecztL_H4NWIkNrgDuv{E&QjVkFfo?4m^#6mr*$TUi<_j72v@` z)ID?7Q+pA&aN`pPLuBs}T( zr_O#$Ta}OO86(NF{@JRU+w3aq!+u-WhNhmp$nDi|*cBjh-8uhmc9 z@))DFx!KK+s317YpD!_Jd6|IHz=tMZhWsk-9eHQ8CA$*vvuj)a_UiR!$`t=(i4cuIb@SM)IBZ=OXZ zWC*$c2Z;8g&o~>6-n4@0iQ0hXG`4zl{bjk+%K^OC%TSK+r zi=->qlRnzZ+Gpa^i;!GeJMH^YLy0Riz$tLMr7HdbJHm|wKIGS&qOL*p53^eQmK~fj z`<@;Xj8@w}Oql7F=deS3UKC?zTFW?sVg4VliyYCw@Rl&ixty+QFpRP~zJ)K9?s3p9 z2<~P_X-1Pa_nrb-48kB~tm~mja15VW@27GTUvI%vT0@7mEbYIEp)K54G0h?T)S4>@ zm}zi_Lg=Af41CoPM1P-O<1$E*WuvNpf3JOn;nUOVm#nk@4x3J}vU#yxPRnEr{>K}y z`(5uobfq@qJ8GX1arK*-H%yZ!0YV{vKkcplTn`CmI;i(#dh~8&(SHSp&Zn0#5&zVf zBrKNj^v&_pho%`6%|1pJCY(DtU}i!3h*_$UU*sh|mg8DFP-(JK zc*OaE>Y%GT+vD19hl)t7o9T3n|0Ozx_<%DX$}y!G)%?DKd|cf(`DBt43Fp}mgBb(y zYEGJ`=>rG_;FZ%x9{gBuWv@Fjqm75n8kdT|?Qm1zv1pjOi4w4@VCN~Wp)NF&mO|Tf zc~Zv`aGoc`K$K2FW>`(m=B30FMSJ2C{#H>Ksj zFf`_K$4-+*mTMmEJxd1BSJ>aF#&4h2utS%mt>4Y&tzjv+r4gr_-kN7Jq9lq={7q8$ z>#G_vle|k9rINy*7cZu|Gr#`Y|*n z#=s-Dv32vb!oJ9)4cF6Roz1}uElUwB`}U`6nDp{X-Pi!Ve9Hz{qa4X@F;!@9$8`Si zJJgVXPrVRx-&P(V@C@XC?6YT+r*W=kBEFSSDKyN`F-e1l@cOSQ1X9N9l zljexAoub%607uQ7xMc*fj`jZxdjWRE5pLqa*ciG$$Cz-MyiA*zvQMpfPe@d*e-80J zog~W70>|CFRQAs(ukGoVCiGsZ%x(L)ZtX{>XHZKDUIq8iHPaY@`qgGO z-=w`1ptT}w)9IQEIQ5pM`j+YwU zLI<_U*H27Pufo1=VNmugf0yD9STQvr&4 z+U4d_H*JA@wxJbqO889W6Y(N4?uI@}=42{ebb7u=7%ShhiYs3L7@5DF_6u2i;uP33 zE2;Q6$TJ+<09p<8tJ(u|Z>@Ko-n;C($KJ0FVu(S$<_Ukvd?K-tf`;-eIo{Xvv~lzy z1*RBz LH90k^xlR52Pd~6u+$uj*}_j-yrCD}=G4z-WKp!-seXXtRHU{^f2dtv4o z!~j&P@_wE=0-2Wr&xM}Dwz=tGT+c*GK%GJLzw+~k8huGRA1xz5@iss7T+0F^K4-!- z-;>Ov=JLPFLwrb?3cwH1stn4WQnxi((!%y1-#|H5MHehc$Kw~ifdZ%S3=w*HW^^Bc zK3LlDmt9esqpH|?GDKa8?rLz&)1_XH({sXh1J7+E=t7wDB#rs?PI$2@--}rAsSk~R2gi_@3bWqE%u&=@(XHg43U;eW2 zPKwNM>xL_Yu*&gmQm|CJhDq!zlZZcc%zYh%p;qv#1R@*U*FR?8q~j5MA?F7YQebkC z5E-GPpc#cMCp}jyhb~5yq)$(YsU#$MY2#PvmuRIukY8~a{GP)(kY0~1dfU%l>|OR& zFtw_)hX&gyt8*vF!CHkr>_y@u=&Nxb_;}TN_6*)!x;&48%ziR^HumV}A?8>cwY#aL z>q%!dsY2g?vGTAp$G2z1{6r=Z?sZT+cbrL?u0%6`%(gCo!Ur|iicrc#`=9Plqi>ld z+pj)glmhV?mwq+8VPvcXSpKx3W#vPVZoR4FL{N~UL0e8u=eBIan!O$MOpmjPc8Kqy zU1l|j!15L0T6-h>UP_vrTOpBLraoKy`o6nA-^3RHU_4`5__$VIepLTnXAF0vf$Isn z{WiziAUI1ru|3@M-Ou2^NctCdc8Zkz4xeSSP|y@dON|R6JrCcdrI`V z*qdC&!Jbssv?$LV1V2>k#iFB^0(BG!`gATzOyrhcQPLGWHr&jwrY2&)*C5$Nq!7nP zt~4M4d>!e?*4vjPmxnijei?xna4xOI9AE&-qhbE(1OpljVl3_@Nl1O#;Vx&N=%GV!3yxd{hw|zaT3R;LE#u z@m=l&x43&@_@vr<;`Far7x`E-O-RyNj!W-JED+|oTmSsHc`uR|+GCV|8zC2s7AQ9? zh;qxx{bol+*a12xd}(&CN@Cgz{7<8fZk*K!;b@J)uHIO6xl9x%O^B>a8$w3ZQkhs}Wl__=pDnW2|vwx#$bD&j4tgKSwcc94f6ygCG!CGxOZ-(nK!yzSPp0)=znD z4_7@Nff>^Ln|H6E83WmkrK>zdK#2(#B}UuB@!RQ&IqCjNUtH-@Pj>?W_?F*v=QGaZ z_(Qy=J?UZ6wKJ!Iqh+n{cu+ z5_Ko!BMVdKH~s?1((26W&!e{=BFxX&yh!`T0*96$ow6mZhu%UsZ&`#nx9ycpaEEuC zOUM#`u4~PdG?!}MxIq7oI9mL4&EDZX5E97+3)!Qg@`L%r=PaSFnNjpDJTIg;d51^` zMMu-VT|?Q_A%9PvMUZjZPc(N`41R)`METbp6QBp^bJ$C0*0NjWaoXFKLSA@?8ZC=H zc~!GT`jP|(K)V0^j_yf&;QOcqkT3|pF4P5xHog)i7O8S1eYU_Kl6+y+IJ`7ePNnW9 zH#MZmzHgvc^9L{nvP3pe!^Xr%y7%@fU=EAx9so19L9f)?#HpOw4jFWMmB)CMSMx<) z2}LY$7A1;6y`Dy|70GMs7n2{0M~l)*D@ALWvJN-QVGa{CV*ZIoIGCNC3q%d6u>A}u zEcX_p)uF2L?kzVzyCVjy1>dApz>qcPE4Kvz@|K$RSX>-nlM4rUdA*}XOMI69$%oBr zHQY!DLh${wD6nvVjX)eWe#6;re*Vp%jN^L;)e^ng8yz=M`fRcB=zm`ZV%Wl9>5l;V zlh~NU3HCBM@Z(*RpoFHyZ#vPID>?oUaNQ=4=c@DdR-~&I$ODt`pZpAU&+ga5{wS~DhRdJ@#ZhtqUh(%PpE1Ki8Iu{`Oa!vl`Ba$&uNMa z)>SQxP!T+gGyu;jHi($*D_1e-+i4ydF1>=smV|bC3N%``TV{!x82|2$(R;@l-He`3 z%H*$H$mKiSZzQquMwmEkDT(MH^BIoP7mIz(rR^!)YTxlzVEL^Ae+EQ4ra>kDWu%Ps z*jF3i=al1!ueUYqFyWDZDrOK+_Ff#2%swG}}wOOjcb`GdluDH@w^W((Af6`uX zr;OhH_INB~@~ zJBWpl`x!e8P@28m@u-EVf;l}s^qAA;muN0MgPf3e)qoYKY-1^}pac+!U-EciT= zAPBjJjNIZ)9VlGI4gjPfMB-fntbA-HrK=9g2gqgO=lYUk{CW2d`9tUQiCt1?3x{Bv zdC&aij3s+L?gz?RQ(O+WWdf{fZae(N0}eX- zO{tN|KyETgT-n#y){8~%epsF!s?k<#*JuEanPLBnd7GE2ve*nG@j-;}tTR!aG%EB*RygwDuHu5M+NsIH+s*CwDNA zP*A+quSVO8{6RLsnVcle^G{RW5h%L!k%lAK%H+<3K4Jwp>)(GYvq za-D|JIpKA+Q}m;LIPl2A^5yPk4hq)xEX5d)N#U6}0PqapQ%SpbO!F8K8o}msvB3ut zkN9q<+kGTvn;iPt^9OlXkf!z`*m9W+UsHLrM}2_sxsZ^LxPUtzO1T}NRki2RR*4LW_O5fe(Rr%bMwNgh%BGrYB)D*RRYYklK)?r&xUSZG)pp zRbnoQnRonI^Ig02$?f`qtYTgX^VwKX8xnjJz_5${UKf;_Kmb zDj#Q%L+c2n3l{LZS9k*LtxIyR75$aIij#(YWDfTTx$0?~`Gn8>XkOlb=6w?r-4ukY z3DUp*tW+;9+ESHzDOmZQ{jz1ulAOSrTOAR8-}y+Jv=Ur^m7VW}ICK zF*)U1sXaL}jm%){$MO>$q9%c;1jtNTr?Zg-@rzhUQu(AMrtldS=|&Zd#zA&+Tl=Ks z%W4q){^bP~LpVnw3kS0C_2o+MkI@m6x7V2T7g&!KBdL=b-Bg;#CewyFg}n4B?@b>w zfS^XdiT7K+%k-({-XPMfJVqnKc|LrG5apPw(V*X{`1XTvFgEl$1MQ+cvr{5<)M&#f z@=n(={Xrl2bTCM0IklKcsL)`Ph4>6%pnk6o_*=i7UgJfnREeG8w7v_1c-WorY5c4a zO_pkPya60kZy>ic#8|N_^>fd8KP z{&Nf)`1AMV5@aa;J!$wNl}hvJnDU-yBcv$zgRZ(AovTnO-x0CS`gp<1MXP1LpMiID zmi^C$v^2f5$;&}il=jh{3L%FkMP8~PYeHyM`;|lEh)pj?$k&i+E{0pyj$~a6?VJRh z46)S>VGQ`TdP@8S&1!&L)~9sb4pFr&8;#mhfMhMB*6a=+30OEUX=@xjd}lL768gD^^2A-K{$7G4F4=c`Nn#snhz;@*d?k zm1vf*>A3$osDMDJCqA;GHRb!@IE(9lcwR0uRv6wYB9ziw!5j#xil0s%xdaitkF)OQ`+rfuFRMN_3#{@s#H4Ify!v`8-Fy z%{`p0*>Szh-AfaV{D7?yLyjRxW$?<)84YlDcM@b>oZNYx5-O#48=ia)s##n4kw%04 zQz7NjF3TPwJvR?M{h4kP>e>@Yzpe}uOM%9Fq5_G675z!dZj{E^=CcXs_527Xea zIR^U1CYmB~%X`x8uu^Mbz0f30Z&Jvmr{tfQQ^>rXwsrArP^AHlB)Yur8_Ew!TwZ7l z{HyfyZ=O5JM)q@Fja9$T!g*h3)Dw!ar;$aw?ol=tEMNLjZ^1Pn*(%ywa?sUr1Gf~L zX}aF+f*6lepwLy(Si)E8XaeL@*#Pgng_3K9*FPyRJmt%Ww#0ZZ$j2$6U9XBH?xR8WxPNpu zjI0Pm9_V3P5TC3ya|O3OrwelVRHD5(AI7YqrH;`ypYhL7fCs8}OHuaZLUL6_y#OKW zu^92~NVVUVEJUG$M1VfBIyYr^{5vWmB<+jmGrF(3_}AWs-&}GqIxy(H8t(EbyXxyV zs%{(qx|uL}{hA_|sN*U1^!Zd-|EqgpkL|6X*!#_W28O;#lf~U)?p$Xiv)NrGkr^*0 zW3^FUj#4G^gsGoEH}bG=$M%}&(&?$U#B>H(#&ikw@a@voaB%~H+@v7O>F%?IO2@<% zzulm~I=u{04D)caVyxoMF%|um%c1tVr!`sY0a`md!37^h$fv#SIgrKHG7`3m262F4 z9xy}f&Sn@J<+|Fk_X+0ef5c({R5w(w%e*rAA}t%19BrX1hwZl>{e_!Wx~TL}b|;%Y z%bnqn2MCY(5U=sW4u-Gn)<^rT)TEb1MNzSeoKwrlK$juxp0ttba;#j>NoKDU+z&$! zd%#>CRkJaosde+i_F1f$|BzQ>*E*{_@yn78p0EGhT`ZZ_C3VD=iiFtP_cO>Mn=H3V ze@~oi{&eUpVgB{q953TIw{k>73zb0cox+OnVH0jPQ6&W$1dJ@&Ad!v9&6-=@dk5Y_=;_&!Mnwb)3GHA>!P@i&Wi*Ru783E|L6#?U@gT` zlq7B$9cRtVO{15ax+$jD2G=QTmEhf*7R|bJWWO?ojVa7;D*%>e_HR+Sq@@Gb>J?HlNEJ=+|G0`~5xEg?d3{!# zk?1gbKO*1Fe=_T%d%7>_t2%@Wy1|XkAD6thPU8Klo8$Dm<^Z||@*6?Y_mA9f+11dV zx!xEU0&7A5hyJG)M%1&fkb`*uAd)235d_&yy~)+I%71f83PF_1Ju_hz%dWL7zJ^pJ zca)6nbg;&t-`R4-zS{*e;;j8nW&FSEO|NbU%3n?g;EaFQoFR2PI zC(kUk9LhE95?Ii=>dFt&Z?@3i48?<6XiIn_Z>;Qa1Yq~rh^yExkL(|Bc|AWn@ZiCT z=dhgto=>^i10mDze4n;KtY3SIcOt@%;~$vVPouF_OMBe$hBDzl`N)?o6uv8A)8K4s z+AejhNCVfvZ}Depa#(Or6azHbACMADY8Mtv|4h2+xE7gxG?0ndrAwPUCc_W<)0?hZ z2UP$Bf1DEexs%aRsdia>LoIJ10C&kWyQ~2;5AptGytVJ6mK+03sSUSd77QCrg92y4 z5L6rc(>s?W%|saTLP%GshI%uH8fSExF1xbGd`-?dRA(vSVvr+0Zui9|5$xrLQV2-!}gCQ5C9Lo~X z#4AjqB%}re4afp8wexqw0=<;61xl*<2fR%YAljt6X909|g3&3BG43KCnZP8iWEgT+ zaoqfCuPmFc^R>p*LCLo-d`4v!i|^hx&Lp>D?xeC*6*)_;r{f%#PY9V@OiL9HCVv6@ zE?)N5!F_N;M&0JSA1Ad&x;lD6qhGTH(w9za2W&kXEUSLs(N%G0xI2HQ#u^G5n5y{w zX1>d?3fXkN6BVyl4b>tjkL4UqMj!89%3XMFP>%IaYY?5$ucy6>6U73aQwddhhm`-6 zjQuj&@qRW>TgB*i2Ns9D_6k0VM|IQMzI|52lp$5mt61Mb1KuX!D!u3IK#0(#LH;D6 z05#1y-DF71j(`n&^xHxT^dO{VJL|5oQMz6n=6~qvUdwd3r-0rp01r{%;jjmIxR!~p zM5#l)Iip%qk^E+)6Vn~33O@mQBnt&tJm&*L&Sx%*{u*2BHsqAcgB_4F0vj#8(nxQxrwL#ZqJ z_=X@ZrzJ6uR>r9e@e*6*j<0S1w0ff{PWDUkSTGpzJR6vWitVUt-@bDkH?6Uc?PztN z8QCjQjx=)99XD22nJM|VK)e8(g3jh9#Vr~_s2C$w zXj?eVLTOLJS`b&;_?Uax?vobtJXz_2d(}l?5wLr&BZR3x;x75j=x{*uv7Ira{Cgro3bfqI+sS~_HH>^ zDpvr8Z$bAqQAmYhR0>5SNr5ahiaT2O+r7Y#hTN(3d^xNK=ut9tEVDpq1FRLpPGDtR zS{TXfuyBA-6!uLO9#q+7--kAGk; zbUz%5=r54S8pyd#N)E&XFFl=Gg$5I2et%jsc}dDa-*hP^{~TPw5TzdtyEv!5VCc-z z;jZZIb7LbL(n|zvM%;V`Dy{&q45DQPc&9LIzO$Ifky75hmtI$bw=As;+qAO|U9|+n z6RSI{qcW#ujs&E`hTAb|a|XDL6IH3`|Ao%cKJ-Lcju*Q_d#}nWtBcnNXb)HeE>EYY zm-?Gmzvp;OA)i$`0XC-Bh<89Ua+MG=?ulcvp^M3lx0Acgn@59DhfYx+O&lk(ab%|%>c*8c@06^BuFxQr)heJqI{y9o(u3j_Ic8!T z_x|+pf@p^Pv1B!m;e7_*6avdEL7??mnhW{>0BD(`Z(>D`=R|s%XnR|(*EE$D^go&X zrkQ^uHV=t{TP7XH*vPJ1a>dR6)V>)_HQ*er4D&!~qXm*Ck9i1AO= zInJn3I&?j7_Flp9n6*!d!c~?6yff~D&X5kx9-D?;@m* zxz$!NZW8Ed1~3r_S^;NdDnaPbp164oMnW-HbIa2LBLS5$ zW1(H8`4?nV$Pa^L!c^@KI>;+5R7Ge8g?%;C#$#Enx9YI{F@Wx<{!!(B8|0G`@r3)& zJ{?EJ6UdtUJ-{-0JQ=Xbb4n@ydSu&m7TMK0jO{#a)(_Kl#9_{zP1!FW(#^1; z_aT>%n7#9V&Lcesw(B--%O%ZSFb3}e+NOiZW7Jd^F?+rJ?T&Eo%QtxxhSlV1jh9P5 zgu+szNnIw5Cho2UjswpzrA0|3d?&uW-z?2^UyUSI#C8|JiTpQJ6%!Y9mh;dwWVt3+ zS?aS)+^~z!KzO}zuDEUG573n!YF?=hIHVG1ur6)k>BJ!9kLM?sfDflO?I|*Lt?I%$?+V;LGNsjl`zGH$cyP;+Sgs13=e_d z@2DR#VPl6tOj$#k5q(xvE2L1jV9C@6>C+ndZQ#~g{dCEfL|FxTicfb3JPS_{?jC93 zSaaG%Y_IB_Y_|S@mumh_&fy+<3bDGpStyT?k#HKl^DgFm5KG?kTVulu3dJa8Y%rF{ zF8Zt3xs_Nv$PfWbz<`F9d}6}k?~A6e_77-}F86&odhnUAMw{|`%fr%-1c5yYp~~BW z_YMBgOGRW0ApPZ0us#~qtGfFdOGW?NP%yMAQWDaX!SCTZ^;F>RUbSc@8Iw|A@zjLhGDYWFCs&$?UX6w_ycy7 zfYv@YCNdq4wy*FI0#RtDKCA&t-PekQaA{=w=#N47!Sy0N4cnWdnX$uHZm4X;^R;hE%S0u(|2)8t#6Gl9x+2sSe|*1GzIk4Z?gFeW z$96^j{i*luu(;~ruxe1n2IbzczhQ#`B`-&!O%vHu3hD1BkJ7`=SKxX#HJO?Fua2ym z<*3Xw_cEKYQZ)+wQ`@WS+W*@Hs16lJwrpsQ#nvf%YqNdv;`Aq4+HWzR?Hpz3pnVt_ z0&ESN5`JSHISQV&8In6q75+9J(zh9_zp>c86Pyj^_%6)zR+>Ds?&26P@a*aQ+2N)( z_}Mdbce_yq6|*r1DWGtV+ZTkYV&mc7A;`H-nSMY@0j_dYtCdfJ8(Lv8_PwyFWn+Lv z5B3l58L^0=zdE=_1}z)1e~_=^(AfwQ)D^&f30{a35Vhu-eF%KR+h9GcSIFw&>(T6z zybz9UWlwj4j*!~%sM9~a54so>6OVp-v$n*aYGw0Wc~p8|G7s4inawc+@h( zAAHz)pyN00rGDQWrC)PIK4be%n!~ygO-#ueLZ7M;0w-caqMw<0BDQs@h`{P$PEJl= z7>KwQkGu3e=)cLhjCZu&k~kDua{u1EnvhSiVyb~mLj?~K%>V)i{Ry1(Q(xK-!0Ph) zK9v;|iRcb`-(w;AHsZ3AKQjh?rD*Bz8GOw!J>Jh2l@beuLhsuo9gK>TcF>k=b@?k5 zcXtNkMH-vZ)<&x{T-2){{$0BBDk;e=E#W%`RWZC4|9Qf1*WFM^8+3a*>GB58xoTab zmiYY%B@uKkFPbM6(^Yxjl=94>;y!$CHz>KqVj|R3HCbv@%E<#8`xz|b^90FJen(n= z|DCqWee09SUl-;gsX@SPeZd%Z?&mzdpn_8+>PBjzR;knntoY+-+C4vow4?=WgcB3j zJBD9~mJlOtD&8J)#!cf|oQ_mf%TrSoe*I0CezxQSK}D!817YdK+xnCw(uJWVhp~^s zSP|J393QbaG6V9XxM`6RN5enKL<<;&@%WO!F>&2}ekSetYko96_;sb!uECk{PNe-s z!0czKp6a9!AGN%c+0m?OEu;QfmES`QJr#|4EUrLJ!i! z7=Y1g2R;A&-=)(pi>K?KK2=_vzw?~ZFEqV*x7*>FAf+ln;q=?R$a8W^%Goi%Z*w)U zbb9~d>3IV$I`5w0ACygzBXf7zFr|a4Fi-ofsG6dncOtD%%?&lUibSkS$q~foJ1CO* zlib?zGy!Q%v+1(6bgtQUH1$$1^B-1}CpM^{L6&NRdq@zmmo-%U03Z(=!yZXEr+69Z zMZx+bi_V@9j>S~UU!LvdB}o`nyW9d4qVBa|1Ia$>Jr3=?$iQ`JwK#OR7ZdIOq3Nmu z>I#zO!6A5XC%9{HcXtTx8VC^F;o<}m+}$O(yL)gA?(XjLZg$`PpP!l2GhJO(-Sg1^ zJ1*moT=5A-D?AjSiYMP0K;yoH`m2*ZQ25IADY|cBeyy4MFa*{0&bn!HTnF7!?C6@h z7IbQPL}$waGNo6iMOXXY1t+<5Ui^LFSe{aOggmUwI-W!teFp8iK9*0oY2txSs6V`JH6 zeo9XAtaYahJqp71EwU+oS`Oc2{Pp-Ap>3TZZfIe9m}Q|)IWVjKdKsslgX00oS@o!0 zSOp*DU+VZcHUmKq$`Dg=cLusNUY;>O6-htC7(o+aEHl3GzpC>Ut@ z$p)ZpqiCkiouBe~@KFKDTh!NnJpq!lzjNbUZ2-9h z-u3ZH8yVkD3EG$2$@H#bX8v*l`N_(s>h%&%b4+e%88P&>rFy)gk$3K?S%d}#avV#2 zyHatr#%KM}!ju~6Y0|3Ie8X*&(~=*8FUJ9DWW#VJ#>1_+oU5L~^45IISv@(WPmV%L zG*`71=Urf&-bXxj+4#1ku!g~%&j9)*w(uRvr3*=D;WnIyvX-7TK^^5jXxJE;N&YMP zY_?gwOiFzOe?UgJQjSURi6%wp?K|YAX3Bz-IP3Z=I!Mr0PlAk87q$jr2$Ckk%p;3o z5-(Q82!)>8Yg}LLNjKPg=kDUDo-8+lpQ?5clNbSD7}=!q&tt|j3rP_u>|92#A(i@o z#14&OiKieUO4!8(SRuaGVZBxEu-$guENqxxFQ(6l8wt_b4Z4Crcoovu&VJz$bRy{o zZ8&Uix=)cUmPKFO2^hkJIc3cZ4qqF1*Da@T!w5WK>eC8I=ZO2c6C3@UcrJC=R zHnQm^a~BaJ;mAPUk3#fuHRA>33N9V>iozY(Pf()+L0ki&5;mO;|djr^_<_v&F{19u46eHS{LuSH~5If;&b|%MVa- za}Ulu&^r5$eQtBS>s=d;C)ZgO1eQF!+iOqDEpu2(!Re_&z>9{K{@cq#xuNAQC&9&5 zG@c*ya+dJ-IT(P6)n{|^tx@m!dYS9*l1A&+R03QIjJMm~Kpx)&MH_eFdrx!s-C(x0 zvEneHguISY%Br|`B|V3TMqzk=LlL>y0wk$y_l4>7BBBCIZQ$0gDyxwe)D1>W1IpH& zu=hrMp@c5JNi3w-XIl*7!n*~nOJScdX~zb1=o9fD=kO+HyRve{O#^dEVKR&NV$nju zOEVUGUio!F%&*%Ti(22j2-v(h1C8dUPTY(#@rXm}yO%IE#drGJxoS@Ex`X_U^zs6S z*L!xVo&#b$R3!;U!)Z(|xEskgi8{FpfT=_tgzUev>zjUZk_A~QyUO;w?t_J3C*P&nr<>M@XKI*b>cHP3 z>W-2=CZ6DHz0h*b?u}fPO@}qeMY-V-4#Z>4`3?xzBq75Ozj@pZ;~v44jzBg)!T};1 zGBiY_g1fOj>Jhw0!Q8C1w9p=`b@{1kC2`7~f#fidC2z}-}LSXJ)RbajD;T;v5TZ65gIi<;((TdneOV_VQJYLxQ`1CwNm>QJ-0wV)t==w%e`M5Fclj@ZB$TC3EPDIb8b{ zW{0#L4T&AEJ+>>g+eP`kP0oRLpkfQ?qRdp(yRv>t5-VjM_3-Y_Qnlq-cq`8F8C$K- z{2G&aH?kL0d(KFVS=F%ts}V=meS`A(&fa1}ftJxXF_mX4NI(HPnN#$U_J>}XN!iCM z)h}K7Ua9!+pe0iN!rDb|_>Nn@FAZqz&H&_R3&W<{^vo%z4>i z)We3pISq&)Jjl|Xd{0U8Pl5qjH%MeejmpgAO zmQ`aRtwn{*NCcm6Gy3Pfie6!!^MHP?L}sa0fu9a}5*n2dO2EAHuH+v7j2!+xzFu(K z)6~r0O0CC>eVMWS7glbIIn%!(8w2l3C6SiH-FBtx!-TH3mDHTB_4ipGbPIwo5z)`P zk5H|v1}sezsom@-_hpS+7kOEG*b>2!+yJP7gRN9()ufy69}auUxar<)P-17fkaWnP z_q0xxZ|f)WV9*|mKgjoSG5*Nu@6aCpHA_ZK_pM@@ZwNBM`Ugz(+k_wnY_^FAZ+)9Q zm&k4BA`Y}9zAU0VmU0YQzOw}tI}1q{vJNABzL!)88#=WG7r7B42v#t881C9kg~p1i zfU>QyZd;n|N&Puf%3pP1HM7Nl7NHx4wWF#zdl{sfXHej-H87 zy+?Ng6^cs!myIO$8rZqh_2)R^JM@{)aCxO4B!LaKlUK{kqZ!lQyxN*joxdcfFQuVk z$AdFD^JhBmVHrZ_gTKm^Ix__O&Sg7cHG&*M8T)Pu2NroYB}8+7bK02R8K}`<`g|Z& z921o`ct5{dB)@=>E!!uEXP-oGlfQ466 zLh_r>I2uMwuPG+;>5NqDou$T0*NHpw{pa>fQX}UOp0d5X02&qi1KJ&$*CGczE<4V> zmwA;-?;-@aMkvE@pxP0n4tB)lB|2&Y&V-f-3J`YsS@CkvM{=;MlP&Su?r{mAbK zRWJoeFuuqAsYhu=)zZi;#3Tnf$r+Hlq`+bI@J+%Vy({c)LYOuQdFm(0*mI({!4fWz z!&^&CI(M6loIn)%Jz9r$@84V$@&8u%Q#NKSk(MKH`kpNBuIJcyKjBxtTOA%6%2Y8M zWUFed-Wst8=p2wj(peYQi-~(Wud%RSZ&_p1d`_r(2#{fEM`G3nM%^XTlglj|Lu!Wm zb!qGvOSw=l6kjuUC4x;3Q{AT%Apqd4?%@~6I!DwbcM)56o>7)sI`RQ#G&$EXLvDp^ z&k}it`)_vm)j$t*)>?J-?jt&5V%x&!D{1M5o99dC<-GG#66f_^{Z6|Se)l{3?z^HI zV`$)yvHbg@4X@zKasB!EaTcMhsK0Qv)<*knN0diPf57>CS@V0VrjV!3U*sr}x$Fm+ zXw}d1<|!=2r1cshTX^k@X5((mu$#oUrBe(H)KNzs0Kaj89AGxh1pr2%ig{f7$+0Dv z%sNue5#QK|=Vrsh55^kC)-RR*H!uKM?A=ON_TyxZF0%iNSFE5#W%Hz1DMX)5>IDBf z17;nabiF5Ed3mb5&5k2D4gHvc3%bTSmqZIiX z4A_?kl9OJ)!}P!%{Un2bfcu>28y^Uu${r_J1ubq%{G3l($6;k{uQbjL?k;8AuEF$E zYDOJUg1#sTsRu|oaJy*({|pi!h6ug%Kk1^pv)i3LbImVdWHZqFJf41g3BJEa!Ck%F zG^`}~>vy*QZxc zi9kEst7tKCT5_;-p6o`BZghd2nsWv zqm|{S8pkMmF&VcY?xOeWQmdN~fzbI(>(SdnG!57Y1c1aIkv~|TpFd}DqMB(Ctop^w zpVXAXk^|Xj&&4T^{rfA+^LP8&J zMWT0hB7exe^>_U@?Ghtf+caFQeYsZ;-@YGlfb8t$RehCx)U5UO2j78mke%(G*$}Rz zExPg)7rHx?@awdjyEaSwen0n+85VYMwUZ-ev_@g5q!4LD2=_T65?y0)uG{UASCTjN4tex z+5lmX`Q(rAL=TpAv%Q#sX`am|YIs%-Mp0jE($_?gCe+sOx{Sxn3yGnNnLSL9YAN{a zH3cR}^Q)Ind)mwegmCArJ?_YFJKH|V>*ks(J9vz0c|3G8?-L!U-Iw^v{d)Z+Dr$qH zi%|6|wYk&gzWj7;ovZl0(vQ+gMi+^0EDtqBszK}OPZEKhAiwz<`)S~5lt^^dei(l6 zJBm1_Cv2BuxEc>5t@bv8@*L&HhtJ{fuL{+|n=v0XVIt^%XDGQccRv+mL%IjrbtmyI zm7+Px?uh{*Ud@yu!d=hFX}05bq(7&p@~JzEbqXWz-X!bHQ6RFPf&+hO$}!C_!l;?n zr_XE1Tuti`C6O^ZTbSIYQJS<`IUVVSTnlZ7I&)f4ZGqfo;puxukm8S=CWLL|ejR|! zD3uvjXnf}nT1TR%lt}p0buj$v8!OsI&j?8@?(6fpu^Mfi`O37})clH>8%e3!%;6yo z1lpRvFLY6#X*t?`AN>1qcdFQSPU!A-PMmgDjp|i9dp(x@4UDf1@Z2lj zr6PpZ<{S53(lgm7FlQ%QE5^=OJWiF6vm&!veI9?qbyhJyOMTrW2&DVfufc+S6#P!% zzq__yRImCXY9`})XR-G=;aG1RqOreaG4!#Y1tq?XV#K+2!ZqSjCg+XKSB%LUyG>23 z9zokB>??8G+#-7?t%4#quC$+#(-(5#2uD{BGgB}k8|VDAl%4^RicpUa)5qMZRxZFQ zz_|lC;E8RunJ)i zDLrh31us+#6SMys9nq_28s3 z;8ckQe6@LZ*)@)cJ(m%3xcOCLr$w%(4ExXBU8W4NAP5lHwzL|aDk*iO32IGXa0SZB zJ5P6jyKIU*$*$QSzcTuL;a!P6Y0E&k-t2V>2@_P0vsG>&idO|u224NzYyNkW^CCGE zA3<-k+G^#+79V=tVcQDdwv)wgbVz+50K_T34K+l8%9H6uVy43HmC$H8CaIzRmieDTe!qb&4R(dr3<}vHA zR#{29WYtx`9TG>D<*8nm9MCa0Wy1afDZopdaJI8W>0XA`ZlA${aq?R*UPiQ-sTn%{XY)#z%DKNE8E%W5HiX7r_9cne~a1cc#Y z;U@lgG#&qCTwmrhJLy=V^0!$oz;O7x6Q2tP`9znB0d-UFd-qo8FTrASx?X|oRSKEHJ-o~axk|H_)`sAJgyJHJ z9zKaWsggePmkpF}m?up0`qmq84u&J6J)$Ixv)kXxl-HhOwdj5lq8PO_u_^G(;Cmzdr`Ayzxg}%qm zCi6;W7xeUPK$wHuDv8PSpzld~Yu#U@)>S)i&flcy71VW$e(x?4?joJ)onR z>f%BA3IU|>S3d!SrN{5+&>V8NG;Z;q&^?;qVPWa4>>E2vX zw8&6&Y;o*Z+Z6=LXaTn#dda0w_i{Qp7GfJ~%_&O}La;!C3>H~@+*9uML*YkkFRorT zS%}yGplQbBUhLMQEuM>r(PT=!zqg3P5#7TRQkgy=l|pf0MtqkrP*!^SCBOIvYn4-I zj^Ae&d9D^J)gd3JSwf}l>LPChC0(w`)%zV4>UWHK0xPEnuPF)ltM@sz;4#0`J7|!7 zf@=b`LCCtq_Dv3V`dfdoT_dvqyY1!0V8CgVe+N9(qXJ+|S4hZFT||9S9&g^T&?tqC zAYqfEr1JvDy8r+?=l0bjx|I&GGET38_EJPZ$Nbn^BqYB~{<7TnU_ExGyu_};D2RB) zYl`$x>Tk~3-pydHr7R8aruZ$9wpXAzp)uZ4A*`WnU!$QWJ}l@=Ri{lzF}e~mY&G)X zvTrR=!(6FXAeUagaX*wIxEwOOH4+*WVv_kao8%->t_f}eVu!IwR{SPr!e1p=8LkY@ zG+c4-D36EtYo_hixIx7pR&vzQ-3#f(M?+hdDJ$0gk_Yx}Sz8x)$a{$rMebb_e^Tf+ z=uu(AHARxxhn?F}#XFm;;a3Z_Axdf}z?XmZZno_8M~3J9!epaT)^5(<-0Y90(7;Qd z5Zvgi`{QBgQ8|zI`+d$l8yc`QH&piKJR0Ca|3&bn`86=+sZNd^o^CJxWDxKb?vIBg zJIhF#KWfUIa>ZtNoQi;0$sO*dAC4uwG(0dWO5WXpNUGp5zrYaGYKO9h*{BeQoDAeW z%w{W(U;9P}&&3EmxpM5Yx36bk$4$uM$3!;r^1=IAI}xICW<*syyp|8(pq*xe2+W`5 z7Rw%@4%1he-xpR+66xkwmml{wz`+TJArPAC|ALUrGC<-wLjEr`m^7CO8#2Zo#)0Pi z-N2Klk6o(!4=Q|^*3Wm3m~mQ%4#XE!i#7L|k+%ac;>#LjL*?QyI!J|A*C9VmnJnjp zRs@KEQf{UWmgqGFF1FbjvGa8+d5jPmgmkzyamPkbTvC?*A>Is@@ALOy#7pS8WL(fbTcY!|FP7cz75Hfo!Cw%oCJe0 z(4vZg`By38QM;1WS>^{E`q->4%`Z^7LB$%ez}L!o)nGm!$1v7ZUg7HETw<+Ma|M`- zFgG`=gdOPzn&>y6-xD1mz6tzlA&i6kW9WyMJtl5M_7-29zXMaKOEB@V;q8J<;*~<+ z#;tu5VVD6JMLZvDLB*}D(t@X}*F{vBQ$O^&dNfUc{E~>JZk$~Y&md+$-$_vfEgr2B z^ak8m{V1W$qo3aU1~8|xAU$1 zC{g* zcg4i%4l-MdIva9@N<=F=uDtUy*{VEgq)>EmMlMd|iWa!|w2EZtDOM_3#}mrBon^iv zh`lNDo!3A51?k1{DQaRB#U`;*lI)-6!{8+do89CaiwB0YPYsne1bPEET8%qw0^>&Z zp2X%NqYp#iw7vRw7u+OzQ0+k<49rtY=ftuoEz|;vi4M=ka%x3Oib$#1k=&@F%s|Hn zFOL1ws^1wqpPWOJETc(}mrB6!v>=WI!lu&*)~o8$xvB;HA^M3)7N}!beV7p>mK5Mgy#LMyNS5ntAy^sv5t~Q zBZk;WbN#q&mw*9}WWVlar|CRpk>!0EB5ZhI9^S3r_fm#~sq|gT$z0N~_yLc7>bPqE zVR~$^Yoe|F`$636Z!pO;>0(%)k9KNooG1Q2F91vHzTV2?O`y^WN85S$e!%I-TmU)% z&+-qde6<_LXguS!VWgDC{?I3}ua#+6&GKI?ynOlz&%AAkMVCJh_^iSGf`qVwF@sP0 zu`OJ7yqI~U4i;qRV!H|BV{?*8{lKyG|KZ^k@VNGpmi>-MECc$hw(f(nVKfl5Xe2;n8 z88KyZ(6rCZ+*MBFuj>wVBmqDa!Hlrqhj0kiHor{CJRcp|H=3-JAlUq1DH(n zVxS9mgj_#(PkIx`+uia}a@O2J`p;)UQ^)7;1)xMdPX%xVOBRH296aQi1i zzLxhF`+(DlxghX9Ldrnxzt-(Z4|>`}t=(gU8hL2odQ8?%6}GmncHB&qAWGqqu_oZ9 z)#5|QD#0hGgi6O@pwQt9SX3^G6(#`q)-Dr>epowcf-_TVSV6;^=iL#hTk8 zV;?gp9EsM#v*W2xpM%50as$U8<^806mEi4rjb+C~$$4T_Rv@Iu0T$C#$8m!R%VoX*T%YDu0MS{{`CLZ+g+p7QW|d z%TdT&I%dxSy1)A%HI}-E#^yK0sP6oAV0E=qLtS|cUQMcAR@Q;D(OZh|FG(teU#5GgyG!*J&w;fYTc*faqufIgO~uj0p_{BE*aM_K{BmLf6PZYo{)C%ej41&#$>tRSyqIN{x!cFR`E z#YY3-7AWT~B(%(s#0C$K;)~Dxyk8CVP2%V9EI0e-qu%_3Nn9FbnzS(m{zwpQ8i_7+M~e#qzkuG-}S!ukO0C`%Z%XetvnLq53jpy@;7`g=?V$7n3{{F&062 zn(BZ8D;LMYl}6o!i_K#~p^tw~>b}iEgg5Q@UdQ=<=gV`L3h$A;`*eC6^_QF!8+8T` zw4h8(#7=Wgy+|u3ustXg==p=|2q71&ff z;^tW3qboTVQGJ`OEA*dea@-n#d{AFy@D;9e7aVBnO|6sDE4h>drZq_;ITEoBrT=L` z>SirCUH&x#ESq?8@^|=#H8k;}r>q$LWaUQzzz4Rv@SxmA2zNOf%ajKJjpLF&=qouc z1T@JX!`gufD4n=<>Zuasj#^XiU!6v~G}jFI51K_-NzPBSEG?DmL~k~_f(Oo;;htTI zrri1;jGj%5paDAMJO7ypx6_XLRVg^n@ge$Y1trGp&%gLT3i7)S$KLF&et}s|D$M{h z*+(F48KQ#GzCgX1t#@U!g}pMWxGHG#EQaTvM%h5L4zeJeH-Z8s!JZ%T?_aD$4@nLM z-M=%tbg}NPeeLVukgwxehr3|=b221M4efv4yfDpB9DSm)mZ*wn*|Wo9%ZznU4pa>#q_RkWgYT&-oj-PDHVU*#XDLV#vj3GC4s9m}xcWSHtGNAV(rNWpGNM-< z(-rj(A|$9)3;LSV>1u87?Jm@A0FLHMg=Qw@@GfFRIIXr4#D%X`x0YUXYW7`ies~+1 z9Cn=$E!=3V;(sk)q^POnB z#L;~}asR%#DMb(^m)#x@0%j`(7c9ht5`~`wv ze0P*c)p%Cz_h0tOti$SkkxV8avNU~B8*?QFtYB;|QYQJ%n9 z)0&k7F58(D4-qP^mDtYXaC+=*Sm$d_S~cWPFMvi4udt^7Q?FXhQb2Q=`Xgk>@O#lp zzrHKV^RQ<=sS(UKMap%swOI!K9WML8>yJ1U52@`ZWYAyiNbAS%gB*T$)^(fcaRa{_ zjJEH@jrwz>lGg7R?pg1;*=PNP2p*8h0c8X{cB8ec0x8eNH4n~DW-tY3CC@%_zP|(o zxCMM3w!80kt+!Jh@aly>>vT^t7o@uvP_Locj&B0gPa8TgLlCwS)EOgkrWeeVOo&u_ z+H+K9bF^-3VszW%hNKK2P+AGplNxpURR5wQS{(a%Vnk4uO2^af9Scuc93P`=XXmR5 z3fJV+f+|=e?pTtUqdxmh8?tX}A*$)Zeh7^fERa*DU+DktP|(0j0Y8g;^gOiwNwTT4 zVd3ugnFZOd77@_!J3|xuTX^wj5vQ-=9HEQO%%H$sq*9sD}0!vsEZ9w z8uSX&^P+#eT_M#TG7WiP1pGPN8J^6d?`LBA082XJjHQ=!Qe{H`i>?}@DU_1-n$s|y zy*Sxz8txa-yxH!VuJ!qiRN4yY`-)4s<=T0B=>1`Hj#8BmE6p$PMVL=<>o@o~9HV<| z&yC&E0_y5PLne^HkrDZfMJF_ro8BHf@>%ti;@^3+LwSeoI;AVx!f^^fT7rV?LPnZsh?wBn1>2a7A4?X>%9uk zb9uV&`n&i_;b)1WtU`{c3B&%G9%tc2-<@d zq(k@jdMGFprer=!W1JnH)FSQrE1h550T%3dKyfD@he1MdHaF`v@lYL}IifwC7&dWq zVV~{gaEK6Y?O%rQOl?x6GNXLx@4qo=J7K-(JMV7yvL-Qt{)%uT;Dw3|`GXjvFR@&@ zuyok=cG|~&>`eSQ#CXTi!XZzX?yJB*-8`VMh2H${y~X7VF+W|mt0XzY@tgP5JZ0`YRkmqdIxmpzr}kTUe;vx%d_R zi%DMr>9n=wy$tHd_B&lMah>mKhok-K`O=EMz;zVu;l$Hz(1x`X60>_nz!=!gq@Z;*w zgjooOS>nc-u>&b0mLGOKesXqi61wv~;+Z6WYQNoM89vBP%5Espp^%W@eAr zeJcm7yFup0o}t>6-Rh3@g^c*7WePUsszF0B{#+qO*}77D!_AW8xvZq+&}O(0|Gkv^ zHDL4a(^Po0USZLOz*qwO=QUMw&(=;utC9Zk07@Qql{$AzV%xOw9lmxwBzRD?il!r)+wz0r_##HPHUvn(kRFD(9>7XY^*HW zbv!c~2qgtNI5k&^)&}TdbYLeCAk0ue)z;Uy3PGp&Gs?dK$v7?fL@!%HR|E$vvf$h-U(B)E4$Euap|{1^8+=&^`V6#qzkHm=z~d1a zPp{9^7_q^f*sXMIe(N)QDehG%-G}G`U@m$bhBWf&98F}R@j|5g@)VA zue`6ujU~R4vz0OEZ~mF+ehCRC*}d_8IP{e(f?LLc+65OTXuX^#f$b#km&$RKifbQh zAk}k~LEQ>pA`Lo@x|vU0TQBiu5tuq*^w9mE^xXx%T$Ys5;ItuU$DC)-(MxKI2=po|Q*`lghRwx=Bc|Lx5 z9HVYGp7U7-PhjaAuBZ#L#QN1>kBniP5@(jukdOwchXSoby_*ILQ!3uyg%egVlp6!> zojWD07IG2XzekA3NB>k2JN?msJXbt>RPmF!Xm+%8TKk3Pi42$xg9cHH6dwqaefWt( z$+HFehv{jb>FHEveu7QQDd3=l-eN|u((JxyKZ$AWF&?{3658z{oUCCpNiCpqXT*{e zkfM3V8ym&4hQW0oWOY+NG5ve~khgrR8<3=33?-ED)yZ=%Ce&mQHNBP=j1Y@^(IAji zz4NbySXktG89W z4P(GF`{x%8O71QS{(Z$?y64wV5Ch+wT*-wM1YRLbkX#G2J2lw2$-Yh?2at}!Op2t1 z0<40r5*|+vx|5?|mV}*b^wBs1VMVMJ{Vkm5M5e%Yi-9&JBl#-_u!|=Kc@{^dEA;os zn5Amrj?*mGP{iRLhEn7sLQp-Vny0VX8Px(`vF)-}c$kd#mmKL#=-fAD)wN#fBzPq_ z+iO%|`C-owWw{zzC}^hT^kYj3hY$Zg?CuqU2xBrG`Z{bpSDH4W(R&jd_$;{QzTI=o zNG-~_O9K4!2wgwtArPJ9SvT$tgb-yPPBHVRVXk*JKV(vp* zcoO|N>c3~J3Q3-qRY4c(CRV#V%*qIs{%WY3DBuQlFxr&?#9LtPKqWIsq|RWLYsgeD z)XcLr$-(qSVi>26nE2{0PH;$JUVr#T>I*Sh!Pp&?aMsC0VPX*~o0Vvr4T@Rr?Z=-& zgm{>aa^Xt3 zJ}A8sgu{QDBYP{_6rKCu3}f19a(oEY-BIm%FVFRXEPfl-=D^c%3p4DhlkZ7buU@{n z<@t(?+bFuq?O|e%`bBJDiTF3*lyvV|pwEa0Ja7(hBfT0~woVQ$ldeKJ^79s8c9K7dE`;pRUM;3XtoJa@j&p9@dlwLxZg> zvBY88w`GfJhe{cGv6h9U%xIz7zHlTeOgZ zdhyf|`%QcmfMkvZeL7(Kn&`{e61k^IgSo<|iy%@4AG#GWgl4sECE5%l8HYP#NnSv0 z*h_V%`uhT3=-G%R2wXvmj&KT998X=;N{K#pRS2UD<_4}7p`N#H@pLkMzDvT#u68er&fnQhQCrKQ&iJ<8e6u zRde#VIKpVLB?Tr*2@;mV!NLc8v|CSToEphc9NCx)oqqh^O!QBC!3xlq*OPZ!C5X^3 ze;@}!b;7>~|K$6IK2~wugZSvpBm?e5NGqD}>v#5p14((`g;pzv^Ky>5mz3w;Si~(b zcwr}pK3V)lt0vtHK&3G18caABjc@!DlGo=$CfuY)%aNF>{P+l2P)AR8FKHX z@>!oe?5=q(r@}1b7!J|b7)^Dby?gRH441y?Ny(2lVNm2lHMIqXp#zh6U~3Wk-p(i- zge)5L+pziYa*32rn(BY}jyDC(c5OxmW;4Ia(I5>e;)fcyD203IWaz!$2ecOC668%te*mcuCL?Vwa);ICU>!T9a6ISgI!>7Sx~+PDjBD0^FJW;s*~6 zm)dMB2NST^*h2vd?HxIcm&FB%h5z(hd*IP@NoHtZAb_guy}!?f1ns5te0XC%ubR2?->$eaFhdOnVRe`deWuG z_B;-QYqoxM-z>u-)PGtz`G!opBz4NgWD*$JyNHxz7{R|M1SPL)lwA;0{A+*lr-FFF z1^f_5Ga#zMNhe%+bbQZ?I7AcSbzK959Y5j*<|wg9l5K5TTbm+_lE}$g_*tYP3*Ri_ zZt@GCC(Faw6Ziw?VHkIx{eKXX!RzC_05=oGyzoXP-*P=*DhK&o8p=ufdHF1}2lo~E zQoyH(GnFml1P?vetR+yu>Qu27R&S70-Q8zXi1=jY`)NyZaWBN_LpGOR(-BrV|BF>p zHPjy6IF-h)fAc*?zT^@ zBQp#p;a@}6n)AzD12am>rBszqN!@}r+I8(XWU=d`IaN*sow@t-Jj;~EyJkZD+1rNO zu(2(^8A-f@OkY&Qndu~>Q60o2@Ecr zKkVz$!kY}6&{=BiMTX)Xk|?}__3JJhJci3oD31#EG z=3(2n4nJRdpmh+x(-V#T0XPw} z@g8HO{^F&6#KK5OSLu|7Z;jEi>!S!l9GwD4p_okcNJ*2r{Y3WyRqKO#b98>2Ht-ao zvv4l>0^D>G24To%B}a2zQX^T(e=9GSKIJfsA_J}CIurJf*LR#UP!`WJ-;;;a({BmU zi*mQVk^V1aFkt~Ehv*c^)|oA?hu)+T#LT1F*2^Vk0!d=jL(;A+RicS2G5wE&NXd=- zVCk0=Y&{o9vFbNZN;cc%{2Sjyf=Pe}F1U60pT8Gu$X<}Hkrhz!qkZE-3JCMDN#^M^ zur$Gk&s_r;e6`FgC|U=>Z>fxc#}$KHi7KiNdBdO*LoVRhr+c-eC*&fQOIm#bqebOi zEuL0N#Dxsv3FqITmw)^Qt=i$})Gyw7Oh~4kp)@deTpce4IT3&jTo*mrDT6P@LY~uW zHUgQs%}6xXF(1H70Q9l`N?6=rXZ^d{*2 z2Fvls!`HmE^)71(5=lYZAed9~6IhmsK8e$5L zu>NoqI1QvkV~3ZDBH=Jzp@3Pc%EnCuC`+GCu!Uze^r{l|(06{W*XgU(=yc;AV$5vYkeEG`Dh1V+m>)Ginvs5mL#@h}! z?cHTjZl4UA>b@h7PpPqTkCP%edB~&t_U6Y6HmOi|3N5S%rTI~@@?5`@URx9|zYsh? zkV6SuezpKN#(qxrlKqNccyxpbs(b9UJDqc%`Kyro27f3I3*Z$2lm@loQw!K)K$u*tT(z@(Iz{MFMnC~VP0lMxzbfxAZZlxXK^+4d@Trm^S*10;zqq-qaqrtojQX@m7V@YW}p_;!2p1HlG8S)K@PX| zZ|C1oZ4(lVR98euF?Q)IVdD^Mel8;xYPrEIqeEd)yy9aShg)F}h&sUzvKKRUl|%GF z!Ak;HkPy9kD97R9q4>CZG7c?ti9LSWw7V)@UG{z7A%`ePOQo|#5U;hub%ZO73uT~aD9(CD;SEI zIB!;D%2fiKFS@~^(|=J2FEjx7!9rjQEP4oUD{=lszQpziE=~{cq~5)DD(1oMAmjhA zM_+pEVnVVYLIcUJ7&U)T=m)iJKja2#SRA}GHFC1i)nxe<=$}*o2URvJXaL}VYBH$O ze<7(;D$E^3RMjBk)u<1?`=*fXW#h8#z7yuEN#E%NA<#ph>04$G4kb)SMYD zLG?ibz)X3&6<9>zD41mUhqQLRlekIMSHi0GJZjSwHN{A5F0?5-c(t`ZP1 z01;#~6lo|t4?seiONcQH=V++JP4o?}5}V9+9G2L~XZHiKhZNdD;>+-*5X^GapPxRZ z0%fbs_8o^{d%kYqX#}yiSIz6?d!`kUDG8_2ed5kP5;;I>4atXB9uES@05fa6d8XiX zMyjYRl!KdA3Fn8`*4tS9+&hiOk_t4VhL9g8x^iA%gO8(D-X{+rt{Y*&KQ`x~do-o{ zPK=V^(>5NM`=?%r4EoGzSr3oL%JONTFAM?=N|_zj1c-z{!~2Hg6WWpVfsD92jrHj- z8@}Eg7y}{#2FML0f+E}#KcPs+ArRq&hakR#B7)Wte`oMn-30%I`v)JY+AxKs;rTya zG>jO7XOg@Ymo3al%{N!hM;h9L`v_&>7i@)Qo<>8!8Tw&+N2n(;gS6`!>xMq#-!H_t zO6&X+G7bT-Jm9$PTlm8+BAoKVA^*{6^>p;m4F`A{${uFqmQStPg9ZeoI+_>L4f2CDL z#9F)r&Ts?l*Rw{?=oB9y2w}eCX7@r14tLSQDt=(gFzTUAIf!5ErLO$_c6E0eV`AVe zgmwb27mA_(N&Da+_2a!5_#ey5>vQLtR!Sas+F^Py#0T)0$0jU~*1u`(2jxT5`u$yf z7&_fF`BlsaoJ}v*{O?A3LjX3i<1yBI3<=WilPC%!tr})6enX0^L-G(tptxoU{?{rb zXWpM4`-sNsgZ)kDB?z(0*W@JW$9A-_TJqE*_K!E)vY<6!S@+cuA_-Oj< zNCHv<(@|VOEk{p{6M+MIh{GJ7LuM~kUN26VBc%y;SUnD&1F!hU*86Xm+4V_^^}e1{ zkFO4Vfu~{JbN>B%-VqSnt%ctFfFdL}%m6JK3ET`1+BoD8C23R&6WT*M(#{7+eKfO{ z4c1L>_fJ_9<=74ocety^aXtg%0sZwwpW-HerhJ4hl*02S0pzOmuMq}1^FP~IB{dxk z#RrSopRKyjH2z|c5^D**qjbE&$0`$aeE$V@@tj?T`b_PmBYh7iktYBj_L7fNWu>6P zz2vgN6_6q3a@JuZH>Ky}_Al7a`WPR!BzHf4!ZfiO{lgkl+R{gHr}dX(;Z0pK>~P%Z zc|(c;urumGhK7VU0syfKAec&c=l^KB>Y%pTr+b40cXuf6@ZwP1-QC@-xCd!*E$+oB z#fy8fQrwGMaWC#)`kVRwO(rvYpWJ8VoU^+Uy?bx~A0!a)V{mElx;@`2HODm7SDny; zr46fqi{Qcxx_n!(f*@9eKC`r9fqp^&FbbRnI9$vOx5L0G=Kezu8m=T^+CCJ$0EhOc zK^JGljkF{6l0n~0Y)c7uw7{2bSyJQ6IV*q?Ot1ms>X$_QNl>u(;L^Ky4YX>N2OhQs z*+1@1?xIk#b=u90OSRh(afC;;f-{Q{qbv%E|27hHDDA~2y1HrmS>T+>RyZ0R$Qd`YTDMXLX9+yKBn|L9E1?UrSJavk{SmZE6Z!WC*{0Ap<{S?FbPz-+IZU$(wcFZFN5`OtW-#! zsT^==LE)PZ>`|_JnF^mh%l}g0AE<{cgsHmRd7m-U^W+mn%aPYbg zRg$RwoWFw!2@j;Sq{h};&4kp6DsX%@N5JVgR3U2FhPZ=@!RPC)&xK3D%r9}@t-a|t zWkQztrYNWZOu;$q(#K$BuJ0?Se;;#6Rsw_m?(Mu9(I^>ee_orcgo;^(8MiC^K6l?Bsl%5rMqrfA(y%SB(7@c7oduL2PKN zZ)2`u`GvkCxDzu4JWeRB``F+j|BQ=!iiu&MjOsW*EGlM!x3bp|)3?G&YT}m9`Sbpq zg7K$Dq4U}Jxboy3*8^%<+oWHi^M`YfNk4SE!sJW5mr58&TEx!_uTQfS`6lfLYQwi5 zBe@jg$e9h;DjVDT#+5}k{@xMY8Fn294WuYk5J6h?Cd>4e(Sc+FVkDHV2WQc!_hi!1 zy`;#YhwfzW{4Smzy`?!3ia#zfW}43&`}mwM{+Xra<9q%3G#=k`v|jIR{%J`-IxOqr zjGeFRw!Duk-Z`HS;tbUAc%n-Cd zOwI!H(lL1W%oF5kzKI2#QyH;nrdF62wk-)rt<1HYp9RZ~s%CI|4aoM30+}sW%Y)S5 zv7XTb_Y^}s9#Empl0n?=V)Gn_dQN&8-*#G4GoS3b$k&@Elo_0uouUkVmB+~hniW|` zNv^lKHGw~E#7nHXgkFwfIMjnih9Hw)N{a9!)*=YCVazQj0|X_?7jsAvnCc$1bYtu} zsfL8=Widt67WqG=JgNfTH@1Rn)-^k~BqTr(TR<$}q?}F;(HOj^NZ5)hhEQ?EH%N&( z$0HPJm;HFVw)VvL;wj(h`Gf!&4CruWHJW`egQrn&mr%J$EG=k;nPb)i8GG2|Zu5F@;v87{EZs8PI{X9= zotE!Bk57Sh))2sQvBa+VPlCqZK^iwA!Y=iGwq@KM%p?nM^l9uwg10J+??SC5C7Mqa zrw}{|kEY$^n~GSFW4+Lk;E{jm+BETnYPhY)Zsx40qwiH)e=$$lv_XlJYG>m}`38MA z*U{HVgr3*>wKji*Ef#;Y-hwI*eh|^JrKss<0P)J?;}1qMg}`1PMA27x4%&nVMngnDMmRRu zD_US#haN#1lter|jp3{?L)zDp@Wy8u%`W=1kxWpWjzuhr9KN#m#Ka@YQW-^5YJCr8#3TUB!Mm;6XXsWr@>J4_rV+(ufz& z1#kgsp&wJT(VHKHY-)QFp50c^G7`xi0`WFP-}O_nX74aQM&(dEXaB%2@>kD#3yGO;s%gFM z42oeq5I+Sy1neFlte8_irF*%i!F)q(o zWG@=~K<*hPVEDjwTHF?RWArMr^E$-Gt#`lS+kTHBC$x9ky0ukLU0_Od(+BTp#sk~y zu)P=AQ$~rLrP1ee;|-6q-rl15^5-RoYqps#CpjGJh>jdn(qJry)i$AXM?L&bz8YPk zf=eaSU=Yrf=JHptLnC9`;HTm!&zJ%WYjN-bjxW3(OUBsfsD@8R6;E0ZF)8hw3UR9k--nbts0C(MdBeLY8 zmN$MiOk@J|5;#r+ZU^czyy-iG-n5Ieds<3VX8Kx}BpST8&54(v!+q@cDjH-zb$0ij z1gc0$8LM=fs}@Ef1DTRkfACllzNki2GNy}*g7m~Ucg?DtcT65AH-VUd!{ znLV+r*-$gYfHDt)U|!X$EyZuHC-&pYcrG6xZ||M~phV@j7CR=YH+4}BkRa?J%Su1! z$zoTDZmz-tP|~zgE3pBs_-!X$oluBkPM<_qbduuysL|i<4Zc`O5xS>vrbVkB&<5%V z={!1Gg(ABzHs_W@%O?dAO z4UKlf5N~afOsi{T0FVDsYfl8A$bc@KrB!D5Rg!cdBc==Xfp?>Vv}Peyv9{{ty1lFMDt_WZl^Jo)ilt!+vptF$a;`s3(l-0y0Vvpjk>{^QtdEGL6tPyoq}d+d&A5zu+>diutz8(v z9oH7nLUupY{EcWv4RN#eS$r3;J$>Z?=T47Zgu~?{b>FDK%G%g{u1LS{6vK~PFe3}8 zTEvlLZ`|m4z3Pq^IkvMw_g^`5#58K?c%rRQXO~@Qq|#9O;t*2CT&4~WR8e95Cj<`= za+^*rR>ETLSaE*nN2!7rhR)x_8{j%2HHlPiGGOyiloLvgQXO z%}NiTWUM{dkRl|pXQ5?M0DVL7#S7O#V$^w(ST;~{#D;1Bj|GmdRxEA36N+*_(sZ&D zhEyN92mT5OR{C&*p8m1iqZa-`=3W3lx|C$)cgYD2trtxp4k7`Fe{w)6?JM?k1i3lk zMFIbGEF#&a1&Ba8h@yyZZ}s&<58YL5{B5g@An}I_1ffTCLay!Ic$<9~HzlJC2JK>G z0AG@&c&4K2KYSO*#V(bZFL`Un-)bzq+58XQ+TEPfcVxHadmm*_B^33A`e_vWdJv_r!O&-4!SzhTrY1Q5cSn)}Hp#DJk zZQx|kAFfE#8{15#x&&LbN`vz661?`sc7RVim?tlQZ*ZE}%jU-kYtR)1@v}pdPs9wK zrrZrsM}7l#;*sL?pyGJhIxJP*=Wc6mQbVlQd3--^&015_Og4Z3E1Ph#7H#uh-)8)HP+dDxR0)-(#EZmRX_Rc=p zd3v~7$M5npMW%(Yq&aadsSxk9A1e5_M<-W7W(X>)%TrCXOIvsQ3i1U1xtTwBM+m4D zNS9G<^B-k%i_7?Iq8js zR@DNawk0wHxAq!8TK4CgDtXW42e}7YNV@-^whA_INykx*U`fV_rx4&~Z2w`xhO10s z2yQR0!k<74ABjpEP-FSnYx-ZsS9r+%zQfiX3^P_RX@*F!^J#;c1v<(v^Pf&IyJ5*_ zh0y}h3xoxc4BX8pBdcre(j}VZ>@X?Q=we!D2BI%}KXX2D7u-3-2zTrJ3VK@^?7?5? zzGkBQD-!QdwT z3}tkEzT6HS-ya{9Ht0C24B!wJj#nXF(EmSIGAa6JD8)tNYH%s#@ynvY*5GDAa*Jaga`Q4UW>iu zKM10W_l#63qz=rp%PEWfcWVQX?wD-cJPt00j&~igJKI3r$+6Dou9W(j7JM|y_SJyUPQ z`QAQ*yPkd`4QM~;+ZZ_MNyJ#tq@eU^9l`*gnE)+mzm3#90KedoC$h03*~$Svg;m@R zsZ0kjfSJSI1W!-QTRrtneF>rkdra+vrFV*xjyu#4ay0 zz=y(R4lVGMf}DO=73Ab8O4Ddo992EyHbU#oLB!@^Cs6P12l++jVxf7(c; ztLYV<{g6fPvrfmJvydl(pg3|xvF7T!qF-QW4hsyt26kri_FakVC*?{JA{QpR??~qn z^m=o6!~X8;WyADF-pj-M9WVC7dt+L%XGnMWh49ZWR%%;ytVog&ZJDeM_2=*}0*o=@ zh}(+bx6+1Mg18`=J7F-|(9&v)upkP~8pqZWj`D>`_ZFHz;d#12K6hk| zS7Q@9adP88-8*PB&x8njL*4N8Jo2b>8_G+<|Fzyoiwk+bhm)d?EXE%cYAlA zZr?7@EoFF$KTYG0aH87ds>4yf@&>Qp{EKIB!aBaB=#yKrR|=BqG03 zFO?0c)eow7f&*ibh@Me>2+@a_I27-&BdwBxnHyvCGUtx!viz8PEQg5IN>Kpj&7%_@ zZYpWcsB^Q+hCj=dvP@6iBVpPgN@AnDF6*s4y;Z!BAjJl68m&ZZNi<2N8~IO1$(U%g zRzWFR7!m%!45FMRC7u`kjE*gBs6P-6jitn1gi7zseOlOEVv2KD;j; zdOuEz{194;8T>ra^fTYUU;GpZYjTeJ9)oU;PaIjHam@Zv*z@9dfh5%vRl~=(z39?V z$y8hmfd75{3sptD%?=oALFX|?{yILnjUncX$q{K`XOXm0Yv~6BwK<<$b*4?IGY73; z1#7JzoEm(s=4Q3as7&FXp7;+Qph@~vI6gsh3PT_4l46!}Xp1Z>6-gP=)0q(>o)0E3cOk`TjbU=B1~*l@p&MI>v?Hj%bvl^LlHKesxqAtG<%nSMA{zf1a(&i~EZ)ddYX$ZBOwATL zN*R=K`gZ-9Kj2%{CzB+f*julTh1XgRh`4m@nl-LnU#DYd*I)Z@+7W#4%3$VNi`cQK z{J8+!K}vb+5AaMa1ZIU=;BG!a3TaMkgux<(ZY_U-!ly?&Y0f?(8y+_l;joUq`09gFeCa$9Z8`ulpT8PWMK5#$z z8ry-3*Ag>&I_*GDitoeya!`EO_{nR5%Oxh!a0``8JJb9X6_AdeO15u90JLnrdVtD2 z894u0qp>u%KpwGZUogshb5%1C&Bf{%)e3C-@2|J>l?OG{TROK?zC^|SeW=O**pD#L zVFY&&L2L|VW9Czbb0A1ecQ~zXad8b z;3(qX@~dhz!T`WDJNmAusWk>$ za>CPn9kaMa_lb1&=GVcM%eSZgPqF{Kw>`-*vp%EFq8*K8@6@{M{q&neSn7{^-9-Ms} zU4nvxS!_EDG0~X=4IVu*U%?OsBeQJ}Hdr&kAoc+1`rLX)4S*(Zt16WtK`Q{iw-im6 zrK|O}z10ZWk3VS$#m6ML*zw?++J9&l&lj`831{Xjb&3NR0uPNCyKqI9!W{*=7Ev`I zgmM4pV&kCnf~T~F)SPb4YTcLfMbWDh}`R=5xY5lY;jU_5g`*NRolo?w@Zs=6EeWHw|YCIjn+N-%|xd@K8wTlDISM{ zw(Um9E5sr{tOUi|y+vPJ~{ZvFCX$A9RLv>bSgOsvPc3oj+j z;h<`O@So?DNks<4Sbtwo)yjM_0U5LDE-iMj9d-?y^0}0w7|&jGd~2gHBC&_R`^E)i zP6__FkFn^^5JUjJy&q*3iPd3>!KSq}0gGJ=%$XP{kWy|pP5@?mOdA8Ot!Iz$he(6& zZ3&)hTi>?l0}O8Fgx!eqK~pAotqMkJ(2DL$1q+D3j8(!n!}fTQ$Md-&V_|$9I%wiQ z{Vn`@_pRF@(`(=J7m_{QJ72+me8@1Tpf+D~(Ev7h0t#kUz(BBF?^zt5CAqo$qZwk{ z;qs2rMe}x!>2m~+YnTJ(3{6Tcziq1(;)irJ9yirInFy{pwKDDC5yEYf3tQ%6K{G=g zXlAH`qZD_`zT9LN-E&BEk^IHAlOyEG3*|bF$nlZy;RHHBYW3FOCSecyU{H3yM*8+> zP$%^_Rp#UzqFce@w70g_XXyFMKNN5U?&`iZk9qJSY2h-Pm7z>t#(?)x|4x;aFz4sy zU0n;^U5_cR@f)i>vvOsyaM&7d^oa0pk5gR7jWW9Pn`7GQh{Y<65Z$#ucDr?$!#ujxSCeQ;u0?r;0_^*r*= z-l)q-kM*>+557qD!{2R3;^3TWTkrbq9pkQy4ZZ_1W7oP%1ys-)&Me=da(sy5W_TJxR_BZlU~?QbtZTT3TEQ z?=I#Qf}gm}?jL!I-8v%srXs@A`wl2pxpy6*S{b#WEoSgn$l0vKLA`9t2J-8HUij8d z8pucEqi>we?s+4tk%oRDERF%RZe{Y~+Qaaz6mhm#r#T%CND$h=-H*CPT((dd3XP;0 zTdg?35v0o>j+E=5?G%YicHP7EIIEUErZHdDK&J@NOs)|=WZx%}wDWBuYclWnhSyxN zcFdU)%!c4L;TwZ}OsFSAPXI`G3*l#{PqnQYCKX!Ka09fwwCP^7u~%}N?_m~ghWy}4 zIFeygaO5dJ5=8@0uLk5ICy|LQ6BU&g3(~uq6n(bMd$Keg~FdKp>VIcplcxd#x#+5ut^B2*YG*sV7Z!&`_AvGMf2P1r9IC3=>bn%XpDmD>1o$4HuEnexLEOzUZ$%`E!V(2(_x_y*Ph5V*$3P(Q5U;^5Xx}is^z6RL zFppxgoo(!w!&2f5#HOJ8G~g;9)-tl^c`(aFw(we^JK2Um(6fo)UaFQ9ZxEH{#FPu6 zNAMMHwqu&KXW`(-mBMKem$)~bcwXOXsnQHQ<`#!q%g4p?P*C+p zdZ0W2q1O<}q6)4V)R{%&s`NdQmmFGgihuqf8hw7au<|)i`aHB1ovZpzWlUs6Co{%^ z)02#elREd8lyE8m;7fFrN@cE|f|%POP&mlCzH*b1?9(06VshCE;DF+0ne#O~pbmCW zjR8C%LsaYsA6&xbtC{EqO)bm1ugnth8HE-WRbQ1`SP?9h*9KrM++s0A>L#U4Idp>-%y zsA2=(feL9~7a0L@hR@!1Dw8GhI6`*X9>#*gvHo;4RPutOcOjt2&HAN#I%P;=g+i zv9O8NL|{w~J_+;8u$Kt&j^SsN#=79nBXES{2JhzN2Nw5e#{lV}3<(yByeQun0?+LYd>n4zrMIoa%?G@xCzn7(a>hnudI$-XxU9qsiM zPt;3(SHnnAdMW)cZgkQ?$`wH7;K?CtZp`*?9f58aV+jHIf6{PeYnr}p3&cJDC1q)0EVsyF$Mmk}L=xo@sKwH1eu zH`iD9cTtpE1noJ@vu!wUFbG&g-Le#+5sh)Ga7jV8ilDY31upvf^SwkcZPT zV}Cj6hIXjlg2XQJf%zDQIP|x~Y}0LQD_}!Y4i^YP#^tU-mY?=vun=QurB5%F+N zDO65jYu!txUr%dJ;JY@aa6|vzT&EdozCpu$NooTfjk9uZ1CrRd_-X{C8Cc#LpbM?< zN8fx0!)EbASP473C6qwrPT}1ne$s|tSM=N9^%%7c{a1#1F%SGTaG?e?6Q0jWdU`)| zav5^jv!`~u^@C@v2I1YtS~?L7GbgO=k^<*Z)I2GG0!1aOkcP%kA(pR0qZd?O{W8K~ zZALW>b9}G9){UvgqmJ~X31=o{>I))W45wuc-zhW++OpgIJHmioDI)E5MfroY6kT8S zkw2>x@go}Q7D-hcoFj_D@D=QoPf)l9l9ql>0rthqi~*e9nMor4*7E<|aWhw4&*JKD zW6yYj^CNNAu9%NI-8+jJ@f7K&wOarn0FbJWU#*e?HD-IvKv)^Pgj@R}aWb7OAC8|)-}jAF0D;Tg0ZG3!wDbumW=NqF|gai%o(!ho`lG(Z-EC_n;M~AisKR7 zynPKveP7nJhGa$$*=QO3P%p=%zwtw+`4)Q)vZzOqUzD& zd80evsEyv+I?vf%SL|bP<^VgRi91V^c*jjY0xNbvVBtw6HgK=iZvhTrhiIdIv#>Wj zEJ$e@JSkxrmTthkC)yfD*rLx$$t79F9Ce{IdI!lzwaUrbV}ygmihFX3CoFR7|4_NZ zhQU`DqA&gI!JCy=SadLxtUZ6Xn?oGrbw;4S`eQA_l~BNJ-HuFB1)Nl2`928I z#%+vXJ53WBE9M7OaC$$>Ka=&Q`F}Ff&Rt<{^c~G_wl_?S-drMjC!cRB_MZ(T!WZX?dch|$ysrI;FDAfF zGbMeqmi-h7J!eyEBsUBbTi#7Zi_RhivHlM=AVw2tW!YnPnBgRJfL21v{q>Sk%qTk% z4d4Z~SnV{)O&7($QWy~b6fswuKZIP~(2-eg!jNNl^Xzn8J-Dez%;#iRj|q%S$#(8Z zZCoyUkxN1@-NQRJb-1aAPA{2KT%6!bUM52Vr$yL%l?>lbQi4#oJhr~;vUET%1^Qq5 zANDg(CAW*UK$|(g%qEufc%2uPWpV8}Hs9wn?bSV0njgJRI?)KHR82oZrW8k+NjGzH zg=F7Oa0m6WJ;vcTBS4g>K(SD7z5lc+su>c*6?h$Lp|vf=BKR<3xjG&}cA7bzKq!D| zM?Gp-1|o2Vy87XNNQhnLU+l72k9H!$E?N8=nL@vE4&o?(293Av!Pq?UNO`hCsxTE5!BGu>Rp>}%)5Wul${jsR zeJ_E+(`suGwAiKh>nsa@D{A1mtr#%JkY@Ri} zNDLZ*=u-)E$_LGTK)z~|kmAU$Yw_?lz92W-#zdESE*BPujQTHIQ8rf&J>5+qH!zql zjnKU3?H@xYwlRh)9a3qzIER7slm~!eJQ*42&Z$VPHx1vh(51w7itg9Uyo7}SE8lI- zCRh%LVQT0k5NzfIc^6}m0K>xBzVj5U^~du-%wz~?*@Il7x--+0zjro6nD z)`WvGe6yl-l}grHwuK$o-jO}}fFwz_gS>I6@+&^DUtfA!{@3p!l+vVPfOu@|#`47K zODf_<-JirPX9|*~@9fsAkLY9DRJRtC5bolkdO{&cK5!SYmR`H-hY#yJ=+kOdlTXmQ zt9(xfn;F;*U&QI9iggWf%=D$uA%GZU{sGFUaSwy-+c;1#t`_|Y# z%;$CTh$gnWHpPfucA?u5aP5WWb7;(cR_5_O2x*VdxS>4v0ld1h+p;AuIeCB|o`v0U1S zs5&`??8Cd2eRKakENTQrZ~Pm&pY$}xD-1m7NSJq^DcMmsCG+zAjo_)Ca=oZwnTO+(%hui&3gc=2n8E)> zJTOg;G+Ft0pC>Z_@L`6wQ)bW0G7+@)C{bPP!QosU(3^g?3hX3_x1fS%iQ1B|T^fUL`O-&E36l%?DGgI|<>~moev-W&H#$N($di;TBjzq1@gxfh{ zxQ>SS)!^xsf$JKdluH7Qg!ex5m~{V@n4ibGf5QqbnCmU(oZyfw1DY+aDg>}5Jl29lMs0tLk+X+$zM!V;PDTumvB8qZ*l4YI%( zNMR4TU}y(*>=3qih71c+BTSH3%ehH-NNyiR6hdJet$6R9n98vKY+SzNiPI5m1{R0a zB6_uL6Sx+)nh@yo9Rk@x-ctAxb`>H^48PiF6W#ed_)(0r7aP;EMBp_=2PT3CBLROp z+-)P%U={j}l9O_@p4i8K^yBOmI~|KHY-|yalrV?t{P*7MKlNu-ail-_1de-NpK}8` zt?ki>2+=nKsE4b-B%nn}v-~~hx^d{;327Q$;NcWvECmzx@{TjxU>_{YNzyKdxoZRb zdg&92w_fr08@nvoM1(>ge&8Q3(kj4ffyAaMh!&k6q77f0Y}eTr*9np?h5bssmYd}y zJ(aUJ?TcmEVl=39&5QO}P6|#~o^zdkj}`Vncjv?=&r5mMs)E@rc5Ov9czG7d;>DZX z^A&km>(DnNL0VNg6@QGGL%?)r0L`C;mO@k+_C1TLc-X~t*C)Jl= zalOEMui%d#>TeS2`U)G(FG=dCPxKA`m|ndi?wwyPIfaI3on;^8go@;je-}`d4T8oTbTWJD{VKa(7L9gA1N5A_y^|4Sbtpzb4`MWV2_0I8;L#nz3p=E|94Mm^R1LH(Fp zsHM*UXVkq&bxE))u`d6*5aYfiWR9D))L@3r_Xtjs5blBlFdm;MhcSVefJQ32pI1#M z9vp1dv%!7@kS~3hKFF?GArjPaB!1j7~G_(A~D=RBB0{~@kXk&ryKzJ%CEU^Jejgi!CM#*Yc}D}y6*;dNcI zMEcTN_n4GCeGkE4892#6SPNU_w`g?iEqyBNd;zGCs{0ptN&Pb{;_N%ZyZ0P7)P)q` ziQ0&%43j75S-?@G&{KG>z=;>9L-l*DO7t<|5hb>iUV+b6fro4~(O-~c z6OczXUf6VnGhg;|1_u$0>+>65&9H&@U|aF(eJ*<_BHTryY}VxkLTY{uiUN?rQ3IV) zn=6$ulf#@;VGgUtUF;oYfU|WqhRv+3CkZWwY-iP!Mrf^nlPPXA%OggF+txfpyxE#^ z=4BhYGFsY6)xI`@-TRKA-F2$t&GB9=0=IuSD%H&E##J23QdmS(;6nGeSgxtS>QX%W znGP?1bXQjwDXV{lhkTez356d~xw9SfE%E#?K^G3zV4<;gn*QkY88(wMiPoac?~nSs zXD%dpO>`9puU0|O_h}Mh*e{AVDoT}Yzw#XnwZL(5F8SY)fBemyjbvja*~^oi z(dpJsfN5TKSLj0pj_oYf+`xkqs{>XjPjxa7Ky>)Fkv-NmdHL z?wY_NEJt&3rv>d3(lwR$7XyNUS4Mq9V71_Vvt0`2-&#~uX{R%|Er276DEvF>un0fO zMmX;IeVNspnYTrZ0I6SoxAho1Wa{@%_ahoI?*BTsXix$hj*mE1Q3DwN$|$FqefNHm@{ozmVa;&JI-on~ME$;C3g(2h-n+QDR0Vus!z0D8Zsm-Ff3yA8` zLX4KNY*tj|9QQ|df#h@Y@2#FG!H=H0wP_)w*9%Y*pqs#97n>`aN-3$gqTts#CRw?> zn32)HCvHd4Z$NcpC)~7x_y2m z?H6}^3T06P5IMswM3r}~{=H3osRhjYb+)?m0kv<6)CLn>lW~_f3xdwE^3)zd9Lft) zKX%;OZ6h%KE1y-;v14w0<2R)J_GOfmfSc~h0JOACplxBY)oacz;uFUn2a ztVxn_-b%U3Qm2{jy%_~u6&k}Gf&tDryf-KxVVD8#s=xO!X-c=d`~1u=M<6Ffmo2|g z2sd~EsgQ%lHwdbH+xx2Y`A+4RF(d#*WPYaUN&Jrl?$fRm18l?>0Av2U7^ceI-PrTT zx@h*!5&f!pjnLoa@i#^=eU@0;hUVMoW;%JG3n;;db{}yE!tCbJt7zj2!*dL#7{ia(j%W^+9 zGK`CV8PzXBi1LSNK*2ew4^DC8m2&flI=fXKdF|7UUM&CDd-3s)HEMfm9|0Bv0wOmE zpaUpVU6rntwg3K4#XIb)Dw^JjdvwKV5_IBWl~_B2<-rhfnI9tdmkH*~43NO)t}Q3@ z%g3Xs!)3`xHfCe?Yk0|T9P+R9=tWRcC22I*>BaYtfr$1R82+~cx~425XL+E=Zn0zk zyNZ%^@6mx8?B}Tv*=0jt0l3vqDexM>TvSu~3H7p$s~`c{{N7o45^2ti_8QG!N^a14 zGi=JSKf^eE4r2*~(U7dfAss|4do>E`DPKtwI20vVP=0S#`uXeZ_iAf@(595I_^ReC z%u~{SmN@T2!at;`@$*-tnc>=MvdxImENj)e1JKWeF{{MSVF3_Gw2A8v(Fp@Re>+VL zjSqF@lzup&HK?EXQFcAhZ}O=Q^D?_;wpen<3X$5uIu@ac@WNVoLJP0aONP)QP?mEx z@Hx1H8Eqgaa~grtZ3;YoxDGcYfqngvPwVz3D_tE=)%l4867aqLW3AX!BfwVkYC5W9 zL=o`?j+hu5NyDQZrB4qAiVa*=^NEi7>jvuVGASutMz2#vulzi2gOB*M#Xc|*DUB05 z4kWSET`cA&$^;#~om=eZ_|Wm%FmFIADxs-2Ck&?~W>zEn&z<5|(LT;U<; z{g`2L&iP^p($N&gOthA_92Jt8L|ECYOqdpQua^@(8cF7Dhl^7L&P?c%@w#i3#R9dL zP$F=B(v(IF47YU8S>@d37F^8C2>IPuA#-2ZoG7;)w5L1Khu`c?HYkDdDvwU=97Nw` zf<71Qb@?_FZrd$x2)WSc=zrort@aSOlhr=GpY)-8mE-6!{7>NSJN#5PW7{YPq(i{K z_snur9ypwbZjnR;PQ~poHbI{v_B`LD3SDU}k*M#T5C7bX=HywupC&h4j5uvJfosP% z=~fTpvhWjVo<{}>PS4u*5`DT~I_;6~j)c&oJr2tp&dBH*q$plQ z4ayUngBMXCEPVQjeM-kn8#VW`;q_rn_V+r`` ztlspWXVXRF>?s{oM$fEdP-Dt`)*uq4b?39!1K%^9|moJ;o zpVz7P)qbM9FOOfZ1Cag-KwJ~JCkbb=`>LZkV$8y!=Yd=Z>17tTpv~0zst=Rqa}s8X z>CfrG4l(#ti(&c3Rjebyc|?E8Cls&nPj}9O+|&iuv$7%P40*s%NfOg~ykQdjmsb#q zc%T4)TAk=!`|Tmg!n_K<)6$Gpj)9>?8{k&-Nh+`aZmnEh0_v@h0mZ0$684pDNodSk zLdrh+qAbstF!K$wLO4_qdNe<0vFb`;cgtPsLte`wk?Ng+89 z2i1V3A7QVX1({v^MJyo9LczRYq7+Z=ZAx}8^xt$&?a&$S&j@1L&Gz+J_ktY8<Mv_h_<%}khgcFS~A{__nL!5n!at%a7 zS^lzG(*-s(-o5=n^B2GQ&QCzn*#6oA?Kn`2OE!C@pM^4J9mivbZ_iPC9uyox8AnH2 z9hj!C{%uS4T4`jxv;doVnLDu+qF=r?<}(>rHP+a1=WE1|Rwp`sZ{?V9>}7>*C(xh& z7)Zp}Fzp!ie@$A@Q&E z2^P0K$|(?w#tZlYi}}+ANeGLo^XKyNx$II?u;5*+#Xv>?J9B%;RLAGBiGE}h08xYW z?fX9_V|%#*iPAul zWlhRLF?z9^wd^i480u#~C|m?aOrg>kA{V8zw9!Tx0Cq@);`iLFdp>8;Ww2)Li$VfV zFE|BrGOl(?w^N^4{20Wr#%HL0IGQ+524#9ari3{RbNhim7m1FP9O5ZPz5}4EA#TDq zgAMWnIG60c`B>a401O+*9u?`jt$@@dY(=r|8GbU%rUj-k>Dlc_-4bFp0hFuDiLS$o zJ54zxz-$Ixqr^_#&ZG>Sa_Sp-*H0yUa~(r!#!s?ii!uzWgvZH-wIh?Nzyb}gbPW`L z^K|?k^82_J=dtqpsaLO$O}RzA0BIIyJ) zv1Of$ikX$TeuyL+E^vp2*Y}AKiIANO`CutR-=%Wv4Gi6c2_LEo!54&7!l8kto49gK zEXug4SXy?UIOaecr-1F>?Y=_rC^TRpl9y#oOoC(-@##HMC~}k?-#;!v$KpIKMqStJ~~r z{5y8LoM!lZ>gq8S+U);;2|yhI0z#h*wT#e>P~b?y4BPVpRD2jAZdi~_cn|ygM6F-L z`3N%rTS#rO=d;Pz8Z^0HmvAevdMl#%F1?M>dekHg*M&tgg_P<&owc%%JDKa>`*_xo zV?VM8^7gnNdYh^v-5W_{44Fss*R($`WiSuB383;hK#XHnPV827!bA0MxtoYloAo-q zhd1o%BIiU9JD0M!FH)!mCybj2aZI) za~k(Eu%lZ$sw)Pf!s~D9`7C-nJJQd44)_|cDiY4TbfAeAiz18~iI_77G3*?6VLGZ6 zb!YAEAh1jtK)z-Fy=jyphI0YAsHR(fNwvWD@*Ik+QH*R7ixtF%fES+RP`MnQDPfpDd%%E?xj8;rouVsGr_D8KhRxdOMpa}xI0=hBWWO0~2mXy${LyjM9*4;ArC(DG|H1R|!rgZWTF0Rr?^B+B^FcUmxkFR91@=dj6K?IIcHI(&L^z1lw+tqow98) zDbW-*QPtyd5%H!S{j-mznBtc!?s17_RHc|l`*0tg34)Gb+smYg>@A+z`>$6}DQTwS z@z860+=CF5_bl$u-!StgFOPbGfwZ&L(?Au6*^o!+sv1s7Q~k%Sgeu#dJXvk8S`vbI zAnm?658iZlbTatQ0N7}`^~dOoQ9FKboZg%wQrv={|r)^>&*WMy>csWf>RaQPY;`Hr+SZjO+4}-8#Ykc$6 z&-D2iiA|7={%&~KJWm{`A>k>_*39VG>IvSJwaj;tLvuHN-0KK5jv6XVBuIt>M5t9cnKpB=D;^?~i%8s8W$<(wAeI2biX;xp=BJ?_;&Dx-O&AJs=ag$5l_Y z&~Fqou$fGFea?vKxF&WO(&2aaExgD}w>VLKm& zSCufve+`q+LH{iG2s znZE>M5cj@zM(@%Ti#&h>fR_ZNjmvp1k?Q1I$^;KC*oIE#=MI){{CtPS*b1;9QHarH zObOG!pRg?R-)F^V2DZ$)><-Cr8*){)a{%tu@U7vRFs(Ml71P~$%cz(q;&)glRpu$Tzr3LVO57$d zM(^MJE#tO$Sd#FwFZb$Pe6bK({;Sg&AVr=!<~dPx);DG>usrua!N2WKjid;W9Mi9z zGFH%ECE6CcJ>CFyP^I5jN@0vR=%ZS{teVQWup4QGjXl3e)I_nwLd{KnJt4+4>yp{L z|5t$gBK#9G3PBxr;ZGSbR!}xOfn%*X*awTSQ}iVc|Bh@e!bIqNNWR9@D^HHCLiVfHG*fi97p2gwJQC4d!r_JxqtitHG%JjooL3O8lo9f??oK&(1)>*yv6 zW3TBJLQ3Ul7K*ux=Yz#Bp17NHh$r_yTvMw)vZgZi(~R@mNg?!SS1=z@;Ol92(uSjn z@FHAVEm-Tzb|R?7$x6P#3ZKuXkX2L5&CIlpfMy;v;H3od|Jc3{lueXM-AEgJd;e5A zuz!cSyKw$BmVsxaaR6mrCvoFf>FHzKG=Ah5up#=Ixu{fPn)3Z^6JJeeI5)@riGWohC-G{OrAP~V_Cj3tLt;KPRDaKh zqVMzJ6u0fj^dXM9+2GU(*GkfiXJCpu5q)Q6*&Uqpq@(*SuhiRHl%SA`v zu6+kb<&UR9hN}D$zjE&}3=eBD6Q@+mJ@bUgPj&0+7S2C(;8BSN2CIb%)3)8t+P|tbn>`d43J(}7on zhjYoZrPo3m56?D%g8ctqiODORGfCRP|;TlGbkqwpCh4R(ye{*O~l< zBtpuIVUfZuL`K~x;o+&bsL!PyO$Ch)7~aRgsG?>%eODjI&j-J$-a38&pb@R#D>I6c z*({lxx(jdmRsB{XvQTzh&QSeWK4&1dD7|Fx?_%mV-`lMG2^B-JuMc}NQ+iw|s6I%U zQQVs_0R4^+qNUF@G-)spB7T<<1Wp}{KAR(gobm32A z`r3d^D5}fSX@7lJs#g;Yi>fLuN3yjmiu#lq;^?_JQ{mIXg@*RO+E0YWIV^t=fC`u$ zaro!A&NIS$8zW?k9h@+M5Gi*qwh71>v|t($FJ@Kw|37I5*SFqM$2DC ze7<8BjsQfmcB5>0{+;Gh3sR%^a)r^MM_B*Fz$Qi#O-c8$ToSb&1t$t(UD`+*KkCsW zTu)1Ow4Qg(9-D6GUHZRclCp%>N`gyD^U@MVo~ji-|29+#?o@A zvq9PQX71wKw=+Pj30wRtv3Q&YV;e5D%DBwAO5}T_;`lXFjF6nb*H>&uuZ=cl+`N$(XxNBWF8fnLkNR(xm zx6#?A0{_R(fMOB)Kygi>%%N1hQDxNq5e`1T@5zOu#KQReh4LYm;4xg4!d$^NGyg6z z2Qdw>B9y_&Kb7>2|F|?4g7a4ewoWC?n!A7477%Dx=bKC&|!hC4B!M$y0Dq2Kp>K%##Is$jwX}m9^ zsf9l`&`R>CLL)mSfU4%5A>xCcSHmR!gfOKys^>=Fi|76?<8WBv1F->+-jo=pJd+gLaz(UejAnmJ2Z3{a!|)D&{Uh zTT3riYZm)$nkamg)Xms(;FABm;*#%%;N;hP4E**|9sBO?q?E~xErDp-lFqoFTtPC! zf0vP-kK89e?|b~MIaecgnFa$e`7S~A zBjoX~@3n09TFCNim*M<*PCa%ORV-BN&$Vf}s)FZQL@mPDR9Bn1Et}_Ec`(U9YyJod zeH$zwmLYjs=<9Juwvy4q-G_^&q4~)_m6ro{lybT*S+PLK?47+>z|`MBLRjb+t-)&n z27;Q{1C*b#eSqt7y*dz#5{PYX@Y@o9i{YK2$G9fx2a{;?wzy+}5uiRVpkK7tgx=jP z>^`&fDH~P#si*oZk@e7aj@pNV^NrQ#$tFY}pFhYaU3T1!cq_?FW9?r}W}2Re0o5`a z!L1L=Blo1q>y(D5VRkP}BLj;D48A=VBz&5bb~cCkUk^snthM+12(p{ItMPXOPD8UM zJJ|L*%vTxsF8MWr8!q|VR;aZw>#SlbOep73+05i$kE+z}ol_{i=QLc}Q|8=1wVC@< zIRdc=R7-zxI@Tu?GOPg-G+PQKZE2%Rg{bX{JFksB1%%TZ)A9o>(8M!;S(w8GSI0eJ z_C}%1=>re2kk{t@-&rzYE*eLMOO&0*#l@b2gHVFs-JC$hjTWX3*j<&tmA5ys2f~{2 z_twg+)Y8vMY^%vcq)RZP`ZC4|xF-XAV8;(Xz-HMZF-w90z`csCvsq7{m))#8`f9e{ zW8nRkAR#{~f4)ABi1w*X6#Gc@b_DaC^TW}=yM4vZYsu}bAoboS;-ictFT2B#jj&*5 z@V9V3l2yj}KLZN<<=s#w=#(uv1U=1}e!|@7=@7qSx8CYkbUa{zWY>mKRB0N&s5iND zLx?3h;aod%NR;))8iPE8LD|fd1D2KWe!)6t#hFa>_9N<<>`qV+;r(FENVKGtkn6iI&R`AlInOU5WpL9?hx>7&VN z@Con3SitJqCGTpE4QUHDEZ~|MPlKmt&rKsCtnjDbAM_Q@L4B$fU4&%)^Be-?CuR zot_yH8Zm>vbnI<_ebNXmMo#vFZ*9hOMui}}#5|rK;WBAth|*hp%gXEY^=ezr9_0JG{D2YFDDl!_Mgf`3H1VyIUt3ekH|$oScV|27GgrOoC{g*Sl&mD)Wk7CDM3_ zU8(nj#4hs}T5(&Rq9WfERuKx~mvaJyvYWS(=pdl1qHN-1fhc^q;0#=1UDr&9mh82y zJY$#^#Wl-^{Dc$BYLY4h)`fHT=Uo2#2ZtW65A}$x+GDZ``3dkR3hbuy=y{H<3s?}} z`xMgXAOQfGZu?osBN9zkK3@H!9Pm9K8)C;*A|H9E`YK(dB01YGR~7~vHPeZ(Wu6=T zi@h?--4~9Iz|mDX_X`Bal_dff*`AQY{HBtt$5m_ZP$-*U06Ugs3bYs+i{P7Y2>K@3 zm)G(xGM#n$7@L22$gSt?bCO5{=FGo^me<#5&kXgGQGaiJU=ii$qfCqn@k^TOtSP&h z{k7o-arA>UPDqbP#YdvUChoU-a|9FqS@y?GI0cOKft2&T#S}e+F5f(Db$?W~- zJ^804h__`THTB5}mcEK+#jTeUNfEwV@2`l-0>3tgHc*9^$f&1fxR52cjW#@)qerhL z@dl_fZkTJXP<@Q4P-Qx34Kk1=n4ojwSvqvbI;c^)rgFWWZ_8^gfw`2!*8B78%C1+| ztb@AjlueEwC}t>p`xGA>@VCiikU1X7Hm;ip^Yzjq*--AdLx1p%YCuO#<cF?6 z-;n_a0!5eSSM9;^_E{0|q2aIBeV55{{WH|2oUjIualxvim*juih zVQkmMc0-|)2NddKF@VB;^OKVYj0XAe{)Wou0Pf}E-EwKobmIzjldj9{uM8ZqpCeMV zCi#9!V{PX7Yz2;|{4n-^$d0AK?r2XhW@&?vJ#oSSL~M3#W$=CnLa{SC>Nf$V{pShv zwO8A@oEVIfZe9+spZ^pDtbKnyI7AkO7B2t|$6M-g%;etIo+& zwfZG!+kmn_q1;XDGKT6Bxx~oz^E+bsu3#UsPFS!0Wl!@tfYYq|p_5k#R&qS_#R8?aG9g}N z{i_7#D^meOp_erc3si4G!=!JHXyL7Haw|iErahU@o?jMd>h2W+4xGAh0h}ve-`pv@ z3)_c31%lMcC>f52{B3-$6|uL-Bvq?GX9*{5H27aHlKVYNOA25sO!B654@!x@kHDNf z)X`jETl@0KOS!BL)6tFC-_xKlR@Bmq1q@!GSAWHmXWa8g(tI&^9FVArMX0rW=sx>1 z;0PWVR0!kn!%9*UG-YOL{yL?6yF)yt@l3nM=sEm}A-|wMgx7~quW&-P3*~(F>Ik6& zv6)X#M*C^H#2sj_i7L(8zyl)UKvmMGURl#3y}H7U+pIUwdmbQPJi@5B^^4*tY$2O? zO#vS^TUxEsO7K-vCRRegrv{N8ZcvuyEO!rrfH|L}0pyyKM9i55=rxz+Dw!dwUR(R~ zuMS^I5L@#iNCrTQmoQqozGHG=t4SSRi8Dyhi0)#4JT z@?D+9uaBk^5}T?65Q$q|6_2>PKFeyRr#pyW)Be>LV`OniUexRX!c6}55!-XIj4)Mw@YD;|2cxs3JhOJ7GUQ2EN$1TqPEW8YSksiV$$}4B{ zpW5plgGaoW+#hOj3D!DFnw-0r&+5yKf|GCg)%2#4$zV*mU$PGaA8;wNRo)R|Ug?dG zqweq7r0x7BYn_9W8NTIO3!(1(=J0!cWIe8#?ongH%g$oY3iC1#={fvYe?P}*exxrn z_qD~dhUOsz+cPq0Vc@muVTWFrr}kR2s3*AG6t<+z-@1@5Ls8#R)Yfo7gY4A4Cf4Id z)MH5x{e`1h3(~Luy`Go#NGM9havUn*&I`mcv#1KbXf+sJD@=WhI>y7l96g+<`Px{W zUoOAzl{(3fG?V@)fvsjgsqgOOy~UB6Ig%#sALa=6SwXi{bMv#^#{4xm(;7p7W*1YO z0I-&d#}D_4Gn1rnZ#IYf^717vaYi<}XE2>GM*QoWE7ZqLf8$u|J^HWtos6CoeiHqu z>iu{b{txS%fBP^&wUu$M=zZ8gBB;>X6FZOtu#b+-GI>GGc@^L-@FS?tAK0@uJoJ1VX_GR>cKj?k$Z!?M((Y|9}*FRbX&GETf40|v;Z$u z&r~U#Vit%k`i(d+b6hWJu~OSmZ&=sDHj6_UP&5=1ym-`u&__xWtBU(vvo;#0k2yE;C<7RGn{-v80&AE{f4kcFl_^ZWX+!Bo%t$qey@ z@qPBVA6`Yc*8&7?lp%;H4YY5wOHtmT1rPO!^e1iWVtzKE!HXD9WQ+c6wn3Z%ikNY< z^^yi_wFXuxt|*CHv;F^b0dRu-!d$&uCQw+MIANhTJ|ab%q(swS(;?xV=ZH8bm+2hO z&UJ=Tj<0nd>lpDR?c;v5TTc_g0Ck9v&6i{OU=!kau$@oVgCSPq{Gl;j zmnUsM^@^F>*Q}FZ*RKveG3fQMkXWtwUo1IBxj8Dx;D5Q&(9oZy!q8ARE!|4$QOl8gyqFe+jXw1Ds#8M zys&l3&T(@wv&XXZpdj6Km*9Tysd9L5$w$l4TTM;frZ?Gf#OBG?rgws!oKN@uVOIP; zTGwiUxHS|zL%KrP+i=2!Hm#i&#F11aS9(bR+UY5P%Jm&y-*~fSo``Oatc`Y?w~hNM zm0(1?EIi{oLmjN3!niHN*hZL2k*L6-p!r9b);YL$O$L0ImSPn@n9kxX?!M6ibVi*- zMi4xjkzZ#?Z(kvzIfC0RZraLxy_WpSZXUY3GcLwxO|X(Os_``DB*O1?#0eDNx=2u_ zpqyYJo4+CAo1ci%y%q5G5r9#!B)i=*r>GlQ{3-$5KsJF=#m@u_imm6sK^z{NUJ~pt zF-ZFf?vCA;AsX@+p^DX36cm3nYRY1TR`1+V+$BY8R&d4o9-Ak@po>;H)@*tVNvq5bPuMNM$#_s=q|~7rhPj& zrWXl3WXBhA7v<dWo0A@Bz zTyZEwYI+ph{Pa9?3NChS9pt3AmC)i^>>Z4l$_w_Rv-m=xKvBz|J3_K$2IFk2YXXH-Z4)6J5ot?r$i=*%bJXy6rdFc`tI$J;ebCldgGWJP9Uv`un|0=s4Y?-m&f@ zo9bC0C=*PHFTj1%z_FF|eOAnWA5SA}IAH;o>2(%p_4C@%(ZJ96?z#WbUoz?zxJtk1 z*~S_B24nC!EyYNXfI~Id1qru@uo@-~oaXH^r}FwR99(if=B+ZDA{PDIO$=pS)aYEc z99-fRPYV>w83T$_KVs`V^LgA)F1}>gHSwB^xIpDPUvjj+Q(w8u@iG*>^rQTt&ztkJc|%CCuN2#A z`SgOk4F;p=q;v*@MrzzLR!D?zH$uX=2KW!l;960a;XtQX4!S@-Fu~cC{?i$%Js9U> z>URFE_7*?&Ym|zgnyD0MOuzidc`qQIeY{l9U*Yq)JsVO=&yAuoLT+>5FNG)uo0%PP zNc{PuW}{f!Bthucql-2w3+Z9$-~7pH9ZRnEx)T8J=j(Mi=7{|++a#|_zII9GJux#vhy1y^W6u`GA!)+OdJ>P;*&yP!JdZ!!$)oaoev}dSkrrQeivQ54`)|{C zQhC%~v*{J3-R|Q-vOkXiSbKUm;el$!2PP)}nfbf&Zam;&j9Qpde>u_h@KQ%HN0N7# zetd-?;Cm-5vd#OMAE9I0>PUdM8ePqvAkGAI7t?hAsG|h zeI>3{oUv+!yvnFd!?gkBGApKM>pybOgzYf`usgON?j)!l*jd7e%G`fKKomHH6dQl} zaIf4RoDocYNQ1}G)vav}=&tFLfNtwQzn6A8gf~plnB{FVsv+{^*wcku!VeA_TsTbc zroT**zx*kqFEfBk=_za^zTmCMaYI9igHiq_ zLeRHmB7E7wK0gvDrA6ud{i_s)Zzb;{{$3q83ovp;tx4i=F3)mjmtaV@+5Nxm< zQmuIdx;E5ug=a)rs&G_w$eFGrBwZn2jqs4yaC-L(St1}KTH(iAehiNz3Y8CE3Q2(j zocG$l3_Y&4lasHUt5gVUuAl1dwr;4wecIEvP_{F2uofBXO4Cwa-2E}m&kAGSay4(P_#~RAr@pY`!)T!soY3x z3^f>%3P-8aUmSC^|5`(f8-z$YdOlwnS99jy`l|gvFMgHa#!zBg+Vz{95z@Pm6!rT` z_{xFJj)%91@gu73pOJ!Z4S<61e<}`|9vL5%C+S+%`3ftI<3QGu|N!{bd}+CQnB!o?40c?;_|x4U=4_`FG>JUy8g7964jW zYBLkar%QPQ%fvnd#lO@fxUInp&;?tZXu#JL1qMxbCkAWM1Lau7THX`hj^}!gEC67U z-xQEK@~BYz)p9Q1;IGIfgp>Oakt?`4_?v}(uH>~(&ab^y$0Bd0?-{jSqf=f}G{kF; z+Bc{zB0kX$pQt`YILrd+btfo>hMbeth&dx5e6Y5>UqfoqS;x)`+lo3fUQy`qf(7q( zkZ1ttJZ2{sEd-9ck3nN@L4nXy^=`k>tQzs0-7wu{?g)&6s&<|A3|PfGHuJp>MY5KRngTwFCn8uYxd*NRg|Cd#;SBVW ze|%W)JK*^rJWO8yid`c7_2(}vL@NYGIlrxyQC!62z=y@hKy#Q7ivM(RD|$~bI6xLG z*!3W?M1U`F?toDwK&%h{jgRD+U=~3#aOt%sI3pIjEbAIhKNawh3XPE3HcK0n%wViMGCO@Z2-2~=SmLCJo$&Ci-wgw z?5Qt1Fg3wkM!SP{c%7tal`93-QBRlmsop+fcC9~yTg+r(Yk7bh+)n4d;0-ji1;i&VG{`(?)UB?1ccy?Rvvbb`-270Rz?Z7;BjlQXDKbl z#)168@j|8`L`f;B6+}QSwUiD;t9wP{vCcY%*vT28EitZ5umCX>v}&0@4bBnt#4 z6#BF69f6sqa>vs$vLeVfaF)MrFcN672p=&{1?%@8{(Ph~)zSekLCXMs&fFEFr@^E3 z;oz5uhyy?PR;I#Py8}Rh${qMCaOlD1+0Db*cCLk&>&*n*St2I)oiIX=Q2J-O= zI|+c4|NKyp;}O5kNIUSpQfwP1mO@c(qVrwyOcx336I`n!QtF*AyS+ove>6IAfh~Ew0(y6ZxKuH^U?z5I~a8HE?j1bji|hyXWw z3lY;u+T${Do$IF_cJM8ueA;sbkwhmtY!tGbM|n-LxRcF1RqF1=*xw8KaHqfa{+WUKn>#e+&?v*wmyWZ$K9zn3Voixj-i-=pPbOlj} zwiz5%fz`EK4gvFrTV(io@5SgYIYQ^}dzZ^tqe80`88b(U7X{COz45MEnhS&bv$HoO zIs1a-h{aqOtu)ux;V&2*!54GIM00<8pql7c>kf&^_K7A$e1z0Uo=!8B^1MD$swt>^ z#vno~a|jag?o?>gLu5;;V+c@+DwP%Hfep!~)ZvxCFDt;K)kExX-zuaAK?16kM5YAV z;Hah3*{P%EPX>;!>*I3{hO^}W3B04z9Q|hhtf7)hp&^jN^;G+~HgDLGm+C&Cg~(52 zBpv*Z<=PqyCZ}{aqUg!Z(lAqpE{;pqB3*1#?mC`_pU}E>zvuvfmECd(7}L}06&FP8 zvA%YH)4G0hHcp6rdI@}$o1sY?tGi;5)%khKNR(G66#G_6ZTLoJv@~%Ml}boyN@4Yb zZx5dIQ;gXMt1_Sfe|XGir%UySqD6<+2g^rPt>zax+d0s8&&9e44#18o)oP zYepR4#Y-{6KFbjNtFgFU8eD2n-q)?KOwseuvY5x`mM}{!1ow&zIel$ku?3Q^`aha*j%2|?jjn@G z3t{eSfeUj7p1bjN z;}|Y}-47<@6;iQ^VD8)M3klG3{GTTse9Xe%kQ~gCVQe3 z(ViOfogS8XoI?$R%-SBfq!ZJh?- zY{du{sd#ybu^@kvbtIFHeJ#Ic$(Kr6HYYwI_3?pV258S^p8~@Eu;qM=TBL#df`AC< z0^O`VPv>TsXe7-EKJ(wJBWf>RPvM??o(#Jub+nB3w?T9CVX#cej^-T1Gt`y=y-(90Q!X&lFXDytA)cnS8G{+iUj->b!s!6Z2(e2TyDUU zR>&WA6GFr9%}TH=%?l}Cat1bWYLqdbq3!@h=c>FCCphdBJHZE!`5|oQZB{R6LfAmE zC5dh0AG&>%m)nK31K^|m|6WvF`84a!wq;_byfurm_`QJO1BqszJk*wz4W4U$vz_m`qrnX5zMWs z2I7hbjyhO@`cN0URDD@6V}T!dSLo~LvMeCK%zy5p_T}IW8Qvi5E02vBJTBw)uZEm^ zWI*g#l>;`!MAj1ZV*(%0I_=e=r2U`KTVn=Lttp}XAF$SdMvR}9e8gbHO(;PuY zhR&0bcE=fI72NRStLvI%(xX+3-jJ@(1V3ysas6`Qn$98Psh3 zFfccm?Y9Tu&8xTpoE*bwS4(l=8Nn=5N49jVi%b>d5^_((evU2y0qQLeVifOW+KtGH z52~p~`(pNvgd}@`Xp*Vlo+c4Z(|c`M0IGHonsfNdP9GBg4P+qVPbaBz1=Tlx0Qtc! zl)()x7~u|F5Ahf;oQ@IsqY-{n)E|8@Xx><_$fAs=TYkqpK!Ej-+x@$zgd$ zKrjD`9>TiVa8F(Kuzc}gkX}pWJ1=%4%mInyB8QEi{Dod-qMU4d@`AwIg3g#4nb#DE zClKg4X5Hd{ENY0r*Ty1(*j3?;548QewYrGSvjZN=P z{d!Tg_3d&?a$|7Hnl`V#J&#hRa>cjuMKLL`U=3Xs6?(L}ZRJN5Rc7+Q=)88~elt6g za#f4?u|>*|4Bh$95CPNGthsyp<|}>^G46qh_p~1gUKwi$mo0va|IA(8nx!x@+pKpep;NkiPK;X$(k6x z*;Y{3Q*`a@MmJi;gRd=V}Tmmk< z9M4|-m7= z16pMTPA>b^reOO&=OktY1RfMai3@Z8H{0ypqg#%lE(KZQ^Gk=d4Tz0mYF1Vlq6i^5 zI1;niUA=HzQk~Ys7c{L~;Qeeig#CDPrrx9U;%%ZUhAUZc!Iy9$6+?md3a19O7H$W- z9h=*9aOG=fxZq=_fwA#z+m^9oc<<{uS!UbVnWMt;7{+#2zJ_vTrXD&~wzq0&2%I)B z^Kx9yfNRJ~NWo0n6OK%jO0104&sW}`FHro}RKx(&H116W%eKMas<$1w>`3_r^RnSA zh`yKiACOw7a-5f!ODX(4!;gFLd2O6-6rDpmT&}*bB=a)}qKT`JnYiXz`{ch*lQl6H ziYWTX@J3NE0KVS^tgV5OMe@RJm`tu1ATbqlGt)|R+k`3P)`PC3FjjgB z)*y+7+nyRHF-AX&y*d*;6@=s$>7~~ZwcK5ZNJg5Z^#*+@c+hM$x09c4{WF*C2b6od zj8KMPBwq)Nj;f2Itvql=7o#C?MlfahRDPG`GLhC@%2%w91%o%rtv!7X$K~QHQS3MJ z+WAc)0Z>nXlPBW#-f2nru%Ro}JM?j9;q8Y6z|xH(^zPIQ%f_liDmBK}PGl4RlbW*> z`z73~BMe#(T-(2cVD%@7Q{d3(tv&Wy7u}zkW^*P8R)=6M9m(pE=O?uR^JjxfpO1#z z@hIgZjv_VCANm10K$U36i1HXVT^`JmVhN2t@kmnAl^8e6CGRtyOrR$H)%rw}U2T_m z4A(MiOig+u#pRHDncko5HOpo`f3!R3;Ko-&gmxor8N(4)C)-@NSJ={HN1;Cmsw#W& zfb!rxCS?Ew^~NKUOvsMJ{7%`6Q&Jh-#;%Mj{?l|w|OZL=iYewOF z8h7}p0&*dHxYw6g;f-Cc2#I{!NX@|3C+Rl9uhr{oZ%R{5aB41TwsSZzpXX)Vhk8Au z{Ukd@Xg~56)`k;p&DzY0&WwMOd*Lj+-~etTHIDITO|iKoL~tuo)OwKAbEiZoRnovO z_QkQnThMV&~Wx4&nc$fPzR<5(4gY-c8*^AmoRsns%^6`|ZHVROZXF;cp9ok+lk zr`7(G?!;5R1l?q%@#V{xf)W7C#1jE6qz2IzM8cxa5=(lcp=}zG9P+Tp4^=aV$qcV2 z9IvBcUDO17Y-Cgm^wNFhpOrrosK5&rR~wDnJVeh3TS~X`gcTT6-JV?^k@B94wf*6Q ziyK)*iiIT&dU)!lON6dczJv z$>|6Gl$rL?$}bswwYg=!C#|qG8eQ@;!H*8?c+r`2P3*zv=O@87VxklLY_Aa@VB|FLf05HVDd5Y6u{Ty#n7rx6 z*9e>%NEr>Wa=q95NB+3n>_2r-NQ&jrxMvID3R+sXj5sEQMt z%%`kUVIw_pkNF{fDUgh|AIGVsFAqB+FBUn?u7ZIr!K)Wq?%g&X%By_or!wdjJcA9;>phB9h67p*2 z8QCU}JB`6g$UAs2e|LG^lL>-SJL$y_u`K=u+-Ml3(ZOvbrhl`1KB6n^8m&N5PkgP(m=!COlvXd5YD z1ML?b)C5*%yfF?DHWg*1 z+2;)!GJu0P)wbNs`w3k7Kxb)|iSY#`c2yhaoIc=fE1yw{I}S#S34U8Xyn%gN3+KG^ zla9E+=Buv$ymzw?eeI6VITr9)2oq)a-xm928P2 z!%viiJR~~CWgM1H6VU&m@fuE-gNBu@J0`D$P6)Qu2CP}?7oVe9j)oGzDdRS}wa@OA zeEri4_ufR;_zUKU0WN>-Q8QQoeEKRsQ{FS2I`mSPc-$Td>#s}R9UHB^Ma$q6uovg4 z%XSl2jHml{JNjw+DLEaxdhGqu-oF96audaFMR@F(gR>1Ytpdee#}n{vqrkafwmrhlIc( zH!QK(;QM$w<|5>qg-<&7ZJV#o(u}M_Q!(nx5HjZ;k~4&Gm{0F7#1lT#!z8rK%^uDb zx49_Ed^{8G1gmL)Q}*kTO!{~#3+$c9L_T*~s|MH=Bbqa*4++?SGvWUVren{ebJF@J zd;Hr|IA`w$_FrMG(91Y_T1j`VBB+_EVtCo~FdBG8BRfys;KyW9ZMjkehM?5@J~tCz zqK(lu`X!;$23#^gmE!4wKmC{)7HFln%369gTUGG|a7}aOs(W0w(rJ(!(b%zE&CpRH z<=%clUplW)%C4XlxZq60ZUisJ^t_Uc=lNwZ3*0BIfMIA zhe%{g-wfmF3j1l;uHWpUC9P+w(UXBhfp1wR6PHf}E}sp)$$E9|@0}kmPCt6LHe81d zZY1nrb~DBONO%QjinvXyEu$N1>DFwfF5`e?L`*;o^U|64U#NrKg$up&A`etx-$5~t*U$RS@ChxbClXHv-6bSlTqmG61lXhkUd;2 z&k*6nQhGm@PH}u>?w@)y&e0^3wA4S+#g>o zxHs##w$gLhiOgk!L7$c;AM`Q%tOz~6;eWXYbcq8XX}!jci!C`$&Vq1ZjQz;bPRC