From 0c8973386f6d758d75b6e87680baee3e930bb208 Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 15 Sep 2025 14:55:52 +0200 Subject: [PATCH 01/31] initial commit from GitLab repo --- CITATION.cff | 19 -- README.md | 2 +- __init__.py | 0 examples/example_1.py | 1 + examples/example_2.py | 5 + examples/example_3.py | 1 + examples/example_4.py | 5 +- examples/example_concrete.py | 60 +++++ examples/example_new.py | 68 +++++ examples/example_new2.py | 66 +++++ examples/example_new3.py | 68 +++++ examples/result.png | Bin 0 -> 102606 bytes requirements.txt | 17 +- setup.cfg | 12 +- suprb/base.py | 2 +- suprb/fitness.py | 9 + suprb/optimizer/rule/base.py | 42 ++- suprb/optimizer/rule/mutation.py | 2 - .../optimizer/rule/ns/novelty_calculation.py | 5 + suprb/optimizer/rule/nsga2/__init__.py | 6 + suprb/optimizer/rule/nsga2/nsga2.py | 196 ++++++++++++++ .../rule/nsga2/nsga2_global_novelty.py | 133 ++++++++++ suprb/optimizer/rule/nsga2/nsga2_helpers.py | 20 ++ .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 248 ++++++++++++++++++ suprb/optimizer/rule/nsga2/nsga2ig.py | 96 +++++++ suprb/optimizer/rule/nsga2/pymoo/__init__.py | 0 .../rule/nsga2/pymoo/pymoo_mutation.py | 41 +++ .../optimizer/rule/nsga2/pymoo/pymoo_nsga2.py | 132 ++++++++++ .../nsga2/pymoo/rule_optimization_problem.py | 54 ++++ suprb/rule/base.py | 8 + suprb/rule/fitness.py | 29 +- suprb/rule/matching.py | 37 +++ suprb/suprb.py | 26 +- tests/test_solution.py | 26 +- tests/test_suprb.py | 7 +- 35 files changed, 1361 insertions(+), 82 deletions(-) create mode 100644 __init__.py create mode 100644 examples/example_concrete.py create mode 100644 examples/example_new.py create mode 100644 examples/example_new2.py create mode 100644 examples/example_new3.py create mode 100644 examples/result.png create mode 100644 suprb/optimizer/rule/nsga2/__init__.py create mode 100644 suprb/optimizer/rule/nsga2/nsga2.py create mode 100644 suprb/optimizer/rule/nsga2/nsga2_global_novelty.py create mode 100644 suprb/optimizer/rule/nsga2/nsga2_helpers.py create mode 100644 suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py create mode 100644 suprb/optimizer/rule/nsga2/nsga2ig.py create mode 100644 suprb/optimizer/rule/nsga2/pymoo/__init__.py create mode 100644 suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py create mode 100644 suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py create mode 100644 suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py diff --git a/CITATION.cff b/CITATION.cff index 9f3ae5d2..4b4db2f2 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -14,22 +14,3 @@ title: "SupRB: The Supervised Rule-based Learning System" url: "https://github.com/heidmic/suprb" version: 1.0.0 date-released: 2024-11-18 - -preferred-citation: - type: conference-paper - authors: - - family-names: Heider - given-names: Michael - - family-names: Stegherr - given-names: Helena - - family-names: Wurth - given-names: Jonathan - - family-names: Sraj - given-names: Roman - - family-names: Hähner - given-names: Jörg - title: "Separating Rule Discovery and Global Solution Composition in a Learning Classifier System" - year: 2022 - conference: "Genetic and Evolutionary Computation Conference Companion (GECCO ’22 Companion)" - doi: "10.1145/3520304.3529014" - url: "https://doi.org/10.1145/3520304.3529014" diff --git a/README.md b/README.md index 297b8726..13cc3634 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ The examples in the examples directory are: pip3 install -r requirements.txt -We recommend to use Python version 3.12 +Tested with Python 3.9.4. ## Contributing diff --git a/__init__.py b/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/example_1.py b/examples/example_1.py index 98f16323..b87b5f5c 100644 --- a/examples/example_1.py +++ b/examples/example_1.py @@ -60,6 +60,7 @@ def create_plot(scores): verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, + fit_params={"cleanup": True}, ) create_plot(scores) diff --git a/examples/example_2.py b/examples/example_2.py index ff043e33..329627e8 100644 --- a/examples/example_2.py +++ b/examples/example_2.py @@ -1,3 +1,4 @@ +from datetime import timedelta import sklearn from sklearn.preprocessing import StandardScaler, MinMaxScaler @@ -10,8 +11,10 @@ from utils import log_scores +from time import time if __name__ == "__main__": + t0 = time() random_state = 42 data, _ = fetch_openml(name="Concrete_Data", version=1, return_X_y=True) @@ -50,6 +53,8 @@ verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, + fit_params={"cleanup": True}, ) log_scores(scores) + print(f"\nTotal runtime: {timedelta(seconds=time() - t0)}") \ No newline at end of file diff --git a/examples/example_3.py b/examples/example_3.py index ae674ad9..c8bfe50e 100644 --- a/examples/example_3.py +++ b/examples/example_3.py @@ -61,6 +61,7 @@ verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, + fit_params={"cleanup": True}, ) log_scores(scores) diff --git a/examples/example_4.py b/examples/example_4.py index 7948b39f..b0187744 100644 --- a/examples/example_4.py +++ b/examples/example_4.py @@ -50,8 +50,8 @@ elitist_ratio=0.2, random_state=random_state, n_jobs=1, - mutation=suprb.optimizer.solution.ga.mutation.BitFlips(), - crossover=suprb.optimizer.solution.ga.crossover.NPoint(n=2), + mutation=suprb.optimizer.solution.ga.mutation.BitFlips(mutation_rate=0.1), + crossover=suprb.optimizer.solution.ga.crossover.NPoint(crossover_rate=0.9, n=2), selection=suprb.optimizer.solution.ga.selection.Tournament(k=6), init=suprb.solution.initialization.RandomInit( mixing=suprb.solution.mixing_model.ErrorExperienceHeuristic(), @@ -71,6 +71,7 @@ verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, + fit_params={"cleanup": True}, ) log_scores(scores) diff --git a/examples/example_concrete.py b/examples/example_concrete.py new file mode 100644 index 00000000..c16d4893 --- /dev/null +++ b/examples/example_concrete.py @@ -0,0 +1,60 @@ +import sklearn +import numpy as np +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate +from ucimlrepo import fetch_ucirepo +from suprb import SupRB +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm +from utils import log_scores + + + + +if __name__ == "__main__": + random_state = 42 + # Dataset https://doi.org/10.24432/C5PK67 + concrete_data = fetch_ucirepo(id=165) + + X, y = concrete_data.data.features, concrete_data.data.targets + X = X.to_numpy() + y = y.to_numpy() + X, y = sklearn.utils.shuffle(X, y, random_state=random_state) + + # Normalize features and target + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(np.array(y).reshape(-1, 1)).reshape((-1,)) + + # Define model + model = SupRB( + rule_discovery=ES1xLambda( + n_iter=32, + lmbda=16, + operator="+", + delay=150, + random_state=random_state, + n_jobs=1, + ), + solution_composition=GeneticAlgorithm( + n_iter=32, + population_size=32, + elitist_ratio=0.2, + random_state=random_state, + n_jobs=1, + ), + ) + + # Cross-validation + scores = cross_validate( + model, + X, + y, + cv=4, + n_jobs=32, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + fit_params={"cleanup": True}, + ) + + log_scores(scores) diff --git a/examples/example_new.py b/examples/example_new.py new file mode 100644 index 00000000..212c6ea9 --- /dev/null +++ b/examples/example_new.py @@ -0,0 +1,68 @@ +import sklearn +import numpy as np +import matplotlib.pyplot as plt + +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate, train_test_split + +from suprb import SupRB +from suprb.utils import check_random_state +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm + +from utils import log_scores + + +def load_higdon_gramacy_lee(n_samples=500, noise=0, random_state=None): + random_state_ = check_random_state(random_state) + + X = np.linspace(0, 20, num=n_samples) + y = np.zeros(n_samples) + y[X <= 4] = X[X <= 4] / 10 - 1 + y[(X < 10) & (X >= 5)] = 1 + 0.5 * np.sin(4 * X[(X < 10) & (X >= 5)]) * 0.2 * X[(X < 10) & (X >= 5)] + y[X >= 10] = X[X >= 10] / 10 - 1 + + y += random_state_.normal(scale=noise, size=n_samples) + X = X.reshape((-1, 1)) + + return sklearn.utils.shuffle(X, y, random_state=random_state) + + +def create_plot(scores): + fig, axes = plt.subplots(2, 2) + X_plot = np.linspace(X.min(), X.max(), 500).reshape((-1, 1)) + for ax, model in zip(axes.flatten(), scores["estimator"]): + pred = model.predict(X_plot) + ax.scatter(X, y, c="b", s=3, label="y_true") + ax.plot(X_plot, pred, c="r", label="y_pred") + + plt.savefig("result.png") + + +if __name__ == "__main__": + random_state = 42 + + X, y = load_higdon_gramacy_lee(noise=0.1, random_state=random_state) + + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(y.reshape((-1, 1))).reshape((-1,)) + + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) + + model = SupRB(rule_discovery=ES1xLambda(), solution_composition=GeneticAlgorithm()) + + scores = cross_validate( + model, + X_train, + y_train, + cv=4, + n_jobs=1, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + fit_params={"cleanup": True}, + ) + + create_plot(scores) + + log_scores(scores) diff --git a/examples/example_new2.py b/examples/example_new2.py new file mode 100644 index 00000000..a220b92a --- /dev/null +++ b/examples/example_new2.py @@ -0,0 +1,66 @@ +import sklearn +import numpy as np +import matplotlib.pyplot as plt + +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate, train_test_split + +from suprb import SupRB +from suprb.utils import check_random_state +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm + +from utils import log_scores + + +def load_higdon_gramacy_lee(n_samples=1000, noise=0, random_state=None): + random_state_ = check_random_state(random_state) + + X = np.linspace(0, 20, num=n_samples) + y = np.zeros(n_samples) + y[X >= 0] = np.cos(4 * X[X >= 0]) + + y += random_state_.normal(scale=noise, size=n_samples) + X = X.reshape((-1, 1)) + + return sklearn.utils.shuffle(X, y, random_state=random_state) + + +def create_plot(scores): + fig, axes = plt.subplots(2, 2) + X_plot = np.linspace(X.min(), X.max(), 500).reshape((-1, 1)) + for ax, model in zip(axes.flatten(), scores["estimator"]): + pred = model.predict(X_plot) + ax.scatter(X, y, c="b", s=3, label="y_true") + ax.plot(X_plot, pred, c="r", label="y_pred") + + plt.savefig("result.png") + + +if __name__ == "__main__": + random_state = 42 + + X, y = load_higdon_gramacy_lee(noise=0.1, random_state=random_state) + + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(y.reshape((-1, 1))).reshape((-1,)) + + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) + + model = SupRB(rule_discovery=ES1xLambda(), solution_composition=GeneticAlgorithm()) + + scores = cross_validate( + model, + X_train, + y_train, + cv=4, + n_jobs=32, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + fit_params={"cleanup": True}, + ) + + create_plot(scores) + + log_scores(scores) diff --git a/examples/example_new3.py b/examples/example_new3.py new file mode 100644 index 00000000..b8a82f4b --- /dev/null +++ b/examples/example_new3.py @@ -0,0 +1,68 @@ +import sklearn +import numpy as np +import matplotlib.pyplot as plt + +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate, train_test_split + +from suprb import SupRB +from suprb.utils import check_random_state +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm + +from utils import log_scores + + +def load_higdon_gramacy_lee(n_samples=1000, noise=0, random_state=None): + random_state_ = check_random_state(random_state) + + X = np.linspace(0, 20, num=n_samples) + y = np.zeros(n_samples) + y[X <= 4] = X[X <= 4] / 10 - 1 + y[(X < 10) & (X >= 5)] = 1 + 0.5 * np.sin(4 * X[(X < 10) & (X >= 5)]) * 0.2 * X[(X < 10) & (X >= 5)] + y[X >= 10] = X[X >= 10] / 10 - 1 + + y += random_state_.normal(scale=noise, size=n_samples) + X = X.reshape((-1, 1)) + + return sklearn.utils.shuffle(X, y, random_state=random_state) + + +def create_plot(scores): + fig, axes = plt.subplots(2, 2) + X_plot = np.linspace(X.min(), X.max(), 500).reshape((-1, 1)) + for ax, model in zip(axes.flatten(), scores["estimator"]): + pred = model.predict(X_plot) + ax.scatter(X, y, c="b", s=3, label="y_true") + ax.plot(X_plot, pred, c="r", label="y_pred") + + plt.savefig("result.png") + + +if __name__ == "__main__": + random_state = 42 + + X, y = load_higdon_gramacy_lee(noise=0.1, random_state=random_state) + + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(y.reshape((-1, 1))).reshape((-1,)) + + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) + + model = SupRB(rule_discovery=ES1xLambda(), solution_composition=GeneticAlgorithm()) + + scores = cross_validate( + model, + X_train, + y_train, + cv=4, + n_jobs=32, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + fit_params={"cleanup": True}, + ) + + create_plot(scores) + + log_scores(scores) diff --git a/examples/result.png b/examples/result.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ca08784d8f23271356782d6edd9b6bd4d654bf GIT binary patch literal 102606 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∓^}d7jAZ1xv5i48*zI5D(t$z4h-<08MEN)4 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 literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 6326ee92..0822148f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,12 @@ -matplotlib==3.10.3 -pandas==2.3.0 -pytest==8.4.1 -scikit-learn==1.7.0 -tqdm==4.67.1 +numpy~=1.22.4 +scipy~=1.7.1 +matplotlib~=3.4.3 +scikit-learn~=1.0.1 +scikit-optimize~=0.9 +pandas~=1.3.4 +mlflow~=1.21.0 +hypothesis~=6.24.2 +joblib~=1.1.0 +tqdm~=4.62.3 +pytest~=6.2.5 +protobuf~=3.20.0 diff --git a/setup.cfg b/setup.cfg index c1f3c7e2..793f738e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = suprb -version = 1.0.15 +version = 0.1.01 author = Michael Heider, Jonathan Wurth, Roman-Alexander Sraj author_email = michael.heider@uni-a.de description = SupRB: The Supervised Rule-based Learning System @@ -13,11 +13,9 @@ classifiers = [options] packages = find: -python_requires = ==3.12.11 +python_requires = >=3.9 include_package_data = True install_requires = - matplotlib==3.10.3 - pandas==2.3.0 - pytest==8.4.1 - scikit-learn==1.7.0 - tqdm==4.67.1 + numpy >= 1.20.0 + scipy >= 1.7.0 + scikit-learn >= 1.0.0 diff --git a/suprb/base.py b/suprb/base.py index d223dc38..748c81c2 100644 --- a/suprb/base.py +++ b/suprb/base.py @@ -51,7 +51,7 @@ def _more_str_attributes(self) -> dict: return {} -class BaseRegressor(RegressorMixin, BaseEstimator, metaclass=ABCMeta): +class BaseRegressor(BaseEstimator, RegressorMixin, metaclass=ABCMeta): """A base (composite) Regressor.""" is_fitted_: bool diff --git a/suprb/fitness.py b/suprb/fitness.py index cc6acee8..208f5122 100644 --- a/suprb/fitness.py +++ b/suprb/fitness.py @@ -40,3 +40,12 @@ def wu(alpha: float, x1: float, x2: float) -> float: """ return ((1 + alpha**2) * x1 * x2) / (alpha**2 * x1 + x2) + + +def moo() -> float: + """ + A placeholder fitness function which always returns NaN. + This function is used in multi-objective optimization (MOO) as the rule attribute `.fitness_` is never accessed. + Using another fitness function has no impact on the MOO and may be misleading. + """ + return np.nan \ No newline at end of file diff --git a/suprb/optimizer/rule/base.py b/suprb/optimizer/rule/base.py index 94acb7eb..55ff86ca 100644 --- a/suprb/optimizer/rule/base.py +++ b/suprb/optimizer/rule/base.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from typing import Optional +from typing import List, Optional import numpy as np from joblib import Parallel, delayed @@ -107,3 +107,43 @@ def _optimize( random_state: RandomState, ) -> Optional[Rule]: pass + + +class MultiRuleDiscovery(RuleDiscovery, metaclass=ABCMeta): + """ + Implements basic functionality to return all Pareto-optimal rules in one run, + then let the caller pick the top n_rules. + """ + + def optimize(self, X: np.array, y: np.array, n_rules: int = 1) -> List[Rule]: + self.random_state_ = check_random_state(self.random_state) + random_state = self.random_state_ + + origin = self.origin_generation( + n_rules = 1, + X=X, + y=y, + pool=self.pool_, + elitist=self.elitist_, + random_state=random_state + )[0] + + init_rule = self.constraint(self.init(mean=origin, random_state=random_state)).fit(X,y) + + all_rules = self._optimize(X, y, init_rule, random_state) or [] + + valid = self._filter_invalid_rules(X=X, y=y, rules=all_rules) + + if len(valid) < n_rules: + print(f"Warning: Requested {n_rules} but only {len(valid)} Pareto-optimal rule(s) generated.") + + return valid[:n_rules] + + def _optimize( + self, + X: np.array, + y: np.array, + initial_rule: Rule, + random_state: RandomState, + ) -> Optional[List[Rule]]: + pass diff --git a/suprb/optimizer/rule/mutation.py b/suprb/optimizer/rule/mutation.py index c0b5e5a7..56026ab5 100644 --- a/suprb/optimizer/rule/mutation.py +++ b/suprb/optimizer/rule/mutation.py @@ -2,7 +2,6 @@ import numpy as np from scipy.stats import halfnorm -import warnings from suprb.rule import Rule from suprb.utils import RandomState @@ -31,7 +30,6 @@ def __call__(self, rule: Rule, random_state: RandomState) -> Rule: return mutated_rule def execute(self, rule: Rule, random_state: RandomState): - warnings.warn("No matching_type was set! This will impact mutation.") pass diff --git a/suprb/optimizer/rule/ns/novelty_calculation.py b/suprb/optimizer/rule/ns/novelty_calculation.py index faf73529..4170cc3a 100644 --- a/suprb/optimizer/rule/ns/novelty_calculation.py +++ b/suprb/optimizer/rule/ns/novelty_calculation.py @@ -33,6 +33,11 @@ def _novelty_score(self, rules: list[Rule]) -> list[Rule]: if not hasattr(rule, "idx_") or rule.idx_ > len(archive): rule.distances_ = [] for archive_rule in archive: + + #TODO: check if this works + + if not hasattr(archive_rule, 'distances_'): + archive_rule.distances_ = [] hamming_distance = hamming(rule.match_set_, archive_rule.match_set_) archive_rule.distances_.append(hamming_distance) rule.distances_.append(hamming_distance) diff --git a/suprb/optimizer/rule/nsga2/__init__.py b/suprb/optimizer/rule/nsga2/__init__.py new file mode 100644 index 00000000..02c8283a --- /dev/null +++ b/suprb/optimizer/rule/nsga2/__init__.py @@ -0,0 +1,6 @@ +from .nsga2 import NSGA2 +from src.suprb.suprb.optimizer.rule.nsga2.pymoo.pymoo_nsga2 import PymooNSGA2 +from .nsga2_global_novelty import NSGA2GlobalNovelty +from .nsga2_novelty_G_P import NSGA2Novelty_G_P +#Do not know if needed +from .nsga2_helpers import visualize_pareto_front \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py new file mode 100644 index 00000000..eac0f8e2 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -0,0 +1,196 @@ +import cProfile +import pstats + +import numpy as np +from typing import Optional, List, Callable +from joblib import Parallel, delayed + +from suprb.rule import Rule, RuleInit +from suprb.rule.initialization import MeanInit +from suprb.utils import RandomState +from ..base import MultiRuleDiscovery +from ..origin import Matching, SquaredError, RuleOriginGeneration +from ..mutation import RuleMutation, HalfnormIncrease +from ..constraint import CombinedConstraint, MinRange, Clip +from ..acceptance import Variance +from .. import RuleAcceptance, RuleConstraint +from .nsga2_helpers import visualize_pareto_front + +from pymoo.util.nds.non_dominated_sorting import NonDominatedSorting +from pymoo.operators.survival.rank_and_crowding.metrics import calc_crowding_distance, FunctionalDiversity + + +class NSGA2(MultiRuleDiscovery): + """ + Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. + Uses Crowding Distance and NonDominatedSorting from pymoo package. + """ + def __init__( + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + profile: bool = False, + ): + super().__init__( + n_iter=n_iter, + origin_generation=origin_generation, + init=init, + acceptance=acceptance, + constraint=constraint, + random_state=random_state, + n_jobs=n_jobs, + ) + self.mu = mu + self.lmbda = lmbda + self.mutation = mutation + self.constraint = constraint + + if fitness_objs is None: + fitness_objs = [ + lambda r: r.error_, + lambda r: -r.volume_, + ] + + self.fitness_objs = fitness_objs + + if fitness_objs_labels is None: + fitness_objs_labels = [f"obj_{i}" for i in range(len(self.fitness_objs))] + self.fitness_objs_labels = fitness_objs_labels + + self.profile = profile + + def _optimize( + self, + X: np.ndarray, + y: np.ndarray, + initial_rule: Rule, + random_state: RandomState + ) -> Optional[List[Rule]]: + profiler = cProfile.Profile() if self.profile else None + if profiler: + profiler.enable() + + population = [] + + origins = self.origin_generation( + n_rules=self.mu, + X=X, + y=y, + pool=self.pool_, + elitist=self.elitist_, + random_state=random_state, + ) + + population = Parallel(n_jobs=self.n_jobs)( + delayed(self._init_valid_origin)(origin, X, y, random_state) + for origin in origins + ) + + population = [p for p in population if p is not None] + + for _ in range(self.n_iter): + parents = random_state.choice(population, size=self.lmbda, replace=True) + + children = Parallel(n_jobs=self.n_jobs)( + delayed(self._generate_valid_child)(parent, X, y, random_state) + for parent in parents + ) + + children = [c for c in children if c is not None] + + population_combined = population + children + + pareto_fronts = self._fast_nondominated_sort(population_combined) + population = self._build_next_population(pareto_fronts) + + pareto_front = pareto_fronts[0] if pareto_fronts else [] + if profiler: + profiler.disable() + stats = pstats.Stats(profiler).sort_stats("cumtime") + stats.print_stats(20) + + visualize_pareto_front(self, pareto_front) + return pareto_front + +# ──────────────────────────────────────────────────────────────────── +# Helper Functions +# ──────────────────────────────────────────────────────────────────── + def _fast_nondominated_sort(self, population: List[Rule]) -> List[List[Rule]]: + if not population: + return [] + + obj_matrix = np.vstack( + [[obj(rule) for obj in self.fitness_objs] for rule in population] + ) + + fronts = NonDominatedSorting().do(obj_matrix, only_non_dominated_front=False) + return [[population[i] for i in front] for front in fronts] + + + def _assign_crowding_distance( + self, + front: List[Rule], + cd_func, + ): + if not front: + return + + obj_matrix = np.vstack( + [[obj(rule) for obj in self.fitness_objs] for rule in front] + ) + crowding_distances = cd_func.do(obj_matrix) + + for rule, dist in zip(front, crowding_distances): + rule.crowding_distance_ = dist + + + def _init_valid_origin( + self, + origin, + X, + y, + random_state, + ): + rule = self.constraint(self.init(mean=origin, random_state=random_state)).fit(X, y) + return rule if rule.is_fitted_ and rule.experience_> 0 else None + + + def _generate_valid_child( + self, + parent, + X, + y, + random_state, + ): + child = self.constraint(self.mutation(parent, random_state)).fit(X,y) + return child if child.is_fitted_ and child.experience_ > 0 else None + + + def _build_next_population( + self, + pareto_fronts, + ): + population_new = [] + + cd_func = FunctionalDiversity(calc_crowding_distance, filter_out_duplicates=True) + + for front in pareto_fronts: + self._assign_crowding_distance(front, cd_func) + if len(population_new) + len(front) <= self.mu: + population_new.extend(front) + else: + front_sorted = sorted(front, key=lambda rule: -rule.crowding_distance_) + population_new.extend(front_sorted[:self.mu - len(population_new)]) + break + + return population_new \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py new file mode 100644 index 00000000..f850db8c --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py @@ -0,0 +1,133 @@ +import numpy as np +from typing import Optional, List, Callable +from joblib import Parallel, delayed +import matplotlib.pyplot as plt + +from suprb.rule import Rule, RuleInit +from suprb.rule.initialization import MeanInit +from suprb.optimizer.rule.nsga2.nsga2 import NSGA2 +from suprb.optimizer.rule.ns.novelty_calculation import NoveltyCalculation +from suprb.optimizer.rule.ns.archive import ArchiveNovel +from suprb.optimizer.rule.ns.novelty_search_type import NoveltySearchType +from suprb.utils import RandomState +from ..origin import Matching, SquaredError, RuleOriginGeneration +from ..mutation import RuleMutation, HalfnormIncrease +from ..constraint import CombinedConstraint, MinRange, Clip +from ..acceptance import Variance +from .. import RuleAcceptance, RuleConstraint +from .nsga2_helpers import visualize_pareto_front + +import cProfile +import pstats + + + +class NSGA2GlobalNovelty(NSGA2): + """ + Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. + Uses Crowding Distance and NonDominatedSorting from pymoo package. + Uses novelty as a fitness objective. + Deprecated! + """ + def __init__( + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + novelty_calc: NoveltyCalculation = NoveltyCalculation( + novelty_search_type=NoveltySearchType(), + archive=ArchiveNovel(), + k_neighbor=15, + ), + profile: bool = False, + ): + super().__init__( + n_iter=n_iter, + mu=mu, + lmbda=lmbda, + origin_generation=origin_generation, + init=init, + mutation=mutation, + constraint=constraint, + acceptance=acceptance, + random_state=random_state, + n_jobs=n_jobs, + fitness_objs=fitness_objs, + fitness_objs_labels=fitness_objs_labels, + ) + self.novelty_calc = novelty_calc + + self.fitness_objs = list(self.fitness_objs) + [lambda r: -r.novelty_score_] + self.fitness_objs_labels = list(self.fitness_objs_labels) + ['-Novelty'] + + def _optimize( + self, + X: np.ndarray, + y: np.ndarray, + random_state: RandomState + ) -> Optional[List[Rule]]: + profiler = cProfile.Profile() if self.profile else None + if profiler: + profiler.enable() + + self.pool_.clear() + + population = [] + + origins = self.origin_generation( + n_rules=self.mu, + X=X, + y=y, + pool=self.pool_, + elitist=self.elitist_, + random_state=random_state, + ) + + population = Parallel(n_jobs=self.n_jobs)( + delayed(self._init_valid_origin)(origin, X, y, random_state) + for origin in origins + ) + + population = [p for p in population if p is not None] + + for _ in range(self.n_iter): + parents = random_state.choice(population, size=self.lmbda, replace=True) + + children = Parallel(n_jobs=self.n_jobs)( + delayed(self._generate_valid_child)(parent, X, y, random_state) + for parent in parents + ) + + children = [c for c in children if c is not None] + + population_combined = population + children + + self.pool_.extend(population_combined) + self.novelty_calc.archive.archive = self.pool_ + _ = self.novelty_calc(self.pool_) + + pareto_fronts = self._fast_nondominated_sort(population_combined) + population = self._build_next_population(pareto_fronts) + + pareto_front = pareto_fronts[0] + if not pareto_front: + return None + + if profiler: + profiler.disable() + stats = pstats.Stats(profiler).sort_stats("cumtime") + stats.print_stats(20) + + visualize_pareto_front(self, pareto_front) + + return pareto_front + \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2_helpers.py b/suprb/optimizer/rule/nsga2/nsga2_helpers.py new file mode 100644 index 00000000..bd5000c3 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2_helpers.py @@ -0,0 +1,20 @@ +from typing import List + +import numpy as np +from matplotlib import pyplot as plt + +def visualize_pareto_front( + self, + pareto_front, +): + x = [self.fitness_objs[0](r) for r in pareto_front] + y = [self.fitness_objs[1](r) for r in pareto_front] + + plt.figure(figsize=(6, 4)) + plt.scatter(x, y, s=30, edgecolors='k') + plt.xlabel(self.fitness_objs_labels[0]) + plt.ylabel(self.fitness_objs_labels[1]) + plt.title('Pareto Optimal Set (Front 0)') + plt.tight_layout() + plt.savefig("Paretofront.png", dpi=150) + plt.close() diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py new file mode 100644 index 00000000..bdd82d7a --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -0,0 +1,248 @@ +import numpy as np +from typing import Literal, Optional, List, Callable +from joblib import Parallel, delayed + +from suprb.rule import Rule, RuleInit +from suprb.rule.initialization import MeanInit +from suprb.optimizer.rule.nsga2.nsga2 import NSGA2 +from suprb.optimizer.rule.ns.novelty_calculation import NoveltyCalculation +from suprb.optimizer.rule.ns.archive import ArchiveNovel +from suprb.optimizer.rule.ns.novelty_search_type import NoveltySearchType +from suprb.utils import RandomState +from .nsga2_helpers import visualize_pareto_front +from ..origin import SquaredError, RuleOriginGeneration +from ..mutation import RuleMutation, HalfnormIncrease +from ..constraint import CombinedConstraint, MinRange, Clip +from ..acceptance import Variance +from .. import RuleAcceptance, RuleConstraint + +import cProfile +import pstats + + +class NSGA2Novelty_G_P(NSGA2): + """ + NSGA-II variant that adds novelty as an objective and supports restart logic: + If a run's Pareto front only contains trivial rules (e.g., experience == 1), + the algorithm restarts and accumulates only 'useful' rules until `mu` useful + rules are collected or a restart cap is hit. + """ + + def __init__( + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + novelty_calc: NoveltyCalculation = NoveltyCalculation( + novelty_search_type=NoveltySearchType(), + archive=ArchiveNovel(), + k_neighbor=15, + ), + novelty_mode: Literal["G", "P"] = "P", + profile: bool = False, + min_experience: int = 2, + max_restarts: int = 5, + keep_archive_across_restarts: bool = True, + ): + super().__init__( + n_iter=n_iter, + mu=mu, + lmbda=lmbda, + origin_generation=origin_generation, + init=init, + mutation=mutation, + constraint=constraint, + acceptance=acceptance, + random_state=random_state, + n_jobs=n_jobs, + fitness_objs=fitness_objs, + fitness_objs_labels=fitness_objs_labels, + ) + self.novelty_calc = novelty_calc + self.novelty_mode = novelty_mode + self.profile = profile + + self.min_experience = min_experience + self.max_restarts = max_restarts + self.keep_archive_across_restarts = keep_archive_across_restarts + + self.fitness_objs = list(self.fitness_objs or []) + [ + lambda r: -getattr(r, "novelty_score_", np.inf) + ] + self.fitness_objs_labels = list(self.fitness_objs_labels or []) + ["-Novelty"] + + # ──────────────────────────────────────────────────────────────── + # Novelty scoring + # ──────────────────────────────────────────────────────────────── + def _score_novelty( + self, + rules: List[Rule], + cohort: Optional[List[Rule]] = None, + force: bool = False, + ) -> None: + if not rules: + return + + to_score = list(rules) if force else [r for r in rules if not hasattr(r, "novelty_score_")] + if not to_score: + return + + if self.novelty_mode == "G": + ref = list(self.pool_) + if cohort and hasattr(self, "_last_front") and self._last_front: + seen = set(map(id, ref)) + ref.extend([r for r in self._last_front if id(r) not in seen]) + elif cohort: + seen = set(map(id, ref)) + ref.extend([r for r in cohort if id(r) not in seen]) + else: # "P" + ref = list(cohort) if cohort else list(rules) + + self.novelty_calc.archive.archive = ref + _ = self.novelty_calc(to_score) + + if self.novelty_mode == "G": + seen = set(map(id, self.pool_)) + self.pool_.extend([r for r in to_score if (id(r) not in seen)]) + + # ──────────────────────────────────────────────────────────────── + # Helpers for restart logic + # ──────────────────────────────────────────────────────────────── + def _is_useful(self, r: Rule) -> bool: + """Define 'useful' rules here.""" + return getattr(r, "experience_", 0) >= self.min_experience + + def _unique_extend(self, base: List[Rule], new_rules: List[Rule]) -> None: + seen = set(map(id, base)) + for r in new_rules: + if id(r) not in seen: + base.append(r) + seen.add(id(r)) + + # ──────────────────────────────────────────────────────────────── + # One full NSGA-II run: returns a Pareto front + # ──────────────────────────────────────────────────────────────── + def _run_once( + self, + X: np.ndarray, + y: np.ndarray, + random_state: RandomState, + clear_pool: bool, + ) -> Optional[List[Rule]]: + + if clear_pool: + self.pool_.clear() + + profiler = cProfile.Profile() if self.profile else None + if profiler: + profiler.enable() + + origins = self.origin_generation( + n_rules=self.mu, + X=X, + y=y, + pool=self.pool_, + elitist=self.elitist_, + random_state=random_state, + ) + + population = Parallel(n_jobs=self.n_jobs)( + delayed(self._init_valid_origin)(origin, X, y, random_state) for origin in origins + ) + population = [p for p in population if p is not None] + if not population: + if profiler: + profiler.disable() + return None + + self._score_novelty(population, cohort=population, force=True) + + # main loop + for _ in range(self.n_iter): + parents = random_state.choice(population, size=self.lmbda, replace=True) + children = Parallel(n_jobs=self.n_jobs)( + delayed(self._generate_valid_child)(parent, X, y, random_state) for parent in parents + ) + children = [c for c in children if c is not None] + if not children: + continue + + cohort = population + children + self._score_novelty(children, cohort=cohort, force=False) + self._score_novelty(population, cohort=cohort, force=True) + + population_combined = population + children + + pareto_fronts = self._fast_nondominated_sort(population_combined) + self._last_front = pareto_fronts[0] + + population = self._build_next_population(pareto_fronts) + + pareto_front = pareto_fronts[0] if pareto_fronts else [] + + if profiler: + profiler.disable() + stats = pstats.Stats(profiler).sort_stats("cumtime") + stats.print_stats(20) + + return pareto_front + + # ──────────────────────────────────────────────────────────────── + # Running until `mu` useful rules are collected or max_restarts is hit + # ──────────────────────────────────────────────────────────────── + def _optimize( + self, + X: np.ndarray, + y: np.ndarray, + initial_rule: Rule, + random_state: RandomState, + ) -> Optional[List[Rule]]: + + useful_rules: List[Rule] = [] + restarts = 0 + clear_pool = True + + while len(useful_rules) < self.mu and restarts <= self.max_restarts: + pareto_front = self._run_once( + X=X, + y=y, + random_state=random_state, + clear_pool=clear_pool if not self.keep_archive_across_restarts else False, + ) + + if not pareto_front: + restarts += 1 + continue + + useful_from_front = [r for r in pareto_front if self._is_useful(r)] + self._unique_extend(useful_rules, useful_from_front) + + only_trivial = all(getattr(r, "experience_", 0) < self.min_experience for r in pareto_front) + + if only_trivial and len(useful_rules) < self.mu: + restarts += 1 + continue + + if len(useful_rules) < self.mu: + restarts += 1 + continue + + # Truncate to mu if we got more (optional) + if useful_rules: + useful_rules = useful_rules[: self.mu] + + to_visualize = useful_rules if useful_rules else (pareto_front or []) + if to_visualize: + visualize_pareto_front(self, to_visualize) + + print(f"Iterations needed to generate mu useful rules: {restarts + 1}") + return useful_rules if useful_rules else (pareto_front or None) diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py new file mode 100644 index 00000000..7d00a6e4 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -0,0 +1,96 @@ +import numpy as np +from typing import Optional, List, Callable + +from suprb.rule import Rule, RuleInit +from suprb.utils import RandomState + +from src.suprb.suprb.rule.initialization import MeanInit +from ..origin import SquaredError, RuleOriginGeneration +from ..mutation import RuleMutation, HalfnormIncrease +from ..constraint import CombinedConstraint, MinRange, Clip +from ..acceptance import Variance +from .. import RuleAcceptance, RuleConstraint + +from .nsga2 import NSGA2 + +class NSGA2InfoGain(NSGA2): + """ + NSGA2 with error and information gain as objectives. + TODO: Better Description + """ + def __init__( + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + profile: bool = False, + ): + super().__init__( + n_iter=n_iter, + mu=mu, + lmbda=lmbda, + origin_generation=origin_generation, + init=init, + mutation=mutation, + constraint=constraint, + acceptance=acceptance, + random_state=random_state, + n_jobs=n_jobs, + fitness_objs=fitness_objs, + fitness_objs_labels=fitness_objs_labels, + profile=profile, + ) + + + def _optimize( + self, + X: np.ndarray, + y: np.ndarray, + initial_rule: Rule, + random_state: RandomState + ): + # Bind dataset for the IG objective + self._X_ref = X + self._y_ref = y + self._H_y = self._entropy(y) + + self.fitness_objs = [ + (lambda r: r.error_), + (lambda r, X_ref=X, y_ref=y, H_y=self._H_y: -self._information_gain(r.match(X_ref), y_ref, H_y)), + ] + self.fitness_objs_labels = ["Error", "-IG"] + + return super()._optimize(X, y, initial_rule, random_state) + + +# ──────────────────────────────────────────────────────────────────── +# Information Gain Helpers +# ──────────────────────────────────────────────────────────────────── + @staticmethod + def _entropy(y: np.ndarray) -> float: + if y.size == 0: + return 0.0 + vals, cnt = np.unique(y, return_counts=True) + p = cnt / cnt.sum() + return float(-np.sum(p * np.log2(p + 1e-12))) + + + @staticmethod + def _information_gain(mask: np.ndarray, y: np.ndarray, H_y: float) -> float: + if mask.size == 0: + return 0.0 + p = float(mask.mean()) + if p == 0.0 or p == 1.0: + return 0.0 + H_m = NSGA2InfoGain._entropy(y[mask]) + H_nm = NSGA2InfoGain._entropy(y[~mask]) + return H_y - (p * H_m + (1.0 - p) * H_nm) \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/pymoo/__init__.py b/suprb/optimizer/rule/nsga2/pymoo/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py b/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py new file mode 100644 index 00000000..43a6b391 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py @@ -0,0 +1,41 @@ +from pymoo.core.mutation import Mutation +import numpy as np +from suprb.optimizer.rule.mutation import RuleMutation +from suprb.rule.base import Rule +from suprb.optimizer.rule.constraint import RuleConstraint + +class PymooRuleMutation(Mutation): + def __init__(self, initial_rule: Rule, mutation_operator: RuleMutation, constraint: RuleConstraint, X_train, y_train, random_state): + super().__init__() + self.initial_rule = initial_rule + self.mutation_operator = mutation_operator + self.constraint = constraint + self.X_train = X_train + self.y_train = y_train + self.random_state = random_state + + # def _do(self, problem, X, **kwargs): + # def mutate(params): + # r = self.initial_rule.clone().set_param_vector(params) + # r = self.mutation_operator(r, self.random_state) + # r = self.constraint(r) + # return r.get_param_vector() + + # mutated_rules = [mutate(p) for p in X] + # return np.array(mutated_rules) + + def _do(self, problem, X, **kwargs): + mutated_population = [] + + for params in X: + rule = self.initial_rule.clone() + rule.set_param_vector(params) + + mutated_rule = self.constraint(self.mutation_operator(rule, self.random_state)).fit(self.X_train, self.y_train) + + if mutated_rule.is_fitted_ and mutated_rule.experience_ > 0: + mutated_population.append(mutated_rule.get_param_vector()) + else: + mutated_population.append(params) + + return np.array(mutated_population) \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py new file mode 100644 index 00000000..0d620234 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py @@ -0,0 +1,132 @@ +import numpy as np +from typing import Optional + +from suprb.rule import Rule, RuleInit +from suprb.rule.initialization import MeanInit +from suprb.optimizer.rule.nsga2.pymoo.rule_optimization_problem import RuleOptimizationProblem +from suprb.optimizer.rule.nsga2.pymoo.pymoo_mutation import PymooRuleMutation +from suprb.utils import RandomState +from src.suprb.suprb.optimizer.rule.base import ParallelSingleRuleDiscovery +from src.suprb.suprb.optimizer.rule.origin import SquaredError, RuleOriginGeneration +from src.suprb.suprb.optimizer.rule.mutation import RuleMutation, HalfnormIncrease +from src.suprb.suprb.optimizer.rule.constraint import CombinedConstraint, MinRange, Clip +from src.suprb.suprb.optimizer.rule.acceptance import Variance +from src.suprb.suprb.optimizer.rule import RuleAcceptance, RuleConstraint + + +from pymoo.algorithms.moo.nsga2 import NSGA2 +from pymoo.optimize import minimize +from pymoo.termination import get_termination + +import cProfile +import pstats + + + +class PymooNSGA2(ParallelSingleRuleDiscovery): + """ + Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. + This implementation is slower because repeated vectorization of the rule objects. + Deprecated. + """ + def __init__( + self, + n_iter: int = 100, + mu: int = 20, + lmbda: int = 40, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + ): + super().__init__( + n_iter=n_iter, + origin_generation=origin_generation, + init=init, + acceptance=acceptance, + constraint=constraint, + random_state=random_state, + n_jobs=n_jobs, + ) + self.mu = mu + self.lmbda = lmbda + self.mutation = mutation + self.constraint = constraint + + def _optimize( + self, + X: np.ndarray, + y: np.ndarray, + initial_rule: Rule, + random_state: RandomState, + ) -> Optional[Rule]: + rule_template = initial_rule.clone().fit(X, y) + + problem = RuleOptimizationProblem( + rule_template, + X, + y, + constraint=self.constraint, + ) + + mutation = PymooRuleMutation( + rule_template, + mutation_operator=self.mutation, + constraint=self.constraint, + X_train=X, + y_train=y, + random_state=random_state, + ) + + algorithm = NSGA2( + pop_size=self.lmbda, + mutation=mutation, + #mutation=PM(eta=50, prob=0.8), + #crossover=SBX(eta=, prob=0.9), + eliminate_duplicates=False, + ) + + termination = get_termination( + "n_gen", + self.n_iter + ) + + # ─────────────── START PROFILING ─────────────── + profiler = cProfile.Profile() + profiler.enable() + + result = minimize( + problem, + algorithm, + termination, + seed=int(random_state.integers(0, 2**32 - 1)), + verbose=False, + ) + + profiler.disable() + # Dump the top 20 functions by cumulative time + stats = pstats.Stats(profiler).sort_stats("cumtime") + stats.print_stats(20) + # ─────────────── END PROFILING ───────────────── + + population = result.algorithm.pop + + F = population.get("F") + Xf = population.get("X") + rank = population.get("rank") + + + pf_idx = np.where(rank == 0)[0] + if pf_idx.size == 0: + return None + + best_idx = pf_idx[np.argmin(F[pf_idx, 0])] + + best_vec = Xf[best_idx] + best_rule = rule_template.clone().set_param_vector(best_vec) + best_rule = best_rule.fit(X, y) + + return best_rule if best_rule.is_fitted_ and best_rule.experience_ > 0 else None diff --git a/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py new file mode 100644 index 00000000..0d6a76ed --- /dev/null +++ b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py @@ -0,0 +1,54 @@ +import numpy as np +from typing import Optional, List + +from suprb.rule import Rule, RuleInit +from suprb.rule.initialization import MeanInit +from suprb.utils import RandomState +from src.suprb.suprb.optimizer.rule.base import ParallelSingleRuleDiscovery +from src.suprb.suprb.optimizer.rule.origin import SquaredError, RuleOriginGeneration +from src.suprb.suprb.optimizer.rule.mutation import RuleMutation, HalfnormIncrease +from src.suprb.suprb.optimizer.rule.constraint import CombinedConstraint, MinRange, Clip +from src.suprb.suprb.optimizer.rule.acceptance import Variance +from src.suprb.suprb.optimizer.rule import RuleAcceptance, RuleConstraint + +from pymoo.core.problem import Problem + + +class RuleOptimizationProblem(Problem): + def __init__(self, rule: Rule, X: np.ndarray, y: np.ndarray, constraint: RuleConstraint): + self.rule_template = rule + self.X = X + self.y = y + self.param_len = len(rule.get_param_vector()) + self.constraint = constraint + + xl = np.full(self.param_len, -1.0) + xu = np.full(self.param_len, 1.0) + + super().__init__( + n_var=self.param_len, + n_obj=2, + n_constr=0, + xl=xl, + xu=xu, + elementwise_evaluation=False + ) + + def _evaluate(self, X, out, *args, **kwargs): + F = [] + for x in X: + # 1) build & inject the candidate vector + rule = self.rule_template.clone().set_param_vector(x) + + # 2) fit to produce new match.bounds, error_, experience_, etc. + rule = rule.fit(self.X, self.y) + + if not rule.is_fitted_ or rule.experience_ == 0: + F.append([np.inf, np.inf]) + else: + # 3) now apply your constraint to the *fitted* bounds + rule = self.constraint(rule) + # 4) record error & NEGATIVE volume + F.append([rule.error_, -rule.volume_]) + + out["F"] = np.array(F) diff --git a/suprb/rule/base.py b/suprb/rule/base.py index c8ba8951..8d646790 100644 --- a/suprb/rule/base.py +++ b/suprb/rule/base.py @@ -105,3 +105,11 @@ def clone(self, **kwargs) -> Rule: def _more_str_attributes(self) -> dict: return {"experience": self.experience_} + + def get_param_vector(self) -> np.array: + return self.match.get_param_vector() + + def set_param_vector(self, x:np.array) -> Rule: + rule = self.clone() + rule.match.set_param_vector(x) + return rule diff --git a/suprb/rule/fitness.py b/suprb/rule/fitness.py index 6e624b3b..d8d18ca6 100644 --- a/suprb/rule/fitness.py +++ b/suprb/rule/fitness.py @@ -2,9 +2,11 @@ from typing import Callable import numpy as np +import warnings -from suprb.fitness import pseudo_accuracy, emary, wu +from suprb.fitness import pseudo_accuracy, emary, wu, moo from . import Rule, RuleFitness +from ..fitness import BaseFitness class PseudoAccuracy(RuleFitness): @@ -64,3 +66,28 @@ class VolumeWu(VolumeRuleFitness): def __init__(self, alpha: float = 0.05): super().__init__(alpha) self.fitness_func_ = wu + +class MooFitness(RuleFitness, metaclass=ABCMeta): + """ + A placeholder fitness function which always returns NaN. + This function is used in multi-objective optimization (MOO) as the rule attribute `.fitness_` is never accessed. + Using another fitness function has no impact on the MOO and may be misleading. + + Changing the fitness attribute to a vector may make the code more intuitive. + """ + + fitness_func_: Callable + + def __init__(self): + super().__init__() + self.fitness_func_ = moo + warnings.warn( + "MooFitness is a dummy fitness function which always returns NaN. " + "When using multi-objective optimization (MOO), the rule attribute `.fitness_` is never accessed. " + "Using another fitness function has no impact on the MOO and may be misleading.", + UserWarning, + stacklevel=2, + ) + + def __call__(self, rule: Rule) -> float: + return self.fitness_func_() \ No newline at end of file diff --git a/suprb/rule/matching.py b/suprb/rule/matching.py index c89c9f28..2eb31a09 100644 --- a/suprb/rule/matching.py +++ b/suprb/rule/matching.py @@ -41,6 +41,14 @@ def _validate_bounds(self, X: np.ndarray): if self.bounds.shape[0] != X.shape[1]: raise ValueError(f"bounds- and input data dimension mismatch: {self.bounds.shape[0]} != {X.shape[1]}") + + @abstractmethod + def get_param_vector(self) -> np.array: + pass + + @abstractmethod + def set_param_vector(self, x: np.array ) -> None: + pass class OrderedBound(MatchingFunction): @@ -77,6 +85,14 @@ def min_range(self, min_range: float): self.bounds[invalid_indices, 0] -= min_range / 2 self.bounds[invalid_indices, 1] += min_range / 2 + def get_param_vector(self): + return self.bounds.flatten() + + def set_param_vector(self, x): + x = np.asarray(x) + self.bounds = x.reshape((-1, 2)) + + class UnorderedBound(MatchingFunction): """ @@ -124,6 +140,13 @@ def min_range(self, min_range: float): self.bounds[invalid_indices_r, 0] -= min_range / 2 self.bounds[invalid_indices_r, 1] += min_range / 2 + def get_param_vector(self): + return self.bounds.flatten() + + def set_param_vector(self, x): + d = x.shape[0] // 2 + self.bounds = x.reshape((d, 2)) + class CenterSpread(MatchingFunction): """ @@ -168,6 +191,13 @@ def min_range(self, min_range: float): invalid_indices = np.argwhere(diff < min_range) self.bounds[invalid_indices, 1] += min_range / 2 + def get_param_vector(self): + return self.bounds.flatten() + + def set_param_vector(self, x): + d = x.shape[0] // 2 + self.bounds = x.reshape((d, 2)) + class MinPercentage(MatchingFunction): """ @@ -211,3 +241,10 @@ def min_range(self, min_range: float): # Approximate increasing the width by min_range self.bounds[invalid_indices, 0] -= min_range / 2 self.bounds[invalid_indices, 1] += min_range + + def get_param_vector(self): + return self.bounds.flatten() + + def set_param_vector(self, x): + d = x.shape[0] // 2 + self.bounds = x.reshape((d, 2)) diff --git a/suprb/suprb.py b/suprb/suprb.py index 7b9869a7..c6db2ebd 100644 --- a/suprb/suprb.py +++ b/suprb/suprb.py @@ -4,8 +4,7 @@ import numpy as np from sklearn import clone from sklearn.utils import check_X_y -from sklearn.utils.validation import check_is_fitted, check_array, validate_data - +from sklearn.utils.validation import check_is_fitted, check_array from .base import BaseRegressor from .exceptions import PopulationEmptyWarning @@ -23,18 +22,6 @@ class SupRB(BaseRegressor): - def __sklearn_tags__(self): - tags = super().__sklearn_tags__() - tags.target_tags.single_output = False - tags.non_deterministic = True - return tags - - def _more_tags(self): - # additional or override tags - return { - # 'some_tag': True, - } - """The multi-solution batch learning LCS developed by the Organic Computing group at Universität Augsburg. Parameters @@ -163,7 +150,8 @@ def fit(self, X: np.ndarray, y: np.ndarray, cleanup=False): self.elitist_.complexity_ = 99999 # Check that x and y have correct shape - X, y = validate_data(self, X, y, ensure_2d=True) + X, y = check_X_y(X, y, dtype="float64", y_numeric=True) + y = check_array(y, ensure_2d=False, dtype="float64") # Init sklearn interface self.n_features_in_ = X.shape[1] @@ -285,9 +273,11 @@ def _compose_solution(self, X: np.ndarray, y: np.ndarray): # Optimize self.solution_composition_.optimize(X, y) - def predict(self, X): - check_is_fitted(self) - X = validate_data(self, X, ensure_2d=True, reset=False) + def predict(self, X: np.ndarray): + # Check is fit had been called + check_is_fitted(self, ["is_fitted_"]) + # Input validation + X = check_array(X) if hasattr(self, "is_error_") and self.is_error_: return [0] * len(X) diff --git a/tests/test_solution.py b/tests/test_solution.py index c3983199..fafb9366 100644 --- a/tests/test_solution.py +++ b/tests/test_solution.py @@ -1,6 +1,6 @@ import unittest -from sklearn.utils.estimator_checks import check_estimator, _regression_dataset +from sklearn.utils.estimator_checks import check_estimator import suprb import suprb.logging.stdout @@ -18,69 +18,55 @@ class TestSolution(unittest.TestCase): def test_check_ga(self): estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=GeneticAlgorithm(n_iter=2, population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) - check_estimator(estimator) def test_check_saga1(self): estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=SelfAdaptingGeneticAlgorithm1(n_iter=2, population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) check_estimator(estimator) def test_check_saga2(self): estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=SelfAdaptingGeneticAlgorithm2(n_iter=2, population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) - check_estimator(estimator) def test_check_saga3(self): estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=SelfAdaptingGeneticAlgorithm3(n_iter=2, population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) - check_estimator(estimator) def test_check_sas(self): estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=SasGeneticAlgorithm(n_iter=2, initial_population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) - check_estimator(estimator) diff --git a/tests/test_suprb.py b/tests/test_suprb.py index b8b8d191..5affa92b 100644 --- a/tests/test_suprb.py +++ b/tests/test_suprb.py @@ -1,7 +1,7 @@ import unittest import numpy as np -from sklearn.utils.estimator_checks import check_estimator, _regression_dataset +from sklearn.utils.estimator_checks import check_estimator import suprb import suprb.logging.stdout @@ -35,16 +35,13 @@ def test_check_estimator(self): # Low n_iter for speed. Still takes forever though. estimator = suprb.SupRB( - n_iter=4, + n_iter=1, rule_discovery=ES1xLambda(n_iter=4, lmbda=1, delay=2), solution_composition=suprb.optimizer.solution.ga.GeneticAlgorithm(n_iter=2, population_size=2), logger=suprb.logging.stdout.StdoutLogger(), verbose=10, ) - X, y = _regression_dataset() - estimator.fit(X, y) - check_estimator(estimator) def test_early_stopping(self): From ae44262e0adb0cc502bfc149cc4a4112ed0547ac Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 15 Sep 2025 17:32:57 +0200 Subject: [PATCH 02/31] change append of fitness ig obj --- suprb/optimizer/rule/nsga2/nsga2ig.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index 7d00a6e4..256baa38 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -63,11 +63,10 @@ def _optimize( self._y_ref = y self._H_y = self._entropy(y) - self.fitness_objs = [ - (lambda r: r.error_), + self.fitness_objs = list(self.fitness_objs or []) + [ (lambda r, X_ref=X, y_ref=y, H_y=self._H_y: -self._information_gain(r.match(X_ref), y_ref, H_y)), ] - self.fitness_objs_labels = ["Error", "-IG"] + self.fitness_objs_labels = list(self.fitness_objs_labels or []) + ["-IG"] return super()._optimize(X, y, initial_rule, random_state) From 0d4374726c6b462e6192e5d6a59100c33af0d02e Mon Sep 17 00:00:00 2001 From: vonproda Date: Tue, 16 Sep 2025 16:37:28 +0200 Subject: [PATCH 03/31] change constructors to be sklearn compatible --- suprb/optimizer/rule/nsga2/nsga2.py | 27 ++++++++++++------ suprb/optimizer/rule/nsga2/nsga2_helpers.py | 3 ++ .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 28 ++++++++++++++----- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index eac0f8e2..e9d27321 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -2,7 +2,7 @@ import pstats import numpy as np -from typing import Optional, List, Callable +from typing import Optional, List, Callable, Tuple from joblib import Parallel, delayed from suprb.rule import Rule, RuleInit @@ -60,12 +60,14 @@ def __init__( lambda r: r.error_, lambda r: -r.volume_, ] - - self.fitness_objs = fitness_objs + + # Change fitness objectives List to tuple avoid accidental changes. + # Extra objectives in subclasses are added during runtime to avoid sklearn.clone errors. + self.fitness_objs: Tuple[Callable[[Rule], float], ...] = tuple(fitness_objs) if fitness_objs_labels is None: fitness_objs_labels = [f"obj_{i}" for i in range(len(self.fitness_objs))] - self.fitness_objs_labels = fitness_objs_labels + self.fitness_objs_labels: Tuple[str, ...] = tuple(fitness_objs_labels) self.profile = profile @@ -128,9 +130,9 @@ def _optimize( def _fast_nondominated_sort(self, population: List[Rule]) -> List[List[Rule]]: if not population: return [] - + objs = self._fitness_objs_runtime() obj_matrix = np.vstack( - [[obj(rule) for obj in self.fitness_objs] for rule in population] + [[obj(rule) for obj in objs] for rule in population] ) fronts = NonDominatedSorting().do(obj_matrix, only_non_dominated_front=False) @@ -145,8 +147,9 @@ def _assign_crowding_distance( if not front: return + objs = self._fitness_objs_runtime() obj_matrix = np.vstack( - [[obj(rule) for obj in self.fitness_objs] for rule in front] + [[obj(rule) for obj in objs] for rule in front] ) crowding_distances = cd_func.do(obj_matrix) @@ -193,4 +196,12 @@ def _build_next_population( population_new.extend(front_sorted[:self.mu - len(population_new)]) break - return population_new \ No newline at end of file + return population_new + + + def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + return list(self.fitness_objs) + + + def _fitness_labels_runtime(self) -> List[str]: + return list(self.fitness_objs_labels) \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2_helpers.py b/suprb/optimizer/rule/nsga2/nsga2_helpers.py index bd5000c3..56004eac 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_helpers.py +++ b/suprb/optimizer/rule/nsga2/nsga2_helpers.py @@ -3,6 +3,9 @@ import numpy as np from matplotlib import pyplot as plt +#deprecated +#TODO: Rework to be sklearn conform. Extra objectives are currently added during runtime to be conform with sklearn standards. Need to fix this function. + def visualize_pareto_front( self, pareto_front, diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index bdd82d7a..9bd26d33 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -75,10 +75,13 @@ def __init__( self.max_restarts = max_restarts self.keep_archive_across_restarts = keep_archive_across_restarts - self.fitness_objs = list(self.fitness_objs or []) + [ - lambda r: -getattr(r, "novelty_score_", np.inf) - ] - self.fitness_objs_labels = list(self.fitness_objs_labels or []) + ["-Novelty"] + # self.fitness_objs = list(self.fitness_objs or []) + [ + # lambda r: -getattr(r, "novelty_score_", np.inf) + # ] + # self.fitness_objs_labels = list(self.fitness_objs_labels or []) + ["-Novelty"] + + self._novelty_obj = lambda r: -getattr(r, "novelty_score_", np.inf) + self._novelty_label = "-Novelty" # ──────────────────────────────────────────────────────────────── # Novelty scoring @@ -196,9 +199,9 @@ def _run_once( return pareto_front - # ──────────────────────────────────────────────────────────────── - # Running until `mu` useful rules are collected or max_restarts is hit - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Running until `mu` useful rules are collected or max_restarts is hit +# ──────────────────────────────────────────────────────────────── def _optimize( self, X: np.ndarray, @@ -246,3 +249,14 @@ def _optimize( print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) + + +# ──────────────────────────────────────────────────────────────── +# Helper functions +# ──────────────────────────────────────────────────────────────── + def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + return list(self.fitness_objs) + [self._novelty_obj] + + + def _fitness_labels_runtime(self) -> List[str]: + return list(self.fitness_objs_labels) + [self._novelty_label] From 9eb80c123de6e1d1c5e8b202e13d1a4e55766724 Mon Sep 17 00:00:00 2001 From: vonproda Date: Tue, 16 Sep 2025 17:02:07 +0200 Subject: [PATCH 04/31] remove use of visualize function --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 9bd26d33..6ad6e941 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -243,9 +243,9 @@ def _optimize( if useful_rules: useful_rules = useful_rules[: self.mu] - to_visualize = useful_rules if useful_rules else (pareto_front or []) - if to_visualize: - visualize_pareto_front(self, to_visualize) + # to_visualize = useful_rules if useful_rules else (pareto_front or []) + # if to_visualize: + # visualize_pareto_front(self, to_visualize) #TODO: Fix function print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) From 24b67e5c427aa5a460d6605a4ebdb301dd6ba65e Mon Sep 17 00:00:00 2001 From: vonproda Date: Tue, 16 Sep 2025 17:37:32 +0200 Subject: [PATCH 05/31] ~ --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 6ad6e941..c31025f1 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -210,11 +210,19 @@ def _optimize( random_state: RandomState, ) -> Optional[List[Rule]]: + if getattr(self, "elitist_", None) is None: + self.elitist_ = initial_rule #TODO Check if this is the correct place to set the elitist for origin generation + useful_rules: List[Rule] = [] restarts = 0 clear_pool = True while len(useful_rules) < self.mu and restarts <= self.max_restarts: + + if not self.keep_archive_across_restarts: + # fresh restart: ensure a sane starting elitist + self.elitist_ = self.elitist_ or initial_rule + pareto_front = self._run_once( X=X, y=y, From 1c47d38085ca75d591bf3ac01aa7496334844135 Mon Sep 17 00:00:00 2001 From: vonproda Date: Tue, 16 Sep 2025 18:00:13 +0200 Subject: [PATCH 06/31] remove visualize function from nsga2 _optimize --- suprb/optimizer/rule/nsga2/nsga2.py | 2 +- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index e9d27321..842078bf 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -121,7 +121,7 @@ def _optimize( stats = pstats.Stats(profiler).sort_stats("cumtime") stats.print_stats(20) - visualize_pareto_front(self, pareto_front) + #visualize_pareto_front(self, pareto_front) #TODO: Fix this function return pareto_front # ──────────────────────────────────────────────────────────────────── diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index c31025f1..de1d6ebc 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -210,19 +210,12 @@ def _optimize( random_state: RandomState, ) -> Optional[List[Rule]]: - if getattr(self, "elitist_", None) is None: - self.elitist_ = initial_rule #TODO Check if this is the correct place to set the elitist for origin generation useful_rules: List[Rule] = [] restarts = 0 clear_pool = True while len(useful_rules) < self.mu and restarts <= self.max_restarts: - - if not self.keep_archive_across_restarts: - # fresh restart: ensure a sane starting elitist - self.elitist_ = self.elitist_ or initial_rule - pareto_front = self._run_once( X=X, y=y, From 4b353dcce392d5d662d3ced68eb7dfd56340c1dd Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 17 Sep 2025 14:41:28 +0200 Subject: [PATCH 07/31] refactor ig nsga2 --- suprb/optimizer/rule/nsga2/nsga2ig.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index 256baa38..1575e668 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -63,10 +63,8 @@ def _optimize( self._y_ref = y self._H_y = self._entropy(y) - self.fitness_objs = list(self.fitness_objs or []) + [ - (lambda r, X_ref=X, y_ref=y, H_y=self._H_y: -self._information_gain(r.match(X_ref), y_ref, H_y)), - ] - self.fitness_objs_labels = list(self.fitness_objs_labels or []) + ["-IG"] + self._infogain_obj = lambda r, X_ref=X, y_ref=y, H_y=self._H_y: -self._information_gain(r.match(X_ref), y_ref, H_y) + self._infogain_label = "-IG" return super()._optimize(X, y, initial_rule, random_state) @@ -92,4 +90,13 @@ def _information_gain(mask: np.ndarray, y: np.ndarray, H_y: float) -> float: return 0.0 H_m = NSGA2InfoGain._entropy(y[mask]) H_nm = NSGA2InfoGain._entropy(y[~mask]) - return H_y - (p * H_m + (1.0 - p) * H_nm) \ No newline at end of file + return H_y - (p * H_m + (1.0 - p) * H_nm) + +# ──────────────────────────────────────────────────────────────── +# Helper functions +# ──────────────────────────────────────────────────────────────── +def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + return list(self.fitness_objs) + [self._infogain_obj] + +def _fitness_labels_runtime(self) -> List[str]: + return list(self.fitness_objs_labels) + [self._infogain_label] From 1e38c33a0ec97d6a0ad139ed9898ef26333505ae Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 17 Sep 2025 14:56:58 +0200 Subject: [PATCH 08/31] change init for nsga2 --- suprb/optimizer/rule/nsga2/__init__.py | 3 ++- suprb/optimizer/rule/nsga2/nsga2_global_novelty.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/__init__.py b/suprb/optimizer/rule/nsga2/__init__.py index 02c8283a..d7488ef8 100644 --- a/suprb/optimizer/rule/nsga2/__init__.py +++ b/suprb/optimizer/rule/nsga2/__init__.py @@ -1,6 +1,7 @@ from .nsga2 import NSGA2 -from src.suprb.suprb.optimizer.rule.nsga2.pymoo.pymoo_nsga2 import PymooNSGA2 +from .pymoo.pymoo_nsga2 import PymooNSGA2 from .nsga2_global_novelty import NSGA2GlobalNovelty from .nsga2_novelty_G_P import NSGA2Novelty_G_P +from .nsga2ig import NSGA2InfoGain #Do not know if needed from .nsga2_helpers import visualize_pareto_front \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py index f850db8c..2d094039 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py +++ b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py @@ -27,7 +27,7 @@ class NSGA2GlobalNovelty(NSGA2): Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. Uses Crowding Distance and NonDominatedSorting from pymoo package. Uses novelty as a fitness objective. - Deprecated! + TODO Deprecated! """ def __init__( self, From f8b58cbbd6ef3135485ec235b58bac58d1cba892 Mon Sep 17 00:00:00 2001 From: vonproda Date: Fri, 19 Sep 2025 16:38:10 +0200 Subject: [PATCH 09/31] try to fix sklearn clone error --- examples/example_1_nsga2_novelty.py | 111 ++++++++++++++++++ .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 108 +++++++++-------- 2 files changed, 169 insertions(+), 50 deletions(-) create mode 100644 examples/example_1_nsga2_novelty.py diff --git a/examples/example_1_nsga2_novelty.py b/examples/example_1_nsga2_novelty.py new file mode 100644 index 00000000..afd0eb01 --- /dev/null +++ b/examples/example_1_nsga2_novelty.py @@ -0,0 +1,111 @@ +import sklearn +import matplotlib.pyplot as plt +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate, train_test_split + +from suprb import SupRB +from suprb.utils import check_random_state +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm + +from suprb.optimizer.rule.nsga2 import NSGA2Novelty_G_P +from utils import log_scores + +import numpy as np + +from sklearn.linear_model import Ridge +from sklearn.utils import Bunch, shuffle + +from suprb import rule, SupRB +from suprb.logging.combination import CombinedLogger +from suprb.logging.default import DefaultLogger +from suprb.logging.stdout import StdoutLogger +from suprb.optimizer.solution import ga +from suprb.optimizer.rule import origin, mutation + +from suprb.optimizer.rule.ns.novelty_calculation import NoveltyCalculation +from suprb.optimizer.rule.ns.novelty_search_type import MinimalCriteria + + + + +def load_higdon_gramacy_lee(n_samples=1000, noise=0, random_state=None): + random_state_ = check_random_state(random_state) + + X = np.linspace(0, 20, num=n_samples) + y = np.zeros(n_samples) + + y[X < 10] = np.sin(np.pi * X[X < 10] / 5) + 0.2 * np.cos(4 * np.pi * X[X < 10] / 5) + y[X >= 10] = X[X >= 10] / 10 - 1 + + y += random_state_.normal(scale=noise, size=n_samples) + X = X.reshape((-1, 1)) + + return sklearn.utils.shuffle(X, y, random_state=random_state) + + +def create_plot(scores): + fig, axes = plt.subplots(2, 2) + X_plot = np.linspace(X.min(), X.max(), 500).reshape((-1, 1)) + for ax, model in zip(axes.flatten(), scores["estimator"]): + pred = model.predict(X_plot) + ax.scatter(X, y, c="b", s=3, label="y_true") + ax.plot(X_plot, pred, c="r", label="y_pred") + + plt.savefig("result.png") + + +if __name__ == "__main__": + random_state = 42 + + X, y = load_higdon_gramacy_lee(noise=0.1, random_state=random_state) + + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(y.reshape((-1, 1))).reshape((-1,)) + + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) + + model = SupRB( + rule_discovery=NSGA2Novelty_G_P( + n_iter=16, + mu=16, + lmbda=64, + origin_generation=origin.SquaredError(), + init=rule.initialization.MeanInit( + fitness=rule.fitness.MooFitness(), + model=Ridge(alpha=0.01, random_state=random_state), + # matching_type=rule.matching.OrderedBound([-1, 1]) + ), + mutation=mutation.Normal( + # matching_type=rule.matching.OrderedBound([-1, 1]), + sigma=1.22 + ), + fitness_objs=[lambda r: r.error_], + fitness_objs_labels=["Error"], # novelty objective is added internally + novelty_calc=NoveltyCalculation( + k_neighbor=15, + # novelty_search_type=MinimalCriteria(min_examples_matched=15) # <- tuned #TODO: Leads to warnings in crowding distance calculation. + ), + novelty_mode="P", + profile=False, + min_experience=2, # Rules that match only one sample are considered trivial, so min_experience >= 2 + max_restarts=4, + keep_archive_across_restarts=True, + ), + solution_composition=GeneticAlgorithm() + ) + + scores = cross_validate( + model, + X_train, + y_train, + cv=4, + n_jobs=1, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + ) + + create_plot(scores) + + log_scores(scores) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index de1d6ebc..c1955a23 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -1,3 +1,5 @@ +import warnings + import numpy as np from typing import Literal, Optional, List, Callable from joblib import Parallel, delayed @@ -29,29 +31,29 @@ class NSGA2Novelty_G_P(NSGA2): """ def __init__( - self, - n_iter: int = 32, - mu: int = 50, - lmbda: int = 100, - origin_generation: RuleOriginGeneration = SquaredError(), - init: RuleInit = MeanInit(), - mutation: RuleMutation = HalfnormIncrease(sigma=1.22), - constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), - acceptance: RuleAcceptance = Variance(), - random_state: int = None, - n_jobs: int = 1, - fitness_objs: Optional[List[Callable[[Rule], float]]] = None, - fitness_objs_labels: Optional[List[str]] = None, - novelty_calc: NoveltyCalculation = NoveltyCalculation( - novelty_search_type=NoveltySearchType(), - archive=ArchiveNovel(), - k_neighbor=15, - ), - novelty_mode: Literal["G", "P"] = "P", - profile: bool = False, - min_experience: int = 2, - max_restarts: int = 5, - keep_archive_across_restarts: bool = True, + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + novelty_calc: NoveltyCalculation = NoveltyCalculation( + novelty_search_type=NoveltySearchType(), + archive=ArchiveNovel(), + k_neighbor=15, + ), + novelty_mode: Literal["G", "P"] = "P", + profile: bool = False, + min_experience: int = 2, + max_restarts: int = 5, + keep_archive_across_restarts: bool = True, ): super().__init__( n_iter=n_iter, @@ -87,10 +89,10 @@ def __init__( # Novelty scoring # ──────────────────────────────────────────────────────────────── def _score_novelty( - self, - rules: List[Rule], - cohort: Optional[List[Rule]] = None, - force: bool = False, + self, + rules: List[Rule], + cohort: Optional[List[Rule]] = None, + force: bool = False, ) -> None: if not rules: return @@ -131,17 +133,19 @@ def _unique_extend(self, base: List[Rule], new_rules: List[Rule]) -> None: base.append(r) seen.add(id(r)) + # ──────────────────────────────────────────────────────────────── # One full NSGA-II run: returns a Pareto front # ──────────────────────────────────────────────────────────────── def _run_once( - self, - X: np.ndarray, - y: np.ndarray, - random_state: RandomState, - clear_pool: bool, + self, + X: np.ndarray, + y: np.ndarray, + random_state: RandomState, + clear_pool: bool, + elitist=None, ) -> Optional[List[Rule]]: - + if clear_pool: self.pool_.clear() @@ -149,16 +153,20 @@ def _run_once( if profiler: profiler.enable() + if elitist is None: + elitist = getattr(self, "elitist_", None) + origins = self.origin_generation( n_rules=self.mu, X=X, y=y, pool=self.pool_, - elitist=self.elitist_, + #elitist=self.elitist_, + elitist=elitist, random_state=random_state, ) - population = Parallel(n_jobs=self.n_jobs)( + population = Parallel(n_jobs=self.n_jobs, prefer="threads")( delayed(self._init_valid_origin)(origin, X, y, random_state) for origin in origins ) population = [p for p in population if p is not None] @@ -172,7 +180,7 @@ def _run_once( # main loop for _ in range(self.n_iter): parents = random_state.choice(population, size=self.lmbda, replace=True) - children = Parallel(n_jobs=self.n_jobs)( + children = Parallel(n_jobs=self.n_jobs, prefer="threads")( delayed(self._generate_valid_child)(parent, X, y, random_state) for parent in parents ) children = [c for c in children if c is not None] @@ -199,28 +207,30 @@ def _run_once( return pareto_front -# ──────────────────────────────────────────────────────────────── -# Running until `mu` useful rules are collected or max_restarts is hit -# ──────────────────────────────────────────────────────────────── + # ──────────────────────────────────────────────────────────────── + # Running until `mu` useful rules are collected or max_restarts is hit + # ──────────────────────────────────────────────────────────────── def _optimize( - self, - X: np.ndarray, - y: np.ndarray, - initial_rule: Rule, - random_state: RandomState, + self, + X: np.ndarray, + y: np.ndarray, + initial_rule: Rule, + random_state: RandomState, ) -> Optional[List[Rule]]: - useful_rules: List[Rule] = [] restarts = 0 clear_pool = True + local_elitist = getattr(self, "elitist_", None) + while len(useful_rules) < self.mu and restarts <= self.max_restarts: pareto_front = self._run_once( X=X, y=y, random_state=random_state, clear_pool=clear_pool if not self.keep_archive_across_restarts else False, + elitist=local_elitist, ) if not pareto_front: @@ -251,13 +261,11 @@ def _optimize( print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) - -# ──────────────────────────────────────────────────────────────── -# Helper functions -# ──────────────────────────────────────────────────────────────── + # ──────────────────────────────────────────────────────────────── + # Helper functions + # ──────────────────────────────────────────────────────────────── def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._novelty_obj] - def _fitness_labels_runtime(self) -> List[str]: return list(self.fitness_objs_labels) + [self._novelty_label] From 2c479005aad7a09f189ca9bfd01564e0a94f8a33 Mon Sep 17 00:00:00 2001 From: vonproda Date: Fri, 19 Sep 2025 17:01:46 +0200 Subject: [PATCH 10/31] try to fix origin problem --- .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index c1955a23..bb76f3b3 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -143,7 +143,7 @@ def _run_once( y: np.ndarray, random_state: RandomState, clear_pool: bool, - elitist=None, + origins, ) -> Optional[List[Rule]]: if clear_pool: @@ -153,18 +153,6 @@ def _run_once( if profiler: profiler.enable() - if elitist is None: - elitist = getattr(self, "elitist_", None) - - origins = self.origin_generation( - n_rules=self.mu, - X=X, - y=y, - pool=self.pool_, - #elitist=self.elitist_, - elitist=elitist, - random_state=random_state, - ) population = Parallel(n_jobs=self.n_jobs, prefer="threads")( delayed(self._init_valid_origin)(origin, X, y, random_state) for origin in origins @@ -222,15 +210,24 @@ def _optimize( restarts = 0 clear_pool = True - local_elitist = getattr(self, "elitist_", None) + local_elitist = getattr(self, "elitist_", None) #run_once needs an elitist to function. Mention in paper pls while len(useful_rules) < self.mu and restarts <= self.max_restarts: + origins = self.origin_generation( + n_rules=self.mu, + X=X, + y=y, + pool=self.pool_, + elitist=local_elitist, # will be non-None if your init.model trained successfully + random_state=random_state, + ) + pareto_front = self._run_once( X=X, y=y, random_state=random_state, clear_pool=clear_pool if not self.keep_archive_across_restarts else False, - elitist=local_elitist, + origins=origins, ) if not pareto_front: @@ -268,4 +265,4 @@ def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._novelty_obj] def _fitness_labels_runtime(self) -> List[str]: - return list(self.fitness_objs_labels) + [self._novelty_label] + return list(self.fitness_objs_labels) + [self._novelty_label] \ No newline at end of file From 37c67d42283173434038447a8512ad71f4f58a22 Mon Sep 17 00:00:00 2001 From: DavidvProeck <113119752+DavidvProeck@users.noreply.github.com> Date: Fri, 19 Sep 2025 17:23:12 +0200 Subject: [PATCH 11/31] Update requirements.txt --- requirements.txt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0822148f..f204b1f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,6 @@ -numpy~=1.22.4 -scipy~=1.7.1 -matplotlib~=3.4.3 -scikit-learn~=1.0.1 -scikit-optimize~=0.9 -pandas~=1.3.4 -mlflow~=1.21.0 -hypothesis~=6.24.2 -joblib~=1.1.0 -tqdm~=4.62.3 -pytest~=6.2.5 -protobuf~=3.20.0 +matplotlib==3.10.3 +pandas==2.3.0 +pytest==8.4.1 +scikit-learn==1.7.0 +tqdm==4.67.1 +pymoo From 7829a0e2bc385321dfcf275a5c2f7ed6eae08ebb Mon Sep 17 00:00:00 2001 From: vonproda Date: Fri, 19 Sep 2025 18:21:19 +0200 Subject: [PATCH 12/31] fix imports and origin generation in NSGA2 --- examples/example_1_nsga2_novelty.py | 2 +- examples/result.png | Bin 102606 -> 49579 bytes requirements.txt | 18 ++--- suprb/optimizer/rule/base.py | 17 +---- suprb/optimizer/rule/nsga2/nsga2.py | 1 - .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 72 ++++++++++-------- suprb/optimizer/rule/nsga2/nsga2ig.py | 2 +- .../optimizer/rule/nsga2/pymoo/pymoo_nsga2.py | 12 +-- .../nsga2/pymoo/rule_optimization_problem.py | 15 +--- 9 files changed, 63 insertions(+), 76 deletions(-) diff --git a/examples/example_1_nsga2_novelty.py b/examples/example_1_nsga2_novelty.py index afd0eb01..b6ae97c2 100644 --- a/examples/example_1_nsga2_novelty.py +++ b/examples/example_1_nsga2_novelty.py @@ -90,7 +90,7 @@ def create_plot(scores): profile=False, min_experience=2, # Rules that match only one sample are considered trivial, so min_experience >= 2 max_restarts=4, - keep_archive_across_restarts=True, + keep_archive_across_restarts=False, ), solution_composition=GeneticAlgorithm() ) diff --git a/examples/result.png b/examples/result.png index f3ca08784d8f23271356782d6edd9b6bd4d654bf..b40c9e61dc7c28257600d0770bb08722f4aed164 100644 GIT binary patch literal 49579 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 literal 102606 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∓^}d7jAZ1xv5i48*zI5D(t$z4h-<08MEN)4 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 diff --git a/requirements.txt b/requirements.txt index 0822148f..f6a63e16 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,6 @@ -numpy~=1.22.4 -scipy~=1.7.1 -matplotlib~=3.4.3 -scikit-learn~=1.0.1 -scikit-optimize~=0.9 -pandas~=1.3.4 -mlflow~=1.21.0 -hypothesis~=6.24.2 -joblib~=1.1.0 -tqdm~=4.62.3 -pytest~=6.2.5 -protobuf~=3.20.0 +matplotlib==3.10.3 +pandas==2.3.0 +pytest==8.4.1 +scikit-learn==1.7.0 +tqdm==4.67.1 +pymoo \ No newline at end of file diff --git a/suprb/optimizer/rule/base.py b/suprb/optimizer/rule/base.py index 55ff86ca..be449b45 100644 --- a/suprb/optimizer/rule/base.py +++ b/suprb/optimizer/rule/base.py @@ -119,18 +119,8 @@ def optimize(self, X: np.array, y: np.array, n_rules: int = 1) -> List[Rule]: self.random_state_ = check_random_state(self.random_state) random_state = self.random_state_ - origin = self.origin_generation( - n_rules = 1, - X=X, - y=y, - pool=self.pool_, - elitist=self.elitist_, - random_state=random_state - )[0] - - init_rule = self.constraint(self.init(mean=origin, random_state=random_state)).fit(X,y) - all_rules = self._optimize(X, y, init_rule, random_state) or [] + all_rules = self._optimize(X, y, random_state) or [] #origins created in optimize function of subclass valid = self._filter_invalid_rules(X=X, y=y, rules=all_rules) @@ -141,9 +131,8 @@ def optimize(self, X: np.array, y: np.array, n_rules: int = 1) -> List[Rule]: def _optimize( self, - X: np.array, - y: np.array, - initial_rule: Rule, + X: np.ndarray, + y: np.ndarray, random_state: RandomState, ) -> Optional[List[Rule]]: pass diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index 842078bf..e4d3e26e 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -75,7 +75,6 @@ def _optimize( self, X: np.ndarray, y: np.ndarray, - initial_rule: Rule, random_state: RandomState ) -> Optional[List[Rule]]: profiler = cProfile.Profile() if self.profile else None diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index bb76f3b3..e60524e7 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -4,12 +4,15 @@ from typing import Literal, Optional, List, Callable from joblib import Parallel, delayed +from suprb import Solution from suprb.rule import Rule, RuleInit from suprb.rule.initialization import MeanInit from suprb.optimizer.rule.nsga2.nsga2 import NSGA2 from suprb.optimizer.rule.ns.novelty_calculation import NoveltyCalculation from suprb.optimizer.rule.ns.archive import ArchiveNovel from suprb.optimizer.rule.ns.novelty_search_type import NoveltySearchType +from suprb.solution.fitness import PseudoBIC +from suprb.solution.mixing_model import ErrorExperienceHeuristic from suprb.utils import RandomState from .nsga2_helpers import visualize_pareto_front from ..origin import SquaredError, RuleOriginGeneration @@ -85,15 +88,19 @@ def __init__( self._novelty_obj = lambda r: -getattr(r, "novelty_score_", np.inf) self._novelty_label = "-Novelty" + self._local_pool: List[Rule] = [] + self._last_front: List[Rule] = [] + # ──────────────────────────────────────────────────────────────── # Novelty scoring # ──────────────────────────────────────────────────────────────── def _score_novelty( - self, - rules: List[Rule], - cohort: Optional[List[Rule]] = None, - force: bool = False, + self, + rules: List[Rule], + cohort: Optional[List[Rule]] = None, + force: bool = False, ) -> None: + #TODO: Redo the pseudocode in paper if not rules: return @@ -102,22 +109,32 @@ def _score_novelty( return if self.novelty_mode == "G": - ref = list(self.pool_) - if cohort and hasattr(self, "_last_front") and self._last_front: - seen = set(map(id, ref)) - ref.extend([r for r in self._last_front if id(r) not in seen]) + ref = [] + seen = set() + + def _extend_unique(src): + for r in src: + rid = id(r) + if rid not in seen: + ref.append(r) + seen.add(rid) + + _extend_unique(self.pool_) + _extend_unique(self._local_pool) + + if cohort and self._last_front: + _extend_unique(self._last_front) elif cohort: - seen = set(map(id, ref)) - ref.extend([r for r in cohort if id(r) not in seen]) - else: # "P" + _extend_unique(cohort) + else: # "P" — use only the current cohort (or the given rules) ref = list(cohort) if cohort else list(rules) self.novelty_calc.archive.archive = ref _ = self.novelty_calc(to_score) if self.novelty_mode == "G": - seen = set(map(id, self.pool_)) - self.pool_.extend([r for r in to_score if (id(r) not in seen)]) + seen_local = set(map(id, self._local_pool)) + self._local_pool.extend([r for r in to_score if id(r) not in seen_local]) # ──────────────────────────────────────────────────────────────── # Helpers for restart logic @@ -143,11 +160,20 @@ def _run_once( y: np.ndarray, random_state: RandomState, clear_pool: bool, - origins, ) -> Optional[List[Rule]]: if clear_pool: - self.pool_.clear() + self._local_pool.clear() + self._last_front = [] + + origins = self.origin_generation( + n_rules=self.mu, + X=X, + y=y, + pool=self.pool_, + elitist=self.elitist_, # will be non-None if your init.model trained successfully + random_state=random_state, + ) profiler = cProfile.Profile() if self.profile else None if profiler: @@ -202,32 +228,18 @@ def _optimize( self, X: np.ndarray, y: np.ndarray, - initial_rule: Rule, random_state: RandomState, ) -> Optional[List[Rule]]: useful_rules: List[Rule] = [] restarts = 0 - clear_pool = True - - local_elitist = getattr(self, "elitist_", None) #run_once needs an elitist to function. Mention in paper pls while len(useful_rules) < self.mu and restarts <= self.max_restarts: - origins = self.origin_generation( - n_rules=self.mu, - X=X, - y=y, - pool=self.pool_, - elitist=local_elitist, # will be non-None if your init.model trained successfully - random_state=random_state, - ) - pareto_front = self._run_once( X=X, y=y, random_state=random_state, - clear_pool=clear_pool if not self.keep_archive_across_restarts else False, - origins=origins, + clear_pool=(not self.keep_archive_across_restarts), ) if not pareto_front: diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index 1575e668..e8c9f069 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -4,7 +4,7 @@ from suprb.rule import Rule, RuleInit from suprb.utils import RandomState -from src.suprb.suprb.rule.initialization import MeanInit +from suprb.rule.initialization import MeanInit from ..origin import SquaredError, RuleOriginGeneration from ..mutation import RuleMutation, HalfnormIncrease from ..constraint import CombinedConstraint, MinRange, Clip diff --git a/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py index 0d620234..faee12d7 100644 --- a/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py +++ b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py @@ -6,12 +6,12 @@ from suprb.optimizer.rule.nsga2.pymoo.rule_optimization_problem import RuleOptimizationProblem from suprb.optimizer.rule.nsga2.pymoo.pymoo_mutation import PymooRuleMutation from suprb.utils import RandomState -from src.suprb.suprb.optimizer.rule.base import ParallelSingleRuleDiscovery -from src.suprb.suprb.optimizer.rule.origin import SquaredError, RuleOriginGeneration -from src.suprb.suprb.optimizer.rule.mutation import RuleMutation, HalfnormIncrease -from src.suprb.suprb.optimizer.rule.constraint import CombinedConstraint, MinRange, Clip -from src.suprb.suprb.optimizer.rule.acceptance import Variance -from src.suprb.suprb.optimizer.rule import RuleAcceptance, RuleConstraint +from suprb.optimizer.rule.base import ParallelSingleRuleDiscovery +from suprb.optimizer.rule.origin import SquaredError, RuleOriginGeneration +from suprb.optimizer.rule.mutation import RuleMutation, HalfnormIncrease +from suprb.optimizer.rule.constraint import CombinedConstraint, MinRange, Clip +from suprb.optimizer.rule.acceptance import Variance +from suprb.optimizer.rule import RuleAcceptance, RuleConstraint from pymoo.algorithms.moo.nsga2 import NSGA2 diff --git a/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py index 0d6a76ed..33dd5647 100644 --- a/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py +++ b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py @@ -1,15 +1,8 @@ import numpy as np -from typing import Optional, List - -from suprb.rule import Rule, RuleInit -from suprb.rule.initialization import MeanInit -from suprb.utils import RandomState -from src.suprb.suprb.optimizer.rule.base import ParallelSingleRuleDiscovery -from src.suprb.suprb.optimizer.rule.origin import SquaredError, RuleOriginGeneration -from src.suprb.suprb.optimizer.rule.mutation import RuleMutation, HalfnormIncrease -from src.suprb.suprb.optimizer.rule.constraint import CombinedConstraint, MinRange, Clip -from src.suprb.suprb.optimizer.rule.acceptance import Variance -from src.suprb.suprb.optimizer.rule import RuleAcceptance, RuleConstraint + +from suprb.rule import Rule + +from suprb.optimizer.rule import RuleConstraint from pymoo.core.problem import Problem From a722365893318d35786cafaf52c4e32b65faf667 Mon Sep 17 00:00:00 2001 From: vonproda Date: Fri, 19 Sep 2025 18:54:19 +0200 Subject: [PATCH 13/31] remove prefer=threads from parallel calls --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index e60524e7..b4a04a50 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -180,7 +180,7 @@ def _run_once( profiler.enable() - population = Parallel(n_jobs=self.n_jobs, prefer="threads")( + population = Parallel(n_jobs=self.n_jobs)( delayed(self._init_valid_origin)(origin, X, y, random_state) for origin in origins ) population = [p for p in population if p is not None] @@ -194,7 +194,7 @@ def _run_once( # main loop for _ in range(self.n_iter): parents = random_state.choice(population, size=self.lmbda, replace=True) - children = Parallel(n_jobs=self.n_jobs, prefer="threads")( + children = Parallel(n_jobs=self.n_jobs)( delayed(self._generate_valid_child)(parent, X, y, random_state) for parent in parents ) children = [c for c in children if c is not None] From 6c2f871c90abb2a312d42de960eed6d54714be07 Mon Sep 17 00:00:00 2001 From: DavidvProeck <113119752+DavidvProeck@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:36:29 +0200 Subject: [PATCH 14/31] Update nsga2_novelty_G_P.py --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index b4a04a50..c8213ea7 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -91,6 +91,8 @@ def __init__( self._local_pool: List[Rule] = [] self._last_front: List[Rule] = [] + self.archive_maxlen = 1000 + # ──────────────────────────────────────────────────────────────── # Novelty scoring # ──────────────────────────────────────────────────────────────── @@ -129,6 +131,8 @@ def _extend_unique(src): else: # "P" — use only the current cohort (or the given rules) ref = list(cohort) if cohort else list(rules) + ref = self._cap_list(ref) # Cap archive size + self.novelty_calc.archive.archive = ref _ = self.novelty_calc(to_score) @@ -277,4 +281,10 @@ def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._novelty_obj] def _fitness_labels_runtime(self) -> List[str]: - return list(self.fitness_objs_labels) + [self._novelty_label] \ No newline at end of file + return list(self.fitness_objs_labels) + [self._novelty_label] + + def _cap_list(self, seq: List[Rule] -> List[Rule]: + if len(seq) <= self.archive_maxlen: + return seq + + return seq[-self.archive_maxlen:] From ee6ebf2b72ce9c86de8704fc7b39d68d1b7b7b72 Mon Sep 17 00:00:00 2001 From: DavidvProeck <113119752+DavidvProeck@users.noreply.github.com> Date: Mon, 22 Sep 2025 13:41:34 +0200 Subject: [PATCH 15/31] add bracket --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index c8213ea7..559372ca 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -283,7 +283,7 @@ def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: def _fitness_labels_runtime(self) -> List[str]: return list(self.fitness_objs_labels) + [self._novelty_label] - def _cap_list(self, seq: List[Rule] -> List[Rule]: + def _cap_list(self, seq: List[Rule]) -> List[Rule]: if len(seq) <= self.archive_maxlen: return seq From 7aac9bfab6d3ca178e8a9f86d8a5965eec68ae3c Mon Sep 17 00:00:00 2001 From: vonproda Date: Sun, 28 Sep 2025 17:16:07 +0200 Subject: [PATCH 16/31] fix _optimize of nsga2infogain --- examples/example_1_nsga2_infogain.py | 102 ++++++++++++++++++++++++++ examples/result.png | Bin 49579 -> 37510 bytes suprb/optimizer/rule/nsga2/nsga2ig.py | 3 +- 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 examples/example_1_nsga2_infogain.py diff --git a/examples/example_1_nsga2_infogain.py b/examples/example_1_nsga2_infogain.py new file mode 100644 index 00000000..f1d045be --- /dev/null +++ b/examples/example_1_nsga2_infogain.py @@ -0,0 +1,102 @@ +import sklearn +import matplotlib.pyplot as plt +from sklearn.preprocessing import StandardScaler, MinMaxScaler +from sklearn.model_selection import cross_validate, train_test_split + +from suprb import SupRB +from suprb.utils import check_random_state +from suprb.optimizer.rule.es import ES1xLambda +from suprb.optimizer.solution.ga import GeneticAlgorithm + +from suprb.optimizer.rule.nsga2 import NSGA2InfoGain +from utils import log_scores + +import numpy as np + +from sklearn.linear_model import Ridge +from sklearn.utils import Bunch, shuffle + +from suprb import rule, SupRB +from suprb.logging.combination import CombinedLogger +from suprb.logging.default import DefaultLogger +from suprb.logging.stdout import StdoutLogger +from suprb.optimizer.solution import ga +from suprb.optimizer.rule import origin, mutation + +from suprb.optimizer.rule.ns.novelty_calculation import NoveltyCalculation +from suprb.optimizer.rule.ns.novelty_search_type import MinimalCriteria + + + + +def load_higdon_gramacy_lee(n_samples=1000, noise=0, random_state=None): + random_state_ = check_random_state(random_state) + + X = np.linspace(0, 20, num=n_samples) + y = np.zeros(n_samples) + + y[X < 10] = np.sin(np.pi * X[X < 10] / 5) + 0.2 * np.cos(4 * np.pi * X[X < 10] / 5) + y[X >= 10] = X[X >= 10] / 10 - 1 + + y += random_state_.normal(scale=noise, size=n_samples) + X = X.reshape((-1, 1)) + + return sklearn.utils.shuffle(X, y, random_state=random_state) + + +def create_plot(scores): + fig, axes = plt.subplots(2, 2) + X_plot = np.linspace(X.min(), X.max(), 500).reshape((-1, 1)) + for ax, model in zip(axes.flatten(), scores["estimator"]): + pred = model.predict(X_plot) + ax.scatter(X, y, c="b", s=3, label="y_true") + ax.plot(X_plot, pred, c="r", label="y_pred") + + plt.savefig("result.png") + + +if __name__ == "__main__": + random_state = 42 + + X, y = load_higdon_gramacy_lee(noise=0.1, random_state=random_state) + + X = MinMaxScaler(feature_range=(-1, 1)).fit_transform(X) + y = StandardScaler().fit_transform(y.reshape((-1, 1))).reshape((-1,)) + + X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) + + model = SupRB( + rule_discovery=NSGA2InfoGain( + n_iter=16, + mu=16, + lmbda=64, + origin_generation=origin.SquaredError(), + init=rule.initialization.MeanInit( + fitness=rule.fitness.MooFitness(), + model=Ridge(alpha=0.01, random_state=random_state), + # matching_type=rule.matching.OrderedBound([-1, 1]) + ), + mutation=mutation.Normal( + # matching_type=rule.matching.OrderedBound([-1, 1]), + sigma=1.22 + ), + fitness_objs=[lambda r: r.error_], + fitness_objs_labels=["Error"], # infogain objective is added internally + ), + solution_composition=GeneticAlgorithm() + ) + + scores = cross_validate( + model, + X_train, + y_train, + cv=4, + n_jobs=1, + verbose=10, + scoring=["r2", "neg_mean_squared_error"], + return_estimator=True, + ) + + create_plot(scores) + + log_scores(scores) diff --git a/examples/result.png b/examples/result.png index b40c9e61dc7c28257600d0770bb08722f4aed164..0cffb9af398927fb0bf8ac2990a1210a3a4810da 100644 GIT binary patch literal 37510 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 A%>V!Z literal 49579 zcmeFZ^LM0O7dBY2ZQJf79lMisY}-l4w$m{>wr$(CZQFJ-^}MrY*8DJk!namc6rlC7ze ztAT?FK*qqy&dS!w%EFM?#l*qU!q$eBk%gI&m7dt#$;r-_K2$LP<8n-lR!UWQDsc^CW`0hVUr)M zqsAOs@m5pE?nkSW#-bYa__J|NOq%V1X8e%ieeBAll9q@XwCAaHZ9e%6hG#_cA*BtHL~l z_*b&qVl=KO1v3)wjUV?_%f51dFoH@1Cd0z(ad!1mg$CN~7v4`Rc|ZEP5!6Ey;D?PR z=q_dDc#>f*BcxIl^vB! zPdxTN;61?zc;*`|_SPI~$U(%gu(0OqP1ZZQ6>z}uh}TG zK>;Sy*drXIz=cAwesKU_#Zf(=SHicikCU`)b_?QV^Q4j)qu0@~u#~j5@!fRf<>l2T z(ZER{!+voHHi#ext%&gYdE#(6kkhGF=s#Vo8Z@V}S)j_KvBA(=uQyfpW2z!nW0_7Z z_(BMk5RlFygc4mMZz2Z`2pIzW@oZZBU+<6a2eI^Kaz#RF*0~<{fJ?-4WC7P@!nX%U z#}qcDq}M|vlxxtUfM%Ct+jk>fL?BHeC%lSS!4EqNsETf>Y>Gv{&IEx_kn;vxyfDfE;b=Mp1{qc0MLcW;Q zRtJtBrA*qt*jSW9;J;STZw7LB+-Ydc+Qbqs5d9~a5+w2mWV;slkNILbvyp!!7*|B& zjKE{!5iBEQiM9|NOo4xxV}<`Z zq^RiH3m9vP7BYBmc)SaCs13C6r#O5MClwu>qSEELqGC^|XtKVI5ORjy93mKSl_lSy zAlS!lyf?ccMgOR%`Xg~_4F7)7^>YRga~hb7ONRSo#(~zGh5-l4BWCe?^xNue{FiMH znUK&^W1!gsg%s^F4m=JfYmI>g>JPDo}Eg?@t%04k`k`#B*Uj|7jWNDl&tgQz$!$1}K?JsN;&L=I{Q zSOV+NwHp)AQYL481s8&zo+|`|(`@vW!xM-7`0r$)f`oxY8by*L zmnNYm;~TDHIfCi``MNPQr)(-uv)4XSgW63bD|wQ5C{u@S3YSvV`r2OW@x-s&|)q2|C z`CoCO#qaC>?MO3T0FODmAD*xNdK~KJEP9Z-kW;=X3K%nDZIMlAki~qC5|w&G$x<3Q zG>TG|y4HBS1Xo=e71MMiR#)UI+dh%%OzJTX z=0N^p#^{612zJy8H;j(Wv6l%Y^Ecvp_f8M&8Qy}51z`Kxhdzn{Sg)8kznE4$Ng=lW zs`q+KR_WOeJ!W{-dAB!jCuMob7%oOff54lA&2&F2>37iX0zbq4hx24vu$EKUA?p@p6`yVCZ2 zWyueA77M;7FKTr(SSV?;HS-?W_dm`K2@CWoLbIf%NTqn#aqEJVM$(r>d^j(DMv)6g zrlZ&S!{q*FFVIaPXqO#vm!AEaumsy5g-ZV7vS zjeLVh2~US^{r+rqcGppdZo5m%=AotdpE9>fI$@yl4xInB?QX2bV+L%wfsKt_oOi#9 zF+qya$Aq@X&tpSoleG1Qjj^&eqA1{qFp>2?{DN5oF8XukVj3T?Wv4S1y1V1Ch2UeC zt5Z|mS=9W!2j{3ai;4CC$v{4fT z6%5-9TWR-rf@Qg|pyy`y=5`okIxRt+kVKI-UY(s&G*Bt;u1|Q=o+a2)QAvb{9(NF< z;}>J6yPaWJs2hU80TN$EqLTr|V8Pti(LD|yF5`un2Vni4$0)TY_5(U4e*70t(C?CH z8|@0W}Mp~}fmcu&D zXNW;Pr;&_d(rfx}wgK<(w39LRJYZzF|F!r!R)QFV7*anYHW7n+9cCiESWn>CPkkoX z@W#nq$S$uACbhCuXKvo$-KAv@cAo6AiCRVhrNIiO)3ZMa#zP0~>k!7~z%%+#;3Hb=*QnZW`gTSb%z1CTtQxGF8KAoDV~Ul1usQN z#6O_&rm3ixRQD?6?`(NKwpDqJFXK-;M&@w&-jj(tpz1lW&(lzkCoG6!0ByK^@G#hX zaet1`)8pulz=`1VXY251g1n>x~ z{-w&AZy%pv=J-+L`8aF9#4f7MG0ImC1F}aYoC;9Zd1T!+ArF2bOzaqK_@}|oxt?kQ zURZ6};0tiE@&ubVue4pu#}l*DwS59#N8KBP&{=~~hEP$hA)c>H%lqq=OC$GHhW~AI z$JUH-YcJ3%O|Z_?Q)#;wcGZIC{&3^<7%FDxZ0Ds_%9=Tz&x|*E$)alYKc$D%XAiL_ zQ+iF{_j|(a`lx$Chh6MHU(`*E7;AX8CGlPrB@=X|PPd)&_t8Oo-v7o~G1>OLGsgMC zpe^EVGnhDGhoK+7o|nx^zu_Y-t!7ERtr^t;pYQ9Q4QJ zfHwk4IY}IeT*_OI-Q17{5yM_kZ0?0GABQ@epL0RJ?iuMX(N!5EhAwme*4?;l}NrnjC?=m<+$yh{Gld{Q{}sg?JhMx zyB-eyp6xhAnV6o@qTL^*p6d84Ee>%eUAu+H;!mRjR2?`uZpb5`%RZZuA0AewzOm%i z3>Ku>9lkrur*g>)LAc`S+iI5q8!9`)-Eg>21Y|U$x}GY?W#Rw1{S>axx%u7C=iNlL z2fLc}N+l!)&4QMIWcN^o217bPeQUzHdyvcpk;6s-x%G!cTi%F-IoM4_{nQ@t8ScVL z+IRl<`@MVS(evp9Cs8$Uibf@}H-qbDil@e*5Zgb1RhNnPIpd06+cooEK75{CRlQ_h zK;7}3-H7Me5v$)Fks}-wm!+3ItMp7v5=KTdH471qYK@1j_BXFZ2qRc2DCEw$Hf~B7 z!AsOLuAi^<@(e(UFleThU6|f7h+s z79zsQG3D)s&j0o!h3pxAdQ9Q-ol?K#+M??KY)g zR)wr2b?E8yfHmUdY!IFc*{zXH?VFhL57w=iP4&qxwBGZ1W>^M7_w4 z?yEpKZX*{%klSSeW~$Ig(H)f=vZn4o%potYuXPq)LC>1AH5LSu%aOu@W;q1^c{4T2 zQvV7k?0#^VI+QJBN625TMrFc4GrMO^Zo=+yv-uKS&6RbGGu35vOck9&mF);oT_f=q z*EdJ>bJcA3yqc_<6j|<<5>Jox7jO1GjWCsN{h-7pI{?p=7MG1#4eHo1UR{s`zn6R0 zsSh}QmpuP5DOj5EiwCa#9EpJhsbs=re9qIaWx?>d^#lG<>RAXmdJ6K;8Bj_ z58f?6H9#VslBIV<8;{KC{HS9qCG7C=3~&C7Pg)}E@`aYfqruj8Xbu~@wKWp-a@)t! zBe^nQW8oPq9=o5t19@bUJt>TLa756iD!k>x!TPtU>6xsw_br>K6fmH0+hY;vzJUZd z&eS^zI}~V`foK(hKnd7UbV=Ivog-v6m>fj2jkP!0R%eR_yI|*%W~vXyn{e2{a(AyX z;rB&JACgU#DC1Ge1(zzFC)+IiGz3nU#c0TG-MSe<_dnbS1e4sa7p;z&A%5fOmj~!2 z*>Rvr)x^*s9l9s$%RelaA(C}W2mbYHnEgF^laht>;;&Mez6ZF@!Sg9uP^!gE8aK^w z*Hk*MP~it-&6beL>jm*@uEi!p4P*Kaf><5srQPgqg`5Fz_t}IAHd7k>M-o=sEjJpb zlIi$Y2~I{9tAvEzq6&A?%k6NcW6)2R>pjNrUp6MNGzkj7A(8B`kZyew^p`w%?tZ@< zCXd`jE^%y@SOY-^xP^s9fkp)K5a4if0uFKEdW*p4L*Y50NIKTfrWY7+u^3(Su1fY= zR-aO=&_S;W($fW|Y7ZuM!1w%!-h<3K@ckHWvev})y7AWyC=cRP*rt{HCB;)$r{DbU zeABBb4? zhUeGoOcjCC*@4%`PRp`|>`fv>XoHMCV2`{&=Zl!c#6AK0N^MN}Em1+FLB7HWbGaa7qpiH4u{V zo!&sQHQ(WA0$6z-my41^7uv+Qyo9IGmE?_$yXVPiwK7}1V{f5S9M(ULr^1o{va6?^ zeSA(lSxtj$(3-+=8$j;Pp-;}5ISVNH_Z-Aa%J5!T;?|FK<$0!G0!RKt`0Fm;@U0>(KO=4-dG)&|g z{;H&XTLMeZmBCoIV{so0aK&wrae8$p!*lCNkl$lFnAU z?^{9@r3w=r`1~;YBB3K($N{o#2GaCwl+NJAc;gd6>9)bWfl(5K;c#y0!!3WGPU@85 zPR3<;{gVS}tpa0B%SwJHlWlbA$Vpl*Gv0ah3%dcc7?DtScYRo+(N1Dp&daASnflQJ zT^`nGhDahA!1?0zXw*Mk@QM_`!8IB%yHsEDXkEropB(;wQ~ATI2F zWIjdik!&3p5_?7GHn8#KnR_j@*ssm75mMh8KMdl1ThSRYzZGa&esiCRrI742G|V&z z=A47VJwlb+xbboqZ@1XHY%(jhIbB(8O^e+fK3z_Bn`Kuh{mf^bZLKujf+1PQF+wQov&QI zk8#i<&erA>i=4SN%!z4rE`QZDJzr$hW%_t|A=Rvlvc8bI+KTi1d_T|m{I|_FLBHd9 z%|4x)$mO`x`TUFL46HY+>o}W3NdU*#G>x^la;?^>v=r}r>2&$4k55`3byb=&3N>8f zkVNbj;93_l0lUs>0((&(vnqjdS;7YlbnW?Hh@Cctpj5h^9gk9{>X{H?{wYI**#?;H zLwH8X@u>)We7{23bh3Z2L_!I1d$z=jR>I^Z530R;hq|0*lqFWf9n18t4 z3z3P0Hj3*KYRl(^_#V$OF|!=E?Dz3<_QQibpF=%w>|a2jUzQL}WLiEyKum94t}3}6 z1w;vhmD^~id@z=`gdu()_Jm|i0WH58VpI#?`-PEjSD4EJp&|@)Tl^wzk1ajwIt6MQ-+wR_c`TO)7J zVq23YyD`1VX3P=6m32jL0L=9F%vs6D{jga0KXNlOLN zK>{tg8tlhMcnRUOhVFDmJRAKoc)qwxtlH*O+r8!Mn<60Kw0&UA7tUr!+(55A?lonk zyXx+=BOMzN+K^~)1el2>WHKGeZsVpYB#I|sdF(^#4F zemU&pV`eouF;jtlfO6M#Karz+%7QEHdXdxvQq@Y|m;Ij_`U`;>n3f(D#j2i}Sx7dY zdi=n-bk~~AGoBigGVDTjgQCqC=rQ%htJ}Sd_g-CH!k>i^-dLY*b8)^Q2_8f~HiymM zMlo&aVP(jC49!8t>|s`mewqH(+EsUt)NV^RGr2&7FF9E4vOvBE5~)zZR}beF;cvby z^TULM9gD1Y-yZ^Q!lUo~9tw^tLY%oAP5H1z_<`k)PfS<>1{^ELd=xXwjCy-EQP-=N za4xk+o%@cp`UiBe-{sC~?$Uz2g$1`hF#B|wn(&t49I*`dm-Vrtnxhq4;H~KSb*ywB zj}fI|J7ze4zi&*WfsCK!2SEMxFnQ)uQc{@D)$ER+?xe3Xk|L0l{}4U;fNJQ5xSd5w zE`dX%t70N68}s3J@QK(a5C_8>4me_92swW3;Zz}XBui_os7HpYH&02Qco1IOVG`Nl zDVYzs0A%@BTNzl*#wM}HvHQumxICrmHBPqm_}`m178nc+0a44X zt%trYHI$?7(MY_6nIObG>rRN+PS;gb@i-M4`QJ?@e2%T5&!^+P2lcT(wa2X9ZeT2- z<4^hEm&Pm2-4c*#kw|uM? zM!8x0n<-xSa$TsIZvV7gMt)b4fDO%zS7^L_URV`!J27wFm*2Z-eU1tFM3GS=mFQ`>4G=+GZ{Ry;8?%l|Sh5 zV8fQ+85FDV5L8+irp}7)0Pm=Z9Tb|XduqW-hO>)b-!0_)o5|F zgS2?M>c`V4^$Dzqa^#7dz!%u9q2Tw!`LNGCmfhtJ8UYu|}rwBKE|j#@DqCEGd=@x^B9n!X#wWyA5c6OCFTDAxX5;P2pqlM4gdQN1jK!+z8)Ls(h#Gup~t7>He zk=ZI>fsc0Gydkm33=k4%iD!w4mBtwzU324nxAM&RdrM!#j~28>f|~0nxh_w5da=uR zwXcS_i>o^jW%x7M0o$@A0%}DxzvewDNq9WzEe)Pg^koo>`|AAlm`rX`U-}m=xAJ$Q zGNMZVDfg|Lejj+}6f@x4P%kcy^rMn46a;*eOIiYEbMbmv!lTmvJrB=WyZ}|{2gfLr zI_x*Mnh-mHY$|^u)qmaezh!mmdXsJ99DuMPT3ia@qA3V|CtjQ{lC^9oGA~)?d3)aT zsy8>P-cloB`9R*_#$$`{JXFL~pY~Qt?^?$Lc}jmcKpzUw$xHo%G~cEMVLs!7L3=N zMJ!alGV^In*iQguk2C{g$-v0Uj(Hx!CbAC##>;6`r`6pFin;b$OM}p7(<3w47*}h^ zmnFQ3nE-=Lem)(!ud&hDb4SO1%V8F;;;#Lao^V$#Eea*nIvvHhrD!{M5QI(UHA87` z_^qu_zQ_X}33&ZW5@3$5#D>^aHrhSV*z^qQF4>w%33kDOyIeWk3ag9BqI&M@Ry=Xt z3i`Ew1C#T{-V3co!faBp%-8prSSNK;%{f5S>O`I)K^AFXC&bzvQV(|UjPXhZZ$)o& zWd97J3bsQ-P=r1BU4{Ga*dc7DcXC`Fl{X~OJZ{1zc~@(zGNfVEmzi_Z9l_;q_L!RU?H3G*8auie+A4Gc(aBWPN(#c?2qC zFJG+O0l^Ab(k=H185g|oKLa<z5IS9xhFZ=Ha9l#ENGG@9V@+~bMf z_fE{Esf)6%{_>oz?WYN*-Ty6$=ujS$rS5;NlDTG|E+!Tu?~6Mx0{tyf{vJl6pN5o2S;yZqw< zpD!dY0E4e5ieg0zUDm6dc8vWJB3uonTCzQ`vzFvIx=*mJ#4|;o^?~lAQ((T-Xkj;m zZZXH-eMaCL-pi%NmFZ;--p9HUk#tRgJ%G<+$x(lztkK4DF*-ac{&gV<_Rr5x6}m5Y z>_7FUr}yYqH5ySpcE>y|my3(hYd3_$<-phlm?8))(-o9GbWN+5v8Hr7S#C=xxV}vN ze$r}O%gnA`I8&;E!+$v_nC=e`nw_5*trc*p5Q{*@d40_-RjTN&SBy<`wj4lwBwvP7 zWJ5Q|O4+t3mfaU&w@lJ89>=?aD13WbBqT46)7>55zzlxaQyD0qyV|iNTVeI$KuZ)x zdNr%zsp0402?%7;Ea2e3U~W&WwKvj7D}S~hiVW{ZiL?}H$oB{uUo>+9?{h!zXLzsC zk=Z}%34g@Tnc5{-XF=E;nPk{5nV4E?i_N_Bk`?7K#A5-J3#oYCuC5l@;dUM^wZ4^?a0>}`upExmWg zJ+49UEzvoFJ6F`L&)g0@d+@payY(_7a=Ek?j9{>?r0c!Yz;>)|I2&DtHq~$DG*@3g zzKke;=7w1=V1c2|k{DZt!qaC%gnwqB^W(<_WS+VB$N!WuJXFh8zgg?M6Iv&Xz>dN)NjKiL-1V7F<6}yA>IvPTb-kUXz=g zhP#E99+$W6x~nAOu6rqAS%F@nf`6p`N<~BS0Uo2j$=uPNM{pZ)08$}xcQ=7snxjO+ zcFgoO{s`b5A@Gt@8}?>pCE+r%MXmaC1VVp}9dbjbU*tkf!{X>$SbYASc?SV|xc_*@ zYatSRvR$Po(DLnb|H>s5SNC2!U}|@n~mwkbyUtU0iD* z%(2o!zk-WD;2!j9FpYUDy!Jecug1GQHG4|16nc#myyk2OMf}7Wi60t?SKmfS5w#32 z=aHBSs_n&hPwK1x9-geT#n1Lc%(ZKmP8Rf{mB5=nv#!w7_4uivsLy%XV)LIe{cQ}k zpL3`Z=_0U30t_3tbXt-V%3lY_9j5~V#n2Pi< zPc+!hh9j9=16&G6$Fx~DXCJnoRI;kqNC@FvW=5{aq_dc=V6I_@t`0?i=~##gPv5NI zWuNc+cWuFix~wq^kHrXs^zN@NSaLr(DY(VVJ;Rry^qGAMioY&jqC9&U=IzA$sbh%y z;L~{##wV^z^y5O@PBU~^OjSPnOl>2x-2&mGw3))rfb&I^5A0By^GzPF+N)nwoSa)0 zP3g`orfaw&)T^scn(a9Yg1QQWC-#|{Z1Nm;Ee=YU4i$F}4qOPEA$YhGlZ{Zm!{e<{ z%LW-^4Llqi587EH$^H^X=@zB3JH8|$?upzX+g|yuygPt*sLv0_ks?`5)vX^U;U{98 z@CeYd=X>baW|_IR7g!k{;!HlyAomL%6OONtp9^1BH3$e=Mv_46@vqBV{PP#B{{l*{ z#>%q^o}43rKH?{&nH1E>HZFs<44(q1{N8nGAFkk zHaOL5g}?cG`@eFWjjpu$8oplkJ-T;L3ZFivlx+^Qx8}2jplo&|wub53cU}4y)y`*P zcIGoPDx3>j)I-APwM(Y8-kNb5 z*B|LbrsY@1x=8rC)l>S2=z`#aIZ*kaJON5dlcNGl6oV>dHoFQcg8e<$-_Xrm9-nb> z88NZ3xt@;`hif(=KjpMPRf6)NV8P6>s$AF zrK9yTPqX!h@%(Q`$#9#5n0OcU_$w_wKMM;Csvx4tz&{)w#fFLt-WwKDPzMgH&cM?0 z0!%+yO1fp0;}{I>nnE`+SPibS*g$2lpu0%->8UAu^uG;Bar|74x0n4hj<1IKF_jA~ z_g^$l(Ol;uqQU-`3CUiIBl#xqNFh=s9;A9@Cipn&w;03a`7gcp>-o_RKFChjHn<)t z44LRLNGCvC_Iu5GG0Ifpy9^>Fv*|Wch0*KhCUaG--7Eh1VF=NKe;Qk@9hl+*Lc*#})#cBf@$a;vUI^P}av06{V2SvR5#ELWU{Dgu6{1byI zMF-=q@j6vJ&N=wilQLtF`FU~M69hB0j)i%)ZF#Qx>3XU8{{CJUh1HVweM=O*N7XbR z8Nw~QPyRI=gMaBZLFDU{)qOw7VK;cU&9Ual79L5&2S&e@|;s%+)U^=36-0iw+F`RdPT90kfXo&{1L?tt~dIc)L` z7X<~Ig>4SjQfIsF?Nz(VcOT^UYs{rc#pqv*613MJH@%Oe_F7NWAP6bJtMz7W_niY!2&u0VIQt8v$1LIkQ^XI8a_VG%H zkg$S+pe)F9ODuk8_W1=pHn<9};N3q&O=?;kkw1ZZ4hbw(Ol9$D6&4khVd;4(RBE>Z zA;nK=cI!1|>(x4nyic-DzsQtSpN?Gg!|68!*%M2&aWuIFx^0hg4?S&~LXU?U@0lmC z=$g)}fiXeeHK7k&Qu*ER*k!eh@H(xK-nse5whe7Q?R~ZlP{~cFx#ly=HYioE>DeaD z2^-fz)_dAEQ`FL_KMlV+7#oaco$FO--VS^QZ_6-z#k^#c*G4p3=Q;qDP?~KG8=H6c zA|X`cQj!@bZ3aPs>dTX9CW!Y*uGf0*cOK4YF{MmgEHw@|;*byhzu_6%P;d+Zlr11D zou01j4hJJWmf6$AYYi6pKt3S)>{lWSVEra!O&G3FQ0Cw&)JC3+nA1-o`8bNB?9Tbp z>GIEajc%t^^|M*vTi{Pg|NP}#{xDH;zO9|C4kcnQ*=R>;B4^o4pYSYlDA& zC@|$}JVf-M)uuJE@frAkv=_uT<;x5&?d|}O%V5{r-5+%xj9zC?2gAztb*DC)5@61B zF+nHd4t0v+gg9T%97&Op14{^n0{~@O|M{MTgoK+-*KHQliIg7h=5?8DesA>-x7vOF z!NEab-4*J;BB1hz5I+&tp}-im7}yP(_zEh2aq;;|nD3YW{d9;y|3vAN(Gd8cGB%5! z(Qu!VoamQHrh5I*SDOaw`ZxhwuHVqbG-VM>0s$LL$FYmZbFn`T;;@W_fA?1arHt_Q z_{2i0K@5MJhjlechc1C7t4)S%tA2s4eYnxB+r$E+nD)d}wbNcFZtxjQ~T^|gPOmcHpezRg^cTsCMBLt)vwrMDuY|0JAkb++&G?+-;O363c0BK5V`$$wt` zAv*DZ@SG2@q)J-P$LDQv;QtzsD!eDkzYrv1S5M^Zj)*LUts3e{^~p zCaV#V@23=ZG$FlN-o1~=D&c51y>REa87ucs12~SA}S4JOiUk_4x7$T%ZF!T)jM&6k(R6H=O5)P_^4#pcAb29>Vi+T2VuMrdWIhisOQz?-v3z#nmvh? z5yS{ot?Ro*iE^MO{O5x5T3Xa8C@4ys11OcX-47GbI_{?;POuXv4^8MtM-jQc@}yfd zstyN>uscV4o`Fo=`zS`83nC!j&f}APdEwR7vF~lO0*y1{E?uLup|{qzxArFjjeLw_ z{#`EE6Q)DbpXs%KMs3=M!>2*#u{`b{s3uEUXtO7S;z~SmaRFl@Lx9*nA#mB&g92*X ze*|X4iB6xRd4F*0k%I8k-Xh`#E6h#IbP2+GGWe`4-FOL;TRQ>&QUcCN2 zBQix%H54_^;$z!cNRX~t@ps|9&ab#N+U2A`M=GWx*wNPmlIUrjo<@R)Kg&Dm-y?ta zDjA0%dZjhnos$Ni&*IY;bRucm+V1^eRv^9NrF_e(3?;&hZN>VMU(phRp*&dz^iq`b zd4{tQkY+>eFh;|Tc)jg=d9Br$52jn>h|&21`cd;VGk^Lz&Zd=-J#G>$jlHGn2ZlJ) zDkddKTTC$ILE<0Q1c57KI-ONHH#fHsiNm^3rc%Cev)ivSUnH}5G?`Ae*8PJoRGldq z&4P))g*>)WdnSSA2v3~I`r8kRXyH5rzVy5rGl1PUmEDwb4pptU-d?LtqjSu}9|Lcm zr{o;zle3^Ao86QONG-($_XIVagq^I#)Q0Ad^}JHeONA6`5K&5<4XnJtbF2OQCafVk ziI;ou%;XV2j!^bfg0HIW%F}3;eQwqL_yaCi4unv!$_9#HkJ`&-3x4At(ZkFg(Xy{t zQ3@2Z(Id!6`keo|0mI$>W%sd7Q`|#W-P7ZLbJK5kUU}3cW|f1H zt_liO<8J|f2+t3ykJ8z)_DpKoec$6cWzAd$$Dmyzu>GcFy0!%Go#>#6X^Q9)abr=RJscx647Qa2If@a9xSwo``Rq#}02JG7*Pj zSp^GAcWf2k3^s!?^m}{?3L58S9SjP`=Wg44R<;YNf5b0?F! z9xa^Z$-uE-YBO#6Bh73EHv;kJC46@Ro4W#l&EJ1gy=11QnZ5lB+1s{z8|nfb3(R;ipk<7au(N*^Z6qg08}9vz zXc=e$IZ1dM40jHtbX&pN!R|7{72!%E0=xt%;q=zKag}ULKfdnl$2`tVK3$p;bDVTP zZ&$;0HQQE$jdkiemY6P-lzA!T@*`gZ?Qb_m9L|fcqY!0?)^;RFlwBU_CbUge{Oxhy z^zW=ap{pE_zvywjn;XOX8<9k;PL%4dA3i{8>B|mSyA3w>=uTxDNFISOkhHHpu5PAV zSkxCnG^A%sPdCn0G6gaof427w|&uX%{wLqe^dv; zxb|rg6LGPw7SVJ|Oiecr%I{p}PJo>yX!MgXMK}14HV!&Wq{A{K{y&C~vFVy?r~+8c zkG9=`+>Z%3?S9{xMP7%~N$BN!V?uZ4FQUoIHrEgku#4KD!os$FPUo^O0SZyikMMA( z^him;JUn3)AV^JO0WCmq^=fySwU$%4aeL@Lewe@HlP_!ld_Kg>`kjT@BjwmLW_ij& zSwlgYXtAWZ(`Mh$lW{^b0f0=?<{NCS+1{_}PRzDzv+Q1qA-^^!coz`;%g_k^NB~ek=-6M6Ho1zazf5+ka=)-UcF{S1S64P&lAJ! zZ(pD!4HAVdgE-BCU$}9T@BMDu(KBV`DI}nWSKfsjkO2^*Y zj~kSkuJy$(uU8e@MyU(diYCDmxj?qM`qqUz=2*sb4M8ab-ZihLcbRE$81~0AlbO;# zL7=r?8(0QwOsMk5fa6kXG|?%f4D(M#rQKkcC#s4uN2vxDHbbFm5P_<|79&nom?=O+ z?|cdJ+3E8&DI;a{mz@HBAP8y(x{PW19x8l1WpaN*TB>PxcrbpWM`vT25m)p>Lsjl{ zAZ*Q3NtZUpu9Pikporf*1ZDc{vCk-m-AwbgrpJ>%`^gU2peAh|goYslS{o+}<7zM9 zdIz9MxaD}aqf>GVqXSX<`wle>z~x4j<@v=CbOtQ$6YMB=lIQ{}f{V0#Rz{Oz*Dn2C z42C?A%$z0sG!jfhZA}%&7FGLJn4mQQQ}8CZQk+>!l?Ka4W4@-QluqZSG1qWa-&Vw2 zZ9)2H=`KKn{$JO}XP&4hLOS*gG}Tx-xM5}ZLX@prZ24(GRWWZ2Tx-^M+)@>LMf3Hs z1J`=%Qnk$jW%cj>=2Ny;<%X8qhTYkK!+IwEuWC3S4O{E>o#c3TB^qR6Y>q}v5K5{0 z0d>QbC}VDXIEuHI7V+2$Q&F1snK{ zI5m15+%}tCVe12{4Rr4)yFTVVq3!+ERc6biuI~5e<@f;y>_J1>95}jFNjOFW#Ltv* zOwD>9?-Q0vJr=hba9~SAn-H&`^Dpo7LIV3BOdC2+NyBwO!_WT9V9P51z=$N)D1!&V zcGmkBq<;4-c6`iR7A2)e`p(DmNx$a_X`S7E&f~|y2(ksfM;V?BYWg6eq}COpyebqR zC%#7C-`y5S5Y*LE2Dhj}{SwF2c_s8y!yaJZ9ddb!I$0UIxGIz~xKMX=sWuOh#|nj# zFG1}ONoQSvk5d|_fxrUm=W%yWLX{X4-OzAC+IFPpQ}08>b!3p6kC^Vq^(`$ef|_lc z`aM0{&QYODa8_ArtBWsGLi_oa`uuMkV$@RyIW^Vpp>}pT)UHCyEI1q;BQ-45vt-ce z&=b~tfU9F1qeHRkHaW}2$5({M<9UhYADvpb3$$~D8{jYPe04V8;;0GOCbQ9X1oi^} z*L~C@!K>F1{+QVZa>shgj9jiZ?33X6d`oAT0fDGW5ARWCxzbT~>w~jf z0{Z+*{nJ=4KaYG|4Xp5>TPL$|s1A_E+HyvF!nIsj4?dIw#mvFsw8{S=L&OiU!(s#D zF2Epz=esLe8|DH%D;DhcS28{s>(2*B!mAMv2jJ!q^p{t=mZ^roYld5%)L%Qar0T%nTBFSC|HfE0RB*ktmHVbjsDGHdc!vW}P^1t80Cd`@;e4>9_ov2cfmS)Lc)`32kcn|% z(%2TP=8rARTLO9tzfQ5X+n2ji0TfabR5_TjaZq>zxH+8gA#^bT$2Pom6m}0bE@+bs zKG=`dNuXXqZOd=e;2=GDWgj)`O0>Ha*?=c=y8O5S>Xo{nA@CF#On5XF1-$N%ad2QW z8BPE$+_gzAUy=R(K2UIJL|oSxw1x0nr)^E)#?(6$R^fHHFaY`Y|J_k$=a#cL7S>!0 z-W>p>J|0gqgSJzCj(~JUCH!0q$q(;7JZ9qV!MYhh1GYhS`rJQVa_jwR!4?Ge_O1P= zNIyQ`R?UVJUkqKLTSU(JT4s@w2=hH|@29yjX*m0RZ|o))N}0_NGrV2Q@neXgRmeDF zz3z{Gb;h3r4d)}YUsz>6yoQagp>8a;AP6KoL0e(rlm77Oh$i?c*#aX>PYRhMZ^BCm zj0@(Wov1Vzi?PcgK2)k0buaoS_vI{xo7oYEd$_g9{MQ2HdDKPd_O<3OYU(>1K&CFGi1f~B87CD*|CiOIlX#MN$~#hgS!v4Cf(O!WQf=$oIE8bWP& z&j!21!W^t7r9tqt>GwZD;0bjHlG+~>-rEX{ITBDvE4x&B+Q z-v9u1(QuRd{yP+Cf$6V?>>>?-McOQ}>n-OsVB>!Pv@CRH0ywMbP!iM(E?EZf(oA^R z#j_YpO&SQZ+vL=O_B&r2IiuM;ZfoF=1PG}+ld)s)zk){# zkTk&yiU1+4Q)?U0s&{jQgHSIJ{kMp}?763w)yb@IoRaZ^!1|RLFrf>tk7AKwAIw)6 zv0U!?9Csv&d^e4f&?PKur4M z@qBkq%3$tb< zJrB9lR*3_Q2sh$u>iwvsQvf|c9GbWO&qGj`5FKls%D>`ua1vxGDi0gX?S676(`pJ7 z((x|*-~yF4!d!gv_F?|$8_34UCQ?gSGaBUXMd*o&k?lGJG+d@g92Elx_KL3|6wEzh z_83zIt1&8G`3(lvHj%)NAT1frhm?bEf)&&@eE!#Ui$$-z(=U z2lr8G!G`Bm1(fMCc?DDr?f<7s9eHqR08vbC^$(!Qnh4KAAJFC;$eu*9gTs0ez`)fW zv?kU-me9e=SK9~d!o{k9REv}b1>sAsY(TFvrd&M$>|}kBI-LeU0o9?aRE@BQ=c)xP zd0geH4oJ_ZCGwpskYKZzBd=)y_P9f85p^4zoK`@qg57Lq)+)idZF0Yp|J&&Sc4J?b zcm`P7SF00rDu7bKgFS+G?QsR4C%SGzfI*2h8wALUEYKnCTsCh{{UZ?>+Z1MNS_iF$gN6MyGTXV6ZWGW#6!y|#6NBXNL0zR4>etgmiUzE&)%*v+zozK-TuCz-hOD`tz2orGa z_k=SL!?6|r$B~=!{gZ1SP}6`O5R4^~251J-4UUds9O}lTaLYxW9}5CMoEQ^uA*ZT3 zEVdWGar|2ZFiy_SyDWXiOrbbK8*E$%cV&>J+6$eag8VhuJ18&Tkq|xO`au2m zv3&>K&I>b05ccE0`*6KwU|^ji&efaz@hTKSZ z-_%$Prv<7qn&QAhgru3rNKJ-^c6*c;f!_URyy1YAk>BG58|s7e%e!;@m5F3L-r;ZV zIi@A>%<9CyV!!k}Nqk*|SMyZWL}P{L$?Nurbjf{z69H!=`44(DPyC^ zGG5;DIb46})U~owg-RCt1B+yeV94(~aX`cJ9ya{@1+vbf?7VyTQ+nEDP{hFP^1Y3P z9|nQ)LS;|{#dJ~lp;_^Jt2b|^zX&0M?o|R+Q>KYaeBYeExz1CX|Sh z4GT4DWJr#I56b1S^R-Pv4+SfC7EOi(76?o_l3&AtVm|or-_CA@-{jd0u#ICJJYfcw z)atZ5lV@UQ4T5hk`)`CFh3FRjUNJCSC|;~|{DoqNc!;5keU<((7-Za_J?G5C!oUQo z?dq`Y?>PU;QFwX^un~Z3fAMVq#g5Gjb}%YI<%LpxVe zpw9f?g-y^&kO!i7x@^!3lBPOuhTrnt%>57!kT%}UBq0!O{~R-C1C#Bd6C7aCmFw#r z4n+`;U~KcYk;!yLo(nDY*~a3mJ{$jf12H*RK3sB`(H?JWDUpdGMq0)s`&(C7gB#)% z@-%&4d(~!hBQ{*;NA< zKs642qd)sfMhRZd#&C|k|NYsdlsXEiPy-2xS^H6vTkpWNg#q$#2DP(CV&3_<1|!&m zIoQq&@;MV2eO7?x_>kgfvs}QcUN{ILoX06AHW|=~{xNGf%dan%dckfvLG2LTa#VkG zbQ*d>jVdAhG{yRN$GaZ9#>hOjmm%YN#6w zs*AAZ$IH*ePq&zL3VJjK1=}g6c!7;(O#*@|f%V1(9`r1j=P*R+x3ds;k>%5|BaChy zb4NWF94?!0kD}M6EIT#k2=(NOu^W!2xDgb+tYlb?i#l|AX{3GY#!HuI{o^rjqRtAI zzrVh{rIPN9v`4k_pS(Wa&KYmwY`rPPJXmlybnel$uNw@f0s%f>si*M;)>h5f!G82} zEIGTDCkuOLN-l0R)9uU4TO&A*(6G?C$}B6GhwCES1>u64L}|)_A3x&dD1xw08zlhe zLx#N08#dUrrds&sOKrCwEjJ? zjVB#^5Bv@rr*MD)8!$x)-SHNKksLNm_BF4HS89%D4ZX|&R^hno<`D!%zT<0^X;Raq zS4;i;8J~s0q$$gYBp%_KG(-YdZ>-o)^2rWnaWhA@C)D|vuBfxs(+!qymwHJ-_})cq z`xVz#3Sl(C*9|xj+P;Z=T9_sy{r0_QgowFlFX*STQ@2T6mhzFP*Gy=&RAp)L@XZ`= zT5VvjpnpD$*D|zTz4CeBZ@naYB>A{yCEIaDLaX>XPDAsXFv6?VAnaQ{4A@}I>!s#8 zpC!O=;M=1Y?)K)eXAeAqL1*&*QbTu%E=O#QPDz~I=X+7z;oprSu#p5JA@=Vil7Cm5 zgu_k6k_zT6C8be;ng>G8q(LD6O%h1rmJggC6+ulJ99C!K)hdZbzxO--i`+1;dF4>@ zk(S}OY*FuanxX%7#z)?c!Liu^UJ*J`QJsz;m4)7YVFC!W(sg1o8IJpA zV#U@g{&U{P<`0W2N(z?+_S1H?RYKhr^_S>ShY93gF})Ip;)T8N^i!y0aTm`-9vb~@ zJz!$KW_3$srGMxS8TYkcceLvv0o7uXqvo)QP4Etmrz7SNVK%J4Q5W0N*?%h5YtjYB z`WBlUHe$e0f9~`PD8TYv1dM*5;1r|>F5Yu|I1 z$_@^pP6$aiuZsmd6z=x^43ESujpz6!+l)pg2nz3|3m&q^B`17UQvksWx`V7|uf39d zk@*mVEpNeHSm2fI^uieQD1V0Xfwb$V&N3~VHoy~oqJqVlkfE&iw%nd7dnvaQbVmj!6-r$dQb4?PIYeR3jFo2daoQmK z%>W+ab`kGqpjJXYCj{rV4kg=|T|B=hOa)1=ed|z@sYvZrba~pd(y-0k)HDix696W zV01J(roawGe+;qACp9OAuc{$TgNIzt4%kjlP*a^>MO}w~TXdVd{rJ^&^?qXFSdt5o zhs`8@Qf!bHg*(Pl2AYs+u_uMES@r3@DZ42BZN04^)nY!k|6fe6{v!(pi(`KwlDVyl zhHe{~D)*}LVLNrDG>TGSx|?G;BVV+K?oe{G6D?w4-W!AcvHqI?57>}=6SU?XdM4A11%5XyK|Iup)trV>WW3fjaf^ z0B$1FwiLskK2-tiMB3;os6c$BhICS<2rnJYjweu5K+kOy;M~1q1m*iHTfv`4{3&oT z_%pIVC)n#O0dTH1;~m?vhtUKz6osqG3+9M_-Ii?QCCqov_}}Qr{L)^{l`D20kMasx z7B`5H(`y&&^k4a|R`fQoU{AmRqY_(SdM|6;jk$31=FFT5X?!wyfPj`GeiopUqC69Q zFfl)-W@93en$mi*vV>oZ<9cnCE|+$=U7LmR3rV_#lS-$iSSP{i-EA!Us-aliPc93De_{&0WO zC3vI`!T3C+P;3jnQ(7BmlakN@`FoSf!=U>0{_6p!*HJKyKhLS7rhXO_bWUs8^gs+n zuWoE^DgAFsoD}I9aRCu71PFs|J|7%>L`Z5WH)xx$A0zj_`}#DKT}QZQ)jjSUH~RU> zI1}`LB!IGX^^89(^(QG$6)x|riG$KPdfMYAewIzVm+G@IvGWPw)7I8k`b&q$&Bn~TyWph+pu;k4sxo>Un%;f4UEry=Uokl3 zA&U#2YMbojv7MJXT5jV9>eqA*6GXcrQ>T}iUMC=QUc|arG=~f z0vZ_LLaHrA@zq;Mw%^EGtd9-XrW$M>a z2hVmVnVvfY)YftVO+x9ya0nF})&sLuzcnWOs?e|ywvTJ%V?zJIb~;A=nzs2gLu4K5|8+XQ_}Gzifu zx*!hlI*g-@*MEp|+l3l>P2IjSnG66#D|~7CTyQR>C5C?0M|RT~lJMxZKS5CcEqK?p#o`jc;Sh*U5o{ws-z=y;7MkeA+~ zz3gms9L>p3s^NWyZH@XXR;OQQbo-YKgYZt3SkR>z3EubXS}P!C`wG(AJL7m|ZbFYf zS8)J_HUA3S6c;5O(Hx)$=?h8lzq-9|z?9j*8a8O+u$h%N$WEX5T7_*s;#A26Cy?(y zl=5m_0!lgm4wT^@Z}fLnG-&SB!CNc^s6c;=VE9K*sFsjWQwVU2&(z-Z^PTS zPj^8AUy{AwkJEgoqpL70XyXXdEdRL?RbtWU2PJUn0>2tS_aIh`#U;e%*Um0)>bPXUmEUmtLMRzT$&zzwRW zhGZfzOCj0BR-UsVN5UYb_Uoc`<;@_CFA)MNcqsg;a$*kOpd z>5fW|>psX#^u7T{@@Uo8&V2K9`PRGTW5^_ji#%c5O4Wyp=h(o{6t$KR>?8r(IbbC& zx7oCo088Zuc9lvI0SEt6T46`Se5db=Dy<$WGB~91r>8M(_Y(i9q80IWg#*=`c4gli*1DLt za5(=M!LsbYIR8fojyD39=>O%n_X>;tkN25iHkg{5Pt;mXMqIp;=WsiC4_3P9>({S$ zCX28-9&T))JX~D1(L3vFOpwD^_xhQ#}zx}dPo@wf|#)1*II$KFC;Eyo3Z zT^D51rFi!Q0cH~yNCNeoe$wc&apoLvTWz)#6&fuin`OAeTXxl1##Fd z^0hxcc*hFt(U0=3YdUC(3 z4=fF}b|uQquqS0;iR2NZ1mapJ?@kt#0im{fW7f)%R)ubZCYJD-iqTTX<3rh#Y|aMK zrWwV;oTE{u$sop}-^^8Ycz?N~#hR*MyV%Ha;MeALuFAXO<4jsx<%Lo8A`d$ zL;;Gh*O}4Ddfz*n+4a7tr#Uo0>aJ&`4>Z{hElbSW-wPIfEk?fdwcj2B7Oy@5r#X6P zXlUJ%9?*=^_*^cz*RM=L-2jy~r>bKYT)}n$KGU(E@SQM{O5G7$6~M*JH`ptKwax!{ zcdFgwWTwy6(En-r6xY^RgO|eZ30Lbv^)6nglcO7m3Slj$OOtJV%QP$Cj@|^1WbjUY zH&a+>{`1H53%8A?T?-;6iR|qK)N1k@hA8k9fB*h{2j<0a1}~&OgJc!b@zA|}%Kz}q zW~SV6(c*M#gu@*(*LtPUWFWTnYCVd?^H0LTTy=0bxnCNXh6%|`TAHPpw#?XvtiZ6E+5f!ePeC3qOkJezi#WI>#H}GMCB`xH53D`mSliK@qpJ~Au}0&$ z;;m;B3a#fex_`E}XIC4r2RB0Slz>nT@@FSM?wc0G0DQr?mn=HR2Q_2TEmkORd?zqK za^@()jv8|vw)|Pcil3ll7&?PHaom7fp$VWe69us7)>i>C6T*!B@9&}cK&mc3z#J#r zp|C$wAsG}pG&p#5d(;7M8yi9<>;-eYVBg_54uCJsZ5kg|d@pGj7(Rgu%sqXW=Hr5H zgPnc}bU(7xC)G$*Rh4fm&EyJXeXR38)yX%WPBc1hq#gCm(k%ttK)}>?1520fiOB`N z@p#^wC>?&ca7 z2DdNraAl&zw-zE`>F81VS3l?}g=5&B+3tHgW2|5kj;F*&NnIh$oS708%fj)7ttg_L5pjyqLSU`tqc2EYbh zK3;8LO;?-9)S3RoElg7FxWCBw!snQG1NP==u(YP{u1}K(Hr@$)UzDHLgUjg_78ZhV zka;oK14`C%$j@ff4t3+S5ndh7G;%An^zqXuU)1*D1{wL zWrLj7BdPs9di|mM8G!SVmx5aIb5J}{GQ`^Qwy>zE3`}C_eWquC6>hPb4KoF%N~zz~ z8d4n?3-JBi7ahZ&?gO{r-DZ%So?Zfu&O%LyK}ELL9z$|cQh^BYb1i*Cb-s%1hN=G7 z*7hlYAfT=nu(n=cfB&IJ0 zrL0mgaz(0YY8t@Po}M-IC-s1URbzd;+EowT9!}541iNbTmoKGYlPiD8{9a{%1yk9q zeTb!D5qGX03~Z_WO8XvI4{;J@l0QdATw6t>FR;jj-k{aJ;*UShRRzLh@=?r> zL=gPK6pz4IR}{4V45;38ieGwLJx|})m}3wU5ksY(;|t3TJU^Zc zM&uxPV4Q(WGLHk>48rs@*qE?GEb%a)5!?Xr^|ZS_;nl%enO|NWEqK(LIH@d}1%~_= z$cCa`@`l-gsmlCBcrRcLe^>S&G<>zht8k)stpi4?XZ-qAfHuJ{@H!HFy9I zs)-^of;YmKE$a%uF8L%Ll#(!p!Sg|W&(H@9s~@`dZGB+-WPE<|ABT0X*j0m$O*x8h zrvn5O{{*S10d^dPNG&)4v2mloJClhe`3cHz2Ei6$HC2q0!E2A03owqRrlwL&;G;|m zm#Z<^KAM`fy41+$KpOzed3Y4zXC$nTV_k~w<=XngVF zfAH~u%&i1G;-UqRPf{ACKkDz71EqVyv>1j0lYr?#tTUQQJIFnozvF!W5p=ll7; z<;9DI4A_P<86@NDLZ1k;mQX&KHc3>oz)PK`T3Gsd%3ffTCO<*>%?|al%FikMHWVHt zW&FAtE?vmFAplz-udsGD>8fl9sPSa%0z6L{W2dDVp)p|#+Q_4DvIqSi+Ay{1x-g`Y zKJ!+u38f;iqsCD^fqVU2t*bt37oa0U~&MzQJ8y(Jw0y1Bp!J{aR9kQdAZ3lFy zD;K3@f4pLzalmZE``w>0w@Dv7%MFl*xw@~)zPO9SbIjivBU$i!^Jbk0KTlaRMZ2sy z@AtQbhFQf7Tm(tMiQkfjFX4`9?_oTG6+lq4(nnclX6_>K12^S7Q0)*+!<3Y`K@2rh z3@lVsUr`w(068?t`blTx3x~Of7MQs=k_)%}?8h*vz69@4ThXe6RJT@unzu3AZt0+h zSM8guayu#PeO87-Ll8a8q##N4(3LPB#_$|s58KXot9nY{e!LCraJ zA=vqDCyRm?jDP)z(CVX>X@QlPW|%7$4iLQbg27l`#RVbUSS`cT15z9QvuMoMNwib^ z29OIPgxQoVK`rlm@kikebe5gn-PO}{?uxF1pK(MQ4YrW6azm^b5uPxAHaNY&OLLA0 z=l7k8Bj%3Rym+0PxXO_#+aZ&&g$i}F0T=Sb^B-J@?){u~O?nmfbi$ve?LRu|Dr}~3 zfUf1pD=%lpoOd^a`@;|0mQMScXLWGQT^84|_%(E-qI3EMfv%;Ioz*!~#K1_dP^ zge7)V#pjwEQpF-sFU40xXg;bQ!Lhp^9YeYVGY43S#?S28Ojr#h2D%0~{aQuhK=?-A zXgYRE{pwh9XGs^*U>&|-YaL!UX&L{8(O^F^o^qA1r;&eaI55l`qce-kxD#e)Wo7Y@ z8xh7~g1pA_LYwm_wf8S_g6i+y(ivz4>;kAcdGT(0w0Xl=FKX?bUSE{YPk+laRT6fR z(7m;D>o_^Kl_D-PB>#yo5dJ_MDx-iDG*qk31w9zCA~T57e#K`4$zqb}Ul>(3GIF2N zhujYJTHM~Z`6|85X3k1R{ogspy#r2*VHJ59C5E~T^g=Px2(7{*rsRw=b?Z_;d-D1+ z+|K~{L{J8IYidfLoMUJ)@?t&d&ZqD-=Q(#`y7mb-UaPNN<+Z?~v0mAXnJ7=`#uD0wBMW6m+EASm42c|ADFGuD;P3|NHbI;GU|AoChgQfc>Rd%sVP z7*tJjzt8^mJ~b)nuc+uh0|n~|Szj1FrOH5yw?sPsMlv$;O#KQ=bgIYtahw@@+;(K2 z`$N!KWJqMmN8{;LXpSF|T`P`sw8Q96ZkOVA&5?BPNb%Ngc>!l0G=^6(@BSQf&2rdi zD*Bf7(lVjFRvT&zXn=LTYN*2g!pm!6?k_=JU(HrACr>Vda=PVd7{#zZk0z8K`BJFPSzqR(UOP`1XxwW5%m z;FTRI?Ky@uK**f|td&r88Qy4AZp8j)Si#cIk59%gtr{+zE06t0gUeC*H5q;us7RyL zJFfVyS63nv!o_m78pyIRuIimJw`(<$AY(L>@?kHJ*!F&YxeepMPy+-X42P^zu>3dI>{EdEjKc(avg*=X>w(TpIpZHEYs#;n8}&e5~k`Jygnkg-g0s`_GtA^ zqVC_b-4=8F390UsCp{r24VkP$KV?}rU3E_Bj=tu&@0R$b3%!H|y*O|{W?1gJXU@}9 zC4?8s?zc+N*)%9~v|P0(E8KSU+I*v%?L=Lo!f0f|esj@Tk&>4$3rkxZ-)@xw#$eSt zb`8nTiPZM=)v`|wkUPOqId|&1`;7SA{Zw){5!qB1^VSY>1(LiTO!u1P6qs6LH17*p zp=6cQkV%Yy{o4mXCNUy~HYLh|y`sYbInI$2|8<=2@BRd4keWBey#Fm>bLXx2C8P54 zlbe(nV6Fe(QT@i$junZAqjLWd}|MKdh@Pm?jtve+lfJDHne8{%I6(u|GZPVElnY1%r}}>;;@a64$ABdcNn= zdM>}-{IXLD{j=TU_iCyu%K|?P4zW=w`I^0kvpTQJ#%~KEQrqJ+yFF!F2{*kBq&L>9T7j ziS0l~45FTnu4dSa(|H>R>|7*EQp(;@KMFR@|`bobwDy~T0r&wbithT9##c3hte#(C>he00viGi9TOlU&?D?A zD4}O$41Hn3P7;VhkPo~`)C^4b=QN-4N(|+r;nmt6XJot7Rf;`DUn!uz-B0DsQ8ST)&I#vUr`U$B;7IK6=9W?~c__nuDW6Q46Cg+qmb!tKld@z4F z#I8oq+Ki4PEGb}BBJ7{4E{LW++*XP;Cw$zXzVll$;f-vd zquI?2WYXGe?l>PAdaek4-@Zulpf789k=yrSsd?PCV*Uhk8^kY5WwOF{#eB-~o>fIdXBkgb=S3nJ|_FF?BJw4?2uhf6;Q&!Q5K*-Ri3KAo5RT09b-TTAASl}%yiEE$OmdS5$a`uv;#M3FbeiT6_N zt(TE#&e-C>Hc*I#LOLq-2unODb>`R3yNhztdOA+Wd#2a+3UumBI)`iKBouV2liQh} z#s8!TqB3CfxvlWkcX(w^2Zga*yG>-W$mtsqg57!kCSm<_ci(lKqHzOruE`rBr}i$3 zPaMw{-?UupSq~qGom+!EZs1e5H`gtR(Vy@33=UOMrvx+c9GzysxgUn9QOYX-d*F8Q z4nsAPrlbs8!mpi79!06&T9KVBGjsZ8K2%wM$X^2%BN4>ApoX2h!9mv1}b&x?DEL2VQOvBA|#csDu`j*<3^5{CmA{T8G~@%Rip32EV8md|691PklxmKlnK%MOsHk z$3;Ys0r4-R5#}Qi1IZv-JvUtQ(wQmV?XNJ=be}z$;Vkbbfo;cEp0Cy+`&pN}`9qwr zLN~=rf^%(xBre#kCx|5PFPJ6?6A3fRD$CvB}iz8?4<*uD&YKEgR zDz4~DRZ57QeCO)=_0T?iNl3#ZiSCb{MWwi-9N1N)SaS-<_b?^Of!zhI@K8YS&*s<5 zc7~W9QDcMCFdpC$s^K`ue%udaJ~AMb280Dt96AIpB6cN;8+`PsQOz|lSD|pw^g5Mj zB=ezGz%AT!BU246K%ymF{IM~ps4W{`zlIS}V5(P8IAHu0pL~D5deXT-H5ZXn_|=li zU?pkP?$_tV3!d~mM};sjvH{z55_EyEx6OcPdR--_m@5YM{Y#it|Y!Ddvb;ftM|qB z=_se@5c2Z|W0u40&&F)ZFQa;++?dnPi80zl-)+fbzTFFmGzkC;{goEH12}?m-MFH>Y#$(>S!y9( zxJ^!l2evYYb1!_F*q?11NUURf1?2Qp(&YB$5^H5h>FayYD1cFVJMuc5c8}4ZnB9%; zsZT(cu&0TylG3JXC;f{y10T>Pz^+m?-&2J_h1^M}(4}W?WmC13(pq}BKZUpr+!7y-?AL6S*5$7tz&yB_3d@%L2h<;v{k*<7`kzBw%r z--Aw8lPQ5paF0SgmZK{Nw28VN(N^e%dA*}X{ivYH48b~d;XHc94cbkesq~qP{oh*^ zQqyX?`iI9@m$b0{A_)naE8p=t}+`oJInS61d?t2 zZK*H0&G$F|>}coB6qFGjXkt0GFiJueCD5jGe!uVn;<4f7<~n>sHL?N#G?;a3IXz7l z;B(DV-RW&+`K?E@#4f}x{W1_RLcnJw!y}QZL~ssvhek9?Eyh%`KqnGyLG+4r?xEHd z;wsMgw|ap(@>;I+HjHOC2wZgesPjNq>6Oo6!gx1&QVLSe1Od~ztgN|O*{sOu9WG`i za6p!Y>^h_s!jTF8AO>^zVpzSTBmn~nr8|jV;49c+r>mW9_HLNN{%oggQwXL)RnFI~dds))G0d?4H|yCE!8VA5}%Ba+9(n3 zA17Gp)C>xVh5jPbFTUMo>`X%s0z~|^rtP;&^o&726QM`$N0_`z&%ZP?(7dq;=f;SJ zObw8}U1w7IqvB@AOQ7^kjEy@d5 zT!y6@?2<(_4YEDqJ4Op(GW!Rf0%`KYdiD}`AA0wO)A9U>bFlob5rWWE&h`qO?=cAT zPEXIBwoh0Fsv{DclK4$?bI`}wgGS3uDJ}AoL`Gvt&3`DeGcZ)SmM!sBX{Lj9V*JB8 zab$?cIp~HQ#@>-KHz!6ZIhfHn$MChQ1v{_f066% zgobgBP0e%I5*_rc2n{*-P;-6~l=~XZ+nAPrl`ytTIybf*tXc6^aO9JH2L@DKs+<&L z^p0?*W>D$z;Hgpyb6!te^@+=^IS|Bv z6ny(~k~>q#vJY4N4V9GYhG)BEyGa@#=QlBbQ`0a2jUfMB;%8$6n>t}#E`xAKYh6L< z=Et(<#gJVxK4m-i>CsRPL6N*T)!cs088-~@D0E%(37I5B+ZH=vj{YrrGgn3(M7=}S zXe@BVM+IHWnTZdb7i+Z}H~X&dC614sl3h)P348-G>?<86K@Z$7QXrEZk)YpZ`1>R1 zg_gE);-pd+yL$piqgys61RgLDgqe{qn~Nzo?=$K|K8*ZM`BK{EG$ZHmGo|T)hGy$P zC;%OmaKOXw8&&FwfXJdy5Ayu?K(w?m_HQRI=#p=*MRK$y`M6)$wTzIce)e&64R?f$ zf>tV5lHvaM52aaXaY%OU+K={so{@B;>!lf_7=ZwL1XekCCUjPOW<7#teYsDBnt4g> zDVS^cB3oPrYp9^{M>5GMdo~c#n$b$KOP431K3*$}R>-g}+JV@To}t+iz|<5z^&w#o zJN>2@EdD;+pWDhxgSa2IEhoXj9rMO+zi<0sfL5$1%F%i#p7I6~;dy|47eFd%P$Z`^ zXm@vhghlROuEsO>4s;#>&$f{+hWLg#4}ajV@aze?|F2i;^^HsB9^!JJSTA3)8pxmr z&v$u2MBK*QylRlEhy$iSwR~LGd-Tmfy9)nSYav{8ti5_K{!QwWT`%8SEkJhk0Lj%} z7%@4OM_5JeD!#x(xbkmF0TYh^lPkcaG2y&@v-q-ykC}1eq-1&qLk?bzKMxudZBe=} z;U@pxs__q&83-%M%c-)=saC8RGWC~>r~pq0ghv#GwszdG$jFL6X=g}W^XcO$EfCZk zzJBden(WZiUQ*(vnd7Q?TF(M{(kP~tbygf z?7&TH=0CJ)g&*gs=K8G`cQ)^Rv#tIX;u*OQxa3i=fi`blsG6nni2L1?=07N2n=%9H z^mEm)%Cjxbx@am}VwOK|rvvXIT&bueOIi+5?^}r`V@@{C!+?%v&Hm*-jt1;|j8bRV z(3WDb)D`&yy_4Y1$$ZPm@o{>S7;Zdxk3&>*UrzS?>MV~zs>jZj^|vod>yS;+yes+U zSoim9u#;Ot$>AT7WTg+G{RYR)nVI8m>ZYbsVIQy|uM8&VKj>ewS}-B(+0oAIv}I(J z#ROI|YoL+jEsXQO0)5VD@ewpXT99)C8Z#C-1Jx+oT&}Y`p&DH? zhhyHd22VoU*n^Sa_?kSjVaE=f-W{cSt!9Z*CTNya{R zmbW`@yya~f$S;#dCyg|H07RM=+VWa^hzYclYz047J@Q(VY#kpH_`ba{>t?LmDt>FQ zhj|gvRkxU=sF%w&hN+q57JG#SbKxKRqZuBFs{4uMh|)?oT(Sr*txZt*V&Y(h?-p9z zM|S%s3cXCBg3aGESwTGCY#7nyMBx7V7LLWM{Q9%x zRWh;XXJtMN@R)pm4ujCnt{YV8nm?e!Dxe#gN-e;}SXlSK^O=OHR{Sn_Ui^BIF;Sn9 zziG?sSC^}y=$3k+m>DNSK{$=@bu-Q9m4)V*$*LINlQL(Ifs|fPl%=T?AC1FdArlVk zH@c#n9*8FqILT!zHtOibCEEEX^HC5MC_%vJdP`)_^Bu~YFOBvw2`C$_E8Y3Pc@Nu= zXypX$3KR-D+zaN{x{E4}zRmye3rr?=F5T-^zPU%PrQ&VySxS3d=p=w$ZTI#|f#_;! z8KaQ-6Zz=X6T=>`3V^SsB!3U~U*fryEddBh5ND}j&ndY4FIV*+@e|`;zgAw#nka^- zyox#EM6J-RStF*I4;nLU++^1*x#Xv+GRCWzP99ca^+9#HTh@0^_D3(mbyNynW>V96 zYYf9(S4e8#bgr`0wy2RmkK?mcXH>>0E;=2jaLeGJ6oXVZ8J}edkiF4%?>BawoJVeF z-fJb;k&GFib1%U&`Ss+FZrGYB?!Gn-ab{#N0leo0Gd--X60_*WZdsRH)#eX+#aag1 zYez)?y+o|n;ZWNhot=`rZq7WxV?=I9wsK6YKR?;kG@Gl!!;sqf5?w1LrWUH9d@j>xWH8oc<)*`YtwU657 z-<;Fw_a)nfs1e5tXzO}B#+94wQyCSf&8XtGZi%Kbi(&`#Si$zv624sO@nh|c>THn-;i)naC>Iuwdl&hbE#&qyPi|Y zJkw+@s_}Z5h=bo|;^h2}B-^#i^gm^z*41L zPFtPr8en3hrAsks`0v&MJp!4j@(J_eR3Jq&rbT(_plGazRb$SOyg^j)yx5&@;N;6o zXt7BD5!5t7+nHT@?_MyHeCnw)RQWcHDkkb37m~>8q7Og|v$eqK%6O+X69HNeQ^e1}4)YK( zAcA6)GJ_cEgcA>!LHMHey@iJT4yD;Q@{uXJ!H5Uzeuu`~Svvzlpw9{;uLE+&Uqk72 zs&xN{YKxN`o)JF)AU>^8RU7HOR@io&ih1pdZb}kvmlT0)HXSLN7Qyy;&mq9RfXV zt>i?fIw}XuJ~jlu*(DIz{50<9WUERByYYr5@MA=`01s%k7${1GDdcl-g6a+2k>eyT1h+}nwQ2aGJgM-Q=TpCqh>SO z*Og>+=^4C+@S+la}!_hudIKvc{eh zp?PCyA?z*CP+0zU_9mM{ay#{4X5_(ds!q}xR_i~u{$O)_R@miyjb@fqwm_^s98=sz zM(3@xkhJY^X3f^Kw?*viAug{B=jXwaw_I%+{!>QM)bv%7rc07%&3vb@kb!$Q2r_Lv zY~?QP750Z(_+w(i2dpV2MHc@Z#Njm3BC%5sN?`LdP98>1xKpd;J>;dU=6WTR&C<*s z`dYWS#i*;6?OGB`A1us9lk*t&N%1lQRvi6{-wsFOccp$pA3}6w7CHxk>v12>2Dea9 zlqxDYYgIkU7{?FwFffeTTXbex@R-=+s{{6S<81cm8-fg z4UGJRA~!z{Y^PnuesBC*CQn6+{ISZy`s|>m69#lBFAE3!Ezf>W@s0CtNvy8jqHxUQ zvwaIMSyk1{{ZvrQn9V{qOlnU)cEbFD4&&#RIHtvmBL@*qL#Kp9`0ea6?`=dHnv1W* zRanq~UBbb^?^yV{WnIX>=$O!yST2dvA&*u_~>vpF@@Mw(?4qZRW+AqQkCW%(L`@F`tDD`wWQYH?~k58 zvwvnsY|wddpkl92O`DW29^Ni6|`9d+_fpHZqv+tl2LAl&au*FYA@2zq?k?8v% zI`^#3$0=nOl=7=!9_v@`Wzq+rWHr(pgSg3%iRk_l12j#<_o(M!7?n5XDemy9n3{3w znWv}2+n=*OeR42Y4yTBz;{u+7Z9^ik6yd)r&71a~5co)tKjiU) zj4+$XHm6dZZHGnNAvY?m0i-g}8p931uCwuNq6@{XOD~#5E=fQDId(x#sov}8IsP#Z z0Pd32y$t9h8B-L(IY!t0`SaIzoA{&x;ZM7}&F(9$O&2c-3@GyTwYA;GR66_w>T9Z0 z_Rji=JR#*9&z^hBZfjwFWq6!O^0yjRT5xmbu+U0M`NAD!^TlWhCT&y$eT#;5OEK(} zq(201eD(q!YsyD(ofLvE;Lg*Q4=C1y$v2sso4YjDw??PQrU%F-$^3daXVXYQ z_l4QN=yuN+=2Ah#Op7q$T#rELj{WY|e#i5z;xtD9lNOLCU05jVS%$xbDoce@@#&HFLQs>4MuGz?)i(YtQEoO_Pr~m!m-)-ptZ*$f8v@0VC&`s- zyke&MRdb?iW_nOD!%pKv6UTa2AhPyc_sEw5LT{s|;pS!u5xu%o=iXvWnQRN8GVnf0 zs22n^&-iQxpz)zS|BPFEB7L1c42D{i?efjMK%7!@LVtEZ>URX)gQLPvc25d0>DQa9 znQ=Adp;6P5*LUTv-cM64xJ~f= z_cRG+1fjb>=?1lvk|ej1B>naEjsHg5^T_F}#iDHU5bK}jpgB<4>sqtMa4znI77che z#Cp*kiY!n6PMGcTyKpihKUEoD5gE{SCZTp=Jmz5-w0BDV*(NdClF;FdSD|57ITQVG zZzJkL-N=YsEC%N-ITYQ8EH0a5^E%C;|D9hu;WrQl4#TlLNX;T`*4LduDCJ{tdF5|{ z8(-b1*KE4bv@PH+)Zz|l{Hv^YGH=toMwg?v_U*}5k?ST7P!_o^uwH3zlUGnsTWWFF zQb=L`^na>5%dn`U_CXIJAtfNvAV?!1B3(*@lz@QJARyh{A>AR}ASK=1A*~<`Idl#o zH8gv8-~aBXy{`SdbE!CvGxLj+&w0*$yTW8Rp0E7?`bV%16SNYA7Enj5slmzB)bs)lge`{K zM7r66VnIHmMjrEOT^VJNHA#(SMjTt#7&_qLm-c+hxjHWsTzq9X@iS<7>kCltvFKu$ z6>_WBwd=*JvosTzU6J2-d|C@D+u&bJC{9Zu2*G1#kW^TwN~BWb%dT$5m-R5p1dxcx z!`Yf{g+7S9EsE_qe3pfq`(qo(&o|!~N;HR78kB(ie)Hk)Z20@sJCDA&dQ+`B1N^;- zT7mV%+`%_eVTGQzDcz&sl)w4WSjo!%rW#7NMayX=-<#mWX~O zJl@2kC~&Wqp|pLw(JR=P8|>sSOPikeHPlt-Yj6&E!%>k+wh8C+ACBV8US4MlT58=z zh6(R0V(RJWL#;K(Wv$Ce84O)7(uJ=34YB`HjUwvD)`)MUoeT?*3+C!0Z{{!xfnT%9 zxwUxDp!EKx@PAIL@_tC)P-vkf*{-G!e2`%2aqhJuJ*~`_eKk)3GHK;k1LDLUGeu zWIEL$orQtdQ9n)&3V`B$<_I~QKlZ(A{1%BH_4Ol8N2c}7Ij*}FF~*bF%&7g(fXqYM zTBo36COy9PcxU@AvECA*PmF^y^HwS-WrmY~R=14tb29)xx(x%RpuMPZbtVvFdkyv*|KHdw-5qO(8Faw0*o1kxMUPxt>sz0D--ITSTcc7}REnh|7V*T#jJBciATV2ue zjrqt-!wTj!WP%6IsomG7a8Wx>X=pTISg33A8t@Pk+1C8#sSg4r=InN_zd>B>+)8X z(=PhNFPCud^_rLsR1kD0fuI|kymoL^7 z%6v5^a9o2dntU&{i%sm&)J+HGw ztJ|Uvd1@f5gAzds_B9}jeGfA^X0u1A-%m&YD0E$FRQ;Fns&!{x!w)Jd2?GAqiDKh2 zRwEttImmmxL9Ud4?BxDfQu46cd>se@(g+I>kp5Ds1=<7sK@;-PzYr5<3pwIK8qz#Z zb+`TcyK_70S{;R4&InbFxqkzDZb*xo?>)ez(9gnndxGp%?yt%8ORwAJqvE>qht)rN zF0t}|cei`d*7=2Lp$Qo#2Lc9P2NIY~;9rhby9xo9NLpM0@8m7NRF#3-VPvrdYjV3YZ zAJ8-%WF{i(Z~(mVco8tF_Fh@;3^R9DHPRHaYa ztkP_oKYZH9DA!K-8iJJEiI%M*5OWPO;xSs!FFnlxHL&9M+XLH;&WOOQD*s8#xr$+^CCu5eWc*LMq(5vs%oetG zN(^%OG3h?f#b)U2Z_Y4v&8))*cuTA47Fh+ts0qY)(~oJ<$iH;uJ(_OyG=qO2Y|RB1;xgZ1o5{DD-hOBb-CD89d#3a2zM{r^(x*BliN;H705 z_x5FLw@)j8^W~Rjyj9Xx@uLh&enG)n0%;WI5^^_fo$>fxQ(R6Mz`>oJX6%VaP38sf z?BgLmspqNH=6Uu$^oGjJ1wZ~T+hP8-C${+-dKHZodr4+Q19C%LX%=R08!3M=w$Ur~ z4kbQ+kBK0Bk}(Lj#!inyN^|@*axur#B0WCMMZ0d=zilmJ?bM1zT(7%5aMB;wX$6lM z-U^hw&t+cCrDUMlzlL)yy2;xV>1L^CUm+TT<$Ck1QDO1S%qCPFwoRfvY#Exx>UPOi z8}(DSQ+f9(rB`~ZE-&Xzwxz7gPqzK)BGSJ~_kpdfX!>5u^v%MJAK=0NgH!bvdO)r`C;3TD4Twg!RkWw~>)J(C%jjomKy#~Lu*oLq8 zIsS>X-H&L1HM562OdKAZ#EHeIh8SWCO-nOns*e-En*4s;9R~h)SFBB*ARuljH8@Q) zy~!ADF()5Q6k{BouA%H1KlnDGZ?ku}^(J3emqYhes0O|g#=fhX#;bn^4)TMy_%>8; zjRHG=Rg!adYiFgFP((#2fEA5$Bs^eCT638w&Uyn+()}}_-8Pr$Q(7d$c)-0qGkzni@$=P* z>!%s4(08pC1BY#Blc}7J7hCAfRS5--c&)_g7^2^qm3RR*MltPk_W0j$jv(vFOqg51 z`|WyOYIxhisB8ZkqwM{&jdeEfOXFlw>dg^MuL>U@z5~7%5mzCQ2>Kt8{Q5=;GOhro zX)FDQyQ)d!(~AQi0G>%hDoQ91!RJ`t_(p7(HJ&Lrweeb#a`}n30Z)?MOHs%X32*%9 zm!SnS{aFrhH(`K#bSG7PSf)k8h7*zANlNXOte-Pk) zvC?lFegv=(T&6)BInUl}j!VAk3SCn`QrG?^-@c_8wSf*Mms>~dAbF8Kf5llmnrhP< z1b{YEj)qvz*9!8#a&&M1zH$L6wwWD7tnzCd0OKmQ3P}F3iI2Ecq#@w;nGK2hA+*^w zTlqxFPmUe)gcdFulUhD?@&j#idk*=)u~+9s&92l3{5O^u4U0bnL(stF(|u^x)MAZ; z`(siZm)x-5c91eot}q(qIGqH=xUO@SYl%ws0bo3m1Q2k*hC`6BiQ`Rm$o`X8q~B+H zs&0i58Q>VUhZV(zo#{$Ik-)~^Tq4!l|Bo)rdHsGrF&1t?N4eiIWr>AhjQ~1)MXW z;%$6t!&W@R3Y7&WfvxAnYzIxxzw+LQHHgni&sY29l?(=;U+ zn@@0RbWlofX5S~x1^Wa%>~t=|1v`_F&Q=+$rscJi-X4U^I&SOx%pcB(5e>|rnVw+WOS2TT%8G)NNj*CP<+~Bdq+vHN6NWc7)@ZRw34vLBYyUczyX@S( zFzUqGCZhTy4YGOssrXM*Vj76qBla)qjv4$K5hCx%YXX{1*YNM6zj(F|LBLU!@(X>5 z3*ns2qs8v&pncdHRsvvZP7-a6vgq3e%U&Ys3it2T2Is3pB#7WS@`}@$&Ff$I5|zMK zCcbbysJH-F{(bKn;4{lu>E)K$^E>ZMxdH@KsMtTZYmXmCdT>NN;okk`95E69F6!b^ z;oMjYeAZ8pap(Rz=$(BvKV4cnwscj*;r5VZt0X3~_P8px;jB62#Mh$sA88HHu(dOjOL@!tA!yHzx1n1-LS{XNE|=I>R%4@;*%HZ^?bn89oO`IFBl221SY_8d`^VAQ%zhq2}{HbY`$_r{;h%Ia$9 zG;TCH7%pcBRR+6Yv$(|;lE|V-{>-CHItpT2j3k_nKq)RhS_%G~HrFuY6TmG74vGyx z?`R7R#QC-;T-R`L2R$Nx#Yb;UYmGK!`H0j%VqtwhU*T~Moyi&yZ2SPgXdvQqu0MXM zzmEE*6(T9Q=@H~h4inTqV0%%K^_=eIj4qaVu)Wf-shjKYe!|s4LZTU7vZ}V_OMnf% zbrSG!jU#VF%Q$nRF|~Wdal$)l1<38QZC>g)oV9r_hsUB?4~O&xL$ip&BiJuo*FEFD zWi(UB=I-X}8zy_87F_n9I0IH%$f2!n2!KvwW_kTEs#GtZ8jc_p_%kS0p_fo5HX8f)Qd79V7A=>x3=3 zn*X8S^QT+}S%V^cYB+Rv9S^juHEkVQrJ=g>FBuPQ^xn2H|0z=1>;ZXJr5TgzF)6zUBeW2D2^e6 zYZO@n($V$tle{+NEq~+oZnd=}=;`ZLWUpxbCdw(l8CAU4ppLeG5nU67e^7YP!cp7s z^7>rs+KIwq(C{(yQ@i9h4F7}FM_5m=-@0q3s28ey-R$=5U1n$H`=AGfg7cpXGCgxyLfn_7g4aw}u1f zt^a~3GgCxi4PPQG4pnRnKIAFT`CcjP4hR1hW%$nG{gKNDSIi}A?Z$I^e!#Xzt3&@; zee-ozW5&wQtsm%Pv|NOD7t#PkOV0c3IBHIPCB%GQ zNI2#;c!2#ngVA;$yZY;guezfA{1fe`uaZv4ARWu}CjS^$<5&6iUS8ZD?qm45EEKib zRCb^$Rf&uF5xg~PZsap$(B5hH;4ZbTPCGuHpd2dF8D?e2{mv1r7sci*sxI$=D0C{E z1TB{^IfHyhoywx$3IP(2&o1<0Qp_~i zlrlcMq={%4CZ(7e1(#-K83qT^()<1qB4oT;pzM_*Aeie{meQtZJ&DrsB5~+u@TI3y zk+jTE+I#;UdMT9CJ{&5O7MmPWOv-Mn?*U^}!Ziul-E!;>8?ag|QXvS5s&DgL@^~Y@ zNCUqVR+*qurw331#`8Od} zEDNcDu^7)*Uun#tYdP}>wM_xo;Pc;%&W)Q#`_L7wkxzEwbC1Dg@vN#^e+FGGq`bhb zY_lxipAdWJEfPUt=5edNIgX%nH>I3?{B|LQ*-5uFbdI(x@AdSwLTK6X&ynMXKO)K6 zRXu5FyT=>yfSB@`10 z-tyB^O6y>EPC)T4hFis);TUDl4;;JWmE3uZ_3B5)xCN^9Qxx;`_XjTA zyoj|W@=2vcZr`|4dCg@o!wz$E%<0^z{g$C4?Avr1`o+{Eb9_9Qh*ivHDObkG3`0{< z0oHyLK>g&pk9cA3#MssZwMA0o_{6Fr3-Qc0LlI7M=JyHW=`bMXu4k8dzWx+5KUMO% zhK}xI4b&#Kv%&G;Pc`~1nf$&=q9%kN_fgnao*Q~Vh+k@g!9jqmoE$ATH#caoDZ9{dv8ojt@>T6L{;9S#**r!?{OJ88hSVm zn}O;!pB1BSm$!G3gx=9|bXd+8sc;bB(()j^l!w(HY1WUORp(m00<4f-&ok?O zYMtTq1P3b;XnLT>z$z0ATBX0`QNGkuyqfr$Xc@!s0sa*UR}i(;$bz&dc;0X?M_sDK zROy<#s}y~rZa!A7O@=Q7ifX&m>bBrKZ*{si!vR$=JDK+JVyB+W(ky9=^Fan6m3P)^ zIE9ln?Q0b6U+`;?m~M0!_%c{#pDX-;{zf(zNwjhua0#&1$k|Y?bm5Rt?UPwTTV^Wu z-h;4M%V-tw``Qn=p9dz&uM>zE(6WB&kEE%qngf1=+bYKs zf~u*2+_+csM*uHa&gQebzyfib?{EohgHKkd>r}uA0_qxDIFzb$lZllzuc&Bni{U)} zn1uoIDiCMnZo@C;^KV2Rb(j2IcY)_y{Qb+#t`70qyS?|zOwLm(T;6ke_6^rL)OSyo zJh>d>N&@j<8%w*_NEh5bMoQgyVkNzagT;?aJNz9sM`&1BO1kC&9xLtk4vUzbj-I~H zYY%{)ubyxNnriqznKbK&0R&-$kqgXR1w@v2efwEhcvuB@&M{ zg+5{F5*(sG&qKn+Ah8K~_SE*urksYXXHtHH^tGq^y+rrB1kQfc7JRmi!Ppm`*H%4( zDtsA=t7~hEh??r^WPS$*X+V+MxlT$<{GhJB*{-LiCIJF`%r9Tk@$)y$?pyC2pX9jM zH0BsGzi&!Wz}7dNW_T@@Lo07gUyyW@95^nrsvu=&yh?5fqON{I@=u9~V&mfMhi0-3 zrF}_JG_;W_+WI}PjY;uhT;0+ohB=`Ne=X2EDjnzIn&vX2b`>K3A zhqCq2ACDQGn4M8I)t(AnF%ccM4o@5-8ly~IgRocE#PxBPZ!Rmng=;OOk5h@=;QDbM zE5R~+n58t!KcEdZ)PSmE3~TpN`}ncSX-^%nr-rJG2K*Omd4OMcXwuI?yU6k>aU zH|&bgx1skTXqOKh8XSD}He(+649IV(0DB4T75JlUW`f5MVQo}h9Wl$f$86L|aj-BB zU!v?qOH3kn_}AC(>&A9vkMfs+^EYaP!k<-tI~*40+U#R{RcBp2qfXEBJTsG9cXDZe z`wS{RefiI+ocfO|+PmoJNm2TH2goM_^~!4To6#aM!L{}K!H?R0e6sRK{k7BQC zSKq&^lW|Hf|Kpv@mif)e6%Ggf%n84m_YV9LrjXZMD`SEvFe)=jt1~jo(tT?jblsbn z8ipGZUq_xJksUvnZdo;fRD>^LDGz>4Y&+i>DfB&Y+gm^+GiH8ETQRb{3xf*z`}d@H zlzV33j0TcNosGxD{wh;vdm0TBcO1?nrc#%A2kS}_V&nI$q$7k2kWQlo35pHy!TU{H z%Wa4vYZtO4xb8;$4blPSTZ!(6-j%bwEMDEPA*dy2OSa=pC*{b-2Hy|UC(`uyUxdch zl}_ERq(vWFI!NRj?CjX;Ed)@k$X~?`?+Z~}_)oN033pq0F`l?xx;bSk%47TWG1Ici zV`kSTkEZR<+z%5a#0>JUuLxb4>63H%h?qT^=kHFrN$pr+VOyzovC&U^LCc7sq-+cj zMY5$nx!fBO_M@~GwnO$6n_N1aJlQn6(CCi-&oRC>AK;JFXj)kM)b!dG2ii(X<@v-n z&4_9XgVHM#Hs3^*06@zJFA-gzHNlGbnz6bG73O@_b)TN`8V* zeR+9w4Qn}&v?GlEphzJ*Yh$}z^>@^JoS_fb76Hlhu_LgvYgb~^D{rJ(kp-uZp~3kz ziT9H98(qBi1^48&H#A>AJqr&2RTG%cE%I~)UCMQS%oG!X%7u=5AtG!=MpGwR6#{Mi zpnK5N5xyieNC7FazGL&K=Pj!@tT9Ay^ni@>vBu8ZAiT`y>lwJ;<&T0v3>&TRB5q=1 zLTo3QH*RNRb)v%OcS-SUQ3H`$IE{8MUg}zQ_^e{`twjg~3*9<~z&TlHt#@`}VwSI= zVh1L8u)I?K!S;@}>3oERJ>0f<2Z@fkSng|tmnD(f@>0?tdT;7k4dS>`0~?gC^;wR6Hzy0 z27y%PJ>74Zgm4O&RQt?cMbFvHd_`nt%hoQBy!;oK2&@oUH%^M~Z309t++JX1l-KG| z>ys13c#@u3*4K4&{Tb8)uWQR=ml++Lk&W3(q`NDP>swVNkPp)W1HRZ~?qP&&qAxzC zLU|)Twatv(;`yq+{Z{)|YRwunsYw6sZZy~nP_Wzw&lyC{o<@*P2IkDCQgvFn$wrW@ z%l2f4{}>-Ng=*MOT^wU$oc1vfWJCx)W6H1toJ2mu{Jo@n8k*>J z%C+#-DZsPBsR@!A`Mko2F^xSC?#}`flEm*Hbu2GW+Pu3yKU(r|_WqS4?ya{MM(MJ+ zK|0FDTt#m}R=@yV@K(xIS_p|!|L2OS2kvKI(=HNn>v#c$!tP_~=2__z0{D>NL!cRbsLrl;XSU&WiX zGVipfzoT+}3%keFC3l-CU)jiQ6Ot55>tH5BETGJOBkn?{hVI?K?(0MK+0Oc+{`^5J zzYah*Sd}2*Cy1h4V|A~NUvk35x@hmEMao50{;a)E)L77u)QN)l&V3;}w^J*rVR16s zl~;t}ea3oytH3*3wMuq*>8#c$@)?zup!v__erC%O3k#e+^Y)A%qW#NT2*G;JT!lXQJ&p^k8+C;d{7uV>_qoUm?a&)K|^9Q-|pk zGu_c}OTmnadb_n&27~cbV~vp0-H)azHv75Nb!PY>GTZh7;2Y~ce(X~6d0bGn4@cp~ z%ywDWo&b^8Yu0A?dYETiSs~ANk^36au zlVU1_cwco!Nin5^8kb=u+LV+uKc{sk=N(C@buv0{(-W^WcbLQxJgIoXKgNx{o`Krm z3l)8?P=d)o`|bnGKRoR5g^inFGlW8Psi<+qG#^@$ayU@*;b_j{31QF0Q^5szTUzX% z7m*;Hb}>4*w2D!t^i;0y5JIMnpEW|)j+Q199q6Bn66+8~q9st--7^ah4K@OHw?#tz zQJy-95QFJ=))qhmQ}bYh8Mu&!x(V?U7T@qdkwfT*`2j&IJ-8Uys|$jd0X551u39rdEg=_x(C#2PeRFq@mQ^8zI;GtD(l{<^}DX0&+dg530Nu@ zkM|$?+?L`D;p}ua2>rr=+=L232lbz^RlmD#+JZlccIn#2e__c99g@42mgwQ7wHnX5 zhm+1lM%6ob=wL2SBcdIK*_>~sRE@v9eV4h9bYoMHAr7bHEh*g}b5NL*Qp}G8<+cp; zdF3r*-iN6ujYjWD?@vTCjpW|%GoAzqb=&NSAqj4ew%v5yy2@h8XIcikwl+PM(NMpd z3Vs&LlY2fDQ~g>CsXq}SP%J zX6<9m&ytE!j77}^oh5O9nhC4Pj~vvwQnrd{Q?b>RrMiFVtrz5W*NbPZOU~8bcryJg z{_VnD+L-!L8R?!r(d$%Sba7V6<@|R5%7?{S3-k7^mn=tRPZn|0Ak74FKH7a*pn#?` zBPBdb$~sI@QvJN!fjtt4>Flw5rGAw03!iFB3PSY-H_gnol~G_07v_4x{G5%JX8iBo zrtQ?Cz>Uu({q1Go5uC*!8X`W_G?qy2@h zIV~jyI?z{LsDjErRL7K;-#dmB5$0c=n(?-ku#=FHY%Xi&h@|7k3u&m7=(GMMX|<0% z@vRn&J`g;iY^5Vwt8X396|Yer1s8_CJHkq8ig{JF_~}_Kyz}1~x2F-+#k#yTS*SzX zLq6aa$)L1|XhqCZ7FOYKh1Sum3MkEr5@=4D4i#o~jES^`eK8Z7qf2$_s4X#*;Figq zEamH2YEOpGsyFaGu%}HdK~>tv3-I)pHetE|jQq66iUvsV|d(K-Egozq$A>#1%X7G&cNg`_(QhU@=Nn=(fqo%dZ18r^&%W zQvz>obn=_94saX}knvT>KW}FgB&}#CxaKyQPABYw8-mpsJeo+%dvVelE;93DKP|t2 z*}0a=rz)@M{4h9dh^d_>QfX(LHDc|9^$I)HYI9@a!eF(41B%Y(sOn*sL{Nx4#09|p zoSe8ph7&MNCW+o(jtc=g`^|w%2bS~XoY0Il1^1(Kq>I421i}G4XjiHBL1y57S;=Ft z9j&tVN@{Fbu-=viuWxa3c|0ui-=YIFZP!)SLK*&5_|6a=dfA5aYwUb+|Ah$EbXn=W zs}Y=HT{eDKBqI z8Zpz)9zV?DhEs)G?)Gkvha+L2T$EDsHoG8vw6)U@Z~ajA$JG}?u)*vibdc(;&tojC zorxUrfPn-snN(9-cObkE!U?Fe5Ed7>kIstedJMVJuqxsDcNM)b`uGRLRumDRG!gwS zK=IC@1Sp)2NKnQ_ZNi&@HsQ1GpDQr2nm*mRcpBjn8u^VERy*Tq`SU)rD-cyMv3LIN z_RdFf-z_MOrz=--qA+?jNCJ)C_pPoj709MD0L)_?ss`H?F~CS&XgFAGK`;7dHCbs; zX@sur)7ExR1VhO#Y3wcR?I~Ed<;6p`E!vZG)O00oYO1s|TJw(TAnIH$-k|^U85~3A z!{{)xaYg0R&Sj;>ryY;QXez6QjFHiADCmm&TS?zR7$OkEnfS~5RAG<$E_J^WM7_}f zZq|(F?b*yGD2zNn%qR#Z*kJLiyITxlb$@q@5Bs)2(&93|@_otE06W=cdzs2vHoF(T zstu-p)USt<2^kkE?D#x`zf#~DnT)(L>GX}q!wKM&l_eX)bYbI;$b;g$1J~=!(XSug zu6kQ7F68manh4k6p5)(ok)%BEb-Ncd@9bU>e8qq!SF)fu021&k?q z6r*ftpuh7Bei6(I#$+rWQFYtd0oicINZDV{KO|w4IRiVj9>;g5g-*d1r6uswxDk2S zo)F`}G>H?b@LZHc<1=SKH#{0o=j>6W{;&`u^F$p}|MO=uFyoIDIPdgB!KM~Tzq`Gz z@w~LpRjQwoPaRDhX{y(i%THh`X$oOmP;Vpg#UZ3#^MDns%GXuMDmAbkgHgSP#xXi0 z$DzsxBuYV+koRlM&VfIG2)zQ+brtpI8rB}o{ghYzXJtKxoyAOCQj#<%rhvnF;x_iC7MA=b+=9t;N{KLgbMi)L(;jL5B8cn4=`TU{ z0UEr#qI^FmE)ITu12LPZNh4@m_p~8 zw>^Azc5-+54-ph~#i%WJMAFT>Tj9GqL+OaCz zV?x0ckL&a1Uuk%#|pW@hH6&z{Alr&GW;16#rJg{=XeN;pDQ=C#)#kPectG5_*G z-gegk$E50=B~q`^xl&oz*~%C?FfczCu=^+i`@ew++@Kpzz~gU3=-vyvhEe{ZXh!>s z!i03b@sAxc66zL$CFQZH%&k^CyAv1@(d^gc3_%y<*qZ3pUkhbHWW?9G;P^ z63=%7gRIW=^-ib1pKj9s3h6qb++Mk26$S5Ui{@>8oa^jr?%H{n0YXjHi6Ba`g!%J#9s%V|`B zN-}@nLJ_XK@Z?_ss`6a^CPOqWLDN%S386RW$`TS1blpryPx0~bLtl|0i##gVISmU7 z^Isr{9b9idpPP&N4lYX9Uv(qt_bSM)kHf;lk+wl>Ge(P+U=}=)m6gSG<|0$55~q7p zTL=9emn%T*yLbOvK1i4s5l9& zbubIhS|Sp3WY1wrA7j)8M;A6ytMPC){>=Y#HgXV@&K28NE(h8axYCtr_Cwt}+Rt0Z zq_+sXyLVvkwg{TLcRazreNKDk7Xlsr}R3;D%o5528g9J!@ z+#{@KuUwDx~JAc0Q_DTQ_d{>g5_iQtc)qgT{f5kJ#r>D!C zo3nskV-4VQaoSBl9<_v|%V?T9dzbT!TZZ4M7y+@7&2(a)&UgR{OE#M&odTW ze)YS5}wqbf2~ZfJP839z6WcYdUi-KLI= z$Wytk<5T(E*gYVRfvJE5z=Z)JyA1j#K26B&byHK*Po0+UGrAs;IOII90Hi*?{Qx8& zE`vc*^!4|Y6jI;mEBBRe#ErM-^C^NZ?10|QOss8-^g=pn{b;4fJNh2rzEj?q5r7L} z1O`|SZU%s({&%^Rh2FT~#C@jSsosOQql7QE@cOcq!~U%eG(E@xnjOvZqF^_@>lx4m!me`Ywda;KN0TjT+)-;=84YPWP0#Ot-HjJqbM*Mc~$1f7|z^HGbOMhhG5cBfEC zXhE{QIPmqn0Ki4j?{RV6p!=L{v@@ERs{@)H0N`!{Ta^}~BS|>@x3|B7TQs$7k>z#% z>4ArSb-q6gxZ?_-B3kgyNV~c5XL%lnj(38$f{b600h9;|{?|nvC|{SF zAQXbm5t+gsf7(1;`lBe{TU%Q{Pn};CJ3|my=8*Ab@Au>O;q*ny;FH7ALOv=h0~V%Y zh9}kGRB`-ulRgs@Q#Jtii$wSJ_y5Te4@R4R5GhU6m?}NEfB=&@S=fUI6d^-E`7T@h z(qPkm8B|ij(sBPo(B4De-)nY6h8Ry`7*aAyuwVjn&n0ATfVzakHO<&-OXQ&CM;{>wH$h+QuQ>Z8N2} zx7QZDEo%S|_`+=F!PQvEUqdP2-%`=i)}|oVal{92DEr;3{t5{s>fq_Zz+H{%L0PqYziptAPz#wM9^JLUp zkL&Bi^M@CJNO>{34AlE~0cel1`_3%Jnx@o0e(XEnpC=V|cVw-vbpl^ir1&XP`J(NO z6ki_>#yzNqEAQ=IL_G2!l53m;yJlvqjl)xTZ8G`yYbQql(CXp0yq#Uub@Iu$C;^Uc3%z} zlep_kpq7|R2bO?`m-go~Dz#9Be%CZJ^OX1x+KhFMS-~^clCp_SFgHG+KZ)jvR3Wk!SfXqI!(Bz;1W=ON3 zFYBDw)lwZd25X?3K-9p~;&RCIP}@>~X+Ty+<`rlry96FJ05~6l8z~v+ETERN)qS8% zn;|h8N#}PM0oIp25fM>Q7+51r0o3+MpuOmMsna|K%0@DfhOlZDPOx+{Ta!#W|F^NG zQwEJSuwP&+Z`FI>x+6G!Kec-{U3)t@)ioiOJQP61jObZ;m89dGGFxY%u}rQv46GFv zzka=zT0f;_~hZx*2dDh-?7^nF!aH!6%bB;^=F(d?Wl@=|%^wCyJ_?nj{J5 z9G|LtPq%;f^bQQ9A)%lp``qs79c%^RQksJ!@Ql&}Dct;rttaxHo~=Nz672>WVU&f{ zEA9<#ld<$2k$TlaMHBG;O@N}u5i8yM+~M5@+w1vz2h4$70NO54(FE$90(iHbK!(VS zVk1Ujqk;T<6e!+d1SE diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index e8c9f069..ddd74ab4 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -55,7 +55,6 @@ def _optimize( self, X: np.ndarray, y: np.ndarray, - initial_rule: Rule, random_state: RandomState ): # Bind dataset for the IG objective @@ -66,7 +65,7 @@ def _optimize( self._infogain_obj = lambda r, X_ref=X, y_ref=y, H_y=self._H_y: -self._information_gain(r.match(X_ref), y_ref, H_y) self._infogain_label = "-IG" - return super()._optimize(X, y, initial_rule, random_state) + return super()._optimize(X, y, random_state) # ──────────────────────────────────────────────────────────────────── From bf6d974e03fbdb78ba8e1eb8df18fa6a917ae7b2 Mon Sep 17 00:00:00 2001 From: vonproda Date: Sun, 28 Sep 2025 19:18:24 +0200 Subject: [PATCH 17/31] add warmup suprb --- examples/example_1.py | 5 +- examples/example_1_nsga2_novelty.py | 13 +- examples/result.png | Bin 37510 -> 50167 bytes suprb/__init__.py | 1 + suprb/warmup_suprb.py | 194 ++++++++++++++++++++++++++++ 5 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 suprb/warmup_suprb.py diff --git a/examples/example_1.py b/examples/example_1.py index b87b5f5c..98e894e9 100644 --- a/examples/example_1.py +++ b/examples/example_1.py @@ -5,7 +5,7 @@ from sklearn.preprocessing import StandardScaler, MinMaxScaler from sklearn.model_selection import cross_validate, train_test_split -from suprb import SupRB +from suprb import SupRB, WarmupSupRB from suprb.utils import check_random_state from suprb.optimizer.rule.es import ES1xLambda from suprb.optimizer.solution.ga import GeneticAlgorithm @@ -49,7 +49,7 @@ def create_plot(scores): X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) - model = SupRB(rule_discovery=ES1xLambda(), solution_composition=GeneticAlgorithm()) + model = WarmupSupRB(rule_discovery=ES1xLambda(), solution_composition=GeneticAlgorithm()) scores = cross_validate( model, @@ -60,7 +60,6 @@ def create_plot(scores): verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, - fit_params={"cleanup": True}, ) create_plot(scores) diff --git a/examples/example_1_nsga2_novelty.py b/examples/example_1_nsga2_novelty.py index b6ae97c2..8f8545d3 100644 --- a/examples/example_1_nsga2_novelty.py +++ b/examples/example_1_nsga2_novelty.py @@ -16,7 +16,7 @@ from sklearn.linear_model import Ridge from sklearn.utils import Bunch, shuffle -from suprb import rule, SupRB +from suprb import rule, SupRB, WarmupSupRB from suprb.logging.combination import CombinedLogger from suprb.logging.default import DefaultLogger from suprb.logging.stdout import StdoutLogger @@ -65,7 +65,7 @@ def create_plot(scores): X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) - model = SupRB( + model = WarmupSupRB( rule_discovery=NSGA2Novelty_G_P( n_iter=16, mu=16, @@ -92,7 +92,14 @@ def create_plot(scores): max_restarts=4, keep_archive_across_restarts=False, ), - solution_composition=GeneticAlgorithm() + solution_composition=GeneticAlgorithm(), + verbose=2, + warmup_strategy="auto", + warmup_rd_steps=0, # fixed + warmup_max_steps=4, # auto + warmup_pool_target=None, # auto + warmup_patience=3, # auto + warmup_delta=1, # auto ) scores = cross_validate( diff --git a/examples/result.png b/examples/result.png index 0cffb9af398927fb0bf8ac2990a1210a3a4810da..09c52bcd4fe50c177210d4f7a969408bb6a13830 100644 GIT binary patch literal 50167 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�La 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

Bp|yPDo;-S{P+#7DiH;dT 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 literal 37510 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 A%>V!Z diff --git a/suprb/__init__.py b/suprb/__init__.py index b0b97110..d6ec1711 100644 --- a/suprb/__init__.py +++ b/suprb/__init__.py @@ -1,3 +1,4 @@ from .suprb import SupRB from .rule import Rule from .solution import Solution +from .warmup_suprb import WarmupSupRB diff --git a/suprb/warmup_suprb.py b/suprb/warmup_suprb.py new file mode 100644 index 00000000..cb9296f2 --- /dev/null +++ b/suprb/warmup_suprb.py @@ -0,0 +1,194 @@ +import numpy as np +from sklearn.utils import check_X_y +from sklearn.utils.validation import check_array + +from . import SupRB +from .solution import Solution +from .solution.mixing_model import ErrorExperienceHeuristic +from .solution.fitness import PseudoBIC +from .optimizer.rule.es import ES1xLambda +from .optimizer.solution.ga import GeneticAlgorithm +from .rule.matching import OrderedBound +from .logging import DefaultLogger +from .utils import check_random_state + + +class WarmupSupRB(SupRB): + """ + SupRB variant that performs several Rule-Discovery-only warm-up cycles + before the first Solution Composition. + """ + + def __init__( + self, + rule_discovery=None, + solution_composition=None, + matching_type=None, + n_iter=32, + n_initial_rules=0, + n_rules=4, + random_state=None, + verbose=1, + logger=None, + n_jobs=1, + early_stopping_patience=-1, + early_stopping_delta=0, + # Warmup params + warmup_strategy="fixed", + warmup_rd_steps=0, # fixed + warmup_max_steps=16, # auto + warmup_pool_target=None, # auto + warmup_patience=3, # auto + warmup_delta=1, # auto + ): + super().__init__( + rule_discovery=rule_discovery, + solution_composition=solution_composition, + matching_type=matching_type, + n_iter=n_iter, + n_initial_rules=n_initial_rules, + n_rules=n_rules, + random_state=random_state, + verbose=verbose, + logger=logger, + n_jobs=n_jobs, + early_stopping_patience=early_stopping_patience, + early_stopping_delta=early_stopping_delta, + ) + self.warmup_strategy = warmup_strategy + self.warmup_rd_steps = warmup_rd_steps + self.warmup_max_steps = warmup_max_steps + self.warmup_pool_target = warmup_pool_target + self.warmup_patience = warmup_patience + self.warmup_delta = warmup_delta + + + def fit(self, X, y, cleanup=False): + self.early_stopping_counter_ = 0 + self.previous_fitness_ = 0 + self.is_error_ = False + + self.elitist_ = Solution([0, 0, 0], [0, 0, 0], ErrorExperienceHeuristic(), PseudoBIC()) + self.elitist_.fitness_ = 0 + self.elitist_.error_ = 99999 + self.elitist_.complexity_ = 99999 + + X, y = check_X_y(X, y, dtype="float64", y_numeric=True) + y = check_array(y, ensure_2d=False, dtype="float64") + self.n_features_in_ = X.shape[1] + + self.random_state_ = check_random_state(self.random_state) + total_pairs = (self.warmup_max_steps + self.n_iter) * 2 + seeds = np.random.SeedSequence(self.random_state).spawn(total_pairs) + self.rule_discovery_seeds_ = seeds[::2] + self.solution_composition_seeds_ = seeds[1::2] + + self.pool_ = [] + self._validate_rule_discovery(default=ES1xLambda()) + self._validate_solution_composition(default=GeneticAlgorithm()) + self._validate_matching_type(default=OrderedBound(np.array([]))) + self._validate_logger(default=DefaultLogger()) + self._propagate_component_parameters() + self._init_bounds(X) + self._init_matching_type() + + self.solution_composition_.pool_ = self.pool_ + self.rule_discovery_.pool_ = self.pool_ + + self.solution_composition_.init.fitness.max_genome_length_ = ( + self.n_rules * (self.n_iter + self.warmup_max_steps) + self.n_initial_rules + ) + + self.logger_.log_init(X, y, self) + + if self.n_initial_rules > 0: + if self._catch_errors(self._discover_rules, X, y, self.n_initial_rules): + return self + + # Warmup + warmup_done = 0 + patience_ctr = 0 + self.step_ = 0 + + if self.warmup_strategy not in ("fixed", "auto"): + raise ValueError("warmup_strategy must be 'fixed' or 'auto'.") + + def one_rd_cycle(): + before = len(self.pool_) + if self._catch_errors(self._discover_rules, X, y, self.n_rules): + return True, 0 + after = len(self.pool_) + growth = after - before + if self.verbose >= 2: + print(f"[Warm-up RD] Added {growth} rules (pool={after})") + return False, growth + + if self.warmup_strategy == "fixed": + target = max(0, int(self.warmup_rd_steps)) + for _ in range(target): + err, _growth = one_rd_cycle() + if err: + return self + warmup_done += 1 + self.step_ += 1 + else: # auto + for _ in range(max(0, int(self.warmup_max_steps))): + err, growth = one_rd_cycle() + if err: + return self + warmup_done += 1 + self.step_ += 1 + + if self.warmup_pool_target is not None and len(self.pool_) >= int(self.warmup_pool_target): + break + if growth < int(self.warmup_delta): + patience_ctr += 1 + if patience_ctr >= int(self.warmup_patience): + break + else: + patience_ctr = 0 + + self.solution_composition_.init.fitness.max_genome_length_ = ( + self.n_rules * (self.n_iter + warmup_done) + self.n_initial_rules + ) + + # Main loop + end_step = self.step_ + self.n_iter + while self.step_ < end_step: + if self._catch_errors(self._discover_rules, X, y, self.n_rules): + return self + if self._catch_errors(self._compose_solution, X, y, False): + return self + + self.logger_.log_iteration(X, y, self, iteration=self.step_) + if self.check_early_stopping(): + break + + self.previous_fitness_ = self.solution_composition_.elitist().fitness_ + self.step_ += 1 + + self.elitist_ = self.solution_composition_.elitist().clone() + self.is_fitted_ = True + self.logger_.log_final(X, y, self) + + if cleanup: + self._cleanup() + + return self + + def _discover_rules(self, X, y, n_rules): + self._log_to_stdout(f"Generating {n_rules} rules", priority=4) + + elit = None + try: + elit = self.solution_composition_.elitist() + except Exception: + pass + if elit is None: + elit = self.elitist_ + + self.rule_discovery_.elitist_ = elit + self.rule_discovery_.random_state = self.rule_discovery_seeds_[self.step_] + new_rules = self.rule_discovery_.optimize(X, y, n_rules=n_rules) + self.pool_.extend(new_rules) + From 88afcf931116659f3dd3e83263203eb4ee52ce90 Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 8 Oct 2025 13:32:56 +0200 Subject: [PATCH 18/31] fix n_intial_rules --- examples/example_1_nsga2_infogain.py | 5 +++-- examples/result.png | Bin 50167 -> 47125 bytes suprb/optimizer/rule/nsga2/nsga2.py | 2 +- suprb/suprb.py | 12 +++++++++++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/examples/example_1_nsga2_infogain.py b/examples/example_1_nsga2_infogain.py index f1d045be..a4fe832a 100644 --- a/examples/example_1_nsga2_infogain.py +++ b/examples/example_1_nsga2_infogain.py @@ -67,7 +67,7 @@ def create_plot(scores): model = SupRB( rule_discovery=NSGA2InfoGain( - n_iter=16, + n_iter=20, mu=16, lmbda=64, origin_generation=origin.SquaredError(), @@ -83,7 +83,8 @@ def create_plot(scores): fitness_objs=[lambda r: r.error_], fitness_objs_labels=["Error"], # infogain objective is added internally ), - solution_composition=GeneticAlgorithm() + solution_composition=GeneticAlgorithm(), + n_initial_rules=4, ) scores = cross_validate( diff --git a/examples/result.png b/examples/result.png index 09c52bcd4fe50c177210d4f7a969408bb6a13830..e0f5faa27e87d70dc551e25df0897baa20367d30 100644 GIT binary patch literal 47125 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�La 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

Bp|yPDo;-S{P+#7DiH;dT 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 diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index e4d3e26e..ecb310d4 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -112,7 +112,7 @@ def _optimize( population_combined = population + children pareto_fronts = self._fast_nondominated_sort(population_combined) - population = self._build_next_population(pareto_fronts) + population = self._build_next_population(pareto_fronts) #assigns crowding distance pareto_front = pareto_fronts[0] if pareto_fronts else [] if profiler: diff --git a/suprb/suprb.py b/suprb/suprb.py index c6db2ebd..d528825a 100644 --- a/suprb/suprb.py +++ b/suprb/suprb.py @@ -186,6 +186,7 @@ def fit(self, X: np.ndarray, y: np.ndarray, cleanup=False): if self.n_initial_rules > 0: if self._catch_errors(self._discover_rules, X, y, self.n_initial_rules): return self + self._log_to_stdout(f"{len(self.pool_)} initial rules discovered before first step.") # Main loop for self.step_ in range(self.n_iter): @@ -244,9 +245,18 @@ def _discover_rules(self, X: np.ndarray, y: np.ndarray, n_rules: int): self._log_to_stdout(f"Generating {n_rules} rules", priority=4) + # Update the current elitist - self.rule_discovery_.elitist_ = self.solution_composition_.elitist() + # try catch block needed for n_initial_rules as elitist is None Type without it + elit = None + try: + elit = self.solution_composition_.elitist() + except AttributeError: + pass + if elit is None: + elit = self.elitist_ #Initially dummy elitist: Solution([0, 0, 0], [0, 0, 0], ErrorExperienceHeuristic(), PseudoBIC()) + self.rule_discovery_.elitist_ = elit # Update the random state self.rule_discovery_.random_state = self.rule_discovery_seeds_[self.step_] From c002146a2a21d73e8bedd0336cb507be4913fa11 Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 8 Oct 2025 13:33:55 +0200 Subject: [PATCH 19/31] fix n_intial_rules --- suprb/warmup_suprb.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/suprb/warmup_suprb.py b/suprb/warmup_suprb.py index cb9296f2..008f6774 100644 --- a/suprb/warmup_suprb.py +++ b/suprb/warmup_suprb.py @@ -17,6 +17,8 @@ class WarmupSupRB(SupRB): """ SupRB variant that performs several Rule-Discovery-only warm-up cycles before the first Solution Composition. + + DEPRECATED. Functionality is already implemented in SupRB via n_initial_rules. """ def __init__( From 549281c2318ec1578f751bd381d9afc003da2a62 Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 8 Oct 2025 15:06:24 +0200 Subject: [PATCH 20/31] clone rules in score_novelty --- examples/example_1_nsga2_novelty.py | 18 +-- examples/result.png | Bin 47125 -> 49462 bytes .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 117 ++++++++++++------ 3 files changed, 88 insertions(+), 47 deletions(-) diff --git a/examples/example_1_nsga2_novelty.py b/examples/example_1_nsga2_novelty.py index 8f8545d3..5d40116f 100644 --- a/examples/example_1_nsga2_novelty.py +++ b/examples/example_1_nsga2_novelty.py @@ -65,7 +65,7 @@ def create_plot(scores): X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=random_state) - model = WarmupSupRB( + model = SupRB( rule_discovery=NSGA2Novelty_G_P( n_iter=16, mu=16, @@ -86,20 +86,20 @@ def create_plot(scores): k_neighbor=15, # novelty_search_type=MinimalCriteria(min_examples_matched=15) # <- tuned #TODO: Leads to warnings in crowding distance calculation. ), - novelty_mode="P", + novelty_mode="G", profile=False, min_experience=2, # Rules that match only one sample are considered trivial, so min_experience >= 2 max_restarts=4, keep_archive_across_restarts=False, ), solution_composition=GeneticAlgorithm(), - verbose=2, - warmup_strategy="auto", - warmup_rd_steps=0, # fixed - warmup_max_steps=4, # auto - warmup_pool_target=None, # auto - warmup_patience=3, # auto - warmup_delta=1, # auto + # verbose=2, + # warmup_strategy="auto", + # warmup_rd_steps=0, # fixed + # warmup_max_steps=4, # auto + # warmup_pool_target=None, # auto + # warmup_patience=3, # auto + # warmup_delta=1, # auto ) scores = cross_validate( diff --git a/examples/result.png b/examples/result.png index e0f5faa27e87d70dc551e25df0897baa20367d30..e03a36e3dd053565358becf83a9a869fe1f6f4fa 100644 GIT binary patch literal 49462 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 b@FP6p49jb42b)3&_>p<1AW None: + # #TODO: Redo the pseudocode in paper + # if not rules: + # return + # + # to_score = list(rules) if force else [r for r in rules if not hasattr(r, "novelty_score_")] + # if not to_score: + # return + # + # if self.novelty_mode == "G": + # ref = [] + # seen = set() + # + # def _extend_unique(src): + # for r in src: + # rid = id(r) + # if rid not in seen: + # r_clone = copy.deepcopy(r) + # ref.append(r_clone) + # seen.add(id(r_clone)) + # + # _extend_unique(self.pool_) + # _extend_unique(self.local_pool_) + # + # if cohort and self.last_front_: + # _extend_unique(self.last_front_) + # elif cohort: + # _extend_unique(cohort) + # else: # "P" — use only the current cohort (or the given rules) + # ref = list(cohort) if cohort else list(rules) + # + # ref = self._cap_list(ref) # Cap archive size + # + # self.novelty_calc.archive.archive = ref + # _ = self.novelty_calc(to_score) + # + # if self.novelty_mode == "G": + # seen_local = set(map(id, self.local_pool_)) + # self.local_pool_.extend([r for r in to_score if id(r) not in seen_local]) + + def _score_novelty(self, rules: List[Rule], cohort: Optional[List[Rule]] = None, force: bool = False, ) -> None: - #TODO: Redo the pseudocode in paper if not rules: return to_score = list(rules) if force else [r for r in rules if not hasattr(r, "novelty_score_")] if not to_score: return - if self.novelty_mode == "G": - ref = [] - seen = set() - - def _extend_unique(src): - for r in src: - rid = id(r) - if rid not in seen: - ref.append(r) - seen.add(rid) - - _extend_unique(self.pool_) - _extend_unique(self._local_pool) - - if cohort and self._last_front: - _extend_unique(self._last_front) - elif cohort: - _extend_unique(cohort) - else: # "P" — use only the current cohort (or the given rules) + for r in to_score: + rid = id(r) + if rid not in self._archive_seen_ids: + self.local_pool_.append(copy.deepcopy(r)) + self._archive_seen_ids.add(rid) + + ref = list(self.local_pool_) + + if cohort and self.last_front_: + extra = self.last_front_ + else: + extra = cohort + + if extra: + EXTRA_MAX = 256 + extra_slice = extra[-EXTRA_MAX:] if len(extra) > EXTRA_MAX else extra + ref.extend(copy.deepcopy(extra_slice)) + #novelty_mode = "P" + else: ref = list(cohort) if cohort else list(rules) - ref = self._cap_list(ref) # Cap archive size - + ref = self._cap_list(ref) self.novelty_calc.archive.archive = ref _ = self.novelty_calc(to_score) - if self.novelty_mode == "G": - seen_local = set(map(id, self._local_pool)) - self._local_pool.extend([r for r in to_score if id(r) not in seen_local]) # ──────────────────────────────────────────────────────────────── # Helpers for restart logic @@ -155,6 +194,7 @@ def _unique_extend(self, base: List[Rule], new_rules: List[Rule]) -> None: seen.add(id(r)) + # ──────────────────────────────────────────────────────────────── # One full NSGA-II run: returns a Pareto front # ──────────────────────────────────────────────────────────────── @@ -167,8 +207,9 @@ def _run_once( ) -> Optional[List[Rule]]: if clear_pool: - self._local_pool.clear() - self._last_front = [] + self.local_pool_.clear() + self._archive_seen_ids.clear() + self.last_front_ = [] origins = self.origin_generation( n_rules=self.mu, @@ -212,7 +253,7 @@ def _run_once( population_combined = population + children pareto_fronts = self._fast_nondominated_sort(population_combined) - self._last_front = pareto_fronts[0] + self.last_front_ = pareto_fronts[0] population = self._build_next_population(pareto_fronts) From adfe71c2cc8d759eea0d51b70e61cb125418201e Mon Sep 17 00:00:00 2001 From: vonproda Date: Fri, 10 Oct 2025 16:15:04 +0200 Subject: [PATCH 21/31] add genome to saved elitist json --- suprb/json.py | 1 + 1 file changed, 1 insertion(+) diff --git a/suprb/json.py b/suprb/json.py index e2c7cf9f..8a630dc8 100644 --- a/suprb/json.py +++ b/suprb/json.py @@ -59,6 +59,7 @@ def _save_elitist(suprb, json_config): "complexity_": suprb.elitist_.complexity_, "error_": suprb.elitist_.error_, "fitness_": suprb.elitist_.fitness_, + "genome": np.ones(len(suprb.genome)), } From 12c44348fb75669a73bb0673a6a1649e9d7e543a Mon Sep 17 00:00:00 2001 From: vonproda Date: Sun, 12 Oct 2025 18:06:10 +0200 Subject: [PATCH 22/31] change mutation --- suprb/optimizer/rule/nsga2/nsga2.py | 4 ++-- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index ecb310d4..fc79e958 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -10,7 +10,7 @@ from suprb.utils import RandomState from ..base import MultiRuleDiscovery from ..origin import Matching, SquaredError, RuleOriginGeneration -from ..mutation import RuleMutation, HalfnormIncrease +from ..mutation import RuleMutation, HalfnormIncrease, Normal from ..constraint import CombinedConstraint, MinRange, Clip from ..acceptance import Variance from .. import RuleAcceptance, RuleConstraint @@ -32,7 +32,7 @@ def __init__( lmbda: int = 100, origin_generation: RuleOriginGeneration = SquaredError(), init: RuleInit = MeanInit(), - mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + mutation: RuleMutation = Normal(sigma=1.22), constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), acceptance: RuleAcceptance = Variance(), random_state: int = None, diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 4b0cc516..b554bba9 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -18,7 +18,7 @@ from suprb.utils import RandomState from .nsga2_helpers import visualize_pareto_front from ..origin import SquaredError, RuleOriginGeneration -from ..mutation import RuleMutation, HalfnormIncrease +from ..mutation import RuleMutation, HalfnormIncrease, Normal from ..constraint import CombinedConstraint, MinRange, Clip from ..acceptance import Variance from .. import RuleAcceptance, RuleConstraint @@ -42,7 +42,7 @@ def __init__( lmbda: int = 100, origin_generation: RuleOriginGeneration = SquaredError(), init: RuleInit = MeanInit(), - mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + mutation: RuleMutation = Normal(sigma=1.22), constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), acceptance: RuleAcceptance = Variance(), random_state: int = None, From 0bcb4de965f48f5b04302604ab4d4a38bfe21b43 Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 13 Oct 2025 08:42:38 +0200 Subject: [PATCH 23/31] fix json genome --- suprb/json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suprb/json.py b/suprb/json.py index 8a630dc8..239497a6 100644 --- a/suprb/json.py +++ b/suprb/json.py @@ -59,7 +59,7 @@ def _save_elitist(suprb, json_config): "complexity_": suprb.elitist_.complexity_, "error_": suprb.elitist_.error_, "fitness_": suprb.elitist_.fitness_, - "genome": np.ones(len(suprb.genome)), + "genome_" : np.ones(len(suprb.pool_)) } From 09681c7266729eb048cf8b2150c7f8a5df56bc9f Mon Sep 17 00:00:00 2001 From: vonproda Date: Tue, 14 Oct 2025 11:07:29 +0200 Subject: [PATCH 24/31] refactor --- suprb/optimizer/rule/nsga2/__init__.py | 1 + suprb/optimizer/rule/nsga2/nsga2.py | 2 +- suprb/optimizer/rule/nsga2/nsga2_helpers.py | 41 +++++--- .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 52 +--------- suprb/optimizer/rule/nsga2/nsga2_var_reduc.py | 94 +++++++++++++++++++ suprb/optimizer/rule/nsga2/nsga2ig.py | 14 +-- 6 files changed, 132 insertions(+), 72 deletions(-) create mode 100644 suprb/optimizer/rule/nsga2/nsga2_var_reduc.py diff --git a/suprb/optimizer/rule/nsga2/__init__.py b/suprb/optimizer/rule/nsga2/__init__.py index d7488ef8..2ee9f377 100644 --- a/suprb/optimizer/rule/nsga2/__init__.py +++ b/suprb/optimizer/rule/nsga2/__init__.py @@ -3,5 +3,6 @@ from .nsga2_global_novelty import NSGA2GlobalNovelty from .nsga2_novelty_G_P import NSGA2Novelty_G_P from .nsga2ig import NSGA2InfoGain +from .nsga2_var_reduc import NSGA2VarianceReduction #Do not know if needed from .nsga2_helpers import visualize_pareto_front \ No newline at end of file diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index fc79e958..c83981ed 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -120,7 +120,7 @@ def _optimize( stats = pstats.Stats(profiler).sort_stats("cumtime") stats.print_stats(20) - #visualize_pareto_front(self, pareto_front) #TODO: Fix this function + visualize_pareto_front(self, pareto_front) return pareto_front # ──────────────────────────────────────────────────────────────────── diff --git a/suprb/optimizer/rule/nsga2/nsga2_helpers.py b/suprb/optimizer/rule/nsga2/nsga2_helpers.py index 56004eac..087f1898 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_helpers.py +++ b/suprb/optimizer/rule/nsga2/nsga2_helpers.py @@ -1,23 +1,34 @@ +import numpy as np +import matplotlib.pyplot as plt from typing import List -import numpy as np -from matplotlib import pyplot as plt +def visualize_pareto_front(self, pareto_front: List, save_path: str = "Paretofront.png") -> None: + if not pareto_front: + print("No Pareto front provided for visualization.") + return + + objs = self._fitness_objs_runtime() + labels = self._fitness_labels_runtime() -#deprecated -#TODO: Rework to be sklearn conform. Extra objectives are currently added during runtime to be conform with sklearn standards. Need to fix this function. + if len(objs) != 2: + print(f"Expected exactly 2 objectives, found {len(objs)}. Skipping plot.") + return -def visualize_pareto_front( - self, - pareto_front, -): - x = [self.fitness_objs[0](r) for r in pareto_front] - y = [self.fitness_objs[1](r) for r in pareto_front] + obj_matrix = np.array([[objs[0](r), objs[1](r)] for r in pareto_front]) + + plt.rcParams["font.family"] = "serif" + plt.rcParams["font.serif"] = ["Times New Roman", "Times", "DejaVu Serif"] + plt.rcParams["mathtext.fontset"] = "cm" # for consistent math font plt.figure(figsize=(6, 4)) - plt.scatter(x, y, s=30, edgecolors='k') - plt.xlabel(self.fitness_objs_labels[0]) - plt.ylabel(self.fitness_objs_labels[1]) - plt.title('Pareto Optimal Set (Front 0)') + plt.scatter(obj_matrix[:, 0], obj_matrix[:, 1], s=40, c="royalblue", edgecolors="black", alpha=0.8) + plt.xlabel(labels[0], fontsize=11) + plt.ylabel(labels[1], fontsize=11) + plt.title("Pareto Front", fontsize=12, pad=10) + plt.grid(True, linestyle="--", alpha=0.5) plt.tight_layout() - plt.savefig("Paretofront.png", dpi=150) + + plt.savefig(save_path, dpi=300, bbox_inches="tight") plt.close() + + print(f"Pareto front visualization saved to '{save_path}'") diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index b554bba9..6f8447c5 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -85,7 +85,6 @@ def __init__( self._novelty_obj = lambda r: -getattr(r, "novelty_score_", np.inf) self._novelty_label = "-Novelty" - self.last_front_: List[Rule] = [] self.archive_maxlen = 1000 @@ -96,51 +95,6 @@ def __init__( # ──────────────────────────────────────────────────────────────── # Novelty scoring # ──────────────────────────────────────────────────────────────── - # def _score_novelty( - # self, - # rules: List[Rule], - # cohort: Optional[List[Rule]] = None, - # force: bool = False, - # ) -> None: - # #TODO: Redo the pseudocode in paper - # if not rules: - # return - # - # to_score = list(rules) if force else [r for r in rules if not hasattr(r, "novelty_score_")] - # if not to_score: - # return - # - # if self.novelty_mode == "G": - # ref = [] - # seen = set() - # - # def _extend_unique(src): - # for r in src: - # rid = id(r) - # if rid not in seen: - # r_clone = copy.deepcopy(r) - # ref.append(r_clone) - # seen.add(id(r_clone)) - # - # _extend_unique(self.pool_) - # _extend_unique(self.local_pool_) - # - # if cohort and self.last_front_: - # _extend_unique(self.last_front_) - # elif cohort: - # _extend_unique(cohort) - # else: # "P" — use only the current cohort (or the given rules) - # ref = list(cohort) if cohort else list(rules) - # - # ref = self._cap_list(ref) # Cap archive size - # - # self.novelty_calc.archive.archive = ref - # _ = self.novelty_calc(to_score) - # - # if self.novelty_mode == "G": - # seen_local = set(map(id, self.local_pool_)) - # self.local_pool_.extend([r for r in to_score if id(r) not in seen_local]) - def _score_novelty(self, rules: List[Rule], cohort: Optional[List[Rule]] = None, @@ -308,9 +262,9 @@ def _optimize( if useful_rules: useful_rules = useful_rules[: self.mu] - # to_visualize = useful_rules if useful_rules else (pareto_front or []) - # if to_visualize: - # visualize_pareto_front(self, to_visualize) #TODO: Fix function + to_visualize = useful_rules if useful_rules else (pareto_front or []) + if to_visualize: + visualize_pareto_front(self, to_visualize) print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) diff --git a/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py new file mode 100644 index 00000000..252bd919 --- /dev/null +++ b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py @@ -0,0 +1,94 @@ +import numpy as np +from typing import Optional, List, Callable + +from suprb.rule import Rule, RuleInit +from suprb.utils import RandomState + +from suprb.rule.initialization import MeanInit +from ..origin import SquaredError, RuleOriginGeneration +from ..mutation import RuleMutation, HalfnormIncrease +from ..constraint import CombinedConstraint, MinRange, Clip +from ..acceptance import Variance +from .. import RuleAcceptance, RuleConstraint + +from .nsga2 import NSGA2 + + +class NSGA2VarianceReduction(NSGA2): + """ + NSGA-II variant using rule error and variance reduction (regression-style information gain) + as optimization objectives. + """ + + def __init__( + self, + n_iter: int = 32, + mu: int = 50, + lmbda: int = 100, + origin_generation: RuleOriginGeneration = SquaredError(), + init: RuleInit = MeanInit(), + mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), + acceptance: RuleAcceptance = Variance(), + random_state: int = None, + n_jobs: int = 1, + fitness_objs: Optional[List[Callable[[Rule], float]]] = None, + fitness_objs_labels: Optional[List[str]] = None, + profile: bool = False, + ): + super().__init__( + n_iter=n_iter, + mu=mu, + lmbda=lmbda, + origin_generation=origin_generation, + init=init, + mutation=mutation, + constraint=constraint, + acceptance=acceptance, + random_state=random_state, + n_jobs=n_jobs, + fitness_objs=fitness_objs, + fitness_objs_labels=fitness_objs_labels, + profile=profile, + ) + + # ──────────────────────────────────────────────────────────────── + # Main optimization entry + # ──────────────────────────────────────────────────────────────── + def _optimize(self, X: np.ndarray, y: np.ndarray, random_state: RandomState): + self._var_y = np.var(y) + + self._varred_obj = lambda r, X_ref=X, y_ref=y, var_y=self._var_y: -self._variance_reduction( + r.match(X_ref), y_ref, var_y + ) + self._varred_label = "-VarianceReduction" + + return super()._optimize(X, y, random_state) + + # ──────────────────────────────────────────────────────────────── + # Variance Reduction Helpers + # ──────────────────────────────────────────────────────────────── + @staticmethod + def _variance_reduction(mask: np.ndarray, y: np.ndarray, var_y: float) -> float: + """ + Variance-based analogue to information gain for regression. + IG_var = Var(y) - [p * Var(y[mask]) + (1 - p) * Var(y[~mask])] + """ + if mask.size == 0: + return 0.0 + p = float(mask.mean()) + if p == 0.0 or p == 1.0: + return 0.0 + + var_match = np.var(y[mask]) if np.any(mask) else 0.0 + var_not_match = np.var(y[~mask]) if np.any(~mask) else 0.0 + return var_y - (p * var_match + (1.0 - p) * var_not_match) + + # ──────────────────────────────────────────────────────────────── + # Helper functions + # ──────────────────────────────────────────────────────────────── + def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + return list(self.fitness_objs) + [self._varred_obj] + + def _fitness_labels_runtime(self) -> List[str]: + return list(self.fitness_objs_labels) + [self._varred_label] diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index ddd74ab4..af1f1f19 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -91,11 +91,11 @@ def _information_gain(mask: np.ndarray, y: np.ndarray, H_y: float) -> float: H_nm = NSGA2InfoGain._entropy(y[~mask]) return H_y - (p * H_m + (1.0 - p) * H_nm) -# ──────────────────────────────────────────────────────────────── -# Helper functions -# ──────────────────────────────────────────────────────────────── -def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: - return list(self.fitness_objs) + [self._infogain_obj] + # ──────────────────────────────────────────────────────────────── + # Helper functions + # ──────────────────────────────────────────────────────────────── + def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + return list(self.fitness_objs) + [self._infogain_obj] -def _fitness_labels_runtime(self) -> List[str]: - return list(self.fitness_objs_labels) + [self._infogain_label] + def _fitness_labels_runtime(self) -> List[str]: + return list(self.fitness_objs_labels) + [self._infogain_label] From 5d6e28551ca666b51fc3aaa84ba687c8d94ecdc4 Mon Sep 17 00:00:00 2001 From: vonproda Date: Sun, 19 Oct 2025 18:22:27 +0200 Subject: [PATCH 25/31] change png to pdf --- suprb/optimizer/rule/nsga2/nsga2_helpers.py | 27 ++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_helpers.py b/suprb/optimizer/rule/nsga2/nsga2_helpers.py index 087f1898..f07fcbfb 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_helpers.py +++ b/suprb/optimizer/rule/nsga2/nsga2_helpers.py @@ -1,8 +1,9 @@ import numpy as np import matplotlib.pyplot as plt from typing import List +from datetime import datetime -def visualize_pareto_front(self, pareto_front: List, save_path: str = "Paretofront.png") -> None: +def visualize_pareto_front(self, pareto_front: List, save_path: str = "Objective_Space_Distribution") -> None: if not pareto_front: print("No Pareto front provided for visualization.") return @@ -14,21 +15,35 @@ def visualize_pareto_front(self, pareto_front: List, save_path: str = "Paretofro print(f"Expected exactly 2 objectives, found {len(objs)}. Skipping plot.") return + # Compute objective matrix obj_matrix = np.array([[objs[0](r), objs[1](r)] for r in pareto_front]) plt.rcParams["font.family"] = "serif" plt.rcParams["font.serif"] = ["Times New Roman", "Times", "DejaVu Serif"] - plt.rcParams["mathtext.fontset"] = "cm" # for consistent math font + plt.rcParams["mathtext.fontset"] = "cm" + plt.rcParams["pdf.fonttype"] = 42 # Keep text as selectable TrueType + plt.rcParams["ps.fonttype"] = 42 + plt.rcParams["svg.fonttype"] = "none" plt.figure(figsize=(6, 4)) - plt.scatter(obj_matrix[:, 0], obj_matrix[:, 1], s=40, c="royalblue", edgecolors="black", alpha=0.8) + plt.scatter( + obj_matrix[:, 0], + obj_matrix[:, 1], + s=40, + c="royalblue", + edgecolors="black", + alpha=0.8 + ) plt.xlabel(labels[0], fontsize=11) plt.ylabel(labels[1], fontsize=11) - plt.title("Pareto Front", fontsize=12, pad=10) + plt.title("Objective Space Distribution", fontsize=12, pad=10) plt.grid(True, linestyle="--", alpha=0.5) plt.tight_layout() - plt.savefig(save_path, dpi=300, bbox_inches="tight") + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + pdf_path = f"{save_path}_{timestamp}.pdf" + + plt.savefig(pdf_path, format="pdf", bbox_inches="tight") plt.close() - print(f"Pareto front visualization saved to '{save_path}'") + print(f"Pareto front visualization saved as PDF: '{pdf_path}'") \ No newline at end of file From 739029dc19ab7c2b7973f76e67ef0d7bb8593f05 Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 22 Oct 2025 15:12:34 +0200 Subject: [PATCH 26/31] finish last reworks --- examples/example_1_nsga2_infogain.py | 2 +- suprb/json.py | 2 +- suprb/optimizer/rule/nsga2/nsga2.py | 2 +- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 8 ++++---- suprb/optimizer/rule/nsga2/nsga2_var_reduc.py | 6 +++--- suprb/optimizer/rule/nsga2/nsga2ig.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/example_1_nsga2_infogain.py b/examples/example_1_nsga2_infogain.py index a4fe832a..d72f2fae 100644 --- a/examples/example_1_nsga2_infogain.py +++ b/examples/example_1_nsga2_infogain.py @@ -67,7 +67,7 @@ def create_plot(scores): model = SupRB( rule_discovery=NSGA2InfoGain( - n_iter=20, + n_iter=16, mu=16, lmbda=64, origin_generation=origin.SquaredError(), diff --git a/suprb/json.py b/suprb/json.py index 239497a6..834f69c0 100644 --- a/suprb/json.py +++ b/suprb/json.py @@ -59,7 +59,7 @@ def _save_elitist(suprb, json_config): "complexity_": suprb.elitist_.complexity_, "error_": suprb.elitist_.error_, "fitness_": suprb.elitist_.fitness_, - "genome_" : np.ones(len(suprb.pool_)) + # "genome_" : np.ones(len(suprb.pool_)) } diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index c83981ed..6d339406 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -10,7 +10,7 @@ from suprb.utils import RandomState from ..base import MultiRuleDiscovery from ..origin import Matching, SquaredError, RuleOriginGeneration -from ..mutation import RuleMutation, HalfnormIncrease, Normal +from ..mutation import RuleMutation, Normal from ..constraint import CombinedConstraint, MinRange, Clip from ..acceptance import Variance from .. import RuleAcceptance, RuleConstraint diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 6f8447c5..8f3f17d1 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -87,7 +87,7 @@ def __init__( self.last_front_: List[Rule] = [] - self.archive_maxlen = 1000 + self.archive_maxlen = 128 self.local_pool_: Deque[Rule] = deque(maxlen=self.archive_maxlen) self._archive_seen_ids: Set[int] = set() @@ -110,7 +110,7 @@ def _score_novelty(self, for r in to_score: rid = id(r) if rid not in self._archive_seen_ids: - self.local_pool_.append(copy.deepcopy(r)) + self.local_pool_.append(copy.copy(r)) self._archive_seen_ids.add(rid) ref = list(self.local_pool_) @@ -123,10 +123,10 @@ def _score_novelty(self, if extra: EXTRA_MAX = 256 extra_slice = extra[-EXTRA_MAX:] if len(extra) > EXTRA_MAX else extra - ref.extend(copy.deepcopy(extra_slice)) + ref.extend(copy.copy(r) for r in extra_slice) #novelty_mode = "P" else: - ref = list(cohort) if cohort else list(rules) + ref = [copy.copy(r) for r in cohort] if cohort else [copy.copy(r) for r in rules] ref = self._cap_list(ref) self.novelty_calc.archive.archive = ref diff --git a/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py index 252bd919..97714509 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py +++ b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py @@ -6,7 +6,7 @@ from suprb.rule.initialization import MeanInit from ..origin import SquaredError, RuleOriginGeneration -from ..mutation import RuleMutation, HalfnormIncrease +from ..mutation import RuleMutation, Normal from ..constraint import CombinedConstraint, MinRange, Clip from ..acceptance import Variance from .. import RuleAcceptance, RuleConstraint @@ -27,7 +27,7 @@ def __init__( lmbda: int = 100, origin_generation: RuleOriginGeneration = SquaredError(), init: RuleInit = MeanInit(), - mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + mutation: RuleMutation = Normal(sigma=1.22), constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), acceptance: RuleAcceptance = Variance(), random_state: int = None, @@ -61,7 +61,7 @@ def _optimize(self, X: np.ndarray, y: np.ndarray, random_state: RandomState): self._varred_obj = lambda r, X_ref=X, y_ref=y, var_y=self._var_y: -self._variance_reduction( r.match(X_ref), y_ref, var_y ) - self._varred_label = "-VarianceReduction" + self._varred_label = "-Variance Reduction" return super()._optimize(X, y, random_state) diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index af1f1f19..d74cb04a 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -6,7 +6,7 @@ from suprb.rule.initialization import MeanInit from ..origin import SquaredError, RuleOriginGeneration -from ..mutation import RuleMutation, HalfnormIncrease +from ..mutation import RuleMutation, Normal from ..constraint import CombinedConstraint, MinRange, Clip from ..acceptance import Variance from .. import RuleAcceptance, RuleConstraint @@ -25,7 +25,7 @@ def __init__( lmbda: int = 100, origin_generation: RuleOriginGeneration = SquaredError(), init: RuleInit = MeanInit(), - mutation: RuleMutation = HalfnormIncrease(sigma=1.22), + mutation: RuleMutation = Normal(sigma=1.22), constraint: RuleConstraint = CombinedConstraint(MinRange(), Clip()), acceptance: RuleAcceptance = Variance(), random_state: int = None, From 4388b5b1b0ffe472dae0a7ed31341df728be403c Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 22 Oct 2025 17:05:59 +0200 Subject: [PATCH 27/31] comment out visualization --- suprb/optimizer/rule/nsga2/nsga2.py | 2 +- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index 6d339406..7160be05 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -120,7 +120,7 @@ def _optimize( stats = pstats.Stats(profiler).sort_stats("cumtime") stats.print_stats(20) - visualize_pareto_front(self, pareto_front) + #visualize_pareto_front(self, pareto_front) return pareto_front # ──────────────────────────────────────────────────────────────────── diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 8f3f17d1..16dd89c8 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -262,9 +262,9 @@ def _optimize( if useful_rules: useful_rules = useful_rules[: self.mu] - to_visualize = useful_rules if useful_rules else (pareto_front or []) - if to_visualize: - visualize_pareto_front(self, to_visualize) + # to_visualize = useful_rules if useful_rules else (pareto_front or []) + # if to_visualize: + # visualize_pareto_front(self, to_visualize) print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) From 71c537ef55de6f586b367de3b7a98f606a95904e Mon Sep 17 00:00:00 2001 From: vonproda Date: Wed, 29 Oct 2025 18:13:27 +0100 Subject: [PATCH 28/31] increase archive len --- suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 16dd89c8..8f11e38a 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -87,7 +87,7 @@ def __init__( self.last_front_: List[Rule] = [] - self.archive_maxlen = 128 + self.archive_maxlen = 256 self.local_pool_: Deque[Rule] = deque(maxlen=self.archive_maxlen) self._archive_seen_ids: Set[int] = set() From 55233f45c1bf41ad68687073774ef871235f1c7b Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 17 Nov 2025 16:28:14 +0100 Subject: [PATCH 29/31] modify example 4 so it runs --- examples/example_4.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example_4.py b/examples/example_4.py index b0187744..5839e4b7 100644 --- a/examples/example_4.py +++ b/examples/example_4.py @@ -50,8 +50,8 @@ elitist_ratio=0.2, random_state=random_state, n_jobs=1, - mutation=suprb.optimizer.solution.ga.mutation.BitFlips(mutation_rate=0.1), - crossover=suprb.optimizer.solution.ga.crossover.NPoint(crossover_rate=0.9, n=2), + # mutation=suprb.optimizer.solution.ga.mutation.BitFlips(mutation_rate=0.1), + # crossover=suprb.optimizer.solution.ga.crossover.NPoint(crossover_rate=0.9, n=2), selection=suprb.optimizer.solution.ga.selection.Tournament(k=6), init=suprb.solution.initialization.RandomInit( mixing=suprb.solution.mixing_model.ErrorExperienceHeuristic(), @@ -71,7 +71,7 @@ verbose=10, scoring=["r2", "neg_mean_squared_error"], return_estimator=True, - fit_params={"cleanup": True}, + # fit_params={"cleanup": True}, ) log_scores(scores) From e25bf1d38f8fca9577bc4f6fb9d755c91df932c9 Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 17 Nov 2025 17:42:49 +0100 Subject: [PATCH 30/31] add code comments --- examples/result.png | Bin 49462 -> 0 bytes suprb/optimizer/rule/base.py | 5 +- .../optimizer/rule/ns/novelty_calculation.py | 5 +- suprb/optimizer/rule/nsga2/nsga2.py | 70 +++++++++++++--- .../rule/nsga2/nsga2_global_novelty.py | 2 +- suprb/optimizer/rule/nsga2/nsga2_helpers.py | 6 +- .../optimizer/rule/nsga2/nsga2_novelty_G_P.py | 76 +++++++++++++----- suprb/optimizer/rule/nsga2/nsga2_var_reduc.py | 47 ++++++++--- suprb/optimizer/rule/nsga2/nsga2ig.py | 37 +++++++-- .../rule/nsga2/pymoo/pymoo_mutation.py | 4 + .../optimizer/rule/nsga2/pymoo/pymoo_nsga2.py | 3 +- .../nsga2/pymoo/rule_optimization_problem.py | 8 +- suprb/rule/base.py | 9 ++- 13 files changed, 211 insertions(+), 61 deletions(-) delete mode 100644 examples/result.png diff --git a/examples/result.png b/examples/result.png deleted file mode 100644 index e03a36e3dd053565358becf83a9a869fe1f6f4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49462 zcmeFZV|S!a^e)^jfu^Pti~eeyN; znMJa6PQ7&Yy?4I%`qZYhLvohm4FB_{tDX!^I5A8J=z+pI9NrD_-xV>8$R{aO;s19P zNAmx!{+|wDME`P%$K&o|r>dqVrmUQF?Hmvg z;P0-85(Yz#u?3h%5=J3Kz6D&F9{x$H)oG0Z$q#AIYCeIH&0&AOvEJ@zn8;s?Yrxp^ z(F~-65!phCaS(d2iad=V9!5fgfZ6oBpPtI$Ocam(?)--&@|*n$Ta4pQpa1X(idXMk zCo2YqkPU6E9xS0^hc5+8t0LEdm&h_=6w)Qi7K#aMG+5j%jZqm!`=$%L>&cAy-tX|V z7%vqSG-+w+$EEJ`l$;uI{D+-QJyaLrO8V+*JQRX;k}eXMCUH5uATr5>!^c%a%k3U- z(28eH=Ws&Ift019qVjta^ws=&$(vCr0e=2XezdTNP>{edh{2ip;7IAgfyYx>2n0MW z3-@Gy!~Z>=qx$)D#qEbj$Z}l`W`p!w?-Aty(ui`gE)@vSy^18RJH*JW_K7j23jCWKXC-Iy38DI$?H1p1K{ zL^~oJeCsW=1yei7nqg91GJ)nF7LkY@q^#h>Lr%H=+__~mTrB(FzZJNwBZEQWviS`I z;#~L$UtUaA|DdB0)4^-hEd-k5N}_zDLb!D5el%^zYyKt9`He*5C-wl8&}_cWpZAC0 zeUpwW9{OF;h_G(U5MnVF0v;hhzSPvy{)$}EhyvnaxP34?V!O4%c)___-h)wTZYp6E zT1rmMF@#VcuLC~cN266F@i4dvfCDAY8b9>!uOd@Pkor+V4ho*kpX{(%B|!Vu1dJJg z2QXmdIx3+5k(%ZgLj2A0Oy%UWm>^{CCJB3hdQ@uv?VhTix%ZHyZ{MxCbHS63Mq1+z zHUuTAh+s0En+WUjf94;<9({q4e*~3(0F`fwnWweKgH%@7gU{iRTIe8*BG+SZx->q8 zX+y!Fa1jBLjLpvsj!PzsbxdwQJ0@%T5y#=1I?`#HzyF)mk3}_ zB+_!=QCFRQkAc@e<`YvOMM7-sqmU{JDdc?ox;VlB^>B6<*g&|(6#*Nh5iL&3q2tai z4(sk|iSgd=w|`~CT&hW0x|1o=+|BD$oSMGRB1hZ46!dW@IBMdYX1i#({|N!C!b3pb zb#pk9OemxHxyTz%|) zo_NHC`)>q1jy0mOYgT}))S*N^m=PD_LSBRYWlZcy329itgWE3+cbORfR%?ZX-pd~E z$JGX{0YhF9@t!7;4r#?z_G;k_fmU39;HtZFk{6h$@PD)NAp>+g;RKlvH)X134Ke}p zk0kbK9$QnuuSH6YhI44jG;?sB`Fnl-ZuGv_#~s?D2VOe;*1=n=WM)_=3ByZ-KAv4& zHFIWuxTqM)HVDwh3mt8>VG8K6k~EjX&7>agK%L={ZCGb551M@bdvEF;6`MKPRJ)t< z<(u5W>xi6vqmFW(!|nR-Xe z*cJ;6j3^J7$H-M%Bt9sFxz*g&|LsX)TFID|dsfm&po}o~AAfu9WF`7r8}08i0rjO6 z0omUj_Bv0d+9ZA?Ms+A{U_%vZyw$x1WxD~n8nw(!UNx2VL(y`jCb zjDIzuJ6@t+`YnGpsn$uBAT_p_5PA~`rnN(0(T$dAw??Z8A|Qqfp6tjONb+kFkyCA3 z(a52gCYaKH&*s}-$vU0!?!BQh7=Fxn=z!0~<)J}StHoB6Ydk8>8_BCVC@B>}GmN^) zn~TiZe!HdVKZmdlV!{<1DqZd;b4wKIVJG@saroJueHhuAN+gkZwxP zAFp?zv}y|K=rwN@RshSUe12U;K?{rDV??}TSLDinw8|Tk6*m3f3C9h!WnaD;)6;)1 zRlU7`9whFb(3Hiy&m$GF*i_?1P%&};-F6s7=sh(B`qdFgOFtd>zeJ_E9SdJkruF`7 zXq*4a1=s$j0t-48IA>?UHF8XVF#d zCZ`&Dx^!ArKaN@8ie13?E^@Il_lrs{*UJCR;&k1nkxF1l=S@SNh*!ceZK}g+ygt851U+m?Q_{J-nA1dku#y>4Sb*r zK=Y@(;`e03Y}%?=T457F2|^;Y#Z1^>=(N8CLg7gx*VFTVHcRODdrrY3 zN9wHKs3L<>SSm^=Z%YMDjfIU$zUj4E2k!d^#SF6hwA z2{b)3n10OIMd?iCu65*;=UkIu5D!bA{LgC#-{Lun2}I17#5gA={`K1`Oy$=Fj(IrH z96Av0F%Xic^`@fDqQ{w#qOXag3k6(@{AUe@E)eC?ZFRqeaG(|Ve+TOMeXG53p)|Y^ zRA@NKhntTZE7A1R3H?R)JJ6?zbYkL$UhaH%eYhs>K&B4 zS)6KfGdTcQ^g6?!SW~gvCVK)|u?TuXU|-Ox7uF5m&TPU<$!$N&Cogtb6}r> zxETe>AOfCr@lW5(DV>C4kz-{MaO8WUghQ(BLze-MxH_%#P=(C9ArNZSj1*3cM6%nXL|-`9fZ*-v$y2S0WiOx}BRHKgcRXAPa`A8Z0gjIy>`dxbKOa zPWt5=r8;&!!}~b1ewovcedBZV>)`;B>nooQw}5$Vd!IOip5fhiBzuqNx%$9=Tkzvo z{-S06sM{;3U$F?Lxwk%huP4TzJ{`9bCsh~~Zeoy- zJfER~4uZ(uW-Jk4JrDy5**Adan{VwZar_0ME-Z4{7*?5LxS$nKFei>rTLTs}nP$^G zAlnuQ@VF<+)xi#Gb)e*XLm_d0tMA`_C45pm)zhkMP&Q?j^5%AHCyEqfFz==F0S8~!SG^mz3O|MqAuj%Q`|q#Me9~89pR(T;Zb#lvqeLp(-wIcI0S@Lo(io}| z_>4~cDd?1Ume#f#_ah^N?yF~|!=&4-vW<<%REhcOydN|SD-yfwt#<^l!9Vn1dVR7I zE971KG!_;fND)QpHXZ&!e~SfZxhhCG*uMr20kB77AD47V zbjGLI;{_qU`1}kS6ee`^YDYGtCT!w%4`@JP;GQOuDO=)CF=nF09EOiS@qFk;AHjr= zg3tJV_wuLe--@H1Y$Ta-_e*Qnlkx~MW93c2!i`=o!WLUitR$tQ37K$1M>7mUz7G5~ z7L%ekCE>#TMz!%L;aL8damLfo!Rs}CzJ%ME6Mh&TG7iz5Is9yOyT6te3RVyL{8mgynQk-MAp{95Qt=)8K@on4!LI} zv^30!qs=U*(_=qQxbpWXb#6IrxnugKPV@v!*z;)pKj|6}dSisxP#G?7eD7=F2gG$HuB0wZnrKwzE~)94H%Pp)R9ytFUBL)f z?s=hIXnt`=Dr%3-lROVr+ARKbE2&SS*`;N2*yOtEI6&Gt`1ttnLBHd6&8-OHv>R~i z9sYai&05$ES>c2lnmKaQk+J4A2J60KOmcqXQ{-rP&*R#;dp9|a-F!a-KlNx?yTV)S zN1y0I<^PHjblGAAj_#d+np(UiwPIahgq_i>EM8b7#~vZeTkE|dP=pMCKOI}+RSPeu zTZKob%uL*J=r|=MKwnqtLof1h(&54&LSEG?F^w+p`pqqQ8sO}UqYp&Ek)y~Wjd5m; z=gpkr|5udMu+=p7dsZ+q-Lj?Ve^x|FMuv2}AI3OST6Sn20_G{`Dx)J^c*;b{o8z)v zV5-HM25pZ1<;JJgauzqY4x{HbVml7gLqm_jO6QI9*_nv*<_Byl$n+_?z^8O(5U@SB z%FBc#3M}LVrlC;b>KsKoSw|}KEC`NYb)IPWCx+-z7vcY$*z-lf5G;DIp z^z7faqLV|lfB=OA6=&zce#QBO2t{>wh}82HdM86T-zBjt^>A`p$ZD8&pPx;%XAmK z^XyeP-{%zbBZ4J3I(GyMf69l0iiq^;4toH%Bqh6A(>p}Fft6ps0==2i!hb({AhVz0 zhh=tGp23fAMy&Q7InaMhsE@dQC_k4J3MC$1cPk2BtuN=d(`ElgEf(fIo`NOh#FQxu zL&TG_zNO;UE?>vxQRv#cJ^k$LK8;4tlg?i>!7z3O-aCSH_dJunR?(IxF z`)g8oR*b2GhIUi1J^=Q4+klxhvl6Pj_d*r3i+%=~a@yy&;8L z;LOqcnrfRVJwuanUcM-@#x%^$Pr%`@RE49{#wOlXD1--fFlMVPudpILs9DEyA%;gc z98dJs_A&CgImA9ijwDVZ%{P(9H>~Bc*zp@kPI2ZOeXD~`X(hV&A{e(C2h(#Betf48Bh=Ws@p_2af<^z=WnAiZwl?2W5PvvnZGF5G@Y!7ar z{r7iMG^`agyGplTGanUK;=IK~H4dfav}t*lANrP-&=C>X>&Crfs%s^buI-Lp?LWob z1wH>8%5JedtKYGhz&+LrK$e>*!15)SPSp9+(|VmGlteUn8bbJcuom~TUhmtTK7$!A zz18e>?zE+!%A90%2pix-^WfDtewGIw3Tf%F)Uluc#r2eiXyjYLt8A7wz^rixFVcx8WDo+zn-{hZv{p@fyEBu*TE( zAqbUh%C8Wp<$kab=BYhtFR=9zC9pZ+7O)rf^L??WbE}(bUD>^x}X!)!C z&{3d>6TLHWP+qW+6JZd*W)cu1O^WAFg_kBgny~EPPQn9g&c0ny@O!0>rz{pTLpH;> z>mN(U3E`>U4Wgkdt)mm9wVfH+WoL+;!jWyx?dmVfk;QfznqX4(G=+fIb!0x2<7s$4P7+~7Ohac#e61T+A{WA6vW%4R z@pgp}Shq+gx5h!Yo@%=$hIk6A^;VJus18_WY^tjaW;GkUIl_I=wqreJj$RAWZ)?y* z-~1VBa=x_E-!)8H&2p~UMYM6K#RvyA4%Az!X98_!p*GmtVn3I*4*lAbNgu^4?z;3ZOrE{Ykk3n<9 z=dj<#>*eMRmOcsuCd&^)U>9jgT41qc&@t(A?gZ%DIM${Db%UYj4uW6r-9>gV-S&7D z$dl0O57`azzH|~q+;$6o)se=;4(bG%2zr3Rs+VZ8&Ja%Ou@PClA=Hm4h|M8`+=8`0 z_eys#AC+XJHHRpQtzs~$1_k*WuibDgS_iUq)I4k)K<&qet5Ns9N#JbWzR7W8dP!$2 z4Y~3Z_)H0UO-IJNeV6eEAGfj&+)jY)4yS3vsf0fWwD@K+?27sQylTg?6D+9N-*AJ=x5L=G%8ABqF5tM3mJp#F$LXs4*xhx_^HDC5W?&MfXMX-bZt-qd_oC{KXoFB(gi zHTtmfD0|N^BmN9OpAcO5k3$57ecp&$w7_|W!&T4DxK!k9;OF!U>&3b7&xRKUU@C3}zMNIlx8w2G>rNLJj9QpA4YS$-~(b z)%k+>_1DXRjNz;n&RS}qIv7vRv9#YsNA+x=duHuRjW4ZC4{oh~W10&?hCydWMn#1g zGPl^ZU?~10#Mmn?@ORO<$hNW);hmaGn}yvZ z43yzEs?7X_sa^Cc#@nM%+q!YYljB80n>zeAIEbxYgjzvQ zAuj0I0di8O%L(gZ2m`oEDe%;5;`Z_59Z}pe!L%d>dBg4J?DccdguYWivpn95&w>El zg$rD3Ap`S9mBM`Euxs|Z$&1eeQS$r1Ewt)6?Txb1Od10;v|Lm7IP6@}SMlDV@IHvI z1+}d~GTI~&$tI5KS#qkJ2IGITGb>FzgC?H20YA_8ePT3FLAaq)%#n>)pW{!?=RtOM z7C_p<8F$EMW2{41Vl}qZV9StT1Xitc-_bdmMNK^ZA@2*A|8mjCzU@U|UkXy^R=F~c z!J^FsCneX?Fwi_2$yIlbVUuCB8YZ~Xg6R94O~WH2o0k&7sm$vY#;ZNVtT)^Zf+uy1>Qvas$hcKU8T3xA4K1nlk}hRGng2m~x8b*~EiQGb6i`@= zR{gQ+?I#82!|-z0Mv@Aw3_G6Ad#0i|!#o~+$UT+#M5}fXa=N@}ctm{57fg2d6LH)& zA-;Ugd&HlDoI3b=3F1S#Z+#T}dfI>xRRP`2D!`&mZ=mH`Yu zduS7i^^4P|rV6(ja>d2)L2xwsGzY^(XSSwaBJ!G`6#Y2u&vYmU&t2f13pVR0VFzQE za$uMZvAVhQT)@9$5*Dq&rraS*jO1alQC9?8uLAhW+GNSebRFK0z-lp0Qg~*-kXU1n z#Mzls);j?dbF9ifj?8yR^L5e1QtxR*p$5$zDL@RD!M+Y4BK;yaXcT6l3kC9FCq^P& z5AGTtAGmrvJUTtHY{-~fP9-i?Ft?b_{dij&AQAJTu?i=lMXl=H2Xq28^ zGZ?Q(xV5VYG~<_$M-$rx$M+&HKw(^3Uw+`nNU)ts*{M;Y=qm*=_9||vEh29Ez*V*K z78k+6`=6;LU5_@L9LudI%Nn0>ItV1YlCrL(3N=28Hc>JOt_;8C(VN4=Z|NDXF%afQm*Ak3+VAw8I`qPq8+@&q#VPy3;hX`QMG{s&e_aQr_0^~RoIT+y z6XM6l4y_H|uJIuBL$cH8%s^SzJgQxm6Fz&Wpk z&?L@gq95)-1m$bl)1h63ssR7RZ>7+V>UMfuxmq%@I<~nMoTJL2ACYW=M@m+DUT^{e zn)XrWjkS;Q$fCR^kz0~RDYibabp}D`06JheYIilsO7iih|0^!I(0J(;{hzOll#_wK ztsUpBp?aKyl29}5tUqlQIHV7A)E8-D*tfC-zJDfi+uxP4MAaUDXm`6r z|1-GgsGc%^jr1RVNo64t9Pzy>fR+zd@8~{!K41GIB)x54)cycR8pw0c^{Qd6?h0y( zk)FNtVq(u)C1rNV3rjl!_R#xtz6%eY*d>N1Rk)=@Hw}GlllLMfK0w-M5T34!ixmxj zHQhw(CFFl5R-ym1w+Xnj1=zmx{-kti0520LY)~m|6L>I*M-Zagy6NZmB+{)3jq*@K z4ou8{&jT$ z2Uh>TC)tAkLt`!~+g3IGP2p3g9n=4LE4qEhA@Fx7^2&S057@KEI)kt{gfbQMm?e!T zO*l0}fyUl)=7p)LmakK-`0pfacX!~b6SOI z9$SAV;0P0p*zd%6Z4?^y{6~d|Gu!+2>-6-eHfR$?{djkdO(2i@t|wpwtNv6@{h8}Z zO4|F#i}4WSFafLtohR(GvdHbRNlZIBWr5uM9F3Jh+fIFt?w9K%{S(#YobWZsJkvhz z@SypoZlr;;N5(-K2eDHIJZTFgWP*KS!Dtgyc04b-74ku67OF5XkhU5* zH}w!-_Q$%ie~9->oUo6C#L@bm3ynLzU}bnFGk%~`P*+SwT5NOB6R?PIg`Q%>ffzIu zqGq@b!dssrRjN#$Wj%RK4Ja(u$Vu~ zZ@i$vp3%pifti=|HrH&<_Kd(B-qlVyJqyY>T=Qdyjc(0`Lkv=A&`hO*e$9j+3j__l zW+8JYj{ZA#oiStjn`+9i_``TdTw_Rm0I1bE6w@Ta#(!ZK z>BFCQBHPXtK`Bw)-_hsX0r4qBY`(YTvDIcUD|u|k5h<7+Pe!{PhvSO-N6BRyPFy~X zt(iq)%uQN1s zi`k2HIj(_d=zF7htqxKGeW#KjO$^f{odx$?A{9_w~wEGBRvQve?G+?`7|N)f1R~0)ejscApSXnSwtZ+Fdz-Pc{(H+W|DI z(>$>Xwfl}bEFqTMN!PC`k2m^?4(+`#6$O$#-AUp;UG;6o zWjJ4V%>G=Nh#$X=bH^h86-Qscyq?%@aRm+tcq-821<7V;Y#;AMJ`#`p;e|`aYNYk* z?UIR5O+&8n_$E%1{&7ODkxn>*aaGLR{Th*SHnXZH&5?5|q@q%Ig@HNPz5^wo@8`F> zYuG|I0sD;a#-^Hv4PK${hIQYja;n}>b(3eBEAG*DBuyBgb=`AL`<~Li5-YhBgQTpu z1UXzv`h&K8T!QTzgsQl9tR_q1yttIGm^qOm_Im~4{()_fa-Us#!K&ok+)g8y?}XS_ z`8s!inJm-mMTYE~?-?v%njn1KPt(-g^CiMqiP@CfUj821t}Ldp!7(D>hd0qE%NChA{Ld3rT|1_Y+> z;iAicZ50U_m}1aAdjOWDwK)p%be-PePtweaWCXj?GD(!90O&vk?YrKK^w z?&BDh-C4CBrf@TpdSysvDGl+H=Bx3gE%iAD+uowGDll~$5NBL4*A{Z)3I}?5{cz(FsnRpV6xlBy}>A6!fIWh!Gu-U=y^;JpYLg; zI%h2jDW?3RNM~0Z=MvQVy9Y4wsxRzjFiz0)Vq;a{^T#@>?jO>hJ_9_Mr)-b5WsNAn z7tso@OdfSb#y5=(%5U1=ic^6XhR)q+e1skM3SYephBBGPYnrIJfqnd~qP6tjoM|Vn zZU=^=XD&g-^pjTi8en%o@8?UF-wa&B5g{RQ656pd*lK=r`dM6a*Nr_qAJ4)qjvex7IkCnPTC%6s5z znT?~tUw*Aoj7PAKBAIB{+!g2U>G{AP@rQZk+_kY>wTqOaCubfT6-RMjy3O+D&aKx2 z*Db18%#y;LJWp%8i+n|P66Qfx_(__PP6_)LI=l#59Zu2GkLcQui759ypnag~5|PbP zKzWQmuSZisSM0lgtFLV_o^rq)B4JKh+q?>ml6l8cN}QVf+MX>smgeh3 z&qRHeR`oAj2Gj=R%Rdt;=YGepP^QSJUW`y1eqFb7eLM}KktQ zJP>T?s3pKZ>UtBWM(feCUZoIN94}MIRp^K){X+!j_AT)+@B5sY1<%++kV@oz%3H2M zAA#V4cHWf9ServTkeTb%>^*=gSW$jCqMPKn=}=#p){oSHX#I8!&+u&l(EEpdB9K{0 zs_XW&#OGvp(A@-34S}Qtx8(d$xKI7KOm>BP!Z%qWP!2KUMzo&yfN>0EAvpA` z0n<%kngDM6CuJ4zt?r>;v*&kCiGoN}xqwJQIMdP0%LwGi!BF=eP3CEy=juJ5(dY{$)rHv3{qb3IU_+0I!4St5lL?Kf+jCCW>kcwQ6x3iwCDtZG)Iv=LIFfYg+lj8Am5iwSB{TGLIilf_;w;~pt zE6dR6PolPprP8_dkl8` z+g&n@<=a1>R1F!{>d?^BY^E(9d7)_`&w27|)_8HkUv@%)&j!?lgSDXYjA$eI)#cy9 zW}L%~Bt^2cL5#Fv16|%Pr4*&sAwe?X+Or6ieK0lJ2>zgDoW8)bpqs1wBOYrZF4T}S+wcc?H|{Q9Tzgm?c~iR8KeTP8&oi1+C4 zCNoDXhO|7Nu&Jk|?oxWtgy+~Ih*XUSLc0qBkv7`YTPKTL|25&Kwh%q8r-%I3q@CG;5VVHWaO=w6Q#Pg0xOwD*ONYf5S#zM3pWs{K7_R<0u{o9KFUA`PLhZ~ zn;B~*sV=F4juXp(nh5H2)3h)$<2D_`ePm=lXYr!%otRZMaS6mU^IobgyG5Xsn{)QE z%mtfF|C^YWCJYD3H$&~hmBPl+9KO;+v{PUS6*%I=9vWzE%u6L;;0yN=+lW_C!%X_@ zvj<9ZEDljzCl)EVJI*se#1n1py7Gq_%#YTClfWnFLT_uQ22;_w_%ym!tY7Z7mRp(p zx*0wftBSL;s9^v!@Tmxs?~=Q$<5 zj1H@|9t#31#$#6Opr3PMv0eF*mYQ1H+}ymB&2GB{V!1bf-pe^0xA7NV)p3Nyd^&TD z2nSYZUTv^=rl+hAp;F237_l%AwOomGOf7OXo_Oq6mOH3^Y1JLT>?Bxr8a!SkHFS9( z{|!!>)Im< zwf)y%w_LaAAAo|lY^%4o(UdZ3b3CuQj0pj^Tqryeq}3pYd7k6g2m88N9n+z_LZ#v;K;`^rQuX}g!8Q%Nb-%Qz+ETIm zv|}sjJs@Py@$~W17Op~-kf9{*YF z8ymcyhN^&yb;;CZJ$6z+2U%VE2zH)^BTh>t$qoZT)~NIuTzR&$MVFaSLbsm%UzF-P)3+q^iP1jKl7kwF!LAkt#mG$91xs9{vUGQY<(l|qk{ zYTRF})gu&)jExI1%rY}GZ4IZ0wJEjjGar@drs@B@(gqWp1Jdjzz&yS_xw$bD_aRfP zFmIvi2z;NYm&@ZpVBhwa-W*Tcd^uiL)=V~&efBHC$QYgb^VST+_>-NIYsa59SJaA{ z`r94e0D-}_VKGa@Uq0mGytGt0pvnp=L?cuf?w`w42IA~L@2z@u2U2B1h$pXrAsU@w z3axW2(;7Qms(du|bZB){ovrqH6~x^-8Ax85@!YG&FXP7am3!oyM5tNCj%W>3$D8$A zP-QH5{nX}K>u$lOQH&?;ETW%kW=Be{R4M*Q*bp)iZGYKxvyG8LZDhQ+Ze2Oa;gt~q z?XoiWKctb|0xNh4tF!Z|3>Y0f-+n0YOozqV$N35|yXYuhqmbaWh-x&n1{5 z%cI&6D<+dU2I*$T?%Gkhuu4xCiY&MkeBilhe0&T^Fehk@W@bKUS#UNcG1oR$f>jYm zNWfpvq~t5s>Jf)Mn12ktU|?^;#fqO}x281fUrh-TR^@4|tnB#9@}7o{E1hOjoYwa> znGk=><;n>6;&!*-`-GwA#AK_7nc15AkkQMH(0`3CBx0b*T!K|y{>TUsKY{Y@F4g85 zD4SNOZzlO`o%1ffB^3ix`LEQrwc2&D+}4!a&Z$4N{L-=+4YejihDsZ{Y@}NxsEavW9t8 zWvv_nBqW~KipSJk!m1&%>PdCbEx(!h*_}1!UU}x%4bufzOmL4ljx*n29sUSUb0^x+ zfu;eHAka$idBgFtjBrry+Qcf2vgz>64R;Laou3_`D&J z3GIK>NoYmAo!7RSD`{QR*0S#iOhmRDE8g?>?(M=z4g|NLvtOI?)f;C(X3RT$ryu)nI1l4&MlpbO=8{k_<# z1R^t(O*5P3rZ^D|6qva}a_5dS*P7GSVNb{{jGII1S3l?gnS(|zAQzG55sM_kHo)U8 zOe`=Q%?-Dc8?ql;Ll%6h7R<>4xYaMEg~UQ#2<)k0Nm_BEU# z8C-c?6grZ(%w+_l@vF^cI&6Z1yM)YlP7<^V-j8uvAsc#$HGa4>kkzSNkK|Qo;eBLgDy@`rhwBsvdq~yuh1F2F6v2L{jeWO#J#-*3iAh zS81AVcFT|z_9yO8%sG=*P(}4{o2c7-Lc5-iU;A#cnalovYp{y&7sF_ z_nZz0ehOt%UwQjU;=Ex#B%9x@*wBBGMLoEc3B?}-2PxZIZ?!`d^rx7q9; zSFOI@rN5|cPKHKFk!1mk2tUSh){xi5#m%qC-Mzs|atqz{xe#I>45NC6DG%KVn-Nu! z2KH14vjoMvG&u(z#H#y>jWJT%ll@Uh1l^d`ia%22H~o!LS+4ltH9EQ+dcN!WAhFf5 z+)`1in`2IQk+_E|LQn?Kh=tLYF_uTMWeo_Ecup8*Yy zm~C5AOoE(Q2&2H-`CnI3?!QYYqP!rw-Rql1!}m*+bF2)NH2r1~rn~!l>-82IUe7B~ zGa)62tNqzziF{;_OziN?005R#RNNqPD)Po{IKVru(*C{(FG-9@-gj}>lP0uai%w+< zH3rcZF_QPa4B8#$YOwSIdjoQF;H|CSBnMw|@)`E=k%}J)<5mJzquO^OWEsoIJDH&| zK1V&4!RJ&98+yPs^-zz2>H`-IL&bx$cT6SLQw}jwhr(C;B%>;FDs%TBQXrJUYJIsv zkiMuG?{87L?a%=7ux<#EhrO+4B5q$sOKe6!qu|Ebj0y0*V5nm^AIYI=SB6txEgIFC01*jxR0k<5OMwtz02oArCxs zsYF0Ll6Z;A+4KGTj6Y3=jDX2*}Fb#005Q&n|yR-wa5=rv%_kCThY2l97lC=g1OEQH9l1_vg0u&(~^+4l`e z_w1w~U7*WkIC1rZGsRFjbsHbc<+<#IW632EvWO{eXkq!4mVS$A`DO(#vV4PoUc412 z4Tw9W0VPm?5()9+&y*ba6O6vG@F|F0TLs7#j;Y+L)wWHSScM0N(+J}=94;I$P{#>5 zF>{be>x~!j>m5AK{g4{SdT@W;Ey(&zkfDwI;3p7J_`r*CN0^<3CGh5kukTh!oC9S+ zm$kQCHJU^Bvll#loZF`#eSGnrJMB82F&2Oy5lwu<_I#*U43HEco+H(d za1{_`?v)rQ!UBWG3ES*&_@I z4TrWf{i&&94nJbYAkZZopbJNg>0i&N2zD%o_po0SSNZ-!3khDO>mf;OoI14@99aM$ zRx$J)FTHL=r=l9_Ye<8rv@&VUrfwRH0t{>0K-Ns<$iY86RDKqYp&gm z@FWk*Tcpp4B-a&*jcyTYH@!Li@Ob^e$;Acyz?oc07v&skwuk|jzuXk8L7mmh^c-p| z?P5%m_4h2N=>cv^?2lcLsA)5f;*h!x+yqdA$2AB*=81AW!jxduE87m`{ET-`3VVnwti88#cKWUn`)M>#ft6|n;~7GoLHAFHLipuwizUUg8Q znls_78)FA$AWD~8&fYvpqu8K>PA{%;)M1StoqHEO^wN{ z=U5Gzt2pv1zF=$W`7#9pPe!gFVow0~9rzq%QISb}3h!f_|07minI|cr0V@J2eApjq z_iBM$*YDS91j^-bE!YdF;^}l=Rgs*XE%VD_`uA2|<>*1M!q{2vK3-25>X9+)zL&~8 z;Q+Xby}M+ufqsqasnSVyUdV2umE@(-@Hi%h?WNbrbaGVJSDdwtDO^VsdE12;crl(x zD6s|N!2Z4oL+^u%L(lD~lPAUbt&j0(qZh#A`bUW-Bk3p%+nu{MqR>D_gOZB}th#th z$rGsg<$FLKe^7zHp3GQ6lBpaHt}#0RR0DcebQ86L0ZGi|yf5a^|LMWwd4+#fFUH^5 zsiagac?)}Lo%`>f)6<{fgL!v}Ps9O4ya(s;zZ7bi^9kz*S(b%vhT~VWSrH1su>o7~SlG#!#3{_kfrK)%os{bM-@%zCdkJ+rCO6 zPXJ0K85fsBY}K=~U5^b!Au{B`(}+0~DHu=a;^^XH(wLYSzr_3d`=Pa*KgL5)t{4SE zG-MJe%4cX@9^qji-5aQY=nHb2wBQU&6vYI=hsWnWT@fBFj=B?(j$$jl*hI+V6h6kf z+CBXLjf`^1Mvc6?)@173sfX!su~Jv_bg!7j5)S$yfw#7&%Z*i&>ynHIHz%qr!U3uO z#ob#4#T9+~pN&IscL*UtgS%URK(OG!CAho01t&NO?ry=IU8I-S#C*aPa&3*f5?> z&PBr7J7j%a<l6QQ2Ks>KV7u={Jr_rBdo%j6ok76(mzc^2jfgz=i=QnpcD#`4|3OPzj zFL-Dq?OLD^DfA*zM$uCt5c1~lBlqFQrjpUSI$9+0xj%h=d0s8LtR87hd`(9S{cVi0 za(M`n=`b+{ei$O4kRbN-y#3G|6QnH>)F>t@CJe^SF zYW|9Eg*M^I9vy72Yh^I@AW4eSLCx5s(%#;JAg{;>WK^)5jlEu2M4~5d*OCuOC%cT1 zro4pkLY?nTt`d%Voa3A(X^YNX9ap9Y@c5C>h&b5Wzp@CbR$%+jxeSiDyeXt+noN(k zo;hsSSBC^E@h@FZ4^H|*z{ci>>m{dG1w|D!uXsu|s3uVD(R(Wq6biL@UH`I2eMP`P z)KpZfz)$DBZO`?3LhETD{AKB!i994J?QbrE!TxkKMJCL(b#`y7GCkw=U>cjmw5t2f zF4R5zRjl8MS<1_aH((#A6>CX{=A`q3wB;6E41P;WV$FNk_wW!Rc^y^WX4vXJ>Ei<{ zf*8f(3akuuEYaa~+3}=WgfnxURW7tsQfcY1)E-)Y1} zys{V{3P|-IoTD-H& z42GXz4F=&5!7cuIb?UGcIC33Iy|Uzfj|)7b&#ph5>`f&Q5SxGbdMZxg3+S zIAipw?T#)*^zl-25wcR%x6+Mm74l%Q031daf{6YKeYv@ikpS@seY#M)yuXJfsEx&Y z!PCeOx1AA$w>BzZ=o@XsGbK!Uz?WiI2qVR&+J`~c(gUxlv{LK zZ9gwGNE^64KB!IKFwpvaU-vZ_IEq)hi^M|$NuR@#`_&)Syk8LG zmu|G27vp)DEL^EBBAVerdBU%_l*C&7fImIu7%+Z`_%(vSSM;#ThUof7^nnu3FhBO( z?sH0PZkqcKllkb`e47M+i}F#%Rx$J-e4P_F@>ZRl8I}{zkV;_yZ}F3e)a!)CL;14? zW-Zq8xd3(SM_2Nv0ow9=PnpA$_T#>2^wBR1CXk_T-#^c5tE!62XTN-h`LBh7=z4P^ zmjoTH9%2In3ExZRd8_ncD!rOHAIW@3Kwid|I~ajAuAgqDIQSo4*1vrBmJz>1p6Dk_ zsXilq?0cjumajkh(z=h2z14PiJ8LL6h}!P({0Q3B>k1Y|#-|Lk|XB5ctce19Hu^ z3t`+Mg+HU3pUHr!E8Fl5mox7Bg5r=@4r6B4c3KdrfFHYIGnvyX3XLkfeglqA&ntt+ zff888`?Mc*!uPm9JY2~17Hw-Msm%~ZEo>;JfVEX{POZ0 zBUyBLBQhhd?#3u8am|7Z%3_@OQIj?!EUepg=la@f>3+x-QcViuh zwS9sxw&ON=o~J<$*iT>o{tOx^h)&OzeUFH9s-!McUl20ma@+Gjm|L*lL-yv<(ZE;7 zlqOslmZG|fu>mN&QMR1wM#DbJm~77pG5ZV9jiZjx`$hit?>BAKrMO?WgaBRmO z!AQHZZ1RAvrtfEnz5jl0pF^AkTD*lrGg;CHYaslD%#Cp~l4u{srWH>18!Uf)A54a) z!3U}LqR^i|cND9{_Jff^N-aN6zN29|?>+uaF~yo7K4G`k02yEP#Q#HL$D5>>TN5%p zE{J4=?;ja}Uswg?Ed`GnQz+ppHEWQ?lp?QdE$bS_?tRVyBnfa7!2kPh5S}`tG|i*+ zCUDAf-2`oWCSz%>!N12drV&0$XlZIm$mY0fKn`KlfNgc(O=x)x&YVVu+tw-VlJ4)HvG3k3&CfY@y*g@YX#mTL!t>%M zU_3Z>b3HcpJ}aip^A~m=*Ew-WWmwcb`LV+w$CiIg4ZALyI`N0Zou0O`8Tbyxrs@!h z(znOIZVaR9kQ$Xvub^OxKcPuu1Xda-LlFrsESM1ZwwKbJ00;P2#M>5fpNRm;ry6B{2Ya zM#fKORZ2(zuczc}uhB_;&v`7V%E*)>iN1aQ;R8$wgphzo%E6(t)&<>eC)noE{T0Y0 ztO4mqdny!|fu>@3eu%Zv18}5#XO$(CN-FRLmB~G+{hdhdahZRT(@xj*e_?2|mbdVq znE4a>(yMlSlr)2}IW>4MH&x=ZXidO3&oyc2D{ZbGgaMgo$OYEDecDv-=oag1avbWsoaq(XF zofbxR2mrubRqI1Eq~0#chUf~K@MqjzmTeK>ji*)cB=k6LQ%AkKk+n}q{JGM3`$YK* z;bjI@e8T*8L}a|m^OTeTR;AppK@M?G;xZZvD6YJX*r=c4(0ScT68uK@gO6IB`<6Kz zA?IvB6(r`G0yBfsp-ZB$yPuE%cl6{1M-ldkjRXG6e+@5Nzu2S2qZCSd6*cL&!R?*P zx6GY>jzeiSU_5ryUvEQS=K59N^OsvfTmCrvS(-~fq7FtjQiYnDXU*2-`4z-ET*x=U zsINNK&@GA>V%noBw@M81>Tc^b{&dc_<-t9TMZ^6ygvu;%SF;)KvBPj#4;K}pXd0Fb-#uyvL$Omw z%>*@jaMF%TP9``y66fd)t9}yaTQbP>GU2)R521HW8?4#Pfhph2YA@d!_6pTSid~ru zn^an9Ka=n0LaL1fZdyzkzQ+||;OxBnLF&8QKR+Ku?i7DXWIbw0M0m+j+eJ*i~%$#DbiTd>|hJ?6ckK7Y{J9lG{_4FpT=Hk=Tv+=pNCB1mMb@9 zu8m^w(yb-1377>(i20-dctWDxmN?)VXMpudmU{lwX&*XcKRetp7_xuRNlwx|uN8Jz z{o$qwMbNc5CSc(FI;hLbN>Qojj=CF-G0)#fCX9j1`&vKUZHur)!oLyY*YI$G*?9iJ zLSq~iTHbF1+zR~ONC4!rxa21!Jn6*ygnJ-zfgJ>`uC-Dpmc^wqPA3hPJ& z7|_5=C=#$TZ<7{%7vjdvVgTE6TdebY-?{5eQU|dOY~A^Elwowx`B1=q1^(g}xDB%S zcO!y;H76DBmG>v`8%SBUx0F*6gbeZjINN?N7o5l-d#o!JdM>T|UTl*)O#n=b~ z0MUS|A3Yi&U(QJ|F(%UlmhKhLC-ldNjgvQTD&1=xG<^=$t3=zK`=Wq@!SW^i%ai?z z_Op#Rc~*n&FE8eCadE$9WZ2BZn(&ipzY}1?hQAGZ^g0#SyX$`UYiR0_jjh(Sd68p3 z;OoE#jJ+42T?HoczkX9>j!BvoEt;}Lh}3I(JfJLcp9tT%(W@#SULYfja|IHJaJ*z? zWyMigt#dxqnCEGKdTi$XJ0dn&sozEC^@xN`#VrWzGQRyi1`b3J3$$-e7>ncTtS^0g z$8&l*bg0GHs&eUBRCMbW7(4(zXR%3!bNGe-?Ch_=fujxeYi}-5Z8Khj{K~f z!o|HIduIH#dEF&PQ6R!q;79Smza=LHy}5I@Uy;?Ij-aavM0NMott2?YidX04>pQ+zaY4vgE;e@tXp}=&n@P3xL&c(o)^gAs$y`MMYSpBKDH~ztC}C{ zT;G`736@wB5b2qIur7CyriB51z^UgIXk1=sb6VHu-zzf!t(w$Am~9O+pbzGJdwTpW1iQq! zApkT!NcbDD;Ui)1zKnztAn9CD?Z>DjF$K z>#0y0pI`y}J~Z6jU=jQ3^NBJ5zf*p;6k7GVx30HgVM(!*lXv*x3{#U5@}6!H0`K~k zbsZvK+u;TV``bOClasYX4s5oxvmTxZ$=8T|;Q)5&Uc%Kf*Ao}NPi8?#fNZBLKlA4= zkKYrGg^U^2toft=eHT2W0EGD~puu=-cddl2HqAeFmste{rYenkH-K@@%-g z7ulgdxsQCe?g{hhH#H(E`qN#Tg9+eC7SggbzEDR*pK@gW{rjY!-hG19^0vNu`@KwH z3fsj*)K@wx0c~(*5f$sw<;$0^NOvZnHBwXrMobwY*u_hq&z&~v4vtof=Bnp~rnl3( zJf*Zo<;_Fs(4v4DC~0MikUZWdEfRv(bX57Wn~oLk?F7Aq%#bhCC9bBs#JVi~t{d2S1umS{wSI zr}{=ytbbtO=6qPlY@vaLF^S%^`TpJ$d~X;y5>3Z)r35Z3FU{T`!x2s0h4x%!|4+_o zs43=Q%oUatd+ycv$g_F`T@Uq3c=$S)2`?JG;;3Y^AGcUd|MT72E3C*Imr*n~rmyeC z+=YOe%sg&}-2+Yp16BmXfPe+^pLZxMkbS@0+}Bhx$sm_Qv7uSfkZ8=qFZjZHqm`YX zXl(oC@f&+^Lj@GANlg-ck~ z-fz?7Jv-|VNNgdrw6v*Sm$Ub0158fyqZrrQ89oI3uFSIE*s}nr6or^GVzJpp%~cL; z+`!#hcNk1;U06Ui?*^RX+}A4sQgU)zV58ZZw`nh{e9*LM?fEE4DsFGjn#Sj1-02T@ zF)`j>)bH`TzyHNGT5Me0epP+vry5gC@H2vkbG2QY_NPb9$Exl_KZB5YRs*pCmS(N8 z3yqSVzGUd`(=z+(Mc5hmX_S}1S%YlVGXD|EB?0Zmp4bXKi&@1 z8v$5_n9X6!&DQs4C8SI;vmd$lwI8E)(@23ld7bs*-pnJ|NsUJ`MV=o7kXqY;DBg1< zuiAXF*!{@urHU6*W?Ys=djKji=Y(N&zz>sQvL?sfpGxuqxQcfd`_tnUxY4YmY3(yJP8v-eF?#P19^|v>(QCpX?DGY<`abGR^bsw|Vy$OsBbFg~B}#q>DLZ zF5ho_F4jR-y%B^tyv_%v^DeVSNkxKQw-frqKP7ASgB3^1z`e@u7r9JII_7MBL0}er zrto~{ve`QLF?@Mw0ix&B8J?`+_)KV;?RZQ&G9Ylmy_*~7c{e0@X9*O|>eZj6g0_uK zOny8)-i;S2QTIj?ONxkyXuC{HfPP)}d1^gmiv+U>To3Iwg;A$vW{NCRK0{Fd0WH)0 z81C7roST<73IM;iSI5J9lO_8(&9!p5-b|}hicT=uYJBgw-fhq|KU7!Re8J=x%bLjR$P-wlf2YV`rvNG8nRP|LmY|D|kZD2mnEuhNR z&f~55DqMN|Mo1{5)#EBQHWn*CJt*lt!13xl<9HXp;C92P!}Ugy5@V3;x5G6Ty^3t| zW&+!&fY&V0({T%Gbl8qfN>U3y7A^d8wAk!$F{$PNhA8M_lanF7;}H-s zNcT8uv~^*~HwD88Wc84aM$U-v`>L#fKY!jC$-=EWb>*LQKLR^HbfwV%9vb%wWciUn zv(6S=M`fRf{?)|Q82F>F-s;$xB2a;n>t=|pf~gF@^1Q8&h@qF+`;>G&-W|((dh%=5 zSymk`R~vm8X{!eZFX_Ym@Vyp%kmt?y?C=MZ$wJ$)N)G9=_1O!*CV7e~#g(~g0oHzS zTfyN3zABk2C8{-G(#WOX#fYJ0fonV~PX$+phKEgl$G%a~z$Bo{YD)rb{bAUL*7o%1 zA;*9E4$^kLh71;Iub(6@0PYE)^5Oj?$N!M9YPqfkLE@8=&H*RT;e3#bFMYh#!$t7v z-od*0kaM|BUg#knTyk10Ish<{*5p5ZBBWO<&jn&%s~$)}!MVgE zC$(aZT~Rv{FjNaA3Pg0^%%L!l$e@HxEvFnw#G&~7{`m#Q%ULZCFk&Y8j$76}?!luf zG9LU^uQBuePfwf6IGEYOd-MP2AZTBt@=`g5qFbdj#lg9=!9r9e)xi}}Otg*gB(_phH8k_os^cq~7sfPf*T ztg4!*@xwT>>G5`71x&Gtt-<0ug)s z{GlpndFfT#ozmnLD~J_doc58Iw6ySFJX|f83^288y`iQqnJiHY*=M+(skKNtPKSU6 zO&~v!K{KBdz>MP+pRc}GTvC2kd*$9r$HAczNhY9CrroS6a514oCn%`n^>qATh+qaDNZnPP-MYji@Y_sgiz7b^c%Oq<9PWQj zYr*8H{QLC3Xkt%E`PL)YCSoYWEDueF)61f`*ANqulMBHjSGYBtp*t*qCa1DAU{$}k zWdT^^#FGHXeF3^CFl*Wmpu4!2$R(aaPzbY!xYr|m9isS-xSzkxPZoW+WJUw_Ck47D zFmA*gbF$V!7v7$6zWA>b%&Md+6!L#|Xy6L||NI@&>X9(Jl8(+02=hsSFdx{hSC67z zc9Tfc0{4J87`5Pll73qHe>*CjfPHuj*haQ4fH<8FB58IbA_&j0N6I-0#IGVXW|CG| zK<5xotMnWWRj;=ueLgR^?-j|U@g`74^RwojgUBMv4ssz7O*ze~h+vRB+tk1=YxAfQ zEG)A2eg3)cwx*J~nBY1|y57HkeWl!;tEJD&%Uf`o*8Y36_?^RIs&d);PQ|^A#c4cO z3LDc-1d;NBCsIS{SyU?W1;>B~wkt1QarNk3Zl%>cr$)W?Ah?oLG?@UMRYpdJ{CK|X zY@CD$0Tgq>2fRRai6fCuaF&L^2!+&`j=uUMfC)>X0oGwy3Zl?mT0MH8 ze_wE(w@P)MGjrUV_+2Fn0E@tA{Ff1NF)08Xx-kllFz@)l(TcwtrXl((r6kz+>A+;i ztr-N*#B{Ev$R>P4#q<3zP!wra<;a4|umA=*y2q9DGmU-dziI5RQDx%ezFXkh9;VPRPW6%} zcP@Zwqk1r>FA3}mB0)eP=GoniNks`+*kWUxM$Kj z89K>CIf-xnMx4$y(ubsXT+G|&|Wstbb;iY_tbL(OEkHAsi;j7yrkzwlRJ$;-R! z>*)c^Yf+S!@Om&S7t^b|1%nHp2WNiIdP>+;m2P0eQg8!&2u>v~82$em)bkHOYkM(? zA=!91^QJ{sI_%%afRs_kwXz6jxXyT1lPKVQTbWCO zy(N~@XR|ULLL2+gp6OyEFqZUP^b351-{45rZG~2S?eO_nYJzuP(B5$s0~*RlkSR3K`iX_#H}5qwf;P&v;!<|*yXe20fCwL|mvgb8<)BA7 zNn=i4fluaz!)SuncS?!QGUZ}9PUSH_ruYfv)jPaw;#zQs`1mW8hxh$_m_8&CyH8W= z#g5qu?BAHSOyLY_#MS)lQFo1Rtz}P!S;ini8nqer@7VJB^_QVi#JRQxf_xcFN(DqA zAR4CxG6ojF-iK&0f>`kCt0c#|k#C9jVodg)hrQAG6!<^o#d9w5J{(#-kR#Uy=tH3I zLnP@e`3!^qyhL0rc(piF*|~K2&0@nH6%3r57$}%O8)ZmHnemG->T>+Ywk(+iexMXV z4+mo)xy9LPzv_4EWgQ`}FkFurU2e0uC#TD%@IPt7c)(fV+7mkPK8Eq+? zvJz*tp;@E|wGQ(&g|5h%IaJT^WE(hBiuE#es9RH%7G-dhX|rR21Z zW>-h ze>GT7a}h7(m=6I~KEj8IhPk$jphkV1h>%T3ahjKV4Jrb}{RsdZN6gF>f;;y{UBcgn z$aOp1hDG1M6drF6-J%1yH;w6DRp37(<=+6LypH;gR)T1u03PGSuJ+ocEYxrTIsJ}| zp|bh{Om`KC8^OKE$9NRUMEafb0Pq_6VZF!%TR#(3|ydIU_dY1-#kl%|L8 zrN^GW!|Orccr4!A_8$7mA+7(Mtp#h6vV^SD`pve}((fWA7^j>{1>Jy@6u-VTnjAh| zfG=_TMr_v2C@tM>s7?5cmnTDyAi`}}CM^(e9)z;4AmsIg-vb>lMuzxwvkHy$P364}{KcI$P?CR;pRh4)whPfo8j zxYAjBw`7n~?KP_#!OoobIwl!0gr7OJnre_cHlxw^3VJB6$n_tRUrI`Y&G^qq7DBI0 zazeTGg_CO^sjcw6YWW(jjtR!RY0q?OZ|efkGk@^el0wl#1iT}fT%&;wFKQQtkT=3w zBmy2kEh=`&XPLO;4r?+|HQg?5wfNK1FBUW@h`^-Yl-^Eo?POMLRt9D#Z+Ss3Z0y1& zip$`JH%HWzC5#>;zCFNK6Nking%a>keey!2YHZw!Z(fB`E_W4tBtYY-V_ERT=D&Vv zsI8PzaNE@eXJltLr+|N)p+E>Q?@zWd9p-9AExh)$=}yQ53Xc@%r)h`RLhO>O*>9d= ze(D^x>z2>vywX%cnh@JhU~N>Y}XRstL=Xr7n#RHftevBo-{it{sW~diGwv zH+}W(yG6cp5lV#`v5)pmqBxMkd*0Y;{D^cSkpeUegRL`gzo{tGy1GBEUYfS(%rs4+ zke?Fzo+3H!R91{K)C(KDDk!vZb-f<$?%QA7+;s2PSt|-uC@i-oSTYN^cAd$vLfPV| zZuDoUS?%FiY;5*q)xIM1S$2TFa^NaB$1R)ff8`E|Ibg((c0vTxM%=a4{mo`Fi~EG* zLDg1O^_Z6(A6~oLaJub`{ucWQWb5R%#M=ePs-UNe$mzE;qK9LcO$YIGHZvx!)7+1o7#P~Fz^6K1~im@ ztTi(WtkqgIl&}VK5Uu}**DJXB1FnH=rluk^{acQOxP?oVj^43bPOBA%A)quFO=KXc zI`m+CAVxUf?&|Qn?w)rrx9yW{0wbj@>>E^sPgeO!~ zbu8sg>Q7iIyB(nqp<-1L>#i{%ca;%@)stAhClU7J&B60me1$(;Ztoeze8EBr)9@ch zSM9XUKo7ny$Z?m*jK!~4yASm{_ipH_ zTLlcUYxsxj)E}S)byY$jy?s&p14(52#^})z!^rBBdcCJB8NQoLxXX`=n4d7>w<$d{6Q5 zyA7n|f`v0}`N}Y;EQT!T(yQdwGR$kf?Av?P*M;lfT!r^zI=tvTC2I2w21COE7w};@NV?t~Q3i?P*~9l$r2^#-!l2i7LP83! zwraiuy!W~6WdD0{bZb4-!KDPuI-OsjWn-#D} zK}$X)eS6C2F?qZ0s>9gczwqg~=D^#Y;}IzDM?z_7ZOa^7$RSppl)nrGq+qm>1M1{w zP!snZD8I2DY;sF81rSlm13iF=Zn^dn=(AdX>Eot}?R6!n1?x!AeM3xg-q;fT_;Ka2 zmv)Fu*cXOr58fnQO6wDCeImaBAD*KeK2KnR!7E`cIqk;eE4Ltd-qV7aShyYZP{7$e52ZT+pdu1jKHbf&Qqz&n@sqn9?P%tjVT30dOXXu z9=N%A?A^{w(Z%(e>}e1nYvrl>J8vI#d#N%NBcfRcc}|<+8$YoxEGy$EIuArjxRUDU zozx1Z5LCT)&u zD&swY-aQlwalURJ?Y^&&HCO7D&l*%I7G3b~-@iW!cW{3G6%#YG47@ea6VKX!(r7@) zc|%PPCw-xp^=PtOm(HFL_oHHUXVm>E%>_Pnx$L{3<7<$^t|H@a{+lx)wKN(TH3Q)6 ztE>MU&);$bUPkx3`Mf-Mv>GAKx`)}~bdv_UE&!kLBq{=sE9)?ldCmF>++m{FPc(EW-CprJHWMpe(3=$ywLlO z&GK2TvsGElLnBOcgneaM^WvcvpCz~3CTY1TeF(V^3ZO9&v`;95vMR}3!&<@^&tzNn zI0AV#XXq0;wb;&y80=a+oShz-tHlCxm%|stoXJv#^yj=1SfIVb{5emY2KcA(RdL3U zZvE3J*c52^nM&Fyn?~Op*W@M7pZh5AfB)X!-+VpH!ZnX-wxJ_h&N2$`~gVMjB=PiUuQ{Oc7h2Bp@zRE6)21P3wrWJ1GEXf zoQl_7KTTVfK55nV1`UU2L)+`poV|2`!)P|PK?hVOE$2E=!Ql3qaH9~{@ht5Grmslp zrdTnWoF*aubJSE>&h^~cOYwc0w(`5Qqyixi8Z{xihPe;1{To8XJo73);ziGq=c;mk zZgW$v(&q^uzLBb3Wm-1t3JG^+e|<0D#ls_gv4dHN?RCd%5t79*JG=F;6pFj&;C@47 zv+>f2(1wNv9U#fl+hS@BCukN;fn<5v;a~bMydG*{G%^kS2i;-vQB7KfVf)r^j=!V9 z*fE=(vvi%eYFeGCiW-iK%ZVSzn}E7s{ock$P$4a&yv1IPF{$1Kw{WzgMEfXe!2u~# z;zg+XIQTPl_~tv_o_o5AU3~EC6-tR@r9S||?^N3NquTs29Y8hro0fyE5BeDAL)r!w zWvtq*vKwu#j$UL?Z-?7o2sP2e?NRi?YAFHSdbA2xY+Nno_UDM3kWc{MpG2+KEZVYE zlV?>-$d-(OdtDN`P@*_X8fz`{-56cIDAt)EDu%_7&TDzJn6y?(h6y?pe!&_rc6Pd` z<6}B-dhPTO1gzqGjq;RYX!QcnNdG!Ki1W3r$Us0zoiI>}CL`DBi*<{RHr5Ct{)zmS zmTJBdYpPqmmyc&ldYIRZ5!(oFsOZs_xA)q6Mng`c?o%8tJMQ)qeoBRM*V{{=uA)0q zx;k=q@BJmkqvzX5BX#zBl3{n(J**t=38EkhEoA>TQrdZB?G(wl>t(nwiuBm~q~(epuk$SR z+*IC?1ivD1+5pa`-;b-FGZZRf1sr?}OpNR}y-@WspaBkCd4!`G;uhP!CFaFBYSbJR zIuZb-bM6|GlrO8lILfUcfS-TNgUe*9y*$+49$KOJY|Ul4XwHRJifjHl=>1}~T~5@p zB}lQeEOY=+MCU(O>LO#RVRrYGmFjnG@%R-lNt>y^(|15tH)keF$EHU4zSk zq~=Ug(tf;Ac;v_Yt+C0by#X5alwcN<4W_#GM zOVw&Vh1qAht7)VzW@fz&@9y@N%0*D)ezSJk+zK{x*`4ebp@pEus)c$ z%RG!f1+>Qwf)KT{Zxyo6bq=~j23AwSfgH<*2H9k=noOuAaRm)CZx`X+gLagAD`SUJ z`y_F`{=(_C2Rzbn5dsx{y6nBwfg7ln7YNQ=!014AkpFVQ^%4^hFn}` z{6jSXH-_MY^3&G*M_{Rgx!QZe3`puw4?Ep-M+PrEOmXaW*Vg`=_^%n5&a%3;L=nI{ z1zhNm3Xv(Ug@2MVp~?y8dlCyL>e1%3N$BW`fL{^f7lpojIo=tNcK50Y(+zeUt+Edd zon)t!7{)EmiKGXX>Z>RPC{pK|XvZdhiq23nfxm82Qi&nQTZHG>l?jU|(}5_*L`*eJ~!{i7JDq zY4PDsk+_62D9o;jDs_&ab_}qHRriIVyuk2G#n~&qjkf zo`F`XAnsJx%2G?L6YCezLn1qKZ3*e)mAMBeO^{qea|Gkwso=TAU$^Z|+R1M1OwMrt zI9EFhJ0!whL}bd^2_7Ai;!8bxIIv6;?H@^Ce5-`a;?Pw}Eekj@F+bl$fT9IO&Bth- zts3KzAi){crXg!=`0f8e(@bnYzi|He{igYEU1XxP-(L5NAB(y^DV@0RT_O8kSIfG) z7V_WozYB(Q66tObE$sM9nTJ>ll1B0%ICbg4UhJ-D{)eK5jJff2` zrabKjgq0)Fo0;)Wp^0jAH&%r8Dc%3UTr?A^9yYWAwJ?HJpIUwQVy0Y#S4W zNX3Lh^Pv*wdasISr22X!h$&szHOWPIOd>*A_i#ckkEV;KRJEA2U&t2`&q`tQRtKNE zExTCuqBu0EIp%mHsc^k?Jba(~rNk{|ci|_fyn)Iu$-nt$jWx=EG>%Z7V#{9tiEtX3 zX=1rO!F?1}3Py?JAN9s*6^dPgkKtPLL7W&6-8YCV$SJIrtsmV9xA5c~nsT!(y|oc1VW*mwKKs!`5fq?P~ca!f}^u z;tR>b441;W(eKd{!z9M@jS-A=X-pT#5{PqO8|P$4FL!pviw9 zU&0B5DYZXv27rP#3W4ahM0@e!Yl zeC*KQOua*VJ#j6VGt$IC-1aeh@aYb@j0`7gP*#p;E&fluB4-3ga z0LOwvTQ16NndpwLX?gyKNb6uvUE1TMj~1iAj)U|YBg-lC+}?{7kZ${h9z`6XIG4CL z$o*n6!MptV2ow5@=jUX6`9#dcrc`7y?50WUc+`&l$^5*RCNF-@i1zq%ynWLi-NW^2 z2)(C(4@@>TeLS=ZNm5~Y!!dcE>#LH6fnROz%HrLnR&jBMoAX#${?SX=Sn;5~M}NeC zg80rPA>d}RMJO=L;*AKheB55OCmQAJNzBXVO$x1k{G}Gy4f!^a@2u{#Bh+M5r6K=K zai?k3tu)DZG#FqU31hsJ`f7X_#WpRaJdvku-c;VNA_#K zUf7&$@v+M`=8;0=Y|%ZwD?xZ$Y-~L5%|;kPz*HM-IMRPLJ(@q87?n(G*M#`rZU?0f zW6m2Hmtuz3z-i8KG^|=1q$=(A?a$&6zPE^9AwId>ZXyKJHr8YmgT3LmiU8@vL|y>@Z%18q)}&AR%d_23*YRdX})|sm+i3j?%47 z?z%8XOIvW3MDHBVpYkRhpD!g#cv#tiQ^Kw&U?S6Pw9;QtE5YFv=wsGVcpP`0N-mx2Xdn}GHO*7pVGiiJ`F;8g@34@kcl+@3mroAN z!K}X=lyV=%^5=TIflUO^;fC?%KhgRwRpr~q6Tj*cU14UCK0Q<%{dtq5JjedL{e5L; zz5qozEvCQW@}Ow^2r6hq0$!i*MyVLK)*5qdKBYxE5!L9@aAe4S)ETfgW(aM$2$}Q& z1O#5}iYNrR`Fq8$0A|J2u^*;jZEwDQzx{DKsA~Ay9clr`A!MJ$dkYa1RI;PdS*43w zF#!;jMaGV)WWn4YJ(`dGfvj9LX;XsclTTdnZbstoTr)D}V&Eg?#@c zF4TnIVdb2Yq4T zPP?E$Ex?b$4AGDy^qU^9*iHl!uvz2#F zC~IHz6++`+&QX}@6$cXdUVNEGPUG#ID7uX0%XAGU2DM+_79gXq*iyp~a~|CFZN4aV zQx5_Z;;H+O5^^1#pV#eozqbJNjyxA?XgrQK>rUI9s5erl|8$Aa`OP^6+qm_CYzA6I zJDQp^xcrTCQfg2Io$x39y*S@84{!v4WIKoJq~5o*eh6f~ zrEimY#=ZY=jbOZj_E|I?mJnn({JqF8OcJ);kZ$b>Y7O(IACE_Bd>$g1X~rircneWG ze}Qn;%p`86MFN7^I`zMQH`OF>z?Je!5VHHKl+?g$qBeUR`2lh1lk6w}5|A7`222xn zvE*AHTw9u^XD)lM63bN&fx5MO>=Z=?m?G!KPyV zwVL%Hd`HP4q4u%-fBTv%WdCao``xcY1#csP5av)Mh|HD_pkOYa2Etx%U^~k4~7m4W)6k*Qs%`q-G3Nz{xd?d3DV3@o+GZo@R!6M!7%ru;8*_#81jSuP zX}ZOxu~X7Y4U2-x8-nfFy)Kq%Wi)Tu?=bEDneCL%$TOt`%)rTccxk84c}%XFez)oC zD$qS5t?W<-1p%&;743U{_&SB;LRVV99OxNby1G$Ducp?dqtre=RDVwCUXr73Xn}9}HEPl$HI*c}0Gxcnr`SmWT(3g9 zz1?k-`a+=Zt}QjBQK^x(c;thUCcRG@qL!7$(f+dQk;7k!Fl%l@+3KTq>8WKl6YUfI z)a~|$5(b}QHNu1Ws)UD0juwK9?3L;MXc2&+h?2mK$4X=j<>i^UA&qtc3ac)r8 z0h9;=rZe{RM*vr>71G3oEgvEg&PWa_F>A+hSFt>~$mTrx-~*-+pDi2whRzbW7p<&6}N- z;9eFP)Dd{cCE6iWZy>Hza(b%4b&n7c9NevxZM|t%3-i#d5d1-)Cla{mNS*iv1xH-j z|I(_b)D@0Isp*W8?k+a}j~3J6E67DXW(h@VEz91bE?ROG&XcOA(-$ICHb%iHT1@Tq zJze?So<)icvXf#MJ>iN|?xlmCv_65ID^sWNPr z##A<7tvIPprYv<(8@Z4cIDh+~%(X=qJKhRQ2`K-$-a_XQ#{+|_D3ejkr0p*Cn#2gI zO!nGaa}HyX+|phbhBoUg^HsU8M^UL$Yr5X&A7q@f@bS5pE}3oI#@-OO(@(u#>3!)i zlG))9Y0*1Uu;(q0nL}F9n$PDm^(le#zfUV!I>Nn!o_HCz{fBRJL%`v3J=)c|4iCCZ z_V_)$Hp9Cz^(^wM{rX{l5892#?M*oMjG+y-ypdYNvT>Qv&@D${FIU1>nABe#z7?Nx z{fYpzlhpY)3Z)V(vJW4WmWR{`E$=#o{wk!o`HZ~WF1?o|!SwtnDfSqZtp4=lt;Sm!lNe{6A8&?WhOHOrD(`+=+Gwd?+rjQoMn<$wg6GNDA;N`Y9|7w?y7sGXsX;s4UBN}l1$I;gAd-BfIF z`Ewk?xl6Qc6jY?ixB2q+3!_DQW2r>F(}s zB!ey|4ip4offPe1o{(OYuM+(O+_GBTAn3p1ysrBaNtWhUYj z$#IpjORWIle$0sYr_ZDJ?UX@L8n(YFHzF?MS!a=cdl=m1+alfXnoJFZ#W(wp?mFwC z#hd)=jA}IQW4wmUV2NPe1GxFDvPplQ@vgbQ3!(-axS4F2kPX90{lJE8kkS~kmy@Wk zUZ_>7Ij!fKW;s=qJO}pH%WemGz!f)NVi+tA@ay8Kt`(OLj^+v;i+LY69G$I;c%K0z zX#QHBVI&s@!Y1hYKc7g^B^eH(ZE`lAyUecN_&*$-)-$?TA7532%=*V602C_}c_zUD_3&{BS)ER?nPr2ncO& zOo$+=)~=;1Muh#|+(=-_aPixFNf|US7^IS)wP%ZPFJ9WCgqMb9L_ymsC`yo7>`< z(qoxI+(y*2L9*GGRhONnQi7erQq5J|Ki|`eGuGUifkF$exBAB~TRaBz6~g;~F`_Co)+9PXBGgP%;DKUJe5 zu>f`^_ig=&+Z-2X%{%$fp>aH}sKgV*mV4xuJNO1yQoCPsdfXhntm|%5j(CiCj_gN> zm9JTB`RW=Q^>-GC12HFk{Wt%dx}CWiZD`K_`8!~PT+h_TIgFUl%%P?`MA~?>sJ76K z@akPhUg}_3(F&9TEOXlw2Vn)Jl6fx4=HW&4_Fh;q^6PAG;p|1;j76TEiKVfXe2K&3 zEHxJY+Vnx?TfG{J_G{IHTy~WPTVzABcaTlNsc2^e@o`LFU>$xrpKcl-g6qF8O=hyt z%6ZojgWi*Y+8U?WR0=JD$S>mfu$2)U5u80sX_holn&!N$OKLS zj~wjnH=bVxTk1jH&9>ImDyC?@TEvJ_m_QSTC#{ ziO@WTivp$d4>}7>0r4XO0$`>-{>CG0=rLuxbYk`I-7*QBo6E`OLN7b^FzSnI-I)3- z;u_WM!^}Txi#U|F@3rK>Y%EX{JER3E+BUQ`BZ2Ki`7UaXWE|Bx+*JA8$R#eqr+L*F zh%OFqd`{w$JEG+55^^1T#aN{=J&_0nTb`grEVE{r7qjm;OPf2p_*ALi?x<~hh|vxLjaUY{!dX%W<7i%wx(I(QEo9x5G=pcNWaO6|dd z0J5v?nnm+Z&yi-Gs`amEsZ})W*tRWtiC&!MZ1qOkRk68ZO%aXPp_5k;1+s;pO~T{gp~D(PjnH zUd?$$)J^6g2~MO%>di!?;p+kaEffsg+1U%SIF+s_pxW3zD?j&KX${OG?d>(CHpz=` zP$rsVxA`Fq9W&qs%dK|ZEnFJBC(F+5E?91Jh`($-s2ix5HTtAJ2E(ifW ze*V>!8@KB}-T8;Y(&i6(_J5HgxA6!F3P7UZO*P0om}H2|V{vlP!1p!kA9!!Mzq%Mt z%~qOtF4Oy?k?Y6tqkbS3FOpZsGg$XPy|{9I>s1< zGayY=u!=TxL(lgxiD!@^X#1BU#yXNg3Z`s-rf>Qd1d8_I)uYmE5`Dev zpD^?(MTD-lAp%ir@&Y$d=Der5J}832a%fLz9~;uGVwQ-C)*IX*sh6u`k>TMat}U8i zj=G|JAp6v5cXAUxAdjpYJl_ z@Z67R@c`2DyN#d*A6qpx%~{-_5-&fc3ZRgsgn0|fr_{WsG`O>FtpwgB<)61lybrvM zG!NrV^1X4TqN|DsG;=>uP4UPR8>a{#?9mIYr#&n802ZKx|Y4lbiUP%1^m36N#79*muJ<%d8 z?1DUoPq?@r=2?-D8rn61`9Ndd{tVp|f*jTkpQ8>0v$h${?E4Vq76lVC41g(1Wo|?p^{W0CSVNl5D zucI&Wa^Iv$i;dA|VNYuve?aq7!Hg?PWmY7r;DEdRRkfY#G5+TJ&PHcNR|kBW+qMS``0#f|0U ze1#iSSaJR8^CFv2v~oRmQO4+n&NRyZOnttbK;wzoHfzooRf&Bky;tdf|k+>@hac*;t$@w8Q@(r&XMhF&^h3mF4#L73c`lRZ8qW zlvq0@sAuLnRUCOl@?d4MORRjJi6Aoir=mC!<&Qy9O4nb*SM;o=J~1R-GtjYMb-zU? z4>;SzX`ZHaLS}{h&c96q!Bi4|Ia5D3p~FE9Wy4T&bQi3=uJM5Tp_{Q;f`!oQ%IK_- zkjA0#-IzuVDTRB-0HvjptNcu@V&{e)Gla(w%MHhN*Pl z!au6?|G0_RTJMCkiaB6zI+ti=Z!4{WrqRd++w#AyU!@Kc524dJvCf;5N3RIP=F9Rz z(tY()K4i8OCh9-82I63t(DZmB7MymUoNl|K=D3_M0sh7tpL2~QUM$mLOd%fom#NON zdXz#G00qnic7Pc>Iw`@Sqy=!!#WJw+JF}U6A2ey~JyguX#OZ#pGg@`r_3ihoxhfi7Ei8Mm)}G)%)?JahV}`^p~+zG}UTbam17a9YB$K>4%X8TNs6 zCfF`d%>MCtNwcg9Z+`>rtJZo&G#&XcekvKcaFz6mN5b6 z4aeQ04viXqSlecfa`Xs?1*GloS+2$G#;-ymi4;78jDlF5 zH>^S@SbYg(dXqFC*4;iy35L(qE#S%kN!)Yd>iq?6N$g!BG>3o9f?SKWU-C3WBET|% zSb2S#%6*h2JH6+F(=!< zQc2x^;FI+eGk@Z}bwC&%35uGP42m`=tem)e1Olb{{Q<_*YZyY_sSt&5ji!8@M0>mhgjo1sWma0ix|rBf3zdffbQ|2!=S9j>rb5h5NylEf-@s z7rO?&PdU<-U%|Yln18LD9t%-Xlb=dP!XQ=93>NTl{tW$0b%|9F6*gX`flNNrN`JOx zAw3o>%)EgfX@WHDfUr_vzxnHR@H;kc{14S!{ykw~{;a8B(|u1gLz75=z|XhlD6L;m z;O#xKHao80xa<9SS-w8a^Z^m4=7_KoRS>v`237r{C4+IV`t z@2uKU*WWZY_{lh>RnAFX(e3U20@IRA%gC#p*lpteBaxiL0R(T%tF3Uobza!>#a6ZJ z4*ZgnWy|}Fi<3#Jpxt$%JCqU^EryKc0C$9xcB)r9QbKE6bMNL@4vMI#EC~^nb0nWQ zecH`GL0fD7lv`XoOj(5&z3`i&9xN<@(7V5ACezoaPWMso>H?GR#COJdLPG5C&ppr* zJgqk6?-3HyDK*YFF|Ei6-$!X$O+c$L?9h zG!IUoN2c&t{nkV9`^@=Xu+o*)Z%tkw^wGys$$=tWcwv~!7K^BklphX*Rm|w8`@jqP zb#IjZCXIbK+=^_nO(gHcA2inJ{6N7wGRcthRP0QF_P0IL${?{_zx{jo>5W1 zgl&hqRSZYj(`zBRu9})*!9eY@EZ3vZmYPpN?+JzB6Z(ibI>@e0ck`Ij zE0?#kxO27x1AyEKcpRk3*5CN_8PsOHzD~DU7>MxtD^Bq`{tnc$L6kp?|8Q^&OrLI= z{@mW|4?9|taJh?>?J=M1V~#}?Qa$^%efSmLsa%5Lb)k2!mkjFzQmcZHHq*6&tRI%h zaRlKKyJVTfS0!OTb^Zuar)C)goQI|_R9%nTjJfV2A1b=gO@DgS>^Xipsp0Kep(3#l z^|BuLOb1Io$nQIP^Jb7N^SpP-$myqrB(|HDtj0M2Lz{`U_>{7wtL!;ERVX_ea2jZ1T}9S<~PpIW<^XvDI|M z>Pg=dI|p0|tACi0bRTiI@)4c|@) z)KYEF+cDl5p_DA2(;;!lJy?^Xw7L-(FNy{333Rh0y2EOqZx;SCahP{6Hp)@4dyUx%kowj{cy2-0 z?k@*x+0B$s1eO!ZafCWCQIR|lnd7I*jj7GXec-LMIKuJ0-V$cseQw)Ji6{Cm1>*SAig4vD070@u+m4i5dqqNmd7WEM*d9^DZj6Mr8$A%2DN zzwV8Oy6XX(c0=sX#-VlQRweZ7Yf~|_IzuRX*gWNAAUUW*X088NC+jrM32J|I-ER*{ z@vll``G$ZpfLK-p8$%b4>8rcQ4fI+g6OU>tQeqio(EL>rFN80PdEZ~NTp1MlzPJ#w*XOOP-ow3LU zU)mqXRU-)IXzJ`m9+6j6yIF)O!~HYQEk&ohbKTibW;EEga#Bt@$B`SVb-ZJl-d#=@hIuA3yk->3@yC`A62s@st_FdoaS6*n7%?5T6wyuTZ*(6i(c3{fEp^p9fa^Gb ztMp)Mn${WYVGHB)6pbAfvx%{c{X8|Gz#!C~k$@L3I4&~7WAn8L-xT>0L#aQUJUO|! zGxdK?Je`Fyt5y9nhI3&^&~J9u^i2@Kb6pngo5ooLH@FHE`wQ#kA3mGK6?^0x8hHw@ z>~-nG!szH@5#of$MUr$`+_HV?TAUx@{8(#8OJ{!8QdND!5zDXNG3O9mMAPPmlTh&x z=paZ&HKf2ifI6vGw=l`Skjl0ktC{1E(sAYtv3_~hC!3Qek@wX`(%3%9l(}4Z&-Flc zA$m>>HB&dCkUk}=#?F{r%dub#RntX5?n^z76^<+!jSO<#TWWFn=jl1)u|0G=Q>jV# z@~H3RpL12EK@2&ClZ8cDvgha>>*64NCKe)@b;Aiu=A|x+TcyQX_HZlthNtu3O6uhG{5*>m&$o_?( z6C?ld>AX(iT%K^ZkFHX(w7!PO+ZabT%J3%?R-cQvKQ6^8QL76d*bEx7cbsVUbYid> z|9$k)PKCfXUVS<-3nf*bm$HWEGaDlFINNzEE)IXbH;D#yvaIZS&g<5u zA|jL&2a}oyZeVzL8;D&$0W;%YTlwPcKD#bc4> z^3lLECp*dY-}Y~W)-9K9abvRKhkG_3A;|dEoB29a28u`ePihCh-5D8IB1`wLZ&uPd z(aDGej3KU#X;SF65aqGfyi1i=WC0pjD_Kz@eZkl?ObcD^#9GG_`R|gQ9kxi4Tu+{F zJWH6bk?;`#vE6foC4yQ<^5>1oJMa<8^moQK%yr&t!Q1dI{Qdbb z3~?GLM0BnN&kxpNtnjDsQl(8*&eE&4` zO*&RX`yvq1T%pygx&$fqBP*>s%($OLe-Pz%U zGAIi-RN$q{XzW4P(Ru>^6)F91O3%RaeTi+7L4F-EYSkJo!o48b6iIl-qArML*V*p) z?m`_WNUmKun5}UBw~!37Kc28XC=C`>ks3HZja@n6?o5yP37DUKDH9^ZZT0mg>kr1x zN%X_bf8H6{>LBoQ*Tr<~u0O`?%ZRrA;O5twr5==(S*hyid@Cj#S?m-Di$OD4JDYry zN6_5YxT=70)ZXbIs4Fr@X#kbFLg3<3xANVY6K=pMg?thC4lFh7=V(?z3HlR`$O(#} z%JOKQ%5kEWQ=Q>I-C!mr$jh1@WlPKB@9HsPVKa!T@JGjtoNz_{{7^b=DLp+F&g;8< zM@~5AR!vyM3+xs$bHkybj9$ex_GvA&sZ&eM1Gj6FKgJgj0z+64gc?UV4kF(=QP;-{ zhd$-^Por>PgOdOpeMYk90UP9Arod)2xVzIK%VC@@OUz@_LPphmYyKJvnPKyUz{+qb zDFwd2lZ2N-%|skns!)RLbhZSy4R(b5B_FXtvOhvp<%UR!hY9Y=cXi&O`k~&XKT-*s zb6+Z_Ge0!AVyzVE{N&`9dZqgG9lX2-Rm0pkBPaSNhV81IA+Ff(}6yySX z1}ciI?pZwESImrXaejY7-#(_JrqX;#nNc>l6ipVYJLS9qh=z>*WDK{n-*)hPmU!l| zxw7VRDnVYH!_+~qq+uKoy_%LDr9;;DH*+luGpo*Ds|>>?5q1PVl`g!Mv_z%#!+F8T zxJ5IC`>G zOU|k&gJ+C{k*hr*S}n%!4x;~Lg9vEb4H!_YNIWE_purMkyi393(ek+0vogW{eKXhO zx`Z0JvqsVS6+YhK1uC~P{pZhOAAX!G<1N3#^2>F|d+mLQ!UXN;BDjQX5zOKV{?}zY z2&@kK297%@>2%3L^qVgjp+_YPGlEtoG1oAot$~7?O_?Sy`Y)g@sWJ|cJ$Dc=8vV7F z-a4*}+A69qthZa{s!ZQ_NfAzA^Pm%7<{5;U?E693Z|2~K5S@`6h?cl<)cvWy6=f=_ zvgp&~3x3AaWY>3)XbP$2Z%#$MD8XQnw#Ox#+SAQlqYLFBwi+<2Ph1i9n}6O$;7hrjn@6a1 zdYO(yhQGP|K#fB-#cfOLSA%z-qT$PXH#aQ^7IsAzAN5;7L6b)&C`38din7EB4xk4i zVL!!OUs{*m0^@{m9NjL``v2zsUd#L-(p=^K=5}8gP20*nG=OKH#P@px#4VaOHRI+Z zk4^nq^JXWe?=;P2iHv!f2c&{^2LHbwA&ezgAjkk=_IbbR_db{f7L@ABfaA_3G*`MJOJI^b|i)K{yvUwI8$GeQ3Yr=jSZLT~a09fn zx;rM{=;$hWV>GrXe?Y7>(b=F2l z4`fv@!6u9E?%U}Zc2i4C%*@`6Z~gCXo2QIlzD7M$h7^9lRg|ytl~3=|(bT zOZoOM#7m(63vANC&)30tTUoSaH&-dU=+gV)qbxc~U4rje2JXo;7@}#bV`U=hdU%{D z3i%Z;w4t1JN>h1@q#Wtwjc;=JU&Y<&9Q-7=BgEX`r(=sG-04RCU>|KBs$GHHGKB{f z7(DkW?jD|c`7h&+t9q>JnN;>x{DDPEuVVTZD#X_Pkm^D32w!F4kL}rWG^)TcVnd&1 z{#P5ZQBhHpC@an|%ri6L;u#sCI_r;RQ3Cx2hL`CKV4S7^s=SrP!jnWYw3!=!LU*4I zDB#jkxWb5A&ZIqk%h~iCznd)GYQgcT@P88U>^%xwKaQWqY{Y`6Ew-U+Qm3kVul;PQpPQ1BMgt(eiLb z?g8V!aw&w`_(ndpqTZf+nJtW1=sIY-w#pUm;&M=?iuL5>vOy6X@(U&GY5QQFgE!}n zYt%fvgx%8(!~>lq{@1ODJLn5CdSqo%s?W5zCw-k_<~HiKL%YwVWc(K?I@_;(JKj=c zg=@K09qa$7EQ1X!z2$0U7OIbyU%TDFxj^G_4eq}+wLNx)bt3Wl*4x#;?oIh zgs%GVv@DOouK7W_`4L?ph?X-|Op&BKmNqB{>Y zj^Y#|8!vnKXJX9L+7w=$LGtvkgMj#9i)%x(xcJ@KgCjoAqRR;RSj3`eQ;b`-gIUVloA>yF8=c&nu| zs{i;M=5UNJYS?s7UwO9~H7a0FUF9FY!%wzphl@|z&!&0I;~z{DWj?UE2AX#>mF2^z zk<>(YKS8%J%T`gl;=JEzmOqM9(4eV(wTa)w2T&{S0NP z+cjL9tkc6r2k8bU&wL^B^nUE@rrxEELNLB>-*TeX57z<=DOH4X1l?lh+A?OaJx_Qw zsd&JIpr#WFf=<8Ap8Xd$NVWA}&SV<8u1h&d5lj*A;bV#2+C5cdE8U~}zmFbR3v0(K z77u1a$#EVg5E$S#n;1ObzP*;4m++)mbECr6-ax*-KDfy& z)uty&=ZAtt@fi?eE3Ic^!D2j6j&+6;bM{2g>gkv5`KAG1zqZT8y=JxZvqH*3ieE2p9E0I!=DU{fdMJ8`a zGz1Yl8R7$mTeXX}fXXW_Esgvn0bp%9!%-2r{`@CJb6=;>Ax`nCuO4@KNU5<^!jIp_ zY)x|ckmbDpC0(xD;A-sqZiNE>Pcr9>tWZgVwVH`srDm!0L+DIx+1(*VJM%e*v-$2Y z4$j0aeGE+>TfwRQn>%LhKYoM;Uf9z)Q=~8e8kPVsgW1{HS9Emx9zoB_EpQh+tY)p8 zm+TQfe@^PvCm%XRgt#)hwA*33m8&GcbqWhR&CU7de3-!>n`$KSo(mFf6c z^CQHp0SX5C#BmV#+lxcv(O**Grhn~z!^ z>iJb0vgy{((t-Rb!;~h2kifMM`qYzBWi-dB%CH+&V%|o2KRkjP{YwjrPKWiK z(f->9LKX&F*#Ne-9$Xb6BSV1X|M!}cbKES0MkbO7@a{RJBS>6&*9~gz|MmbVtG;KT$nIl7);^gc4NPBE*QqFJW zBc~NqE)QuH75t^b25i8Ln}~PcqdpHQ0LZcXt%-I}U z^LkU)(P>rm@x;6ISMAAO;nw0R^1QB1)b(4u8JDNP#Ti&%fPTF0UEUdGb1C>*`yQ(^@`u@d zMM9%{WgI?ls`4_a%4_KRGa7X`^AIlV>jNOFz$OY*+fpcy(bSxkOQ~8QjniwK^>qIY z+g|M?>~Ha}nT@-XJ6AvWt+Tt^Iqm6Q_1O3NMql%Q!Hywxu>^hu$DNu3F7Ag}#2{mT zam^3^x_%Gq{U!r(_)6>D+v~%cl+KJdL6}G-gVZ>>_?;Mj>B58QP35*XEck-;F0a#5 zO^HBF>`v{7ZkTC~{&urg_m49pv#z$sx9HHW!+5fB%eL znab{9^MTm`WNQgiOfWNpRn* zs(R$}`$o}FR|UCxw}4j2q2yCg&t^!EPAd-C5_kRD+RF9zV1sQ#)18A5K6$%skV*f5 zp?>-M@Zf+bvChaVH_n*wDBu$sO!_%P6(f(DIYE>+PF4uS$;;kmnhPkL(FO&z6_@Od z3VlMyewGg*0S#gum<%ik#zgkO`NTv;9U~v*mm{rX?D(&7+%-_&grdnUF)rWyE(&}? ze+2nblpm|E>cR^((0l)ON$zbz*%YVyPi`G5NiCyc9JCe~%nC+cT$-H^1qWJ_8)}l4 zEd?Ezofy~#@{kKFwFiR`2V9713+`PVAWnybg=K+x z>c9^k7V-RvoBfH2H^d#Cos))E{Wb0|(= zWY0&|1q1{75pRlS0MXb2(q)$6z2$DVSnneJ{(YRo+0Llr<^E)0;znYHE zFuuDwNiPix4Gjmj01_~v{l@9G;i!3@h|fNA*b^Me2>|mSix1CaOols`A3gsf6WKML zYkr$oOc$Cp2Qq+R&&vg;sF)u=K194hOP{0QMbCnEV|GSllUV9aGTQ2joI?VG5l}Gg z4`$eJ&iA+7Ss58ao+1GV5HhQ*00VuZP%A3Mw!Rmp-{Ny092sc}B)s_l8a{PCC*iS{ z1>KNj0T-t2;f&IMTQ`6QZ3f;EdCVOh9X;EhE?w{)2N?P*Ypm!WKS(Ar;NBnVLWa_X z6@Z|@e5sKikiV&EXtL;jklO#eaYC(DjUZL^e5yj$q_cxDpa>n#;A=sExOM~PlO-J? zl!4S?rmx6*RX6f#MfW96b6Z01A+_(HS z3-@km7?9F~78Z2Z*4O<-b5DA+75yDJ9)m%aBn#+n_= zPC#kmkpH*s+qZA20xo^yroPVmQy6|vt#*M%p?pmZ)6;`eR7CHNqP%o}ygFImtZo7& zFMh5$_x+}>eEF>P(;Pkce+?PjLJfD(#Ey=R=$0@nP-s^v1@U;j7;OVUl^!3RnyTpN z=vYP80D=PqcTxl?uLr!VvNGn!8r$NDa53L&PZnSh*#_766b8<_V@Q5jqIWN9<_}Q^ z9-dYj{DxWc_e^W%cgJ$j08ISz@ycHa7(4LTF7!N+^0!35;b!1cfu7?pY$*_fbO-c$ zFe+=kH24!^pH?fHJb5iFEGB2h_C|qqLEVH~e06&*%086z#RDjX?TKsBL}(YxarW`? z@g|_8wVco%3UM0}+SwHKYM>_s9oz(qPD=RLIN5Ao==}Xg#$%_sCJ&}n>I#UBI&~j@=#I`jAE#U+{7YY zwQzABPtgB#8;J32xk-BIqHPVk%^X*jT9)+Fb=?3fh}Zr3H23lqj&iz?1v7*QMS$ls0n-6it?Hu$w<~qFz__Sz4v~VDH&P{&%CAd5paAU8lo List[Rule]: diff --git a/suprb/optimizer/rule/ns/novelty_calculation.py b/suprb/optimizer/rule/ns/novelty_calculation.py index 4170cc3a..21285062 100644 --- a/suprb/optimizer/rule/ns/novelty_calculation.py +++ b/suprb/optimizer/rule/ns/novelty_calculation.py @@ -34,10 +34,9 @@ def _novelty_score(self, rules: list[Rule]) -> list[Rule]: rule.distances_ = [] for archive_rule in archive: - #TODO: check if this works - - if not hasattr(archive_rule, 'distances_'): + if not hasattr(archive_rule, 'distances_'): #Was a problem with MOO-RD with novelty archive_rule.distances_ = [] + hamming_distance = hamming(rule.match_set_, archive_rule.match_set_) archive_rule.distances_.append(hamming_distance) rule.distances_.append(hamming_distance) diff --git a/suprb/optimizer/rule/nsga2/nsga2.py b/suprb/optimizer/rule/nsga2/nsga2.py index 7160be05..d1612168 100644 --- a/suprb/optimizer/rule/nsga2/nsga2.py +++ b/suprb/optimizer/rule/nsga2/nsga2.py @@ -22,8 +22,37 @@ class NSGA2(MultiRuleDiscovery): """ - Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. - Uses Crowding Distance and NonDominatedSorting from pymoo package. + Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II + by Kalyanmoy Deb et al.. + + This class implements a multi-objective evolutionary algorithm for + rule discovery. It uses pymoo's fast nondominated sorting and crowding + distance operators, and serves as a base class for multi-objective + optimization in MOO-RD. + + Parameters + ---------- + n_iter : int + Number of evolutionary iterations. + mu : int + Population size + lmbda : int + Number of children sampled each generation. + origin_generation : RuleOriginGeneration + init : RuleInit + mutation : RuleMutation + constraint : RuleConstraint + acceptance : RuleAcceptance + random_state : int or None + n_jobs : int + fitness_objs : list, optional + List of fitness objectives + Defaults to [rule.error_, -rule.volume_]. + fitness_objs_labels : list of str, optional + Names corresponding to the objective functions. + Defaults to ["obj_0", "obj_1", ...]. + profile : bool, default=False + If True, wraps the optimization loop in a profiler and prints stats. """ def __init__( self, @@ -61,7 +90,6 @@ def __init__( lambda r: -r.volume_, ] - # Change fitness objectives List to tuple avoid accidental changes. # Extra objectives in subclasses are added during runtime to avoid sklearn.clone errors. self.fitness_objs: Tuple[Callable[[Rule], float], ...] = tuple(fitness_objs) @@ -81,8 +109,8 @@ def _optimize( if profiler: profiler.enable() + # Generate initial population. population = [] - origins = self.origin_generation( n_rules=self.mu, X=X, @@ -96,37 +124,44 @@ def _optimize( delayed(self._init_valid_origin)(origin, X, y, random_state) for origin in origins ) - population = [p for p in population if p is not None] + # Main loop. for _ in range(self.n_iter): + # Select parents and generate children. parents = random_state.choice(population, size=self.lmbda, replace=True) - children = Parallel(n_jobs=self.n_jobs)( delayed(self._generate_valid_child)(parent, X, y, random_state) for parent in parents ) - children = [c for c in children if c is not None] + # Combine current population and children (mu + lmbda), then nondominated sorting into fronts. population_combined = population + children - pareto_fronts = self._fast_nondominated_sort(population_combined) - population = self._build_next_population(pareto_fronts) #assigns crowding distance + population = self._build_next_population(pareto_fronts) #asigns crowding distance, build next population of size mu. + # The nondominated set. pareto_front = pareto_fronts[0] if pareto_fronts else [] + if profiler: profiler.disable() stats = pstats.Stats(profiler).sort_stats("cumtime") stats.print_stats(20) + # Visualize the objective space distribution for the chosen fitness objectives. Is intended for the isolated experiments. + # Comment out if not run in isolation or for more than one iteration. #visualize_pareto_front(self, pareto_front) + return pareto_front # ──────────────────────────────────────────────────────────────────── # Helper Functions # ──────────────────────────────────────────────────────────────────── def _fast_nondominated_sort(self, population: List[Rule]) -> List[List[Rule]]: + """ + Sorts population into fronts using pymoo's fast nondominated sort. + """ if not population: return [] objs = self._fitness_objs_runtime() @@ -143,6 +178,9 @@ def _assign_crowding_distance( front: List[Rule], cd_func, ): + """ + Calculate crowding distance using pymoo's crowding distance function. + """ if not front: return @@ -150,6 +188,7 @@ def _assign_crowding_distance( obj_matrix = np.vstack( [[obj(rule) for obj in objs] for rule in front] ) + crowding_distances = cd_func.do(obj_matrix) for rule, dist in zip(front, crowding_distances): @@ -182,6 +221,10 @@ def _build_next_population( self, pareto_fronts, ): + """ + Add fronts starting from F_0 until population limit mu is reached. + Last front is truncated if necessary and the population then is extended by the individuals with the highest crowding distance. + """ population_new = [] cd_func = FunctionalDiversity(calc_crowding_distance, filter_out_duplicates=True) @@ -199,8 +242,15 @@ def _build_next_population( def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: + """ + Used in the subclasses to add the secondary objective at runtime. + If set otherwise, the objectives generate a sklearn error. + """ return list(self.fitness_objs) def _fitness_labels_runtime(self) -> List[str]: - return list(self.fitness_objs_labels) \ No newline at end of file + """ + Returns list of all fitness objectives used. + """ + return list(self.fitness_objs_labels) diff --git a/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py index 2d094039..59870b3f 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py +++ b/suprb/optimizer/rule/nsga2/nsga2_global_novelty.py @@ -27,7 +27,7 @@ class NSGA2GlobalNovelty(NSGA2): Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. Uses Crowding Distance and NonDominatedSorting from pymoo package. Uses novelty as a fitness objective. - TODO Deprecated! + Not optimized. Deprecated. """ def __init__( self, diff --git a/suprb/optimizer/rule/nsga2/nsga2_helpers.py b/suprb/optimizer/rule/nsga2/nsga2_helpers.py index f07fcbfb..600e559a 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_helpers.py +++ b/suprb/optimizer/rule/nsga2/nsga2_helpers.py @@ -4,6 +4,9 @@ from datetime import datetime def visualize_pareto_front(self, pareto_front: List, save_path: str = "Objective_Space_Distribution") -> None: + """ + Generates PDF of the objective space distribution of the input list of rules. + """ if not pareto_front: print("No Pareto front provided for visualization.") return @@ -15,13 +18,12 @@ def visualize_pareto_front(self, pareto_front: List, save_path: str = "Objective print(f"Expected exactly 2 objectives, found {len(objs)}. Skipping plot.") return - # Compute objective matrix obj_matrix = np.array([[objs[0](r), objs[1](r)] for r in pareto_front]) plt.rcParams["font.family"] = "serif" plt.rcParams["font.serif"] = ["Times New Roman", "Times", "DejaVu Serif"] plt.rcParams["mathtext.fontset"] = "cm" - plt.rcParams["pdf.fonttype"] = 42 # Keep text as selectable TrueType + plt.rcParams["pdf.fonttype"] = 42 plt.rcParams["ps.fonttype"] = 42 plt.rcParams["svg.fonttype"] = "none" diff --git a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py index 8f11e38a..24979e12 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py +++ b/suprb/optimizer/rule/nsga2/nsga2_novelty_G_P.py @@ -29,10 +29,48 @@ class NSGA2Novelty_G_P(NSGA2): """ - NSGA-II variant that adds novelty as an objective and supports restart logic: + MOO-RD variant that adds novelty as an objective and supports restart logic: If a run's Pareto front only contains trivial rules (e.g., experience == 1), the algorithm restarts and accumulates only 'useful' rules until `mu` useful - rules are collected or a restart cap is hit. + rules are collected or the restart limit is hit. + + Parameters + ---------- + n_iter : int + Number of evolutionary iterations. + mu : int + Population size + lmbda : int + Number of children sampled each generation. + origin_generation : RuleOriginGeneration + init : RuleInit + mutation : RuleMutation + constraint : RuleConstraint + acceptance : RuleAcceptance + random_state : int or None + n_jobs : int + fitness_objs : list, optional + List of fitness objectives + Defaults to [rule.error_, -rule.volume_]. + Variance reduction objective is added internally. + fitness_objs_labels : list of str, optional + Names corresponding to the objective functions. + Defaults to ["obj_0", "obj_1", ...]. + novelty_calc: NoveltyCalculation + Class to calculate the novelty score based on NoveltySearchType, Archive and k_neigbor. + novelty_mode: Literal + Either 'P' or 'G'. + In 'P' mode, only the current cohort is used for novelty score calculation. + In 'G' mode, the current cohort and a local archive is used for novelty score calculation. + Defaults to 'P'. + profile : bool, default=False + If True, wraps the optimization loop in a profiler and prints stats. + min_experience: int + Threshold used to determine whether a rule is trivial. + max_restarts: int + Restart limit. + keep_archive_across_restarts: bool + Determines whether in novelty mode = 'G' the local archive is kept across restarts. """ def __init__( @@ -92,14 +130,18 @@ def __init__( self._archive_seen_ids: Set[int] = set() - # ──────────────────────────────────────────────────────────────── - # Novelty scoring - # ──────────────────────────────────────────────────────────────── def _score_novelty(self, rules: List[Rule], cohort: Optional[List[Rule]] = None, force: bool = False, ) -> None: + """ + Compute novelty scores for the given rules. + Selects only unscored rules (unless forced), + builds a reference archive based on the configured novelty mode ('G' or 'P'), + caps the archive size, + and delegates scoring to the novelty calculator. + """ if not rules: return @@ -124,7 +166,7 @@ def _score_novelty(self, EXTRA_MAX = 256 extra_slice = extra[-EXTRA_MAX:] if len(extra) > EXTRA_MAX else extra ref.extend(copy.copy(r) for r in extra_slice) - #novelty_mode = "P" + #novelty_mode = 'P' else: ref = [copy.copy(r) for r in cohort] if cohort else [copy.copy(r) for r in rules] @@ -133,9 +175,9 @@ def _score_novelty(self, _ = self.novelty_calc(to_score) - # ──────────────────────────────────────────────────────────────── - # Helpers for restart logic - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Helpers for restart logic +# ──────────────────────────────────────────────────────────────── def _is_useful(self, r: Rule) -> bool: """Define 'useful' rules here.""" return getattr(r, "experience_", 0) >= self.min_experience @@ -148,10 +190,6 @@ def _unique_extend(self, base: List[Rule], new_rules: List[Rule]) -> None: seen.add(id(r)) - - # ──────────────────────────────────────────────────────────────── - # One full NSGA-II run: returns a Pareto front - # ──────────────────────────────────────────────────────────────── def _run_once( self, X: np.ndarray, @@ -170,7 +208,7 @@ def _run_once( X=X, y=y, pool=self.pool_, - elitist=self.elitist_, # will be non-None if your init.model trained successfully + elitist=self.elitist_, random_state=random_state, ) @@ -220,9 +258,7 @@ def _run_once( return pareto_front - # ──────────────────────────────────────────────────────────────── - # Running until `mu` useful rules are collected or max_restarts is hit - # ──────────────────────────────────────────────────────────────── + def _optimize( self, X: np.ndarray, @@ -269,9 +305,9 @@ def _optimize( print(f"Iterations needed to generate mu useful rules: {restarts + 1}") return useful_rules if useful_rules else (pareto_front or None) - # ──────────────────────────────────────────────────────────────── - # Helper functions - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Helper functions +# ──────────────────────────────────────────────────────────────── def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._novelty_obj] diff --git a/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py index 97714509..f1a62a85 100644 --- a/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py +++ b/suprb/optimizer/rule/nsga2/nsga2_var_reduc.py @@ -16,8 +16,35 @@ class NSGA2VarianceReduction(NSGA2): """ - NSGA-II variant using rule error and variance reduction (regression-style information gain) - as optimization objectives. + MOO-RD variant using rule error and variance reduction (regression-style information gain) + as fitness objectives. + Created because, + theoretically, the information gain version should not work for regression tasks. + + Parameters + ---------- + n_iter : int + Number of evolutionary iterations. + mu : int + Population size + lmbda : int + Number of children sampled each generation. + origin_generation : RuleOriginGeneration + init : RuleInit + mutation : RuleMutation + constraint : RuleConstraint + acceptance : RuleAcceptance + random_state : int or None + n_jobs : int + fitness_objs : list, optional + List of fitness objectives + Defaults to [rule.error_, -rule.volume_]. + Variance reduction objective is added internally. + fitness_objs_labels : list of str, optional + Names corresponding to the objective functions. + Defaults to ["obj_0", "obj_1", ...]. + profile : bool, default=False + If True, wraps the optimization loop in a profiler and prints stats. """ def __init__( @@ -52,9 +79,7 @@ def __init__( profile=profile, ) - # ──────────────────────────────────────────────────────────────── - # Main optimization entry - # ──────────────────────────────────────────────────────────────── + def _optimize(self, X: np.ndarray, y: np.ndarray, random_state: RandomState): self._var_y = np.var(y) @@ -65,9 +90,9 @@ def _optimize(self, X: np.ndarray, y: np.ndarray, random_state: RandomState): return super()._optimize(X, y, random_state) - # ──────────────────────────────────────────────────────────────── - # Variance Reduction Helpers - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Variance Reduction Helpers +# ──────────────────────────────────────────────────────────────── @staticmethod def _variance_reduction(mask: np.ndarray, y: np.ndarray, var_y: float) -> float: """ @@ -84,9 +109,9 @@ def _variance_reduction(mask: np.ndarray, y: np.ndarray, var_y: float) -> float: var_not_match = np.var(y[~mask]) if np.any(~mask) else 0.0 return var_y - (p * var_match + (1.0 - p) * var_not_match) - # ──────────────────────────────────────────────────────────────── - # Helper functions - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Helper functions +# ──────────────────────────────────────────────────────────────── def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._varred_obj] diff --git a/suprb/optimizer/rule/nsga2/nsga2ig.py b/suprb/optimizer/rule/nsga2/nsga2ig.py index d74cb04a..5c191907 100644 --- a/suprb/optimizer/rule/nsga2/nsga2ig.py +++ b/suprb/optimizer/rule/nsga2/nsga2ig.py @@ -15,8 +15,33 @@ class NSGA2InfoGain(NSGA2): """ - NSGA2 with error and information gain as objectives. - TODO: Better Description + MOO-RD with rule error and information gain as fitness objectives. + Information gain objective based on Shannon entropy. + + Parameters + ---------- + n_iter : int + Number of evolutionary iterations. + mu : int + Population size + lmbda : int + Number of children sampled each generation. + origin_generation : RuleOriginGeneration + init : RuleInit + mutation : RuleMutation + constraint : RuleConstraint + acceptance : RuleAcceptance + random_state : int or None + n_jobs : int + fitness_objs : list, optional + List of fitness objectives + Defaults to [rule.error_, -rule.volume_]. + Information gain objective is added internally. + fitness_objs_labels : list of str, optional + Names corresponding to the objective functions. + Defaults to ["obj_0", "obj_1", ...]. + profile : bool, default=False + If True, wraps the optimization loop in a profiler and prints stats. """ def __init__( self, @@ -57,7 +82,7 @@ def _optimize( y: np.ndarray, random_state: RandomState ): - # Bind dataset for the IG objective + # Bind dataset for the IG objective. self._X_ref = X self._y_ref = y self._H_y = self._entropy(y) @@ -91,9 +116,9 @@ def _information_gain(mask: np.ndarray, y: np.ndarray, H_y: float) -> float: H_nm = NSGA2InfoGain._entropy(y[~mask]) return H_y - (p * H_m + (1.0 - p) * H_nm) - # ──────────────────────────────────────────────────────────────── - # Helper functions - # ──────────────────────────────────────────────────────────────── +# ──────────────────────────────────────────────────────────────── +# Helper functions +# ──────────────────────────────────────────────────────────────── def _fitness_objs_runtime(self) -> List[Callable[[Rule], float]]: return list(self.fitness_objs) + [self._infogain_obj] diff --git a/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py b/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py index 43a6b391..35a006c4 100644 --- a/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py +++ b/suprb/optimizer/rule/nsga2/pymoo/pymoo_mutation.py @@ -5,6 +5,10 @@ from suprb.optimizer.rule.constraint import RuleConstraint class PymooRuleMutation(Mutation): + """ + Wrapper class for SupRB's mutation to work with pymoo. + Deprecated. + """ def __init__(self, initial_rule: Rule, mutation_operator: RuleMutation, constraint: RuleConstraint, X_train, y_train, random_state): super().__init__() self.initial_rule = initial_rule diff --git a/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py index faee12d7..b87f5949 100644 --- a/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py +++ b/suprb/optimizer/rule/nsga2/pymoo/pymoo_nsga2.py @@ -26,7 +26,8 @@ class PymooNSGA2(ParallelSingleRuleDiscovery): """ Adapted from: A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II by Kalyanmoy Deb et al. - This implementation is slower because repeated vectorization of the rule objects. + In the original plan for the MOO-RD was to use pymoo's precompiled algorithms. + This was slower in the end as repeated vectorization of the rule objects was necessary. Deprecated. """ def __init__( diff --git a/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py index 33dd5647..470999a5 100644 --- a/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py +++ b/suprb/optimizer/rule/nsga2/pymoo/rule_optimization_problem.py @@ -8,6 +8,10 @@ class RuleOptimizationProblem(Problem): + """ + Wrapper class for SupRB's optimization problem to work with pymoo. + Deprecated. + """ def __init__(self, rule: Rule, X: np.ndarray, y: np.ndarray, constraint: RuleConstraint): self.rule_template = rule self.X = X @@ -30,18 +34,14 @@ def __init__(self, rule: Rule, X: np.ndarray, y: np.ndarray, constraint: RuleCon def _evaluate(self, X, out, *args, **kwargs): F = [] for x in X: - # 1) build & inject the candidate vector rule = self.rule_template.clone().set_param_vector(x) - # 2) fit to produce new match.bounds, error_, experience_, etc. rule = rule.fit(self.X, self.y) if not rule.is_fitted_ or rule.experience_ == 0: F.append([np.inf, np.inf]) else: - # 3) now apply your constraint to the *fitted* bounds rule = self.constraint(rule) - # 4) record error & NEGATIVE volume F.append([rule.error_, -rule.volume_]) out["F"] = np.array(F) diff --git a/suprb/rule/base.py b/suprb/rule/base.py index 8d646790..81af6c8e 100644 --- a/suprb/rule/base.py +++ b/suprb/rule/base.py @@ -105,11 +105,18 @@ def clone(self, **kwargs) -> Rule: def _more_str_attributes(self) -> dict: return {"experience": self.experience_} - + def get_param_vector(self) -> np.array: + """ + Returns rule parameter vector. + Created for MOO-RD with pymoo's precompiled algorithms. + """ return self.match.get_param_vector() def set_param_vector(self, x:np.array) -> Rule: + """ + Sets rule parameter vector. + """ rule = self.clone() rule.match.set_param_vector(x) return rule From d86fa3b0eba40209d74fecbe9abafe5e245b1935 Mon Sep 17 00:00:00 2001 From: vonproda Date: Mon, 17 Nov 2025 17:48:23 +0100 Subject: [PATCH 31/31] rework readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13cc3634..bdc113a9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,10 @@ -[![DOI](https://zenodo.org/badge/303331999.svg)](https://zenodo.org/badge/latestdoi/303331999) +[![DOI](https://zenodo.org/badge/303331999.svg)](https://zenodo.org/badge/latestdoi/303331999) \ +This project is a fork of the original SupRB repository (https://github.com/heidmic/suprb). +It extends the original work by adding multi-objective rule discovery (MOO-RD) using NSGA-II, developed as part of my bachelor’s thesis. \ +The experiments can be found in the suprb-experimentation repository (https://github.com/DavidvProeck/suprb-experimentation), +which builds upon the original experimentation (https://github.com/heidmic/suprb-experimentation). + +The source code of the proposed multi-objective rule discovery (MOO-RD) can be found here: **suprb/optimizer/rule/nsga2** # SupRB