diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..8387196 Binary files /dev/null and b/.DS_Store differ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/blis.iml b/.idea/blis.iml new file mode 100644 index 0000000..460d402 --- /dev/null +++ b/.idea/blis.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..13c3e30 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7bb9e36 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 1978b07..1296f64 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The first implementation utilizes numpy to compute the scattering moments and wr ## Installation Create a conda environment - +ss ~~~ conda create -n blis python=3.9` conda activate blis diff --git a/blis/__init__.py b/blis/__init__.py index 9d58929..53017f0 100644 --- a/blis/__init__.py +++ b/blis/__init__.py @@ -1,3 +1,3 @@ import os -DATA_DIR = os.path.join(os.path.dirname(__file__), '..', 'data') -LOG_DIR = os.path.join(os.path.dirname(__file__), '..', 'logs') \ No newline at end of file +DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') +LOG_DIR = os.path.join(os.path.dirname(__file__), 'logs') \ No newline at end of file diff --git a/blis/data/.DS_Store b/blis/data/.DS_Store new file mode 100644 index 0000000..da6d6f8 Binary files /dev/null and b/blis/data/.DS_Store differ diff --git a/blis/data/synthetic.py b/blis/data/synthetic.py index 41c7d4c..662e2cf 100644 --- a/blis/data/synthetic.py +++ b/blis/data/synthetic.py @@ -15,6 +15,9 @@ def synthetic_data_loader(seed, subdata_type, task_type, batch_size, transform=N label_path = os.path.join(DATA_DIR,"synthetic",subdata_type,task_type,"label.npy") graph_path = os.path.join(DATA_DIR,"synthetic",subdata_type,"adjacency_matrix.npy") signal_path = os.path.join(DATA_DIR,"synthetic",subdata_type,"graph_signals.npy") + + + #print(f'This is the label path {label_path}') # Load data X = np.load(signal_path, allow_pickle=True) @@ -65,7 +68,10 @@ def synthetic_scattering_data_loader(seed, subdata_type, task_type, batch_size=0 moments = [] for layer_path in layer_paths: + print(os.path.exists(layer_path)) + print(f'this is layer path {layer_path}') for moment in scattering_dict["moments"]: + print(f'monent is {moment}') moments.append(np.load(os.path.join(layer_path, "moment_{}.npy".format(moment)))) X = np.concatenate(moments,1) diff --git a/blis/models/GCN.py b/blis/models/GCN.py index 4e53057..5c4ba64 100644 --- a/blis/models/GCN.py +++ b/blis/models/GCN.py @@ -2,7 +2,7 @@ import torch.nn as nn import torch.nn.functional as F from torch_geometric.data import Data, DataLoader -from torch_geometric.nn import GCNConv +from torch_geometric.nn import GCNConv, global_mean_pool class GCN(nn.Module): def __init__(self, in_features,hidden_channels, num_classes): diff --git a/blis/models/GPS.py b/blis/models/GPS.py index 1f84f8e..e092aa6 100644 --- a/blis/models/GPS.py +++ b/blis/models/GPS.py @@ -11,11 +11,13 @@ Sequential, ) -from torch_geometric.nn import GINEConv, GPSConv, global_add_pool -#from torch_geometric.nn.attention import PerformerAttention +from torch_geometric.nn import GINEConv, GPSConv,GCN, global_add_pool,global_mean_pool +from torch_geometric.nn.attention import PerformerAttention +from torch_geometric.nn import GCNConv from typing import Any, Dict, Optional + class RedrawProjection: def __init__(self, model: torch.nn.Module, redraw_interval: Optional[int] = None): @@ -54,8 +56,7 @@ def __init__(self, in_features: int, channels: int, pe_dim: int, num_layers: int ReLU(), Linear(channels, channels), ) - conv = GPSConv(channels = channels, conv = GINEConv(nn), heads=4, - attn_dropout=attn_dropout) + conv = GPSConv(channels = channels, conv = GINEConv(nn), heads=4) self.convs.append(conv) self.mlp = Sequential( diff --git a/blis/models/scattering_transform.py b/blis/models/scattering_transform.py index e85a23c..d7c0441 100644 --- a/blis/models/scattering_transform.py +++ b/blis/models/scattering_transform.py @@ -2,13 +2,14 @@ from itertools import product import os +print('Started running the scattering transform file') def relu(x): return x * (x > 0) def reverse_relu(x): return relu(-x) -def scattering_transform(x, scattering_type, wavelets, num_layers, highest_moment, save_dir): +def scattering_transform(x, scattering_type, input_wavelets, num_layers, highest_moment, save_dir,wavelet_type): ''' Computes the graph scattering transform @@ -23,15 +24,25 @@ def scattering_transform(x, scattering_type, wavelets, num_layers, highest_momen raise ValueError("Invalid scattering type. Accepted values are 'blis' or 'modulus'.") if len(x.shape) == 3: - num_signals, N ,num_features = x.shape + num_signals, N ,num_features = x.shape if len(x.shape) == 2: - num_signals, N = x.shape + num_signals, N = x.shape num_features= 1 - - J = len(wavelets) - + + #print(f'this is x at the beginning : {x[0]}') + + print('The number of signals is', num_signals) + print('The number of features is', num_features) + print('The number of wavelets is', N) + print(f'this is the shape of x initially in scattering transform: {x.shape}') + + print(f'this is the shape of wavelets in scattering transform initially: {input_wavelets.shape}') + J = len(input_wavelets) + print(f'this is J = {J}') + # save the zero order scattering coefficients: zero_save_dir = os.path.join(save_dir, f'layer_0') + print(f'This is the zero save dir: {zero_save_dir}') if not os.path.exists(zero_save_dir): os.makedirs(zero_save_dir) for moment_ind in range(highest_moment): @@ -39,18 +50,19 @@ def scattering_transform(x, scattering_type, wavelets, num_layers, highest_momen coeffs_zero = np.zeros((num_signals, 1, num_features, highest_moment)) for moment in range(1, highest_moment + 1): - coeffs_zero[:, 0, :, moment-1] = np.sum(np.power(x, moment), axis = 1) + coeffs_zero[:, 0, :, moment-1] = np.sum(np.power(x, moment), axis = 1) np.save(full_path, coeffs_zero[:,:,:,moment_ind]) # num_layers is the LARGEST layer size # layer_num is the largest layer size within the loop - # layer is the layer number looping up to layer_num - + # layer is the layer number looping up to layer_num + for layer_num in range(1, num_layers+1): if save_dir is not None: layer_dir = os.path.join(save_dir, f'layer_{layer_num}') + print(f'this is the layer dir: {layer_dir}') if os.path.exists(layer_dir): # pass over this iteration of the for loop @@ -60,36 +72,62 @@ def scattering_transform(x, scattering_type, wavelets, num_layers, highest_momen if scattering_type == 'blis': combinations = list(product(range(J), [relu, reverse_relu], repeat = layer_num)) num_activation = 2 + print(f'this is the number of combinations: {len(combinations)}') else: combinations = list(product(range(J), [np.abs], repeat = layer_num)) num_activation = 1 # store the output coeffs = np.zeros((num_signals, (J*num_activation)**layer_num, num_features, highest_moment)) + print(f'This is the shape of coeffs: {coeffs.shape}') + for ind, comb in enumerate(combinations): - layer_out = x + print(f'this is the number of iterations: {ind+1} out of {len(combinations)}') + layer_out = x + #print(f'this is the shape of layer out: {layer_out.shape}') for layer in range(layer_num): wavelet_index = comb[layer * 2] + print(f'This is the wavelet index: {wavelet_index}') + #print(f'this is the shape of wavelets in scattering transform initially: {wavelets.shape}') activation = comb[layer * 2 + 1] - wavelet = wavelets[wavelet_index] - wavelet_transform = np.einsum('ik, nkf->nif', wavelet, layer_out) + print(f'This is the activation function: {activation}') + if wavelet_type == 'W2': + wavelet=input_wavelets[wavelet_index] + #wavelet_transform=input_wavelets + #print(f'this is the shape of wavelet in scattering transform: {wavelet.shape}') + #print(f'this is the shape of layer out right before einstein summation: {layer_out.shape}') + wavelet_transform=np.einsum('ik, nkf->nif', wavelet, layer_out) + print(f"this is the dimension of the wavelet transform:{wavelet_transform.shape}") + else: + wavelet = input_wavelets[wavelet_index] + #print(f'this is the shape of wavelet in scattering transform: {wavelet.shape}') + wavelet_transform = np.einsum('ik, nkf->nif', wavelet, layer_out) + #print(f'this is the shape of wavelet transform: {wavelet_transform.shape}') + layer_out = activation(wavelet_transform) - - # the scattering transform along one path has now been calculated for all signals - # layer_out has shape [num_signals, num_vertices, num_features] + print(f'this is the shape of layer out after transform: {layer_out.shape}') + + # the scattering transform along one path has now been calculated for all signals + # layer_out has shape [num_signals, num_vertices, num_features] for moment in range(1, highest_moment + 1): - coeffs[:, ind, :, moment-1] = np.sum(np.power(layer_out, moment), axis = 1) - + + print(moment) + print(f'this is the layer out dimension in moment: {layer_out.shape}') + coeffs[:, ind, :, moment-1] = np.sum(np.power(layer_out, moment), axis=1) + print(f'this is the shape of coeffs after moment: {coeffs.shape}') + + # all of the coeffs have been calculated for a given layer and number of moments # write them to memory - #create a directory for each layer + #create a directory for each layer if save_dir is not None: if not os.path.exists(layer_dir): os.makedirs(layer_dir) for moment_ind in range(highest_moment): full_path = os.path.join(layer_dir, f"moment_{moment_ind + 1}.npy") + print(f'This is the full path {full_path}') np.save(full_path, coeffs[:,:,:, moment_ind]) - #return coeffs + #return coeffs diff --git a/blis/models/torch_geo_blis_module.ipynb b/blis/models/torch_geo_blis_module.ipynb index 6240e35..874bea2 100644 --- a/blis/models/torch_geo_blis_module.ipynb +++ b/blis/models/torch_geo_blis_module.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -22,7 +22,14 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -357,7 +364,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -1847,9 +1854,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python (blis)", + "display_name": "base", "language": "python", - "name": "blis" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1861,7 +1868,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.12.4" }, "orig_nbformat": 4 }, diff --git a/blis/models/wavelets.py b/blis/models/wavelets.py index dc6af25..02d5ce6 100644 --- a/blis/models/wavelets.py +++ b/blis/models/wavelets.py @@ -24,6 +24,7 @@ def get_M(A: np.ndarray) -> np.ndarray: def get_W_2(A, largest_scale, low_pass_as_wavelet=False): P = get_P(A) + print(f'This is the shape of P in the get_W_2 {P.shape}') N = P.shape[0] powered_P = P if low_pass_as_wavelet: @@ -38,8 +39,82 @@ def get_W_2(A, largest_scale, low_pass_as_wavelet=False): low_pass = powered_P if low_pass_as_wavelet: wavelets[-1,:,:] = low_pass + print(f'This is the shape of wavelets in the get_W_2: {wavelets.shape}') return wavelets +def compute_W_2_transform(A, X, largest_scale, low_pass_as_wavelet=False): + if X.ndim == 2: + X = X[:, :, None] + + p, n, _ = X.shape + X=X.transpose(2,1,0) + print(f'this is n: {n}') + P = get_P(A) + m = A.shape[0] + print(f'This is the shape of P in the compute_W_2_transform: {P.shape}') + I = np.eye(m) + coeffs = [] + #C0 = np.zeros((m, p, 3)) + # for i in range(p): + # x_i = X[i, :, 0] + # print(f'this is the x_i: {x_i.shape}') + # C0[:, i, 0] = (I - P) @ x_i + print(f'this is the shape of X: {X.shape}') + print(f'this is the shape of I-P :{ (I - P).shape}') + C0=(I-P) @ X + + coeffs.append(C0) + a = C0.copy() + for j in range(1, largest_scale+1): + pow_val = 2 ** (j - 1) + prev = a.copy() + for _ in range(pow_val): + prev = P @ prev + curr = prev.copy() + for _ in range(pow_val): + curr = P @ curr + a = prev + curr + coeffs.append(a) + print(f'this is the shape of coeffs before the largest scale: {len(coeffs)}') + if low_pass_as_wavelet: + low_pass = a.copy() + for _ in range(2 ** (largest_scale - 1)): + low_pass = P @ low_pass + coeffs.append(low_pass) + coeffs_array = np.stack(coeffs, axis=0) + print(f'this is the shape of coeffs_array before transpose: {coeffs_array.shape}') + return coeffs_array.transpose(3,2,1,0) + + + + + +# def compute_c_terms_plus(P, x, J): +# if J < 1: +# return [] +# c_terms = [x - P.dot(x)] +# for j in range(1, J): +# a = c_terms[j-1] +# k = 2**(j-1) +# u = a.copy() +# for _ in range(k): +# u = P.dot(u) +# v = u.copy() +# for _ in range(k): +# v = P.dot(v) +# c_terms.append(u + v) +# return c_terms + + + + + + + + + + + def get_W_1(A: np.ndarray, largest_scale: int, low_pass_as_wavelet=False) -> list: #import pdb; pdb.set_trace() T_matrix = get_T(A) diff --git a/classifier.py b/classifier.py new file mode 100644 index 0000000..58fa8a3 --- /dev/null +++ b/classifier.py @@ -0,0 +1,393 @@ +import os +import argparse +import numpy as np + +from sklearn.model_selection import train_test_split, GridSearchCV +from sklearn.preprocessing import StandardScaler, LabelEncoder +from sklearn.decomposition import PCA +from sklearn.pipeline import Pipeline +from sklearn.metrics import accuracy_score, f1_score + +from sklearn.linear_model import LogisticRegression +from sklearn.ensemble import RandomForestClassifier +from sklearn.svm import SVC +from sklearn.neighbors import KNeighborsClassifier +from sklearn.neural_network import MLPClassifier + +from new_class import GraphScattering + + +def get_model_and_grid(model_name, input_dim): + if model_name == "LR": + model = LogisticRegression( + max_iter=3000, + solver="lbfgs", + ) + grid = { + "clf__C": [0.1, 1, 10], + } + return model, grid + + if model_name == "RF": + model = RandomForestClassifier(n_jobs=-1) + grid = { + "clf__n_estimators": [50, 100, 150], + "clf__max_depth": [None, 10, 20], + "clf__min_samples_split": [2, 5], + } + return model, grid + + if model_name == "SVC": + model = SVC() + grid = { + "clf__C": [0.1, 1, 10], + "clf__kernel": ["linear", "rbf"], + "clf__gamma": ["scale", "auto", 0.1, 1, 10], + } + return model, grid + + if model_name == "KNN": + model = KNeighborsClassifier(n_jobs=-1) + grid = { + "clf__n_neighbors": [3, 5, 7], + "clf__weights": ["uniform", "distance"], + } + return model, grid + + if model_name == "MLP": + model = MLPClassifier(max_iter=500) + grid = { + "clf__hidden_layer_sizes": [ + (150, 50), + (256, 128), + ], + "clf__activation": ["relu"], + "clf__alpha": [0.01], + } + return model, grid + + if model_name == "XGB": + try: + from xgboost import XGBClassifier + except ImportError: + raise ImportError("xgboost is not installed. Run: pip install xgboost") + + model = XGBClassifier( + eval_metric="mlogloss", + n_jobs=-1, + tree_method="hist", + ) + + grid = { + "clf__n_estimators": [50, 100], + "clf__learning_rate": [0.05, 0.1], + } + return model, grid + + raise ValueError(f"Unknown model: {model_name}") + + +def compute_graphscattering_one_layer( + gs, + A_real, + X_raw, + largest_scale, + highest_moment, + layer_num, + moment_list, +): + if X_raw.ndim == 2: + X_raw = X_raw[:, :, None] + + T, N, F = X_raw.shape + outputs = [] + + for f in range(F): + print(f"Computing layer_{layer_num}, channel {f + 1}/{F}") + + X_f = X_raw[:, :, f].T + + B_f = gs.calculate_scattering( + A_real, + X_f, + J=largest_scale, + Q=highest_moment, + layer_num=layer_num, + ) + + moment_indices = [m - 1 for m in moment_list] + B_f = B_f[:, :, :, moment_indices] + + outputs.append(B_f) + + B = np.concatenate(outputs, axis=2) + + return B + + +def build_feature_matrix( + gs, + A_real, + X_real, + largest_scale, + layer_list, + moment_list, +): + highest_moment = max(moment_list) + feature_blocks = [] + + for layer_num in layer_list: + B = compute_graphscattering_one_layer( + gs=gs, + A_real=A_real, + X_raw=X_real, + largest_scale=largest_scale, + highest_moment=highest_moment, + layer_num=layer_num, + moment_list=moment_list, + ) + + print(f"layer_{layer_num} B shape: {B.shape}") + + X_layer = B.reshape(B.shape[0], -1).astype(np.float32) + + print(f"layer_{layer_num} flattened shape: {X_layer.shape}") + + feature_blocks.append(X_layer) + + X_features = np.concatenate(feature_blocks, axis=1).astype(np.float32) + + return X_features + + +def train_one_seed( + X_features, + y, + model_name, + seed, + pca_variance, + test_size, + cv, +): + X_train, X_test, y_train, y_test = train_test_split( + X_features, + y, + test_size=test_size, + random_state=seed, + stratify=y, + ) + + model, param_grid = get_model_and_grid(model_name, X_features.shape[1]) + + steps = [] + steps.append(("scaler", StandardScaler())) + + if pca_variance < 1.0: + steps.append(("pca", PCA(n_components=pca_variance, random_state=seed))) + + steps.append(("clf", model)) + + pipe = Pipeline(steps) + + search = GridSearchCV( + pipe, + param_grid=param_grid, + cv=cv, + scoring="accuracy", + n_jobs=-1, + verbose=1, + ) + + search.fit(X_train, y_train) + + y_pred = search.predict(X_test) + + accuracy = accuracy_score(y_test, y_pred) + macro_f1 = f1_score(y_test, y_pred, average="macro") + weighted_f1 = f1_score(y_test, y_pred, average="weighted") + + return { + "seed": seed, + "model": model_name, + "accuracy": accuracy, + "macro_f1": macro_f1, + "weighted_f1": weighted_f1, + "best_params": search.best_params_, + } + + +def run_classifiers( + X_features, + y, + models, + seeds, + pca_variance, + test_size, + cv, +): + all_results = [] + + for model_name in models: + print("\n" + "=" * 90) + print(f"MODEL: {model_name}") + print("=" * 90) + + model_results = [] + + for seed in seeds: + print("\n" + "-" * 90) + print(f"Running {model_name}, seed={seed}") + print("-" * 90) + + result = train_one_seed( + X_features=X_features, + y=y, + model_name=model_name, + seed=seed, + pca_variance=pca_variance, + test_size=test_size, + cv=cv, + ) + + model_results.append(result) + all_results.append(result) + + print(f"seed={seed}") + print(f"accuracy={result['accuracy']:.6f}") + print(f"macro_f1={result['macro_f1']:.6f}") + print(f"weighted_f1={result['weighted_f1']:.6f}") + print(f"best_params={result['best_params']}") + + accuracies = np.array([r["accuracy"] for r in model_results]) + macro_f1s = np.array([r["macro_f1"] for r in model_results]) + weighted_f1s = np.array([r["weighted_f1"] for r in model_results]) + + print("\n" + "*" * 90) + print(f"SUMMARY FOR {model_name}") + print("*" * 90) + print(f"accuracy mean: {accuracies.mean():.6f}") + print(f"accuracy std: {accuracies.std():.6f}") + print(f"macro_f1 mean: {macro_f1s.mean():.6f}") + print(f"macro_f1 std: {macro_f1s.std():.6f}") + print(f"weighted_f1 mean: {weighted_f1s.mean():.6f}") + print(f"weighted_f1 std: {weighted_f1s.std():.6f}") + + return all_results + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument("--dataset", type=str, default="traffic") + parser.add_argument("--sub_dataset", type=str, default="PEMS08") + parser.add_argument("--task_type", type=str, default="DAY") + + parser.add_argument("--largest_scale", type=int, default=4) + parser.add_argument("--layer_list", nargs="+", type=int, default=[1, 2, 3]) + parser.add_argument("--moment_list", nargs="+", type=int, default=[1, 2, 3]) + + parser.add_argument( + "--models", + nargs="+", + type=str, + default=["LR", "RF", "SVC", "KNN", "MLP", "XGB"], + ) + + parser.add_argument( + "--seeds", + nargs="+", + type=int, + default=[42, 43, 44, 45, 56], + ) + + parser.add_argument("--pca_variance", type=float, default=0.99) + parser.add_argument("--test_size", type=float, default=0.2) + parser.add_argument("--cv", type=int, default=3) + + args = parser.parse_args() + + if len(args.models) == 1 and args.models[0] == "all": + args.models = ["LR", "RF", "SVC", "KNN", "MLP", "XGB"] + + base_dir = os.path.dirname(os.path.abspath(__file__)) + + data_path = os.path.join( + base_dir, + "data", + args.dataset, + args.sub_dataset, + ) + + label_path = os.path.join(data_path, args.task_type, "label.npy") + adjacency_path = os.path.join(data_path, "adjacency_matrix.npy") + signal_path = os.path.join(data_path, "graph_signals.npy") + + print("\n" + "=" * 90) + print("GRAPHSCATTERING IN-MEMORY CLASSIFIER TEST") + print("=" * 90) + print(f"data_path: {data_path}") + print(f"label_path: {label_path}") + print(f"adjacency_path: {adjacency_path}") + print(f"signal_path: {signal_path}") + print(f"layers: {args.layer_list}") + print(f"moments: {args.moment_list}") + print(f"models: {args.models}") + print(f"seeds: {args.seeds}") + + gs = GraphScattering(label_path, adjacency_path, signal_path) + + A_real, X_real, labels_real = gs.load_data() + + X_features = build_feature_matrix( + gs=gs, + A_real=A_real, + X_real=X_real, + largest_scale=args.largest_scale, + layer_list=args.layer_list, + moment_list=args.moment_list, + ) + + label_encoder = LabelEncoder() + y = label_encoder.fit_transform(labels_real) + + print("\n" + "=" * 90) + print("FEATURE INFO") + print("=" * 90) + print(f"X_features shape: {X_features.shape}") + print(f"y shape: {y.shape}") + print(f"number of classes: {len(np.unique(y))}") + + all_results = run_classifiers( + X_features=X_features, + y=y, + models=args.models, + seeds=args.seeds, + pca_variance=args.pca_variance, + test_size=args.test_size, + cv=args.cv, + ) + + print("\n" + "=" * 90) + print("FINAL RESULTS") + print("=" * 90) + + for model_name in args.models: + model_results = [r for r in all_results if r["model"] == model_name] + + if len(model_results) == 0: + continue + + accuracies = np.array([r["accuracy"] for r in model_results]) + macro_f1s = np.array([r["macro_f1"] for r in model_results]) + weighted_f1s = np.array([r["weighted_f1"] for r in model_results]) + + print( + f"{model_name:<6} | " + f"accuracy={accuracies.mean():.6f} ± {accuracies.std():.6f} | " + f"macro_f1={macro_f1s.mean():.6f} ± {macro_f1s.std():.6f} | " + f"weighted_f1={weighted_f1s.mean():.6f} ± {weighted_f1s.std():.6f}" + ) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/compare.py b/compare.py new file mode 100644 index 0000000..fa1d7df --- /dev/null +++ b/compare.py @@ -0,0 +1,329 @@ +import os +import numpy as np +import torch + +from new_class import GraphScattering + + +def find_traffic_datasets(data_root): + datasets = [] + + for name in sorted(os.listdir(data_root)): + folder = os.path.join(data_root, name) + + if not os.path.isdir(folder): + continue + + adjacency_path = os.path.join(folder, "adjacency_matrix.npy") + signal_path = os.path.join(folder, "graph_signals.npy") + + if os.path.exists(adjacency_path) and os.path.exists(signal_path): + datasets.append(name) + + return datasets + + +def find_old_moment_dir(old_root, sub_dataset, layer_num): + matches = [] + + for root, dirs, files in os.walk(old_root): + if os.path.basename(root) == f"layer_{layer_num}": + moment_1 = os.path.join(root, "moment_1.npy") + moment_2 = os.path.join(root, "moment_2.npy") + moment_3 = os.path.join(root, "moment_3.npy") + + if ( + os.path.exists(moment_1) + and os.path.exists(moment_2) + and os.path.exists(moment_3) + ): + parent = os.path.dirname(root) + + if sub_dataset in parent: + matches.append(parent) + + matches = sorted(matches) + + if len(matches) == 0: + raise FileNotFoundError( + f"No old moment directory found for {sub_dataset}, layer_{layer_num} inside {old_root}" + ) + + if len(matches) > 1: + print(f"\nWARNING: multiple old output folders found for {sub_dataset}, layer_{layer_num}") + for i, m in enumerate(matches): + print(f"{i}: {m}") + print(f"Using first match: {matches[0]}") + + return matches[0] + + +def load_old_moments(old_save_dir, layer_num, Q): + arrays = [] + + for q in range(1, Q + 1): + path = os.path.join(old_save_dir, f"layer_{layer_num}", f"moment_{q}.npy") + + if not os.path.exists(path): + raise FileNotFoundError(f"Missing old moment file: {path}") + + arr = np.load(path) + arrays.append(arr) + + old_B = np.stack(arrays, axis=-1) + + return old_B + + +def compare_outputs(old_B, new_B, dataset, layer_num, atol=1e-8, rtol=1e-5): + shape_match = old_B.shape == new_B.shape + + result = { + "dataset": dataset, + "layer": f"layer_{layer_num}", + "old_shape": str(old_B.shape), + "new_shape": str(new_B.shape), + "shape_match": shape_match, + "np_allclose": False, + "torch_allclose": False, + "max_abs_diff": None, + "mean_abs_diff": None, + "relative_error": None, + } + + if not shape_match: + return result + + old_B = old_B.astype(np.float64) + new_B = new_B.astype(np.float64) + + diff = new_B - old_B + + max_abs_diff = np.max(np.abs(diff)) + mean_abs_diff = np.mean(np.abs(diff)) + + old_norm = np.linalg.norm(old_B.reshape(-1)) + diff_norm = np.linalg.norm(diff.reshape(-1)) + + if old_norm == 0: + relative_error = diff_norm + else: + relative_error = diff_norm / old_norm + + np_close = np.allclose(new_B, old_B, atol=atol, rtol=rtol) + + old_torch = torch.from_numpy(old_B).double() + new_torch = torch.from_numpy(new_B).double() + + torch_close = torch.allclose( + new_torch, + old_torch, + atol=atol, + rtol=rtol, + ) + + result["np_allclose"] = bool(np_close) + result["torch_allclose"] = bool(torch_close) + result["max_abs_diff"] = float(max_abs_diff) + result["mean_abs_diff"] = float(mean_abs_diff) + result["relative_error"] = float(relative_error) + + if not np_close: + bad = np.where(np.abs(diff) > (atol + rtol * np.abs(old_B))) + + if bad[0].size > 0: + idx = tuple(dim[0] for dim in bad) + result["first_mismatch_index"] = str(idx) + result["old_value"] = float(old_B[idx]) + result["new_value"] = float(new_B[idx]) + result["difference"] = float(diff[idx]) + + return result + + +def compute_new_all_features(gs, A_real, X_raw, largest_scale, highest_moment, layer_num): + if X_raw.ndim == 2: + X_raw = X_raw[:, :, None] + + T, N, F = X_raw.shape + + outputs = [] + + for f in range(F): + X_f = X_raw[:, :, f].T + + B_f = gs.calculate_scattering( + A_real, + X_f, + J=largest_scale, + Q=highest_moment, + layer_num=layer_num, + ) + + outputs.append(B_f) + + new_B = np.concatenate(outputs, axis=2) + + return new_B + + +def compare_one_dataset_one_layer( + data_root, + old_root, + sub_dataset, + layer_num, + largest_scale=4, + highest_moment=3, + atol=1e-8, + rtol=1e-5, +): + data_path = os.path.join(data_root, sub_dataset) + + label_path = os.path.join(data_path, "DAY", "label.npy") + adjacency_path = os.path.join(data_path, "adjacency_matrix.npy") + signal_path = os.path.join(data_path, "graph_signals.npy") + + gs = GraphScattering(label_path, adjacency_path, signal_path) + + A_real, X_real, labels_real = gs.load_data() + + new_B = compute_new_all_features( + gs, + A_real, + X_real, + largest_scale=largest_scale, + highest_moment=highest_moment, + layer_num=layer_num, + ) + + old_save_dir = find_old_moment_dir( + old_root=old_root, + sub_dataset=sub_dataset, + layer_num=layer_num, + ) + + old_B = load_old_moments( + old_save_dir=old_save_dir, + layer_num=layer_num, + Q=highest_moment, + ) + + result = compare_outputs( + old_B=old_B, + new_B=new_B, + dataset=sub_dataset, + layer_num=layer_num, + atol=atol, + rtol=rtol, + ) + + return result + + +def print_summary(all_results): + print("\n" + "=" * 120) + print("FINAL SUMMARY") + print("=" * 120) + + print( + f"{'dataset':<10} " + f"{'layer':<8} " + f"{'shape':<8} " + f"{'np_close':<10} " + f"{'torch_close':<12} " + f"{'max_abs_diff':<16} " + f"{'mean_abs_diff':<16} " + f"{'relative_error':<16}" + ) + + print("-" * 120) + + for r in all_results: + if "error" in r: + print(f"{r['dataset']:<10} {r['layer']:<8} ERROR: {r['error']}") + continue + + max_abs_diff = r["max_abs_diff"] + mean_abs_diff = r["mean_abs_diff"] + relative_error = r["relative_error"] + + if max_abs_diff is None: + max_abs_diff_str = "None" + else: + max_abs_diff_str = f"{max_abs_diff:.6e}" + + if mean_abs_diff is None: + mean_abs_diff_str = "None" + else: + mean_abs_diff_str = f"{mean_abs_diff:.6e}" + + if relative_error is None: + relative_error_str = "None" + else: + relative_error_str = f"{relative_error:.6e}" + + print( + f"{r['dataset']:<10} " + f"{r['layer']:<8} " + f"{str(r['shape_match']):<8} " + f"{str(r['np_allclose']):<10} " + f"{str(r['torch_allclose']):<12} " + f"{max_abs_diff_str:<16} " + f"{mean_abs_diff_str:<16} " + f"{relative_error_str:<16}" + ) + + +def main(): + base_dir = os.path.dirname(os.path.abspath(__file__)) + + data_root = os.path.join(base_dir, "data", "traffic") + old_root = os.path.join(base_dir, "blis", "data", "traffic") + + largest_scale = 4 + highest_moment = 3 + + layers_to_compare = [1, 2, 3] + + datasets = find_traffic_datasets(data_root) + + print("\nFound traffic datasets:") + for d in datasets: + print(f" {d}") + + all_results = [] + + for sub_dataset in datasets: + for layer_num in layers_to_compare: + print("\n" + "#" * 90) + print(f"RUNNING {sub_dataset}, layer_{layer_num}") + print("#" * 90) + + try: + result = compare_one_dataset_one_layer( + data_root=data_root, + old_root=old_root, + sub_dataset=sub_dataset, + layer_num=layer_num, + largest_scale=largest_scale, + highest_moment=highest_moment, + atol=1e-8, + rtol=1e-5, + ) + + all_results.append(result) + + except Exception as e: + all_results.append( + { + "dataset": sub_dataset, + "layer": f"layer_{layer_num}", + "error": str(e), + } + ) + + print_summary(all_results) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/logs/instructions.md b/logs/instructions.md deleted file mode 100644 index 384f6a8..0000000 --- a/logs/instructions.md +++ /dev/null @@ -1,9 +0,0 @@ -# What is this directory - - -This is where you store your logs (outputs etc.) - - -You can access the path to this directory as: - -`from blis import LOG_DIR` \ No newline at end of file diff --git a/logs/torch_PEMS03-3074008.err b/logs/torch_PEMS03-3074008.err new file mode 100644 index 0000000..89fa361 --- /dev/null +++ b/logs/torch_PEMS03-3074008.err @@ -0,0 +1,192 @@ +/bsuscratch/desmondboateng/blis/torch_classify_scattering.py:150: UserWarning: torch.linalg.svd: During SVD computation with the selected cusolver driver, batches 0 failed to converge. A more accurate method will be used to compute the SVD as a fallback. Check doc at https://pytorch.org/docs/stable/generated/torch.linalg.svd.html (Triggered internally at /pytorch/aten/src/ATen/native/cuda/linalg/BatchLinearAlgebraLib.cpp:690.) + U, S, Vh = torch.linalg.svd( +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") diff --git a/logs/torch_PEMS03-3074008.out b/logs/torch_PEMS03-3074008.out new file mode 100644 index 0000000..c42fd37 --- /dev/null +++ b/logs/torch_PEMS03-3074008.out @@ -0,0 +1,1599 @@ +Starting GPU BLIS W2 Torch classifier run for PEMS03 +Date: Wed Jul 8 02:26:47 MDT 2026 +Working directory: /bsuscratch/desmondboateng/blis +Python: /bsuhome/desmondboateng/miniforge3/envs/blis/bin/python +CUDA_VISIBLE_DEVICES: 0 +========================================================================================== +BLIS MOMENTS FROM new_class.py + TORCH CLASSIFICATION +SVC intentionally left out for now +========================================================================================== +Device: cuda +GPU: Tesla V100-PCIE-16GB +========================================================================================== +DATASET: PEMS03 +========================================================================================== +A shape: (358, 358) +X shape: (26208, 358, 1) +Saving scattering moments to: data/traffic/PEMS03/processed/blis/W2/largest_scale_4 +A shape: (358, 358) +X shape: (26208, 358, 1) +T: 26208 +n_nodes: 358 +n_features: 1 +================================================================================ +Computing layer_1 +================================================================================ +Skipping layer_1; moment files already exist. +================================================================================ +Computing layer_2 +================================================================================ +Skipping layer_2; moment files already exist. +================================================================================ +Computing layer_3 +================================================================================ +Skipping layer_3; moment files already exist. +Finished saving scattering moments. +Loading: data/traffic/PEMS03/processed/blis/W2/largest_scale_4/layer_1/moment_1.npy +Loading: data/traffic/PEMS03/processed/blis/W2/largest_scale_4/layer_2/moment_1.npy +Loading: data/traffic/PEMS03/processed/blis/W2/largest_scale_4/layer_3/moment_1.npy +X_features shape: (26208, 1884) +------------------------------------------------------------------------------------------ +TASK: HOUR +------------------------------------------------------------------------------------------ +y shape: (26208,) +classes: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.089917 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.095215 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.085653 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.095215 +Epoch 1, loss = 3.471909 +Epoch 50, loss = 3.144349 +Epoch 100, loss = 3.143698 +accuracy = 0.079858 +balanced_accuracy = 0.083044 +macro_f1 = 0.012884 +weighted_f1 = 0.012570 +macro_precision = 0.007002 +macro_recall = 0.083044 +n_pca = 1 +best_cv_accuracy = 0.09521458109841269 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.081612 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.083902 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.085787 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.085787 +Epoch 1, loss = 3.481060 +Epoch 50, loss = 2.959917 +Epoch 100, loss = 2.957368 +accuracy = 0.087996 +balanced_accuracy = 0.088308 +macro_f1 = 0.026078 +weighted_f1 = 0.025062 +macro_precision = 0.018408 +macro_recall = 0.088308 +n_pca = 1 +best_cv_accuracy = 0.08578747344166143 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.084665 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.086999 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087089 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.087089 +Epoch 1, loss = 3.454624 +Epoch 50, loss = 2.959528 +Epoch 100, loss = 2.956908 +accuracy = 0.084944 +balanced_accuracy = 0.085165 +macro_f1 = 0.022456 +weighted_f1 = 0.022500 +macro_precision = 0.031841 +macro_recall = 0.085165 +n_pca = 1 +best_cv_accuracy = 0.08708939350110012 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.091892 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.086730 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.085608 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.091892 +Epoch 1, loss = 3.560509 +Epoch 50, loss = 3.175179 +Epoch 100, loss = 3.174417 +accuracy = 0.078077 +balanced_accuracy = 0.083333 +macro_f1 = 0.013211 +weighted_f1 = 0.012512 +macro_precision = 0.007195 +macro_recall = 0.083333 +n_pca = 1 +best_cv_accuracy = 0.09189238647358766 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.084979 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.084486 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087583 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.087583 +Epoch 1, loss = 3.317038 +Epoch 50, loss = 2.958373 +Epoch 100, loss = 2.957791 +accuracy = 0.086216 +balanced_accuracy = 0.086266 +macro_f1 = 0.023591 +weighted_f1 = 0.024065 +macro_precision = 0.031942 +macro_recall = 0.086266 +n_pca = 1 +best_cv_accuracy = 0.08758309975295342 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042602 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042602 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.249776 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.249776 +Epoch 1, loss = 2.907026 +Epoch 50, loss = 2.114853 +Epoch 100, loss = 2.111812 +accuracy = 0.254578 +balanced_accuracy = 0.255882 +macro_f1 = 0.185397 +weighted_f1 = 0.187293 +macro_precision = 0.157339 +macro_recall = 0.255882 +n_pca = 1 +best_cv_accuracy = 0.2497758444486158 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042602 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042602 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.239586 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.239586 +Epoch 1, loss = 2.933658 +Epoch 50, loss = 2.115435 +Epoch 100, loss = 2.111099 +accuracy = 0.243642 +balanced_accuracy = 0.246025 +macro_f1 = 0.165706 +weighted_f1 = 0.163598 +macro_precision = 0.149563 +macro_recall = 0.246025 +n_pca = 1 +best_cv_accuracy = 0.2395856279526268 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.041929 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.041929 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.240618 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.240618 +Epoch 1, loss = 2.909878 +Epoch 50, loss = 2.112946 +Epoch 100, loss = 2.107673 +accuracy = 0.238301 +balanced_accuracy = 0.237116 +macro_f1 = 0.163619 +weighted_f1 = 0.162980 +macro_precision = 0.136468 +macro_recall = 0.237116 +n_pca = 1 +best_cv_accuracy = 0.2406180910157928 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042198 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042198 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.243580 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.243580 +Epoch 1, loss = 2.843831 +Epoch 50, loss = 2.113417 +Epoch 100, loss = 2.109721 +accuracy = 0.240081 +balanced_accuracy = 0.243189 +macro_f1 = 0.170954 +weighted_f1 = 0.170427 +macro_precision = 0.151271 +macro_recall = 0.243189 +n_pca = 1 +best_cv_accuracy = 0.24358026202716032 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042333 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042333 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.239361 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.239361 +Epoch 1, loss = 2.918633 +Epoch 50, loss = 2.117335 +Epoch 100, loss = 2.113045 +accuracy = 0.241607 +balanced_accuracy = 0.247299 +macro_f1 = 0.168960 +weighted_f1 = 0.165536 +macro_precision = 0.138010 +macro_recall = 0.247299 +n_pca = 1 +best_cv_accuracy = 0.23936084065359586 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:33:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.288831 +[02:33:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.287080 +[02:33:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.287574 +[02:33:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286003 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.288831 +[02:33:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.302645 +balanced_accuracy = 0.297709 +macro_f1 = 0.264045 +weighted_f1 = 0.267690 +macro_precision = 0.264538 +macro_recall = 0.297709 +n_pca = 1 +best_cv_accuracy = 0.2888310038772378 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:33:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.292153 +[02:33:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.290716 +[02:33:48] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:49] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.290402 +[02:33:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:54] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.287754 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.292153 +[02:33:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.292726 +balanced_accuracy = 0.294471 +macro_f1 = 0.262866 +weighted_f1 = 0.262630 +macro_precision = 0.261891 +macro_recall = 0.294471 +n_pca = 1 +best_cv_accuracy = 0.29215292645762164 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.291210 +[02:34:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.288965 +[02:34:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289055 +[02:34:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.287664 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.291210 +[02:34:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.297813 +balanced_accuracy = 0.298327 +macro_f1 = 0.257360 +weighted_f1 = 0.257678 +macro_precision = 0.246728 +macro_recall = 0.298327 +n_pca = 1 +best_cv_accuracy = 0.2912100566970843 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289370 +[02:34:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.288876 +[02:34:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.288337 +[02:34:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286407 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.289370 +[02:34:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.296541 +balanced_accuracy = 0.297383 +macro_f1 = 0.257518 +weighted_f1 = 0.256725 +macro_precision = 0.258843 +macro_recall = 0.297383 +n_pca = 1 +best_cv_accuracy = 0.28936971837052633 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.288382 +[02:34:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286048 +[02:35:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.286272 +[02:35:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.284926 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.288382 +[02:35:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.292472 +balanced_accuracy = 0.295451 +macro_f1 = 0.259085 +weighted_f1 = 0.256777 +macro_precision = 0.263583 +macro_recall = 0.295451 +n_pca = 1 +best_cv_accuracy = 0.2883822695942276 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: DAY +------------------------------------------------------------------------------------------ +y shape: (26208,) +classes: [0 1 2 3 4 5 6] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.165065 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.166188 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.164662 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.166188 +Epoch 1, loss = 2.225354 +Epoch 50, loss = 1.943789 +Epoch 100, loss = 1.943725 +accuracy = 0.154883 +balanced_accuracy = 0.159405 +macro_f1 = 0.074770 +weighted_f1 = 0.072875 +macro_precision = 0.060361 +macro_recall = 0.159405 +n_pca = 1 +best_cv_accuracy = 0.16618765686006912 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.166682 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.166143 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.166053 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.166682 +Epoch 1, loss = 2.245900 +Epoch 50, loss = 1.945630 +Epoch 100, loss = 1.945650 +accuracy = 0.162513 +balanced_accuracy = 0.164261 +macro_f1 = 0.072631 +weighted_f1 = 0.071603 +macro_precision = 0.046925 +macro_recall = 0.164261 +n_pca = 1 +best_cv_accuracy = 0.16668180442846028 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.168253 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.164751 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.166682 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.168253 +Epoch 1, loss = 2.285180 +Epoch 50, loss = 1.945679 +Epoch 100, loss = 1.945658 +accuracy = 0.165565 +balanced_accuracy = 0.166349 +macro_f1 = 0.076605 +weighted_f1 = 0.076139 +macro_precision = 0.059388 +macro_recall = 0.166349 +n_pca = 1 +best_cv_accuracy = 0.16825294571232266 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.163180 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.166412 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.165245 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.166412 +Epoch 1, loss = 2.283013 +Epoch 50, loss = 1.944206 +Epoch 100, loss = 1.943840 +accuracy = 0.164802 +balanced_accuracy = 0.164369 +macro_f1 = 0.077338 +weighted_f1 = 0.077326 +macro_precision = 0.058014 +macro_recall = 0.164369 +n_pca = 1 +best_cv_accuracy = 0.16641209956947456 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.169465 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.168477 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.167535 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.169465 +Epoch 1, loss = 2.092303 +Epoch 50, loss = 1.945627 +Epoch 100, loss = 1.945642 +accuracy = 0.156409 +balanced_accuracy = 0.155307 +macro_f1 = 0.089742 +weighted_f1 = 0.089841 +macro_precision = 0.087092 +macro_recall = 0.155307 +n_pca = 1 +best_cv_accuracy = 0.16946489160691514 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143563 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143563 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.171081 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.171081 +Epoch 1, loss = 1.937625 +Epoch 50, loss = 1.932522 +Epoch 100, loss = 1.932067 +accuracy = 0.158698 +balanced_accuracy = 0.163025 +macro_f1 = 0.073099 +weighted_f1 = 0.071096 +macro_precision = 0.053840 +macro_recall = 0.163025 +n_pca = 1 +best_cv_accuracy = 0.17108098067789243 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143338 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143338 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.168881 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.168881 +Epoch 1, loss = 1.938595 +Epoch 50, loss = 1.932924 +Epoch 100, loss = 1.932914 +accuracy = 0.165310 +balanced_accuracy = 0.167845 +macro_f1 = 0.079328 +weighted_f1 = 0.078252 +macro_precision = 0.090354 +macro_recall = 0.167845 +n_pca = 1 +best_cv_accuracy = 0.1688814409166326 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143293 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143293 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.172562 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.172562 +Epoch 1, loss = 1.938056 +Epoch 50, loss = 1.933570 +Epoch 100, loss = 1.933163 +accuracy = 0.170651 +balanced_accuracy = 0.171612 +macro_f1 = 0.082743 +weighted_f1 = 0.082173 +macro_precision = 0.125016 +macro_recall = 0.171612 +n_pca = 1 +best_cv_accuracy = 0.1725624319322138 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144011 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144011 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.172024 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.172024 +Epoch 1, loss = 1.937544 +Epoch 50, loss = 1.933258 +Epoch 100, loss = 1.933334 +accuracy = 0.168616 +balanced_accuracy = 0.168611 +macro_f1 = 0.080609 +weighted_f1 = 0.080458 +macro_precision = 0.078145 +macro_recall = 0.168611 +n_pca = 1 +best_cv_accuracy = 0.1720237295297893 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143293 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143293 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.171575 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.171575 +Epoch 1, loss = 1.936805 +Epoch 50, loss = 1.932708 +Epoch 100, loss = 1.932565 +accuracy = 0.164547 +balanced_accuracy = 0.163021 +macro_f1 = 0.079314 +weighted_f1 = 0.079676 +macro_precision = 0.080238 +macro_recall = 0.163021 +n_pca = 1 +best_cv_accuracy = 0.17157498315591502 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:41:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.214760 +[02:41:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.214267 +[02:41:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.213683 +[02:41:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.213414 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.214760 +[02:41:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.222279 +balanced_accuracy = 0.219945 +macro_f1 = 0.191340 +weighted_f1 = 0.191912 +macro_precision = 0.213265 +macro_recall = 0.219945 +n_pca = 1 +best_cv_accuracy = 0.2147604240628749 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:41:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.219429 +[02:41:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.219249 +[02:41:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.219519 +[02:41:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:41:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.220057 +Best params: {'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.220057 +[02:41:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.214649 +balanced_accuracy = 0.216340 +macro_f1 = 0.194771 +weighted_f1 = 0.193913 +macro_precision = 0.203977 +macro_recall = 0.216340 +n_pca = 1 +best_cv_accuracy = 0.22005732278647264 +best_params = {'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.215029 +[02:42:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.215119 +[02:42:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.215703 +[02:42:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.216556 +Best params: {'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.216556 +[02:42:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.212869 +balanced_accuracy = 0.213908 +macro_f1 = 0.194882 +weighted_f1 = 0.194391 +macro_precision = 0.205765 +macro_recall = 0.213908 +n_pca = 1 +best_cv_accuracy = 0.21655577228429368 +best_params = {'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.216915 +[02:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.215972 +[02:42:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.218037 +[02:42:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.214581 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.218037 +[02:42:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.218718 +balanced_accuracy = 0.219925 +macro_f1 = 0.193110 +weighted_f1 = 0.192564 +macro_precision = 0.209814 +macro_recall = 0.219925 +n_pca = 1 +best_cv_accuracy = 0.21803722958404706 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.216691 +[02:42:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.218800 +[02:42:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.217544 +[02:42:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.215838 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.218800 +[02:42:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.216938 +balanced_accuracy = 0.216884 +macro_f1 = 0.189260 +weighted_f1 = 0.188904 +macro_precision = 0.206408 +macro_recall = 0.216884 +n_pca = 1 +best_cv_accuracy = 0.21880033237785282 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: WEEK +------------------------------------------------------------------------------------------ +y shape: (26208,) +classes: [0 1 2 3] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.309077 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.309077 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.309077 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.309077 +Epoch 1, loss = 1.558514 +Epoch 50, loss = 1.385855 +Epoch 100, loss = 1.385835 +accuracy = 0.299847 +balanced_accuracy = 0.250000 +macro_f1 = 0.115339 +weighted_f1 = 0.138337 +macro_precision = 0.074962 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3090770348244089 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.309526 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.309526 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.309526 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.309526 +Epoch 1, loss = 1.655840 +Epoch 50, loss = 1.385778 +Epoch 100, loss = 1.385822 +accuracy = 0.297304 +balanced_accuracy = 0.250000 +macro_f1 = 0.114585 +weighted_f1 = 0.136267 +macro_precision = 0.074326 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.30952595047037995 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.307865 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.307865 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.307865 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.307865 +Epoch 1, loss = 1.536251 +Epoch 50, loss = 1.385843 +Epoch 100, loss = 1.385871 +accuracy = 0.306714 +balanced_accuracy = 0.250000 +macro_f1 = 0.117361 +weighted_f1 = 0.143985 +macro_precision = 0.076679 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.30786496802117597 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.304319 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.304319 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.304319 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.304319 +Epoch 1, loss = 1.722504 +Epoch 50, loss = 1.386058 +Epoch 100, loss = 1.385902 +accuracy = 0.326806 +balanced_accuracy = 0.250000 +macro_f1 = 0.123155 +weighted_f1 = 0.160991 +macro_precision = 0.081701 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3043185543679305 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.308134 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.308134 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.308134 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.308134 +Epoch 1, loss = 1.530251 +Epoch 50, loss = 1.385816 +Epoch 100, loss = 1.385855 +accuracy = 0.305188 +balanced_accuracy = 0.250000 +macro_f1 = 0.116913 +weighted_f1 = 0.142722 +macro_precision = 0.076297 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3081343161996722 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309077 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309077 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309077 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.309077 +Epoch 1, loss = 1.384410 +Epoch 50, loss = 1.377437 +Epoch 100, loss = 1.377456 +accuracy = 0.299847 +balanced_accuracy = 0.250000 +macro_f1 = 0.115339 +weighted_f1 = 0.138337 +macro_precision = 0.074962 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3090770348244089 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309526 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309526 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.309526 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.309526 +Epoch 1, loss = 1.384391 +Epoch 50, loss = 1.377318 +Epoch 100, loss = 1.377314 +accuracy = 0.297304 +balanced_accuracy = 0.250000 +macro_f1 = 0.114585 +weighted_f1 = 0.136267 +macro_precision = 0.074326 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.30952595047037995 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.307865 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.307865 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.307865 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.307865 +Epoch 1, loss = 1.384392 +Epoch 50, loss = 1.377795 +Epoch 100, loss = 1.377792 +accuracy = 0.306714 +balanced_accuracy = 0.250000 +macro_f1 = 0.117361 +weighted_f1 = 0.143985 +macro_precision = 0.076679 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.30786496802117597 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.304319 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.304319 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.304319 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.304319 +Epoch 1, loss = 1.384649 +Epoch 50, loss = 1.378791 +Epoch 100, loss = 1.378787 +accuracy = 0.326806 +balanced_accuracy = 0.250000 +macro_f1 = 0.123155 +weighted_f1 = 0.160991 +macro_precision = 0.081701 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3043185543679305 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.308134 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.308134 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.308134 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.308134 +Epoch 1, loss = 1.384432 +Epoch 50, loss = 1.377702 +Epoch 100, loss = 1.377694 +accuracy = 0.305188 +balanced_accuracy = 0.250000 +macro_f1 = 0.116913 +weighted_f1 = 0.142722 +macro_precision = 0.076297 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3081343161996722 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.304274 +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.302972 +[02:49:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.303421 +[02:49:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:25] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.295879 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.304274 +[02:49:25] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.299084 +balanced_accuracy = 0.254155 +macro_f1 = 0.151010 +weighted_f1 = 0.171242 +macro_precision = 0.252337 +macro_recall = 0.254155 +n_pca = 1 +best_cv_accuracy = 0.3042735158993351 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.306922 +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.305755 +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.305126 +[02:49:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.300547 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.306922 +[02:49:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.298067 +balanced_accuracy = 0.256147 +macro_f1 = 0.159547 +weighted_f1 = 0.178267 +macro_precision = 0.279967 +macro_recall = 0.256147 +n_pca = 1 +best_cv_accuracy = 0.3069220982606385 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.304902 +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.301266 +[02:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.303241 +[02:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.295116 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.304902 +[02:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.303408 +balanced_accuracy = 0.254861 +macro_f1 = 0.165686 +weighted_f1 = 0.187870 +macro_precision = 0.255169 +macro_recall = 0.254861 +n_pca = 1 +best_cv_accuracy = 0.3049021864211738 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:50:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.297854 +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.296867 +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.297226 +[02:50:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.289909 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.297854 +[02:50:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.307477 +balanced_accuracy = 0.248184 +macro_f1 = 0.182751 +weighted_f1 = 0.211767 +macro_precision = 0.248111 +macro_recall = 0.248184 +n_pca = 1 +best_cv_accuracy = 0.297854367356118 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:50:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.302299 +[02:50:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.301042 +[02:50:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.300413 +[02:50:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.294936 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.302299 +[02:50:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.303917 +balanced_accuracy = 0.255621 +macro_f1 = 0.163255 +weighted_f1 = 0.185373 +macro_precision = 0.265968 +macro_recall = 0.255621 +n_pca = 1 +best_cv_accuracy = 0.3022986062558735 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +========================================================================================== +Saved per-seed results to: results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_per_seed.csv +Saved summary results to: results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_summary.csv +========================================================================================== + dataset task ... n_pca_mean best_cv_accuracy_mean +0 PEMS03 DAY ... 1.0 0.167400 +1 PEMS03 DAY ... 1.0 0.171225 +2 PEMS03 DAY ... 1.0 0.217642 +3 PEMS03 HOUR ... 1.0 0.089513 +4 PEMS03 HOUR ... 1.0 0.242584 +5 PEMS03 HOUR ... 1.0 0.289989 +6 PEMS03 WEEK ... 1.0 0.307784 +7 PEMS03 WEEK ... 1.0 0.307784 +8 PEMS03 WEEK ... 1.0 0.303250 + +[9 rows x 21 columns] +Finished GPU BLIS W2 Torch classifier run for PEMS03 +Date: Wed Jul 8 02:50:20 MDT 2026 diff --git a/logs/torch_PEMS04-3074009.err b/logs/torch_PEMS04-3074009.err new file mode 100644 index 0000000..9112dc8 --- /dev/null +++ b/logs/torch_PEMS04-3074009.err @@ -0,0 +1,190 @@ +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") diff --git a/logs/torch_PEMS04-3074009.out b/logs/torch_PEMS04-3074009.out new file mode 100644 index 0000000..d406483 --- /dev/null +++ b/logs/torch_PEMS04-3074009.out @@ -0,0 +1,1599 @@ +Starting GPU BLIS W2 Torch classifier run for PEMS04 +Date: Wed Jul 8 02:26:59 MDT 2026 +Working directory: /bsuscratch/desmondboateng/blis +Python: /bsuhome/desmondboateng/miniforge3/envs/blis/bin/python +CUDA_VISIBLE_DEVICES: 0 +========================================================================================== +BLIS MOMENTS FROM new_class.py + TORCH CLASSIFICATION +SVC intentionally left out for now +========================================================================================== +Device: cuda +GPU: Tesla V100-PCIE-16GB +========================================================================================== +DATASET: PEMS04 +========================================================================================== +A shape: (307, 307) +X shape: (16992, 307, 3) +Saving scattering moments to: data/traffic/PEMS04/processed/blis/W2/largest_scale_4 +A shape: (307, 307) +X shape: (16992, 307, 3) +T: 16992 +n_nodes: 307 +n_features: 3 +================================================================================ +Computing layer_1 +================================================================================ +Skipping layer_1; moment files already exist. +================================================================================ +Computing layer_2 +================================================================================ +Skipping layer_2; moment files already exist. +================================================================================ +Computing layer_3 +================================================================================ +Skipping layer_3; moment files already exist. +Finished saving scattering moments. +Loading: data/traffic/PEMS04/processed/blis/W2/largest_scale_4/layer_1/moment_1.npy +Loading: data/traffic/PEMS04/processed/blis/W2/largest_scale_4/layer_2/moment_1.npy +Loading: data/traffic/PEMS04/processed/blis/W2/largest_scale_4/layer_3/moment_1.npy +X_features shape: (16992, 5652) +------------------------------------------------------------------------------------------ +TASK: HOUR +------------------------------------------------------------------------------------------ +y shape: (16992,) +classes: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.061484 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.085232 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.088001 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.088001 +Epoch 1, loss = 3.409467 +Epoch 50, loss = 2.971076 +Epoch 100, loss = 2.957039 +accuracy = 0.081601 +balanced_accuracy = 0.085026 +macro_f1 = 0.019728 +weighted_f1 = 0.019658 +macro_precision = 0.018925 +macro_recall = 0.085026 +n_pca = 1 +best_cv_accuracy = 0.0880013483230735 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.065014 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.087101 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087863 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.087863 +Epoch 1, loss = 3.390308 +Epoch 50, loss = 2.980203 +Epoch 100, loss = 2.957354 +accuracy = 0.078070 +balanced_accuracy = 0.084291 +macro_f1 = 0.014377 +weighted_f1 = 0.013300 +macro_precision = 0.011847 +macro_recall = 0.084291 +n_pca = 1 +best_cv_accuracy = 0.08786267640116811 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.060928 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.088555 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.086339 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.088555 +Epoch 1, loss = 3.450999 +Epoch 50, loss = 3.144110 +Epoch 100, loss = 3.143581 +accuracy = 0.079639 +balanced_accuracy = 0.083333 +macro_f1 = 0.012652 +weighted_f1 = 0.012043 +macro_precision = 0.006849 +macro_recall = 0.083333 +n_pca = 1 +best_cv_accuracy = 0.08855541764580432 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.049713 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.091186 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.093402 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.093402 +Epoch 1, loss = 3.563512 +Epoch 50, loss = 3.006438 +Epoch 100, loss = 2.957616 +accuracy = 0.084739 +balanced_accuracy = 0.087883 +macro_f1 = 0.019272 +weighted_f1 = 0.018187 +macro_precision = 0.013926 +macro_recall = 0.087883 +n_pca = 1 +best_cv_accuracy = 0.09340196033174845 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.068751 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.105519 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087863 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.105519 +Epoch 1, loss = 3.441475 +Epoch 50, loss = 3.153113 +Epoch 100, loss = 3.143625 +accuracy = 0.083954 +balanced_accuracy = 0.083333 +macro_f1 = 0.013398 +weighted_f1 = 0.013598 +macro_precision = 0.007297 +macro_recall = 0.083333 +n_pca = 1 +best_cv_accuracy = 0.10551887788918413 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042789 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042789 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.240394 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.240394 +Epoch 1, loss = 3.015926 +Epoch 50, loss = 2.136760 +Epoch 100, loss = 2.128688 +accuracy = 0.245979 +balanced_accuracy = 0.247725 +macro_f1 = 0.164316 +weighted_f1 = 0.164327 +macro_precision = 0.141658 +macro_recall = 0.247725 +n_pca = 1 +best_cv_accuracy = 0.24039395308163583 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042997 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042997 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.243579 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.243579 +Epoch 1, loss = 2.995753 +Epoch 50, loss = 2.125413 +Epoch 100, loss = 2.121951 +accuracy = 0.251863 +balanced_accuracy = 0.262460 +macro_f1 = 0.178384 +weighted_f1 = 0.172525 +macro_precision = 0.149234 +macro_recall = 0.262460 +n_pca = 1 +best_cv_accuracy = 0.24357874797791088 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042858 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042858 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.248148 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.248148 +Epoch 1, loss = 3.005579 +Epoch 50, loss = 2.134650 +Epoch 100, loss = 2.125047 +accuracy = 0.262064 +balanced_accuracy = 0.259158 +macro_f1 = 0.186214 +weighted_f1 = 0.189567 +macro_precision = 0.160332 +macro_recall = 0.259158 +n_pca = 1 +best_cv_accuracy = 0.24814807624525384 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042789 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042789 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.252718 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.252718 +Epoch 1, loss = 2.949236 +Epoch 50, loss = 2.129337 +Epoch 100, loss = 2.122901 +accuracy = 0.244017 +balanced_accuracy = 0.243201 +macro_f1 = 0.171329 +weighted_f1 = 0.172291 +macro_precision = 0.147657 +macro_recall = 0.243201 +n_pca = 1 +best_cv_accuracy = 0.25271816668327624 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043481 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043481 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.248632 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.248632 +Epoch 1, loss = 2.986637 +Epoch 50, loss = 2.131751 +Epoch 100, loss = 2.125120 +accuracy = 0.238133 +balanced_accuracy = 0.242441 +macro_f1 = 0.167306 +weighted_f1 = 0.167109 +macro_precision = 0.142432 +macro_recall = 0.242441 +n_pca = 1 +best_cv_accuracy = 0.24863242852169232 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:19:48] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:49] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289414 +[03:19:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286229 +[03:19:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.285260 +[03:19:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.284221 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.289414 +[03:20:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.311887 +balanced_accuracy = 0.308089 +macro_f1 = 0.258400 +weighted_f1 = 0.261391 +macro_precision = 0.250644 +macro_recall = 0.308089 +n_pca = 1 +best_cv_accuracy = 0.2894138375394369 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:24:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289345 +[03:24:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286575 +[03:24:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.287129 +[03:24:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:24:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.283460 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.289345 +[03:24:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.307964 +balanced_accuracy = 0.309547 +macro_f1 = 0.257295 +weighted_f1 = 0.256785 +macro_precision = 0.250820 +macro_recall = 0.309547 +n_pca = 1 +best_cv_accuracy = 0.28934455191051023 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:29:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.294745 +[03:29:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.290383 +[03:29:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.290452 +[03:29:25] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:29:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.288444 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.294745 +[03:29:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.295410 +balanced_accuracy = 0.292194 +macro_f1 = 0.245940 +weighted_f1 = 0.249148 +macro_precision = 0.245723 +macro_recall = 0.292194 +n_pca = 1 +best_cv_accuracy = 0.29474533648613144 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:34:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289899 +[03:34:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.287960 +[03:34:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.288029 +[03:34:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:34:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.286991 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.289899 +[03:34:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.292664 +balanced_accuracy = 0.291870 +macro_f1 = 0.237913 +weighted_f1 = 0.238932 +macro_precision = 0.220081 +macro_recall = 0.291870 +n_pca = 1 +best_cv_accuracy = 0.28989863561381995 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:38:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.294191 +[03:38:48] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:49] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:49] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.291491 +[03:38:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.290867 +[03:38:54] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:38:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.289760 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.294191 +[03:38:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.295018 +balanced_accuracy = 0.290674 +macro_f1 = 0.241672 +weighted_f1 = 0.246675 +macro_precision = 0.244607 +macro_recall = 0.290674 +n_pca = 1 +best_cv_accuracy = 0.29419100831298123 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: DAY +------------------------------------------------------------------------------------------ +y shape: (16992,) +classes: [0 1 2 3 4 5 6] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.147615 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.164371 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.166724 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.166724 +Epoch 1, loss = 2.207844 +Epoch 50, loss = 1.937276 +Epoch 100, loss = 1.935721 +accuracy = 0.170263 +balanced_accuracy = 0.168070 +macro_f1 = 0.090699 +weighted_f1 = 0.092060 +macro_precision = 0.071836 +macro_recall = 0.168070 +n_pca = 1 +best_cv_accuracy = 0.16672405955687974 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.146714 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.163262 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168593 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.168593 +Epoch 1, loss = 2.242374 +Epoch 50, loss = 1.936645 +Epoch 100, loss = 1.935621 +accuracy = 0.180463 +balanced_accuracy = 0.172626 +macro_f1 = 0.119247 +weighted_f1 = 0.124541 +macro_precision = 0.099580 +macro_recall = 0.172626 +n_pca = 1 +best_cv_accuracy = 0.16859346290522495 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.140483 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.171225 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.171294 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.171294 +Epoch 1, loss = 2.242271 +Epoch 50, loss = 1.936068 +Epoch 100, loss = 1.934875 +accuracy = 0.162417 +balanced_accuracy = 0.160580 +macro_f1 = 0.099824 +weighted_f1 = 0.100557 +macro_precision = 0.083503 +macro_recall = 0.160580 +n_pca = 1 +best_cv_accuracy = 0.17129419313663866 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.142007 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.173164 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.170187 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.173164 +Epoch 1, loss = 2.280036 +Epoch 50, loss = 1.944672 +Epoch 100, loss = 1.942756 +accuracy = 0.152217 +balanced_accuracy = 0.157882 +macro_f1 = 0.088176 +weighted_f1 = 0.085750 +macro_precision = 0.081422 +macro_recall = 0.157882 +n_pca = 1 +best_cv_accuracy = 0.17316351020151075 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.155924 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.164924 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168802 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.168802 +Epoch 1, loss = 2.081578 +Epoch 50, loss = 1.935612 +Epoch 100, loss = 1.935227 +accuracy = 0.174186 +balanced_accuracy = 0.165841 +macro_f1 = 0.106388 +weighted_f1 = 0.112233 +macro_precision = 0.095627 +macro_recall = 0.165841 +n_pca = 1 +best_cv_accuracy = 0.16880175120937072 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.151838 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.151838 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.172125 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.172125 +Epoch 1, loss = 1.937033 +Epoch 50, loss = 1.931049 +Epoch 100, loss = 1.931133 +accuracy = 0.167909 +balanced_accuracy = 0.168786 +macro_f1 = 0.087609 +weighted_f1 = 0.088269 +macro_precision = 0.069766 +macro_recall = 0.168786 +n_pca = 1 +best_cv_accuracy = 0.17212487289365863 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.153085 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.153085 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.171155 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.171155 +Epoch 1, loss = 1.935526 +Epoch 50, loss = 1.931036 +Epoch 100, loss = 1.931417 +accuracy = 0.174186 +balanced_accuracy = 0.168427 +macro_f1 = 0.113698 +weighted_f1 = 0.118405 +macro_precision = 0.094363 +macro_recall = 0.168427 +n_pca = 1 +best_cv_accuracy = 0.17115539178952355 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.153985 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.153985 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.173925 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.173925 +Epoch 1, loss = 1.936893 +Epoch 50, loss = 1.930247 +Epoch 100, loss = 1.929952 +accuracy = 0.165947 +balanced_accuracy = 0.165806 +macro_f1 = 0.110268 +weighted_f1 = 0.111207 +macro_precision = 0.094613 +macro_recall = 0.165806 +n_pca = 1 +best_cv_accuracy = 0.17392494747134057 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.152738 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.152738 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.173025 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.173025 +Epoch 1, loss = 1.938267 +Epoch 50, loss = 1.929843 +Epoch 100, loss = 1.929504 +accuracy = 0.157317 +balanced_accuracy = 0.165226 +macro_f1 = 0.090907 +weighted_f1 = 0.088461 +macro_precision = 0.091596 +macro_recall = 0.165226 +n_pca = 1 +best_cv_accuracy = 0.17302535598044413 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.152738 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.152738 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.171779 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.171779 +Epoch 1, loss = 1.939637 +Epoch 50, loss = 1.930012 +Epoch 100, loss = 1.930225 +accuracy = 0.175755 +balanced_accuracy = 0.168473 +macro_f1 = 0.095401 +weighted_f1 = 0.100532 +macro_precision = 0.086853 +macro_recall = 0.168473 +n_pca = 1 +best_cv_accuracy = 0.17177897683044277 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:31:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.206467 +[04:31:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.203351 +[04:31:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.203628 +[04:31:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.198158 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.206467 +[04:31:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.214986 +balanced_accuracy = 0.219142 +macro_f1 = 0.206826 +weighted_f1 = 0.205305 +macro_precision = 0.220518 +macro_recall = 0.219142 +n_pca = 1 +best_cv_accuracy = 0.20646650051345858 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:36:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.208060 +[04:36:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.205567 +[04:36:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.205359 +[04:36:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.204182 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.208060 +[04:36:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.215379 +balanced_accuracy = 0.214315 +macro_f1 = 0.203390 +weighted_f1 = 0.204902 +macro_precision = 0.210680 +macro_recall = 0.214315 +n_pca = 1 +best_cv_accuracy = 0.20805950913619745 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:40:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.210967 +[04:40:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.210621 +[04:40:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.211313 +[04:40:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.208198 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.211313 +[04:40:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.205571 +balanced_accuracy = 0.210218 +macro_f1 = 0.196881 +weighted_f1 = 0.194521 +macro_precision = 0.206602 +macro_recall = 0.210218 +n_pca = 1 +best_cv_accuracy = 0.21131334519155867 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:45:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.213113 +[04:45:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.212836 +[04:45:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.213459 +[04:45:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.207990 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.213459 +[04:45:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.205571 +balanced_accuracy = 0.206976 +macro_f1 = 0.195573 +weighted_f1 = 0.195971 +macro_precision = 0.206854 +macro_recall = 0.206976 +n_pca = 1 +best_cv_accuracy = 0.21345944525766622 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.213114 +[04:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.213045 +[04:49:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.213253 +[04:49:54] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:54] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:49:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.209306 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.213253 +[04:49:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.208709 +balanced_accuracy = 0.211429 +macro_f1 = 0.200697 +weighted_f1 = 0.200314 +macro_precision = 0.211894 +macro_recall = 0.211429 +n_pca = 1 +best_cv_accuracy = 0.2132525087279328 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: WEEK +------------------------------------------------------------------------------------------ +y shape: (16992,) +classes: [0 1 2 3] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.261926 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.287613 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.287613 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.287613 +Epoch 1, loss = 1.537558 +Epoch 50, loss = 1.385157 +Epoch 100, loss = 1.384820 +accuracy = 0.291095 +balanced_accuracy = 0.250000 +macro_f1 = 0.112732 +weighted_f1 = 0.131262 +macro_precision = 0.072774 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28761338906670475 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.263517 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.285675 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.287198 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.287198 +Epoch 1, loss = 1.648666 +Epoch 50, loss = 1.382863 +Epoch 100, loss = 1.382712 +accuracy = 0.293448 +balanced_accuracy = 0.250000 +macro_f1 = 0.113436 +weighted_f1 = 0.133151 +macro_precision = 0.073362 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28719794852414277 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.253134 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.291422 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.289483 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.291422 +Epoch 1, loss = 1.562567 +Epoch 50, loss = 1.384707 +Epoch 100, loss = 1.384694 +accuracy = 0.280502 +balanced_accuracy = 0.250000 +macro_f1 = 0.109528 +weighted_f1 = 0.122892 +macro_precision = 0.070126 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.29142158205637386 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.269958 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.290106 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.290729 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.290729 +Epoch 1, loss = 1.709696 +Epoch 50, loss = 1.382870 +Epoch 100, loss = 1.381957 +accuracy = 0.273441 +balanced_accuracy = 0.250000 +macro_f1 = 0.107363 +weighted_f1 = 0.117429 +macro_precision = 0.068360 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.29072907090099936 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.274044 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.286159 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.286159 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.286159 +Epoch 1, loss = 1.544942 +Epoch 50, loss = 1.385596 +Epoch 100, loss = 1.384957 +accuracy = 0.299333 +balanced_accuracy = 0.250000 +macro_f1 = 0.115187 +weighted_f1 = 0.137917 +macro_precision = 0.074833 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28615939749976377 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287613 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287613 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287613 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.287613 +Epoch 1, loss = 1.385676 +Epoch 50, loss = 1.382647 +Epoch 100, loss = 1.382667 +accuracy = 0.291095 +balanced_accuracy = 0.250000 +macro_f1 = 0.112732 +weighted_f1 = 0.131262 +macro_precision = 0.072774 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28761338906670475 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287198 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287198 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287198 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.287198 +Epoch 1, loss = 1.385623 +Epoch 50, loss = 1.382739 +Epoch 100, loss = 1.382734 +accuracy = 0.293448 +balanced_accuracy = 0.250000 +macro_f1 = 0.113436 +weighted_f1 = 0.133151 +macro_precision = 0.073362 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28719794852414277 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.289483 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.289483 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.289483 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.289483 +Epoch 1, loss = 1.385576 +Epoch 50, loss = 1.382284 +Epoch 100, loss = 1.382291 +accuracy = 0.280502 +balanced_accuracy = 0.250000 +macro_f1 = 0.109528 +weighted_f1 = 0.122892 +macro_precision = 0.070126 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28948279241505 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.290729 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.290729 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.290729 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.290729 +Epoch 1, loss = 1.385545 +Epoch 50, loss = 1.382044 +Epoch 100, loss = 1.382032 +accuracy = 0.273441 +balanced_accuracy = 0.250000 +macro_f1 = 0.107363 +weighted_f1 = 0.117429 +macro_precision = 0.068360 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.29072907090099936 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286159 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286159 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286159 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.286159 +Epoch 1, loss = 1.385665 +Epoch 50, loss = 1.382945 +Epoch 100, loss = 1.382929 +accuracy = 0.299333 +balanced_accuracy = 0.250000 +macro_f1 = 0.115187 +weighted_f1 = 0.137917 +macro_precision = 0.074833 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28615939749976377 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.281659 +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.277089 +[05:42:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.277782 +[05:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:42:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.272866 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.281659 +[05:42:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.292271 +balanced_accuracy = 0.266116 +macro_f1 = 0.219423 +weighted_f1 = 0.230687 +macro_precision = 0.282143 +macro_recall = 0.266116 +n_pca = 1 +best_cv_accuracy = 0.28165875087703557 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:46:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:46:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.283667 +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.281867 +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.281174 +[05:47:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:47:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.270165 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.283667 +[05:47:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.280110 +balanced_accuracy = 0.254926 +macro_f1 = 0.215982 +weighted_f1 = 0.227950 +macro_precision = 0.248857 +macro_recall = 0.254926 +n_pca = 1 +best_cv_accuracy = 0.2836666679609188 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:51:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.285466 +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.279305 +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.279928 +[05:51:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:51:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.271896 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.285466 +[05:51:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.288741 +balanced_accuracy = 0.269744 +macro_f1 = 0.220367 +weighted_f1 = 0.228466 +macro_precision = 0.289852 +macro_recall = 0.269744 +n_pca = 1 +best_cv_accuracy = 0.2854663974047082 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.289552 +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.284636 +[05:56:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.285398 +[05:56:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:56:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.278197 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.289552 +[05:56:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.277364 +balanced_accuracy = 0.262001 +macro_f1 = 0.206121 +weighted_f1 = 0.212082 +macro_precision = 0.269485 +macro_recall = 0.262001 +n_pca = 1 +best_cv_accuracy = 0.2895521355662921 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[06:00:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.281451 +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.277505 +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.278336 +[06:00:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[06:00:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.269474 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.281451 +[06:00:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.298156 +balanced_accuracy = 0.267823 +macro_f1 = 0.229072 +weighted_f1 = 0.242801 +macro_precision = 0.277716 +macro_recall = 0.267823 +n_pca = 1 +best_cv_accuracy = 0.2814514692134097 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +========================================================================================== +Saved per-seed results to: results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_per_seed.csv +Saved summary results to: results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_summary.csv +========================================================================================== + dataset task ... n_pca_mean best_cv_accuracy_mean +0 PEMS04 DAY ... 1.0 0.169715 +1 PEMS04 DAY ... 1.0 0.172402 +2 PEMS04 DAY ... 1.0 0.210510 +3 PEMS04 HOUR ... 1.0 0.092668 +4 PEMS04 HOUR ... 1.0 0.246694 +5 PEMS04 HOUR ... 1.0 0.291519 +6 PEMS04 WEEK ... 1.0 0.288624 +7 PEMS04 WEEK ... 1.0 0.288237 +8 PEMS04 WEEK ... 1.0 0.284359 + +[9 rows x 21 columns] +Finished GPU BLIS W2 Torch classifier run for PEMS04 +Date: Wed Jul 8 06:00:46 MDT 2026 diff --git a/logs/torch_PEMS07-3074010.err b/logs/torch_PEMS07-3074010.err new file mode 100644 index 0000000..89fa361 --- /dev/null +++ b/logs/torch_PEMS07-3074010.err @@ -0,0 +1,192 @@ +/bsuscratch/desmondboateng/blis/torch_classify_scattering.py:150: UserWarning: torch.linalg.svd: During SVD computation with the selected cusolver driver, batches 0 failed to converge. A more accurate method will be used to compute the SVD as a fallback. Check doc at https://pytorch.org/docs/stable/generated/torch.linalg.svd.html (Triggered internally at /pytorch/aten/src/ATen/native/cuda/linalg/BatchLinearAlgebraLib.cpp:690.) + U, S, Vh = torch.linalg.svd( +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") diff --git a/logs/torch_PEMS07-3074010.out b/logs/torch_PEMS07-3074010.out new file mode 100644 index 0000000..25389b4 --- /dev/null +++ b/logs/torch_PEMS07-3074010.out @@ -0,0 +1,1599 @@ +Starting GPU BLIS W2 Torch classifier run for PEMS07 +Date: Wed Jul 8 02:27:13 MDT 2026 +Working directory: /bsuscratch/desmondboateng/blis +Python: /bsuhome/desmondboateng/miniforge3/envs/blis/bin/python +CUDA_VISIBLE_DEVICES: 1 +========================================================================================== +BLIS MOMENTS FROM new_class.py + TORCH CLASSIFICATION +SVC intentionally left out for now +========================================================================================== +Device: cuda +GPU: Tesla V100-PCIE-16GB +========================================================================================== +DATASET: PEMS07 +========================================================================================== +A shape: (883, 883) +X shape: (28224, 883, 1) +Saving scattering moments to: data/traffic/PEMS07/processed/blis/W2/largest_scale_4 +A shape: (883, 883) +X shape: (28224, 883, 1) +T: 28224 +n_nodes: 883 +n_features: 1 +================================================================================ +Computing layer_1 +================================================================================ +Skipping layer_1; moment files already exist. +================================================================================ +Computing layer_2 +================================================================================ +Skipping layer_2; moment files already exist. +================================================================================ +Computing layer_3 +================================================================================ +Skipping layer_3; moment files already exist. +Finished saving scattering moments. +Loading: data/traffic/PEMS07/processed/blis/W2/largest_scale_4/layer_1/moment_1.npy +Loading: data/traffic/PEMS07/processed/blis/W2/largest_scale_4/layer_2/moment_1.npy +Loading: data/traffic/PEMS07/processed/blis/W2/largest_scale_4/layer_3/moment_1.npy +X_features shape: (28224, 1884) +------------------------------------------------------------------------------------------ +TASK: HOUR +------------------------------------------------------------------------------------------ +y shape: (28224,) +classes: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.085327 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.084702 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087370 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.087370 +Epoch 1, loss = 3.485107 +Epoch 50, loss = 2.966566 +Epoch 100, loss = 2.960369 +accuracy = 0.085026 +balanced_accuracy = 0.086651 +macro_f1 = 0.029148 +weighted_f1 = 0.028296 +macro_precision = 0.037036 +macro_recall = 0.086651 +n_pca = 1 +best_cv_accuracy = 0.08736978634788613 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.083535 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.083576 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.084118 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.084118 +Epoch 1, loss = 3.476637 +Epoch 50, loss = 2.961856 +Epoch 100, loss = 2.959570 +accuracy = 0.084554 +balanced_accuracy = 0.083590 +macro_f1 = 0.017998 +weighted_f1 = 0.018224 +macro_precision = 0.015758 +macro_recall = 0.083590 +n_pca = 1 +best_cv_accuracy = 0.08411836383783156 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.084702 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.083910 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.086119 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.086119 +Epoch 1, loss = 3.431670 +Epoch 50, loss = 2.963724 +Epoch 100, loss = 2.960802 +accuracy = 0.085735 +balanced_accuracy = 0.086322 +macro_f1 = 0.019353 +weighted_f1 = 0.018881 +macro_precision = 0.013756 +macro_recall = 0.086322 +n_pca = 1 +best_cv_accuracy = 0.0861192288028471 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.087661 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.084535 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.087453 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.087661 +Epoch 1, loss = 3.350894 +Epoch 50, loss = 3.174164 +Epoch 100, loss = 3.174406 +accuracy = 0.080066 +balanced_accuracy = 0.086130 +macro_f1 = 0.015462 +weighted_f1 = 0.014345 +macro_precision = 0.008724 +macro_recall = 0.086130 +n_pca = 1 +best_cv_accuracy = 0.08766135912773193 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.084910 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.084952 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.089120 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.089120 +Epoch 1, loss = 3.456531 +Epoch 50, loss = 2.964872 +Epoch 100, loss = 2.959265 +accuracy = 0.076287 +balanced_accuracy = 0.086839 +macro_f1 = 0.018064 +weighted_f1 = 0.016193 +macro_precision = 0.021228 +macro_recall = 0.086839 +n_pca = 1 +best_cv_accuracy = 0.08912040635381673 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042851 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042851 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.232221 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.232221 +Epoch 1, loss = 2.890888 +Epoch 50, loss = 2.160906 +Epoch 100, loss = 2.158636 +accuracy = 0.253188 +balanced_accuracy = 0.249252 +macro_f1 = 0.177706 +weighted_f1 = 0.180040 +macro_precision = 0.151922 +macro_recall = 0.249252 +n_pca = 1 +best_cv_accuracy = 0.23222145231258454 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042518 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042518 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.243768 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.243768 +Epoch 1, loss = 2.905615 +Epoch 50, loss = 2.162599 +Epoch 100, loss = 2.158764 +accuracy = 0.257440 +balanced_accuracy = 0.257234 +macro_f1 = 0.176928 +weighted_f1 = 0.177028 +macro_precision = 0.148858 +macro_recall = 0.257234 +n_pca = 1 +best_cv_accuracy = 0.2437682045974844 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042643 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042643 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.239225 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.239225 +Epoch 1, loss = 2.903417 +Epoch 50, loss = 2.163266 +Epoch 100, loss = 2.158595 +accuracy = 0.259329 +balanced_accuracy = 0.253605 +macro_f1 = 0.193392 +weighted_f1 = 0.198800 +macro_precision = 0.176138 +macro_recall = 0.253605 +n_pca = 1 +best_cv_accuracy = 0.2392248758700554 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042810 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042810 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.243185 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.243185 +Epoch 1, loss = 2.887522 +Epoch 50, loss = 2.161483 +Epoch 100, loss = 2.156254 +accuracy = 0.242088 +balanced_accuracy = 0.241968 +macro_f1 = 0.176230 +weighted_f1 = 0.175873 +macro_precision = 0.156813 +macro_recall = 0.241968 +n_pca = 1 +best_cv_accuracy = 0.24318463158051454 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042476 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042476 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.228637 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.228637 +Epoch 1, loss = 2.871948 +Epoch 50, loss = 2.161044 +Epoch 100, loss = 2.155320 +accuracy = 0.229806 +balanced_accuracy = 0.236817 +macro_f1 = 0.180970 +weighted_f1 = 0.177573 +macro_precision = 0.171370 +macro_recall = 0.236817 +n_pca = 1 +best_cv_accuracy = 0.2286369936666887 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:33:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.276657 +[02:33:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.275239 +[02:33:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:48] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.275365 +[02:33:49] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:33:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.273947 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.276657 +[02:33:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.277515 +balanced_accuracy = 0.274722 +macro_f1 = 0.238516 +weighted_f1 = 0.240643 +macro_precision = 0.234341 +macro_recall = 0.274722 +n_pca = 1 +best_cv_accuracy = 0.2766566529065041 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.275240 +[02:34:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.275865 +[02:34:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.275490 +[02:34:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.274614 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.275865 +[02:34:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.282475 +balanced_accuracy = 0.281512 +macro_f1 = 0.245717 +weighted_f1 = 0.246665 +macro_precision = 0.236975 +macro_recall = 0.281512 +n_pca = 1 +best_cv_accuracy = 0.2758648300015958 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.275156 +[02:34:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.274031 +[02:34:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.274448 +[02:34:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.272905 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.275156 +[02:34:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.277043 +balanced_accuracy = 0.272613 +macro_f1 = 0.235324 +weighted_f1 = 0.239261 +macro_precision = 0.229372 +macro_recall = 0.272613 +n_pca = 1 +best_cv_accuracy = 0.2751564238206803 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:34:55] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.278991 +[02:34:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:34:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.278157 +[02:34:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.277449 +[02:35:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.274614 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.278991 +[02:35:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.265470 +balanced_accuracy = 0.265431 +macro_f1 = 0.229898 +weighted_f1 = 0.229113 +macro_precision = 0.213990 +macro_recall = 0.265431 +n_pca = 1 +best_cv_accuracy = 0.27899108572251197 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:35:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.278324 +[02:35:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.275698 +[02:35:24] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.275865 +[02:35:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:30] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:35:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.275532 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.278324 +[02:35:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.274917 +balanced_accuracy = 0.281209 +macro_f1 = 0.242510 +weighted_f1 = 0.237898 +macro_precision = 0.236477 +macro_recall = 0.281209 +n_pca = 1 +best_cv_accuracy = 0.27832438269069926 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: DAY +------------------------------------------------------------------------------------------ +y shape: (28224,) +classes: [0 1 2 3 4 5 6] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.171405 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.171863 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.172072 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.172072 +Epoch 1, loss = 2.162685 +Epoch 50, loss = 1.939043 +Epoch 100, loss = 1.939051 +accuracy = 0.154228 +balanced_accuracy = 0.162867 +macro_f1 = 0.069303 +weighted_f1 = 0.065486 +macro_precision = 0.044592 +macro_recall = 0.162867 +n_pca = 1 +best_cv_accuracy = 0.1720718378863476 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.167903 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.169487 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.169529 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.169529 +Epoch 1, loss = 2.225882 +Epoch 50, loss = 1.939760 +Epoch 100, loss = 1.939771 +accuracy = 0.167218 +balanced_accuracy = 0.167651 +macro_f1 = 0.083791 +weighted_f1 = 0.084531 +macro_precision = 0.082139 +macro_recall = 0.167651 +n_pca = 1 +best_cv_accuracy = 0.16952909784057132 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.166486 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.168070 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168278 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.168278 +Epoch 1, loss = 2.246605 +Epoch 50, loss = 1.939697 +Epoch 100, loss = 1.939655 +accuracy = 0.174067 +balanced_accuracy = 0.173253 +macro_f1 = 0.089346 +weighted_f1 = 0.089458 +macro_precision = 0.104592 +macro_recall = 0.173253 +n_pca = 1 +best_cv_accuracy = 0.16827837348293584 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.164402 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.168737 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168695 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.168737 +Epoch 1, loss = 2.197481 +Epoch 50, loss = 1.944033 +Epoch 100, loss = 1.944081 +accuracy = 0.166509 +balanced_accuracy = 0.163376 +macro_f1 = 0.080844 +weighted_f1 = 0.081672 +macro_precision = 0.078686 +macro_recall = 0.163376 +n_pca = 1 +best_cv_accuracy = 0.16873705078123655 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.168737 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.168820 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168612 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.168820 +Epoch 1, loss = 2.078788 +Epoch 50, loss = 1.944231 +Epoch 100, loss = 1.944209 +accuracy = 0.177846 +balanced_accuracy = 0.181269 +macro_f1 = 0.088504 +weighted_f1 = 0.087367 +macro_precision = 0.089734 +macro_recall = 0.181269 +n_pca = 1 +best_cv_accuracy = 0.1688202120734412 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144310 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144310 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.173489 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.173489 +Epoch 1, loss = 1.936875 +Epoch 50, loss = 1.934269 +Epoch 100, loss = 1.933903 +accuracy = 0.156353 +balanced_accuracy = 0.165472 +macro_f1 = 0.070539 +weighted_f1 = 0.066616 +macro_precision = 0.044856 +macro_recall = 0.165472 +n_pca = 1 +best_cv_accuracy = 0.17348907249256326 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144018 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144018 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.165527 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.165527 +Epoch 1, loss = 1.938160 +Epoch 50, loss = 1.935390 +Epoch 100, loss = 1.935231 +accuracy = 0.168635 +balanced_accuracy = 0.167925 +macro_f1 = 0.085381 +weighted_f1 = 0.086055 +macro_precision = 0.098007 +macro_recall = 0.167925 +n_pca = 1 +best_cv_accuracy = 0.16552737312343388 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143226 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143226 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.170779 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.170779 +Epoch 1, loss = 1.935322 +Epoch 50, loss = 1.935564 +Epoch 100, loss = 1.935143 +accuracy = 0.175012 +balanced_accuracy = 0.174719 +macro_f1 = 0.089359 +weighted_f1 = 0.089390 +macro_precision = 0.083887 +macro_recall = 0.174719 +n_pca = 1 +best_cv_accuracy = 0.17077947293433302 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144143 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.144143 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.168529 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.168529 +Epoch 1, loss = 1.934740 +Epoch 50, loss = 1.934910 +Epoch 100, loss = 1.934647 +accuracy = 0.168871 +balanced_accuracy = 0.166722 +macro_f1 = 0.087444 +weighted_f1 = 0.088048 +macro_precision = 0.090558 +macro_recall = 0.166722 +n_pca = 1 +best_cv_accuracy = 0.1685285767388717 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143601 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.143601 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.167861 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.167861 +Epoch 1, loss = 1.938840 +Epoch 50, loss = 1.935675 +Epoch 100, loss = 1.935554 +accuracy = 0.178791 +balanced_accuracy = 0.181877 +macro_f1 = 0.085606 +weighted_f1 = 0.084512 +macro_precision = 0.112223 +macro_recall = 0.181877 +n_pca = 1 +best_cv_accuracy = 0.16786148795292985 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.239808 +[02:42:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.240183 +[02:42:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.240850 +[02:42:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.239975 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.240850 +[02:42:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.234058 +balanced_accuracy = 0.237315 +macro_f1 = 0.224913 +weighted_f1 = 0.223718 +macro_precision = 0.236667 +macro_recall = 0.237315 +n_pca = 1 +best_cv_accuracy = 0.24085044377050768 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.242601 +[02:42:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:19] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.241684 +[02:42:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.240976 +[02:42:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.240475 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.242601 +[02:42:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.243741 +balanced_accuracy = 0.242729 +macro_f1 = 0.228397 +weighted_f1 = 0.228648 +macro_precision = 0.241732 +macro_recall = 0.242729 +n_pca = 1 +best_cv_accuracy = 0.2426013296340138 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.245144 +[02:42:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.244227 +[02:42:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.244352 +[02:42:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.242685 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.245144 +[02:42:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.234058 +balanced_accuracy = 0.233926 +macro_f1 = 0.223381 +weighted_f1 = 0.223485 +macro_precision = 0.228197 +macro_recall = 0.233926 +n_pca = 1 +best_cv_accuracy = 0.24514400191217278 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:42:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.242226 +[02:42:50] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.242518 +[02:42:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:51] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.242184 +[02:42:52] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:42:53] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.241517 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.242518 +[02:42:54] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.239726 +balanced_accuracy = 0.239061 +macro_f1 = 0.229268 +weighted_f1 = 0.229816 +macro_precision = 0.242386 +macro_recall = 0.239061 +n_pca = 1 +best_cv_accuracy = 0.24251794418738273 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:43:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.242893 +[02:43:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.242643 +[02:43:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.244310 +[02:43:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:43:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.241350 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.244310 +[02:43:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.238309 +balanced_accuracy = 0.238575 +macro_f1 = 0.231069 +weighted_f1 = 0.231015 +macro_precision = 0.244147 +macro_recall = 0.238575 +n_pca = 1 +best_cv_accuracy = 0.24431000669773426 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: WEEK +------------------------------------------------------------------------------------------ +y shape: (28224,) +classes: [0 1 2 3] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.288245 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.287912 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.287286 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.288245 +Epoch 1, loss = 1.552702 +Epoch 50, loss = 1.385800 +Epoch 100, loss = 1.385813 +accuracy = 0.299480 +balanced_accuracy = 0.250000 +macro_f1 = 0.115231 +weighted_f1 = 0.138037 +macro_precision = 0.074870 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28824510312761314 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.285327 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.284619 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.285077 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.285327 +Epoch 1, loss = 1.670119 +Epoch 50, loss = 1.385783 +Epoch 100, loss = 1.385815 +accuracy = 0.285309 +balanced_accuracy = 0.248275 +macro_f1 = 0.178379 +weighted_f1 = 0.204601 +macro_precision = 0.142198 +macro_recall = 0.248275 +n_pca = 1 +best_cv_accuracy = 0.2853271859138272 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.287036 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.282826 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.282951 +Best params: {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Best CV accuracy: 0.287036 +Epoch 1, loss = 1.484438 +Epoch 50, loss = 1.385796 +Epoch 100, loss = 1.385811 +accuracy = 0.289561 +balanced_accuracy = 0.250914 +macro_f1 = 0.170285 +weighted_f1 = 0.194964 +macro_precision = 0.142894 +macro_recall = 0.250914 +n_pca = 1 +best_cv_accuracy = 0.28703637905401785 +best_params = {'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.285202 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.285244 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.283993 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.285244 +Epoch 1, loss = 1.684925 +Epoch 50, loss = 1.382698 +Epoch 100, loss = 1.382755 +accuracy = 0.285546 +balanced_accuracy = 0.250000 +macro_f1 = 0.111060 +weighted_f1 = 0.126851 +macro_precision = 0.071386 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.2852439307895372 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.285577 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.286161 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.285786 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.286161 +Epoch 1, loss = 1.502684 +Epoch 50, loss = 1.382704 +Epoch 100, loss = 1.382516 +accuracy = 0.276807 +balanced_accuracy = 0.250000 +macro_f1 = 0.108398 +weighted_f1 = 0.120021 +macro_precision = 0.069202 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.2861609465480521 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.288245 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.288245 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.288245 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.288245 +Epoch 1, loss = 1.383552 +Epoch 50, loss = 1.376037 +Epoch 100, loss = 1.376055 +accuracy = 0.271375 +balanced_accuracy = 0.250000 +macro_f1 = 0.106725 +weighted_f1 = 0.115850 +macro_precision = 0.067844 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28824510312761314 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286244 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286244 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.286244 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.286244 +Epoch 1, loss = 1.383921 +Epoch 50, loss = 1.376157 +Epoch 100, loss = 1.376153 +accuracy = 0.282711 +balanced_accuracy = 0.250000 +macro_f1 = 0.110201 +weighted_f1 = 0.124620 +macro_precision = 0.070678 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28624426943995945 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287411 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287411 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287411 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.287411 +Epoch 1, loss = 1.383693 +Epoch 50, loss = 1.375931 +Epoch 100, loss = 1.375948 +accuracy = 0.276098 +balanced_accuracy = 0.250000 +macro_f1 = 0.108181 +weighted_f1 = 0.119474 +macro_precision = 0.069025 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.2874114206867929 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.285744 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.285744 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.285744 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.285744 +Epoch 1, loss = 1.383795 +Epoch 50, loss = 1.376375 +Epoch 100, loss = 1.376373 +accuracy = 0.285546 +balanced_accuracy = 0.250000 +macro_f1 = 0.111060 +weighted_f1 = 0.126851 +macro_precision = 0.071386 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.285744061018046 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287286 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287286 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.287286 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.287286 +Epoch 1, loss = 1.383786 +Epoch 50, loss = 1.375855 +Epoch 100, loss = 1.375829 +accuracy = 0.276807 +balanced_accuracy = 0.250000 +macro_f1 = 0.108398 +weighted_f1 = 0.120021 +macro_precision = 0.069202 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.28728636858131457 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.282451 +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.280325 +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.280992 +[02:49:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.278825 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.282451 +[02:49:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.277043 +balanced_accuracy = 0.250029 +macro_f1 = 0.192162 +weighted_f1 = 0.212268 +macro_precision = 0.216461 +macro_recall = 0.250029 +n_pca = 1 +best_cv_accuracy = 0.2824511543004214 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.282701 +[02:49:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.281576 +[02:49:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.281534 +[02:49:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.278199 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.282701 +[02:49:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.287199 +balanced_accuracy = 0.251305 +macro_f1 = 0.188150 +weighted_f1 = 0.214070 +macro_precision = 0.205018 +macro_recall = 0.251305 +n_pca = 1 +best_cv_accuracy = 0.28270134713057 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.279325 +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:49:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.277282 +[02:50:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.277157 +[02:50:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.276824 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.279325 +[02:50:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.280586 +balanced_accuracy = 0.248550 +macro_f1 = 0.188964 +weighted_f1 = 0.211938 +macro_precision = 0.269099 +macro_recall = 0.248550 +n_pca = 1 +best_cv_accuracy = 0.2793248203861007 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:50:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.279200 +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.279575 +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.281618 +[02:50:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.280951 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.281618 +[02:50:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.283184 +balanced_accuracy = 0.246935 +macro_f1 = 0.189360 +weighted_f1 = 0.215346 +macro_precision = 0.253818 +macro_recall = 0.246935 +n_pca = 1 +best_cv_accuracy = 0.2816177116527085 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[02:50:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:26] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.283451 +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.281742 +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:27] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.282784 +[02:50:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[02:50:28] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.279658 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.283451 +[02:50:29] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.274209 +balanced_accuracy = 0.243584 +macro_f1 = 0.181733 +weighted_f1 = 0.203762 +macro_precision = 0.186660 +macro_recall = 0.243584 +n_pca = 1 +best_cv_accuracy = 0.2834513261382473 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +========================================================================================== +Saved per-seed results to: results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_per_seed.csv +Saved summary results to: results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_summary.csv +========================================================================================== + dataset task ... n_pca_mean best_cv_accuracy_mean +0 PEMS07 DAY ... 1.0 0.169487 +1 PEMS07 DAY ... 1.0 0.169237 +2 PEMS07 DAY ... 1.0 0.243085 +3 PEMS07 HOUR ... 1.0 0.086878 +4 PEMS07 HOUR ... 1.0 0.237407 +5 PEMS07 HOUR ... 1.0 0.276999 +6 PEMS07 WEEK ... 1.0 0.286403 +7 PEMS07 WEEK ... 1.0 0.286986 +8 PEMS07 WEEK ... 1.0 0.281909 + +[9 rows x 21 columns] +Finished GPU BLIS W2 Torch classifier run for PEMS07 +Date: Wed Jul 8 02:50:29 MDT 2026 diff --git a/logs/torch_PEMS08-3074011.err b/logs/torch_PEMS08-3074011.err new file mode 100644 index 0000000..9112dc8 --- /dev/null +++ b/logs/torch_PEMS08-3074011.err @@ -0,0 +1,190 @@ +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") +/bsuhome/desmondboateng/miniforge3/envs/blis/lib/python3.11/site-packages/torch/nn/init.py:511: UserWarning: Initializing zero-element tensors is a no-op + warnings.warn("Initializing zero-element tensors is a no-op") diff --git a/logs/torch_PEMS08-3074011.out b/logs/torch_PEMS08-3074011.out new file mode 100644 index 0000000..2d46498 --- /dev/null +++ b/logs/torch_PEMS08-3074011.out @@ -0,0 +1,1599 @@ +Starting GPU BLIS W2 Torch classifier run for PEMS08 +Date: Wed Jul 8 02:27:21 MDT 2026 +Working directory: /bsuscratch/desmondboateng/blis +Python: /bsuhome/desmondboateng/miniforge3/envs/blis/bin/python +CUDA_VISIBLE_DEVICES: 0 +========================================================================================== +BLIS MOMENTS FROM new_class.py + TORCH CLASSIFICATION +SVC intentionally left out for now +========================================================================================== +Device: cuda +GPU: Tesla V100-PCIE-16GB +========================================================================================== +DATASET: PEMS08 +========================================================================================== +A shape: (170, 170) +X shape: (17856, 170, 3) +Saving scattering moments to: data/traffic/PEMS08/processed/blis/W2/largest_scale_4 +A shape: (170, 170) +X shape: (17856, 170, 3) +T: 17856 +n_nodes: 170 +n_features: 3 +================================================================================ +Computing layer_1 +================================================================================ +Skipping layer_1; moment files already exist. +================================================================================ +Computing layer_2 +================================================================================ +Skipping layer_2; moment files already exist. +================================================================================ +Computing layer_3 +================================================================================ +Skipping layer_3; moment files already exist. +Finished saving scattering moments. +Loading: data/traffic/PEMS08/processed/blis/W2/largest_scale_4/layer_1/moment_1.npy +Loading: data/traffic/PEMS08/processed/blis/W2/largest_scale_4/layer_2/moment_1.npy +Loading: data/traffic/PEMS08/processed/blis/W2/largest_scale_4/layer_3/moment_1.npy +X_features shape: (17856, 5652) +------------------------------------------------------------------------------------------ +TASK: HOUR +------------------------------------------------------------------------------------------ +y shape: (17856,) +classes: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.080582 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.085524 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.086381 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.086381 +Epoch 1, loss = 3.488174 +Epoch 50, loss = 2.995184 +Epoch 100, loss = 2.958890 +accuracy = 0.070922 +balanced_accuracy = 0.083719 +macro_f1 = 0.012790 +weighted_f1 = 0.011139 +macro_precision = 0.011183 +macro_recall = 0.083719 +n_pca = 1 +best_cv_accuracy = 0.08638070764973316 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.084075 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.089412 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.086776 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.089412 +Epoch 1, loss = 3.408057 +Epoch 50, loss = 3.148962 +Epoch 100, loss = 3.143365 +accuracy = 0.074655 +balanced_accuracy = 0.083333 +macro_f1 = 0.012320 +weighted_f1 = 0.010975 +macro_precision = 0.006672 +macro_recall = 0.083333 +n_pca = 1 +best_cv_accuracy = 0.0894116096725308 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.079726 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.091981 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.089873 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.091981 +Epoch 1, loss = 3.463785 +Epoch 50, loss = 3.144387 +Epoch 100, loss = 3.143546 +accuracy = 0.070175 +balanced_accuracy = 0.084259 +macro_f1 = 0.012795 +weighted_f1 = 0.010622 +macro_precision = 0.009008 +macro_recall = 0.084259 +n_pca = 1 +best_cv_accuracy = 0.09198128747446795 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.080846 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.099427 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.086249 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.099427 +Epoch 1, loss = 3.576661 +Epoch 50, loss = 3.157504 +Epoch 100, loss = 3.143972 +accuracy = 0.085106 +balanced_accuracy = 0.083781 +macro_f1 = 0.015205 +weighted_f1 = 0.015457 +macro_precision = 0.013130 +macro_recall = 0.083781 +n_pca = 1 +best_cv_accuracy = 0.09942676418264479 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.071226 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.101469 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.092574 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.101469 +Epoch 1, loss = 3.453012 +Epoch 50, loss = 3.152648 +Epoch 100, loss = 3.143783 +accuracy = 0.077641 +balanced_accuracy = 0.083333 +macro_f1 = 0.012491 +weighted_f1 = 0.011730 +macro_precision = 0.006777 +macro_recall = 0.083333 +n_pca = 1 +best_cv_accuracy = 0.10146932858931279 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043289 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043289 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.231139 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.231139 +Epoch 1, loss = 2.988237 +Epoch 50, loss = 2.147919 +Epoch 100, loss = 2.144007 +accuracy = 0.230310 +balanced_accuracy = 0.239813 +macro_f1 = 0.169151 +weighted_f1 = 0.165748 +macro_precision = 0.139804 +macro_recall = 0.239813 +n_pca = 1 +best_cv_accuracy = 0.23113922382552543 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042894 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042894 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.224946 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.224946 +Epoch 1, loss = 2.988657 +Epoch 50, loss = 2.149763 +Epoch 100, loss = 2.144492 +accuracy = 0.209406 +balanced_accuracy = 0.212450 +macro_f1 = 0.155498 +weighted_f1 = 0.154083 +macro_precision = 0.143945 +macro_recall = 0.212450 +n_pca = 1 +best_cv_accuracy = 0.22494564143111287 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043092 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043092 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.232852 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.232852 +Epoch 1, loss = 2.991608 +Epoch 50, loss = 2.152639 +Epoch 100, loss = 2.145642 +accuracy = 0.195595 +balanced_accuracy = 0.209125 +macro_f1 = 0.147075 +weighted_f1 = 0.140529 +macro_precision = 0.123331 +macro_recall = 0.209125 +n_pca = 1 +best_cv_accuracy = 0.2328523423601502 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043685 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.043685 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.222640 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.222640 +Epoch 1, loss = 2.941499 +Epoch 50, loss = 2.152443 +Epoch 100, loss = 2.147158 +accuracy = 0.217992 +balanced_accuracy = 0.216194 +macro_f1 = 0.153136 +weighted_f1 = 0.154975 +macro_precision = 0.129400 +macro_recall = 0.216194 +n_pca = 1 +best_cv_accuracy = 0.2226395203268103 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042696 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.042696 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.225275 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.225275 +Epoch 1, loss = 2.975976 +Epoch 50, loss = 2.149604 +Epoch 100, loss = 2.144924 +accuracy = 0.234416 +balanced_accuracy = 0.235410 +macro_f1 = 0.168422 +weighted_f1 = 0.169771 +macro_precision = 0.153894 +macro_recall = 0.235410 +n_pca = 1 +best_cv_accuracy = 0.22527508730315612 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:19:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.272452 +[03:19:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.271595 +[03:19:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.272254 +[03:19:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:19:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.269421 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.272452 +[03:19:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.275476 +balanced_accuracy = 0.280407 +macro_f1 = 0.233043 +weighted_f1 = 0.230196 +macro_precision = 0.232034 +macro_recall = 0.280407 +n_pca = 1 +best_cv_accuracy = 0.27245173617974566 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:23:31] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:32] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.271727 +[03:23:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.269487 +[03:23:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.270475 +[03:23:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:23:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.267708 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.271727 +[03:23:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.274356 +balanced_accuracy = 0.274370 +macro_f1 = 0.236381 +weighted_f1 = 0.237401 +macro_precision = 0.243179 +macro_recall = 0.274370 +n_pca = 1 +best_cv_accuracy = 0.2717269552612506 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:28:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:03] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.271002 +[03:28:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.270080 +[03:28:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.268894 +[03:28:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:11] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:28:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.266917 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.271002 +[03:28:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.269130 +balanced_accuracy = 0.277452 +macro_f1 = 0.232769 +weighted_f1 = 0.229551 +macro_precision = 0.248329 +macro_recall = 0.277452 +n_pca = 1 +best_cv_accuracy = 0.2710021743427555 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:32:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.273835 +[03:32:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.271134 +[03:32:37] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.271200 +[03:32:41] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:32:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.267312 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.273835 +[03:32:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.264278 +balanced_accuracy = 0.265696 +macro_f1 = 0.227930 +weighted_f1 = 0.228060 +macro_precision = 0.228887 +macro_recall = 0.265696 +n_pca = 1 +best_cv_accuracy = 0.2738354088423272 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[03:37:04] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:05] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.268235 +[03:37:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.266192 +[03:37:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:10] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.266126 +[03:37:12] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:13] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[03:37:14] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.263623 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.268235 +[03:37:15] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.289287 +balanced_accuracy = 0.287427 +macro_f1 = 0.248270 +weighted_f1 = 0.252505 +macro_precision = 0.248145 +macro_recall = 0.287427 +n_pca = 1 +best_cv_accuracy = 0.2682348290175924 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: DAY +------------------------------------------------------------------------------------------ +y shape: (17856,) +classes: [0 1 2 3 4 5 6] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.145549 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.181063 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.180207 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.181063 +Epoch 1, loss = 2.158587 +Epoch 50, loss = 1.943465 +Epoch 100, loss = 1.943351 +accuracy = 0.171706 +balanced_accuracy = 0.171562 +macro_f1 = 0.084802 +weighted_f1 = 0.085021 +macro_precision = 0.074292 +macro_recall = 0.171562 +n_pca = 1 +best_cv_accuracy = 0.18106345127495552 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.141859 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.176451 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.172827 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.176451 +Epoch 1, loss = 2.258958 +Epoch 50, loss = 1.945996 +Epoch 100, loss = 1.943436 +accuracy = 0.177678 +balanced_accuracy = 0.174129 +macro_f1 = 0.085221 +weighted_f1 = 0.086855 +macro_precision = 0.101644 +macro_recall = 0.174129 +n_pca = 1 +best_cv_accuracy = 0.1764512090663504 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.138631 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.178560 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.171246 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.178560 +Epoch 1, loss = 2.255115 +Epoch 50, loss = 1.943585 +Epoch 100, loss = 1.943328 +accuracy = 0.173572 +balanced_accuracy = 0.166610 +macro_f1 = 0.079897 +weighted_f1 = 0.082600 +macro_precision = 0.062342 +macro_recall = 0.166610 +n_pca = 1 +best_cv_accuracy = 0.17855966264742704 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.144759 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.172498 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.168281 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.172498 +Epoch 1, loss = 2.308733 +Epoch 50, loss = 1.945429 +Epoch 100, loss = 1.943577 +accuracy = 0.186264 +balanced_accuracy = 0.173428 +macro_f1 = 0.088597 +weighted_f1 = 0.094300 +macro_precision = 0.067550 +macro_recall = 0.173428 +n_pca = 1 +best_cv_accuracy = 0.17249785860183173 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.165052 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.168808 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.173091 +Best params: {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +Best CV accuracy: 0.173091 +Epoch 1, loss = 2.068080 +Epoch 50, loss = 1.937290 +Epoch 100, loss = 1.937363 +accuracy = 0.177305 +balanced_accuracy = 0.177634 +macro_f1 = 0.088635 +weighted_f1 = 0.088625 +macro_precision = 0.128992 +macro_recall = 0.177634 +n_pca = 1 +best_cv_accuracy = 0.1730908611715095 +best_params = {'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.147262 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.147262 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.175331 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.175331 +Epoch 1, loss = 1.938191 +Epoch 50, loss = 1.934586 +Epoch 100, loss = 1.934741 +accuracy = 0.180291 +balanced_accuracy = 0.180411 +macro_f1 = 0.100015 +weighted_f1 = 0.099303 +macro_precision = 0.084727 +macro_recall = 0.180411 +n_pca = 1 +best_cv_accuracy = 0.17533109310140346 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146274 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146274 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.173025 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.173025 +Epoch 1, loss = 1.937803 +Epoch 50, loss = 1.934654 +Epoch 100, loss = 1.934878 +accuracy = 0.174692 +balanced_accuracy = 0.170992 +macro_f1 = 0.085578 +weighted_f1 = 0.087292 +macro_precision = 0.078822 +macro_recall = 0.170992 +n_pca = 1 +best_cv_accuracy = 0.17302497199710087 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.147394 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.147394 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.175133 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.175133 +Epoch 1, loss = 1.934596 +Epoch 50, loss = 1.934390 +Epoch 100, loss = 1.934615 +accuracy = 0.172826 +balanced_accuracy = 0.168235 +macro_f1 = 0.084454 +weighted_f1 = 0.086849 +macro_precision = 0.067273 +macro_recall = 0.168235 +n_pca = 1 +best_cv_accuracy = 0.1751334255781775 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146076 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146076 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.169203 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.169203 +Epoch 1, loss = 1.938749 +Epoch 50, loss = 1.935804 +Epoch 100, loss = 1.935629 +accuracy = 0.195222 +balanced_accuracy = 0.183827 +macro_f1 = 0.103584 +weighted_f1 = 0.109110 +macro_precision = 0.101912 +macro_recall = 0.183827 +n_pca = 1 +best_cv_accuracy = 0.1692033998813995 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146010 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.146010 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.171641 +Best params: {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.171641 +Epoch 1, loss = 1.940405 +Epoch 50, loss = 1.935459 +Epoch 100, loss = 1.935187 +accuracy = 0.178798 +balanced_accuracy = 0.178961 +macro_f1 = 0.086122 +weighted_f1 = 0.086124 +macro_precision = 0.079652 +macro_recall = 0.178961 +n_pca = 1 +best_cv_accuracy = 0.17164129933451933 +best_params = {'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:27:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:33] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.236015 +[04:27:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.237794 +[04:27:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:34] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.237333 +[04:27:35] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:27:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.233907 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.237794 +[04:27:36] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.238149 +balanced_accuracy = 0.240502 +macro_f1 = 0.219404 +weighted_f1 = 0.218180 +macro_precision = 0.230079 +macro_recall = 0.240502 +n_pca = 1 +best_cv_accuracy = 0.2377940304407986 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:31:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:56] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.234763 +[04:31:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.234500 +[04:31:57] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.235224 +[04:31:58] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:31:59] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.233379 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.235224 +[04:32:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.236655 +balanced_accuracy = 0.237805 +macro_f1 = 0.212039 +weighted_f1 = 0.211114 +macro_precision = 0.219390 +macro_recall = 0.237805 +n_pca = 1 +best_cv_accuracy = 0.23522435263886146 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:36:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.232523 +[04:36:20] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.231864 +[04:36:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.231864 +[04:36:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:36:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.228965 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.232523 +[04:36:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.250467 +balanced_accuracy = 0.244849 +macro_f1 = 0.221839 +weighted_f1 = 0.225449 +macro_precision = 0.249195 +macro_recall = 0.244849 +n_pca = 1 +best_cv_accuracy = 0.232522896488107 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:40:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.229953 +[04:40:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.232062 +[04:40:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.231271 +[04:40:45] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:40:46] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.230217 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.232062 +[04:40:47] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.239268 +balanced_accuracy = 0.233885 +macro_f1 = 0.209879 +weighted_f1 = 0.214454 +macro_precision = 0.220743 +macro_recall = 0.233885 +n_pca = 1 +best_cv_accuracy = 0.2320616722672465 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[04:45:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.238914 +[04:45:06] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.238387 +[04:45:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:07] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.240166 +[04:45:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:08] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[04:45:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.234895 +Best params: {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.240166 +[04:45:09] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.245987 +balanced_accuracy = 0.244143 +macro_f1 = 0.217985 +weighted_f1 = 0.219388 +macro_precision = 0.227325 +macro_recall = 0.244143 +n_pca = 1 +best_cv_accuracy = 0.24016604071950978 +best_params = {'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6} +------------------------------------------------------------------------------------------ +TASK: WEEK +------------------------------------------------------------------------------------------ +y shape: (17856,) +classes: [0 1 2 3] +------------------------------------------------------------------------------------------ +MODEL: LR +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.301838 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.320946 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.320946 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.320946 +Epoch 1, loss = 1.566264 +Epoch 50, loss = 1.381514 +Epoch 100, loss = 1.381439 +accuracy = 0.331840 +balanced_accuracy = 0.250000 +macro_f1 = 0.124580 +weighted_f1 = 0.165362 +macro_precision = 0.082960 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.32094616854450814 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 43 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.300850 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.323055 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.323055 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.323055 +Epoch 1, loss = 1.659288 +Epoch 50, loss = 1.381372 +Epoch 100, loss = 1.381168 +accuracy = 0.319895 +balanced_accuracy = 0.250000 +macro_f1 = 0.121182 +weighted_f1 = 0.155062 +macro_precision = 0.079974 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3230546221255848 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 44 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.280161 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.323977 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.323977 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.323977 +Epoch 1, loss = 1.549434 +Epoch 50, loss = 1.381132 +Epoch 100, loss = 1.381070 +accuracy = 0.314670 +balanced_accuracy = 0.250000 +macro_f1 = 0.119676 +weighted_f1 = 0.150634 +macro_precision = 0.078667 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3239770705673058 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 45 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.294920 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.321539 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.321539 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.321539 +Epoch 1, loss = 1.744959 +Epoch 50, loss = 1.384930 +Epoch 100, loss = 1.381335 +accuracy = 0.328481 +balanced_accuracy = 0.250000 +macro_f1 = 0.123630 +weighted_f1 = 0.162441 +macro_precision = 0.082120 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.32153917111418595 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Seed: 56 +PCA components: 1 +Manual Torch grid search for LR +Number of settings: 3 +params={'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}, cv_accuracy=0.306055 +params={'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}, cv_accuracy=0.324175 +params={'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}, cv_accuracy=0.324175 +Best params: {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +Best CV accuracy: 0.324175 +Epoch 1, loss = 1.538428 +Epoch 50, loss = 1.381354 +Epoch 100, loss = 1.381124 +accuracy = 0.313550 +balanced_accuracy = 0.250000 +macro_f1 = 0.119352 +weighted_f1 = 0.149691 +macro_precision = 0.078387 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3241747380905317 +best_params = {'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0} +------------------------------------------------------------------------------------------ +MODEL: MLP +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.320946 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.320946 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.320946 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.320946 +Epoch 1, loss = 1.384509 +Epoch 50, loss = 1.373631 +Epoch 100, loss = 1.373620 +accuracy = 0.331840 +balanced_accuracy = 0.250000 +macro_f1 = 0.124580 +weighted_f1 = 0.165362 +macro_precision = 0.082960 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.32094616854450814 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 43 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323055 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323055 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323055 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.323055 +Epoch 1, loss = 1.384713 +Epoch 50, loss = 1.372836 +Epoch 100, loss = 1.372842 +accuracy = 0.319895 +balanced_accuracy = 0.250000 +macro_f1 = 0.121182 +weighted_f1 = 0.155062 +macro_precision = 0.079974 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3230546221255848 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 44 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323977 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323977 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.323977 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.323977 +Epoch 1, loss = 1.384530 +Epoch 50, loss = 1.372552 +Epoch 100, loss = 1.372534 +accuracy = 0.314670 +balanced_accuracy = 0.250000 +macro_f1 = 0.119676 +weighted_f1 = 0.150634 +macro_precision = 0.078667 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3239770705673058 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 45 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.321539 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.321539 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.321539 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.321539 +Epoch 1, loss = 1.384541 +Epoch 50, loss = 1.373417 +Epoch 100, loss = 1.373407 +accuracy = 0.328481 +balanced_accuracy = 0.250000 +macro_f1 = 0.123630 +weighted_f1 = 0.162441 +macro_precision = 0.082120 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.32153917111418595 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Seed: 56 +PCA components: 1 +Manual Torch grid search for MLP +Number of settings: 3 +params={'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.324175 +params={'hidden_layer_sizes': (0, 0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.324175 +params={'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}, cv_accuracy=0.324175 +Best params: {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +Best CV accuracy: 0.324175 +Epoch 1, loss = 1.384510 +Epoch 50, loss = 1.372479 +Epoch 100, loss = 1.372469 +accuracy = 0.313550 +balanced_accuracy = 0.250000 +macro_f1 = 0.119352 +weighted_f1 = 0.149691 +macro_precision = 0.078387 +macro_recall = 0.250000 +n_pca = 1 +best_cv_accuracy = 0.3241747380905317 +best_params = {'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01} +------------------------------------------------------------------------------------------ +MODEL: XGB +------------------------------------------------------------------------------------------ +Seed: 42 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:35:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.314621 +[05:35:16] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.312512 +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.312644 +[05:35:17] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:35:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.308361 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.314621 +[05:35:18] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.323628 +balanced_accuracy = 0.249625 +macro_f1 = 0.154005 +weighted_f1 = 0.190458 +macro_precision = 0.250802 +macro_recall = 0.249625 +n_pca = 1 +best_cv_accuracy = 0.31462080780127827 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 43 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.322528 +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.323055 +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:38] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.322198 +[05:39:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:39:39] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.313764 +Best params: {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Best CV accuracy: 0.323055 +[05:39:40] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.317656 +balanced_accuracy = 0.255470 +macro_f1 = 0.160677 +weighted_f1 = 0.189518 +macro_precision = 0.270292 +macro_recall = 0.255470 +n_pca = 1 +best_cv_accuracy = 0.3230546221255848 +best_params = {'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6} +Seed: 44 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.319497 +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.318640 +[05:44:00] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.318969 +[05:44:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:44:01] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.311458 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.319497 +[05:44:02] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.313177 +balanced_accuracy = 0.253909 +macro_f1 = 0.151607 +weighted_f1 = 0.179199 +macro_precision = 0.278438 +macro_recall = 0.253909 +n_pca = 1 +best_cv_accuracy = 0.31949660670751795 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 45 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:48:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:21] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.319035 +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.315016 +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:22] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.316268 +[05:48:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:48:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.308888 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.319035 +[05:48:23] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.331094 +balanced_accuracy = 0.260312 +macro_f1 = 0.168036 +weighted_f1 = 0.201573 +macro_precision = 0.332091 +macro_recall = 0.260312 +n_pca = 1 +best_cv_accuracy = 0.31903538248665747 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Seed: 56 +PCA components: 1 +Manual XGB grid search +Number of settings: 4 +[05:52:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:42] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.319233 +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.315148 +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:43] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}, cv_accuracy=0.315411 +[05:52:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +[05:52:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +params={'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}, cv_accuracy=0.305989 +Best params: {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +Best CV accuracy: 0.319233 +[05:52:44] WARNING: /home/conda/feedstock_root/build_artifacts/xgboost-split_1700181168148/work/src/learner.cc:767: +Parameters: { "device" } are not used. + +accuracy = 0.309817 +balanced_accuracy = 0.251605 +macro_f1 = 0.146927 +weighted_f1 = 0.173968 +macro_precision = 0.245311 +macro_recall = 0.251605 +n_pca = 1 +best_cv_accuracy = 0.3192330500098834 +best_params = {'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6} +========================================================================================== +Saved per-seed results to: results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_per_seed.csv +Saved summary results to: results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_summary.csv +========================================================================================== + dataset task ... n_pca_mean best_cv_accuracy_mean +0 PEMS08 DAY ... 1.0 0.176333 +1 PEMS08 DAY ... 1.0 0.172867 +2 PEMS08 DAY ... 1.0 0.235554 +3 PEMS08 HOUR ... 1.0 0.093734 +4 PEMS08 HOUR ... 1.0 0.227370 +5 PEMS08 HOUR ... 1.0 0.271450 +6 PEMS08 WEEK ... 1.0 0.322738 +7 PEMS08 WEEK ... 1.0 0.322738 +8 PEMS08 WEEK ... 1.0 0.319088 + +[9 rows x 21 columns] +Finished GPU BLIS W2 Torch classifier run for PEMS08 +Date: Wed Jul 8 05:52:47 MDT 2026 diff --git a/new_class.py b/new_class.py new file mode 100644 index 0000000..352ecb2 --- /dev/null +++ b/new_class.py @@ -0,0 +1,287 @@ +import os +import numpy as np + + +class GraphScattering: + def __init__(self, label_path=None, adjacency_path=None, signal_path=None): + self.label_path = label_path + self.adjacency_path = adjacency_path + self.signal_path = signal_path + + def relu(self, x): + return np.maximum(0, x) + + def reverse_relu(self, x): + return np.maximum(0, -x) + + def load_data(self): + self.labels = np.load(self.label_path) if self.label_path is not None else None + self.A = np.load(self.adjacency_path) if self.adjacency_path is not None else None + self.X = np.load(self.signal_path) if self.signal_path is not None else None + + if self.A is not None: + print(f"Loaded adjacency matrix A with shape: {self.A.shape}") + + if self.X is not None: + print(f"Loaded graph signals X with shape: {self.X.shape}") + + if self.labels is not None: + print(f"Loaded labels with shape: {self.labels.shape}") + + return self.A, self.X, self.labels + + def get_P(self, A): + A = np.asarray(A, dtype=float) + + d_arr = np.sum(A, axis=0) + + d_arr_inv = np.divide( + 1.0, + d_arr, + out=np.zeros_like(d_arr, dtype=float), + where=d_arr != 0, + ) + + D_inv = np.diag(d_arr_inv) + + P = 0.5 * (np.eye(A.shape[0]) + A @ D_inv) + + return P + + def compute_W_2_transform(self, A, X, largest_scale, low_pass_as_wavelet=True): + A = np.asarray(A, dtype=float) + X = np.asarray(X, dtype=float) + + if X.ndim == 1: + X = X[:, None] + + n_nodes = A.shape[0] + + if X.shape[0] != n_nodes: + raise ValueError( + f"Node mismatch: X has {X.shape[0]} rows, but A is {n_nodes}x{n_nodes}." + ) + + P = self.get_P(A) + I = np.eye(n_nodes) + + coeffs = [] + + C0 = (I - P) @ X + coeffs.append(C0) + + a = X.copy() + + for j in range(1, largest_scale): + pow_val = 2 ** (j - 1) + + prev = a.copy() + + for _ in range(pow_val): + prev = P @ prev + + curr = prev.copy() + + for _ in range(pow_val): + curr = P @ curr + + a_j = prev - curr + + coeffs.append(a_j) + + if low_pass_as_wavelet: + if largest_scale == 0: + low_pass_steps = 0 + else: + low_pass_steps = 2 ** (largest_scale - 1) + + low_pass = X.copy() + + for _ in range(low_pass_steps): + low_pass = P @ low_pass + + coeffs.append(low_pass) + + out = np.concatenate(coeffs, axis=1) + + return out + + def calculate_scattering(self, A, X, J, Q, layer_num=1): + X = np.asarray(X, dtype=float) + + if X.ndim == 1: + X = X[:, None] + + n_nodes, T = X.shape + + num_wavelets = J + 2 + num_activations = 2 + num_paths = (num_wavelets * num_activations) ** layer_num + + B = np.zeros((T, num_paths, 1, Q), dtype=float) + + path_index = 0 + + def build_layer(current_layer, current_signal): + nonlocal path_index + + if current_layer == layer_num: + for q in range(1, Q + 1): + moment = np.sum(np.abs(current_signal) ** q, axis=0) + B[:, path_index, 0, q - 1] = moment + + path_index += 1 + + return + + x1 = self.compute_W_2_transform( + A, + current_signal, + largest_scale=J + 1, + low_pass_as_wavelet=True, + ) + + signal_width = current_signal.shape[1] + num_wavelets_here = x1.shape[1] // signal_width + + for j in range(num_wavelets_here): + start = j * signal_width + end = (j + 1) * signal_width + + wavelet_signal = x1[:, start:end] + + build_layer(current_layer + 1, self.relu(wavelet_signal)) + build_layer(current_layer + 1, self.reverse_relu(wavelet_signal)) + + build_layer(0, X) + + return B + + def save_scattering_moments( + self, + A, + X, + data_dir, + dataset="traffic", + sub_dataset="PEMS08", + scattering_type="blis", + wavelet_type="W2", + largest_scale=4, + highest_moment=3, + layer_list=(1, 2, 3), + force_recompute=False, + ): + X = np.asarray(X, dtype=float) + + if X.ndim == 2: + X = X[:, :, None] + + T, n_nodes, n_features = X.shape + + save_base = os.path.join( + data_dir, + dataset, + sub_dataset, + "processed", + scattering_type, + wavelet_type, + f"largest_scale_{largest_scale}", + ) + + os.makedirs(save_base, exist_ok=True) + + print(f"Saving scattering moments to: {save_base}") + print(f"A shape: {A.shape}") + print(f"X shape: {X.shape}") + print(f"T: {T}") + print(f"n_nodes: {n_nodes}") + print(f"n_features: {n_features}") + + for layer_num in layer_list: + print("=" * 80) + print(f"Computing layer_{layer_num}") + print("=" * 80) + + layer_dir = os.path.join(save_base, f"layer_{layer_num}") + os.makedirs(layer_dir, exist_ok=True) + + expected_files = [ + os.path.join(layer_dir, f"moment_{q}.npy") + for q in range(1, highest_moment + 1) + ] + + if not force_recompute and all(os.path.exists(path) for path in expected_files): + print(f"Skipping layer_{layer_num}; moment files already exist.") + continue + + all_moments = [[] for _ in range(highest_moment)] + + for f in range(n_features): + print(f"Computing channel {f + 1}/{n_features}") + + X_channel = X[:, :, f].T + + print(f"X_channel shape: {X_channel.shape}") + + B = self.calculate_scattering( + A, + X_channel, + J=largest_scale, + Q=highest_moment, + layer_num=layer_num, + ) + + print(f"B shape: {B.shape}") + + for q in range(highest_moment): + all_moments[q].append(B[:, :, :, q]) + + for q in range(highest_moment): + moment_q = np.concatenate(all_moments[q], axis=2) + moment_q = moment_q.astype(np.float32) + + save_path = os.path.join(layer_dir, f"moment_{q + 1}.npy") + + np.save(save_path, moment_q) + + print(f"Saved: {save_path}") + print(f"moment_{q + 1} shape: {moment_q.shape}") + + print("Finished saving scattering moments.") + + +if __name__ == "__main__": + data_path = os.path.join( + os.path.dirname(__file__), + "data", + "traffic", + "PEMS08", + ) + + label_path = os.path.join(data_path, "DAY", "label.npy") + adjacency_path = os.path.join(data_path, "adjacency_matrix.npy") + signal_path = os.path.join(data_path, "graph_signals.npy") + + gs = GraphScattering( + label_path=label_path, + adjacency_path=adjacency_path, + signal_path=signal_path, + ) + + A_real, X_real, labels_real = gs.load_data() + + data_dir = os.path.join(os.path.dirname(__file__), "data") + + gs.save_scattering_moments( + A=A_real, + X=X_real, + data_dir=data_dir, + dataset="traffic", + sub_dataset="PEMS08", + scattering_type="blis", + wavelet_type="W2", + largest_scale=4, + highest_moment=3, + layer_list=(1, 2, 3), + force_recompute=True, + ) \ No newline at end of file diff --git a/rational_approximations/MinMaxRatN10.mat b/rational_approximations/MinMaxRatN10.mat new file mode 100644 index 0000000..7525f31 Binary files /dev/null and b/rational_approximations/MinMaxRatN10.mat differ diff --git a/rational_approximations/MinMaxRatN14.mat b/rational_approximations/MinMaxRatN14.mat new file mode 100644 index 0000000..1eebbf2 Binary files /dev/null and b/rational_approximations/MinMaxRatN14.mat differ diff --git a/rational_approximations/rational_approx.ipynb b/rational_approximations/rational_approx.ipynb new file mode 100644 index 0000000..94ce78d --- /dev/null +++ b/rational_approximations/rational_approx.ipynb @@ -0,0 +1,2593 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-14T16:57:59.386439Z", + "start_time": "2025-08-14T16:57:58.962670Z" + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name '__file__' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 2\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mos\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01mimport\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msys\u001b[39;00m \n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m sys.path.append(os.path.abspath(os.path.join(os.path.dirname(\u001b[34;43m__file__\u001b[39;49m), \u001b[33m'\u001b[39m\u001b[33m..\u001b[39m\u001b[33m'\u001b[39m, \u001b[33m'\u001b[39m\u001b[33m..\u001b[39m\u001b[33m'\u001b[39m)))\n\u001b[32m 5\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mblis\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mmodels\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mwavelets\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m compute_W_2_transform\n", + "\u001b[31mNameError\u001b[39m: name '__file__' is not defined" + ] + } + ], + "source": [ + "import numpy as np\n", + "import os\n", + "import sys \n", + "sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))\n", + "from blis.models.wavelets import compute_W_2_transform" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/desmondboateng/Desktop/blis/rational_approximations\n" + ] + } + ], + "source": [ + "print(os.getcwd())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-19T05:47:06.818989Z", + "start_time": "2025-08-19T05:47:06.810148Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adjacency matrix shape: (100, 100)\n", + "Signal matrix shape: (400, 100)\n", + "(400,)\n", + "This is the dimension of X before processing: (400, 100)\n", + "X shape: (400, 100, 1)\n", + "\n", + "\n", + "this is c_terms shape: (6, 100, 100)\n", + "C1: 1\n", + "c_1: [[-2.91604110e-08 1.44432626e-01 -1.65882531e-03 ... -9.41673830e-04\n", + " -5.27879634e-07 -2.19525338e-09]\n", + " [-1.14254139e-02 -1.08873765e-03 -1.13037389e-05 ... 2.21858646e-01\n", + " -4.71124819e-03 -3.48984736e-04]\n", + " [ 7.59132941e-04 -1.70739142e-05 7.43039978e-03 ... 6.93710758e-02\n", + " -1.53589885e-03 -1.04100118e-02]\n", + " ...\n", + " [-5.62588025e-03 -2.32139807e-04 -1.49344893e-05 ... 1.46758664e-02\n", + " -8.36488396e-03 -7.59745935e-04]\n", + " [ 2.95150377e-02 8.39402349e-02 -1.68008323e-02 ... -1.26058147e-02\n", + " -6.50066946e-02 -2.86201757e-02]\n", + " [-1.01021159e-01 1.86027015e-02 -1.16492003e-02 ... -1.04166041e-03\n", + " 1.66876285e-02 -3.53532701e-03]]\n", + "C2: 2\n", + "c_2: [[-1.89459450e-05 1.17591426e-01 -1.45633511e-02 ... -1.46728792e-03\n", + " -1.89840405e-04 -1.45388219e-06]\n", + " [-2.88413307e-02 -6.13747425e-03 -5.40574803e-04 ... 1.92158147e-01\n", + " -2.05004820e-02 -3.49430827e-03]\n", + " [-8.90358267e-03 -3.88023291e-04 -6.58836103e-03 ... 7.64352190e-02\n", + " -9.18583176e-03 -3.79670585e-02]\n", + " ...\n", + " [-2.03059166e-02 -1.45299021e-03 -5.95845062e-04 ... 5.33910240e-02\n", + " -2.49974140e-02 -5.57665825e-03]\n", + " [ 8.37766854e-02 7.76670672e-02 -2.74178433e-03 ... -2.26015983e-02\n", + " -6.63074868e-02 -2.32606509e-02]\n", + " [-4.89685175e-02 1.03944475e-01 -2.77024290e-02 ... -9.16694458e-03\n", + " 2.23404751e-02 -1.46582458e-02]]\n", + "C3: 3\n", + "c_3: [[-0.00056858 0.06778027 -0.03222313 ... -0.0106498 -0.00195992\n", + " -0.00051528]\n", + " [-0.04595179 -0.01184203 -0.00557127 ... 0.13054772 -0.05284644\n", + " -0.01883265]\n", + " [-0.01978377 -0.00390837 0.01455331 ... 0.07011575 -0.01601965\n", + " -0.04340868]\n", + " ...\n", + " [-0.05142645 -0.00699196 -0.00598637 ... 0.08592941 -0.04974702\n", + " -0.021519 ]\n", + " [ 0.11472341 0.07985828 0.01983043 ... -0.02210253 -0.02712966\n", + " 0.00417426]\n", + " [ 0.01520104 0.14354236 -0.02564345 ... -0.02537369 0.03476023\n", + " -0.01957192]]\n", + "C4: 4\n", + "c_4: [[-0.00446761 0.03500767 -0.03158628 ... -0.02574091 -0.00833769\n", + " -0.00620039]\n", + " [-0.05700889 -0.01786829 -0.0144026 ... 0.08353629 -0.06229396\n", + " -0.03436775]\n", + " [-0.01441426 -0.01632426 0.04309547 ... 0.0550172 -0.0140024\n", + " -0.01455473]\n", + " ...\n", + " [-0.07389325 -0.0201639 -0.0163024 ... 0.08567763 -0.05974493\n", + " -0.03887561]\n", + " [ 0.09298861 0.07355655 0.02484591 ... -0.01315887 0.01768209\n", + " 0.01769627]\n", + " [ 0.04835769 0.12208329 -0.00563847 ... -0.02785297 0.04449471\n", + " -0.0085347 ]]\n", + "C5: 5\n", + "c_5: [[-0.015999 0.01632968 -0.01120214 ... -0.02035898 -0.02370514\n", + " -0.01961065]\n", + " [-0.02632849 -0.02224926 -0.01663814 ... 0.05090395 -0.03040837\n", + " -0.02760199]\n", + " [-0.00558937 -0.02268586 0.04273926 ... 0.03390366 -0.01608331\n", + " 0.00896007]\n", + " ...\n", + " [-0.0377763 -0.03106503 -0.01939124 ... 0.06088726 -0.0359104\n", + " -0.0328277 ]\n", + " [ 0.0582206 0.04988352 0.01892076 ... -0.00237926 0.02828594\n", + " 0.00350292]\n", + " [ 0.04714131 0.08007447 0.00231763 ... -0.01825573 0.05224548\n", + " -0.0079477 ]]\n", + "C6: 6\n", + "c_6: [[-0.0164306 0.00729326 -0.00030438 ... -0.00872666 -0.02439426\n", + " -0.01837086]\n", + " [-0.00155542 -0.0164933 -0.01125214 ... 0.02975225 -0.01005187\n", + " -0.01519611]\n", + " [-0.00376419 -0.01499381 0.02477908 ... 0.01610349 -0.01448596\n", + " 0.01129499]\n", + " ...\n", + " [-0.00539264 -0.02293673 -0.01315361 ... 0.03632657 -0.01422134\n", + " -0.0179009 ]\n", + " [ 0.0307305 0.02797356 0.01041605 ... -0.00020812 0.02139064\n", + " -0.00315701]\n", + " [ 0.02828447 0.04616248 0.00096621 ... -0.01131708 0.04139628\n", + " -0.00925175]]\n" + ] + } + ], + "source": [ + "script_dir = os.getcwd()\n", + "project_root = os.path.dirname(script_dir)\n", + "data_path = os.path.join(project_root, 'data', 'synthetic', 'gaussian_pm_0')\n", + "\n", + "adjacency_path = os.path.join(data_path, 'adjacency_matrix.npy')\n", + "A = np.load(adjacency_path)\n", + "print(f\"Adjacency matrix shape: {A.shape}\")\n", + "\n", + "signal_path = os.path.join(data_path, 'graph_signals.npy')\n", + "X = np.load(signal_path)\n", + "print(f\"Signal matrix shape: {X.shape}\")\n", + "\n", + "def get_P(A: np.ndarray) -> np.ndarray:\n", + " d_arr = np.sum(A, axis=0)\n", + " d_arr_inv = 1/d_arr\n", + " d_arr_inv[np.isinf(d_arr_inv)] = 0\n", + " D_inv = np.diag(d_arr_inv)\n", + " P = 0.5 * (np.eye(D_inv.shape[0]) + A @ D_inv)\n", + " return P\n", + "\n", + "def compute_W_2_transform(A, X, largest_scale, low_pass_as_wavelet=False):\n", + " print(f'This is the dimension of X before processing: {X.shape}')\n", + " if X.ndim == 2:\n", + " X= X[:, :, None]\n", + " print(f\"X shape: {X.shape}\")\n", + " p, n, _ = X.shape\n", + " P = get_P(A)\n", + " m = A.shape[0]\n", + " I = np.eye(m)\n", + " coeffs = []\n", + " C0 = np.zeros((m, n))\n", + " for i in range(n):\n", + " x_i = X[i, :, 0]\n", + " C0[:, i] = (I - P) @ x_i\n", + " coeffs.append(C0)\n", + " a = C0.copy()\n", + " for j in range(1, largest_scale+1):\n", + " pow_val = 2 ** (j - 1)\n", + " prev = a.copy()\n", + " for _ in range(pow_val):\n", + " prev = P @ prev\n", + " curr = prev.copy()\n", + " for _ in range(pow_val):\n", + " curr = P @ curr\n", + " a = prev + curr\n", + " coeffs.append(a)\n", + " if low_pass_as_wavelet:\n", + " low_pass = a.copy()\n", + " for _ in range(2 ** (largest_scale - 1)):\n", + " low_pass = P @ low_pass\n", + " coeffs.append(low_pass)\n", + " coeffs_array = np.stack(coeffs, axis=0)\n", + " return coeffs_array\n", + "\n", + "\n", + "x = X[:, 4]\n", + "print(x.shape)\n", + "num_terms = 4\n", + "c_terms = compute_W_2_transform(A,X, largest_scale=4, low_pass_as_wavelet=True)\n", + "print()\n", + "print()\n", + "print(f'this is c_terms shape: {c_terms.shape}')\n", + "\n", + "for idx, c in enumerate(c_terms):\n", + " print(f\"C{idx+1}: {idx+1}\")\n", + " print(f\"c_{idx+1}: {c}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "c_1: [-4.15617133e-19 -4.04401031e-02 -2.90201426e-04 -2.00512379e-08\n", + " -4.79591887e-16 -3.89061864e-09 -2.52579520e-03 -1.21972349e-06\n", + " -1.17032155e-02 -4.07844412e-19 -2.05095434e-06 -5.28562902e-02\n", + " -5.83826336e-18 -2.24499931e-14 -2.42816102e-11 -1.36781887e-05\n", + " -4.66421502e-14 -4.48273249e-19 -1.48272207e-06 -1.64570993e-12\n", + " -2.13816259e-08 -4.46290976e-14 -9.26557186e-02 -4.43504533e-05\n", + " 4.61548262e-02 -6.14524769e-03 -6.94123341e-07 -2.83925886e-14\n", + " -1.78042143e-03 -6.95610380e-02 -2.83909862e-14 -3.79281465e-02\n", + " -1.17082482e-02 -3.78558298e-08 -1.46477467e-06 -2.50233867e-19\n", + " -1.00553201e-14 1.50532064e-01 -5.44682386e-02 2.26018157e-01\n", + " -1.39866576e-03 -8.57894663e-03 -6.52620038e-06 -1.03375055e-02\n", + " -8.68549802e-10 -2.20972763e-09 -1.55978951e-04 -4.69628975e-05\n", + " -5.15237865e-06 -3.57488929e-05 3.22879959e-01 -1.90774852e-08\n", + " -1.93398491e-06 -4.42291308e-04 -8.84549809e-10 -6.08203936e-08\n", + " -5.24078194e-08 -1.79873074e-11 -1.02541309e-03 -3.91747130e-02\n", + " -2.21510462e-02 -9.11412079e-08 -3.11568595e-03 -1.93124783e-04\n", + " -2.14152141e-19 -3.37645760e-14 -3.87602233e-10 2.60771125e-02\n", + " -1.64582151e-12 -4.37796624e-02 1.10894021e-02 -3.10110281e-10\n", + " -7.29502171e-13 -8.97075988e-06 -8.40291559e-04 -2.26422462e-01\n", + " -7.46077531e-07 -4.66413604e-14 -3.45727023e-02 8.15513323e-02\n", + " -3.87331779e-02 -1.64598856e-12 -2.84816577e-03 -9.75070020e-13\n", + " -4.41953287e-03 -8.59949986e-04 -2.99709877e-08 6.19077893e-08\n", + " 3.77981302e-02 -1.70947757e-11 -3.75258895e-02 -4.40350823e-05\n", + " -2.42422170e-11 -2.45163611e-14 -1.75871181e-08 -5.72744443e-04\n", + " -5.66972349e-06 -4.25082673e-02 -1.60361663e-04 -7.56825882e-07]\n", + "c_2: [-1.37063034e-13 -7.11109193e-02 -1.59292374e-03 -1.66287887e-05\n", + " -3.43203895e-12 -1.77892529e-05 -1.41724302e-02 -7.79730654e-05\n", + " -1.54555054e-02 -1.37063030e-13 -4.28335182e-04 -4.10823990e-02\n", + " -1.37163166e-10 -3.63887450e-10 -8.81144508e-07 -9.83410548e-04\n", + " -6.89961995e-10 -3.45601803e-12 -3.21776806e-04 -4.92582998e-09\n", + " -2.21537489e-06 -6.89693018e-10 -2.84126799e-02 -3.93640106e-03\n", + " 5.59278242e-02 -4.41335612e-02 -5.75656553e-05 -1.08704027e-08\n", + " -2.02792650e-02 -6.56646158e-02 -1.08701372e-08 -2.44870924e-02\n", + " -1.54586704e-02 -5.18901197e-05 -3.21766212e-04 -3.58661844e-12\n", + " -1.72281647e-11 1.65770096e-01 -3.16215085e-02 2.41473428e-01\n", + " -1.46381312e-02 -4.34675185e-02 -3.26177883e-04 -3.63692658e-02\n", + " -6.73162356e-07 -5.36503961e-06 -1.00701734e-03 -3.89683662e-03\n", + " -4.28761864e-04 -1.71211414e-03 2.76520505e-01 -7.46166382e-06\n", + " -4.22393962e-04 -6.81934873e-03 -6.82244550e-07 -5.47954862e-05\n", + " -8.99890721e-05 -1.81729886e-08 -6.21447213e-03 -3.43896011e-02\n", + " -3.02830715e-02 -9.07150000e-05 -1.49412265e-02 -1.29156928e-03\n", + " -1.59859600e-12 -3.40418034e-10 -2.89156446e-06 6.31779218e-02\n", + " -4.92583004e-09 -7.98779937e-02 -3.12213979e-02 -6.57555426e-06\n", + " -7.57404511e-09 -1.24137888e-03 -8.00324841e-03 -7.26677844e-02\n", + " -8.32042975e-05 -6.87097332e-10 -5.79705255e-02 8.49571721e-02\n", + " 7.14909457e-02 -4.92583014e-09 -1.93402301e-02 -1.21946676e-07\n", + " -2.00146327e-02 -7.83026161e-03 -4.88268232e-06 -5.45404350e-05\n", + " 1.46463134e-02 -2.74857305e-08 -3.11056923e-02 -4.15539030e-03\n", + " -8.81184989e-07 -3.24047742e-10 -1.29812679e-05 -1.40089332e-02\n", + " -2.36053611e-04 -4.88605559e-02 -1.03414286e-03 -8.44205037e-05]\n", + "c_3: [-5.63373044e-09 -5.00816303e-02 -3.37029782e-03 -1.64810753e-04\n", + " -4.51432217e-08 -2.06806464e-04 -1.61686244e-02 -5.33673382e-04\n", + " -1.21981773e-02 -5.63373044e-09 -1.22693785e-03 -1.55356957e-02\n", + " -3.15019847e-07 -2.47663879e-07 -1.09138921e-05 -3.27515009e-03\n", + " -4.84290991e-07 -7.53184993e-08 -1.26280623e-03 -6.49200109e-07\n", + " -3.37201694e-05 -4.74890704e-07 7.57214493e-04 -5.71660664e-03\n", + " 3.94168839e-02 -4.18328819e-02 -3.26731565e-04 -2.70291610e-06\n", + " -2.56677826e-02 -2.84929850e-02 -2.69713764e-06 -1.08247027e-02\n", + " -1.21993250e-02 -2.32898266e-04 -1.26280258e-03 -7.99279432e-08\n", + " -6.71134037e-08 1.10907257e-01 -6.76902605e-03 1.50361106e-01\n", + " -1.25054317e-02 -3.89374572e-02 -1.42677167e-03 -3.28419674e-02\n", + " -1.20487558e-05 -5.38707840e-05 -2.29065173e-03 -5.44458380e-03\n", + " -1.30083043e-03 -4.24438693e-03 1.52348900e-01 -8.35543120e-05\n", + " -1.16825123e-03 -8.39560594e-03 -1.34185537e-05 -2.71662191e-04\n", + " -3.69181006e-04 -2.51473692e-06 -1.11114657e-02 -1.58581537e-02\n", + " -1.69532850e-02 -3.69182532e-04 -1.27324602e-02 -2.62078819e-03\n", + " -3.53180829e-08 -2.77149874e-07 -2.93546264e-05 4.93853989e-02\n", + " -6.49200109e-07 -5.74154748e-02 -3.32262989e-02 -8.06823725e-05\n", + " -9.92367796e-07 -3.81503981e-03 -8.69888491e-03 1.31669069e-02\n", + " -3.34808215e-04 -4.58889994e-07 -4.18346299e-02 6.18966844e-02\n", + " 8.31777813e-02 -6.49200109e-07 -1.93888170e-02 -1.45080773e-05\n", + " -2.20313773e-02 -8.21446440e-03 -5.37924725e-05 -2.66830719e-04\n", + " 4.34452696e-03 -4.06108295e-06 -1.26104577e-02 -6.42717230e-03\n", + " -1.09417807e-05 -2.38398747e-07 -1.42466595e-04 -1.31232618e-02\n", + " -1.08427542e-03 -2.79481469e-02 -2.23874713e-03 -3.54505406e-04]\n", + "c_4: [-2.44574889e-06 -2.27327031e-02 -4.03822767e-03 -1.04978147e-03\n", + " -4.68088487e-06 -9.00251695e-04 -1.24805975e-02 -2.14856728e-03\n", + " -7.19364851e-03 -2.44574889e-06 -2.18278970e-03 1.13177551e-03\n", + " -2.16004726e-05 -8.22292155e-06 -1.11634772e-04 -5.50472820e-03\n", + " -1.64147364e-05 -8.33569242e-06 -3.28272032e-03 -3.16819473e-05\n", + " -2.81892631e-04 -1.55324709e-05 9.53034729e-03 -6.26967578e-03\n", + " 2.45430187e-02 -2.60141869e-02 -1.57185526e-03 -5.15941697e-05\n", + " -2.09368749e-02 -3.98558536e-03 -5.08802600e-05 -3.02959063e-03\n", + " -7.19383965e-03 -7.89951218e-04 -3.28271976e-03 -8.83984547e-06\n", + " -5.95986871e-06 6.08659544e-02 6.13580129e-03 7.33286643e-02\n", + " -7.00367956e-03 -2.36428987e-02 -3.17818676e-03 -2.12352773e-02\n", + " -1.68888187e-04 -4.50672802e-04 -3.82889380e-03 -5.63454102e-03\n", + " -2.53512118e-03 -5.93635722e-03 6.67256212e-02 -4.07040844e-04\n", + " -1.98236633e-03 -7.56906752e-03 -1.99775972e-04 -8.54770754e-04\n", + " -1.09439271e-03 -6.47128262e-05 -1.25490275e-02 -2.87242617e-03\n", + " -2.62714989e-03 -1.10998372e-03 -7.06585609e-03 -3.33363793e-03\n", + " -4.90771446e-06 -1.19425123e-05 -2.63921046e-04 2.93944941e-02\n", + " -3.16819473e-05 -2.70511692e-02 -2.02921298e-02 -4.16713095e-04\n", + " -2.57356462e-05 -6.63540644e-03 -6.79904028e-03 3.21214845e-02\n", + " -1.14955292e-03 -1.39071119e-05 -2.03241466e-02 3.84655093e-02\n", + " 5.76045348e-02 -3.16819473e-05 -1.32438005e-02 -1.75994881e-04\n", + " -1.59195410e-02 -6.19103439e-03 -3.83430574e-04 -8.08817142e-04\n", + " 2.93335733e-03 -8.63956566e-05 -5.75635332e-04 -7.51288965e-03\n", + " -1.12749101e-04 -9.04336719e-06 -6.18015378e-04 -8.82486590e-03\n", + " -2.62400814e-03 -7.38153660e-03 -3.37697209e-03 -1.32871506e-03]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "def compute_c_terms(P, x, num_terms):\n", + " n = P.shape[0]\n", + " I = np.eye(n)\n", + " c_terms = []\n", + " c0 = (I - P) @ x\n", + " c_terms.append(c0)\n", + " v_prev = P @ c0\n", + " for j in range(1, num_terms):\n", + " pow = 2 ** (j - 1)\n", + " v_curr = v_prev.copy()\n", + " for _ in range(pow):\n", + " v_curr = P @ v_curr\n", + " cj = v_prev + v_curr\n", + " c_terms.append(cj)\n", + " v_prev = v_curr\n", + " return c_terms\n", + "\n", + "num_terms = 4\n", + "c_terms = compute_c_terms(P, x, num_terms)\n", + "\n", + "for idx, c in enumerate(c_terms):\n", + " print(f\"c_{idx+1}: {c}\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Python(7327) MallocStackLogging: can't turn off malloc stack logging because it was not enabled.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting plotly\n", + " Downloading plotly-6.2.0-py3-none-any.whl.metadata (8.5 kB)\n", + "Requirement already satisfied: narwhals>=1.15.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from plotly) (1.20.1)\n", + "Requirement already satisfied: packaging in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from plotly) (24.2)\n", + "Downloading plotly-6.2.0-py3-none-any.whl (9.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.6/9.6 MB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m \u001b[33m0:00:01\u001b[0mm0:00:01\u001b[0m:00:01\u001b[0m\n", + "\u001b[?25hInstalling collected packages: plotly\n", + "Successfully installed plotly-6.2.0\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install plotly" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "coloraxis": "coloraxis", + "geo": "geo", + "hovertemplate": "Country=%{location}
Values=%{z}", + "locationmode": "country names", + "locations": [ + "Afghanistan", + "Albania", + "Algeria", + "Angola", + "Argentina", + "Australia", + "Austria", + "Bahrain", + "Bangladesh", + "Belgium", + "Benin", + "Bolivia", + "Bosnia and Herzegovina", + "Botswana", + "Brazil", + "Bulgaria", + "Burkina Faso", + "Burundi", + "Cambodia", + "Cameroon", + "Canada", + "Central African Republic", + "Chad", + "Chile", + "China", + "Colombia", + "Comoros", + "Congo, Dem. Rep.", + "Congo, Rep.", + "Costa Rica", + "Cote d'Ivoire", + "Croatia", + "Cuba", + "Czech Republic", + "Denmark", + "Djibouti", + "Dominican Republic", + "Ecuador", + "Egypt", + "El Salvador", + "Equatorial Guinea", + "Eritrea", + "Ethiopia", + "Finland", + "France", + "Gabon", + "Gambia", + "Germany", + "Ghana", + "Greece", + "Guatemala", + "Guinea", + "Guinea-Bissau", + "Haiti", + "Honduras", + "Hong Kong, China", + "Hungary", + "Iceland", + "India", + "Indonesia", + "Iran", + "Iraq", + "Ireland", + "Israel", + "Italy", + "Jamaica", + "Japan", + "Jordan", + "Kenya", + "Korea, Dem. Rep.", + "Korea, Rep.", + "Kuwait", + "Lebanon", + "Lesotho", + "Liberia", + "Libya", + "Madagascar", + "Malawi", + "Malaysia", + "Mali", + "Mauritania", + "Mauritius", + "Mexico", + "Mongolia", + "Montenegro", + "Morocco", + "Mozambique", + "Myanmar", + "Namibia", + "Nepal", + "Netherlands", + "New Zealand", + "Nicaragua", + "Niger", + "Nigeria", + "Norway", + "Oman", + "Pakistan", + "Panama", + "Paraguay", + "Peru", + "Philippines", + "Poland", + "Portugal", + "Puerto Rico", + "Reunion", + "Romania", + "Rwanda", + "Sao Tome and Principe", + "Saudi Arabia", + "Senegal", + "Serbia", + "Sierra Leone", + "Singapore", + "Slovak Republic", + "Slovenia", + "Somalia", + "South Africa", + "Spain", + "Sri Lanka", + "Sudan", + "Swaziland", + "Sweden", + "Switzerland", + "Syria", + "Taiwan", + "Tanzania", + "Thailand", + "Togo", + "Trinidad and Tobago", + "Tunisia", + "Turkey", + "Uganda", + "United Kingdom", + "United States", + "Uruguay", + "Venezuela", + "Vietnam", + "West Bank and Gaza", + "Yemen, Rep.", + "Zambia", + "Zimbabwe" + ], + "name": "", + "type": "choropleth", + "z": { + "bdata": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "dtype": "i1" + } + } + ], + "layout": { + "coloraxis": { + "cmax": 1, + "cmin": 0, + "colorbar": { + "title": { + "text": "Values" + } + }, + "colorscale": [ + [ + 0, + "lightgrey" + ], + [ + 1, + "red" + ] + ] + }, + "geo": { + "center": {}, + "domain": { + "x": [ + 0, + 1 + ], + "y": [ + 0, + 1 + ] + } + }, + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Highlighting Ghana " + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.express as px\n", + "import pandas as pd\n", + "\n", + "# Get all countries from a Plotly dataset\n", + "all_countries = px.data.gapminder()['country'].unique()\n", + "\n", + "country = input(\"Enter the country name: \")\n", + "\n", + "# Create a DataFrame for all countries\n", + "df = pd.DataFrame({\n", + " 'Country': all_countries,\n", + " 'Values': [1 if c == country else 0 for c in all_countries]\n", + "})\n", + "\n", + "# Choropleth with faded background\n", + "fig = px.choropleth(\n", + " df,\n", + " locations='Country',\n", + " locationmode='country names',\n", + " color='Values',\n", + " color_continuous_scale=[[0, 'lightgrey'], [1, 'red']],\n", + " range_color=(0, 1),\n", + " title=f'Highlighting {country}'\n", + ")\n", + "\n", + "fig.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "c_0: [-1.04947885 -1.39853349 -2.28459669 -1.27698968 -1.56795935]\n", + "c_1: [-12.68106697 -14.88123829 -21.05633524 -13.54502295 -15.27869556]\n", + "c_2: [ -833.86429489 -969.80864683 -1381.66493843 -890.12204494\n", + " -1000.61087854]\n", + "c_3: [-2848276.83155663 -3312742.9235089 -4719517.50496819 -3040642.47570965\n", + " -3417910.51466688]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "def compute_c_terms_plus(P, x, J):\n", + " if J < 1:\n", + " return []\n", + " c_terms = [x - P.dot(x)]\n", + " for j in range(1, J):\n", + " a = c_terms[j-1]\n", + " k = 2**(j-1)\n", + " u = a.copy()\n", + " for _ in range(k):\n", + " u = P.dot(u)\n", + " v = u.copy()\n", + " for _ in range(k):\n", + " v = P.dot(v)\n", + " c_terms.append(u + v)\n", + " return c_terms\n", + "\n", + "n = 5\n", + "P = np.random.rand(n, n)\n", + "x = np.random.rand(n)\n", + "C = compute_c_terms_plus(P, x, 4)\n", + "for idx, c in enumerate(C):\n", + " print(f\"c_{idx}:\", c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-14T16:58:16.691039Z", + "start_time": "2025-08-14T16:58:16.688281Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def apply_operator(P: np.ndarray, x: np.ndarray, j: int) -> np.ndarray:\n", + " \"\"\"\n", + " Computes P^{2^{j-2}} (I + P^{2^{j-2}}) x\n", + " where P is a square matrix and x is a vector.\n", + " \"\"\"\n", + " # --- Shape checks ---\n", + " n = P.shape[0]\n", + " assert P.shape[0] == P.shape[1], \"P must be square\"\n", + " assert x.shape[0] == n and x.ndim == 1, \"x must be a vector of length matching P\"\n", + "\n", + " # --- Compute Q = P^{2^{j-2}} ---\n", + " power = 2 ** (j - 2)\n", + " Q = np.linalg.matrix_power(P, power)\n", + "\n", + " # --- Compute result: Q @ (I + Q) @ x ---\n", + " I = np.eye(n)\n", + " result = Q @ (I + Q) @ x\n", + "\n", + " return result\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-14T16:58:25.283866Z", + "start_time": "2025-08-14T16:58:25.280725Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Result: [ 0.29774801 -0.29774801]\n" + ] + } + ], + "source": [ + "# Example matrix and vector\n", + "P = np.array([[0.8, 0.1],\n", + " [0.2, 0.9]])\n", + "\n", + "x = np.array([1.0, -1.0])\n", + "j = 4\n", + "\n", + "y = apply_operator(P, x, j)\n", + "print(\"Result:\", y)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-15T13:50:51.458432Z", + "start_time": "2025-08-15T13:50:51.453852Z" + } + }, + "outputs": [], + "source": [ + "\n", + "\n", + "def get_P(A: np.ndarray) -> np.ndarray:\n", + " d_arr = np.sum(A, axis=0)\n", + " d_arr_inv = 1/d_arr\n", + " d_arr_inv[np.isinf(d_arr_inv)] = 0\n", + " D_inv = np.diag(d_arr_inv)\n", + " P = 0.5 * (np.eye(D_inv.shape[0]) + A @ D_inv)\n", + " return P\n", + "\n", + "\n", + "def compute_W_2_transform(A, X, largest_scale, low_pass_as_wavelet=False):\n", + " if X.ndim == 2:\n", + " X = X[:, :, None]\n", + " p, n, _ = X.shape\n", + " P = get_P(A)\n", + " m = A.shape[0]\n", + " I = np.eye(m)\n", + " coeffs = []\n", + "\n", + " C0 = np.zeros((m, n))\n", + " for i in range(n):\n", + " x_i = X[i, :, 0]\n", + " C0[:, i] = (I - P) @ x_i\n", + " coeffs.append(C0)\n", + " a = C0.copy()\n", + " for j in range(1, largest_scale+1):\n", + " pow_val = 2 ** (j - 1)\n", + " prev = a.copy()\n", + " for _ in range(pow_val):\n", + " prev = P @ prev\n", + " curr = prev.copy()\n", + " for _ in range(pow_val):\n", + " curr = P @ curr\n", + " a = prev + curr\n", + " coeffs.append(a)\n", + "\n", + " if low_pass_as_wavelet:\n", + " low_pass = a.copy()\n", + " for _ in range(2 ** (largest_scale - 1)):\n", + " low_pass = P @ low_pass\n", + " coeffs.append(low_pass)\n", + " coeffs_array = np.stack(coeffs, axis=0)\n", + " return coeffs_array\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-15T15:40:54.403907Z", + "start_time": "2025-08-15T15:40:54.390185Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Directory \"/Users/desmondboateng/Desktop/blis/blis/data/synthetic/camel_pm_2\" already exists\n", + "(6, 100, 100)\n", + "6\n" + ] + } + ], + "source": [ + "path=os.path.join(os.path.abspath(os.path.join(os.getcwd(), \"..\")),'blis','data','synthetic','camel_pm_2')\n", + "if os.path.exists(path):\n", + " print('Directory \"{}\" already exists'.format(path))\n", + "A = np.load(os.path.join(path, 'adjacency_matrix.npy'))\n", + "x = np.load(os.path.join(path, 'graph_signals.npy'))\n", + "#print(x.shape)\n", + "if len(x.shape) == 2:\n", + " x = x[:,:,None]\n", + "W=compute_W_2_transform(A, x, largest_scale=4, low_pass_as_wavelet=True)\n", + "print(W.shape)\n", + "print(len(W))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-15T15:53:02.463765Z", + "start_time": "2025-08-15T15:53:02.461675Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[[0., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0.]]],\n", + "\n", + "\n", + " ...,\n", + "\n", + "\n", + " [[[0., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0.]]],\n", + "\n", + "\n", + " [[[0., 0., 0., 0.]]]], shape=(400, 1, 1, 4))" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "num_signals=400\n", + "num_features=1\n", + "highest_moment=4\n", + "np.zeros((num_signals, 1, num_features, highest_moment))" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-19T05:07:32.160124Z", + "start_time": "2025-08-19T05:07:32.157290Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(100, 1)" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "A=np.random.random((400,100,1))\n", + "A[300].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": { + "ExecuteTime": { + "end_time": "2025-08-19T05:07:43.127850Z", + "start_time": "2025-08-19T05:07:43.125756Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(6, 100, 100)" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(6,100,100)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import os \n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "data_path=os.path.join(os.path.abspath(os.path.join(os.getcwd(), \"..\")),'blis','data','traffic','PEMS08')\n", + "os.path.exists(data_path)\n", + "label_path = os.path.join(data_path, 'DAY', 'label.npy')\n", + "adjacency_path = os.path.join(data_path, 'adjacency_matrix.npy')\n", + "signal_path = os.path.join(data_path, 'graph_signals.npy')\n", + "\n", + "label=np.load(label_path)\n", + "A = np.load(adjacency_path)\n", + "X = np.load(signal_path)\n", + "\n", + "\n", + "def get_P(A: np.ndarray) -> np.ndarray:\n", + " A = np.asarray(A, dtype=float)\n", + "\n", + " if A.ndim != 2 or A.shape[0] != A.shape[1]:\n", + " raise ValueError(f\"A must be square, got shape {A.shape}\")\n", + "\n", + " d_arr = np.sum(A, axis=0)\n", + " d_arr_inv = np.divide(\n", + " 1.0,\n", + " d_arr,\n", + " out=np.zeros_like(d_arr, dtype=float),\n", + " where=d_arr != 0,\n", + " )\n", + " D_inv = np.diag(d_arr_inv)\n", + " P = 0.5 * (np.eye(A.shape[0]) + A @ D_inv)\n", + " return P" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## EIGENDECOMPOSITION\n", + "\n", + "\n", + "$$\n", + "K = V\\Lambda V^{-1}\n", + "$$\n", + "\n", + "$$\n", + "q_j(K)X = Vq_j(\\Lambda)V^{-1}X\n", + "$$\n", + "\n", + "$$\n", + "\\widehat{X}=V^{-1}X\n", + "$$\n", + "\n", + "$$\n", + "\\widehat{Y}_j=q_j(\\Lambda)\\widehat{X}\n", + "$$\n", + "\n", + "$$\n", + "Y_j=V\\widehat{Y}_j\n", + "$$\n", + "\n", + "$$\n", + "Y_j=Vq_j(\\Lambda)V^{-1}X=q_j(K)X\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_q(t, j, largest_scale):\n", + " if j == 0:\n", + " p = 1.0 - t\n", + " elif j == \"low\":\n", + " p = t ** (2 ** (largest_scale - 1))\n", + " else:\n", + " p = t ** (2 ** (j - 1)) - t ** (2 ** j)\n", + "\n", + " q = np.sqrt(p)\n", + "\n", + " return q\n", + "\n", + "def compute_W1_transform_eig(\n", + " self,\n", + " A,\n", + " X,\n", + " largest_scale,\n", + " low_pass_as_wavelet=True,\n", + "):\n", + " A = np.asarray(A, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " n_nodes = A.shape[0]\n", + "\n", + " if X.shape[0] != n_nodes:\n", + " raise ValueError(\n", + " f\"Node mismatch: X has {X.shape[0]} rows, but A is {n_nodes}x{n_nodes}.\"\n", + " )\n", + "\n", + " K = get_P(A)\n", + "\n", + " eigvals, eigvecs = np.linalg.eig(K)\n", + " eigvecs_inv = np.linalg.inv(eigvecs)\n", + "\n", + " X_hat = eigvecs_inv @ X\n", + "\n", + " coeffs = []\n", + "\n", + " for j in range(largest_scale):\n", + " q = self.compute_q(eigvals, j, largest_scale)\n", + "\n", + " C = eigvecs @ (q[:, None] * X_hat)\n", + "\n", + " coeffs.append(C)\n", + "\n", + " if low_pass_as_wavelet:\n", + " q = self.compute_q(eigvals, \"low\", largest_scale)\n", + "\n", + " C = eigvecs @ (q[:, None] * X_hat)\n", + "\n", + " coeffs.append(C)\n", + "\n", + " out = np.concatenate(coeffs, axis=1)\n", + "\n", + " return out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## CHEBYCHEV \n", + "\n", + "\n", + "\n", + "$$\n", + "\\widetilde{K}=2K-I\n", + "$$\n", + "\n", + "$$\n", + "q_j(t)\\approx \\sum_{m=0}^{M} c_m^{(j)}T_m(2t-1)\n", + "$$\n", + "\n", + "$$\n", + "q_j(K)X\\approx \\sum_{m=0}^{M} c_m^{(j)}T_m(\\widetilde{K})X\n", + "$$\n", + "\n", + "$$\n", + "T_0(\\widetilde{K})X=X\n", + "$$\n", + "\n", + "$$\n", + "T_1(\\widetilde{K})X=\\widetilde{K}X\n", + "$$\n", + "\n", + "$$\n", + "T_{m+1}(\\widetilde{K})X\n", + "=\n", + "2\\widetilde{K}T_m(\\widetilde{K})X\n", + "-\n", + "T_{m-1}(\\widetilde{K})X\n", + "$$\n", + "\n", + "$$\n", + "W_{j,\\mathrm{cheb}}^{(1)}X\n", + "=\n", + "\\sum_{m=0}^{M} c_m^{(j)}T_m(2K-I)X\n", + "\\approx q_j(K)X\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_W1_transform_cheb(\n", + " self,\n", + " A,\n", + " X,\n", + " largest_scale,\n", + " low_pass_as_wavelet=True,\n", + " cheb_degree=50,\n", + "):\n", + " A = np.asarray(A, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " n_nodes = A.shape[0]\n", + "\n", + " K = get_P(A)\n", + "\n", + " K_tilde = 2.0 * K - np.eye(n_nodes)\n", + "\n", + " filter_indices = list(range(largest_scale))\n", + "\n", + " if low_pass_as_wavelet:\n", + " filter_indices.append(\"low\")\n", + "\n", + " outputs = []\n", + "\n", + " for j in filter_indices:\n", + " num_points = cheb_degree + 1\n", + "\n", + " k = np.arange(num_points)\n", + "\n", + " s = np.cos(np.pi * (k + 0.5) / num_points)\n", + "\n", + " t = (s + 1.0) / 2.0\n", + "\n", + " if j == 0:\n", + " p = 1.0 - t\n", + "\n", + " elif j == \"low\":\n", + " p = t ** (2 ** (largest_scale - 1))\n", + "\n", + " else:\n", + " p = t ** (2 ** (j - 1)) - t ** (2 ** j)\n", + "\n", + " q = np.sqrt(p)\n", + "\n", + " cheb_coeffs = np.polynomial.chebyshev.chebfit(\n", + " s,\n", + " q,\n", + " cheb_degree,\n", + " )\n", + "\n", + " T0 = X.copy()\n", + "\n", + " C = cheb_coeffs[0] * T0\n", + "\n", + " if cheb_degree >= 1:\n", + " T1 = K_tilde @ X\n", + "\n", + " C = C + cheb_coeffs[1] * T1\n", + "\n", + " for m in range(2, cheb_degree + 1):\n", + " T2 = 2.0 * (K_tilde @ T1) - T0\n", + "\n", + " C = C + cheb_coeffs[m] * T2\n", + "\n", + " T0 = T1\n", + " T1 = T2\n", + "\n", + " outputs.append(C)\n", + "\n", + " out = np.concatenate(outputs, axis=1)\n", + "\n", + " return out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RATIONAL APPROXIMATION\n", + "\n", + "\n", + "\n", + "\n", + "$$\n", + "q_j(t)\\approx r_j(t)\n", + "=\n", + "\\frac{a_0+a_1t+\\cdots+a_m t^m}\n", + "{1+b_1t+\\cdots+b_n t^n}\n", + "$$\n", + "\n", + "$$\n", + "q_j(K)X \\approx r_j(K)X\n", + "$$\n", + "\n", + "$$\n", + "N(K)=a_0I+a_1K+\\cdots+a_mK^m\n", + "$$\n", + "\n", + "$$\n", + "D(K)=I+b_1K+\\cdots+b_nK^n\n", + "$$\n", + "\n", + "$$\n", + "r_j(K)X = D(K)^{-1}N(K)X\n", + "$$\n", + "\n", + "$$\n", + "D(K)Y_j=N(K)X\n", + "$$\n", + "\n", + "$$\n", + "W_{j,\\mathrm{rat}}^{(1)}X\n", + "=\n", + "Y_j\n", + "\\approx\n", + "q_j(K)X\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of choices: 80\n" + ] + } + ], + "source": [ + "import scipy\n", + "import scipy.special as sp\n", + "import numpy as np\n", + "import os\n", + "\n", + "\n", + "N1_old = np.linspace(1,132,80)\n", + "N1 = N1_old.astype(int)\n", + "#N2_old = np.ceil(1.1*np.sqrt(N1)-1)\n", + "N2_old = np.ceil(1.3*np.sqrt(N1))\n", + "N2 = N2_old.astype(int)\n", + "N = N1+N2\n", + "#print(\"N1:\", N1)\n", + "#print(\"N2:\", N2)\n", + "#print(\"N:\", N)\n", + "print(\"Number of choices:\", len(N1))\n", + "\n", + "\n", + "data_path=os.path.join(os.path.abspath(os.path.join(os.getcwd(), \"..\")),'blis','data','traffic','PEMS08')\n", + "os.path.exists(data_path)\n", + "label_path = os.path.join(data_path, 'DAY', 'label.npy')\n", + "adjacency_path = os.path.join(data_path, 'adjacency_matrix.npy')\n", + "signal_path = os.path.join(data_path, 'graph_signals.npy')\n", + "\n", + "label=np.load(label_path)\n", + "A = np.load(adjacency_path)\n", + "X = np.load(signal_path)\n", + "\n", + "\n", + "def get_P(A: np.ndarray) -> np.ndarray:\n", + " A = np.asarray(A, dtype=float)\n", + "\n", + " if A.ndim != 2 or A.shape[0] != A.shape[1]:\n", + " raise ValueError(f\"A must be square, got shape {A.shape}\")\n", + "\n", + " d_arr = np.sum(A, axis=0)\n", + " d_arr_inv = np.divide(\n", + " 1.0,\n", + " d_arr,\n", + " out=np.zeros_like(d_arr, dtype=float),\n", + " where=d_arr != 0,\n", + " )\n", + " D_inv = np.diag(d_arr_inv)\n", + " P = 0.5 * (np.eye(A.shape[0]) + A @ D_inv)\n", + " return P\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "n1: 34\n", + "n2: 8\n", + "t_test: [0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556\n", + " 0.66666667 0.77777778 0.88888889 1. ]\n", + "sqrt_true: [0. 0.33333333 0.47140452 0.57735027 0.66666667 0.74535599\n", + " 0.81649658 0.8819171 0.94280904 1. ]\n", + "sqrt_approx: [6.93889390e-17 3.33333333e-01 4.71404521e-01 5.77350269e-01\n", + " 6.66666667e-01 7.45355992e-01 8.16496581e-01 8.81917104e-01\n", + " 9.42809042e-01 1.00000000e+00]\n", + "max error: 1.9468981982129208e-11\n" + ] + } + ], + "source": [ + "def coeffs(N1,N2,resolution):\n", + " sigma = 2*np.sqrt(2)*np.pi\n", + " p = np.zeros(N1)\n", + " \n", + " for j in range(1,N1+1):\n", + " p[j-1] = -np.exp(-sigma*(np.sqrt(N1)-np.sqrt(j)))\n", + " \n", + " t_old = np.logspace(resolution,0,2000)\n", + " t = np.insert(t_old,0,0)\n", + " #t = t_old\n", + " f = np.sqrt(t)\n", + " \n", + " A = np.zeros((len(t),N1+N2+1))\n", + " \n", + " for i in range(N1):\n", + " A[:,i] = p[i]/(t-p[i])\n", + " \n", + " for k in range(N2+1):\n", + " A[:,N1+k] = sp.eval_chebyt(k,2*t-1)\n", + " \n", + " tol = 2e-14\n", + " Uv, sv, VvT = np.linalg.svd(A, full_matrices=False)\n", + " ID = sv >= tol\n", + " c = Uv[:, ID].T @ f \n", + " c = VvT[ID, :].T @ (c / sv[ID])\n", + "\n", + " a = c[0:N1]\n", + " b = c[N1:]\n", + "\n", + " return a,b,p\n", + "\n", + "def rat_approx(a,b,p,z):\n", + " r = 0\n", + " for i in range(len(a)):\n", + " r += a[i]*p[i]/(z-p[i])\n", + " for j in range(len(b)):\n", + " r += b[j]*sp.eval_chebyt(j,2*z-1)\n", + " \n", + " return r\n", + "\n", + "\n", + "if __name__ == \"__main__\":\n", + " rational_index = 20\n", + " resolution = -16\n", + "\n", + " n1 = N1[rational_index]\n", + " n2 = N2[rational_index]\n", + "\n", + " a, b, p = coeffs(n1, n2, resolution)\n", + "\n", + " t_test = np.linspace(0, 1, 10)\n", + "\n", + " sqrt_true = np.sqrt(t_test)\n", + " sqrt_approx = rat_approx(a, b, p, t_test)\n", + "\n", + " print(\"n1:\", n1)\n", + " print(\"n2:\", n2)\n", + " print(\"t_test:\", t_test)\n", + " print(\"sqrt_true:\", sqrt_true)\n", + " print(\"sqrt_approx:\", sqrt_approx)\n", + " print(\"max error:\", np.max(np.abs(sqrt_true - sqrt_approx)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##\n", + "$$\\sqrt{t} ≈ \\sum_i \\frac{a_i p_i }{t - p_i} + \\sum_k b_k T_k(2t - 1)$$\n", + "\n", + "\n", + "$$\n", + "\\sqrt{A}X\n", + "\\approx\n", + "\\sum_{i=1}^{N_1}\n", + "a_i p_i (A - p_i I)^{-1}X\n", + "+\n", + "\\sum_{k=0}^{N_2}\n", + "b_k T_k(2A - I)X.\n", + "$$\n", + "\n", + "$$\n", + "A = I - P.\n", + "$$\n", + "\n", + "\n", + "$$\n", + "q_0(P)X\n", + "=\n", + "\\sqrt{I-P}\\,X\n", + "\\approx\n", + "\\sum_{i=1}^{N_1}\n", + "a_i p_i \\bigl((I-P) - p_i I\\bigr)^{-1}X\n", + "+\n", + "\\sum_{k=0}^{N_2}\n", + "b_k T_k(I - 2P)X.\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import scipy.special as sp\n", + "\n", + "\n", + "N1_old = np.linspace(1, 132, 80)\n", + "N1 = N1_old.astype(int)\n", + "\n", + "N2_old = np.ceil(1.3 * np.sqrt(N1))\n", + "N2 = N2_old.astype(int)\n", + "\n", + "N = N1 + N2\n", + "\n", + "\n", + "def get_P(A):\n", + " A = np.asarray(A, dtype=float)\n", + "\n", + " d_arr = np.sum(A, axis=0)\n", + "\n", + " d_arr_inv = np.divide(\n", + " 1.0,\n", + " d_arr,\n", + " out=np.zeros_like(d_arr, dtype=float),\n", + " where=d_arr != 0,\n", + " )\n", + "\n", + " D_inv = np.diag(d_arr_inv)\n", + "\n", + " P = 0.5 * (np.eye(A.shape[0]) + A @ D_inv)\n", + "\n", + " return P\n", + "\n", + "\n", + "def coeffs(N1, N2, resolution):\n", + " sigma = 2 * np.sqrt(2) * np.pi\n", + "\n", + " p = np.zeros(N1)\n", + "\n", + " for j in range(1, N1 + 1):\n", + " p[j - 1] = -np.exp(-sigma * (np.sqrt(N1) - np.sqrt(j)))\n", + "\n", + " t_old = np.logspace(resolution, 0, 2000)\n", + " t = np.insert(t_old, 0, 0)\n", + "\n", + " f = np.sqrt(t)\n", + "\n", + " A = np.zeros((len(t), N1 + N2 + 1))\n", + "\n", + " for i in range(N1):\n", + " A[:, i] = p[i] / (t - p[i])\n", + "\n", + " for k in range(N2 + 1):\n", + " A[:, N1 + k] = sp.eval_chebyt(k, 2 * t - 1)\n", + "\n", + " tol = 2e-14\n", + "\n", + " Uv, sv, VvT = np.linalg.svd(A, full_matrices=False)\n", + "\n", + " ID = sv >= tol\n", + "\n", + " c = Uv[:, ID].T @ f\n", + " c = VvT[ID, :].T @ (c / sv[ID])\n", + "\n", + " a = c[0:N1]\n", + " b = c[N1:]\n", + "\n", + " return a, b, p\n", + "\n", + "\n", + "def matrix_rat_graph_signal(a, b, p, A, X):\n", + " A = np.asarray(A, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " I = np.eye(A.shape[0])\n", + "\n", + " # Rational part\n", + " sum1 = 0\n", + "\n", + " for i in range(len(a)):\n", + " sum1 += a[i] * p[i] * np.linalg.solve(A - p[i] * I, X)\n", + "\n", + " # Chebyshev part with Clenshaw\n", + " W = 2 * A - I\n", + "\n", + " bb = np.zeros((len(b) + 2, W.shape[0], X.shape[1]))\n", + "\n", + " for k in range(len(b) - 1, 0, -1):\n", + " bb[k] = b[k] * X + 2 * W @ bb[k + 1] - bb[k + 2]\n", + "\n", + " sum2 = b[0] * X + W @ bb[1] - bb[2]\n", + "\n", + " return sum1 + sum2\n", + "\n", + "\n", + "def matrix_sqrt_eig(B, X):\n", + " B = np.asarray(B, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " eigvals, eigvecs = np.linalg.eig(B)\n", + " eigvecs_inv = np.linalg.inv(eigvecs)\n", + "\n", + " sqrt_eigvals = np.sqrt(eigvals)\n", + "\n", + " X_hat = eigvecs_inv @ X\n", + "\n", + " Y = eigvecs @ (sqrt_eigvals[:, None] * X_hat)\n", + "\n", + " return Y\n", + "\n", + "\n", + "def cheby_coeffs_sqrt(K):\n", + " m = K - 1\n", + "\n", + " x = np.sin(np.pi * np.arange(-m, m + 1, 2) / (2 * m))\n", + "\n", + " t = 0.5 * (x + 1)\n", + "\n", + " f = np.sqrt(t)\n", + "\n", + " reordered = np.concatenate([f[K - 1:0:-1], f[:K - 1]])\n", + "\n", + " coeffs = np.fft.ifft(reordered)\n", + "\n", + " result = np.zeros(K, dtype=complex)\n", + "\n", + " result[0] = coeffs[0]\n", + " result[1:K - 1] = 2 * coeffs[1:K - 1]\n", + " result[K - 1] = coeffs[K - 1]\n", + "\n", + " return result.real\n", + "\n", + "\n", + "def matrix_sqrt_cheb(B, X, K):\n", + " B = np.asarray(B, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " c = cheby_coeffs_sqrt(K)\n", + "\n", + " I = np.eye(B.shape[0])\n", + "\n", + " W = 2 * B - I\n", + "\n", + " bk1 = np.zeros_like(X)\n", + " bk2 = np.zeros_like(X)\n", + "\n", + " for k in range(len(c) - 1, 0, -1):\n", + " bk = c[k] * X + 2 * W @ bk1 - bk2\n", + "\n", + " bk2 = bk1.copy()\n", + " bk1 = bk\n", + "\n", + " Y = c[0] * X + W @ bk1 - bk2\n", + "\n", + " return Y\n", + "\n", + "\n", + "def apply_matrix_sqrt(\n", + " B,\n", + " X,\n", + " sqrt_method=\"rational\",\n", + " a=None,\n", + " b=None,\n", + " poles=None,\n", + " cheb_K=50,\n", + "):\n", + " if sqrt_method == \"rational\":\n", + " return matrix_rat_graph_signal(\n", + " a,\n", + " b,\n", + " poles,\n", + " B,\n", + " X,\n", + " )\n", + "\n", + " elif sqrt_method == \"eig\":\n", + " return matrix_sqrt_eig(\n", + " B,\n", + " X,\n", + " )\n", + "\n", + " elif sqrt_method == \"cheb\":\n", + " return matrix_sqrt_cheb(\n", + " B,\n", + " X,\n", + " cheb_K,\n", + " )\n", + "\n", + " else:\n", + " raise ValueError(f\"Unknown sqrt_method: {sqrt_method}\")\n", + "\n", + "\n", + "def compute_W_1_transform(\n", + " A,\n", + " X,\n", + " largest_scale,\n", + " sqrt_method=\"rational\",\n", + " rational_index=20,\n", + " resolution=-16,\n", + " cheb_K=50,\n", + " low_pass_as_wavelet=True,\n", + "):\n", + " A = np.asarray(A, dtype=float)\n", + " X = np.asarray(X, dtype=float)\n", + "\n", + " if X.ndim == 1:\n", + " X = X[:, None]\n", + "\n", + " n_nodes = A.shape[0]\n", + "\n", + " if X.shape[0] != n_nodes:\n", + " raise ValueError(\n", + " f\"Node mismatch: X has {X.shape[0]} rows, but A is {n_nodes}x{n_nodes}.\"\n", + " )\n", + "\n", + " P = get_P(A)\n", + " I = np.eye(n_nodes)\n", + "\n", + " a = None\n", + " b = None\n", + " poles = None\n", + "\n", + " if sqrt_method == \"rational\":\n", + " n1 = N1[rational_index]\n", + " n2 = N2[rational_index]\n", + "\n", + " a, b, poles = coeffs(n1, n2, resolution)\n", + "\n", + " coeffs_out = []\n", + "\n", + " B0 = I - P\n", + "\n", + " C0 = apply_matrix_sqrt(\n", + " B0,\n", + " X,\n", + " sqrt_method=sqrt_method,\n", + " a=a,\n", + " b=b,\n", + " poles=poles,\n", + " cheb_K=cheb_K,\n", + " )\n", + "\n", + " coeffs_out.append(C0)\n", + "\n", + " for j in range(1, largest_scale):\n", + " pow_val = 2 ** (j - 1)\n", + "\n", + " P_prev = I.copy()\n", + "\n", + " for _ in range(pow_val):\n", + " P_prev = P @ P_prev\n", + "\n", + " P_curr = P_prev.copy()\n", + "\n", + " for _ in range(pow_val):\n", + " P_curr = P @ P_curr\n", + "\n", + " B_j = P_prev - P_curr\n", + "\n", + " C_j = apply_matrix_sqrt(\n", + " B_j,\n", + " X,\n", + " sqrt_method=sqrt_method,\n", + " a=a,\n", + " b=b,\n", + " poles=poles,\n", + " cheb_K=cheb_K,\n", + " )\n", + "\n", + " coeffs_out.append(C_j)\n", + "\n", + " if low_pass_as_wavelet:\n", + " if largest_scale == 0:\n", + " low_pass_steps = 0\n", + " else:\n", + " low_pass_steps = 2 ** (largest_scale - 1)\n", + "\n", + " low_pass = X.copy()\n", + "\n", + " for _ in range(low_pass_steps):\n", + " low_pass = P @ low_pass\n", + "\n", + " coeffs_out.append(low_pass)\n", + "\n", + " out = np.concatenate(coeffs_out, axis=1)\n", + "\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A shape: (170, 170)\n", + "raw X shape: (17856, 170, 3)\n", + "X_channel shape: (170, 53568)\n", + "q0X shape: (170, 267840)\n", + "done\n" + ] + } + ], + "source": [ + "\n", + "X_channel = np.transpose(X, (1, 0, 2)).reshape(X.shape[1], -1)\n", + "W1_rat = compute_W_1_transform(\n", + " A,\n", + " X_channel,\n", + " largest_scale=4,\n", + " sqrt_method=\"rational\",\n", + ")\n", + "\n", + "W1_eig = compute_W_1_transform(\n", + " A,\n", + " X_channel,\n", + " largest_scale=4,\n", + " sqrt_method=\"eig\",\n", + ")\n", + "\n", + "W1_cheb = compute_W_1_transform(\n", + " A,\n", + " X_channel,\n", + " largest_scale=4,\n", + " sqrt_method=\"cheb\",\n", + " cheb_K=50,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/rational_approximations/rational_approx_wavelet_transform.ipynb b/rational_approximations/rational_approx_wavelet_transform.ipynb new file mode 100644 index 0000000..c068e2b --- /dev/null +++ b/rational_approximations/rational_approx_wavelet_transform.ipynb @@ -0,0 +1,2006 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "03ca80db-993c-4eb0-9b75-2ea1f91b36ad", + "metadata": {}, + "source": [ + "__Imports__" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "808dda45-84ec-4975-85d1-8189e266acac", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import scipy.special as sp\n", + "import math\n", + "import matplotlib.gridspec as gridspec\n", + "import scipy" + ] + }, + { + "cell_type": "markdown", + "id": "cd1aed66-e0b7-459a-bc3e-d0355a87802b", + "metadata": {}, + "source": [ + "Lightning Approximation:\n", + "\n", + "$$ f(z) \\approx r(z) = \\sum^{N_1}_{j=1}\\frac{a_j p_j}{z-p_j} + \\sum_{j=0}^{N_2}b_j T_j(z)$$" + ] + }, + { + "cell_type": "markdown", + "id": "6511013e-9d83-4e39-866e-335ccbc90e91", + "metadata": {}, + "source": [ + "__Defining $N$, $N_1$, and $N_2$__" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cd289c29-a0b5-4cf0-9f0a-6e8800aa0398", + "metadata": {}, + "outputs": [], + "source": [ + "N1_old = np.linspace(1,132,80)\n", + "N1 = N1_old.astype(int)\n", + "#N2_old = np.ceil(1.1*np.sqrt(N1)-1)\n", + "N2_old = np.ceil(1.3*np.sqrt(N1))\n", + "N2 = N2_old.astype(int)\n", + "N = N1+N2" + ] + }, + { + "cell_type": "markdown", + "id": "02da91a6-cdd5-47ee-a2ac-838b8a5e3972", + "metadata": {}, + "source": [ + "The function returning the poles, $p_j$, and the coefficients $a_j$ and $b_j$" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1fb706e4-0208-4121-8cce-27e385581c57", + "metadata": {}, + "outputs": [], + "source": [ + "def coeffs(N1,N2,resolution):\n", + " sigma = 2*np.sqrt(2)*np.pi\n", + " p = np.zeros(N1)\n", + " \n", + " for j in range(1,N1+1):\n", + " p[j-1] = -np.exp(-sigma*(np.sqrt(N1)-np.sqrt(j)))\n", + " \n", + " t_old = np.logspace(resolution,0,2000)\n", + " t = np.insert(t_old,0,0)\n", + " #t = t_old\n", + " f = np.sqrt(t)\n", + " \n", + " A = np.zeros((len(t),N1+N2+1))\n", + " \n", + " for i in range(N1):\n", + " A[:,i] = p[i]/(t-p[i])\n", + " \n", + " for k in range(N2+1):\n", + " A[:,N1+k] = sp.eval_chebyt(k,2*t-1)\n", + " \n", + " tol = 2e-14\n", + " Uv, sv, VvT = np.linalg.svd(A, full_matrices=False)\n", + " ID = sv >= tol\n", + " c = Uv[:, ID].T @ f \n", + " c = VvT[ID, :].T @ (c / sv[ID])\n", + "\n", + " a = c[0:N1]\n", + " b = c[N1:]\n", + "\n", + " return a,b,p" + ] + }, + { + "cell_type": "markdown", + "id": "08052eae-e674-4e5c-80dd-53c65e8a10c9", + "metadata": {}, + "source": [ + "__The rational approximation function implementing the poles and coefficients from above for real numbers__" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5dc5c42e-7b47-4dbf-9c60-fb9afe9fd757", + "metadata": {}, + "outputs": [], + "source": [ + "def rat_approx(a,b,p,z):\n", + " r = 0\n", + " for i in range(len(a)):\n", + " r += a[i]*p[i]/(z-p[i])\n", + " for j in range(len(b)):\n", + " r += b[j]*sp.eval_chebyt(j,2*z-1)\n", + " \n", + " return r" + ] + }, + { + "cell_type": "markdown", + "id": "fe9ab4d4-af37-4dc1-be69-7bdd250094c8", + "metadata": {}, + "source": [ + "__A function returning the max absolute error across the different $N_1$ values__" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c0c0e368-84c3-4bdd-8e49-1d6282073c36", + "metadata": {}, + "outputs": [], + "source": [ + "def error(N1,N2,z,resolution):\n", + " y = np.zeros(len(N1))\n", + " for i in range(len(N1)):\n", + " a,b,p = coeffs(N1[i],N2[i],resolution)\n", + " r = rat_approx(a,b,p,z)\n", + " y[i] = np.linalg.norm(r - np.sqrt(z),\n", + " ord=np.inf)\n", + " return y,p" + ] + }, + { + "cell_type": "markdown", + "id": "6a2d96de-227e-41ba-9d20-11c60acd61e3", + "metadata": {}, + "source": [ + "__Comparing the errors across different training resolutions__" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8e90399e-c64e-4e8e-9480-2f587bd7ad12", + "metadata": {}, + "outputs": [], + "source": [ + "z = np.logspace(-64,0,1000) \n", + "\n", + "er2, p2 = error(N1,N2,z,-2)\n", + "er4, p4 = error(N1,N2,z,-4)\n", + "er6, p6 = error(N1,N2,z,-6)\n", + "er8, p8 = error(N1,N2,z,-8)\n", + "er16, p16 = error(N1,N2,z,-16)\n", + "\n", + "er24, p24 = error(N1,N2,z,-24)\n", + "er32, p32 = error(N1,N2,z,-32)\n", + "er40, p40 = error(N1,N2,z,-40)\n", + "er48, p48 = error(N1,N2,z,-48)\n", + "er56, p56 = error(N1,N2,z,-56)\n", + "er64, p64 = error(N1,N2,z,-64)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "3d30ec94-a8b6-46a4-b892-bb858039a449", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Text(0.5, 0, 'sqrt(N)'),\n", + " Text(0, 0.5, 'max error'),\n", + " Text(0.5, 1.0, 'Resolution Comparison')]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAHGCAYAAACPTHSaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnQd0G1X2xr9Rl9x7L7EdO733RnpIIARCSICwlD+9w7L0XVg6LLBL7yx1CSUkQID03ntv7r13W7b6/M97T6Niy4mduCbvd47PjEYjaVSs+XTvd+8VRFEUweFwOBwOh8NxIHOucjgcDofD4XC4QOJwOBwOh8PxAI8gcTgcDofD4TSBCyQOh8PhcDicJnCBxOFwOBwOh9MELpA4HA6Hw+FwmsAFEofD4XA4HE4TuEDicDgcDofDaQIXSBwOp000NDTgrbfewuHDh3vUfXP4+8DhtAWBd9LmcLoXOTk5WL58ueOyTCZDYGAgRo8ejd69e6OrKS4uRkREBN59913cd999bb59bW0t/vvf/2LatGkYOHBgu953e2G1WrF//36cPHkSBoMB0dHR6N+/P+Lj43Ex0F3eBw6nK+ERJA6nm0FOyg8//DD++OMPZGdnIzU1FZ9++imSk5Nx44030pN3T6ayspI+v+3btze7zsvLCw8++CCGDBmCrmLp0qVITEzEvHnzsGrVKhw6dIhGtYg4nTp1KhWwFzrd4X3gcLoaRVcfAIfD8cyiRYtw2223OS7/85//xHPPPYdJkya5bb+Q8PHxoWKkq/jkk09w55134pFHHsHLL78MlUrluC4tLQ033HADsrKyEBcXhwuZrn4fOJzuABdIHE4P4eabb6YCad26dc0EktFoxKZNm5CZmQlvb29MmTKFpoVcsVgsdB8SlfL19cXIkSPRq1evZo9TVVWFDRs2oKSkBGFhYTQV5u/vf8Zjy8vLw88//4yrr74aMTExbteREy15rPHjxyM/P5+m1wjkMUj6ijB06FBccskl1INERAo5/sGDB7fpuMj1X331FWbOnIk+ffpgzZo19LmmpKTQ+zsbRUVFNGpCbv/GG280u55EkNavX4/q6upzPi4SBVy9ejUKCwvp69GvXz+6D4kKku25ubkYPnw4fb2aPobrfZDIFnktye2JYG6Kq7ghIo+8J+Q1IJ+Nll4v8rki0cq5c+ciJCTE4/vQXp+h832vOJxOgXiQOBxO92HlypUi+df89NNP3bbn5ubS7QsWLHDbvnXrVjE6OlpMSEgQb775ZnHOnDmiWq0W33jjDcc+OTk59PrExETx//7v/8TFixeLKSkp4iOPPOJ2X0uWLBF9fHzEQYMGibfccgtd+vr6ij/99JNjn6KiInoc7777rmPb2rVr6TaybArZ/vjjj9P1tLQ0er9k29SpU8UHH3yQ/i1btqzF+27tcZ08eZLe9r333hNnz54tXn311eLChQtFhUJBl2fjX//6F739ihUrzrrvuRzX22+/LU6fPl289tpr6Xskl8vFL774QqyoqBCnTJkiLlq0SLz88svpvq+99prb40j38dZbb4mTJ0+mn4H58+eLWq2W3ldjY6Pb/tLrSv7IcSUnJ4uBgYHijh07PB7XtGnT6P1dcskl9PPn6X1oz8/Q+b5XHE5nwAUSh9NDBNI777zjOElK5OXl0ZPPvHnzRIPB4Nj+zTff0H3Xr19PL999991iVFSU24nUarWKq1evdlw+fvy4qFQqxRtuuIFeR7BYLOJ1110nqlQqelI7X4FEyMrKots+/PDDZvt6uu/WHpd00u3du7d47Ngxx+3J60i2b9q06Yyv+zXXXEP3Ky4uPuN+53pcSUlJjm3Se+Lv709vT+5L4v777xe9vLzE8vJyxzbpPnr16iUePnzYsZ0IHiK0HnvssTMeq81mo58R8to0vc/4+Hjx0KFDjv3I8/f0PrTnZ+h83ysOpzPgJm0Op5tCUh4kVULSPTfddBM1Nl9zzTW46667HPt89NFHtCqM7KdWqx3biVeGpGKIuVtKadhsNpqKc62OIykOic8++wxmsxmvvvoqvY4gl8vxr3/9CyaTiV7fFbT1uIiRmlScub4WgiDQ1NCZIK8R4WzpxHM9runTp9N0kqvHjKTrNBqNI9VGWLhwIfR6Pfbu3dvsMUkactCgQY7LY8eOxZVXXknTYeT9deXYsWP4+uuv8c477+Dtt9+mj0N8VGVlZW77kRSdlEYjrxNJibX0+rT3Z+hc3ysOpzPgHiQOp5tSUVFBfRnEp3PgwAF64ibeI1chRErRtVotfv/9d3rZHhWmf+TEdOrUKbr97rvvxm+//Ub9IsRjQk6K5MTm6hc6fvw4QkNDERUV5XYcxMtEPCnkhNsVtPW4BgwY4HaZCAPSJqGgoOCsxmRCXV2d22vcXsflKgQIkhBpuj08PJwuPR1vU1+WtI34v8j+5P0kPi4ipDdu3Ej9PMRQTnxIkneqtLSUHp+Eq+A6Ex3xGTrX94rD6Qx4BInD6aaQCAOJDJEoESk1nzBhAo0WuJ5kyK91hUKB9PR0+peRkUGN2qTSipy8SDSCQE5mxID7j3/8g54oH3vsMdrT5/7773fcFzEKk/vyBNl+pvYCRIwRmkYxGhsbz/t1aOtxuRqRXfcjEYwzIZW0t7ZJ5fkel3TblraT97al19nT/tJrTyJGK1euxLZt22iriA8++IB+jmbNmkWvZ1lPJ0FBQa14th3zGTrX94rD6Qy4QOJwegDkxEiEElnee++9ju0kNUMiBi+++CI9CTb9e/LJJx37kl/1JE3366+/0uoi0gDwvffew65duxxVWqSSq2mVFulbRBoHnqlJZWRkpCM64YoUwXJFSr20lvM5rrZw/fXX09f3888/b3EfUsVFInudeVxnez1J3yydTud4Dw4ePEjf62HDhrntR7afLx35GeJwuhtcIHE4PQSSennooYewZcsWGiEgkJ49RHAQIdQ0MlBfX09PnlIqzvV68it9zJgxdF0qtSdNKMk+r7zyitv9vPTSS3RJfFAtQdIuJIVCUjAS5L6IqGsKScEQn4kkNM7G+RxXW0hKSsLTTz+NJUuW4MMPP2x2PTnJkzYGR48e7dTjcoWkUkmLAAkSMfzpp59w3XXXQalU0m0kqkOEKhEwEiQqRloDnA8d/RnicLob3IPE4fQg/va3v+H999/HU089hUsvvZT6V3744QfaI4n8iidGYBJNIGbczZs34/XXX0ffvn3x5ZdfUgPs5MmT6QmU/MonBl7SLVrqo0MMv8RcS+6bCCvS42bPnj34888/6f2QUSctQTwuzz//PPWpEP8LGSFCHp9EGIiBuKnPhKR7yPMgKRfST0fqg+SJ8zmutkL6TBEvEkkfkUgSSVMS7xd5PYnPh/hjyAiOzj4uCWLQX7BgAU23EiFCegkRMz4xQUuQXk5kO3lfFy9eTIXSjh076HN69NFHz/mxO/ozxOF0N3gEicPpZpCTDznJNTWwEvz8/KjgIGJCGnlx1VVX0XXiBSHRJCI6iHg6cuSIw4NEZmoRPwox9JJqJJIqISetX375xS3l9fjjj1OjLTnhkeo48jjkREc6S59tDAU5eW/dupU2+yOQyilybGRfckJ3hUQ9iKAiUS5iRCfRmTPdd2uOi4gXclvXijCJO+64w63a6mwilDRsJEsSlSHHRl43Mh+PCCXp+Z3vcRHh5el9JoKRbPdknibijESRiDGavG9EdBABQh5DgqTayDE88MAD1ANGXksiVolhm9xvcHDwWV8vT+9De36G2uu94nA6Ej6slsPhcLo5xHtEIoFffPEFjRZyOJyOh0eQOBwOh8PhcJrABRKHw+FwOBxOE7hA4nA4nG7OmTw7HA6nY+AeJA6Hw+FwOJwm8AgSh8PhcDgcThO4QOJwOBwOh8NpAm8UeQ6QmUekmy1pKEc6AnM4HA6Hw+n+kAarZCA16Rd2trFHXCCdA0QcuU6w5nA4HA6H03PIy8tDdHT0GffhAukcIJEj6QUmXW85HA6Hw+F0f0h3dxLgkM7jZ4ILpHNASqsRccQFEofD4XA4PYvW2GO4SZvD4XA4HA6nCVwgcTgcDofD4TSBCyQOh8PhcDicJlzUHqTNmzcjOzsbAwYMwPDhw7v6cDgcDofD4XQTLtoI0gMPPIC7774bmzZtwrx58/DOO+909SFxOBwOh8PpJly0AumPP/7AihUr8MUXX+Czzz7Dn3/+2dWHxOFwOBwOp5ug6KmdrImg+eGHH2g3zNdee63ZPgaDAR9//DH27dtHJ2HfcsstGDJkiOP6e+65B48//jgmTpyI33//nUaTOBwOh8PhcHqkQDKbzUhJSUGfPn2oCDp58qRHATVr1ixUVFTg3nvvxbFjxzBq1CisWbMGkydPdtxPeXk5Dh06BL1eTy9zOBwOh8PhEASRDCbpQRDxQzpYx8XF4aGHHsK2bdtolMiVn376Cddddx2ysrIcI0EWL16M06dP032JsAoICKDzWBQKBTIyMjBjxgxkZma2uhOnn58fampqeKNIDofD4XB6CG05f/e4CBIZLkfE0Zkg6bfRo0e7zUtbuHAhrrzySpSUlCAsLAwJCQn4v//7P4wYMQIrV67EsGHDWrw/o9FI/1xfYA6Hw+FwOBcuF6RJm0SCYmNj3bZJl0lUibBx40Za3k/2vfzyy/HVV1+1eH+vvPIKVZzSHx9Uy+FwOBzOhU2PiyC1BhLt0el0btu8vb3pkqTXCKGhoXjsscdadX9PPvkk/vrXvzYbdsfpnhTVNCKrXI9ewV6I8NN29eFwOBwOpwdyQQokEuWpqqpy20YM2wR/f/82359araZ/nO7PD3tz8eSyo7CJgEwAXpk/EItGukcTORwOh8O5KFNsgwYNwpEjR9y2kctE5CQnJ3fZcXE6PnIkiSMCWT617BjdzuFwOBwOLnaBRCrWiLfo119/pZcbGhrwwQcfYP78+c1Sb5wLB5JWk8SRhFUUkV3e0FWHxOFwOJweSo9MsRE/UG5uLg4fPkxTZwsWLKDbv/32W2g0GtoQ8vXXX6el/qT/ERFLpFnkW2+91dWHzulAiOdIAOCqkeQCEB/MRTGHw+FwLgKBNHv2bNrD4Nprr3XbrlQqHeuPPPIIFi1aRBtBEnFEyv7lcnkXHC2nsyCG7Ol9w7D2ZIlj292Tk7hRm8PhcDgXh0AiTR1bQ3R0NP3jXDxoVUwEK2QCLDYRFXpTVx8Sh8PhcHogF6QHiXPxklFWT5c3jYunyxWHC9FgsnTxUXE4HA6np8EFEueCwWYTkVmmp+vXj45FfJAO9UYL/jhS1NWHxuFwOJweBhdInAuGoloDGs1WKOUCYgN1uGYEa+b5w9689rn/mkbsyCjnbQM4HA7nIoALJM4FQ0YpS6/FBXlBKZdhwfBoyGUC9uVUId1+3fk0oBz/6gZc/+luuiSXORwOh3PhwgUS54LzHyWGeNFlmK8GU1JC6PqP+849isQbUHI4HM7FBxdInAtQILG5ewRpzMjP+/NhstjO6X55A0oOh8O5+OACiXPBkFGqbyaQSAQp1EdNy/03nHL2RzqXBpSuyAWBN6DkcDicCxgukDgXXgQp1CmQFHIZrh7OemF9f45mbTb41l0iPTO3L29AyeFwOBcwXCBxLghqDWaU1hnpeoLdgySx0F7NtiW1DIXVbR9c+/a6VDrTbWisP4K9VHRbSrhvuxw3h8PhcLonXCBxLgik/kcknearcY6ckVJko3sF0kjQ0v35bbpfUv0m3eYfl/fDyF6BdP1IfnW7HTuHw+Fwuh9cIHEuqBJ/V/+RK9eOinFUs5GGkq3l32tPU2FFZrwNiw3AwGg/uv1Ifk27HDeHw+FwuidcIHEuMP+Re3pNYvaACPhoFMivIs0eK1p1n0fza/Dn0WIQ+9HfZiXTbYOi/Nl1BVwgcTgczoUMF0icC7bE3xWNUo4rh0TR9e9b2eTx9TWn6XLe4Ej0sXuOBkaxCFJORQNqGsztcuwcDofD6X5wgcS5IMiwe5BaEkiERSNZmm3N8RJU6U1nvL9dmRXU1K2QCXh4BoseEfx0SsQF6eg6jyJxOBzOhQsXSJwej8VqQ06FvlmJf1MGRPmhf6QvTFYblh8saHE/URTxr1WnHN4lMrrEFSmKdKSAG7U5HA7nQoULJE6PJ6+qEWarCK1SjghfzRn3vXakc4AtEUKeWH+yFAdyq6FRyvDA1N7Nrh8czXxIR/K4D4nD4XAuVLhA4lwwFWyk/5FM1rTntTtXDImCWiHD6ZI6HPZQiUYq3N6we49uHtcLoR4El1TJxlNsHA6Hc+HCBRLngjdou+KnVWLOwAi6/oMHs/ZvhwtxqriOVrzddUmCx/sgaTpS2VZQ3Yjyetacshk1BUDWFrbkcDgcTo+DCyTORSWQXM3avx0qhN5ocWw3W23499pUun7npAT461jX7Kb4aJRICPZqOYp04GvgrQHAV3PZklzmcDgcTo+CCyTOhVPB1kIPpKaQrtrxQTroTVb8cbTIsZ34knIrGxDsrcIt43ud8T4G2X1IpFeSGyRitOJBQLSxy2S54qGOjyQ1iVgV64uxp2gPXXI4HA6n7XCBxOnREKM1GQfSlgiSIAhY6GLWJjSarHhnfRpdv29KErzUijPeh6OSrenIESJSJHHkOEgrUJmJDqNJxGrZur9h1s+zcOuaW+lyWdqyjntsDofDuUDhAonTo6nUm1DTaKaeIDJzrbUsGBYNuUzA/pwqpJfW4aud2XTYbZS/FteNjj3r7QfHeBg5kr4O+PPR5jsLciDQs5/pvGkSsSqWCXgufxVs9stk+dzO53gkicPhcNoIF0icCyK9Fh2gpd2yWwupTpuSEkrXP9uahQ83ZdB10hRSrTj7/fSL8AMpmCOiqqSmEdjxHvC/awBTHRDgmp4TgLlvAX6si3e7U5nhFrHKVSpgI2rRBSKS8upYpKxFuKmcw+Fw3OACiXNRGbQ99UT6fm8ejUIRX9JVQ1snZLQqOZLDfKCGCdbldwNrnmZCZegNwL27gVkvsx2JWBr6F3QY3uFuF2PNFghN+jsJEBDtHd3yfXBTOYfD4TSDCyTOhdEDKbjtAmlySgh8XLxGZL7a0v1nibS4MC7UjO9VLyIyezkgyIBLXwOueA9QqJlQkquBqkyg5Dg6jKJDbhfDbcBMvz5u20SI+ObkN54bY3aVqZzD4XC6OVwgcS6MCFIrK9hcKas3ot6lzJ/Ih6eWHUMRSZmdjYL9+FvOnRgqS0e9zAe44WdgzF3EAc6u1/gBvWew9WNL0WEc+cH98rz3EB07ga5Oj52Ovw7/K13/5sQ3ePfgu81vX3qy803lHA6H0wPgAolzwQ+pbYmscj0VRa5YRRHZ5Q1n9uns+hj4Yg50xjKk2aKwGC9DTJjSfP+BC9jy2M+k3A7tTn0pkLGBrceNZ8vyVFQaKulq36C+uGXALXhq9FP08qdHP8XHhz92v4+jP3WuqZzD4XB6CGeuZeZwujEGsxV5VQ3nLJBI1RsxWttctItcEBAfrPPs03FNRRExlTQTC08uQpVJS7tqRwc0uV3vWYDKG6jOBfL3ATEjcS6QiBYRc+R4I/y0ziuOLmXHEz0SGHwdkLMdyN2NqrgkenWAJoAur+tzHUxWE97Y9wbeO/QeNAoNbup/E3DkJ+DI9/Y7I5Ev+wvRkaZyDofD6SHwCBKnx5JdoaeBGV+NgjZ3bCtEbLwyfyAVRQSyfHn+AHcR4smnQxEgv/xNRIWHeW4YSVDpgJQ555VmI+NQxr+6Add/upsu3cajSOm1QYuA2LFsvWA/Kg0VdDVQHejYlQii+4bcR9eJUFqy9y32nAiTHoV5/i/Ql6hgbpAB/a48p2PlcDicC4mLNoJ09OhRlJSUOC6PHj0aPj4+XXpMnLaRUSp10PamzR/PhUUjYzEpOYSm1UjkqJk48lBKzxCBqhwMjPLHsYJaHCmowWz7jLdmabajPwLHl7PKNpm8TZGjJ5YddWTnSKSLeKTI8UaYcplBW6YA+l8F6IIAXTDQUI4qe/dsKYIkcefgO2G0Gmmq7eUTn0OlBq6OnoTqimQU3XcvYAumzysi8UP43/l4q4+Tw+FwLkQuWoH03HPPIScnB35+rOHfBx98wAXSRVTi7woRRR6FkURgIqtScxVJdp/OoGgrluxpIYJEIN4kjT9QXwJkbwMSLmmbR0r07JGKyP6RbUiaDngF22v8xwCnfkeVsdqjQCLcP+Q+GE/9jq/NRXguOBDaXnPQ667nAJv03AQUvf0VvObdBGW4ewsBDofDuZi4qFNs99xzD1577TX88ccfSE5O7urD4XSRQDorxI9z6avu4sju03EdOeKxjF6hAvrNO6c0W4Rvc9FGPVJBGhaVIgxa6LwydgxMxLttM9OLgRpnis1x6Ae/xt9Sd2NRbT1EQcA3mz5wEUd2bCJMOS6pPA6Hw7kI6bEC6eTJkzQK9N5777W4DxE+ZJ93330XxcXuQzsHDRqE//3vf7jxxhvRt29fZGdnd8JRczpGILW9xL/NRA5lS20Q8NBRYNiN9CJpFqlSyFBrsNA+Sh6RqtlO/AZYiIRpHceLmkelqEeq5ggzfqt8gOTZzitjxqBSzlJ4CkEBH3K9K0WHgT8fo3bsp4bcj6uSrkJhgAibh+ykoLxog8scDofTMwWSxWLBlClTMH/+fPz666/48ssvPe53ww034LbbbkNtbS0VSv369aO+I4lnnnkG69atw/Hjx3Hdddfh1VddIgScbo/NJrp5kDqc0hNsGTnYrcKLiKO+Eb50nfiQPEJK8EnHa0O1syy/FfxysJAuLxsYTqvtCENiApzm7H5XMCO4RMRgVKlY1Mlf5Q0ZSQtKGGqAH28CrEYg+VLIxj+EZ8c+izGDL8O+JKdCkmJgBQ8+CGMaG97L4XA4FyM9TiARMy4RNySCNGnSJI/7rFmzhkaHVq9ejTfffBMrV67EqFGj8NBDD3ncf/jw4SgrK+vgI+e0J8W1BjSarVDIBMQGeijLb29KT7FlaL9mVw2OZmm2o/nM+9MMYswmRuo2pNmqG0zYnFpK1x+cnoyZ/Zgf6Mdd6czwLVWvuaJQoSo0ha4GuNoLServl3uAqizALxa48kNAJoNcJscDQx+AbyOTRb+NFPD4LTLkhgCWsnLk3PAXNLr8qOBwOJyLiR4nkORyOY0gnYlly5Zh6NChNI0miaqbb74ZGzduRFVVFd22YcMGGkH65ptv8Pjjj+Pyyy9v8f6MRiONRLn+cbpHei0uSAelXNZ5EaQQ9zEeBKcPqYUIkmua7dSfgKmFVJwLK48Vw2wV0Sfch6bxrh8dS7eXH/qdRaJ8IoF41jHblcpgNig30MJ8SJRdH1DzNuQqYOGXgM7pTSooSkWyfarIqpEyZIfL8OxiOazxgbDW1CD35lug37PnrMfL4XA4Fxo9TiC1htTUVCQlsWZ5EuQyMdGmp6fTy8ScLRm0//nPf+KWW25p8f5eeeUVWu0m/cXEsCGnnK6fwdbhBm2JspYjSIOi/enyWEENTf15JGo44B8HmPVA6qqzPtyvh5hqudI+PHdCUjBiArWYZd3iFFweWgZU+bJWAwGNdhGfuxtY+wxbJ20GyHG4oD2QD5kI5AcB5X4s1daoAXSLe0M3ejRsej3ybr8D1b/8Av2u3TA38fJxOBzOhcoFKZD0ej18fZkvREIq5yfXEUj6be3atfj++++xePHiM97fk08+iZqaGsdfXl7rB5pyOnjESGf4j/QVrEyfEMJSWK4Qk7hWKYfeZEVmOTuuZpA+TQOudo4eOUv/o91ZbFzI3MGRdCmTCbhxaACmyQ54Tq/ZqdL6OgUSmbO29BbAZmGPPfK2Zvtbdxymy0MJdh+SCDxbXonQ6nTEfPIxvKdMgWg0ouiJJ5F7881InzoN1Us7cLYch8PhdBMuSIHk7e1NhYwr1dXVjuvailqtpoLL9Y9zkZT4E8pOsqV/LKBu/ngKuQz9I+1G7ZZ8SARJIKWtZabpFlhxuJDahkbFByLK31nqv0i3H2rBgpO2GJwUWcqtKZUWlr4LtFmB/84GaguAoN7A3Ledg3TtkIiq5uBeur7Hn81ykxlCMb9eD6/q05ApZAh76kn3B7DZUPTMszySxOFwLnguSIFEyvZPnz7tto1cJv4l3u/owqBTS/xJJKaF9JrEwOhW+JDC+jMPE6kkO/l7i7v9eohVr10xhEWPJHxTmTn7F+sEfLfbc58iaVBtoNUGGKqc6Th18y7xpEpNLCuFQa7EEb9hdJtFqUejzBuC1UTTiuYCdixu2Gy8TxKHw7nguSAF0oIFC2hJ/+7du+llm82Gzz//HDNnzuTRnwuAOoMZJbVGup7QGREkSSB5MGhLDLb7kI62VOrvSLMtOGOaLb20DscLa2l13mWuo0uq84CcbRAh4DfrOPxysAANJkuz21fpWSowwGp1btz8LzZPrgn1W7eyYw5OxJXDRtB1mUKPk+pejr5Jqvg4WvHmhkwGVZznCBaHw+FcKPRIgfTWW2/hiSeewPbt21FQUEDXyZ/JxJrwTZ48mXbJnjNnDu2FNGHCBJw6dYrejtPzybT7j0J81PDTKrvUoN00gnS8sAYWEr1piQHz2TJzE6AvbzF6dElyCAK8XAbwSp2z4ydAFRSDOqMFvx8uanb7qkZ2nwGu3bFFK1CZ2WzfwjUb6fJQeB88MmMg/FVB9PIqs310SdFhOm4k4vnn3ESS72Vz+BgSDodzwdMjBRIZKuvv74+rr74aDz74IF0nf64DS99//33aSHLAgAG46667aN8knl67MOjU9BoxA0kl/qEtR5B6BXnBW62AwWxDuv34PBKUyLpyE9Ei9TNyPJToOb1GjuEwaw4pDFqEa0ey6M3/9uS27EFyjSDZ58a5QqrThGPMoB05cypCfTRIIFV2AA7L7R67oiN04b9gAZI2rEfA4uvpZcPJk57HqrhAqt141RuHw+nJ9Mh5Arfeemur9iORI/LHubDoVIN2fSnQWMWG1Qa3PK+PVJkNiPLFrsxK6kPqE34GIz9JsxUeBI4tA0bd7th8KK8auZUN0KnkmNEvzLl/8RGg/DQgV9Pu2ddYNPj32tM4nFdNI1b9I1n0ymw1o87MXpsAaX6Iy9w4Vw79vgFaqwXFukBcN58ZtON843Cg9ABylEqAZDCLjwLE7C2T04hRyIMPonrZcpjSM9CwZy+8Ro/y+PRIlRsxctMZbzIZjUARkcXhcDg9iR4ZQeJc3DhGjHSK/8gePQroBSibD4/11A/pjJVsBNpVWwBydwA1+Y7NUvRoZr8w6FQuv132/pctEyYDGj8Ee6sxsz/rrO1q1q4yMlM2GTHid/9B4Kbf3ebGuXLil9V0WTNwOKICWCfyWF8WmapRmdAoqljPpooMx23kvr7wu+IK9ljffdfsPm0mEyq/+RZFf/+HcwAur3rjcDg9FC6QOD03gtQpM9ikCra+Z91V6qh99EyVbAQSzYkbx9btaTbiW/r9CBNI84a4RHv2fwkcsM8bTFsDHPiari4eFesQVXojM2tX2avW/NX+kPnHAL0mNoscSQIuIvUQXR90lXPYbawPu09fn1qcEOOcA25dCLiepdnq1q5FzcpVNJVmyslByeuvI/2SySh56aXmz5dXvXE4nB5Ij0yxcS5eiJDIrtB3ngdJ6oF0BoN200q2k0V1MFlsdJDtGXsi5WwH9n0B9J+PHSUqNNTXYryuFBNJk8f1aUDhISBjvcuNRGDFQ0DiNIxNjER8kA7ZFQ20b9K1o2KdJf4a5ygRT3yzdDv+T18Bq1yOuOnOeYYkxUYfRVmOY7Z4DJelQSw6DGHQNY59NCnJUMbFwZyTg8KHH2523/KQEFjLy5lvygWhM8bBcDgcTjvCv7U4PYr8qkY6o0yjlCHS78wpr/aNILVs0JYgo0BIVZ3JakNqSd2Zd7awNgWozAD+0w/Dvx+KE5r/w/9sT0Dx613A1jebiCP3ijRSkHCdPYr0nd2sLUWQAjQBLT7sqeJaGHZso+uKQUMg93aKzBgfNkKn0VqLowq2Xp+z3+32JGJkzm1uDteOGY3oDz5A740bEPHC881aA+Tfdz8a9rvfF4fD4XRnuEDi9Mj0WkKwNzVGd3wF29lL/CWIaBnUmoaRpCfRmqfdNnnZmKAya4KAuAnA8FuAyaSLdZPn6FKRtmB4NFRyGX0sMgdO8iAFqFsWSO9vzMDwEtZENWTaZLfrdEodQrWh7GHsfY4UJUfdokGm7Jxm0SF6X3ffA5+pUyAoFI6qt9ivvkL8z0uhGTAA1upqOvi2ZkXLDTI5HA6nO8EFEqdH0an+I2KgNtWR7olAYGKrbuLwIRWcwahNokZi815JjymfhPyxDOCWP1jl2eQngCveYaLIQ0VakLcaswYws/anWzNxpKjgjBEk8tqtPpiDweVsYLPXxInN9onxZZGjsMRgmEQ5tNY6WCqyHde3tnEkqXojVW7a/v0R983X8JkxHaLZjMJHH0XZ+++ftU0Ah8PhdDVcIHF6aAVbZ/iP7NEjMstM4dK08QxIEaTDeWeIIBGxRdoGuGARZYgfMLZ5VIxUoJFKtBYq0q53MWv/coRFhooqPVsLP9yUgX7lWdBYzVCEhECd3LxtgeRD0vjUIUNg66cOsY7bhGaNI+1l/GR7S8i0WkS9/TYC/+//6OXyd99D0RNP0Ko3DofD6a5wgcTpUXRqD6RWNIhsykC7UZt4kAxml2aNrpAIEB0eyyJDVlGGpyy3YtroYS3v30JFWlyQ04clyJl4XHdUj6KaRrf98iobsPxgAUaUnnZEj1wbqzatZMuvz0VDUH+6XnCSjeyRcE2hkWVrehwJMhnCHnsU4c89B8jlqPn1N+T9361oPH3araEkbzDJ4XC6C7yKjdOj6FyB1PoKNolIPw2CvVUorzfhx315tOFjhCczOYkEJU7Dhh278NRmPfzD45ES3nyg7NkgVWwSgoIJJKtFh+zyBrfH/WhzBqw2EZOqWXrNe6LnBqpSBCm3NhehyWOAnSugKT+GeqOFdgqXIBGjM0WNWiJg0UIoo6JQ8NBDaNi3D9nzrmRXyGTwmT6dtg+gHifeYJLD4XQxPILE6TFU6k2oajDTma+9gr26xZDappCoTJB9htozvx7H+Fc34Ie9zau+CEUIxBupoShGkHvvozZAXgcpKydFkASbN+KDWfNHQnGNAT/ty0dwQzVCyguo+PAaO9bj/UmVbLl1uYjuN4au90Mm1hxzn/tWrC/GnqI9dNmiET1ri8chud4TxiP63XfcN9psqFuzxmkA5w0mORxOF8MjSJweFz0i5f1ald243FGQTtBlp9scQSKprdQS5yw2mwg88fNRZJbVIznMF5H+WkT5a7ElrQzP/HqMXk8QSI+jc4BEiV6ZP5A+hswukB6cPMQtevTJlkzaemCBjXXt1g4aBLk/SwU2xdFN21iDWv8Y+ECGEKEWG/cfxfzhTDwtS1uG53Y8BxtstGv3s2Ofxfze9iG8BNLMcsWDzIhOvFYkndi0m3cTD5ZH7A0mzyVSxeFwOOcLF0icHkNGaSdWsFVnA5ZGNv8ssFerb5ZVrm8mdcjlj7dknfF2r69OxbyhUZ7TcWdh0chYBPso8dBulm6b0cdZcVdeb8R3e3Lo+qUN7Bi8WkivEbQKLUJ1oShtKEWOoQx9AntDVXkaDTkHUFo7FTZ5tUMcEWyiDc/tfA7jIsch3CucRYx+e8D+rMnC5mhu6eqhclTDSSNJPOGhOo7D4XA6C55i4/RA/1FnpteS6bDWc0l5SZCLlw0Mx/ikICQEe0HpoX+TVRSpb+hcGRynpEtRFLDycK1j++fbsmAw2zA0wgvaI6xRo7eH8n5PPqSc2hyooofQ9X7Iwjvr03CwKM0hjiSISMqry3O2MGgqEe3NLV3xVA3nd+WVJEfp2Ods1XEcDofTkfAIEqfHkFGm79YGbdeU11PLjlHRIxcEvDx/AI3ySBRWN2DCaxsd6TUC2c/VN9RWpDEjolWH7/cU4L4pydRY/fUO1sPooWgzbPX1NLWm6c+q01qCVLLtLd7LRE/EYODIDxggy8adu3Ox5EANvJJIQtB58CTNJnmXoPAQAXNpbukKqX7zmjCBptFIpIiIoYDFi5F9zTVUKPnMnHnOrweHw+GcL1wgcXoMXVLB1gaDtgQRQ5OSQ2hEiIiepmmzSH+dRxF1Luk1CWnMiEz0RnGtAWtPlOB0SR30Jiv6hPugT+4BEAnlNX48BPmZI2KSD4lEkCqCZiIIQH8ZE1pWsx9MVaOgDGCl/wIE6kGi6TVC1ib3O6MeJGdzy6Y0rYbTDhwAVVwcHYBLRpP4TJlyzq8Jh8PhnA9cIHF6BKSnEOnlQ0gM7cQmkW2MIEkQsXMmwXM2EXWuAilUFwgytOS9jenILmcRt/umJqHhuXfO6j+SiPNxlvqnhyRQgRQtlMMfdaiGD6ymILCEHrC472KnQZtUoB1awta9wgB9CTBwYXODdhNTO/FtkdSk9BroRo1kAmnvPi6QOBxOl8E9SJweQU5FA01J+WgUCPFWd+yDWc1AeWqbm0S2FSIIxiYGnbc4ck2xJQdHUM/T8cJaGj0iNJaWw3D8OF33Hj/+rPfliCDV5SAmIgzZtjB6WYoiyZXOMSq1JqffCfl7mQdJqQNmvWTftqfFxyHtD0gbhOs/3e3WDkE3ahRdNuxp+bYcDofT0XCBxOlx6TVPHaDbFWIotpoApRfg1zOqqKRBtf5q/2ZVdKu++JUu1f360hEjZyPaJ5ou60x10GlMkEUNppcHCEwgJUZYHPsW1Lv0OTr0HVv2vQJIuZTNsCOvZWWWx8jRk8uOOnxYZElSjmS7buRIus1w4gSs9c6WCRwOh9OZcIHE6Vkl/p3qP0ppPpi1HTlrs8U2UNkombSbvz7DSli60HvCmavXXEv9w3RhjihSbD/WVHKu7jjCUYF6a4Vj38L6QrZiNgDHl7H1IdcBah8gmkWCkLmx2WOQtJqrSd21ko/6kmJjaQuAxv2s8o7D4XA6Gy6QOD0rgtQZ/qNzrGBrC6TZ4qyls3DrmlvpklxujwhSfECoW5sBQbRhuH3+WkvjRc42cgT6Mro+wHwE29UPoMHIGk4SShpKYLaZgdN/AoYawDcaiJ/ErkycypYZG1vdDkGaLacbOYIuG/bubfUxczgcTnvCBRKnR9CpJf5lkkDq2yF3TyJGpLmio9kiWLPF84kkSR6keP8wWiFHKuMIyTWF8DPpIfPygnYI62nUGhw+pLJjwO6PHNttggijzOCoYCM9kEqIGfuw3Zw9eJEz6pZor0DL2gzY3Af3Et/VX2emuG0jAaXvdudiR0Y5zAPYser3cIHE4XC6Bi6QON0eURS7aEhtxxi0SVSGCIsWmy2eRxVbgCaAVshte2IKltw+Bh+lmOh2r3FjISil2rOzQ3oh0WOtTGXdsO2UKOQQBQFyyB1RpoLSY0D6erbD4OucdxI5FND4schS4cFmj+GnYUW0fSN88MjMZLr+3sYMatpeuMtILxNzubWeiWMOh8PpTLhA4nR7SF+fBpMVCpmAuKBzb6bYKixGoCKjQ1NsJDpDoi9NOVlhF2bnKZBcK+SEvbvoZa9W+o9cj5GQa65xm5tWrGCiRjD7ItI7kq4Xpq5g3bKjRwLBvZ13QjqQ97qErWdsaPYYW9PK6fLyQZG4eph7n6QSbQCKdYGA1YrGgwfadOwcDofTHnCBxOn2ZJSyCEJskA5KeQd/ZMvT2Mle7Qf4RHTIQ5Cmiv2Dnd2sJbH0n/3/wa4iJmjagtVmRbWRld4HagKd22tq0HjoEF33nnD28n6PvZD0xRAvf8shkortTSYNpgDU1vnQ9YL8Xc2jRxIOH5K7QLJYbdiZycze45OCkV3RfMzKkWDWfbuhrWk2Mg8uawtbNoFUyZEUHllyOBzOmeACidPt6Zr0Wl+3uWDticFiQGY1m0321OinsPrq1ZgdPxsW0YK/bvwr0qvS23R/RBxJoz9Imb+EfucuWgmmSkyEMspzJ+uWiPGNocKtzlyHqv5zgYeOAj6RjgiSaPbD/gz2+hQSgzgZ6jvA3jDSFcmHRHokGZw9k44U1KDOYIGvRoGBUX4eTdvHghPb3g/pwNfAWwOAr+ayJblsZ8meXIzz0HeJw+FwPMEFEqfb06kCyWHQ7rgGkTsKd6DB0kAjSdemXIsI7wi8MOEFDAsdRgXJPevvQXkjSz+1Jb3mp/aDgvQeslO/bStdek9offWahFquRhjphi1VsvlF047YxQoWQbJZ/GEzs3RegVKOxoSZgJZddiMgns1hs1mA7G2Ozdvt6bVxicGQywTHDDvJXE7Ii2XvQePx47DpW+FDIhGjFQ86PVNkueIhup1EjJ5adpQ2+27ad4nD4XA8wQUSpwcJpAujxH9Nzhq6nBE3w9H0kgiSt6e8TY3PRfoi3Lv+XjSYm6edzlTiH6AOcDO267cyQeI1sW3+o2Zptjp7pGXgApTYU2xasxqCyZeuFyoUyI6e1/IdeUizbU1nAmlC72DHNslc/tlNIxCgU+EUfNAYGApYLGg4yFKFZ4R08W5ifqfp0spM2nepaQNNqe8Sh8PheIILJE6P8SAlhnbvIbWtwWg1YlMeG+g6M859Wr2/xh8fTPuACp0TFSfw+JbHqb+otSX+SpnS0SrAmJYGS0kJBI3G0VOorbgOraUE90axhr0HI23FGGNlTSJL5XJ4DZjW8h0lTHFrGKk3WnAwl4m6CUlOgUQgkaTpfcPwzyuYQN1pr6ZrVT+kwEQ3QzlFkNMIVrwHcz9J6ZE5eBwOh+MJLpA43Zp6o4VWsRESgztYIJkagKrsDo0g7SzcCb1Zj1BdKAaFDPIoSt6Z+g5UMhU25W/Ca3tfQ1F90Rk7bm/MZcIjrToNs35mTSdr/1xJt2kGD4JMfW6z69yaRdopUarocrbtFK7FHqhtNtgEAYLqDCmwXhOZUKlIB6pzsSerEmariOgAbYtViVcMjsTE3sE4RNJzrfUh+UUBEx9x3zb3LbqdVEE2JTnMB+G+mrPfL4fDuShxGhY4nG7InixW6URSLn661vfxOSfKScdpEdAFA95nn1l2LqzJXuOIHsmaRjvsDAkdglcmvoJHNj+CJaeW4PtT31MTtgwy3D/0fvQN6kujOqRvUmpVKvYU73Hrp7Tlw2fQ90/7oNo9e1G9dCn8Fyxo87HG+MS4pdiIubzKxsTqdFsadDIBH1nCkK2S0ZEj0v7NIL2QSAuAvF20q/bWQjZrjQiglubqke3PzxuAG4+m0csNR47C1tAAme4sER9pvAlBpgQGLqSruzJZlG1YrD+uHxVL58CdKq7Db4cLMW9I2wzsHA7n4uCijSAdPHgQV1xxBYYNG4bHH38cZrO5qw+J0wRSZXTrl/voelWDqeOrjlwr2DoAk9WEjXkbHf6jMzEzfibuGHgHXZcq1EjH7bcPvo271t2FV/a8gm9PfusmjgiBtSJuX+kSLRFFFD3zLMzFxecVQSKeJjJWhKAVAV+bCKVgQ5TF0nxorSekaraMDdhu9x+R8v4zQSrbFlw2CqVafwhWC8r3tDyXjTw//a7dMOcwQUUhI1AKWQ+lXfaWApOSQ7BgRAzum8r6NT234gQq9ayZJofD4bhy0Qqkhx9+GHfccQc++ugjbNy4Ee+//35XHxLHw7R3V2Nth1cdlZ7oUIFEehzVm+sRqg2lUaKzMSrCJRriQqRXJKbGTMXN/W/GQ8Mecms6GVElQtbUjWyzwZTTdnEZ7RNN75scM/E5SSm+MLPZ8YgOgVTOBuKezahty9iEtJIa2kGBVLCdjbumJCI7inXZXrdkpcceRiRClj51GnJvvhnpD7yP6gyXKFPOdirudmexCNLoXkF0effkRKSE+VBx9MLv9vedw+FwLpQUW0lJCWw2GyIiPDf0I1+MpaWl8PHxga5JaH79+vWQ2ytyLr30UhiNbLQBp3twpmnvxMjbIZSe6lCD9urs1XQ5PW56i+m1phEcklaTZrYRyO2+mv0VbREgQbpn09luZC5aoBwibO59umUyqOKY2bktkMq6CK8IFOoLaZpNEkjhViaKCJF2gVRYbe8+3hKRw2jzTZmxGgOELNgihyLQS3X2Y1DI0X/OFOCdPVAeO0R7GBFzNWkJQKreTEVFKPrHMzRS5oiY7fODV5wKSkU1kLMTWX31KKszQiWXYWgs6xOlUsjw6tUDMf/DHVh+sADzhkRickpom18jDodz4dLjIkhE9Pzwww+YPHkyYmJiMHfuXI/7rV69GnFxcejduzcCAgJwyy23wGRyhtIlcXTs2DGsXbsWd955Z6c9B87ZIemVpvYU0iOnQ6uOOrDE32w1tzq9JkFE0LPjnnWIKbJ8duyzbuKIML/3fNps8r+z/ovvblxJB9M6kMkQ8fxzUIa736YtDSOlNJtDIFmcgi3KwtJ5hdaz9CmSK5hZm3iPZEcxIan1Hq/wSWPpMqUqFxNthxEqVtBoYkFmHgoeetgpjiREAaYAdhvk7cGejFK6OiTGHxol+78nDI0NwC3jetH1p5cfowUBHA6H02MFEvEKLVu2DM888wzuuecej/vk5eXhqquuwl133YXq6mqcPHkSa9aswd///ne3/Xbs2IF7772X3p+/v7MDMafrIVGiPuFslIUkjl6eP6Djokeky3Ntfoc1iSTptTpTHYK1wRgaOrTVt3MVP2RJLnuCiKaR4SPhl14KUa+H4OWFmP9+jqQN68/JoN20FxIxhRc32AVS4nRWlUbTbUws5beisaVoT7NNlBOBdPb0mkSuJhB6rQZKmxUf1f0H29UP4K9F/0P1tdfAcPhw8/5GAlAzYBSg9gVMdcg/xXxaYxKcY1gk/jYrmVbTFVQ34o3VxKTP4XA4PVQgqVQqGkGaOtXefM4DX375Jby9vfHEE09AJpMhISEB999/Pz799FNY7CkBIoqeeuopLF++vMUUnQRJv9XW1rr9cTqW/KoGnC6uo+tvXDOYNhAkKZUOo8yeXiPz1zx1hG6n5pDTY6dDToa4tgFJ/DSNHHmifiNrxugzeTK8x40758hRs6G1rim2xFl09Ih40wo8iZfptrKGUholOxM5fsxTNUxIxYiI1mf3EzW1CA9hfZMq07xQtN0fU3cdgKy2BtbEWPw4QXCIJJsAfDJbhoIQHyBmNN2mINVzxH+UwPxHruhUCrx81UC6/tXObOzPYY/D4XA4PU4gtYa9e/dizJgxVBxJTJgwgUaT0tLSYLVacc011yA9PR2jRo1CUlISFUst8corr8DPz8/xR1J7nI6FzM0iHqSxCUFYMDy64yJHndAg0mwzY0PuBkd1WkdSt549jvdUe9XYeeJaySZVsVGh5hcFodckxMcMhmhT0Eq7lvo0SWwo9UaOLRQqwQpNQeuH8oaZCyDYnef1+VrU5ZPPgoigRbMR9L/P8PNEOXLtGbuPZgvYPEhATFBfIG4c3ZZiOgalXMCwWM/Cl1S2XT0smmbqHv/5CIz2tCGHw7m46dEm7ZYoKytDnz7uJ7rg4GDHdX379sXp0+7hdCJ8WuLJJ5/EX//6V8dlEkHiIqnjMFls+GFvHl3/y1h2gu5wOtB/tLtoN2pNtQjSBNF5ax2FMSsLpsxMQKGA9zmOF2lKrL2TNUmxSZEv10jWiPhAbDkZALm6DAX6AodnyROkvF9tG4g42XrWVTvl0lYdg9nsi9rs5gLZfMVC2Oy/gQqCBcSVifBpBJ4tr0R4MBk2zL7eRspOY1CEH7SqliN3/7i8LzanliK9tB5vL9mOyV4GRA1IRlRyfKuOkcPhXHhckAKJRI6kVJqE1OdIMmeTqFFrUavV9I/TOaw6XozyehNCfdSY0Y8NTO1wOrDEf23OWkf1WlvTa22hfiMbYeI1aiTkvmxO2vlCSv2JOZwM15UI0znfk2FxARCPBADqMuTX5QMtZKvNVhvtRaSwDcRirHeby3Y2TKU1pHVkk60CvlmTgWDVMXqpyB4curTYiEnhBpYmjRwKs6BCMGoxO4Kla1vCX6fCP6/oj99e/giX/bIUMoiohoDjtz6EmY+yflQcDufi4oJMsUVHR6O4SWM86XJUFO+a2935dheb/XXtqFgo5Z30EZU8SO0skEh6bX3u+jZVr50rdRvY43hPadmf11ZUchUt9ZfwVnrDW+Uc+dI/0heChZmfT5bZZ7Z54GBuNfQmK05qhkIkVXnlqUBNfuuOQSAz39yt2FZBwNJiYHnqn/RyTSirbpTVygHvUFq9B4UaR8EaQk5UuzSQbIEhGiMePMTEEb0viIj871soSLWPn+FwOBcVF6RAIi0Atm/fjvp6NgWesGrVKlr2Hx/PQ+bdmdSSOjqrSy4TcN2oTvJ6NVQC9cxfg5CUdr3rvUV7UWOsQaAmEMPDhqOjsFRVofHAQbru007+o6ZpNkJTozjpUxSmizyrQNpm7549KCkWQpT9dchgbQ/OhrJiJyJG1jiDSIKIzFnTUeFnRm59GhSCAkOGzaFXqWplgFeIw+i/zcwEUkLDkbM+TuGhEw5xJCEXRRQeP7u44nA4Fx49UiAVFhYiOzubeoFIbyOyTv5IjyTCjTfeiLCwMCxevBj79u3DF198gffee4+2BuD0jOjR9L6hHW/Mbuo/8osF1M7WAu1ZvTYtdhoUso7LaNdv3kw7Zqv79IGynaOkUiUbIcyrecozJYhdn3+GcSPb0srokpb328v9SZqNGLvPNIiXPCekroZ/YgOSvngesbcPQdLcEkyb4QudP0uv9fIeguQBk+i6Vx1g0zC/4e7MSuy1MS+i0l7J1hKi1YqAlcubbSeRqsj+TGRxOJyLix7pQSJNH11N1iRiRDhx4gTtmO3l5YVNmzbh6aefxg033IDAwEB8/PHHuPnmm7vwqDlnQ2+0YNkBdpK9YUwnmbM70H9ksVkc1WsdnV6r/YOlmnSj2CDYDosg6Zq3DRgelYjtp4Aac6nnYzOYcTif+IiACb2DgdopwObXsKxoG55bOot2CpeaYDbr81R0EKgvBlTeUI64AkqNGfjlTyiLdiE4XINKM5CX2xsR0waiRA3ojALqGnUgJRe7sypwwNYbNsghq8mlKb1ihYJW5BHRJ0XDyA+r4udfgGXndthkcgg2Kw1WkQ5PJ667Bwu5UZvDuSjpkQKJdMk+GySd9u2333bK8XDah18OFdBuxqSL9vhWzOlqf/9R+5b47y3eiypjFQLUAbSPUUdRueR76LdupetV33wLTXLyeTWHbKnUX/IgNeWShBS8c4pEW2pQVq9HiLeXe5PMjApYbSJ9X6MDdIDvCBRrfPGcr9oxRoWMSSHjUsZFjnNP451e5Rx2q1ADcePpxczSI6iMCgNEOcpKe+PrbeUYGiAgvlhEYZ3VLpAqoYcW9YH94Ft5FMsOfIDn8v6gj+UqyMrffRfVP/wA0ro95j//RkVmNgxv/wcnAuOxp+9ELGy3V5LD4fQkemSKjXPhQX7Ff7OTpdcWj46FjAzc6iw6qMRfql6bGju1w9JrZIp9yfPPOzeQWWTPPEu3txenKp2DaL8+8TWWpS1zu753cDggKiEIIjZnpLXoPxqfZG/UKFciN2YobE1myRDhklfH2js4SF3JlinMY4SAOMA/Fqt1rKo0xXc4YNPhk63ZqPZlX2dpuTUorjEgp6KBzm3TJE5AsVyOf+auoI/hKsiyP/8A5R98SLeFP/ssfGfNRNjoEfRySGM1fjtUiPJ6PqeRw7kY4QKJ0y04kFuFU8V1UCtktDFkp0F8ax2QYiPpNal6bWZcxzWHNGXnNJ9FZrPBlJPbLvdPvEEfHPrAcZk0hCTCwtUzJAgCvGTMGL0rr2WB5Dp/LTZ+MoQmx02iOjE+LsZ8UuVWfJSV+Pd2eQ3jJ2G1F6tam5s027HZZO9sUJFfjdXHi+h6/0g/qBImIFWlbDaSZOwxCxpff5euhzz4AAKuXUTXVXEsYhbSWAPRZMSrK0+hqKaxtS8Zh8O5QOACidMt+HYXO6HPHRxJe9J0GvWlQCMZLyFQn0t7sb9kPyoNlfBT+2FkRMel11TxHrxaMhlUce0zloX4daQ02JkiPWE61grgWIl7SXxhdSMyy/Q0kjM20TnqI7zPPIxqdI/MPDPmmSbpNXv0KGYU4OVMuaaFJSNDpYJSBKLVLNpD0Hqx4/SrM2BzKjOFj+4VCMSOxXqdu+F/cKYN9/7O9g+44QYE3XWX4zp5YCAd+Esq2iL0FVi6Px/jX92AH/a2j+jkcDg9Ay6QOF1ORb0Rfxxhv/j/0pnmbML2t+0rIvDeCODA1+1yt7+m/0qXYyPGQilToqNQhIVB0Lqc/GUyRDz/3HnPYJMgZmYS2TljpIc0Xg20V7LV5cNitTUv74/2h5/W+ToY/aJwUqNxu4+xkWPdHzzV7j9KcUaJCKvB2neMb2xE/0BvKr4I4ToW5QmtMSG9pN4xf+1IQwF+8WHViYG1Imbut+GRn21Q2ADfyy5D2FNP0iiYBFkXotnzi9Sz4ydjb55aduyskaSzVuVxOJweAxdInC7np/35MFltGBjlh8Ex/p33wDUFwC5n+gjEn7LiIbb9PFh6eilWZK6g66uzVzfz7LQnlpISiI2NVBjFfPYpkjasb1eDNonoEDOzJJIkc3PTfkh9Q5iwtcgqcbrE2bV6W5qUXnM33a/P3QDSsijcYkGinEXu0qvTnTsY64GsLWw9ebabV211MSvZv7Rej/CaQ3hl/kCoBAv6aFmlXFC9DSXl5cRzjaGxPnh2x7N0iO3Duxvx4QdW3LbGBo0FkCf0QuQrL0Nwmdko0RjGejtF1bPjJ1hFEdnlzo7iTSHv8/zvFuIfP71Clx35vnM4nI6nR1axcS4cbDYR/9ud0zXRozLSKqKJM0W0ApWZdBjruUAiB8/ver6ZZ6dZdVY7YTjFDNTqxAR4T5iAjoBUepHjJ2k1Ejny9DxifJhvTKaswoGcKur9Ie8tmb/mKO93QRIPV9XpkW2VI0MtIK0qDZOiWT8jOorEagIC4t2ad6ZWpSK7NhtqyDC5oRHI3oZF06djcqQFwZ9YkasGvIxApCkdiojx+Cn9Kyq8Eho0GLuBjRuSsGRnw1JZ6THa5pOYAOOWDY4IEn1uAhAfzLxPxARP/F8kxUluT973739ZhesynoEMMpqW/L76R4y7p2Pedw6H0/HwCBKnS9mcVoa8ykb4ahTUf9SplHvokCzIgcCE8/LsEFF01uqsdsJ4ivUDU6e0b4uCppCTPGlV0NLJPsqbCUpBWYX9OcTTBWq6r9CboFXKMSzWPiwNQF5tHnYX76a9hq6sr0dvPYv8pGeyppru6bU5tPxegkTkCBP9esOLmLyzt9HLYUItFTA19gBklDEHmdUZ+OjwJ/TyowYyvNe9ak6wiTDmeO7+HZiS2CyCdNnACNq8tHrpUqRPnYbcm2+mS3o5PxsTMxZScUQgS3I5I7/l7uIcDqd7wwUSp0v5n71z9tXDo884bb1DOPqDfUVwiqO5b51z9Khp1+kzeXbaC8NpFkHS9GnfESltJdKbiVuZshb7cplBelu63SidEAiVwvlVszyddawe22hApMWKJPsg6fSSQyy9abPS7tmU5Evd0mursplwmtX7Srax4ABLx+nZYzX4svcyqqEQ6silsMGCRVX9EPxV87EmVgHI9TV5fD5SJdsQWR1uHsfGE2VV6GnkiLRRoB2+CTYbvexTqHSIIwly2dfQif28OBxOu8IFEqfLILOy1p8q7fzO2YS8vUDBfkCuAu7cAtz0O/DQUWDYjed1tyTCEunljIS15NnpaRGks0GaYWrkzHRdUFeE0loDtqVXNPMfkfYHkoF9fi3zKiWZmEjJVCphqUhj70tDOaD2A+LGOW67rWAbjcSpZWpMSp4P+MexlCgZI0KqEcnr4c2M4NGGLMi1ebjkkAzzPzkG0WCAytdM57gRbIKIT2bLsLzMXinXBJV9ZqNYWoL7x0VDIRNwrKAWmQdPOsWRhM2GCNHcLHJIHqtXLB+OzeH0VLhA4nQZS/bk0hY+4xKDkBjSfiX2rUIyZw+8BogYBPSaeF6RI9d0GumeTXhx/ItYffXq5uMz2glbYyNM9hRRV0eQSOWXlGaTqaqwM7MCe7IqmvmPthdsR2ljKQJUfphiL/OPslihJb2bZALyVBrgNBubgt7TaVNJybN07/p76brRZmSRpHiSNiOhna2Angmk3ABmq0wstuKG9Vbcu9IEwWaD79TRSJhVRue4xU4pR+011dg4WIY/8tbBaG3eCFLu7w+ZL2us5FVZgskpoXR9ZbWHikSZDAH94pE7ZI+bSBoyPQ7eAe6VehwOp+fABRKnSzBZbPhhb17XmLNJGucEi2JgtLP/TXtQpC9Co6WRds6ekzCnQw26xrQ0Gr2QBwVBEeJswtj1abYqfLo1EwazDcHeaqSEOQcA/5z2M13OTZoH1dy3aVqTfAklSmk2Q5lzvIi9eo0YoJ/b8Zyb+KDNKiMHsQvEh1RfSrtlG0hFHxlgWwpcsYftr7nlekS+/CIEhQxKnQ1eYSaMkjXSCro6S6NjXl5TwaeKZelSIkKvHsbE38FdbECuK6StQo2fAjuFdRBcfE4G27k3lyTtBHZklPMGlRxOF8IFEqdLWHW8GOX1JoT6qDG9X/MJ8R3K3s9YaiZuAosetSMZ1Rl0Ge8b36H9j1wr2DQpXRs9aiqQiFGbpKMIE5KCHD2GyhrKsCWfle7TqBpJZ5K05g2/IAmsOWj6vg+BspPMD0YiSGdqVhloj/gVHgQqs5BnUmHeriYGedJna/YoCP7RABVk7CuPuN3m+bHRMr+k/3JGH5I5JwdT+4YiRG7FTVu/YdclMhO3MiqKtlUgY2V8G939RrnHWQStrZCGlKQx5fWf7qbL7zZlIv90FeqrDOd0fxwO59zgAonTJXxrn7t23ahYKOWd+DE0NQD7v2TrY9o3euQqkBL92Qm0I3H4j/p0rf9IwpFiU1Y6tg2IImNjGb9l/AaraMWQkCHO14ekNZOmICmJzVpLq2TPCVHDAS2rfKs2Vns2vkeMcPqQMjYgvFKErIkNiHyywqrsG6kgO+aY6zavKJMudxbuRFE9a1TqSSCRCJJaIcfTBesR0VCJOr9gRP37TXqdpbQUos2GVVmr4N/I0nD1ISzd11Bsg76mefqOCJ2WBA+JHD257Ch0ViDGLMOwRjkqvs/Cr/85iK+f2oET2wtbfP05HE77wgUSp9M5XVyHPdmVkMsEKpA6laM/Ao2VdOCpYwBqOyI1O+wMgWQ4zcSEJiUZ3SmCpFA7Bc3Lf56kERFSgSb1PvLkyeqdMo8uM5T2qFv+XtrVvNpQjdf2vkY3SekrN+O75EOyGhHuZYLYZMaxKBMQnjLEuYEIsqs+ArzDEVORiVHqUJq6+zXDnnL1MMaF9DvS79yJlF2sDcG/hyyAzU9JvUei2Yzi3JM4WHoQfgYmkFSRFpR65XiMIhGBQ4SOJHiOb3NvSppVrkd/gxx31mpwrV6NyQZSHceeFPHrbfr2FBVWZxJZHA6nfeCNIjmdzrf20v4ZfcMQ7teJJlZyhtn1EVsfdScga/+2ApnVLCqR5J+EjoQIDuPp7hVBivZmzSJFuTOCJI3o8A/MQ25dLnQKHWbFz2p22yQ58ynlKBUgNW0qIltWPIR/lG1FaUMpTVm+M/UdlDeWuzerjJ8AHPqWrhJ/UeSjd6PojY9ZpZlMhkhPY1c0fsDs14CfbsKVBanYE+xP02x3DLrDbayKFEEyZmSg6Om/0/XNfSYiNjgP2o+GQ6kJhrlBgZ2rXoOoFRFtZf2zAsK9cKRiJ0L1cTi1swgxfQOpWbs8rw4bv2FpUafgOY2dP2dA7aWASqugrQdmNSodYtDV0yTdZumr+6CvYZV/JHs5+YY+6De+k3uIcS5a6qsMqC5thH+o9oIvQuACidOp1BstWH6woGtK+7M2M3+L0gsYekO73z3xxWTU2FNsfh0bQTIXFMBWXw8olVD36oXugNOkXQcIZkBUOkZ0/HSambNn95oNnZJ1o3YlpKEKvlYrauVyZCmVSDGb8Z2PFpuKd1Ev178m/Qu9/HrRPzfix7td9F94HbzmLIQpJ5cO7G1xJl2/ebTH0vS01XgpKAAF9QXYV7wPoyJGNRNI1spKWO1+I9WN1+CVw9dAgAill5UKpFOndwNDVDTFRpJ5UVEhEI4yoVWYVoOvntqBsHhflOYwX1ZTjI0W+ifRVBQ1RRJHrlGlmL4B8AnUXlQnL07nc2J7If28kc/dxSDOuUDidCq/HCygIikh2IuW93cquz5ky6GLAW37z3xzrWCL8e2YxpASRseIkUQIKmZw7mr81f7QyLUwWBshKKshmlhlnVxuwMEKZs6+uvfVHm8rBCUhyWzBAbkc6SolnZ32ZiDzID0y4hH0DerbwoPGMh9SNYlKygBLI5ThZxBGjgcUgDmvQ/v+Fsyuq8VSXx/awNJVINWtW+d2E59ZszAnUYT8CPM0EYGEMsDQoIDSqoaoZxHJ6IBIDC1kBnOKCJRkSeKI3NZlMC6smHtbHJSBYVQkbTtYhKptJW4iiaQAyWUbRBxRWTHE5P61TU5Wv/z7IMJ6+SF9X8lFc/LidC71VQaHOHKI8/+dQmw/FiG9EOEeJE6nQdJCUnrt+tGxkElj2DuDigxnd2aSXusAOreC7XS3qmAjkGq1aB9m1FYomQ9JLgiYP6kEJpsRvQN6Y0DwAM839otCUiQTJ0fUajwaGgKzIGByzGRc3+f6Mz+wT4R9xQa8PZh6l1oFEVdTnsZV9Xp6cW32GtSZWPNKR8dsFyq//BJB2lDY7OKFCiQS/aoRMVbDGlpqfZTwtvo166pNuGSmDFN836eiiL5esGKy74eICSpBeIIf4voHYaPVgNVas8NLRUTRJo0Z33sZ8bGvATs1pNll86dSW25A2l4mjlxPXtyjxGkrpK3GnqI9dOkKiUxKny/X+d41pefezqK7wwUSp9MgM7rIfC6NUoZrhndshKUZe8hMLhHoPRMITupQgdTR/iOC0T5ipLv4j5qm2R6/IhRLbh+DbU9MQY5pkyN6JJX8eyKp92V0+Z2fD/UihenC8MK4F854G9rTKm+3+zf2iofY9tYw+i4MDEhBoskEo83kGGVCjNmeOmabqkw45s2GAiu9WFospBoY7T2VrvuH6hAQ5gWxSVsCYm2KHx6Pfl4bcWPInbgy4O90SS5Ls/9qGs3YnFqKo2orJj08GBPv6IdP/QzYp7EiT2lDvQxolAPD5idI3QrocuLC3hg4mfm/LqaTF6f9IYUUs36ehVvX3EqXUmEFgaRtm4pz8vnzI9svULhA4nQaUvRo7qBI+Ok6NsLihqEGOPhthzSG9FTBluB/7sNuW4vhdGq36KDdFGnMit5ahrGJQaiyZOFk5UmoZCpcnnD5GW9bWO9ewj6n1xz4a86SCq0korTpz1orUMnM8mdFroAw9x1cVd9AL/5y9CtnBZusydejTIbqgFBYallLgDQf1mk7tEZEcCN7z/3DdDTdUDryiKN3EzmJTF7cB95x8UCfy+Etr0CU+jhd0llz9g7ua44Xw2wVaWPNQclBGDQsHE8vGEiH8EqQgc5jZ8TjxpfG4cqHh9LloKkxGDYr1nWm70Vx8uK0L7Qh687nqJeSYBNtrCGrPZJEPtexfQPdbjN6XsI5p9d6QiUmF0icTqGi3og/j7J/tL+M7WRz9sH/AaZ6IDgFSGS/9HtyBMlar4c5N7dbRpCkXkgFdSyCI/0CnRY7DX5ktloLkC/hr4+7p8a+OvFVszB/MwITHc0fHZAmk/aoTOsOehguS14AhSjiSH0O0suOUQ8T6ZDtEEkyGb1caDJgiMDe51eCh9NlSK2I2vw6h0AiBAwR8EfyPyHvuw3XPdjb6QUy2r1Iof3ZkkS/SG8uACuOMOE1d7CUMgQWjYzF9iem4ib7/8zaEyXIq2ygJ6WolADHyYksiefI9Rf+pGuTL1hvCKf9oQ1Z7eLIrSFrXZ7zMilLpf8O7IOmr/Y87PlsNG13QS53R8HEBRKnU/hxXz5MVhsGRfthUHT7G6RbhEyG3/OxszHkmdI15/Mwog2ZNZmd0gPJmMqiR4rQUCgCmJG5u6XYCvQF1LD+R+Yf9PJ8Mlz2DLTYLdvly9kjJPpiH1lCIcu5b7V5rl7w9OcxkU07wS8bnwCytsB/xlgkbViP2K++okvSMbt37U7IBBGbhTikRubTsnyFVYBYWuFIsREG7yrHm59W4JIPl6D4qktRvXQpYDYAubvYg8z/hHmgGiqAw9/RHxDb08vpVZcPcjdWR/hp8ezc/hgVHwi9yYonlh2hfr6mEBF2w/NjoLEP7K0qaexWJxtO9ybWN9atzYVEnZGJf7E6H2XZVY7IEeHktkI01jlFEvHu6Xftpsu2mL1J+4umgommybO2tD5d3gFwgcTpcKw2Ed/tYem1G0Z3cvQodRVQlQ2QVM2gazvsYdwq2HxiOsl/1L3Sa64RJJIuW5ezDvXmerptVLizOqy1X860W3ZrXktpZMlNv7MludxW1D64asBNdHVFfSbMX80F3hoAZeEaeI0e5aiK88/bgGXeXrgvToSgqUaFD0vw1dUqHBEkcnIIf3+5s6u3zUYN3+aDqwCLgTapRFh/YOx97Pqd72P1sQL6fzIwyg/xwV7NDo/8Yn9twSDq39ueXoElezwLR78QHaL7MNF8ZH1es+7bnn6ld8df7pzOh/QWIw1YA2tF9M+x0SXhiW1PYOeW51H35lQYDUQ0mDE4cDNC43xgMduw948s+vkp/PZnpE+dhtybb6ZL+qPAA4c35DUzexPcCgy+PYn6NycB9v/DVhdetDO8zJ/T4WxJLUNeZSN8NQrqoeiS0v7hNwOq5v13enYFW/dKr7kKJNLQccmpJY7O2Z5+mXr6cpY8EG7dslsDiRi1MWrUlAl9FiLoxBeoUMjxuZ8vrqzXI5wYvhOnsfu2GFGctRHPhQc6Ulll/oB/ow/MooZu8wvRwrD/GAR7KsLN4L1/LegnI+ESFskcshjY+DL1SxXtJn2i+rml15rSK9gLj87qgxd+P4EXfj8Ob7UcI3sF0giTBBE5GfvZqBPXX+cV+fX0+I5uzHe0ASApOJIy2fZjGm8NwKFMPGBEygdWKu5FmYB11ybh07gs3Jv5Ix6Rs+8bX2Ue5H8+hmHTd2DVN3U4uqmA/kH0Q5/Q0Ygs3gmD0hcn3vwWfQeORkBKjNvn89Das0SF6edWQI05DN7qcmfhhfR/2IlwgcTpNHP2guEx0Krav3t1ixQfA7K3srTLqNs79KEkg3anVLCd6r4RJOIzIt2yGywNOFp+lAqdeYlsjMjZIEJqXOQ4mlZz65bdSSirc9DHZMJ2hRbvB/rjwwA/PFteifnE8E2+mHO2Ixcm2FzStGV+AqJq2IgRXy8T5EoZNXiLggDB5WcyOdmoGo+xCwmT2VLtDYy8Ddj6BqZUfI938Rwua5Jea8rN4+Lx9Y5sNNaewKcr1uJlUyIevmIu9Sq1VIpNOLIx3+0y2WfzktRm27pLXxsyk46MXSGikCCtu4rBjuBibrRJIp/lz73oiHwKNhEzvs9A2d1e+MW3EVswBGS09z6fKmi9NJjhXeJ+B4IMp1KuQ61PLAojJ9DLh95Kw+Qb5Og3QKQFFRVlngeTS72+HHclWqEzl0BfrYLKxwIlGU4o/R92IlwgcToUYijdcJr9ol08ppPnru22jxXpOxfwa14G3ROH1JLBqIa0NLqu6WYGbQIpySc+JEkwjgobhTAvz1+KniCiqLOFkUSx1hc7tM6TIhFCzwUHYpzWB/SITq9CrNlCfQmSW6rMD2jQsefnJ2MihKTdPpktwx1/WulXPjnffHKpDE80HGf30+sS54OOvhPWbW9jmCwd10cUIcqfCQBiTie+LJJ6dH09SusMiBI/xvGkY8gWBMjENfh1wzZMSv4vFQ9eqKfRITeRJACRiX4oTK8562sgtQboSnFAZveRgb0kCCedMsnTIb7gV+YPdIjBc6WuohxVRYVQ6YJgMescYuhi6xLdlJZaW9x2OgenYudiYDH73CZWDsP3/nOQ1EAi8syf5ECQozBqkuOilC6LDbkDXkIFjlU/Qb4V3B8CNiRl/ILMhCsdBRchZYdQvJnEW4Ppux8xqhb+bSm8aCe4B4nToSzZQwaVAuOTgpAY4t15r7a+HDjyI1sfc0+HP1xnCSRSvSY2NEBQqx2jMLobrum03cW73XqpdGdyRTLs1t3ET0RSHsjYFJH62cKtVtwU4RQ45f4yNGhZBCnAcoIaSomwWT8IMEm+cdIDLBHIU8iAoN7uv4K9Q7FBzSor71T8ftZeNEfTduN42DFHFIssj4cdxbG0PdTzQQzhKSe/Za0O7KX+U27ogxm39vdcn9C0NYDQta0BSORIEkcEshCbzPUj+5wrRzeswaf33oKfXngK/3vyLvz86tfUp7Xzlwxs9NAl+mLyZbHIZ9OtIvIj+uKSzGvd5gNOzLwWFZYy2t+9NemyAmMfrKu5H9lGIo6sjoIMskz3W4L4vPUYt+sfiM1lA6ErAvvDqJKqXgUU7fOHmTQB62S4QOJ0GEaLFT/sZfnmv3T23LX9X9AJ74gcCsSc2SDckyrYJP+RundvCIruFwAmkY/UqlS30LlrL5XuzBmN4mWn2DgTuRo+IWzsyfCw4Xh07hto0DGB5C8vBE78Su9HZ5ZBzTQKJb5URIzZwvxHLuRXNeDVGjaWJLZsM4rzduK5HS33opGZT7il+Og+ggB5yR4U/eMZ+oufeEDG7XoGQw+/7WgxILUBcG0wOeUvfah4cn3KOl8VtD5dN7qGpNKa2rdcIXP9sstZW4RziRyt/eRdlwpAEZaGdbBZ63BgVU7zdloXWaNNpdaK8gR7KacdQS7CGv8PCE2kAukUH1zfiMm+Hzg6w5+JdTV/RaphCl1P0WxCxajvcSTobdoK40jUbvrSa4zVSMz8Db41mbAqNDidtBBV/r1hUPtTdUzmK3Y23e8blnPBsOpYMSr0JoT5qjG9b+vTLOdNZTaw8wO2PvruDivt91TBFuvTsWlEQzeuYCOQ6ElTpHL9rkqdtRbJKP7PHf9knghRxLMJ89lxH2SGc/SahAMVzEs0PXY6wnwHokFbSS/7yQtRf+AnhI+9B39PuR/Avx33vbBQQHiU1ek/svPHkSJkiFHYpxmDEYZdyN37YYvtDshxDOg1DsLpD9wiXTJRhLra3y2vRk425E9VTXorMZMsEUrEX0RO+iRKJKXRyDYySHfD16foINyDa3IwYk7XDEAmPiMpLekJkmaLDz63YguSVmveHkGEzVoNucyn2f6d0WhTSvcFRETCJ4ikk7qQygxYzUwI5fY1I6kAyNZNwqmtbH6gaKuDzVoFmTwAgtwbvQp/hbduPWLVh1BkSsaa6r9BFPXOfWQ+9o7yJObk/LymNk7G3Lefgc5YTWcu6mcOg4AD9imFIpLSf8KBYY+iPHQo/SNKtU/aEiTFdbJFgwskTmeYs68bFQuFvJOClaQc9LcHnF+xJjZnqyNxrWAjIqkjMXbjCjbXKIxrw7lWl+t3A4hRnERrPjz8ISY0GjDf3mGb+I8I1uSZOJT+BV0fFjYMcu9QNGrZic3bUgzvshKgJh/TvEeAffoZ3sVGIJrMG2FjSiRWHGEl+JWD7wR274J36jogwn2Is+vrFx4+BFepI7DMZI/IiSIml0bhHVMo/tn0ychkUDU5qRBR1NRfJG0jJdtrPz+BvX9mI2FoKAIjvDrdwEx8VDGBWpgq89FLVoxsWziKhSCH9gv0UsFH08YqUdJHpzIDKisRQU3llwCZ3J/+hhp7VSJ2LM9wXD1xUcc22iTpPimiRbx7M+64HwOnzkRXYfOOQVChjEZsKhJ9IAsbhlSw49GqT6KqmPwPMBnTK9IX3nm/U8+Rt7wSseY9CMn5HHl+9Y59TF6R2NW/ATPTbnF7HFGQw6gNoQKJGMK9V++n+/8xAtiXLEONtx6Xp7pIKkGG08nXY7Tan1WBdiIXbYrtu+++w+WXX07/Tpw40dWHc8FxqrgWe7OrIJcJuPY8TZVt+iJc8aD7F+Cff+vwRmOdWcHmiCClJKM7R2GkVFWby/W7AX0DWQqtgoj6zM2AvgLI30O3pYUl095OXkovpASkoL7WDFGmgMxqQoaejR6p3PsTrJWscaSEWC0HIoYA2gC3dNKxglr6PzJi4mVA1Aj87OWe3vL0+imlppgEQcAYSx1OVhjdn4S987fUv6k19B4RhrgBQbBZRKz/8gTyT1Y6PDieOh83pT36KeVU6DGm5k9sVz+AJaqXsEP7IA5NP4WfZpkxwLse5fUmPPz9IexIL2+dF4n8YCJ9dL6aC8sPD0Cudk+3K3TTIZP70PTj0Jlx+MuLY6HztZ+Gz5DqO1+apvvIcu2n79Ht7Ulb3pPG9GKUBY/DjjEvoKr+CYc4isr5BVXFK11eEBGZhdXItGmBAVej5NZ9KKiKQZ5vrds+Kn0+apXZLiUN0lVWaBvLHBeJFLIqRCyfoMCJOBlEeYhbxIndm9Al6c6LNsU2YsQI+Pr64u9//zsqK1mInNP+0aOZ/cIQ7tdJFTFkLleTVvmOuVwdWB7aWQZta00NLIVsHIUmpXum2LpDuf75EuXDPiv5xONVeBI49D/2uQobiP0NTGwPCRkCuUyO6hL2pU2+8EsD+hEJhcbd/8Ue03UgrrsMv3Ak1hQjpEJARsRguH5Cfj/MRMaEpGAEequRM/x6/HzkP3SbRq6BwWrAS+NfwuWJ7jPsDjcUAnJAJyjRIJqh1+ZhVoXLwF7iJXrldfjPm9Om502iGJdcn4L/PbMTpTl1+PXtQzTgEp7gh+KMmjO2A2ivCrD1uw/iFcVnkAvsRCuINvhtfR4jSbRNkOEJ+a344eQUrD1Z4lbVlpFTjfTMaiQl+CMxzt6pvyrHLZos2kTIFEHUmkjvW9kbCs1AXP34cITFM0Nwg6YGweMF5K4EDq3PQ/9JUY6xGu2Jp3QfqVCtLi5sl1QbEVqH1h7B4Y11EASfs74nZP+TK1biZO+5EFxNaQKgqT8C+LoX2BABc5dfNO7I+hP/3jcR9xeFA35NXycBCksjhPAvgOKbIZIPrSAi5dQSmq6r8NJAZzJDa7ZCDDHjx0kv46r9L6JGS8QT+R53HocNIgyajrVKeOKiFUjJycn076233urqQ7ngqDdasPwAO5Hc0JnmbDKXq2kIva1zubrxDDbDaZZeU0RGQO7X8lyz7kBXluufL9HerCVErVyOWpkA3y1vsCuSZ+Fg6UG6OpR4I0jfoRKWgtM1lCBIy3oQRZlzoTz+ASrgg1T/WEQ3FkNtAjZUNLoJJCm9dvkg1hzy/bpTsAoCJjY0QgiJxxZ9NhVJruirc5EqY76OG/pch09Ofo2tOg3ur7WPMLHzwo97MSNyQJtL4smJ1Gpx+f8R4SaOPLUDINEJUgEm/dux0u5TiE7xh0wua3VajgiGY0cPOMRRs2MTbXhJ8Tk2WwehGEHUzP3Ez0eRurMY/ifqIIOANIiIHKLH/FkBwB9/pU+g3hqEIlMKttXeCtHqLCAQYKQmdUkckWpBYoiXWRS4QfFPoAzIPFiGpOHMhN+eqUbiOWr2/GQy+IefWVR6FIJnSN1RkaKbDoV6YIs9rtz3P+jYnyDazMjpFQHYx424CpYaLwte0AQgvv4oIsrKUegb7u73FEXIbGb8Eb0f34fqUTvtC+xJ/w62w8ewsW8c21cUMTC/DDHFtdDpgzCzLgrrZHkoDF+O8OL59D0lj7VGa8YIi9Xt/+eiFUiHDx/Ghx9+iB9++AH9+vXD9u3bm+1z/PhxPPTQQ9i3bx8CAwNxxx134PHHH3dc/9JLL2Hnzp3Nbjdv3jzcfnvHNg282PnlYAGdGZUQ4oVxie5+ig7FN5KlMBorz2su17lWsCX4J1zU/qMLBZ1Sh0BNICoNlShQKOBrZAJBTL4UB3Y+7vAfuQmkxlLEFuyGYP+o2Yzs16+XxgBrgAUoUSAn3XlyPl1ch9SSeqjkMszsH44TFSewMpv5nB6sqsZPskxAI0NRhXszx2Onl9GqtQibgKv6MoF0WK2GX2EpLFCgUu2DQGMdIurLaUn8pOSQNjVXJCf+1mJoMDtfg6YVYCLw3fN7YDWxiG5rokok3bijyh9WtdCiSFIINsTLSlBsY98rXjY4xBF9HAgoPqRFXcFN8JFX4ETDNGyqvQeiPRohszmbG/qFiI7jcZ1kb5ObcCxsK0YUXIo9q9OROCyERtfON1Lm2vwyLCAAcoUSVgt7DUnUZsbt950xevTVt8dQu62EPtfTtlpo+wm49i/j3W5DIkFrPn7H5VasUk+ujAfgg6K0Aqh1eocpnO7/ybsuBn+X/QVvWBrWwGiqg9xmo+JdEjVVAeVo0JLqNQFW7Upa3dlUHBHhc+lREz6eLUfWlHAMTPbH6f/+BGV0iHNfQcDR6BCY5DKsfPMNBIoiFiAKB/sew1rdJEQZa1Gg9kWF2ueczfkXlEAyGo246aabqOAxm81ULDWlqqoKU6dOxWWXXYb//ve/OHbsGBYuXAiVSoWHH36Y7jNr1iwMHjy42W0TEjq/2VRbOLZqL0r2pyNseBIGXEoCyz0L8itESq8tHh3n+GLpFPL3MXGk0AKLvgVC+3Z451Uyc4xUsJHxIhd7BduFBIkiSQKpr4mdxPLzdqCssYwa8QcGs1/Y1aVSBKkUFhdvkMXATsgx2jIE24xoKFHAO78EObU5iPONw+/26NElKSHw0yrx+DZ2UpsTNwsp+d8hvKGWzg8sPvAZoI52zJc7lLeNLodoQhHtE00LA6oKs2CpVVCNsi52BBambUSEvsJREt8WgUSiIk0bTZKMy9grE2mvINcMNhlholQrkHfKs0VBEket7dK9/GABjQzt8ZuFgVV7UW2JgL+iCN5yp5/LIsqQKdNBrsmAzRSMgMYAhzhyPBbkqLWE062bau+l/hUJs9VZtNFYwwaveppkfyxiK4YUTkVVLlCUXo3I3gEeh6y2tvO4a/NLkrF7fmKQQxwRJi2++YwG7bTMStTZxZHFeJSKGPNOEZ/s+gwz77gfvYZOouI2fz8bDu2pUg+WbKz493/cTOF+oeFNuoo697dZjsNqOg2ZTI4RGYVQm8zY0ieWipqrdjZg+wARlb4CBuSIOG0vLCj1a0RojRYKqw0xlSzqdMdKG9aMqIeheC+8MvQwyZv0wxMEdnv7cZDnOOykN4bhG/rO2SAgaNb1Hd5FvUcIJLVajUOHDtF1EiHyxJdffonGxkYaZSL7x8TE4MEHH8Trr79OlzKZjHqMehqrH/4UAcYBqKjqD58CPVav/hSz/tOzol37c6pwqriODtVcMKxju1c34+hPzs7ZvVlvmY5Gih7F+/EKtguJKHUAjgBUIEns3/k6EByAAUEDoFFomkWQTKJzX6tdIAVq6uCrMIPsFVsKvLDhezw/+X78uC/PkV7bU7QH2wu3QyEocF/ytcCmzxBdo0P/OhvqtHK3OVSHazOp/2iwPcU3IWoCsnayz6DS34KsAJaui6wvh1wQ2vyrW+qXRE78RC8QcTR5MYuS9B4ZRtNqOn81Nn59EkUZNVjxDvuudoXcZuCUGDos1xVyfyRdlzSiuZggg3qllKNoGYivy26nUR9S9k167fTTraPRirf7XosGw8fQCSJtQDgej0DcFe0+pgJW+CmKqcByFUfsGKod6wZ9PcwmI5QqNa2+JPdB2jvQ65T1SA3dh34l43BwTS4VSJ7GuEjPSePTcsqtafNLsvz+j21gXYEY1aUlHtN4fsEa+jpv/OE0Oz5bHRVHrvnMNR+/C5VvGWzmMlgaNzd/U8ktBQVM9c7bSabwa/7+oof9gVPiaSQayH8AMHT8NAQdZDMt/RuMqPbSID/QFzGl9aj0tSEp3wc1WhVEWFEYVobQmlhYFHKYZQKUNhFyETiRk4rj+z7AMIs//fy6v4j2cJz7ETvWZRBRvXYJ6ubN6PRWCN1OILWGbdu2Ydy4cVQcSUybNo2m1TIzM5GUdHYvyKZNm/DGG2/QCBVJzQ0aNIgKrpaiWuRPoraWuPXbP3J08MQleHJNb1Z6Koh4ZVYgolbt7TGRJPJF8O+1LCVwxeBI+Ok6sSjTagGOL2frA6/ptIeVKtgS/Tp4xIjFAqNjxAiPIHU00TJ2ostTOr8iD6jZ53loGBMnZqMV9VVGhwfJBDXMNhmUMhss9hRbf68CyAUWKYgrFbGjeCPGvTrAcZ/VehN+OMB8kAuSFyDG2IDqDC1i9/niWZLuERSoHqGGf2UmbGpvHAZ5PBmGJM5xCCRd7ld03SfMgCF+TCxF6stx/ehzi2i21C/JtUXA5MUpWPI8q+xzZdbt/ampm3DUw9T2NZ8fh8lobZaW2pFRjrI6I6LUShzKHONIiRGBs6nuHsSqD6I+SI2vTTsgSAZucgI7YXIIG3ZSJYLqQxp1SjO4t1QQbY2AyDxdMpsIm0xA8ZLvEHPTLQ7PnLGoEBFVIooCBEya0x/lXwLZRytQWaiHX4jnKNHqz49T3dE05Sb5hQos5mbNL0OMTBD5hYWjpqQYJRnOVCpJ4238ei+sFmc/IfZakMgOiXo1j/iYau19uigk0uJMlaYEeCHDQKrjmpvCs3bv8ChSEvVMHOVqojB+5AxA9jFtQqq0sKaQmWEBGJIagL5ZBtRo2HlYEGVIzNfQfcwKORpVSigNZHYh6SJvxIhf8mBQayG32mC1t30hR2TwDYS2jkQhW842tKeB/YIv8y8qKkJoqLtxTrpcXNy6jr29e/fGXXfdhS+++AJPPvkkFi1a1OK+r7zyCvz8/Bx/JGLV3hxcl4Wn7OKIYBMFPLU6GTtXMQNwd4eEkMe/ugE7Mlg4PMy3k2c5ZW8B9KWANhBIdP1t1rF0VgWbKScHoskEQaeDMrbzG6ZdbEQFMZ+XawTpoP1EMDx0OF3WlLHokcZLAaXNAMFiRfnVa3B8xnewGJmYUqmMUPtZ6HpgPeAv5kNQOlNSL236iQ711Sq0uHPwnTCbfVG01w+CfeYD6RNTtM8PZrMPslP/QK1cBo0IJMdOcHTzHmBvuFQTacU9kcx36WNuxPItJ+n/JPnfbCtECEWlBLSYOmqoc++4LKH1VjmEFBELTc95LY3wIOk1wvwwInZkzSe7i3HINVS4pcH6lo5BRG0iZEpAGM1SPAIsSNTsRJklCbsbbnJ/cBv7btKYLNCQruZEALz7LhvS2liOPjsK8MEHVjz7nY0uk4+mI2FwCN3v0LpcGOrZbZrhYTwJ8Qv9+cp+pP+QCf3PuRhodA+bhBvZfMrBM5jQLc3JQs7xMhRnVWPt5z/BUP0ZzPVLYaz5jKbUhkyPwVYfKyD3bMx2xwCl13zHuaTB3ABLI4keNSdjKYu6h9UYoNDObnZ9tKEQIWE+tGVEo1KOMl9nRJLcu8ascfMT+ehDoFKY6MVGFfvf2TPAHzP2RSOwXktfpEi5DKKGib4/Qi/F10FXUW+Z6wsqRfLaYmDvCHqkQCKQNJqny807pXomKirK0QeJ/E2e7N7h1hUioGpqahx/eXnuoeP2oEDl3SwcbBUFbMkQ8MLvJ2hlWHelaQiZ8MHGjPOamdRmjv7Mlv2vBOSdF7nqtAq2U8x/pCEjRpp89jntT1Qoi/Lk2yNI5XIlspVKGqUYEjqEbqsqZgLJP0wHRbh9YK1NgX4p/WGzB5zlGivkShFKb/b/G1smQuHDOnGTmVSKkNV07S/9/oJgbTBMleSGTVWFAFOVCYez2Umuv8KXet7o/ZdVIbxKpL/S9yRooDIWQUHNs8CNjaubzS8jZmSS0jvf0S+SV+lMnadJJGXmrf2b3bbpCI9GkxWrjxVDKQJheezk2pSG0PEINvg6Tlg6ky/G5FxB1wfMCcOMOYmwymshQoltdQ/iD+MbsFoFxA0MwnUPJWG68kMk535C9/cymqG2CySjXEZHWOw58ifuXGlzTLInS9W/v8DA4axZ5uk9xTi8gX3vxw0IxJUPD8W0m/t6fG5bNh5H9cZ9EGz1Dk/NzEYlfO33rbSZEWxmIjmm/2jIVTrYLBb88vq3+OmlP2DRu6TQ7KbpBu9G7Jab8VMgMUOfrYKVRIPkEORMNObV2+zbiLhxf9MqvZkALvHTwmZjos0VGUTUlRbDf8ECCNOnnX0qgSBAK2dixxIpUFFVKQQ6U2aCgFwSCfMLgFbugyFQYkJjBiyiHDq5EQtijuCOpD043q8Mark3QjWxUCu8EXTFuC7pNN4jv2nDwsJQVuZsNEUoLS11XNfekFQe6Znk+tfezJwph+Cmohl7d81G8Q9HMf3NzfjzaFGrBWBXz086n5lJbcZsAE7+xtYHLOicx+zkGWxSBZu6D69g68xS/0K1DrYbf8PBq9+nl5MCkuCnZieomlKnQFJFsmIAc0EhLFn2whJBhFzF/jHUfiziQnxISrtAUvgdgFxdCh+lL27ufzPdpoxs/itZtHfEPlzJGtoODnB+BvS7Wf+jjHBgsw+LUqjsYuy2xj8QDqdZ+0xDcJtCBBVJe7X0I8fTbLfJV4XBu3qPW2PWiEQ/j+dUIqQksfbz4WM0XbnYoEVNlRZyGGnSzJU1J6ZiVfFHuL5wHLyMfpiWdiPUVh0UYRaMn9UPSSHe8DMy0XeqcRT0dSJUChuGWneh5KpLYVt7DI1207jOZILGnioyqpT0tT11eJNDHEmQNJzCkEWfg9VUixNb91APUJ+xkTS6Fp0S0Oy5kWjPiR/+CYtL9IfeFwQ8OawXhmu0iDWU0UiK2ssfP//rNGwWJlIsjethqlviMYV2LI+FCceEk8HJzOKh9LoMSp9rPfSzZJ4j0dqk6aTYCJXPtVB6LYBMZU/zOqI/pPKSdbR2xQYB3xxnQi+YVM82M2E1v2y2W1/koRbotUqP/qJgWTzmxtyFR7z64Z/aUejlPQgD/EsQ510DvcaKIL8huCL2bkyJuA5XxNyNY6XZXTLPsc0CKTc3F2l2L0RXMXbsWOzYsYNWuUls3LgRwcHBSEzs7E4J7cOwoQNw14JHIQj2KdyCDVqFGafLffG/pfMxdocZ93yzHzd/sRfZ5R0/PuNc5ie5ci4G0XMmfS1grAV8o4DYsZ3zmE0q2Dp6lIZUwcb9R50D8aPIBTlMNjPKw/viQD3pCAwMC2Xl/QSpSSQRSMooSSAVwCoyAaVQ2xznBk2A1eFDkutyISjLoQ5hEaE7B98BHxVLOeh32D0hdkhkqPKBa6AMDsAhM2s3MCR+quP6hl1MIB2PE7Bfo0aDIDiiVdZ6GS2JJ1VTXl51LQ/BJYIma4tD2Ejp8us/3X3GFB2JEN340jgaTbnx2iL02z6edqymnatJB2sPQkpi+Zp1DrH2nyN3YFGjGSFGQC1rwPygp3Hj7RZMWOQelSWpN6+ca3DDgecQVdubpmGi+vnRRo41afmol7vvT4oPSz//0nES16tY1M3LaHFEkBRTLoEsNASHqo43ExpWAdgonqTVXETsSCmvtD0b3Z4bxDpYzbmwmotgaVjrIu5Y9IeIKkLlxmJMLQbm1rJUn9kUTK8TbWdvVHwyJxczs3dj1vcv0PslzyHL1IiMEQJ2DCinvYLo+0pq+HTTIIqeUqDE2G6BXBULucrzDy25mqSPJdEkw8bgS/DzaT0tvvFP6k1L96XXk4inqKo6p0gSRZQIcSjTsbRknU0DhDXPfJDI0HT1GEdDStItfkTwLPT1Zfvmy0PxQPFiOhCXXg8Z7iu6FgWFPWBY7bJly2iK6c0330RXcfPNN1Nf0KOPPooXXniBlvm/++67tMRfLm9qke8h+EXhgycG47a4IdhTk4gB/hn4SR+F9Uu/wfHSELz1x6VYXHoYu63ZmJlZgXsnJ2HekEgU1jRSgdIVJZASFqsImSDQX6qSOHp5/oDOOyapem3AfDpiobNwzGDrxAo2Ne+B1CmQ95OIpIL6AuTX5WN/yf7mAkmKIIW6CyRLP5Z6kWvsEWFBDvX0vwDHlqNvFfnRYERc/29RYaxBmC4M1/a5lu5GPGblH3/MbkP8TgYjfhktIGp8LAblbEeG3dMxqNcstr8oQr+HCaTilGBYhCrs1mowkHhVyKPUKZFtC8OYxCAYxFLPQ3D3f4bwjW/YTboyVE9/A0/+Hu5WcUXS5y31U6J+I1kF8P19LmYcm1vlnavpO/dkJQ6sykH1Rg16J4yAUdGIkXlzEGTyBSkMnOf1NEJUuUD/MQjKaR5Rd50qTyIROZvqUT/TgIrjOfT43QaqynzQqA2hQ3sJejUb4xJ9zQLkLV1K102+PjhecRzDDte5/cgj4uuT2XJUpG/FsEOuP0hFnNj0LYbOmoDwhChYjceoaGo5ss+M1a7DcEULi4TIFBF207UHmvRaSElbicjKOhT4sxL5wDo9bj31KV7oNRlpSXoUhBjg26BAndaM+xRAzb4AmFuYO0cfW05G3jS/XqEZSv/GzQ9G75EpKNlYgBP78vH8iuN4d0QgLd1XGgX8fcKtGFtwEpfnrULfgHBor1mA4AEDsMPkj18/exd9UIVasxqVfl6A2cUELorIiupLzxeuEJHkpSQpwQKEG0mDWffvcTnkiDB1foqtzd/qvXr1wrp1ng1f7cXw4cNpI0iLxQKbzQaNhoUgKyoq4OXlRQ3Zq1evxj333AN/f39qnCZ9k5566in0aIbdiGGJ0zCMjMYITMAQYy1kYZeh95JP8MupIfjf3sEYUxIO2WW78Z91qfSP4Npyvyt4deUpKo5GxPvjkRkpiO9MwWaoBVJXd3r1GiGjxu4/8utY/5GlqgoWewpZndw9Z7BdqGk2IpBSq1Jxuuq0W4NIckKUSvxJBEnuKpAqWIRAkTIGuOlO+r+sqTIDby1HSHEjBJuACns6aEzEGKhJkz0iuJYth6WoCIqQEPgvuBrlH36E0FqgqPI0jhSytFysoEKQjp0ozPn5bPSMUomIcdOA7KXYrtViuDc7rmpLFO0rVJ1bBR95cy8QHYK75S2XCIANfuv+hlDxbXo7CSKSSPEFafoqNTp0+/9uxYgfybgdmeyPvNIClB2wYHLm9Q5vilFuwIAZmQjZmw2EDwY0fvAPNTTrydQMYuAubYQQ1gCL4QRNU0nDUhXaqVDbZ36RLXp7FaKqlwYqfxblqy3Ix57jazHliD0qEmRDlUEHdbgRDaoADFjvKVovojA1B15+ard5ap4REDWmN4r3O6ugbZJAkodDoIKlafd/Ade/+CYsRgO8g4Kx9H9LUbNnDQoDnSIrL8gX/o1GPPPTJnw8R4bsvmZkBSkxOXwMLquORPauV5EdEozMQKcwia7zQWkAi/YLghftmO1sGcA6bhNRSS4ljx5O36+/zfLGn0eLcTi/Bj9FaEAs5eH6WpQrQzCq6Fd6LJaxU5G8YCFdH17TiL0qJvpKDcxXK4giRqcVQJQJ0Jot+E45DrZo9qPa+RkTcbfmQRj0WVDYYvGKoypReptFhEZ3bE87T7T55/bMmTOp3+fFF19EVlYW6uvr3f5MJs8mu7ZAOmBXV1fT+2toaKDr5I+II4lRo0bRLtokzUZmqb366qvNjNs9EvKF0msiXXqH9sWLj69D/L0P4vHR30KrsGJXbhgyv5mBgdlOI7LUcn9bWvsOOmwNe7Iq8cfRIirSXpg3EGMTgzs3mnXqD9KVDwjqDYQP6rzHdYkgdXwHbZZeI9Vrcm/3CeucjoM0YiT8mfUnjbZEekU6xqcY6s0wNljouc0vROueYrMLJHlYpON/WUkqXzUaKMw2hLsEDVZkrqBpLtfoUdAdd0A7ZIgjJVdYlYHDJQfo5cE+pCMyQ7+LjRfRDhyIsQmsyGRbeCKUCUxEq6pqMTncDIPZhpWHGtHLt5fjtuTk82zSdQh3aVZIt4usU3VTHl96GONeaSHt5hjxg7OO+CENCodfGu9Sls9QWlWIqbNX7MZNaDE917S6iUTFdMFKnK49YK/Ucqa3zI3r8e1kPU2VmRRyWlpObn9d2Uc4qWU/OKrKiyD+tAIqC5AR54VV0UnYnRSFLd4J6JvlT7c3R0BkcpzHeWpNUXhNx4QZAxypVppuE4mnR0DC9KF0UC4RJo7qZYjYMaACQoQvYvoPQkB4JA5HTMAW/4lNuneyDtRGpRx3rrTi7+Wh6J9jg//6oyh+9lkaNeuTn44pJ3MwOr2ALgdlHcKesGexM/IdDD/wOhSq/lD73Qal9zV0ScaLkNcz8JIwR/ViqI8G901lPwC/OVoBvb3/V1JNAfpVZNH18NkzHIcVgUo8qWXROanoKLaiBoGNRgTpDdCZLLjlwP9w2ORuCK8WjdhUp8UuWz9M15Amny6fJwEInJ8MhZ+zrU9n0WZF8f7772Pv3r34xz/+QbtS+/j4uP21RxSHdMQmUaOmfx6fwIUgis6Al9oXL925Eg13/4Q3xj6B+IB6FNdrsfqn6RixORyzU40YUlFPvxZu+Hw3Zvx7M95el4aMMmas60hsNpFW2BFI9KpvRPub18/KsaXO6FFndu126YHU8RVs0ogR3v+oM4nyZqJHmr8mRY8IheksbUOiCAqVHEr7r1tzYSEsZeyHisKl6kaQy2GNj3SIHrc0V12ee/Ro4TUOM35kBVBeU4RDBhZ1GBI13nHbht2sD5HXmNEYGT6SeuEKGkqwLpFFkq0NFnyYfRsWyjfiyx3ZqLaPTCEk+ydjfv+/NBM2oiBHjcbppyM/fOKDdLDYnNKjaWUc/VEX3OR/4AwjftSNPs2mtROfiTqbNYpE/HiPPievW4qwOeF72pCQHgds2JLwA3Ks6VDmsiHOrpBHOBanwr33yPHeZezkWq+1wCoHckJZxMtoMGLothJabXXanxT4uCfadvSvQHaclI5i9J+6mKbXjDo/D3ZqAQovaUiwHNNumU9nvUlCT4oe1SsCURnvi0EP6fDn0E34fXw1Vo0uxtIpBUiNqaOfCYLFasOW1DJUaAKaf78JAhpUSshEAT5fldH2BNf/5j43jwyCJcKELIlQzA2uwfBTqfCry4WqZglEmRfkyhi6PBSxHlsGPI0r4t0HH98yPh6BXipUGywo1ZHXArg8czvkENEYm4CoPi6+38oMpNUFuglVXZMKbJNChggba/OQW38aFpsJgTINxltNCIKAiQb2PAOu64Pg2wci/IlR8BrZNXMd25xiW7x4MSZMcG/A5UqkhyoMzvnPhnr1+iV4THs7Xvr4Wnye8z42ZMTh513EUDecNpW8fcoGrBttQFppvSP9RgTL3MERuHxgJGKD2t8wTXqXHC2ogbdagb/O6ILUj74cyGCGSQzsvOo16cSWVZPVSRVsfMRIVwokCUkg0UZ+37D3RF9tpJf7jgqj/jcSCTKm2ocKB7vPIdT26QvTqUwqkHb1daa5otVhKP/4cUf0SKZWQyB93bzVkNcbgcJqHA1n3srBCZc6/Ue7WQRJN2o0/Y4ghQKkqnLt3kN0qCc5zWSvCsYTI7/D5tgkVBmdZuDT1adRrlIjOGIwUOTshl008gmc3OIDtULARzeMQJ8IH2SW6rH4c/eTZrMxJo0uJ2aSMjxDuts3RE3FjWTCpc8HNvjp9xIDY7NCCyk9d3TTAZwK24XLGvZgQrE/vonR41SYEbuLRuAqVS2ONGl2SCRQjdaKRp2ASh/mP6r1YifrtCgrokoBm0wOjUnAiWgSmW0+jd4nIgybVIfw15kPovrLP2AzmzH80tHsNTye6kiOSSMxiKn5sdvm4chbm2A2NCAkiqXWJB/W5m9P49Q2IFsbiurcaswYFI8ivwy3yBhNfdqLPg7kVqPWYIG3bxBQ1FS/idDZx+C4Ih1PU/KDgITQBMw6nU8bSW7sswuZkafhZwhBjaYMenUNBhmM8F7zN6DfLIfArdSbUNXAMkMlugD0qi3ChELWSDJmrnvvpDohEGuLnP38yPJkZBDCa+qpSKNbEiYjTMNEfIxXb5QachGmjcciaJAKJdQQcAQWDInzQqR/589fc6XN4ZeIiAiMGTOmxb9Y3sSuQyBfgK/P/wzb7g/Ggl7Pu5XBkqaSn2yYiv8OisLrCwbhkuQQKGQCThbV4l+rTmPS6xsx771t+HRLJgqr26c3UYPJgn+tZieJe6ckIcSn88OftHM28TpEDgWCOrd6sXMr2HgEqStTbBKkQaQ0j8sV0hxQX2919EJqPMr8QvJAd4EU0N+eNitzngifHfssNKt3uEWPpFSUOomlxILLAb1MBh0EJAWyKGLD3r2wkkiVUgnt0CE0TUcEe2CtSPv5uA7eKNnni962Iw7RR0alELbmbwUa7fk+JTsRnShiJeTT+4VjSp9QKoASQr1oJMkVGlmSqlT1FaxJK8ErFLAagZzmA8YlDtaepJEfyTROlpsTfkClugYI6w/oSASiOYdLD2DKYRtGfW+EeVMpFn1bTy/vyd+K4LqTCK1xRs3Jt2Pg9GsxNfEe2mjSV89iAbVeTFAkFFkhs7HHr9OoUBTQvAEjeQ+mDryMrq9o+BORSey1Lzx0APpdu3F69S/08lGfflgWfgW+jLkBp337ISUhEFF9mAIuTD3puD8i8uorWbl+iToMB3OraMp2dAQTXBKPjnjUkcrdeJq9rqNTYjGwsMKtYoxUlKnsosPtuOkbJPVfEOB79dWwyoC4cuD2r4sg6BshhIfheLyMiqJCv3S6JESTynDJP2aH+M6khy2xvzcKu+fMZ5qzopJQVU+ShM0jXQa/UMiDUyD6xyO4z0LHjE5SyRaiiaWCf5jcG/PBhOxXMCKnohP76LXAOeeniIH6xIkTWLNmDY4ePdou3iPOmSHddt+8/EOkh49tPmMIAm68OxG+x2346v9GYe/T06lxe3xSEP0yIya7l/48iXGvbsDVH+7AF9uzUFrr3s22LXy0ORMltUbEBGppCLZLOLq003sfdXYFG41IpLNUnjzI/YTL6bwIkq/KF738erU4j4sYhaVeSLa6Oo8RJHUKi7KO0ofhv7P+i9VXr8aVcZej/ONP3KJHEl4DWMQqroQ94EBNOOQyOaqXLkXuTaxvEsxm1K5YQYetkigEGZPRtJ8PMTJrLexko0UUJkVPoutbctYB1fY23BMfYc85/0+6nDvImQkgIol8l7iKJFJB64geldlFgH8ckMIiXEgnZmnPLDu1jkaCvkxegu+9jPiqzzf08n/9fIE4Z3rNFSIAzSVldvFnP7mKAh2EmptxEHVp6RBlzgpmsseU4Sl4debt+O7S39DHygaXJ9uA4Bob7lgjOsTF/vgwWAQltDqtswmrKGJ8kAzzhi6kJvq0qjTIIpiISnvnLRy/83agLIcKsXz/Xoj1qoa/0uSo3o1MZinSwlSnmK4pK0FRGvuxU6wORXZFAyrqjQhQs7SVBBmILLHxFBNIM70NiCmvxuTsUqwaVYw1o/Lx+aV6PH2TjLaCcIVcjv/+e8R+9RWSNm5A+AvP4fcJTHgEZDARKZaU4s16Jv6k50voZbE084/1CnYK5FKti5AMCYG6r3uzzICIyGYDyuO9ByF6wj+hm/AIfC55stn15IdCqT3lprKPjQmFvPPaxLS3QCJzzPr370//Zs2aReeYkflnv/7KXO2cjhVJMwZ607SaOyJyqn1w6c1xmDsoA7VZ9bhuVCz+d9sY7H5qOl6Y1x+j4gNpBJr0tHhuxQmMfmU9rv1kJ77dlUP/UVsL8R58soUJhCdn94VG2QWtFapzgTySYhBYeX8n4/AfdXAFW/knn5BfI3Q9Z/EN9OTI6Rw25W1yrNeaarE8ffkZO0hLRm0JeaB7JERjr0C0FRZjmFcfGiWoWbaMRY9CQx3RIwl1PxbpibMHZ4YE9qFjMYqeedbNsEsuRzdqqXAgM8SanjDJ2U3Wn5WH5xX7wFdkxQw7ineD/qwNiAeG30z9R33FDPRXl2FyCutlI0E8htufmIqbxsbRywdzq+mAWUopE0iGgGSc8rZHQ9LWut2+IDUbe5atwbYdx7Exlw1UrTXGIE9pQ1XNKHr5Vx8vlEQO9PRW4EjZEY/ijwxCDSsn/486VHoxn2qgF4uCpe9lY1cGhccjwn6sSmsMvj5djoIAHxjsbRNIs0jBZsPcBTfh9vf+i+mREdTUHFd4An4KHWbGzaT77apkRvkarRo5wawKLrxGj5Xyv2OJ6iVs0zyARXL2mYlMZsIh99hh1FWU4+iGNfj8/ttgtffuG6SqdryOFWXHaeTvllMNdPnd8a/p6BMS7SeDv8nnbbCZiSbfxAQUBxtRGGLDiTgZMiNl+ORSGW0mSiA+o09nKyD2TYTX6FFQhofjVNUprO1ncfdLiSKiPliBgVYWJZV+4gVbbNgz4Bk3/1iEXSCT9i0RJFooUVaGmp/tEwzskG7XM+643yE0dUpfjAy+lDbKJDQVRxKhcmdhD/kcPyZoENIN+li3+QhKSkowd+5cOhz25MmTtNIsPT0df/nLX3DNNdfgtD0dwOk4gi71x19HrYDcLpLI8q7RWzGvXxrV378fTUS/Yb547Iq9MNQZafrrL2Pj8eNdY7HziWn4x+X9MDTWn37H7sqsxN9/OYZRL6/HXz7fTatTqu355pYgaTtSGUME1+wBXWOewzH7P2b8BMC3831vndFBm86Iev8D5wabjZ4MyXZOx0IiFs/vet5tG2msWK+qxoSFxGPBoANKF/eh6ZOmAkkR7N63Re7vD0U4+38hg4dtpHLto489Ro9cm4LGE1O3KCL28M8w/vEB/Ry4YbPBr6wRj458FJW+Aj6e7RpVEBF22zw0kn4B5HdFTRCe/qESNrMPGqxG7CPFL8SH5BWMNG82FPv+0MMef/SQE+Xjs/vAX6ek0Y/Vx4vdBNIXaVosXKOCRZQBFWlAVTb9MfXtM++g+oo58HnqQQT83zWYfIpFrWx69vwCDEEY3miARRDwVYMztePK4bLDKPNt3mOasGiLDYWl/vYqNSsmBbL7z9i/Bzab1T7olJm4fdRWGHVyWgHmqnRFQYDRz0JP8HETLqV+GWOFFcjchPIa9r5U1LO2KrVaFRVY9L0pq4a5VuaoACT9n4qLD+HAyW10W0NNNT6552as+fgdt4q3Adlr4WWpR1r6KcRvyaCz32YvV+GDDywYe8iEd3a9iq8OrIOgqMHQGH/Is9kPUp++AxzpN4JMFLE/bBpW//0jGjF67m/hWD8YdL6fxO6i3Qip9eBLstkgnmbvM3ntCa823oHr9iU366C+aGQsttzSD5flMN+bhKfvo4FTZ1KhufCZl3HtI68063nEXizn0ntiVHP3lwhYyntgim3lypXUa/TBBx+gT58+tPSedK9+6aWXsHDhQvzyC8vLcjqOmMQhMI97CsuG3oi3xvyHLi/V3Yln5X/B65d+gcERFWgwK/D6ipFIiTXju6c3Ob5Uw/00uHVCLyy/Zzy2PT4FT87ugwFRvvTX4Na0cjz+81GMfGkd/u/LvVh2IB91BqcJkPzTfLMz2zFY8u+X923xF0GnzV4bcHWXPLwUQepIgWTKzmneBMZmo7OjOB0LSVm5DkZ1rTgLiWEnR423Eje+PM4xvb2ZQApwT524ptmMp0/TX9+W4mIWPbqmeZpYFaKFVSbC20AaAwLvKvyR9un3zQ/WPopkcd/FtPv3xsEyWH98HzIdaQUiQKUsd/TsspmIT0oGi12cbNFpgYghtFrq2/oRdNsk46YWmw/pVArcOIZFkT7enEFP+sai4/TyaVs0auGFAyITkBv+WIK5zyzD0B8/ojO96KFCpGmxIWICtj16JZbcPgZrFihxew0TcEuz/kCVocqjQBqa0eQkLxNgUymQVExGfLD3JLjWgIASM9Q6HRUnRamnUVdZDovZRKMaN6lWIVOl9VgRllVuL4bozY7fWKtA1v6vsaOcfddkhVnoJHqbTEbFmK7RiMAGMr7DWaW1zEuDq365Bek/r/T4+jkeThThb66B/tgezF8juMyAY2nDzcdW4bu8p+CV9Coioo/AmMqmVwhJ8ShtYCHFN0vK8GtJI/KrZ2JXnYJGjHoljXSrvJQEEokskl5CTQ4CcvoZcVJpjmlxTJR/ZQk97tZ8HxGhSdoUNAb7N2vNYCWGkBudFWreE6I8+eOhCO665sfnLJBIxKilafZke509/87pOMgviEl3P4//3HIYO2Z/Rpd7n78aX12nxsiK1/F27C342+Q1CPUyIrfaG4tfnoxJSXk4unSz2xdfdIAOd16SiN/vn4hNf5uMv81MRp9wH5itIjacKsVffzyM4S+uwx1f76PddEn/k3/8yr4Mh8UGYFB0ayZLdwClp4CSo6BjvPvN6/SH76wKNkVkRIsnQ07HEusbS70Rbi+9vbqoopA1DwyN83Wbdu8qkGR+fhBUzPfhiiY5xWHkbsl7JFFacQQFQezMceN6K175wgZNtRzQqp0mXJmMTlonqRRyfKQzN0EMD4L3YCbGKg4dQq2phpqVbcZQus1ax1JAm3UaiOGDaCPIZY1DYIAKutpMoJiZul2RZqfNHqKFWiGjvsZdGRWQlTFhkSqydM0mu9/HcnotIuvLHeLINS02zJBII1JjE4MQWLoX4xoN6Cv3oYUP/zv5P7f9TVYTMoqO4+odTLCGPPww89ds2ADdmy8iN9AHmaHsu6jCR4d9mTGI78fSiGl7d6KqkLUP0PmRIb8ikuR6x2gOCXI5sQ+rnlMlsP9pq0GO4rQtEOzCotKPCBmnGGrQqFA3VAGljh1XsVyO54ID4d0gd6SUWoKYk6uVfgg9vqPZSZi8PmQAMdtPxLaqj9BwikXpcsNkrCeXTIuZDY0IopWVAq0mJj9yB4ey1/5Q2SHHa3eg5ACNLCpG17PQDL1jEREjahCncveh2ix+LY6JUsXHNZ9UcJbvo9zaRliaiKN/wYBclQyaRH/a24j8Bczv7RZVIpe7ou/ReQsk0uWaRIlIp2tXsrOz8c0332DECPYrhNOxzO89H0tuWYO/3fElXb444UW8/tg6lH7yFI73LcSNxQ/j/XFP4LqhR6CU2bA1Kw7DF03E7eN3oeaIe5iUQLpf3ze1N1Y9NAnr/joJD07rjcQQL5gsNqw5UYIle8gvauf+h/KqWhxk2Wm9j5KmtVjxciFUsJmzmAhz4HIy5HT8jxBSYSaJJKnijGyvyLcP76Sl4U6kXkgERRP/kYTa3suq5tdfzxg9IuQqlDDYzSHjTpEZYkCxH6D/8HEkbVhvFwnr6aR1iRD7HKyyhjJoxzEzdm0W87uI5kBAZBEDrT4KSlFEvlKJLO9A/Ha4EPXQIc1vnHsBhB066HYpm5127aq5GDWIRVC/37QPSlM1rKKADJFF0jbb2El6nOw4Sr0DaPm7K8QnM3QYG5dCydlG97g9jpWMf3fqO9SbnBVpJytPYtpeE/z15DWORtAtNzv8NTrocMw1XUYaKEYFI8yPGeQz9u5CVTETSP4RUfQ4E2SNCI3PdZtflhurgTaCeaFIM1ZFBPtxEl1qcOT1dI1ymOUuERdBwHZrHOrMTAjnKhWwCQJqdZZmAozsK/lyyHLa7ffiseJlGLnfWeXm+voUBzhfM68GK0R7b61DXswDNLiWXfbOXosbVJvRYLLS3ndDQ4fS7UdKj1AhRSJvBqsBweoAJMXrkTS3BLFTyunSJ8GAXkZnFZxoU0EmqlscE6UMD6ffP57EeUvEFDZCCQGZsOJ+6LEA9VglWJoJMNLniESTurrv0XkLJDIodv78+Rg8eDCmTp1KvUeku3ZKSgqGDRuGK664omOOlNMM8mVNGsRJOWmlXIkFQ/6CWz/bjvSXb4S/YS0eM9+K/1z6PibEF8Fsk+GznWPRe9wQvHP9EtjsofGmJIX64OEZyVj310vw5wMTMW9wc48PEUuewrAdDomASV/enTxapGkFG6lq6sgKtrp1rBLI78p5Hk+GnI7/EUIqzaSKM3KZUFHITt5BUcz4LKEMY72QCIoWKg419hQbrNYzRo8I0bIY9G7S/5B4SSJDB9CTkiQSXAnVsQhRSUMJdBOZuVgok9PJ9H2CetPoAKEfijCykUUPNpQdwupjzEeiHrLQ6fGzp+VJ5Ij4rxxl+aINRwyfQa6sgS1zC92WJ4bAaC/RPo14NCgD4S0Y0MurGN/0ZcdBILLhqzlemDTS3n2ZtBkoZm0Rpg2+jf5P1Znq8GPqj47bHMvajXm72GMH33evW2ROr2k+LZ5c9ktKhFypRHVJkcOsHd6rN/YP+if1SN2kzcWVyQdQnyDg9/gpWCH/PzoEnPzo25FRjooQFg3zrpJhUWUgaxXQoGj2WKR6uLr3YpBBcrFmCzUYN2it2Dmw0iGSiA1h5h33O3w5ZNkvJgyj9h320IEc+Gy2nEZ8JGLL2P1YIoKwo5z9uE2wV40Tz+lzsk8Rjgos3Z8PX1kMLeSpM9fR76nf7GOYApUpeMJ8K2RawCvMRKNeq6wjMchWCa39fdYpfPDLgwPOOLLKf8GCFsV5U0j6VX6ECbrlMOMgrKgU0KIAIxEjKarUXTgnm/hnn32GP//8k1axkZQbqWD7/vvv8dtvv13wna17AqQs9aqrHsfYVdtRMn8wJmZ/gNdCbsE/ZvyKOH89yvQaPLjkOgwbHowtz/6bmik9Qf6x+0X64ok5fZr1QWkpDNvhFBwAqrJY35YU9yZlne4/8uu49JpotaJuwwa67jt3rseTIafzf4SQL30pgtRUIAlKJeR2Y7bgMhbJlYYDrBLKwRmGa/uVNjRL1JD0CzFkt4QkkEgEicztk2nkkJsFxJcAl8QPxLYnplDfz4P99JjUyO7ni4MrUWe0IMRbjaTx8wG1LxlSBuz5GKgpcPixSIUVGWdBluTyNcFb8LbyfXofcUIpXo47QO976xPToLOLosmyI0j1d55wS/0A1VWznOnLHCJeRCAoCTLfCNw64Fa6+bcdX6B6xzZqAFZ+uZz6sBrD/eE3d677E44PbeZxIZcVvaMRN4hFU3KOHHSUoI+6+iGkXrcd15r+jr+YX8MX4l3IEVi68enlx6iNgIxTWdfAvtuMNQo83ZiKJdN+wPDEuc28WUSg+M9+DBhyPcKtVgwW2O2iK2sx1T7mY/KJHMRU1jp8OWRZsf13j+0c/ftboLn0QSrI6HMhEa8yJggP+FRiXwUzX38Q4I9l9rFDcrDxMJ9sycSkf21BmIqJ8Lv/fBbLM3+g66frdmG5tzfGG9/GB2b2Gk6SH8EwVQEC7GK90VaBv6yZR6OFZ0LZgjhviimrFpayRggqGR7961j62SCfv66aGXoutFnNrF+/nqbYSNTo3XffxfLly6lh+6qrruqYI+ScM146P8x67jPELP0BsnATrs19Eu8OfQS3jdkDndKKw0VhmPz8w7hmUiUKv3oeqHefj+OpzJNAli39Cui09FrKHEDl1aURpI70HzUePkJnesl8fOA1khkvOV1PXaUBJoMVMrlAh9S6QlowWO1DhfWbNzdryUBO9sXPuVfGlbzwQotViefi+QjR2lNsjWU0laNLZmm/vnki/bxKvp9xujxMamACqUZMBWSNKK834qfDZUCIvbfNqieAtwYgNncvbchIKq3IOAuynHZYxIM1Pzl+OJGvhoXF/0aCupp9LySR+WLA/4Vn4OmRgW4RsImhLp2ypYaS9v5HcxLm4KqTPnjpP+Uo+r/bkT55CgZsYD/gNCU1qFm+3O35livqkRfqFIx0ltnASlQo9UgaOcZtX/9wFgnv16cfrrpqEcoEu5gVWOPLzHK9w0aQ48O8XIYGHwjmBgysOYln5jyK5OIyh0giQixocgx8yMy94bdQmVZirnE069SZ7GM+TGYUPvOM83021MIrl0TImhvhZZZGbN2ohj79CTTk3E6XYals0HCOS+cFUnVH/E7E90QiYtk2drzk+NNKWMuWEstR18wj1BHLUKJQ4HXrIhyyJcBHaES5aEShwhkFJ8KXRAtJ1PB8qd/Dwp+6IaGIDPWmn7suOWd0pkA6deoUFUmcnkNA30EY/cs6+D/1COIrd+D+urvwzsw3MDsli4aIlx4bhj53Pol/XrkGptUvAwb3eT4EovqlX59d9ivAZnWW93fyaBFXpIqgjpzBVr+B/Y95X3KJR7Mvp2uoLGAG7YBwL8gVzq9PR3+iM5RA06pEDyX6LVUlnovnwzXFRtCOYOK6T56IJNeIZ9FhxFis0Bh9IQg2qAK3AooavLNsM8R8NuONItqgXvYMPeE7K62AO1ZaEFzv/lzERqB89e/sOSeSDssClOUnEFvovD9y25EWlw7l2duc7ToIpRVY9GuVW78jh3dXFN2Fht1Mb7MH4U7F1NJZZhmxDdQbmDh8NDVDO15Pjdbj99mOJ6biX1e7D7rOlQRSjf1/7/gy1DRUIam0zjEAViPm4t+6HUxMRAxCftQQFCkUiKpiz9MVwSai+OAGIGMT8P1i+Ig5kNvN3fS1s4slS6Mcw4VTEC1+sDYk0mV8DXsvc0PdI07E75SrUuEpy60oBkvpkrYACm/PrXaI4VuuLocIGV603MTuU9k8bShVa54PpqJ6NB5hvZu8RvXcyHebBRIp8d+yZQvtpM3pOZBfk5E33oo+K1fDa9wwjEv/Es963YYX53yHfqHVqDMq8dz6G9Dv+nvw6x0vADveBczuFQ7Sr88u+xVAvkzrSwCNP5A4rUsOwbWCLcG/+bTy9oCkcerWrvPYyp/TtZQXSOk19+hla8TPuUSE2uL5aJpiIxjHsshMn3wRcVJzJGMdUM7Kxo1mdmJVh2ygJeXe/lvcxhgRtlm8mp/wRQHGOmfkoTpDh/TfwiB7/SOkT52G6pUbAXtqLf0w88FIHNjzG1shP8Skajl7BKn41MHmncCbCo3TztlxJPXZ28aiZPlhBhh0osNMr/P1g1+Y8+T8/T/+Rhs2evo+G9872M1GIAkksd4Iq1EAUtcg/8Q6twGwIbVWGrHKK2Jp0929mBhV+bFu1k2N1/v3PIY9Py1Ecd52WoFrEthw7w/nyPDppCRHa4FRMmf3bZloQ2wdE0h57r07aQ8kvwkvYKltinObqtxRddcUkq775NpZVBS+fw9LsxHfFLkft/t1mQXXGiw1RhgyqumSoN9bjNK3D7JheOTHQxH7UXFRCCSdTgelUkkH1v7nP//Bt99+6/Z3oGmOndOtUEZEIOHjTxH17zfhp2rAVRkv4I2+9+P+SZsQqDUho9IfV37zBmbcNAup/1gEHPgasHYTMXz0J7Ykpf2KromqFNQXdHgFmykzE6acHOpp8Zo4sUMeg3NuVBR49h+1RvycS0RIul1rPWiuVWyEnFgvmBSAXwMg7GMneGaKFlHoGwGbl9N/SE6shWG7UaRwVmqRU+eySG2zEz6JeOT1u5Kmd8wNMhTtJZ2lBfeGpoX5NAWUb2L/q0a7ntq+40cWdTn1J5vT4hft6NxcHOihE3gToVHiUuFFGkHaKtl78uTsF93M9KSDtdQgkh6zKGLtp+/R7WezEZhUWpiC2GtpRC86Xy4y1X1gb0gN6ewtIsYeLNgjZ4qgH+rw00TXQbzAJ7Nl+EecP26NCMOsmEj8olRDrmfCYWcfAV7jmbgy1SoxAk6BFKWvhMZqhqBS4k4LiazZ+0mJIp6tqEbKgDluxw1TsMO/5PZ+iQIuj7wfU3unUFEYZma97Ihv6tnySuf9wlmt2RqIGCp+dQ/KPz1Kl3Wb81C1jIlvCXJZEk89DcW5jBnJzyfTgIHXXnut2fX33HMPrWbjdF+I+dp3zhzoxo5F6b9eh7B8OW6XH8XgGfOwKnsRlh/ti3XpyRj05jLcsXklXrl6Crzm/A2IGs6GGAYmurWi7xQsRuDkb11avUbIrM7s8Ao2qXpNN3YM5N7uJ2JO11JhT7E1q2Czix+aZiORpBbED4kAeU2YQCNLRDy1t/E+VMsiSKSKqcHcgAx9DrSRQP9coGHHJqhn3wsUsQhMflhvCJYmBRqCiPxJDyFi47/p0NIjGg32BauwJ9mCMS6ZG5sC6DPvYVTInqBpNRk+ah49q5MjN1BAIOsBiROxAoZmiogstyFv/2cI3/AGu6Imn/0QG3YjbYK7NlHAiHSpBJ8hs4sjUuH1RCJrI0CoLSuj4ztIxdqEftMgc5nHVlVEyvubGLhpV+1CapRuCkm7TUoOodW5pADFXP4L9FvLYNQOgc6WiYBDq1ALNRWcKgtpSgk8W16N8IjhVHztLt1P72dqYyMqNeRxWZSx2B/YOEhwpLJIauxzmT/+BRvqdHIY1AKqfMNpKp3MXkxsLMato3wxfUQ/RB7egYZ1gNrfivkNeozLMyJPKUeMxYbwOf+m38OLRsLtuN/ercfvhe9SwUt0T1/tXPzjkjvoyBUH5DucpB9FG+bX62kfqjyVCjE3rUJ4OBuq3BJE7JAu14JCxsSQ9BKLQM1KDwU/9q7Y3ak6rbW0+Rv+7rvvpn+cng/p9Bv5ysvwvfwyFD/7T4w7/SMGazdh+JU3YtneudibH4p3d12On45PxYvbXkdK7Fs4UDEGw0P2YPyNN9EvtE4jfR0LyftEAHH2Xi0XaAftOrv/yGcaM7pyugcWsxXVJQ0eBVJbxA/Z3lEVid4qb+gUOjRYGqhRmxQUKKIF9M8V0XgsFbS3dxEpLwdiw4ZCVujeMZyUqccMvw0YfAv9MfRT9nIgdy2iZSQdVIvcvmbISpSIrhRQ/vVyhP/9aQTMmI/01z9yq8kSZQJUvjbEmESU2gXSkV5MIEVVAjFb3nIXLyseomnzcL8o9BdJD6JCLB8jYM1wJnjCqmwoDZTj/ln/dItuVBYwr0xARJSbOHIdnOo64oNYDSSztidIJEmyEJQkJkK/dSuMxTVAKGCtJ5EqNRS+FtiqFFBagTEDH6AiJaMqHZWGSmhsNgw2GFFXpgBLjAHh9TLan9E1sEPM6oQKf3LMNpTVaiCLi4c1LZWm2W6NL0Vk4kSU/ZEF8olTe9cBXiEIv3EFwhvK2TDZJvPSpOMmA3qvL56BAwXpGBaV5C6MJMht577NXnfRinAbED7jX8BZxJF+b7G7KGoN3aQrdqcIpK+++grl5eV45BE2/ZnT8/EePx4Jv/2KsnfeBb7+Glf8f3vnAd5U3YXxN0n3nnSwWkqh7L2RPUQREEVRERWV8YmIIiIqAoqKe6CoKKjgBEWWKHvvvQq0zEIXdO+R8T3nf5s0SVNIaTPant/zXJLcrJubkvveM94T/RHaRW7G1uZj8fO+PkjIdsMzq6kA9U3x106Dcl84vwyf/B5vvUiS1vuIRosY/RDapIPNQi3+xck3UHBCqsvw6NvHIu/B3BnpiXnQqDVwdneAu4+T1cWPuVAd0pWsK2IkBQl6TX06MmuQF5cn1R8lSBGk4PrdMbthW8njqEQkOSlKPpd3XWS5emLDnpdEcXTda1IruHzUg1gcuxazf1Mj/bff4PvIaCSfOybEER0ztZeLB8oxfeRbCPz7DWSopEjQyTBJIYSlKRBEQ1sNFJVKCLLiAge4XkwQ0ZZBMxZgXAOpg4uKhimlbZz60Qokv1C9wm+jwamUVqPIEYmjgc9ONhk9MoVzpFQXVHTmuCSQCuW6eW6JXi7wylRiZ3Y+RlP9UZKUfmtfUAhKUBbllB5aZUo1ArMVwuJAS5Dk3YnkkmEE11MViPcORjBIIDkiNJOsCR5AwWnpu3LxUQKDPgSCSjoMbwOJIpPCSB86waVaTpEVMBRc5UWO0u9AHNmLK7ZVapCKi4tFJxtTs5C7uSHo1RkI++N3uDRtigYJx/H4tVcw7953MaqNVLOg/UVTa2T4YsPj2LOmdNq5RSnMAc7/a9PZa9bqYMvZJnkfubZpA8c6UrqEsQ90BpGhHrabQWgG2jokEkgk6GPqUnoHKM51QPHhdUBKSa4spI3ODHPRwEVo6tMUhapCvLH7DSGY1l5cK1yYexTUhywnFzI3NzQc+CTOhMlxtKmDMLtMfv99ZKyRUt9b2wBp7tKvRJ6TBtcadkZxwxHivgwPoG+PMcL3SV6khDLP6CRHphAH6ZwdO8RN19at0bFZfyGIjL2o9ElLkMo9/OqargfUH5xKl3TbXJwjInReSISqSDpcKpxUcKgjFbefPL1VSq8lSgKpc4Fk4EjpRX2m3yCXak0ZgZTgLc26TEx1xF6lVLRdRO93da/03ieltJ1z0yigdYmJZ1VCoij8LrNOdJU0PNaUOLrFfwXf0VF244ptFYFE/kdUh5SYaGTxytQIXFu1QvifKxA4dSocHOToeuxPdHen4k6jcQEaGfavvwZc3mX5jTq/nvpfpbx5qGT+ZgusMYNNW3/kMcA2XXpM+egMIuvZd12YtpPtdMpp5BTnQOniCOcQqR4mb90SqTDaIwjwksZp+GcDrePk+LDZDOHCTNGQhccXYumZpeL++3OjxKVbu3YI948QDQo/9tEADg7I3bkLjjsPi/s3tldgSzvpd6L3KY2I+OQ5S52eKV7Agy0ehlOYFNWgNJKBOLrvM3GQztm+o0LR01KBVDaCpEXfoLEiODWWToKUBQqoimS6CJLCGQgMlyI5suQUHEk+gsNJ0j7o0uk5Ef0qKunwk7tJs/q6XEnEhvgbWNzrU3QI6oDADElp3PCWUT4SGpUbzjj5lwqyxBNQHfoVxRmS4HJ+dH5Zx3Ar40BpMhNDZQP/1xa+j0SZvM85TBJ91ZUKp9goeuTg4IAmTZqIUSOBgYa9h4MHD8aoUbYromUqD3VPBUycAM9Bg5D05puofzFWpNUocqTP0h1P4sFv+qDhsP8B3Z+3zH/gzHjgwLel3kc2/JE4ceOE6GBzkDmgnmf5P8h3iio7G7kHpDNRrj+yP7RDagNM1B/ZE9pC7X0J+3ReQe4t3VGYcAx5p87Dm8ZlhkiFzukr/hT/x0U1r1yOd/43FC95rse3J0v+z5FYOXNVXLp16ijEEZ0cnFOfQ0GbxnA5ck48lw73YUlq7Ggpx6jdKrS6ooE6+SbiMvNBEiHHAwhz9EF8WEMUXbyIIhJII8YBUffq0jvqggLk7pO22aOPeQIpNf56uSm2ykINEg7BwWJmXmGWc2kEqfVguPg3RS62i062Dw59IIriPR09EdV9GjT+bVH8+wvise69+iD7v/9Eyi04vBeCwwegjl9jxM67R9x/w4fq4l0gc8jWmVMWZjtCo1KicCmVsdDoDRc4REpz4myJg7cz3NrVQd7RGwbpM+f6nmJBkao0BVfNU2t3HEEqKioSc9juvfdeuLq6ilEj+gvdz9QMnBuFo8HSn9DpsQ6Y1Gs/FCX+GiSWnBRqnEwMRu/vDmLFn/8AK54Ebp4HLu+URE1VQJ0tn7UE4qWzM/IOsRVkv//Ef5K5mlKjxJqLJR11VQgVhKK4GE6NGol9z9hnBMnPyAPJXlNs2nQwCRrX7r3F9fySsRUIaYuCi5eQNGtW6fgMtRr1Fq4TTtA6NBrIjksDVd1KHN2b+DYRj3E+WtrWRqct4//TYFjUSFwJdxMHltULpyHputT16eymhCz+CJycpNlchfneQP9ZBumdvAMHoMnPF6JEO9T3VuRlZaIgW6p29gu1TC2kc0kUqbDT21CFSJYbiqjecAyVCr0DMqVhukSLgBais7XYubGoyJYp1HCLalCacispD2jo1RAhmdKh94aPDBp5nvCgSgm9jGKZAhqlDMW5ChSml2xDQ/tJUSl8pYiYSzPfMkNl7XXgrFUjSEOHDhULUzugwkb/ji1w/5/fosEjmcjKdoKXZzGQk4bPto3A1XQvPPvNWuzNnYEpMd1x00GBBtSC2n8uEDUUKM4DivKkS+1SZMb1/AxA39GX2P6emHlkbYsB7bBO/ZlPdLt7aHez/UIqkl5jc0j7Iz+7CHlZRUIJ+JWkq+w9xaaF6uXcyDtszmcozHQUxofFmU64Nm5c2Ser1QhOl+uGpYakAT55gMbRES6tWukE0sV0jSjeNp4T110dDv/HJqJw3idovO8argfGg5JqHq5KIPpvOGdRhMgNRfKwMqOCsrdLNY0efXqbVeOlTa95BdaBo7N04K5qqA4pd/duFManQFUsnaApfHyg8JYqroOzS2MMVIdEJ1KDEqVUnpOHCk750uy04hwnaTwSnWDdvAlFsUr4PVHqkaCWfMe6q5Dk6Y36WWkiwlaYIb2fS/EZ6aTTSr972jZ+hwDXMhEgVYmfkVN9L5PRIVpX3aNG+lhuFDlTYyATvNAbB+CXfhb5roFwvXoTTkVZCBicis93P4qTSX74cvHHONevL/xCLiM97Aie2fMORm54rWo3pKTTxdoCSTus05Qdf1UJJHVRka5A1bM/1x/Zq0Gkd4ArnFwcqpVAogiSQ51gOPnIUJShQfxeX+SuXlzW7pmQy0U7vbYat/k16dKxdXPIS0beNPVriiW+kqGjvus1+RQFRrZG/ZCmOPfhAtRLLYZPrvT/5s9gN+TF/o0h7pRhcENhcrbB21Khs67+yMz02q062KoKXSfbhYtQZWToBJJjqFS/5UstehqFSP3TCRSdOLUvGi/uc/JUwimBhtL6oyjXARpHNxFpK74uRdhJHKkUpd8BiaRUX2fUz5JqtAoypL8zZ+8iq/3uGbTxy6Q0mX4kSCuQFDVIBFVpio2Ii4vD6NGj0aBBA7z++uti3alTpzB//vyq3j7GDtCa4LkUZ8E3I1ZcKtxc0fXUV5jd8X0ManIVSrUc/20ehl+XvYAN837Cqs3fIMnRBXDzB7zrAwFNRVhfjBRoPBBoNgxo8wjQ8Wmg22Sg9wxgwBxgyIfA8K+Ae8hETmay08XahHqU9U2pqB3/7cg7cBDq3FwoAgPg0tpwLhRjvwaR9oh2YK0W0XGZGQ+FgzQ6KDfZRYgjJ+9i1HlxkoEDuPcDDwivIfr7JpqXjOTy6VLqPUYRJIowLRqi0D2XxNF3QxSo26i1qN1x6Sel9DxKphWleEnDVTN8JEVFg5i1goMojImBMjERMhcXuHc1HDJbHmkWrD/S4qTtZLtwoVQgeXuLiQSEWxHgXmB44pR5WvKZUjir4OhaKMw3NUoNlCWDjItLtvsmFWgbuV1f9pBSchQ9omgf4eyrtsrvXpk2fk1ZF+zaJpAqfCqUn58virO7deuGHj16oLBQ2mEtWrTA448/jhEjRiAqSup6YGoOxiZ4VJtw/fkpaHZ6DcaEKLAp5h0x+JagYu5fNt4Hpz5PYuLYUaJr447aoh2cdUZm+p0u1ubXc78a3KaDR0Xs+M0he0vJ7LV+/UVak6keM9jsPYJENTFUpF18eD3yUwy9myiN49UuDF5bt+DG558j6+9VKLpwASMj3xLp42tZcfBcMh0a3NDVHxF+Ln5ChG1tcxPjnv4CuJ6EKTHvwikkBI4K6aCe0a8d3P7dXHpglWuglslx3U0BHzeVaPMvvHQZbu2lrtScbVJ6zb1bN8hdzEuX3a7FvyprkIS4UUit+wpfH8hdXSHz9YEmPUM4aueW+CD2P6GB039SZ2/GRXe4+inh6K5CcY6D+O2kk82ia5LqrNukHeSy00JU0W/KmMbT8NBjvsh77QByk52hLpYLceX8yPtW+d0z2cavMXTBVmVKNcYK79oxQLvCv8SbNm1CaGgoli1bho4dO5a+kFyOPn36YE2JJwZT89CfCUVnUA1/+RneD4xEamEdnTjSQiJpy4evYeoHv4ji5p3Xdxo42poFGZlNPQU8sU66tKZzdwn/XfkPy6KXietzus3BksFLDOY9VQVkYpezdZu4zvVH9klaOTPY7BEye/Rykopb6nnUE51nUtu58UA1GYpyFOL/c9BLLwGOjsg/dgz5Z84I8d9GVRea5BuinZ98ufShKBIR45iK+EgfEVEKdS+NtIb2HowcvSDD/B/V6H9chfrFSjh7SrPLii5LBdxEjq7+yHxzVF2K7RYt/pVF4ekJhyCpu4x8n8Q6H8nd0bnkfetkSfs1IFuG8f/qp+JlSDzsDQe3ks97XoosaVNskS16it8S7W/K9B5jEdxasg9Q5ktizDmiEWSdn4It2/gdSlyw1QVKaApVtSqCVGGBdPXqVbQqKdYzjgrQINusrBIPdabGI3d2Rsi8eWjXlyZhlz31uJLmjT2fforzU2fh5R8XYtTaUUJwqNTSf7KqNjKzxNy12XvIQRx4quVTeKDJA+Ua1lWGgtOnxRkqmXW6mZleYKyHWq3RtfhXB4FEhcJZRdLvMDlq022nFh3KWmTQOJDmHcRVh8BAeA2STBTTf5UipnmHD4lL1xYtxN+mPk38JIF0Pu28GOBM6FtfBOQp4K43n5Rqlcb/p4Z/tgZO3tL//8KLkkBSpqUh/8QJXYG2ORQXFSLz5g2Lp9j0o0gCBwfI3aUoojbN9mb4JCFylrZ8v0zhOolQhaO0rjjmjHRZEkFyrFevjAmmU4MG4j10792sJawFRYmo5kgfmYsD5K4OBuk1uZsD5E62m2Zg1wIpLCwMR44cKSOQyGF73bp1nF6rZdDfQMdhkXip01qdDQBdPtt1L4a3iBHC6WBMJI6++Stuvv0yZqz6CMNXD8ffsX+jWCW5yNojNOjzxe0viplW9AM2pd0Ui72XtnvNvXcvXSEsYz9k3cyHqlgNByc5vALte6aUtuNSH7qd6gmEvP1Wab2RGKb7lsFYFN/HHhOXWev+EfU2eYclew23zqXpNeMIUmx6rE4g1fUoPYkpunK1bDBCRKyc4NRDctcuuiQJpJwdO0XK3rl5MzhqozW3IYMG0Wo0cHH3gJt3ybwOC+HcuNQUluqPtMc9bau/a0qOJHKi2pUVoTINXHyl37miFElkF5XUIDmaiHzRwFpqitHi0lTaz9bCrX3p/pe5KqDJVyJ7uyToVBm1q/7ojmqQ7r77bsyYMQPPPvssFAoF8vLysGLFCnz22WciejRyZNWlHpjqAf2HHpc9Dr3arcAlp/ZoVHQUEemHkeLfAncNH4Y1JwZg5+VQ7DzcFe4n/0NAr/V488F5+Or4VyIyQ+kqcvC1FygVOHvvbFzKvCRqLT7o9YGo5bAU2Vt4OK09k6L1Pwpxh1xuvyNGbtdx2ek2w3Rd27WFc7NmKDx7Fhl/rUTeISmC5KZXSqGlqa/kUxSTHqOrO9IXSOIgT2JMrbctcjmcpm4A0gqBHzaiUCuQStJrnhVIr6Vqh9TWrWfxsS9aR2399BrhWFcSSMUJCdLt4GDJWFI7ZUKmQUjHTDi4SSeORYk3oSkqgjJJGmPrVN905Ms5orHomhPvF2jdcUPq3JKTVupguz8Sab+eQ/bO63DvEKRXf1R7BFKFI0iOjo6iDunGjRv4/vvvRS3Sww8/LNZv3rxZpNmqEwkJCULcpaZKBmbMnXe5Nc4/ikHpi8Sl76OPIKypF+4+9z5mhs/G3Hv+RougDOQWOWDr5mG48fIOqP8ahff2fYC7/7ob35/6HtlFhq2/toKKsikVSI7ZH/f5GAGuFRtRUBEKL18WzsJU/+HRu5fF3oepfIu/vY8YIaggW9uBZqrjUr+O0BgSGn6PPSqup/7wA4qvxomIiGv79mUeG+YdJmqbaJTJyZsny3R7an8TDCNWc+HYpC2cSkxQi69fhyonV/gMVbz+yPIdbPqCRYvW/0g/gqQVSMXx8ZI4kslQ98sFaLz6d/i8tRyOk1eL+4vi4qTH0uBcFxcoAkz/rmhKGp+IxJkzkfFnyaBuK6DKlkSQ3MMRrq0C4NzYh5xxkfHPZV03W20p0Cbu6LS4bt26WL16NXJzc5GUlAQ/Pz/4+vqiuqFWqzF16lTs27cPAwYMgL+/NAuHqXyXm/YHmARAwO9/oN7az9Giw37sLxiI3w73QHyWK278MQERWx+CatQn+Lzgcyw+tRiPRD2Cx5o9Bn9X23wXx28cx0eHyGIAmNZxGtrVsezst5yt0nBa906dREEoY8cCqRrUH1EtC3VYUlpN2x1VkY5Lr3vvRfKHH0GVkiJuOzWOMPl3qRs5knZOjN/RFoSb85tA9U5yT0+os7ORufIvyd4iIAAuLc2vt9F2sPlbsIPNVIqNhE15Ail7s9S159ahA7wGDNA9zommS8jlwiU87/hx6bn16pqMfBUnJen80ARqNRLfnC32oylRaymBpPB0Etvnc18jJH9+FAXRqVDeyJPu4wiSebi7uyMiIqJaiiPinXfeEalCFkZVg6mzU+fwcATNfBXNt/yL/uO64MmA3/Bev08wvtt+eDkX4+JNX+xZ+Dac5q6H+mwUvjv1nYgozT84X9RT0HIw8aC4tDQp+SmYtn2aGCUyOGywEGqWhH4MM/5eJa7zcFr7pToJJIJS1vrdURXpuKT2dRpYrYVSPeVFMLR1SARFW40NKsv7TaADrzaKlPbjT+KSoqcVsbewRgebluyNG3XX8/bu1e0PrUAiTyeaI5e9qcSqY9DAMnVF2sfm7t0rLp3K2W6q3dKNftGiVguRaQ3UegKJcAxyh0e30FIbADGrs/bYkNilJaxSqcSqVavwxx9/oF69evj000/LPIZqnxYsWIDDhw+LCNa4cePQpUsX3f1r167FRUpdGNGuXTv07t0bu3btErUmAwca/jEzloF+eH0eGCmWRqdOo+2yf9Cu3lFsj+mNlaea4ejl+pDNW4I+rc8gfcwM/KL6Bb+d+01XT6E9E67K9np9lGolZuycgRv5NxDuHY653edatLaBfmTpzFBbo0Fnl4z9UVSgRFZKQbXxQNJCEaM76bYk0a49iAs0mnIjGPoCid5LITe/s8m5UQQKTpzURV8qkl4jW4z0hHirpNhof4j/p3po9we1/1N3nzovDwVnziDv6NFynfCpO41Sirl79+k62ExRbu0Wec9ZARWN06G3LBFIhNfAhsg9nKxr8c9cfxlyF4caMWut2gkk6oajqBR5LGVnZ+Py5ctlHqNSqURKjEwrp0yZgtOnT6Nnz55Yv369TvBQjdSVK1fKPLdhw4ZCXE2aNEmIKqo/unnzJn7++We89NJLqFOn6oriaDvp8zClUK2aa6uWaPVBSzTLyECX7/9D1wNH8O/J3tgY0xDbTraE82trcG/H3bj86EyEpAbB/1JLpDY6jbmo+vlnBEWnPjn8CQ4mHRTF4p/1+Qzuju6W/9HV+xG88fEnIr1hjTA6Yz5pJe397t5OcPWo+bUXIoKhf3DWi2DcSiAFuFWsTk8bQRI4OMC9W6lT9+3ISrkJZXERFA4O8K4TbNP9QYXahbEXkPbzz2K9S/PmcKxb16TwIeGpTV06llOgra3d0v0+aGu3rPS7oMoxjCAR6kKVThzpO2w7N/GtUXPXqoVAos64AwcOICQkRNQH7S4p4NNn+fLlOHTokBh5Qo8jUlJSMH36dBwvyfE+/fTT5b5HZmamEFj0fKKoqAjx8fE6V/DKQpEpqs3K0LPSZ0rx8fFBMHV8+Pig3cuj0apIhc6Lt6HPhkP463AfHIkPwMr9veF2ZCeOFyuECSXZBYwZuBRn+5ytUoFEHjFz9s7RDaId2mgoGvk0spuDEGNb4mOlkeredapX88mdUpEIxoWMCwa1e/R/ydwIr7aTS7qhRPZ//4qapYqk13yCQyEvcbe21f5wCJUEUvbGTeK258DS2iN9HMnfSP91y4kg3ap2yxqos8oKJGVJau1WDts1lQoLpI0bN4oIDy3GkDghj6RbiZPbQY7cWtFTHv/99x+6du1q8LgHH3wQS5cuFcKEDr63wtvbW0SOtGzfvl1YF9Svb7rgj4STvni6nRmmVhxRNIq6+izdhlpdIOFI0TuK7hHa78/BSYHukwag3eNF6PDTAexYk4OfD/ZCXEZpFEeML9k0FkW/PIO6E+sanL1WJnKkL46Iv2L/wvjW46s8SlXmR5f+JvRrDawYRmfMI3pPAvb/LbWiJ8RmiNvNe5Sdy1eTMDeCQf93PjosNTNoocJwcyK8FEHVmlFqqUghckLseXHpGWA4c84W+0NbW6R12fYsp2TDqUGpt5F43i0EkvZ9bXGypMqRMh5yT8m6wcBhW2PaYbsm43AnTtokRr744gs8+eSTugPfxx9/LAbX0qWlobQb1SbpoxU3dN/tBJIxjz32GALKabkk3nvvPcyda2i+dqu0mlYccfF3WVxdpf9UJJJoH1HEUHefhxMGPXcXOj2QC7fnD+GNPw3rElQaGVxONcKY9WNEjdCQ8CG4U6jz5sNDHxqII33PGEsKJOVNKcyuw8phdOb25KQXYPvP5wzWbf/lHBo094OHr3mzwqor5kQwbuW3dLv/O7cqRL7d/4FTWzdi/1+/ietXjh8Rt1v1kxzAbbE/dAKpRPRoh9saY3zyczuBZCv0u9iMHbZ1g2zJI2lkZI2PHt2RQKKuLxJEzz33HP7991+88cYbeOGFF3DixAn89ttvVjGKpJSYsd+S9jbdV1EoNXcrZs6cKeqT9CNI5UWbtDVH1c0Pyppo9w3tK32BpMU32B3t7gLkf2lE5Eif+CMjkdf3T7yy8xWcSTmDqR2mVtjE8VDSIRE5issu2xmi7xljCdRFRUh87TVxgPDo2xd+Tz5p9TA6c3sybuSXOYaTHsi8kV/jBZI5EQyt35K+SDL3/86dFiJnp6Zg06IFBus2ffclwtq0h6e/5bzKbrU/tINntT5ImX/9ZTJVKARRSdSYzCYVHvbXEUnHdeMuNi1UkE01RyKtFuBaK8QRcUf9euPHj8fRo0exZ88etG7dWvghnTx50mou2lTDkpaWZrBOa/RI91U1zs7O8PLyMlhuB6fVKrdv2g+NxIQeK3XjS2Ti1EWDTTHN4DjnXzikBuOn6J8wYdMEpBUY/i2UR25xLubtn4dxG8YJcRTkFiRa+bXGehX1jLkTUr/5BoWxsVD4+SHk3XfKNe1jbItPHdeyUyPkVItU89MKFfFbupP/O+WaSN7m/0F6YkKZgdfU0ZaRJHXCWRtKFWau+LNMxx+tNzW3UlFHSgnqht/aGVSIrSku6Ro2EkgEiSKXCJ9aI47uuEibBNGHH34oCqP79esnjBbXrFkjOsOsQZs2bcR4E+P6JxcXFzRpYt3ZNYxlCG5UF8MfV6Gu/2Tk5EfAw/Ui8gr6YcG24TieEIzg2asR9fxMHMRWPLzuYXza51O0DCjfaG5v/F7M2TcHibnSGIAHmzyIlzq8BE8nTzzZ4kmRGqCzX0uKo4LoaKR8u0j6fG/OgkM19Q+rDVCUqMOQMBxeL3XCkg7o81hUrYgemQsVZFPN0Z3837mTQmTfkNAytXvknUTF2ragIqlCsvVQJUu1l4Xnz4vb5halWzu9JnNW1JphtFUukM6cOYP7778fDg4O2L9/P9q2bYtffvlFpNz++ecfLFmypEpb5U0xZswYfPTRR0IkjRo1Cjk5OVi4cKG4rq1xYaqO69ev49y5c+J7bdmypSiktwaDxz+ENgN6ICHmKkKbPAzIPOA38y98tfFeXE73QPqHn2Dwoz/jUr+P8MS/T+CNrm/g/sj7DV6DppqTM/bfF/7WzYua030OuoZ0rbRnTEWgGUwJr70uijk9Bw2C1913W/T9mMrjF+quu7zv+TYsjkxQmf87FS1EpjRasx69cXb3dp04GvjsZIun1yqbKryVl5I9RY+1HkjG6bXaTIWPdNRBRi3y1K1G4khb5EwRHGqfp8hSZSGxNXToUBGVunDhgrhOS0GBZNjWqlUrfP7553jiiSdEN1vjxo2FMDJlKMncOZcuXRLDibt37473338f9957r/jOY2NjrRpJan93d3EZHO6NCV+PwGsPrUev8HgUKhVYs/QJ1F/yIwqLVHhz75t4a99buJZ1Tbhvr4xZiRGrRghxJIMMY5qNwcphKw3EkbVI+e47FJ47J+oPKHrE2D+ZJaMV6jT0ZHFkZ+n5Zr364dkvl1i8QLsqUoW3svWwJ7T1R6bSa7WVCkeQJkyYAA8TBWZhYWGiXT46OrrSG0XDb0210pPJoJbJkyfjoYceErVP5KRNDtlc91O1UF0XFacPGjRIVwB/zz33CINNciK3BR6+znjyiwfg//YahP0XhqWH2+HfnR3Q8fp/UL7wKFbErBCLPmFeYXirx1sWn6tWHgXnY5DyzbfietDrr8PhFh2TjP2QkZxfqzyQqgMJsVJnIUWSbBU5qmiq0Nbu2OaiypYajBR6Lf61nQoLJFPiSAt1JFF0p7L06mXeVHNK+VA0qyaTmJmPyym5CA9wR4i3ddOHnTp1Mrjt5OQkCvFffvll2BLyTRrx1gjUqbMFob7/4ovtg3D4UjDqvrkW9Z5/Dhl+11GY3ADOQXFw8ruBr/p/JbpubIFGqZS61oqL4dGvH7yG3muT7WAqTkZJBMmHBZJdkJeViYwkqYYwpHFT2Au3SxXa2h27Mi3+tZ07dtKmOWcUvaFuMv3OAupq69y5c1VtX42A9k9+sZ5Vu5n8deQ6Zq85A7WGukSAucNa4IEO5vtnuDoqqjyqtmPHDjRr1gy2hj5Xj+cHwC9oF3w8luOrrcNxLdMdN95bjGIVfWY5IFMj9Mk5SB6cbDOBlLp4iZjTJPfyQvCc2RzlrI4CKYjrGu2BxBKDSJq/5mKHbfK3wpbu2ObCKbYqEkivvvqqMITU97OhuWgUXSLPIBZIhpA4av7mBlQGEkmzVp8Ri7lEvzUYbk5VN02GfK6oMJ5m3tkLzR66C15+h+Dh/Dt+2HkfjiTouetq5Ej6cQ4Ur6YANvg9KrxwASlffimuB82cCUcLNy8wVUdBTjEKc5Xiuncgp9jsSSCFREahOmIrd2xz4QhSWSp89Dx27Bi+++47UWu0evVqMVaDCrPp4Emz05566qmKviRjB9DMO7Jt0NZ6UUG2PmQKSt8tjWihwm17ou6ATnjU2wnXb+7CkQRDLy61Ro5f31Gj5XcaODmZjqZRlwkVUlKtQFX9gBXFx+PaCy9AU1wM9153wXvE8Cp5Xca60SN3H2c4OnPLsz2QGHtWXIY2qZ4Cyd5hgVQFAom614YPH47IyEjR7k2Fu5TuePTRR0WRNkUYpkyZUtGXrdFQqouiORUhKbMAAz7ZISJHWijNtvml3gj2djH7fSvSnXj69Glx3d3d3UAg0X1Ue0QjV+z1u/Xt1AZ3dbuGD7aWdd/+eGkwlv6Zj5FNj+LxqE0IC86CzNUVclc3FF29ilwaiExp4pLagMr6k5DHSeKsN3UeKe5dunBqrZp2sHF6zT5Qq1VIvCB1z4ZE2k/9UU1C56LtxTVIdyyQaM4YdY0RgYGBwk1bCw0f1Q4iZUohAVnRVFejQA+8N7IVXlt5Giqyp5fJ8O7IlmK9JZg3b165w4nJ9+qdd97Biy++CHumWSsnzB8cg5kbmoi5bXKZBr3C0nA62RM381zx7bEeWHSsO7qFXsEoj1/RD7/DUaZEnHMULivaIlx1HKikP4nwPNETR8SNjz+B17332nV4nSk7aoTgDjb7IPVaHIoL8uHo4gr/+vbV/VUT0CjVUOdJKWW5B3exaalUgQr545Bn0fLly+Hr6ytMIj/44IPKvCSjx8OdGqBXk0BcSclDWICb1bvYDh48iBEjRqB3795o1KgRVq1apbuPIkz6tgv2QL1erdFp9SLsmTgQcRnuaOCTi9TCY7gCT1y7FoCdMe2x92oQ9iaEYy9eR4DbNET5JWJvTJiIOpGgmtn2V8w0Y2hmeWSuXXvHgzgZ+4E72Oy0/qgxZS445VnVqHKKdWkKuZt9/a5XK4HUrVs3ZGdni+sRERGYPXs2nn76aVGkPXr0aOFNxFQdJIqsLYy0pKen6zyQfvzxR4P7Bg4caHcCiQRI2/ubI+bTtxHkFwbZ1Svo/uI49BsyHOf2JaLZllN44NJGHLvQCv+da4aUPBfszgvXPZ9E0vzjj2L49j/RqUvFOzEzVq3Czc8+L3uHHXqeMLcmI1nb4s8dbPZAQozkfxQSafsO2ppI6ZBaR8ioloO5M4HUo0cPg9vTpk0TZoLUyUY+OUzNYfDgwWKpTlD9UDsT7bRtBzRAm371cf18OqJ2XEPXQ8tx6GRz/HS4g8HzKTV38K8LiKj7C/zGPGa2jUPq99/j5sefiNsubdqg4NQpu/Y8YW79fWZyis2uSCwxiOT6I8sWaLOLtiEOVVVjw+KIsfd2Wjozqt/MTyw5D0fBd8FJLDtiXNStQZbSB8nz5kF58yYCp75wywJrjUqF5PfmI/3nn8Vtv6fHoc60aVDeuGHXnidM+eRlFaG4UCXmonoHcATJ1uTnZCMt4bq4zgLJMnAHWxUKJBoOS91qly9fFl1sxi7YNI6CYewZGlky7PlWmLRtP77Z0VVEjkgcATLMPjEB+ZFOGP3NR1Cm3ETI3LmQOZT9r6IuLETCjFeR/d9/4nadV2fA/8knq4XnCXP7DjZPfxcoHK0zmJkpn6QLMeLSJzgEbl7evKssmmLjLFClBBLVpbRv3x55eXmIiooqU4dCxbwMUx3w8HXB/+Y1RMOvNyEzywHuzunYdqITNsU2wNvnn8bpsDZ4c8UzUKWmoe6nn0DuWhpNUGVn4/pzk5F38CAZRyF0/nvwNvKOYqr3DDYeMWJf6bXQamoQWR3gFFsVCaS1a9eK9n4yFuS0GlPdad4jFA2a+4maE6VSjaAfDiB8bwK+398Ff1/piNjAjfhs2xNQPTUOQXPnQJ2eAbm7OxLfeAOF58+L6/W++hLuXbva+qMwVcSNOGlQthv7wdhZgTYLJEvBg2qrSCAVFBSICBKLI6YmRZJoIUa/OQCeC48i2HcVvtg6FKdv1sFDOavwsWwmugwfYfA8RWAAGixaBBc7mE3HVA3RexJwZmeCuH5ufxJCIn2EiGZsg0atRmKJQPIK4pS1peAaJNNUOMFO7d3btm1DVpZ0lsUwNQmKGoyc1hm9HmqK14f9geZ1MpGW74xnYj7CZ+qPsN1ttDCWJOp9sYDFUQ0iJ70A23+WDsZatv9yTqxnbMP+v/9AUYGU8lw1fw5Obd3IX4UF4EG1VRRBCg8Px9ixY0X9EYklT09Pg/sHDBggzAUZprpChbn9xjZDQD1POLutx3/7u2L9uXAsiqUao3tLDSWNGhSY6u+ebezxqVFT0Xa+LsLIWI/s1BTsXfFr6Xeh0WDTd18irE17ePoH8FdRRdB+5QhSFQmka9eu4f333xfjRmi4aWZmZplRJAxT3aHW/jb968M3eBCK5u/Fv+fCoIHU7k+2AO8dfxQPpZ5Da1tvKFNlmDKFlMlp3Ai3+tuC9MSEMq70lHLLSEpggVSFaPKVZAAnris8uIutUgJp/fr1aNWqFXbt2iWG1TJMTaZBC3/4NiwVR1pIJC3+3hWfs6NFjUGukAtBRFEjgq73eSyKo0c2wjekbO2XTC6HTzDXhFUl2uiRzNUBMra1qJxAoknvLVu2ZHFUC1EqlWJxdnauVdPpI9u4i7SaoaEk8MXfYVA+cBOf/R4AR8fasz9qKtG7E4Q4CqjvgZ4PRorIEafWbAel0UgkiUhSiTga+Oxkjh5ZSiA5y6HMLISDt3NVv0W1RX4no0Y2bdqE1NRUy2wRY5fk5uYKYezq6oo9e/agNtFuQCgm9d4PhUwKQ5NY6t4wSVxfuDIQPZtlIiFOZeOtZCqDWqXG6Z3xurE0dZv6sjiyA9Qq6f9V3ycn4Nkvl6BVP2k2JFN15J24Ke3rjCIkzT+I3EPSbxtzBxGk2NhYKBQKUaTdr1+/MkXaNLtr1KhRvG9rGM899xxatGiB8+elqdq12VDSy0sJd49i9LoIfLlzMA5e9EHbFoX4bVkB+o9wt/XmMnfApeMpyM0ohKunIxq3r8P70A6geqPskhPxxp26cOTIAlDEKO9Qst5OB9JXxsK5iS9Hku5EINFokQ4dOhiMHTG+n6lCMuOBtIuAXwTgXdcmu/aXX37ByZMn8fPPP2PlypWo7YaSlHrJSS/E+q9P4E2fX/H99vsRk+KJwSMdMWdyKl7/3F/M8WKqD6e2S7O+WtxVl8eL2Am5mRlQq5SQyeTw8PW39ebUSJQpkoWCARppvQOn2ioukIYOHSoWpgJQJ0axNN+pQhz/Ffj3FalqlCpGh3wAtH3U/Oc7ulE7VqW+qgsXLmDatGnC+8p4rExtNpSky4de64z1X7tistsq/Hewp7ACmLXAH3v3pWH2vGJcPpWJ1j280bxbkK03nbkFqfE5SIjNEMOMW9zFBcD2QnaqlPpx9/WFXKGw9ebUSBxMDWOWlbO+FnJHw2qZCkLi6N1K/vCSSFr/srSYy2sJgNOdp3woGjh69GjMnj0bzZo1E2KJKYVE0siX22PrMjfA8RgaB8bh6z134d/Dfvj3bqpXChL1Sm89FY3XFzfnXWfn0aNGbQO47sjOfJAI9jyyHBQlcgh2hzIpV1ohA3xHRnL0qATu02d0YojGyNBSWFgo1s2aNQv+/v546qmnxHpt+pQui4uLec/RD4yTAgPHNUePUR0Q2bwALw9cK8Wo9TyTZi1phm1/6+X5GbuhMK8Y5w9IRamt+tSz9eYwemSnaAVSIO8XCyJ3kmSA14AGCH61M9w78UgXLRxBsgaU6qJoTkXISgC+6lxqykLIFMBzBwCvUPPf10wobbpz505x3cfHB0lJSTh27JhYR7e1jqvEkCFDMHz4cCxfvrxCH6mmQpYH7Qc3hF+IO5a8eUonjrSQh1L/kXXQv006xk9xwYjHXUHZyivRhTh/tBhN2zsirDm31tqCs3sToSxSw7+uO0Ijpb9zxr5SbBxBsizqPKW4dI7w4ciRESyQrAHVAVU01RUQCdz3ObB2KqBRSeLovs+k9RZg48aNt11HKbbIyEhs2bIFPXv2tMh2VGfCWgdg4GMN8M4aY88kjRBJm0/4YvPTgP+UIrQKL8TOMx5Qa5xFGm7Ba5n43zxvG2597UOj1uDUjnhd9Kg2eXtVrxQbR5AsiSpXygbI3Wt3jakpWCDZM+3HAhH9gbRLgF8jm3WxMeYT3toPk3rtxzc7u0KlkQnvpIm9dqJRnUs4drED/jsfhZRcJ2w/XWrpT2JqyrteuOfRQo4kWZG46DRk3cyHk6sDmnTmtIK9RpC8AlggWQqNSiONGiGB5MZywBjeI/YOiSI7EUY0WoZctHnEzK3neTVvlo93625CVrYDvDyVcPek/2YN0cU3AV1a7cHxcx2x+EAng+eRmDq1Jx1hzflAbe3i7GbdQ+DozF1S9gYXaVsedX5pLanclSNIxnCRNmM2jRo1EsXa3bt35712i862PmOi4OHtABolRZd9HmuK+6a0QXibUMhdm6JJoziRVjPmm2+BvNyy65mqJ+NGHq6ekUwIW/a2jxMQxtBBOzc9XVz35AiSxeuPxBw2BaeYjam1EaS4uDjk5ZV6Ezk4OKBx48Y23SamZppKar2TGjT3R1ZKPg6sOYkJ11Zi0Z6RInIkE11vwPojwejUNAerNrggskWt/a9pFcRYEY00jNinjvnNDIx1yElPhUajhlzhADcvrs2zFOqS+iMF1x+ZpNb+Cs+cORNHjhzRzRkLDAzE0aNHbb1ZTA00ldTHK8AVzXo0QfSu/ZjrPxk5+RHwcL0IZVF3LNgxCtHxHujQoRiLv8rBqKc9bLLtNZ3iQhXO7U0U11v14eiRfbf4+4shtYxlBRLXH5mm1gokGp+h5ZVXXkFYWJhNt4epXXVKji6t4F0nDJ6qDMgVEYDMHbNGLMWP20bieKIfHnrGEVO2pOPjpb5ISqIZiEBkJFCPrXoqTczBJBTmKeEV6IqGLXiEhT2SpWvx5wJtS6LK4w62aimQUlJSsHr1ajEM96GHHjL5mOPHj4sokJ+fHwYNGgR399JW+vj4eGRnZ5d5Dj22Tp3SYZRUU/PHH3/g1Cnyr2EY69Upbf/lHGRyT+EC4envgixZIzw9ZDX2HO2C3483xxe/+WLd1nxcuekCtVoGuVyDRYtkePpp/pbuFPLy0hZnt+pdV4wXYeyP7BT2QLIG6lxtBxsXaFcLgaRSqfDkk09i69atQvB4eXmZFEgzZszA119/LUwLacL8iy++iO3bt+siQe+99x42b95c5nlPPPGESK9p+f333zFw4EDxPgxjqzolZ3dHbF4SjUvHge4dz6Jx8FV8vHkgLiWXzkQikTR+vAaDB8s4knSHJF7IQGp8Lhyc5IjqFlJVXydTxaTGXxOXzm5cH2ZJ1LoIkt1JAbtAbo9neBQNunjxIu655x6Tj9m7dy8++OADrF27VkR/Dh06hLp16+KFF17QPebLL7/EuXPnyiz64ohYuHAhJkyYYPHPxTCmIkl1m/qKS0cnBQaPb4k2A+pDrvBFUAM5JvTbWuY5JJKO75a6r5iKc3RDnLgMbxsIFy5MtUtObd2I6B1bxPXjm/4VtxlL1yBxBKlaCCTqJnv88cfh4lK2wFULiaLmzZujd+/e4jZNmR8/fjzWr19vMq1WHiSslEolOnUy9KQxhmaTZWVlGSwMU9XI5TL0fDASdz3cBHK5IxoF5JuwA9DAOVuaHcZUjGMb43D1tCQuYw8lI3pPBcf/MFbxPtq0aEHpCo0Gm777UueJxFimzZ+72KqJQDKH6OhoMV1eH7pNYieWqlnNhATV1KlTb/s4Std5e3vrlvr169/RdjOMObTuWw9DJrWGh68C8wfHCDduCWkI7lOvNML+bdLgYMY8ctILsHflhdIVGogaMFrP2A/piQm6mY9aNGo1MpJYzFoCjiDVQIFEUSLtAFUtvr6+4rIi0Z3Zs2dj7Nixt30cpeUyMzN1y7VrUn6cYSxFeOsA9J3QFU3CDmHPxP1Y/shJ/PTAKTTwzkd8hit6DXDAx69n0wk2YwYZyaWeZ1poDjTVgDH2gy+5qxrNxKM2f59gMwd0M3fYxcY1SDVGILm6upZJpWmFkZsFivpovAYVcesvDGNpHJwUuK4JxSnVTRR7nUWh/xVMu3cJ+kfEo1gtx8vvemLEXZnIzNDgSnQhNvycIy6ZslBbvzEyOUSBPGM/ePoHwC+kroE4GvjsZLGeqXq4i+3WVEvZSBPlqcVfn0uXLolp3BERETbbrprKlStXsGDBApw9exZNmjQRvlGhoXxGZw2/JDqZLoSHWCADFJ7NMLLvZjQLicQ3e7tizR5vNK5XiLQ8J6g1zqJmacFrmfjfPHYf1kdbe6Qvjvo8FmXSzJOxHQU5OUgvSafdM/ll1GveksWRhdCo1NAUlLT5c8NCzYkgDRs2DIcPHxZdaVp+/vln9OjRA/7+bPxWlezfvx+tW7dGWloaJk+ejJYtW+Lhhx+u0vdgbu2XRAdzgsSST5AbNIr6aNrsJt4e/gvquBcgJdcZao2UlqDLKe96cSTJyDn7wtEb4vrd41tgxIvtMPad7sJqgbEvLh07JGqOAuo3RLO7+rA4skKBNp14yV2rZazE4tjlXvntt9+QmpqKEydO4ObNm6Jln6B2fOpYGzp0KIYPH47BgwfjqaeewunTp4Vv0rZt21DTSMpNQlxWHBp4NUCwu3UnvavValGjRYL0hx9+0K1/5JFHrLodtRljvyR3H2ec3ZOIPX/GAoFueKrHFry/8V6D59B8t23rMhGWXIfdt+mge/wmigtU8ApwQaO2ddgc0o65eGi/uGzcqautN6X2eCDRoFo2TK0+Auny5ctISEhAixYtxKKNFOl3N/z1119Yvny5iCS1b98eH330kd2OC6HtzldWvBh0zcU1eO/Ae1BDDTnkmNllJoZFDDP7+a4OlKK5c6fgffv2ia7AZcuWGazXdyxnrD/XrXnPUDFkdcdv55GXHSvSatoIkoQGT78aKAq42X0bOLdPmrvWtGsIHwjsGGVRES4fl+ZjNu7UzdabU2s62OAohzKzEA7ezrbeJLvDLgXSa6+9dtvHyOVyjB49Wiz2DomjLr92qdRrkEh658A7YjGXA48egJvjnRetU2SO9jMVvpO7OY1/If8pci0PCWEXYlvi4euMeya1gqdfMSZcW4lFe0aKyJHWCkB7LlHb3bez0wpw/Xy6uB7V1boRWKZixJ0+geLCAnj4B6BOONeSWpq8k5K3lDqzCEnzD8J3ZCTcO/H/kWpfg8RYh/z8fCgUCjHqpWfPnsKM88yZM2jTpg2Sk5P5a7AxFB1sP7gFoiKvY+6wyXh10CcY3+3PMo8jkXRoa+103z5/IEloxtBIH3gFcMeaPXPh0D5x2bhj10pFvpnbQxGj3P1SZFWgAdJXxor1jJ1HkGoalOqiaE5FSM5LxohVI0TkSItcJseq4asQ5BZk9vuaCxlmajsDPTw8sG7dOjHYt7i4GG+99RZGjRol7qMxMNTBtnTpUkyfPr1Cn4mpeij1NuDpUdi29BA8lRkILZBBvt845QZMeM4d1+PyMX66K5xrSSSdUtva9BrPXbNv1GoVLh45KK5z/ZHlUaaYKPnQSOs51VYKCyQrQGdDFU11hXuHY3b32Zi7by7UGrUQR7O7zRbrLQGl0DIyMnTjXogOHTqIS33ncBoBExgYKIroGXsq5B4sCrnTLsVjfloMZm5oIlJuMmjg6azEzRwXTJkFzP+4EK++rMaE6a5wckKNJvlyltgnNJg2on2grTeHuQWJMeeRl5kBZ3d31GvWkveVhXEwFU2VlbO+FsMCyY4ZGTkS3UO741r2NdT3rG/RLra2bduWWUcF8l27dsXixYvRuXNnUY+0fft2XLhwAX379rXYtjB3XshNnW5N1v6JPRPTEJfhjgY+uUgoPIrtMS3xx/GuSMhwxpQ3gPkfFmD6VCX+95qHEEo0ciPjRr7wXqop3kBnS6JHEe3rwMmFf+rsmQuHpe61Ru06QVFygsZYDoWnE6CQUcurtEIGUYPE0SND+C/RziFRZO32fmPLBWrzDw8PFx5TMTExePvtt4XFAmN/kLiJfKwf9i07DFevOJxWu6LrkyMQJc9G+9+/wNHjXfD7sS5IyHTBi3OBDz4twNjhKfBRnkV2tgI+3krcO6lltfcIUhapcOGw5H3Exdn2nwrV1R9xe79VUN7Mk8SRowwBT7SAQ6AbiyMTsEBibglZJ5AfFQ0ILigoEE7anp6evNfsPuU2SOedpI0INesRhbsvx6Hbt19j754O+P1YZyRmueD9ZdTeRuMdZMIy4Gr8fsxf6VetI0mXT6SgKF8JDz9n1G0izWlk7JO0+GvISEqEwtERYW3a23pzagVF13LEpVM9T7g05v8f5cECiTGrhorSbUz19U7SEhTeAKPnT8WghOvo+923WPtPd/xwiGrNSp24v97RFQ9vvoy7RjVCdeVcSYdOFHsf2T0XSswhG7ZqCyfXqp+lyZSl6Hq2TiAx5cNt/gxTC/ELrYf7Z09B9wGSb5I+JJL++rkAKlVpB2V14sbVLMSdSRPXm7L3kd2jTa9FdGT3bGvBAsk8WCAxTC2m+30NRFrNmAVrojDxnmtIT85DdSJ6TwJWvHdYdzshVurMZOyT7LQUJF2MFYMGIzp0tvXm1Ao0SjWKE3PFdad6HrbeHLuGBRLD1GKadwvCW0+dhaJEJJFYahWULobbfL+xIe7plod96xORnZYvHKmp281eoW3b/nPpAGti+y/n7HqbazsXD0veR6GRUXD34VoYa1CclCsKtOVuDlD4Vd86Q2vANUgMU8t5fXFz3P9MMk7vzUSLbl4oSD2E3z7xwJe7emP/5QCMHF2A0d1PwM0x16673MimQG9co0CjhihWr84F5zUZ7l6zXXrNsZ4nO5bfBhZIDMOISBItEvchpOk5NJj9PT75bwyuZrjhsw2d7b7LjTycjJHJITr5GPujIDcH186cFNe5vd8WHWycXrsdnGJjGKYMoU2i8My3D2P6yGW6Abj6XW4b/kjGtm3A9ev2s/NIsPkEuRqIoz6PRdmdkGMkondth1qlgk9wKHxDyGaCsQZcoG0+HEFiGMYkbl7e8Aq/y2SX26hJDYRskss1WLRIhqeftv1OLMwrRtZNqd5owLhmqBvpy+LITjm1dSO2/fCNuJ6RlCBut+o3yNabVeNRF6qgvCE1XnCL/+3hCBLDMOXSob+/yS43jTaipJZh/HiNXUSS4qLToFZr4BvshqadQ1gc2SnZqSnYtGiBwbpN330p1jOWpTg+RwSEFV5OYmFuDQskhmHM7nKj4bfGkEg6vttweDF1jlm76+3KKekAG9YqwGrvyVSc9MQEMV5EH41aLSJJjPUKtJnbwyk25rYcPHgQR48eFT9qNNS2W7duvNdqaZebOisdj73dWaTZStHg6NpraNlcgzphXkKoULs9HQNlMqDPmCiLd71R5OjqaUmkhbX2t+h7MZXDNyRU+sPQE0kyuVzUIjFWqj+qzwXa5sARJOaWjB07VgymPXLkCI4fP457770XDz/8cJkzQKbmR5IemtYEHfr6Yv7gGF1ESVvAPfe3Npj+TDYWv7wb25ZJ4kjcq7GOF1HypUwU5irh7OaA4EbeFn0vpnJ4+gcgtEkzA3E08NnJYj1jWQrjJIGk4MYFs+AIElMu586dw7Jly7BhwwYMGiQVUD7yyCPo27cvZs6cKaJJTO0ipE0DNAn/E3smpiEuwx2Bbvn4cn8I/jrTAH8eCkdsgg8e6nsGjpAhO9sNnp55cHMvtLgXUcyhJGn7In0gV/B5n71TmCu1mvd4+HG06N2fxZEVyN4dD3VGobie/sd5oFgN907B1njragsLJDunOCkJRVeuwimsIRyDrfvH7OLiIozEnJ2dy6xzc+OhkrUREjmRj/XDvmWH4eoVhwtwwuiHd6PJjhb4fOdAnIj3xYU/uiKvWCEKuanA+399z8Mr0MWi40VO75DqV66cTBG37dHIkpEozMtDavw1cZ0619hB2/IoMwuR+c+l0hUaIH1lLJyb+MLBu/T3nTGEBZIVoHSUJj+/ws/LWLUKyfPeoQIL6qdG0Buvw2fECLOfL3N1rZRTalhYGL788ktMmTIFd999t3it9evX47PPPkOTJk3u+HWZ6g2JjwbNB4moEJkwkmhq2W8Hgr/4DAs2T8CFtNL6BuGbtK0p+v4UixFTGld5dIdSd9v0x4uUpPQaNLc/I0tGIulijMi9egUGsTiyEsqUfCkbro9GWs8CqXxYIFkBEkfn23eo3Iuo1Uh+622xmEvTo0cgq2SkJzc3FxkZGUhJSYFcLkdWVpZYx9RuSHzoC5CoHr1RJzwCmZPX4c2/Rxs8VqWRYdPaPDg6nMLgZ1rAydWhSseLGP/w83gR+ybpQoy4DGnMJ1nWwiHAhJu8rJz1jA4WSIzg119/RVxcnC6NNnXqVOzYsQOvvPIKDh8+jA4dJIF3+vRptGrVStzW1iUxDOEXWg/9Ho/CnFUaoy434JttbXDm+k2cP38GE95qCs8qGpKpVpVtFuDxIvZN4oXz4jIksqmtN6XWQFEih2B3KGlQLSEDfEdGcvToNrBAsgKU6qJoTkUoTk7GpXuHSuk1LXI5Gv2zDo5BQWa/r7nk5OSISBHhWvI8au339PTUiSOiZcuWCAgIEF1tLJAYY1r3qoeJPVbi2z0jReSIapCiArMRfcMLu2LriGXNppuY+0kR+t7rJQwmY2OByEigXr2Kp66Pbbxq+DfP40XsGvrOEmNZINkElXQs8bonDG5t6rA4MgMWSFaAancqmupyDg9HyFtzkfjmbF0NEt2m9ZZg/PjxZdY1btwY2dnZOHPmDFq0aCHWxcbGIjU1FZF0RGMYI6hVe+JcT9T98nlk5zaCp9tFBNcrRtb1NvjvzEhsiA3BrphA9BsKtAgrwNk4Z2E0eScjS8j36Pq5dMgdZBg+tR00Ko2uJoqxT7Ju3kBeZgbkCgfUCYuw9ebUGjRqDZQlVhtuLQJYHJkJCyQ7xufBB+HesyeKrsbBqWEDq3exkefRkCFDRFs/+SGR0Pv555/Rr18/3H///VbdFqb6QJ1JYW3aC2dkn+Cx8PDzx+VjhxGw/AMMiQnHxugHsf58CM5cKRUyJJImjNdg8GCZWZEktUqNvX9dENfb9K2P0MY+lvxITBWn1wIbhsPBiUddWAtVVhGg1AByGRQ+fAJhLiyQ7BwSRdYWRlqoKJu61sgHiUwiKTy+ePFiIZoq0x3H1I5Ikr7xX6P2nRDeriMuHN4P3+XzERnUD5/vNOzIVKll2PxHFtzkBWjVzRXNupY/DiF6dwLSk/Lg4uGIDkMaWvSzMFVHkq7+iAu0rYkyVeqidvB1hkzBv93mwgKJuS3kpE0Lw1QGEtWRnbqhcYcuqPP5NizYVbaY+6mXSRR5idqlt59JxGuLQsq8TmG+EgfWXhbXOw8Nh7ObI38x1YQEXf1RlK03pVahSpPSawp/7lqrCGw5yzCMVaHREkHhziZGlkhjSwgSTm9+H4yz+6XRCPoc+fcKCnKK4RvshuZ3sSFkdUGlLMaNyxfFdW7xty7KVEkgOVRR92htgQUSwzBWJ6R1OCJCf8Keifux/JGT+GpYtE4caaEuuG3LrxvM/ctKyceJrZILc/cHGkPBY0WqDTevXoGquBguHp48mNbKKNNKUmz+LJAqQo0XSD/++CP69OkjllOnThnct2LFCowcORKTJk1CcnKyzbaRYWobwY3qwr1LWxzJ+AL5jl8jT/GjSKsZs2yVF/7+Ihr52UXCNXvL0rNQKzWoF+WLhi39bbLtTOUKtIMbN+EaRptFkDjFVhFqfA0SCSMamTFt2jRkZmbq1m/fvh0vv/wyPv74Yxw6dAjDhg3DgQMHbLqtDFObGDz+ISQN6IGEmKvwCfLCpZsrsajEP0lWYo+9/3JdTJ3jixP7T8FRUYCbma4I9HZGpwhvPshWM3T+R43ZINKaUARWV6TNEaTqJ5DUarX4EhUKRZW/NokjWnx9fQ3W//LLL5gxYwYefPBBsZDnD3n8sL8Pw1g3kkQLMWluAupp/ZNcL8JJ0wWfbnsI1zLc8M4f7URdEg3Alck0OBd/Dt/0LGDPo2rZwcYCyZqo85TQFKjEdQXXIFWfFNuePXswZswYMRm+S5cuJh9Djs3dunWDk5MTgoKCMGvWLIOahDfeeEOXQtNfaMjqrbh+/boQRVpIGF27JtU2MAxjG/+k57+bg/99MgATF76GZv2T8fo9r6N7w5tQaeRCHBEajQy/7YjC2ZNS2oCxf/JzspGemKBLsTHW72CTezlB7lT1QYiajM0iSIWFhWLO14QJE+Dh4SHmfRlDA1JpnMUjjzwi/HhoDhilwkhQzZw5Uzxm9OjRGDBgQJnn1ruN25y7u7vB0FW6TusYhrEP/6R7nn8Zx5v+g0tpP2Lv1ekGj6No0o1Ebu+vLlw6ekhcetcJgqtH+f5WTNWjS69x9Kj6CCRnZ2cRQdLO/DLFDz/8AJVKhU8//RSOjo646667MGXKFHz22WciPUZGhjQb7E7o2LEjVq9eLRyh4+PjER0djWbNmlXqMzEMU7W+Se0GD0VeUjA+3WzsmaTB+pWFuHuUOyyQmWeqkFNbN2Ljt1+I65k3ksVtihYyVi7QZg+kmtXFtnfvXnTv3l2IIy005uLGjRu4cEEaM3A7Nm3aJFJulKp7/vnnxcgM7ewxEmYksNq0aYM333wTXl5e5Ua7srKyDBaGYaxD/SgHA88kqYBbhoUr/NC/cwHir2vE0Ntt2yh1zt+KPZGdmoJNixYYrNv03ZdiPWMdlCUpNo4gVdMi7fKg1nvjouk6dero7mvS5Pa57NatW2POnDm625SeI/z8/IRAokGs9JohIWUde7W89957mDt3Lmozly9fFmnIW0XsCgoKEBcXh/r168PVldtJmarBt3E9NK77CfZMvA9xGe5o4JOLzRcVeHdbB+w46oKmjVXIK5KL2qQ7GXrLWA6qO9KvGSU0arWY06c/ioaxHNzBVkMjSOV1vBHmzgKjwm794u3OnTvr7nNwcBDRo1uJI4LqncgiQLvUpmLu5cuXi9Rmq1atxP4r7zuh4vnAwEAMHToUERER+PDDD62+rUzNhA6kjR/tg6NZC4Rn0tHML+AeOB8fDFuASP8c5BYqhDjSH3rLkST7wDcklH6syzip+wSzA7rVI0icYqtZAomEC6XT9Ll586a4DLbiAFeql6L0m/5SW9i9ezfmzZsnlvJ4/fXX8c0332DXrl2IiYnBlStXRH0Yw1QVVLMy5vMv0PeVSRjzxQI88eECeITFYkTbH8o8lobe/vx5Dq5EF/IXYAfiNrBBuIE4GvjsZI4eWQl1kQrqrCJxnT2QKo5dH8V69Ogh6pCKiqQvmNiyZYuICjVq1Ai1AXIPvn4+XVzagi+++AK9e/cu937qNPzkk09ECrJt27ZiHVkykDEnw1T1wbZ+i9bi0jekLh6d9zHad/Aw4cCtwcyPPBDR0gkL3yg1h2WsT0FuDtLi48T1wROn4Nkvl3CBtg1a/GUuDpDzUOfqJZCoQ02pVOpy1HSdFi1PPvmkiN5MnjwZSUlJouCaDtjkgF2dIhT0+YoLVRVeTm2/jqWv7cXqT4+JS7pdkecb5/4twY4dO4SAHT58OFJTU0XxfHFxscXfl2EcXVzQbWRbE0NvSwfePv+uF0eSbMiZ7ZuhUipFSq1l30EcObJZBxvPYKt2RdodOnQQ3kZaXFykL5HqfMiTiAqpSRS98MILwtSRbk+fPr3aRSeURWosemFHpV6DtM7O32PEYi7jP+8NR2fL9kCTRQKJWBKuS5Ysgaenp0iLUmE8CVmGsSR+jevrCrjXn6+Dt7ZGGNxPImndn0pMftOZvwgrQ+3825d+L65TUTa391sfHlJbjQXS8ePHb/sYKqKmuWmMZaHIT05OjrhOI1+oKNsc6LFkg0CF6wkJCcKSYc2aNRgxYoT47gYOHGjhLWdqM9oC7t1LFiDIvynksjeN/JKAF+e6Ih9FmPaGExISgNhYcs4nM1mbbXatbe8Pa9Oeo0hWhIfU1uA2/5qCg5NcRHMqQk5GIX6bs19EjrRQM8gjc7rCw8fZ7Pc1l/nz5+vczCkKRAXX5tCgQQNxSWlQrV8VuZ1TxG/r1q0skBirFHDTgTdm3y5MSCwdeEu1SVGB2Yi+4YVXZjvhx6XFOHfZQXS6sR2AZeH2fnvrYOMU253AAskKkCVBRVNdvkFu6DMmCtt/OQeNmro/gD6PRYn1luD776VQeEUhCwBKsel3G1INUnp6ukiJMoy1IklNut2FxnWfwtxhW5GTHwEP14vwcU1FYsp0fLitLaIvlhrOau0ABg+WcSTJUu39RnB7v/VR3siTrvAMtjuCBZId07xHKBo090PmjXx413G1yeRyMoikmjCqNaKiem1aNCoqStSM+fj4CJ+ol156SdxPXkgLFy4Uj3nsscesvr1M7RZJA8c/L1I5Ls5XxYmJxsUNfn5z8ELvKfhw68AydgBnjhShXj0nm21zTcXZ3R0yhQIalTRFntv7rU/OgUSoMiSri/TfzwFFKrh3sp49Tk2ABZKdQ6LIFsJIC83B27lzp7jesGFD0VlI/PXXX8IQkpg9e7YYDkxeSOSmTe7lNNolNJTN4BjbpNuoKJg6p+jAvPaT96BQbYNcNqBMfdK4ccAbs1UYN0EBZ67jrjKuHD8ixJFXQB0MnjRVRJTYOdt6KDMLkbFKbxyXBkhfGQvnJr5w8OY/dHORaazRC17DoFls3t7eIrJibBpJAoGiLuHh4bquPMYQ3keMNVEpi7Flwdc4sXEwZm5oIuqTaJ6bu5MKOUXSOWKovxLTZwATJjsg+XIhzh8tRtP2jghrzgeTO2H9go9wdvd2dBh6P/o8znNfrE3uyZtI//VcmfUBz7aCS4QPajNZtzh+G8MRJIZhajQKB0dEDeyDnNM/GcxzSys6igPJd+Pb7fWQkOqMF18BZr2pRG6BEzRwFkXeC17LxP/medv6I1Q7QXrp6CFxPbJTN1tvTq0j91AS0v+KLXuHDHAI4BmZFYEFEsMwNR5K8VzJPYWk/MvwcPTBkYwM5Kuy4eOzBaveH4sdO9rjs3/rIDG7NOorjCbf8YJvRBHuGujExdxmci36NArzcuHm7YOQJk0t9ZUyRik1ZUo+ZE4KkUorgwzwHRnJ6bUKUn3sqBmGYSpZwF2gycXNgmsoUOfAOygEqqIi7N7xPbx838A7z0aXeZ4aMjw6zgkNG2qweDHvfnO4cHCfuIzo2AVyuWWNahkpYpQ0/yBSvjuFm18dl8zkjfAdHcUF2ncAR5AYhqmVBdwefv6IPbAHO3/9EZnJSUhNWgy5rF2ZQm6CbQHMQ6NW4+Lh/eJ6405dq/gbZExFjkTE6FaVxDLAOaz2DFivSjiCxDBMrRx4SzYATbr2xJMff43eY8bBy/sGJvRYqTfXDWVsAc4dLx2czZQl6WIsctLT4OjiigYtpeHVjOWgtJpJcaTV+JxaqxQcQWIYplbj4OiIjveNhE9wCIo+ekcYTWZm9cLH2x8qE0367AMVOvcCbtP8Umu5cEhKr4W36yj2K2NZTBZdy4DA/7WFpkgl7ue2/juHI0gMwzAAghpFiqgSmUyGBa/C/MExumgS2QLQ8s8uV7SJKsbfvxZiw885uBItGfExErGHpPRaJKfXrAKJH4W3ntFpScTIub6naOdncVQ5OILEMAxj5MRNHW4RoYa2AOdScvDGhrtwJdEFIx8j4cRWAPqkxl9DesJ1yBUOIoLEWB5VViFUmVLa129MMzjV92RRVIWwQGIYhjEq5E6IOYt/Pv/A0BZAlo0ZA2Lw/Mr/6Yo8hBXAu16459HCWm8qeWb7ZrFPQps2g7ObO/9NWYGC8+ni0rG+J9xaBvA+r2I4xcYwDGMUSWra7S5DWwBNLhq2boeEXKVeBSx0ImnJwtxavQ9Pbd2IQ2v+Etevnz0tbjOWJ/9cmrh0berLu9sCcASJKReaQrN69Wp8//33OHfuHOrUqYNHH30UkyZNgkJR1t9EqVTi7rvvxunTp7FmzRp07tyZ9y5TY2wBSDgF/rYP72/UlCnefvsrP2QolXhhugPi4oDISNQaY8ns1BRsWrSgdIVGI9KUtO94/prl0CjVKIzNENddovws+E61F44gMeVCA2mXLl0qBNGGDRswffp0zJkzB6+++qrJx7/xxhsoLi5GcnIyioq4HZqpWbYARPtBkZioZwVA40i6N0wV1xd864DGjTXo1w+1ylgyPTFBnEwZ+yGRsGQsR+GVTNGpJvdwhGOoB+9qC8ARpGpwdkY/QLaYhj1y5Eg8+OCDutsRERE4f/48PvroI3z44YcGj920aZMQVMuXL0f79u2tup0MYy3o/+DEuZ6o++XzyM5tBE+3i2jQwAGDzo7GnE1dS2uT1DI8+6wahenX0G+wJ6Ja1dwzfPptgkwmIkdaZHK5iLoxlqPgnFR/5NLUDzJ5WXNTpvKwQLICdHalLKx4O/CZHVuw9YdvxPOp/bjfUxPRond/s5/v4OwsnnenyOVlA4yFhYVwctJrKwVExOipp57CihUr4OnpecfvxzDVL/U2Vjhy/zj/GLDJ8P+aRiPHc9MbQjZdjdnTzmD2Ry1Qc2u2euL83l06cTTw2cmcXrMwBeel+iNOr1kOFkhWgMTRF0+URmLuBBJJW5Z8LRZzmfLTn3B0KR2+WVni4+OxYMECIYb0t2vs2LF45pln0K1bN1y4cKHK3o9h7FkU6Ed0m4c5inSbqTElGsjx1ifN8PATaTU2kuQTJEWLIjp1Rf+nJrI4sjDK1Hwob+ZTjhcukT6WfrtaC9cgMWaRkZGBoUOHomnTppg3b55uPaXbsrKyRP0Rw9RWoroFGBhLGqPWyLH3n6uoqeRlScXCQWERLI6sQO6xG+LSqZ4H5C4c57AUvGetAKW6KJpTEbLTUvHjSxMNih8pdE1zozz9/M1+34rUG+3du1dc9/b2FrVGWjIzMzF48GA4Ozvj33//FZda/vnnH0RHR6NeScuOSqUSl8OHD8ewYcPwww8/mL0NDFNd8Q4LwbBHotErPA3HEnzw3JqoMtGk+R8HwsN1BZp174Ezp/LRtpNvjYko5WdliktXL29bb0qNJ/dQErI3x4nrRXHZ4rZ7p2Bbb1aNhAWSFaA6oIqmuvxC6+pcfakjRJvXp/WWgFr5tZ1n+rVHFB0icURQJ5uX0RCqlStXGnSsXblyRaTaSBj16tXLItvKMPZI07H9kdkrEaFn4pFdGIuZGyKh0sggk2ngJFcjNqUeHp82AsUqhUi7yVBzapPysrLEpRsPqbMoysxCpK+MNVhHt52b+LKDtgVggVTNfFgshZ9f2TPZnJwc4WtEUayNGzeKyNLtnkfP0a738eHcOFP7Ikm0/K9OEvo0Oogr6a4I882HJsgD475qgDM3PMvUJj00NhXNWpsXFbZXOIJkHZQp+fSHY4hGWs9z16oeFkjVrBjUmvz666/Yt2+fEDpUe6RPTExMmWgSwzASlPJo18QXrejAVTJR/dWi83j8naZlapO+nrker3zUDvWataz2AsnNi0+KLAn9LZVBVs56ptKwQGLK5fHHHxd1RKYor50/PDwciYmJ8Pev3mfEDFNZSBTpn9W37elustPtq38fxYGzO/DYiC/w8PP3Iig8wqb+ZxVFpVSiIFeKHLvySZNFob8nl+Z+KIhO04kj35GRHD2yECyQmHJxdXUVS0WgESTBwVwwyDDGRHULxPzBpbVJJJYifPMQm+aOg5f74dCnffHjn3vxwICVkKVfQXZeJDzdYnHf88NFut1eyc+W6o9kMjlcPdgHzdLIXR3FpVuHIHgNasjiyIKwQGIYhrHS2f//3vIyqE1qPMAP+3Yo8dk/dbDpgj+OXeuBYz/0kApLIImo+NS/Mb9Nit1GkrTpNRdPT9FMwlgWZVq+tL8jfVgcWRgWSAzDMDasTRoyXIO+z6Ri/7KzePevOth80a90ZIlGhm923Y8WH17EPWM9EdbcfOsOa5Gnqz/iFn9roEorEJcKv6ozAWZMw3KfYRjG2nUkEaVn/zRHy7VlAPrMj8L/nqZaHsMaJTVkeO79xoho6YSFb0hixD4LtFkgWRpNsRqqLMlWxYEFksWp8RGk3bt3i4UYM2aMztCQuHTpEv777z/UrVtXuERT/QzDMIyt/NLaDQ+G/HXTI0to3ZR3vXDPo4XwD8q2myJurQcSm0RaHmVGgci+ypwVkLtLtUiM5ajxEaSCggIxJuObb74RJoZatm7dKtyjz549i3fffRePPvqoTbeTYRiGUmgLXssqd2QJFXf/9v4/WPTcU1jx9mv47rmncGrrRpvuuPySMSMskCyPMrVAFz2qzCByxjxqfARpwIABYjl8+LDBeookHTp0CI6OjkJAhYWF2WwbGYZhtPxvnreIEq1feh3Pf9CoTDTpy9VdMarDabg6eMHDNVa47ZOhrK0iSaU1SOyLZmm4/qgWCaTCwkKsWLECf/zxBxo0aICvvvqqzGOys7PxySefCIFD7sxPP/20wQgLGnVBpoXGdOrUCf379y/3vZs0aYKTJ09i7dq1OHjwIF555ZUq/GQMwzCViyQ9Pt0bZ/asxLd7RupsAVwdVEjIDMXnW2fputwm9Fgp3PYtLZDK82bK5xSb1VCWFGhz/VENF0jFxcWIiIgQYkepVOLAgQNlHkPr+/XrJ0KJL774Ik6fPi1ur1mzBvfcc494TG5urogAGZOfL7VC3k6g0XMpDUf1SAzDMPYCiZCJcz1R98vnkZ3bCP6eiYis8yBGfN3ZoMuNBFT/f5ajXvNWFku7UBpv06IFYuwQvQfNidR6M5VGkNhF22oCyZ872Gq0QKKC6OPHjyMgIABTp07FzZs3yzzm999/F4+Jj49HnTp1xLqkpCTMmDFDJ5DI7flOuHz5sogy0UKEhoYiISFBXDIMw9jjPMa9652Br4263DQy/PmHAp4+X6LLiIeQeSO5Sou3KXKkFUcEXeqn9Uq72DjFZmmKb+SKS5lzja+OsQtstpdpYjyJo1tBA1JpMrxWHBH3338/lixZIsZZhISE3PZ9zpw5I9JoV69exS+//CKKsp999ln8/PPPQny1bt0ax44dQ1BQULmvR5EmWvQn3NcWioqKRAqU6rXc3NzQt29fDB482OAxKSkpQsyeO3dOfFcPPfQQoqKibLbNDFNT5zE27VBoclzJ70cfRMLHq9Bv7bsoKAqvUgduSqtpxZEWjVqtS+tpI0hcpG1Zcg4mQpUiRZDSl58HlGrhq8XU0i426jrTb8sntLf1O9Jul8qjNNoDDzwgptFTTRMxa9YsPPPMMyJcTN1se/bsKTc8/d5774nnapf69eujNpCXl4e2bdtix44dYlgtFbRTt9+ECRN0j9m5c6eIwp0/fx7NmjUT0b42bdqI2jKGYSzb5UZiqWsDqcRgZ8wIzFn3GeZvnIpZq7/EN3NyRPSnslA0yhj6raSIllqlQkGO9JvKPkiWQ5lZiIy/L5Su0ADpK2PFesZyONh79MJ4FhhFMbT3mQMd4GkxxZAhQ8RyO2bOnImXXnrJIIJUG0QSCSKyQ9Cfrda4cWOMGzdOFM67u7sjMjJS1IbRdS1OTk549dVXMWrUKBttOcPU/C63mGPFaNLWAQFZefh2XjJeXt+kjAN3v2XH8cDUyqXanN3doXBwhEpZrFvn7usPDz9/5GWW1H/KZGLUCGMZlCn50vQZfTTSev2ByEwtiiD5+voiLa1kanEJqampuvushbOzM7y8vAwWa0FnCAUXM2xypkACyXjwLKU2/f394eIiFQlSWlJfHGlFlKmaMoZhqi6SNOgxD4S1cIFHt1BE9HM36cA96sW2eOfp6Eq91/l9u4Q48gqsg+EvvwEHZxfkpKXg8vHDuvojGlIrl7PRrqUwKYJkEONqmFoaQaLIz2+//Waw7ujRoyKqRG361QXK35NFfEXJPZKMzDUXtXMr4T0sAu4dgsx+vsxRXiVdLT/88AO2b9+OuLg4ET37559/ynUdp5Qm1YjdymKBYZiqpe2QQMinl61N0kCGN39ohvufSUbzbkHlturfCq0RZZuB96Bxp65oM3AIjqz7GwdXrUD3UWPEfVx/ZFkKYtMNV8gA35GRHD2qzQKJOtQ+/PBDUVz92GOPITMzE19++SVGjx6ti2BUB0gcJby5t5IvAmSuvigWcwl9qztkTpU/q6P6IxJ5sbGx+P7777Fq1Spd958xEydOFN2AZMXAMIw1a5My8fw7XiJypA+JpldfiMe059fjyD8rTbbql0fKtatIjDkHmVyOFr2lk56O947A8f/WIv5cNC4c2ifWcf2R5dAo1cjecV1c9xrUEE4NvXSDjpkaLJCom4za7cnokQqpyfGaWLdunRBAzZs3x9dff43x48cLoUQRjBYtWuDjjz+25WbXSObPny+60LR1XgsXLtTd1717d7EQFBkaOHAgHn74YdEBqA/ZNfz999/YsmULGjZsaOVPwDC1G6pNatIiCYMeDRKRI33WHmqPyzOLMaxVNNTqumY7cJ/eJkWPIjp0hruPVNZAtUfNe/fHqS0bcGLTerHOlVv8LUbesRtQZRRC7ukIz7vqicwAUwsEErli5+TQ9OqytS/6IoqKfakQmJy0STRVN+gPmqI5FUGVWYjkT44YFubJgKCXOkBh5plDRf4jUTpTW29ERdbloRVFZKypL5CoiH3p0qXYvHkz2rVrZ/b7MgxTdQx4JBhvb47G7B+aCfdt6nYbGnUD/8YE4nR8F5yO72zgwJ16PU48z1TaTVlcjDM7t4nrrfoZWnt0GvYATm/dJLrYCIdb/GYwd45GpUH29mviOoujWiaQunbtatbjfHx80LNnT1RXKJxd0VSXPNBN5JiplVNbg0S3HQOlLr6q5u677y6zjvyhaN+Hh4fr1v30009CwHbs2FG37uWXX8aPP/4oxFH79u0tsn0Mw5jH64ubi5qj03sz0bK7NxrVccaKuecwdlkzgy63RXtGIuzdaVDI6DembNrt4uH9KMjOEhEjijTp4xscijrhEUi+FCtun921HfWbt64S3yWmlPxTN8WAWrmbA9y73N73j6lFNUi1HTIBc27iK7Vy2iDn7ODgIPyjqEutbt26wuvo+vXroghb60e1fPlykfKkmqQvvvjC4PmUptPaMjAMYz2oIJsWLYH9ZMAyw7QbRZhupIQjJCDGpKfS0WsAAB65SURBVEO2tji7ZZ8BkBs1ZVCxd/JlPV8ewOZDc2saGrUGWVul6JFHz7qQO3OXoLVhgWTnkCiyVTFeq1athIM2DQomJ3JKwVHkSF/0kCkkdbmVJ7AYhrE9UZ1dTDpw/3L4IYzumAoXBx9Rl+TifBXHNqxDo/adcPXkMfGYln0Hlnk9SslR1Kk8d22m8hREp0J5Iw8yFwU8uvMILFvARzDmllA7f5cuXcRSXocbLQzD2H+X25R3vUTkiMSSu6MKSVlB+GzrbF1d0vhufwOrl2DTb9uQktMKAR4JiDt9Eq36GfqhUb0SpeT0R5BQpxu5azOVh/Zr1lapPozEkdyFD9W2gPc6wzBMLXPgjmyhwKU1CRgwu5Gh+/be++Hn1gNpeTT/UgYZ1IhJ/grf/2uYOqPrVK9EaTWKHJE4GvjsZI4eVRG5R2+gOCEXcJTBo0fdCj//+nUgNhaIjKTxXFW1VbUPFkgMwzC1KJJECxFzWhJBhsiQlldau6SBHH8efg7Tjp9H5/6GqTMqyKaaI0qrUeTIHlJrNHHgdjWb5jzG2uhvU8HZNGSsKqnvKtaIVFtFhtIuXgyMHw+o1TQUHli0iDrGLbftNRkWSAzDMLWQpu2dytQlyaAp46Gk1sgReyEInU2Y45MosgdhROQeSirT9WssLMx5jLUx2CYT0H3UrGOOmKPIkVYcEXRJs8UHD+ZI0p3AjlMMwzC1ti4pS3glEXQ556lUIZqMmT7bGxs3Atu2SQdhe4MiMAYiQ2/avZhnGZuOrB3XkP6X6cfYzXabomQorTlQWk0rjrSQVdUFw4ZDi3H9uv3+jdwJHEFiGIappejXJTVp54h6dT3hlhSLV/+L1BVz+7kWITHZGYMHS2EX/bSNvdS6lDftnsx2NYWSmeWtxIetUm0mt7sSQ2npezCGHBoaN0aluX6b77ompvZYIDEMw9Ri9OuSiElzvdA7/CCupLsizDcfmQUOGLikfWkxt5omHAA7dwI//2zeAdHSQqo8AXErcZSY5YTLGa7oXOiKMNiGcoUP7Wq9NKC5Ao6+B+Pb335b/j4393tZfBvxU1NTe5xiYxiGYXRQTU67d9vivrcbiMui9jRX0bAuibr7ly4te0A0lVqhgyuNZuzXT7qk21WdxlF4OUHhoyciZIB793Kcp2XA7yeC0PWbznj4t9aIaOWs26Yr0YXY8HOOuLzde5pz3+0eR8JH5qYXpyBB9EAkgl/tjIBnW4nLitRI/fab4e2HHipftOp/Lw0aANOnl//5xpsQP/qPrYrUnvH+sYd0HQskhmEYxgA6cLtE+IjL5n09TdQllc0LmTogmjq40u2zZ80XHaKG6GKGuCxPbBWcSxMDXemI5vd4MyEsPHvXF4KDIkV7r3qLS7pdeH87zNgQqStO10bE+nYpRKMWTrj7cQ9x+fr4bCQmStES/fdctKD4tttjTHmPi4stxp6z7mLb/J9orhNE+vu/IlBEjxgyRLo8dcr04y5dkj6z9nshwfvRR6Y/Q2w54mffvtLvavXqsu8hI5Hqbt52G++fJ5+sWlF9x2iYCpOZmUm/DuLSmPz8fE10dLS4ZEzD+4hhqg/5F9I1H959XqOQqTV0xKDL1/tc1MhLbpcuas0ff2g0166VPpduGz5GWhSK0usymUYzZYpGs3OnRnP8uEbz3nsajVwu3SeXqzUfDjmvuTZjp+bg//aL28avc35tsrhfu+QcTNS9/1evZ+i2ky7pdnnbZO5Cn//gpP1ie2Systuj//kJuq39PPqfeeJE6fOJ21BrXn657HMrwqlT0ms7Omo00dGl76N/mKLX//ZbjaZ+/Vt8PqPPsGaN6cfRZ3riibKfzfgx339/6+02tX9ut02WOn4bwzVIjNkcOHAAly9fxoABAxAQYNjam52djd27dwsH2B49esDb25v3LMPUAKhOZnTbZPQOT8eVDFeE+eQjxKsIPi5KvLpBKubW8vDDUo3KwoU0akiKUpiCIhBa6BBIYxyNRjkK1GqZKBjvHZaO2FQ3cdv4dU78moRuDcq2xSdlO+P597xBEkS8lkaGye+W97tUUvBjxnr6vJfTXfHHqSAhbYy35/zxIgQU5ul8lihaZhyBoc/8zTd0TXo+WStQBOeTT+68uPmXX6TLe+4BmjWTIi9XrwLffSd9L6tWAVOmlJkQU24ksF49oLgYeOMN04+jz/TTT2WjRtrPd6taJP3aJ1MRqlttkzXhFBtjFmfPnsWQIUPwyCOP4Ny5cwb37dy5E2FhYZg1axbmzp0rrm/ZsoX3LMPUAOggT4XCId5F6NYgU1y6dQzC6DbJ2DfxIBYOO2sgJOhgN3Ei8MwzZQ/G1FE1bZrp96GDn69v2fVaQfKnMLY0RoMESp0ZrhLdYSdOmBYmxttE6cPX+1wuk0Yk24Pdm4rKFD7TG3yypz5Wnik11NS9llwDr3+PIeW7Uzj22nGsX5hmUviVx61quW73vF9/la6PGSNd1inZXS+/DNSvDzz/vOFnJzFT9rMZdr19/jlw8iTg5ycJrdthav8ap14//liqedKmz3btuv3rVlUnXkVhgcTcloKCAowePRozZ84sc19xcTHGjBkjhBMNtaUo0xNPPCHW0fMYhqn+UF2MfuGw18CGQg9RJMnfrbic6IvpIuKpU8semOkASDUtR3cXlhEqZF654lQd/B1NgkSju5/W07+vbYzE5gu+BnVGCn9XEYkxh6+GncPELvH4ZEKygSfU/MGxaOuTLl6Htk9/iw5cIyWnQfvQTN1zCIquBXsUSUXgX3fGvc/5Yd066T7tZ6bX+uAD0+LE3OJm4/qtlSuBuDjAwwMYOlRaf/jwrV+DhMzvv0sCSn9b5s+XxOrVq8BsGtMHqT7p7rvL32YtdL+px9D2/fMPMG6c9H76EaY5cwwfS/vniSdK9zld3qoTz6JUTVavdmHNGiTKu27dWnX51zth0qRJmmeeeUYTGxsrPveuXbt0923atEmsu3jxom7d1atXxbp169aZfD2uQWKY6g/V+lx7daeoxzGuR6LbVP9iUEciV2sunykQz6W6FG0dEl3SbVVBsSZ1xXmDeidtbZP2+r1Nb4j3W/7ICc3uCQc0d4WlGTxGW2f01VelNTil9UzSbVP1RFS7RLVWtH0bfs7SnPz6olTT9OpOTc6RJPH7u/T9dINt0T5/7eNHNV/dF61xUijFunkDY8rsD6pV2ruFXjtbtw++fDVNIzd6PXPqbWhf6X8mqgPSfi66pPvpmHHbWiq994mL02hatJDWP/WURqNWazT33ivd7tVLum3qe6P3Nv4e9R9jvL9vtfz5p0azbVvpNtGl/u2qgmuQ7Az6+vPyKv48yu9SWFTrPbFggaSszcXNrTQnfKesXLkSmzdvxrFjx5BILR1GnDp1Cq6urmjUiIZeSjRo0EDUINF99957b+U2gGEYu40qUa2P76UMvH85VlePJKIvd8fCOdIHLy4ILF03KBYOy5KROzISTz8djP7dSgbntlQgIDMVSe9fgzpPidFtIOqdtl7yFa+pH536LyYAs/tdEqk+4q3+F9F3cQeDgbtUZ6SNPlDkg1rdKSJDKZoNGyiFpYFKVbJNg2NFFExrxhjmLXlCaTQeyFitRu7+RKSviIHPfUq4xdOPuI/BPqDPlq9UYFjzFFxKd8XHu8Pw4c6GBuNbCKpVuv79eWm7TwE3I30wXJOBzpOcsORIKBYdqqd7TseOQN1y5tOa6grUrwOiYw2l6CgaR8cM/RSjNqVGESrjqAyl4L7/HujWDfjhB0CplCI+jo7S47THEaqNonoi7f6k58+bZ3ib0D6Guti6dLl93VPPnsADDxiuo9eytYcSF2lbARJHFPqsDPSH/txz0mIuOTnmt1maIi4uDpMmTcLatWvhXs4LZWZmwo8S1Eb4+/sjIyPjzt+cYZhqUZ+k9HIW9UjGRdxAMrpOvGy4jsZ7/BUrRn84nEpBczpwngIkuSOJFOdwL4QcTka4b4HJAml6Pen1gRt5TiY9mugA364d8OKL0sFde6CVDvAynFqXhoBTsQjxLDJpxiiTyeAzLEIEjHIPJiFjzSU0KC47u45EFn02YmKX6/jhSCjS8o1qooweRxTGSr+N9Dle73sF4zokYH2MP97eHoEDB2Qi7dSnT1kDR3MLmnNzpWJvEkv6gshY3OjTtSvQqRNw6BCwbJm0jh4fFXVr4WJKyGjXURrwduKIIEFH4s/WgsgYFkiMYOvWrbhx44a47uTkhJEjR+Kll15Cy5YtcenSJbEkJyeL+7UF2D179oSzszNySIkZQetcXFx47zJMDUe4QZfUI2mFixZT64j8kyll1nnfEw6PHnUhU8jgOaAh2p8qgHy5xqBzTSHXCHdvgQxo+2gw5H+YFg1UXBwfX87Be6IflJltpTEjJd1mxsjkMnj2rS8EkvazvD9YL1KmAL54NQshqhLhl++I9ALHMq8j149UlQPd93SnRHgPaogXZzjirbcgFmPXanMKlbUFzSSwTAmiW7lqHzliuO7ffysnXEjgGUeyjG/bskvtdrBAsgKU6jKhIW4J/cemVk39PyT6w4+OLj/8aup9zYVa9KPpxSl07u4uBFLr1q3FulXUH1oieohdu3bBw8NDCKSIiAgRRaJF29qfm5uL1NRUg7QbwzA1u8tNN3RVBnjfHYbM/67cfs6YHo51PYQ40r5m457OJqIgMrR70FDY0GP0007mHnTpubczYlSmGTaaaCNl6T1aoHlvD9Sr5w1lZmexPeei3aBZKDNZBD40ykgQygCvIeHI+veywUiRB4Id8dKrhkXMZJVArirDhgHbtxu+DO0T6lojg0hTqbOKpKlu5YZd7w6FCz3P+Dt87z3g1VfLHtts0aV2O2RUtGTrjahuZGVlCTFAosDLy8vgPurcIq+g8PDwSkdQyD3UOERqy+F/Fy5cQGRkpBBIJI4IEkJ169bFV199hadLNu6nn37Cs88+K1J0wcFlbfKrch8xDGMfkLO0vnDJPZRUdlJ9eeJJBtEdZ0qwUASjvLSQFkoLUYrI+KB75UrlohL0mZLmHzRrW2k7qW3dYBvkGlw4VYTA3HQDAUliiGq4jPcZpaSo/d0UVMmQllZ6m7rBXnhB+nzm7KPbYXL7FZXfh9rX1t8+Wx7bbnX8NoYjSHaMqYI4e4NqjWbPno0XXnhBFHErFAq89957eO2110yKI4ZhaibGERltETcJAJmTApoilU4IyN0cywiG8qI55kRBqHbGVM1NZX8zTUXHyttWU9ESinhJg4BL94V+Ss94n5lKSVENlbOzoTgiPv1UEkja967sZzW9/aiS447x9lWHYxvBESQ7jiDZG1SDREKIzCCbNm1qcN+6deuwZs0a4aRNnWsjRowo93Vq8j5iGMY8jKMnVUFVRFIqu62V3QZT0ZXQUMkh2xiKOFGtUVViqX1oL1QkgsQCqYp3MB/8bw/vI4ZhGPNFiiXTX7WNrAoIJHbSZhiGYRg7gkQPRYb0i631Hb1t6i5di+AaJIZhGIaxc6pL3U5NggUSwzAMw1QD7MFdujbBKTaGYRiGYRgjWCAxDMMwDMPUthRbQkKCWIioqCjhAK0PuUPHxsbC0dFRjNWoKth/k/cNwzAMU32p8REk8ueZOHEi+vXrh+PHjxvcN3PmTAQFBWHcuHGYNWtWlbwfCS0ijybUMibR7hvtvmIYhmEYe6PGR5DGjx8vlgEDBpQRTkuXLsX58+dRrwqr3shJ2sfHRzf41c3NTUyGZqSoGokj2je0j2hfMQzDMIw9YnOBdP36dfz111/igPnEE0+YfMyePXtw+PBh+Pn54b777hOP1XLx4kWkp6eXeQ5FhurXr1/u+/7zzz945plnxPUrV64gLCwMVYV2xIZWJDGG0PfHY0gYhmEYe8ZmAkmlUuHBBx/E0aNHRV2Qq6urSYH03HPP4ffffxejK86ePYtXXnkFO3fuFENTia+//hrbjUccA3j00Ufx0ksvlfv+KSkpuHr1qnjt7OxsMbl+7dq1VZL2oYhRSEgI6tSpg+Li4kq/Xk2C9i9HjhiGYRh7x8GW6ZaxY8dixYoVePnll7F79+4yj9mxYwcWLlyI/fv3o0uXLkJU9e/fX8wDW79+vXjMRx99dEfvT2m1oqIi8TpqtVq8Pk2pp1qlqoKEAIsBhmEYhql+2EwgOTg44P7777/lY0g8tWrVSogXgsQGpcWefPJJMU/ldnNUiLS0NFy6dElEiajeyNfXFy1atMDo0aMxefJkbNmyRbwWpfrq1q1r8jUKCwvFooUezzAMwzBMzcWuu9gopWY8NZ5uUyQpJibGrNc4cOCA6GKj51A6bvbs2WI9ia4ZM2aICNR3332HRYsWlXkvLe+9954YbqddblXbxDAMwzBM9cfmRdq3gjyKwsPDDdZpC7TpPnMYMmSIWExBNVC03A6yA9CvZ6IpwA0aNOBIEsMwDMNUI7QZIHO8Cu1aILm7u5cRISROtPdZC2dnZ7Fo0W4TR5IYhmEYpvpBZTeUEaq2AqlJkyY4ePCgwboLFy6ILrHGNM7YRoSGhuLatWvw9PS0qccRCTUSabQt5tRjMbxv7QH+u+V9W93gv9mas28pckTiiI7jt8OuBRIVcX/77bc4efKkaMOnD/bjjz+ib9++otjaVsjl8io1l6ws9EfFAon3bXWD/25531Y3+G+2Zuzb20WO7EIgLV68GDdv3hQmkElJSZg/f75YP23aNOGXM3jwYOFnRJePPfYYTp8+LYquyQeJYRiGYRimRnaxUZgrIyMDPXv2xJgxY8R1WvSLp3755RfRZUZmkvfcc4/obKPWf4ZhGIZhGEth0wjS1KlTzXrc0KFDxcIYQoXjZFugX0DOVA28by0H71vet9UN/putnftWpjGn141hGIZhGKYWYddGkQzDMAzDMLaABRLDMAzDMIwRLJAYhmEYhmGMYIFUTVEqlYiOjsbFixfFnDmm6rly5Qp2794tOiuZquPGjRs4evQo8vLyeLdWIcnJyThy5AguX75s1hgFxjS07+jv8/jx4+XuouLiYnE/dVXzvjYfGvq+d+9eMUC+PBISEnDixAnR5W5rWCBVM0gMUcU/uYCOGjVKmGaSq/jmzZttvWk17iDeo0cP3HXXXdi/f7+tN6dGQGOCaPZho0aNMGHCBDRr1gzLli2z9WZVe3JzczFs2DBERERg/PjxYhA3GevSwZupGJ9++imioqLQv39/PPnkkyYfQz58NItzxIgR6NWrl9jXJEqZ8klLS8Mrr7wi/u8PHDgQn3zySZnHbNy4Ee3bt0fHjh0xduxYBAcHi+fYEhZI1Yz8/HwoFArExsbizJkzuHr1qjjoPPDAAxzpqCLojPCJJ57A448/XlUvyZQMh6YDCUXmDh06JA7gHP2sPHSwobNy+k2gCNL169fh7++P559/nv/uKgD9LcbFxWHNmjV4+umnTT6GhqTT3zEZGNPfcWJiojiQk5ExUz7x8fHib5KibuX5GFI2ZMmSJboI0vbt27FgwQKxzlawQKpmkGHmm2++qbNKp1lwEydOFPNsaCQLU3k+/PBD8WP5wgsv8O6sIuism6KcX375JQICAsQ6Nze3cs/SGfOhaQTh4eEICQkRt52cnMRZOK1nzIdOPCmC1LRp03Ifs3btWhENee2118RtBwcHvPrqq9i3bx/OnTvHu7scSBTNmDEDgYGB5T0EkyZNQtu2bXW3O3XqJP6OqczBVtj1LDbGPOhsnIQShS+ZykHDkelHks7EbTmIuKaxZcsWcQbZrVs3xMTEoKioSKSGXVxcbL1p1Z7Jkydj1apVmDVrFnr37i3OxGkCwTfffGPrTatxHDt2DGFhYeJvWUvnzp1191F6jqm61DFFmYcMGQJbwQKpmkPhyJdeeglPPfWUXQ3QrY5QFO6RRx7BwoULRY0XzQdkqu7vlM4eaVwQpYJo4DPVeX3++eei3oC5c6j26JlnnhGptn/++UdMRacaGqqfY6oWih7piyPC09NTzA6l+5iq47nnnhMROqqrsxWcYqvGpKSkiEG+FBKm1AVTOShUTsKIDuQU1qVoEkG1XjQomblz6ABCKQhqKiCBdP78ebz11lviwH7hwgXetZXgjTfeEPMqqauVuq9IIFGtDBVuM1X/d1xQUFCmo5gWSm0yVcPMmTPx999/i3owbUreFrBAqqakpqZiwIAB8PPzw7p16+Dq6mrrTar20JkgFWiTUKLlnXfeEet/+OEHLF682NabV62htARB9XJa6MyQDizcJVg56P//yJEjhbgnKG1JRcZ79uzhqEYV07BhQxEN1W/t196mzjamagT/V199hf/++0+XvrQVLJCqIRTKJXFEhdrr16+Hu7u7rTepRvD++++LyJF2Wb16tVj/0Ucfibok5s6hSKe2m8X4wHKrwk3m9tD+o841fSiKRBENLy8v3oVVCLWoU+SeirK10O8ENRyQLQhTOagB6YsvvhDiiOoVbQ3XIFXDNn/6T0odKvPnzxeFgVqoQNCW4UiGKY82bdoI2wSq8aJiYiqAf/fdd0WnSr9+/XjHVQJq5yebD0pLaFOYc+bMEV1BVMPBmA+1oVN6koQ8FQlrO6joYE1dbh06dBD+c/S3TBFm8vaijjaKelCHMWMatVotrCgIMoAkewTat3Ry365dO7H+gw8+wLx588RxjR6v3fe+vr5o0aIFbIFMwzag1QoqHCYfDlPMnTtXFGcyVRepozqOjz/+WJjvMZWD0mlff/01/v33X3Hg7tq1q7BS4Aho5aGDCaWCyceHTpKoGJ68eagYnjEfanYhgWkMRTS0Aog6MKm5gGwrnJ2ddYKJuf2JvTHUeb106VKd0Nc/4ddCvxMUxbcFLJAYhmEYhmGM4NMLhmEYhmEYI1ggMQzDMAzDGMECiWEYhmEYxggWSAzDMAzDMEawQGIYhmEYhjGCBRLDMAzDMIwRLJAYhmEYhmGMYIHEMAxjJuScTEM0K2qSt2LFCoP5XQzD2D8skBiGYfSgMQe///67mLllDI2U2LFjh+72X3/9ZVL8kCPwli1bxHUaJE3zpcjpmmGY6gM7aTMMw+hRUFAgRM2uXbvQs2dP3fqrV6+iadOmuHz5MkJCQsQ6Gj9BM7uWLVuGMWPG6B47depUHD58WDdPioZKP/vss+I1eD4aw1QPOILEMEy1RaVSiSGY69atw5UrV8rcT+to2vqJEydEZIiiPTTPkCguLhaRovT0dJw/fx4rV64Uc7i0KTSKANH9NIeLoDlyNOtQK47050lRZKmwsLDc7Rw8eLCYRbdq1aoq3gMMw1gKFkgMw1RLKAXWunVrjBs3Dt999x0GDRqEadOm6e4nQRMVFYXPPvtMDCG9++67xQBXmthOUOTnkUceEZGfoUOH4rfffhPRIRqmS1AEiQSNNlVGIqxfv35ltoOGbFKd0VdffVXuttIk+F69eonXYBimeuBg6w1gGIa5E3755Rcxrf7UqVO6qfXaCE1CQgJeeuklfP/997rU18SJE7Fp06Yyr0ORpejoaDg6OorbJGQoZTZnzhxdio2iQ/SY5s2bl3k+pdlmzZqF2bNn4+mnn4a3t7fJ7W3VqhX++OMP/rIZpprAESSGYaolVCdEXWVU16NlxIgR4nLNmjXw9fUVESMtM2bMMPk6kyZN0omj8khNTRWF2PSappgwYQL8/Pwwf/78cl+Dnmuq8JthGPuEBRLDMNWSsWPHYsCAAWjZsiXatm2L6dOnixQZERcXh4YNG0Imk+keT7e1kSZ9jGuKTEFRIm1azhQksObNm4fPP/8c8fHxJh9Dz/X09DT78zEMY1tYIDEMUy1xcXHBkiVLRFTm008/FaKoffv2Itrj7+8viq/1oWgTpdOM0RdR5eHl5YWgoCCdADPFQw89hBYtWuDNN980eT89l7rgGIapHrBAYhimWqKN1FCqrW/fvvjmm2+QkZEhOtKodigmJkbUDWmhLjVzcHZ2FhEhavfXhzrY9uzZU+7zSGi9//77+Omnn3DmzJky99NzKeLFMEz1gIu0GYapllDXGRVlDxs2DIGBgfjzzz/RuHFjkW5zc3PDyJEjcc8994hibRJOixYtMpliMyV0KBJFUank5GQRjaIOOPIxuv/++0V3HEWvTEFdbiSCNmzYgB49eujWk2C6cOGCgVcSwzD2DUeQGIaplrz88sv48MMPRUqNojMU4Tlw4IAQR8Svv/4qxNHRo0dFao0eo1+M7eTkhIcfflgUVxuzfPlyIbSo5V/b5t+nTx/RiUYRIi0PPvggIiIiDJ5L20Svqx8tWrBggSjkJiHHMEz1gJ20GYapNVDkh6JOFBG6E8hSgATSRx99ZPZzyCOJOuXIj8nHx+eO3pdhGOvDAolhmFpDZQUSwzC1B06xMQxTa6BOM3Pa+hmGYTiCxDAMwzAMYwRHkBiGYRiGYYxggcQwDMMwDGMECySGYRiGYRgjWCAxDMMwDMMYwQKJYRiGYRjGCBZIDMMwDMMwRrBAYhiGYRiGMYIFEsMwDMMwjBEskBiGYRiGYWDI/wGm/vTtywq6nwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1)\n", + "\n", + "ax.plot(np.sqrt(N), er2, \".-\", label='-2')\n", + "ax.plot(np.sqrt(N), er4, \".-\", label='-4')\n", + "ax.plot(np.sqrt(N), er6, \".-\", label='-6')\n", + "ax.plot(np.sqrt(N), er8, \".-\", label='-8')\n", + "ax.plot(np.sqrt(N), er16, \".-\", label='-16')\n", + "ax.plot(np.sqrt(N), er24, \".-\", label='-24')\n", + "ax.plot(np.sqrt(N), er32, \".-\", label='-32')\n", + "ax.plot(np.sqrt(N), er40, \".-\", label='-40',color='b')\n", + "#ax.plot(np.sqrt(N), er48, \".-\", label='-48',color='g')\n", + "#ax.plot(np.sqrt(N), er56, \".-\", label='-56',color='k')\n", + "#ax.plot(np.sqrt(N), er64, \".-\", label='-64',color='y')\n", + "\n", + "ax.set_yscale('log')\n", + "ax.legend()\n", + "ax.set(xlabel=\"sqrt(N)\",ylabel=\"max error\",title='Resolution Comparison')\n" + ] + }, + { + "cell_type": "markdown", + "id": "4cda5379-09d0-4d3f-af11-73f13b1b23ff", + "metadata": {}, + "source": [ + "__Comparing the relationship between minimum pole order of magnitude and maximum error across different tuning resolutions__" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "69e8671c-41ff-4367-a638-d5ffa30d7647", + "metadata": {}, + "outputs": [], + "source": [ + "def oom(number):\n", + " \"\"\"\n", + " Returns the order of magnitude of a number.\n", + " \"\"\"\n", + " if number == 0:\n", + " return 0\n", + " return math.floor(math.log10(abs(number)))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e4c2859a-d74f-41fb-820c-5829be5f74b0", + "metadata": {}, + "outputs": [], + "source": [ + "def pole_er(t_res,er,res,ax):\n", + " t = np.logspace(t_res,0,2000)\n", + " #i = np.argmax(er)\n", + " i = np.argwhere(np.diff(er)>0)[0]\n", + " \n", + " a,b,p = coeffs(N1[i[0]+1],N2[i[0]+1],res)\n", + " r = rat_approx(a,b,p,t)\n", + " er = abs(r-np.sqrt(t))\n", + "\n", + " mag = oom(p[0])\n", + " #print(p[0])\n", + "\n", + " #fig,ax = plt.subplots(1)\n", + " ax.plot(t,er,label=res)\n", + " ax.axvline(x=abs(p[0]), linestyle='dashed', color='g')\n", + "\n", + " #ax.set(ylabel='approx error')\n", + " ax.set_xscale('log')\n", + " ax.set_yscale('log')\n", + "\n", + " #ax.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ac0c7f67-0e2a-4f04-bd77-611469bdbed1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " minimum pole and max error intersection\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHVCAYAAAB8NLYkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlcelbwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAzjJJREFUeJzsnQd8FNUWh096b6QCCS2h9957EWmCiCBFUBHFLlZUVMQnNqzYxYJYERXpiHSk995LaCEJgfS+7/e/m9nMbrbMJtv3fO+NOzs7zM5O5sw991QPlUqlIoZhGIZhGMbp8bT3CTAMwzAMwzCWgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZxE06fPk333HMPDR06lL755ht7nw7DMAxjBVixYxg34f7776e+ffvSvffeS2+88QatWLHC3qfEME7H3XffTfHx8fY+DYYxiDe5CaWlpXT58mUKCQkhDw8Pe58O4wCgm15WVhbVqFGDPD0dY45TUlIizsUa9+jy5cvJ399frC9atIjS0tIU/1uWH8YZ5MfafPHFF9SuXTshS+bA8sPYVH5UbkJycjJ64vLC16DCPYB7w57k5eWp5s+fr+rcubM4n9mzZ+vd76OPPlIlJCSovLy8VM2aNVOtWrVK81lBQYGqa9euepfDhw9r9hs8eLCqcePGqiFDhqgKCwsVnyPLDz87HFV+5HK0ZcsW1ZkzZwzuk5KSotqxY4d4NZeDBw+qHn30UVVGRoYqMjLSrH/L8sPyQzaUH7ex2MFSB5KTkyk0NNTep8OYMatJz00X65GBkRa1ZGVmZlJCQoLm3rAXy5Yto9WrV9Pbb79NY8aM0bvPTz/9RM888wz9+uuv1Lt3b/r4449p2LBhtHfvXmrcuDH5+PjQm2++qfff4jdKzJgxg1JSUuitt96ihQsX0tixYxWdI8uP+8qJo8tPenq6uPchIxkZGTRlyhT64IMPKuz35JNP0meffUaJiYki3nTq1Kn0/vvvaz6He1WfFfvnn3+mgQMHivCFefPmUUFBgdnnyPLjvnJiD/lxG8VO+gNCqWPFznnIKcyhxA8SxXr29GwK8g2y+HfY2zU/cuRIsRhjzpw5NG7cOLrtttvE+xdffJF++OEH+uSTT2ju3LniN3Tr1s3gv79w4QJdvHiRunTpIt5DIdy1a5dixY7lx7GxhZw4qvxgsh4TE0P79+8XCpg+vv/+e/ryyy9p+/bt1LJlS3H/d+3alVq3bi1i5gCUPQz8uvj6+ooJFSZCf/zxh9gG5S4qKkpxOAPLj2OQY0c5saX8uI1ixzg/eYUlVFhUSBFBvuRO5OXl0b59++jxxx/X2g7L3X///afoGBERESJ5Asod4viKi4uNxglh4JJbJjC7ZJyH6zmFFOLvTT5erh/71qpVK7EYA1ngsHBDqQNQ6AYPHiy2S4qdn5+fwX8/evRoGjFihFi/efMmNW3alC5dumRwf5Yfxye/CM/BIgoL9CFXgxU7xmno/Oa/VFTsS/2bxNJ7d7akEH/XE0h9pKamiuDr6Ohore2wUsCtqgSY+1etWkXHjx8XVokGDRoYDdidPXs2zZw5s8rnztiepxfupxUHMygq2Jc+vqsNdU6MdPs/Ayx0KPMjp0OHDvT6668rujaQFSnxKD8/36QiyPLj+HR7ay3lF/nQ6HYJNGt4M5eaBLnOL2FcnoLiUvH6z5EUembhAXJ3oOyZa8Zv2LAhNWrUyGQW1vTp04VlQlrg7mKcg2UHr4jXtOxCmvLDLkq+nkvuDKzTyD6MjNRWcPEelmhYsM0hPDzcqLUOsPw4PjmFJQTP+y87k+nd1cfJlWDFjnFobuYWadan9qxHi6Z2Jh8vD1p5+Cr9d0p5uQ5nBpY5KGLXrl2rYMmLi4uzynfCGiHFo3JcqvPx8pAm1KZWOGXlF9Pbq1xr0DIXLy8vIT+SpU0e4oDt+NxcjFnrpM9ZfhybNrXC6cMxahf+15vO0pnUbHIVWLFjHJqFe8otRQ/1SqK2tavRuI61xfsvN50hdwAuoLZt29K6deu0tv/777+aZAiGkQgP8KFxnWoJ9xJYsv8yXUh3X6sdrNrIPtS1suF9rVq17HZejO0pLlF7fcB93erSba1qUp9GMVRSqqKvXGg8YcWOcVhKS1X0285yxc67LAbi7s5qxW7TyTS6lqU9C3dmdxEWycWKdbxKoNQJyi4gOw+WOpQtwcD06KOP2vGsGUekd6MY8vP2oqY1wqhbUpTY9vuei+TO9O/fn5YuXarJesXrkiVLxHbGfTh46aZmvUd9dczylB71xOvS/VdEgp4rwIod47DsPHedLmYUUriqH41rPoG8PdW5PvWig6llQriYZa09qu2edEaQ0ACrHJarV6/Syy+/LNblwd6jRo0SteteeuklqlOnjmgHhvp39evXt+u5M44BZCPedyAFFfelbokxmu0jWtcUr/8eVZZk44wgRm7z5s1iyc7OFh2GsI5McnnM2/nz52nSpElCoZs4caLIEH/++efteu6Mbdl+5qaQkQYhQ8jfR11doUOdalQjzJ+yCopp21l1jTtnx+kUO8QZmdMKiXFeVh9JIQ/yoXuavEMLbp9Pft7lcS29GqhnW5tcIM4OCQ2SxU6+QHGTg8KrJ0+epJycHFGDDuVOGAYUlXiRd+YjFFX0JPVoUENzUXqUycnhy5mUnm1+YV1nALFyUNCwoLYcFDusf/jhh5p96tWrR1u3bhWFvFGUGLXp8B7bGfdh9/ksISMzuszVjCeenh4aOdly0vnHE6cqd4KK4vfdd5+o2wVBHjRoEC1YsKBSga+M4wNXCbJfwYAmsRU+714/ij7896RIoMC+9i6SyjD25PjVTJHhFxfqT7Gh6rIcIDrEj+rHBNPJa9m0/+IN6tOooiw5O8HBwcJCZwpkg3/99dc2OSfG8VCpVHSozBXbKiFc6zOUBEJ27O4LGeQKOI3F7uzZs8J8DlcVTOioIA6rBeOaYCC6cD2XfLw9qE3tQFExXF4VvkV8OPl6eVJGbhElX8+z67kyjL05cjmTSimfEmO9K3RPaFYzTLMPw7grFzPy6GZ+EXl5FVDNCE8tOWlaQ91m9PjVLBHi4+xY1GK3ceNG2rNnj2jrgtmRLnAhrVy5UgR/o/J3x44dNZ8VFRWJWCNDrqo2bdqIRUolh0kdsUaMa7K5zCTerk4Qxb4XXqEFjK+3JzWqHkIHLt4UAbG1IgPter4MY08OXk6h5IA76KeLRF8WabdKalI9lP7ce0m4YxnGXcH9r6ICOuN7B1V7R3s8qRMZRH7enpRbWELn03NEHDe5u2K3YcMGevjhh0Xhxi1btog4B13FDr0qe/bsKfZBOxYEs6JPJXpdAih7hhqgo0F6jRrquJHCwkIaP348vfLKKxQb63puBUbNtjPqINaOdavRLwZqgcISAcXuwKUbNLhFdb50jFtbuA2RFKsepM6m5djwjBjGsTh21fDEBhUXkmKChfJ36lo2K3aSBe2XX36hZs2aGYx1mjZtmiimCqserG3btm2jzp070+233059+/YVituhQ4eM/mFQAR/K3+TJk002TWecu8zJ9rPXxXqHOhFEBsJnYIkAJ1Ncp7Akw1QGY3XqEiLU1mx0oOB4VMZdOWdiYlOrWqBQ7C7dcP7QHovE2HXq1EkodYZAxW+kmCP5AUqd9G/gjv3tt98UfQdi63r06EEDBgwQrlkogWgTY6wJM9rFyBfGOTh2NYtu5hVRkK8XNamhjg/SR73oIEUCyzCu3sw8NbvQ4OfxEQGaFko3ZJ1cGMadOGeiSLckJ4jFc3Zskjxx6tQp4ULVdc/i/ZEjRxQdA/uhXtG8efOE1Q7Lzp07jTZhDgsL0yyoPM44lxu2XZ1qRhsz141SK3ZIsiiSVRRnGHfiYobxAcvfx4tiQtSlHZJN7MswrsoFEz2T42WWbWfHJuVOJMsa4uvkREREKFbs+vTpY9JVKwcxfHD/SsBix8qdc7C9rEhkp3raTbt1iQ3xpwAfL8orKhGzLEnRYxh3QklWeFyYP13LKqDULNesZccwxsjML6LrOYat2qB6mLpMUIoLyIhNLHaBgWpNWNd1CmVL+szScBNm5wQxQHsu3BDr7RFfZwQUlqxdlg3L7ljGXTFliQCRQeoq++lGXLYM4+oxqNUC1aFg+ogMVsvI9RznV+xsYrFLTEwkT09POn36tEiYkMB7bonEyLl8M19YFbw9PdT1tzyK6I4md4jPvDwrFqOuGR4gYvKu3HSNnrEMYy6Xb+aRB3lSk/AB1KRGqF45iQxWu2LTXGDQYhhzuVo2PtQID6L61fWPJ5FBfi4z+fG2VWVwZL6iUwRKlYATJ06IIsNobs4wEvvKrHWoUYfYICIvWjhqoVEXE7h60/kDXhmmMqRlFZIH+dLDLT+hh3olGbVGuMKgxTDmkpJVptiFhdLXBsaTamUyglp2eYUlFODr5d6KXXJyMi1atEjzftWqVaKfKzJl+/XrJ7a999571L17d9HYvFWrVjR//nzRFmz48OGWOAXGRdiXnKG35Ysh0EIJXM1kix3jnqSW9YCNLrPK6SNKY41gix3jflzLLJORkPJ2e7qE+HmLbkaFJaWUnlNA8b6B7h1jh96t586dE8vjjz9OkZGRYj09XR0ED6DkIfkBJUvQZeLtt9+mxYsXc49PRot9yWqLXct4ZYpdrGSxKxNchnE3pIQI9IU1RDUpxs5EADnDuCLXyix2saGGZQQ1eCU5MZVo4RYWuwYNGtAHH3xgcr+aNWuy65UxCEqWoD0YaF1LrdihR2zwbHXlfHkLmAqZTBxjx7gpadkFok9s719iDcpJsL/6UZ9dUGyXc2QYR7DYhQaUksdMD4NyEhbgI7w/mXnOLSc2yYplGCWgAXN+USmF+HtTvShlvfpiykzr0oyMYdwJNCxX4l6FmwnksGLHuCHXyqzaMaFqi5whgvy8XGICxIod4zDsv1juhkUpEyVElKWvo1MFWpExjDuRkVtIuO0NdHLUEFSm2GXnO/eAxTCVQXKtRgSaUuxcYwLEih3jMBy5rG77JsqcKCS8TFAxuGXxoMW4GZjQgOCyAckQ7Ipl3L1AMQgNMFzHDsBbBHIKWbFjGItw5IpasUMtLqX4enuKnrKS9YJh3AlpMiO5Wg0hfQ4XE4qAM4y7UFqq0rhWQ/yNK3ZBvmo5cXYjAVvsGIeJFUKMHWhSXbliJ7fasWLHuBtZZZYIySJnysUEyzZa8DGMu5CVj8mMej1UoZw4uyvWJgWKGcYU59NzRGFIfx9Ps3u+hgf60KUbeXSjzC3FMK4OkoVC/X3KLXYYsNQGb70E+nqJODwMcLBeBJZZJhjGFTmRkkVPL9wv7vUn+jUQ2zC2+HkbLzoshTSwYscwFnTDNopDS6TySHC0fRlUf5BmXR9SQOwNdsUybsC7q47T3HWnRM2tO9sliG0h/n5G5QQ1uoJ8vcVAl1NQQhRi67NmGNtZsSd+s0PTZvKxn/eKV0yETI0nUrcJVGdwZnjaxjhU4kRjHTesv7c/LRu7zKTFDmTksMWOcW3WHEkRSp2U6ff5htNiPdw/iObfZVxO/Lw9CZVRCoude9BiGGPMWX1CKHUYF27klo8JSJwwNZ5ARkBBcUkFj9Kpa9m07vg16l4/mm5pGqf5LCUzX4QR1YkMoviIAMUVHawJK3aMQ3C0EokTuplMuU6eycQwpuJQ31h+VKy3iA+jAxfVxbzlMmAMfYMWLHizlhyhc+k5otzQt5M6UOfESP5DME7Jtcx8+mn7BbH+8V2t6YM1J2n3+QxF8XXaMlI++UGy0Z1fbKWUsiLHC7ZdoCf7NaCHeifSvM1n6c0VxzT7PtI7iR7tm6Rx+aLoPiZg3p4eFGmk5Z+l4eQJxiE4ekVKnDDfRyTFC+UUclA447qsOHSFzqTliOr430xqT3LDgKlsPymDHMgtdgt3JdOvu5Jp+9nrwv00Z/Vx65w8w9iArzadEb1e29WOoG5JUZQUHVzBzWqOjECp23H2ukapk3h/zQmq/+IKLaUOwJr+0p+HNO/PpuVQxzf+pf7vbyRbwoodY3dgNUAbF5AUo63YoaVY0BtBYsG6ocBwkOvkmUwMY4wvNpwRr5O61KGoYD+KjyhvUu7tVWBSTvQpdufTc7X22XU+g578dR//IRinjK37scxa93CfJBFXmlAtQPM5rGimxhPJ0iZZ7GCRG/3lNrPOY+Hui3SorDUmrOxAHjduC1ixY+zOmdRsTRNzWCN0yS3KFYsh2GLHuDoYKNBH2dfLkyZ2qSO2xYWq2+lJSpspOZEPWrBE3P3NDvruv3MV9vtz7yVKLWvBxDDOwuJ9l0VlhcToIOrVIFpsi5XJiORmNSYnuuEKry9Thz6Yy4R527UVO1OtYSwMK3aM3TldpthBICuD1N+PY+wYV+W3XcnitX/TWJENC2LDKg5axpAsdlDsLt/Mp40nUg3uy72XDQOlOD8/n0pKOPTDkfhlp9pad1eHWsJaB+SGAn8f065YP59yq7bUhqwyZOQWiRJcbLFj3JbT19Qm8URZPIQ5aCx2KOPAMC5GflEJ/bX3klgfXVbeRN4nGfh4KYgf8iobtEpK6erNPKP7XtBx0TJEGRkZNHbsWAoPDxfLV199xZfFQTh48SYdupQp7vGRbeI12+WKnaLJT5kcnb+eSz3fXlelc+r65loqtpMrlrNiGQey2FVOsZNairHFjnFFVh2+Spn5xVQzPEAEhEvI+8NK1jgl1oiCohJNjS9DTP1xDy19tJtZfZtdnUceeYRyc3Pp3LlzFBERYe/TYWT8tENtrbu1eRxFlFm0QVigeRY7Hy+1AiYvk1IVbuaprX6s2DHuq9jFVE6xk7Kd2GJnnEaNGtGpU+oaaKCgoIC8FFh6GPsiWetGto3XqpElz4RVZo1Q77Noz0Xadua6yf1/2Hqe3rqjBTkLN2/epC1btlCdOnWoSZMmevc5ffo0nTlzhurVq0eJiYlan0Ee9PXR9fX1pdLSUvrtt9+E/MBaxzgOmND/ve+Sxg0rJ0CmzCmREe8yxc5S3PvdLvHKyROMW4EHqZSZVyeyPMvPHCRrBWoGMYYpLi6m9PR0ER+EhZU6x+dmXhFtPpUm1oe1rK71mbw/rBKLnbSPEqUO5DpJT9mUlBS6//77qXHjxjRmzBj68ssvK+wDxeyee+6hli1b0quvvipe8R7bJaDoSW5W+bJ48WK6evUqhYWFiX/r5+cnvuu///6z8S9l9PHPkRRR6qpWtUDqWLea1mfyFmJKFDsvT+ukHdi6ZDEnTzB2JT2nUARzI9a1elh5arqEp4cn9azdUyxY14cksIgdcmYyMzNpw4YNdOGC2q2gD3y2bds2oaBVBlgqYNH43//+V4UzZWzFv0dTqKhERfVjgiuUAgrUskZ4mZQTnzKLnVJK9VivHJHU1FTq0KEDnTx5kho0UPcF1QXxcIsWLaI9e/YIq96uXbto4cKF9PXXX2v2uXjxombSI19GjBhB0dHRdP36dRFjB8veiy++SI8//rgNfyVjiL/3XRavw1vV0CRNSKA/rFxpMzWeoJCwNTh5Te2VshWs2DF25VKGOog7JsRPr9UhwCeA1k9aLxasGxuwipy0VVJycjI98MAD1LBhQxowYAD99NNPFfYpLCyk0aNHC0vBlClTqGbNmlrKGQYbb29vvcv27erU++PHjwvLw8qVK4VbCZYIxrFZfvCqeL21uba1DsjlJdQ/yKSceJpZcmHZgSuixqSj06xZM2GxCwoynFU/f/58Gj58uEbxQ1jCbbfdJrYrAVa6Pn36CHcvJmBYsM0QkEdpP2lhLA8yVzeUZXcPa1Wj4t/Nu3zyU6JSmRxPbO0ytRas2DF2BSnhAIHhlcXXyS12Z8+epTZt2giLAywD+njrrbeENe/YsWN04MABWrZsGc2YMYPWrFkjPscgo8/agKVjx45iH7hefXx8xEAIl9Xeverm2IzjFlzdeFI9aA1qXt6bUp8FTombKa/IfCXt47UnyRXYv3+/cL/KadWqldiuFFj3PvvsM2H1/vnnn+nzzz83uO/s2bOF61ZaEhLKs5kZy7H84BWRedq0RmgFi7auXCjpkWwti52t4axYxq5cLlPsalRBsZMGOGdtbt6jRw+xGOPbb7+lu+++WzNA9O3blzp37iy29+vXT2yDdU4JCCD//fff6eWXXzZqccAiwRYH27P22DVxT9eLCqKGsRUHLV9vD7PcrJVJLkK3i6Y1wkTZiJ5lRV+dMbY0JyeHqlXTjr+KjIyk7Oxs8bkS2UEIw7///qvoO6dPn07Tpk3Tkh9W7qznhr1Nj7UOyJONSmTxlIZgix3DWICLZa7YmhH6FTu0fYl+J1osBlslyepzuSJw/8Cq17ZtW63teK/U6nb48GGNa7ZLly40dOhQGjlypMH92eJgf1Zo3LBxFWKHdJW5gpJck3JS2XJAj/28l97S6YnpTOCe9/T0FKVK5OA9rNhKJ0TmAAt6aGio1sJY3tuz49x1EZ89tKV+xU4OSsqZGk+8rZQ8YWvYYsfYFanCvbw9ki5pueqsQNNZsc4R7F2ZwqhA1+IQFRWl+cwUTZs2FW5ZKAhKsmHZ4mBfoIStP3FNrN/arGJ8nXxCAzzIw6ScVMWibeOOSBYH1jYkR+jGtmI749zWOmTC6ku800XKBTImJ85+n0u4hnrKOC3p2eoCjpHBhgORTSENcGjfIrVwcSVQRwvk5eVVsDhInykBlgmlJU7Y4mBf1h9PpfyiUlHCAfFD+vCRxQ8pMjS4yqhVCQYOHCiShaQ2YHC//vXXX2I745wsLqtdd1urmor2V5HpsUHuunVm2GLH2BWpH1+1QOUKirEBDrXsvDxdq+hubGws+fv706VL6geZBN7Xrl3bbufFWDco3JgbVtdipyTjtSpDliPrhFDSkOktD1tYunSpSFro3r27xgKNuNI77riDbr/9dlH65MaNG/T888/b+eyZynD8ahYdu5olOkUMMmDR1kVJ9R4X0evYYsfYl4zcMsVO1gbGXOSZTK5YpBhWtt69e9Pff/+t2Qa3Kgaz/v372/XcGOv0hkXiBDA2aMmVOWuPR3D1OipI8kGGKhaUDIJVDuuoUycRHx9PO3fuFEWI//zzT0pKShK17LCdcV5rXa+GMVptw4yhUqDZOfJ9bg5ssWNsCoRryYErtPvcdRrRJp4yynryRQZXXrGTD3BfbTpLT/arr7Fy4AHw0l+HqEeDaPpkbBtyROBS3bFjh2aQQsuj9evXi5i6Fi3ULZ1mzZpF3bp1o0cffVTU00J1/cDAQNG/knEtUJcrt7BElABqEW+4V6vc/WrIqmdJZdNRQf06WOhMUatWLXr33Xdtck6MdceQxSayYfWhJEqHLXYMUwneXHlMZNl9v/U8Df9kiyYmLlzhrMuUMH7070kaNncLnU1TZzwVFJVSVn4x5Rc67sCUlpYmWhVhQZLDiRMnxPqCBQu0MmBRMR/lGSTLxNatW7kZuQuyQnLDNjPshgVecoudlQ0Ntq6czzCG2HMhQ2TEBvl6Ud9GsRbtpOLhyDEHZsAWO8ZmLNl/WdTFkuoFSUodGjXLK4TLQduXdjXaadb176MtjAcv3aS+c9bTpuf6aITZkQUWlgRY6EyBIsaoW8e4LgXFJbTm6DWD3SYMBXp7e3qZlBPXSyti3BHJWndLszgK8FUeT61SMJ448DBhFqzYMTbhZm4RzVxyWKw/3DuRQvx96M2y2lhBfoaFE21fdt6/0+ix9QkjdEZYBB/vW9/gPgzjaGw+mSbaeKH8T+uEcKP7yic0gQrkhGGcHcRQLz1wxaxsWLkL19R4Ym7bPaXIE51sgVMpdh988IHIgJLiKqZOnWrvU2IU8s7qY5SWXUhJMcH0WN/6tP3Mdc1n5sy69GHIGpeaVSDi61wpdoJxj96wA5vFmSy9IP9YUdC3krRAhnFgNp9KE5UUIoN8qWtipMWP72mlcaJZTdsWqHaqOnaIO0ITcyypqeoeiozjcy4th37ekSzWXx/eTLhd5Z0mAn2sP784fJmbcDOODQoI/3NErdgNMuGG1VXm2CLNuFNR4iEtqpO32VYwD9N7WEmQbB0K5FQWOxRYrV+/PoWHh9OwYcPsfTqMQt5fc0LE0/VuGE2d6kWa7DQhJ7col5p80kSsH3n4CAX6BFapdRnDOCr/nU6jzPxiig7xo7a1I0zuLx8r8otzqc4HVZcThnHkbiyrDqsnPre1rlm5YxQZH0+spX/Z2mFkMcUO7Vm++uor2rNnDz399NPUq1evCvvs3r2bvv76a2Fta926NT3++OMUHBysaZKMEg76mDJliui1d//999Px48dp//79wnqHOkRwyTKOy7GrmfT3fvUs66kBDTXbA2Xu1yIjzZkRF3H+5nnNOsO4em/YgU3jzG5GjgHJlJyw9DDODJKKUAYooVqAyfhTQzJiajyxVoydrbGIK/b7778XFb7RaHnZsmUVevKBDRs2UOfOnUULpCFDhogikVD+iorUdcxQVFJys+ouUhsYNCZ/77336N9//6W6desqql3E2Jc5q0+I0J7BzatTs5phek3TpS7YBoxhzA0KX1XmhkW3CSXIxyBXGZAYxhB/Sy3EWtaslGvTw44xdrYWT4tY7G655RYaP368qJA/c+ZMvfs8++yzNGrUKPrwww/F+1tvvZUSEhLoxx9/pEmTJol6XOYUj0RxVimRgnFca90/R1KEsDzZv4FVmpMzjCuAZKIbuUUiKLxDnWrmH4D1OsaFycgpFIW7zS1KbC6W6Dwx67amNGPxYYsf1+YWu7i4OKPNxTMyMkRlffTok/e/hJVP6vFninPnzgnF7+2336Zx48bRtm3bhHJoCFTwh3tXvjC2RapZh3pcyIY1RBFb7Bg3Z/khdQmHAU3jFAeFy60WSiwCHMnAOLN8FJWoqHH1UKofG1KpY3h4VH6fQXqs6GfeGKQ3VjzA15tC/b3tOvGySVYsmjID3b58sNhJn5kCihrcsunp6cKle+DAAdFyyRBw26IJtLTguxjbkXw9VxNbN7VnotF92RXLuDNILFp1SMqGVeaG1R0rXKXHJcMYK0o8vArWOg8FMmIopOGZWxpV3NfTQytWvPx7iFY/2bPCNpfLii0sLNS4T+XgvfSZKdBCyRxX7fTp02natGma97DYsXJnO+ZtPisGrG5JUVqxdfooZosd48bsOHud0nMKRVs9KWvc/Bg70/urOH2CcUIu38gTMoL7fWjLKih2HpbZR47KwDHiwpRVfXBqxQ7lScD16+VFaQGsb9JnlsbPz08sjO1BAclfdl4Q6w+asNaZstjB3dQkukmVawFJHSgYxtFYIblhm8SSjxm1ueSuVS8PT5Ny0johgg5d4pAUxrmQPD+IPa0RXl7/1Fw8FIwnhix2Va3I4OGKrtjExERRlgRlSuTs27ePWrZsaYtTYGzI9/+do/yiUlFtu2uSaQuEMYsd6gwdfuiwWLg2F+NqYFKzoswNa6o3bIV/KxtsgnxNy8lzt1Z0JzGMs7hhzW0hVpnxBGWGPrqrdYXthkYofQqfPiXOKZMnTOHj40N33XUXff7555okhr/++otOnjxJEyZMsMUpMDYsIvn91nNifWrPJJtX3DaEg5wGw2ix+0KGaH0X4u9NXROjKn11lMhZsJ839W0Uw38Bxmk4kZJFR69kko+Xh1nxp/pQOhYN0+Pu1VXg7mgbb/h79ChxTmmxgyUOtemwgDlz5oj1jz/+WLPPO++8I0qaJCUlieSHsWPHim1t27a1xCkwDsIvO5JF2YY6kYGi36WtuLtzbaOfc3A544gsP6h2w/ZvEku+3uY9juVjjdL6W5V1KFUltolhKsvistp1PRvEUHigr0NcyEVTO9Ps25sb/FyfEufvU7V+6HaJsatZsyY9+OCDYl16BbVq1dKsI5Zu8+bNwv2K2LrmzZuLkieMaxVZRdIEuL9HPcXV840FdaMFTPuv2ov1nffvNOhmurNdAs3fqq4org+22DGO6IZdKWXDNjPPDatLXnEedfq0lUk5qSyvDWtq0eMxjClgJSt3w1pmYpGrcDypeC7asarIiBXbFX7vTBvLj0UUu6ioKI21zpQpFK3EGNdkyf7LdOlGHkUF+9HINoZN1eYK95HUI5p1JfFG+mBPLONo7E2+QVdu5gsXabf6lXfDAg9SJidKgsD9vD2pQKdoeESQY1hLGPdhz4Ubosd3kK8X9WtcdSOQR1lLMSVyUpWakbou3xcHNaaEaoGulxXLuD4QEqkg8T1d69jc9GxKRtlixziqG7Zv45hKyYv8nlcaaqBkKGsZH047zmlXMGAYe7lhb2kaRwF66sWZi0cVpveJ0UHUvX4URQT6OkzcuN2TJxjXZ93xa3Q8JUtYH8Z3Mh7vZo2K+KYO4QzCyLhZNmyZYjfIzGxYfSEMSm9vXVl7dmDDClXyW8SH6Q0gZxhbhvUsO6CWj2FVdMO2rR0hXke2rXxWLcaPH+7rWCFjVt/YpSuK9hh62GLHWITP16utdeM61qKwAB+bX9Wq1hliGFuy7+INunwzX7iZejaIrtQxtCx2lUyegBVDdxvihzCAQcF7fdnRSp0bw1SFDcdTRdHuqGBf6ppUtTCFX6d0oht5RSJEKKcwx6J/GH3x4Y5gQ2CLHVNldp+/Llw3vl6edG+3una5oqaaVziCsDGMxPIya0TfxrEWCVtQ7IrVmQAJuTAgOzxXYuzFwt3J4nV4q5pmFe3Wh7eXp1Dq7IU9vEWs2DFV5rMya92I1jUpVk9TZFNUs0FgNpc7YRwFKFdSUeLKumGBt5fygG6j51P5f8owFic9u4D+PXpNrN/RzjJJeLZEd6ypYYf2YuyKZarEyZQsWnM0RQwsU3rWM+vfLrivI7218hi9OdJYTSAPqh1WW8HMx0RWLFvsGAdhX/INkT2OBuK9GlbODQviIwLprg61RHFjX28vhXKijYc+K17ZK/eWZewBSpygG1HzmmHUKC7Uosf2UDyeKENvjF3ZYb+Z1I72Xrghkj9sDSt2TJX4YuMZTZ/LxOhgs/4tSjx0q9/N6D6oM3TuCXUniyplxZp1Zgxj/WzYPo0qlw0rR14otTJygkHo2YGN6JW/D5vcl2FswcLdF8XrKCtY6wIVjidK0ScjDWJDxGufRrFisQfsimUqzZWbeZqU9Km9kux6JfWNQR3qVtOss8WOcQRgHVt+UO2GHVwFN2ylv19HUuA2mtilDm16treefRldLl26RHv27KHs7Gy+OFbg8OWbooUY4rWdLTN77VM96ZcpnSgpxjwDhzVgxY6pNPM2naWiEhV1qleNWiWE2718hC5Teyba5VwYxhD7L94UbtgAH7hhbd+31ZAVTquAapl5my122rz44ovUqlUrmjJlCtWuXZs2bNhgvT+UG7eklFrsOUoLMVPtKiXqRQdTp3qR5AiwK5apFDdzi+jnHRfE+oNWVKDyivKox3c9xPrGSRspwCdA736649Xcsa2pt6zhOSdPMI7A32UtklCU2BJFV82WEz2uWF1YVvTz0Ucf0enTpykmJoY++eQT+u6776hnz55V/tsxarLyi+iPPWo37NiO5e1ILUmeQjlBqZ+Dl27Sxmd6U3yE/n0cGVbsmErxw7ZzlFNYQo3iQipdh0sJpapS2nV5l2bdELoDVkyIdiaS1NuPYexFcUkp/b3/sqaMg13kRGcKhDg/pfs6Ort27aLVq1dT+/btqX///hU+Lyoqor///pvOnDlD9erVo2HDhpGPT3nNze3bt4t9dGncuDFFRkZSv3796Ouvv6YOHTrQ8uXLady4cVb/Te7En3sviTEFXR66JFrH8lWqUE7+eqgrFZaU2ryDkqVgxY4xm/yiEvp2yzmNtc4Rujp46Shu0ind160urT12je50wrR5xrX473Q6pWUXUESgD/Ww4mTIGE/0a0BjvtwmShM9N7ARxekpxeDhZK7YU6dO0ZgxY0T84sWLF+muu+6qoNjl5ORQnz596MaNGxoF7e2336a1a9dSUFCQ2GfWrFnic11ef/116tWrFw0ePJjeeOMN+vPPP6mkpES4ZRnLgL/d/K3nxfqETrXtPqZ4enqQv6dzKnWAFTvGbBbuShZVwWuGB9CQFrYPADfUNgbJEjvOqntcSo+FGUOaiMXdKS0tpevXtft/BgQEaAY1xvr8tVedaDSkRQ3y9bZPeDNigA68OoBC/LztPnhaCljdPvvsM2Gpa9eund593nvvPbpw4QIdOXKEIiIiKD09nZo0aULvv/8+vfTSS2KfpUuXGvyOK1eu0IwZM+js2bPk7+9Pq1atoocffpjWrVtntd/lbpOeU9eyRQmg29s6zyRc5aCzH06eYMx2J325SV3i5P7udUVVb0cAFrvfHuisee8iY5bFSElJoUaNGmmW+Ph4MagxtiG3sJhWHVZnww5vbd9sv1B/H5dR6gASGaDUGeP333+n22+/XSh1AK5VvMd2JYSEhFB+fj59++239O+//9KPP/5IsbGGS1kUFBRQZmam1sIY5tP1p8TrqLbx4v50FlTkmDjGqMw4DcsPXaXk63nCnXRn+wRyXFxn4LIE1atXp7S0NLGkpqZSYmIiTZw40d6n5Tb8cyRFxA8lVAugNrXUyoWj4uHg1ojKcOzYMWrQoIHWNrzHdiUEBwfTkiVLRCbsm2++KRTDuXPnGtx/9uzZFBYWplkSEhz5WWlf9l7IoC2n0snb04Pu72FekXtGP+yKZRSDB/3n60+LddS+CvTl28eSwFW0detWatGihQjY1nf9d+7cSZcvXxafN2zYUOtzKG36CA8PJ2/v8r/VmjVrRPA4Dza24/eyoqtImnAWa5mr6HVIiCgsLBQKlq5cwLJWXFysJR+G6Natm1iUMH36dJo2bZrmPSx2LG/6mbtWba0b3rqm6KbCVB0emRnFoH/fkSuZIg5iYuc6NrtyUYFRZv8bH1kfTUfnxIkT9Mwzz9D+/fuFy/SVV16poNgh+BvB28ePH6fmzZsLBXDSpEn08ccfi88xQMHFqg/EA7Vt21bz/tNPP6UHHnjAyr+KkbiQnkubTqqV7jvbJTiUnBjDRfQ6EYOHRdcdevPmTfL19VWk1JmLn5+fWBjj/Hc6jf49dk2E0jzUyzZ1R6MsKCeOOvlhxY5RBKxFH/57Uqzf3bkORQTZpnhkkG8QpT6Tqnj/SV3qiAKw6DPoLGCAuffee2nIkCEiXkgfyNg7d+4cHTp0SLiBdu/eTR07dhQZfrfddpsYRAxZ7OQkJyfTvn376NZbb7XCL2H08ctOdb3H7vWjtAsB21FOjCEZFOE2dhVg3Ub2rJyTJ09WsHoztqOkVEWvLz0q1sd3rCUK/FqbIAvKiSPDih2jiHXHr4mCjaiYj6QJR+XVYU3J2TAV+A0WLFgglD8odQAWOBRHxXYodkr5/PPP6Z577iEvL+Op/LAAYpHg4O/KUVRSSr/tUrthx1mp6KqlkQoUD2tZk86m5lCHuo5RTb8qIFFi3rx5onRJaGioKGvyxx9/sOXajny+4bTwAIX6e4syPIzlYMWOUWitU892J3SuTZHB7GKwJRkZGaJHZbNmzbS2wyW7cuVKxcdB7S0EgK9YscLkvgj+njlzZqXOlyln5aGronZdVLAf9W1sn4bglQXusWkDHN+ihQnIO++8oylLsmPHDqHAxcXF0eTJk8X2p59+WhQn7tq1Kw0YMECEJ+Dzp556ys5n757sS75BH6w5IdZfHtrUZh4gS+OoRbw5K5YxyYYTqbQ/+Qb5+3jS/d1tm7WEFjC9vuslFqy7I3DVgmrVqmlth/VOX0FVQ8BKd+DAAapZs6ai4G98r7TAhcuYPyH6YqM62Wh8p1rkY8XSQO4sJ7jOKEWCBdZoFCLGutzijHIliEt97rnnRBLF888/L95jO2P7mNPJ3+8SfcZvaRpLI9tYtguLMdxFTthixxiltFRF76w6LtbHd6xN0SG2tdah7cuG8xtMtoBxZaQg7OzsbK3teI9iqdb6Tg7+rnrR1UOXMsWECHGpziInTpK0qwEyAAudkv3Gjx9vk3Ni9LPnQgZNmb9bWLEbVw+lOXe2smmWuLuMJ6zYMUZBb8vDlzNFpfqpNspaYrRBIVR0iEA5FDnnz58XZUsYx7QiSWUcRrdLoGpO6mpiGEtwMSOXvtp4hn7Ydp5KVSR6jH9/T3sK9nNuFUTlmJ5YVuwY4z1hJWvdg70SObbOTnh6etLAgQNFlfxHH31UzHCRzID4OrQ5YhyP9SdSaeuZdPL18nS6oqtOZrBjDCAVmJaUD5Xuds176XNVBUVF/pnusfQdJyu/iG7kFtHNvCK6lJFHJ1KyaOe567T/ojqcBAxrWYNeH9HMqTpMGMJB9TpW7BjDfLPlrCgdEhfqT/d2ddxMWGcnKyuLli1bJtbz8vJEHNwvv/wiukUg8xXA1dSpUycaPXo09e7dm77//nsRK/fggw/a+ewZfZmwby5XdzSY2KU2F11l9HIjt5C6vLnWqPIkX5ErXqaUNEekS2IkPdQribrVt2y9RaYizm0HZawa4PpRWd26Zwc2pABf4+UxmKopdn/99ZdY79+/P5WWlor3rVq10ih2KD68d+9e+vLLL2nbtm00fPhweuihh4SLlnEsPlt/mo6nZFF4oA893DvJ3qfDODC5hSXkSsBCjfs+LMCHYkP9qX5ssIil69UgmmJCrRMPzFSEFTumApgFvrT4EOUXlVLnepE0orXtspbckRo1aggLnSnq1q0rypAwjgvcTh+vVU+IZg5rSuGBThhb52zZE05KiL8PbXymt95LLr1H2IWH7rayLeXvy/3n+j6TkhMMHQcvWscy8G90j016PkPHH2dpmWcJHNVCyoodU4Hv/jtHG0+kitnX/0Y0s7ugBvpw/0DG8TmZkkUP/LBblHEY3KK6iCVyRjlxn2HZ/nUCa0Xys83WBLrBeMKKHVMhHf2N5eo2Ly8MamSTNi+mWsDkvJBj13NgGCW1Hh//Za8IHEc7u3fvaGnTCRHLCcPYQ05UDnnZWbFjNJy6lk33fbdTUzhyYhfr1t5iGGev8YiJEJKMlh+8Kra1Sginbye155hUhmHshlMpdqiAj7Ywubm5ovl5YiLXVbMUu85dpyk/7KaM3CJqmRBO79m4cCTjfBQWl1JKZn6FrD6xrjh7z1BJBu1jat4b2C7HVJZhZc4lt7BYlHDIyCmkq5kFwu26/+INSssu1HzvpC516LmBjZxeqWOxZxhlcIxdFUGLmNatW4sFrZXQEmbdunUic5CpPBioPt94mr7edJZKSlXCjQSLQ5CDFI7ML86nkb+NFOuL7lxE/t6cWeUonE3LoVs+2EjuDAp3928aS1N61KNGcaEuISfl4foM41rku8l44hijtwLOnTsnWsIsWrRIvMf65s2bWbGrRNFhuFyPXskUcUH/Hr1GeUXqlHsEe785sjkF+jrObVFSWkLLTy7XrDOOg6cHUYCP2jplKquODH2uIBtPvkfF/aX3xo9XMdtQ2b+T3sMKhzIO4QG+FBnsS0kxwUKRg+vV19v+LbdZThjG9nKictCL7m1JxQs1tvbs2UPPPvusaMSsy44dO+irr76i1NRUYXl78sknKTRUPctFJX38e31MmTKFGjRoQM2bN6dHHnmEIiIi6ODBg6JReVU4fPmmaPtj2nUj/QtzK3lrf06VdDPpK1RpznnAZQY3EpbsguIK16FpjVB6sl8D6tck1vDFYhgd6seG0NFZA/m6MAzDuJpi9+2339KsWbPo3nvvpVWrVulttAy36S233CJaIqHo6kcffUSLFy8WxVZ9fX2ppKSErl5VByDrgs8QV4cYO29vbyouLhau2YyMDFEDrLIgPmbFIf3f6crA8tAgJoTa1YkQylzrhHCOp2MYRtC+bgRfCYZRwMg2NemrTWepTa1w11PsBg8eTBMnThQ9LQ31rnzuuedEO6Q5c+aI91Dy4uPj6ccff6R77rlHWOHeffddg98BFyzcr9gffPzxx/T555+L18oCd8qs4c3MdO1of27QxaS7v4HjSpgqImnoPAy7qMqP5+3lIQqlhgf4aKqCc2IEwzByNj/Xm86k5lCXRG75xDBKePqWhtS+TjXqlBhJLqfYxcTEGP38+vXrtHPnTqHcSURHR1P37t1FI3ModqZo2bIlTZ48maZNmybct9988w299dZbBvcvKCgQiwRcvbrUDA+gCZ1qm/xuhmEYVyc+IpD72jKMGfh5e9GApnHkaNgk6hfxdyAhIUFrOyx20memSEpKov/++08ohJL796677jK4P1ovhYWFaRbd72YYhmEYhnE1bJL+WFiorvUUEBCgtT0wMFDzmRIaN24sFiUgsQLWPQnE59WqVUuv5Y5xXHIKc4jy1ev425X4Wi4zVroXdJNbmIpI14jlx/3kxBAsP8ph+XFfObGH/NhEsQsPD9e4ZOWkp6eL2Dpr4OfnJxbdi8iWO+elxpvW6b2ZlZUlrLqM8WsEWH7cV04MwfKj7BoBlh/3lRNbyo9NFDu4UYODg2nv3r0iI1YC75F4YQuQPZucnCy0Y1jusC6VWnEnoODi4cK/P5lCQkKEUFUls9pdkORHumbueg+x/JQ/P1h+lMPyw/JjS/mxiWKHEiVjx44VWaxIlIB2iizXU6dO0d13322LUxAZu4jpkyx3GJDcbVCSw79f/fdnS5158gOkjGp3vofc+bfLfz/LjzJYfvTfP+5KqJXlxyLJE/v27aOBAweKBbzzzjti/YMPPtDs8/bbb4vsWfR3bd++PU2YMIHef/99UaiYYRiGYRiGcRCLHUyLTzzxhFiXXqXtEtBMN27cKDpGILauWbNmFBXF9ZIYhmEYhmEcSrGLjIzUWOtMgbZg9gQJFa+88opWYoU7wb/fvf/+lsCd7yF3/u3A3X+/JXDna+jOv92Wv99DxbUeGIZhGIZhXAKbFChmGIZhGIZhrA8rdgzDMAzDMC4CK3YMwzAMwzAuAit2eti1axdNmjRJ1NzbunWr2JaSkqIp6SIt33zzDbkahw8f1vy+BQsWaH22atUqGjduHI0ZM0bUIXQ1Xn/9dWrUqJFYzp49a+/TcVqOHz9OU6ZMofHjx9PKlSvFttLS0grygxJIrob8OSEv9wS2bNlCEydOpFGjRole167GV199pZEf6bnJmM+lS5foscceE8/ZX375RbN99OjRWvKDtpmuRlFRkeb3IclADipq3H///TRy5EghW3imuBJ//vmnRn6WLFlSpWOxYqfDhQsX6Nlnn6V+/fpRmzZtaMiQIXT16lVRTBClXKQF+zVs2JBcjZo1a4rfh2rYKCAtcfLkSTFQ47qgW8ijjz5KO3fuJFcCD42//vpLFOAtKCiw9+k4Jfn5+WJC1KlTJ+rdu7dQZA4cOCCuqVx+cnNzqXbt2uRqSM+JFi1a0KFDhzTb0U5x6NCh4rrccccd9MYbb1T54e1oYMCF/FSvXp1ycnLsfTpOC56z6ImO5yyUN2ly9MADD2jkB1mVcXFx5Gp4eXmJ39erVy/avXu3ZjuUOIw99evXF80OYHT44osvyJXo06ePkB9UDkFve4fvPOFMoIjyP//8I24wJAxjFpqWliaESCrpcvr0adFNo2vXruRqoK8vfieKTmOQlg9MECoM2uC3336j1NRUcjRwnoWFhUYfetgnICBALHJiY2PF4q6p+JbAx8eH/v33X821XbhwIV2+fFkoOpL83LhxQ7TUGTFiBLka+N34nXhmrF+/XrMdHW9QFurBBx8USu6aNWscUn4woGRnZ4sJniHw98PfOSgoSGt7tWrVxKK7nTEPKPxowQk2bNhAFy9e1Az8klVr6tSp9N1337lkhw7ID8bXzZs3a7Zjol1SUkKPP/64eD5j0uSI8pOdnS3kA4YR/BZ9oI0YdAvdzhuo9SstVcWpLHZ4OH7yySdCo8Uffu3atRX2wR//xRdfFO2P0IvtlltuoRMnTmg+P3bsWAWXkLRAYPz9/cVDGe+bNGlCt956qyimLOfTTz8V1h1bgwHytddeE71u8ftR6FmXjIwMYSXBIIIF69gmsXz5cr2/3dTv6dixo1hatWpF7dq1o+joaMW1C20Bfhesq7AWwCqij+3bt4uZMO4NCM9dd93lVpYFKOrff/+9uD64f+bPn693P7hI69atKwaX7t270549ezSf6QtJkBZ8hgkRHrx4j3sFE6UBAwZoHR9uyDvvvJN8fX3JlkBe3n33XTFBwe9H2IG+awQ3GBR83CO33367cI1JwMWo77fDCmeMOnXq0L333iueJZ07dxaDEsIaHAUMonD9QX4MWVLx7OzQoYOYNEVERIhnoyMOrtYC4wMmKlCwoNgaCiVAiA68OVBw8ayUj1P6QhKkRbofIXewSuFa45mve5/8/vvv1KNHD/E3sCVQSD777DMxSYP8rF69usI++H0zZszQjL/9+/cX943c82Po98sNCfomTOhohe/GMwnXFEqeo7Bv3z667777hEKHxgzXrl2rsA8UdHgxMC5j/MTvOHfunFXOx6ksdnPmzBEPErxCYdPnY3/55ZeFle2PP/4Qg9O0adPEzXX06FEKDAwUDy55dww5GJTk7hRYFXAzQTmCkgfy8vLo119/1XKz2IpnnnmG6tWrJwQHMUz6ShBCWcE1+u+//4RlAHEZ2CaZ86EU6/v90gzREHv37hWWzOeff15cJzzUMMg5itUSs1dcE7Sr0xe/hFkUXBtwc+BvCiUE5n48HL7++mtyB+bNmyeU2/fee08MDPrk5+OPP6ZZs2YJiyza/WEiARcIHs5Q0iTZ0Ic0A5Xcrni44Vpv2rSJevbsKT7DPQsXytKlS8nWIGYHEze4QaFY6pOfhx9+mNatWyfkBQMnJjyDBg0Syi3ue7RE1Pf7MdAbAw9w3KPPPfecuE74G+A7brvtNnIEoPDjXKC0PPTQQ3qVGriSEZ4CKxIGYTyD0RpSera4OoiBgmL3wgsviDFBn/xgH1hl8bfGuANDBJ47eH4idkqSDX3IraS47xAChFiyv//+WzzHJXBMe8SnogUoFE284pmg7/fPnDlT9IRHDHZSUhI9/fTTmucHxhhMmAz9fmMyhOc3fjMmXVCe8B0///yzuNaOwI8//igmbMOGDaPhw4fr3QeTPyj7mGDCmofQBUwc4XKW+m9bDJUTcuXKFTyRVf/884/W9vz8fFVISIjq/fff12zLyMhQ+fj4qObNm6fo2Dt27BDHlxgxYoRqwYIFmvc4zqRJk1T2ZMWKFeL3p6amam3fv3+/2L5p0ybNtvXr14tt+MwcZs+erXrllVc07z/55BPV3XffrXn/xBNPqP73v/+pHI1Zs2apateuXWH7Z599pgoICFBlZ2drtn355ZcqX19f1c2bN7X2bdmypero0aMqV8bLy0v17bffVtiekJCgeu655zTvCwsLVREREYr/1keOHFGdPHlS8/7RRx9Vvfnmm5r3q1atUvXr109lT/bu3Stk4uDBg1rbr127Jq7Lzz//rNl26tQpse+yZcvM+o4ffvhBdd9992neL1q0SDVgwADNe1wTXBtHA/cEroEuS5YsEdfh/Pnzmm3Lly8X23CN5AwePLjCs9nVqFmzpnhG6tK5c2fVuHHjtLY1atRINXXqVEXHvXTpkmrnzp2a92+99ZbqkUce0bzHc7xZs2Yqe4JxB393jENyCgoKVGFhYap33nlHsw3PVjxjv/jiC7O+A/cP7iOJ7du3i99dWloq3mNMxtjsaPzzzz/i2sh1CIC/Kbbjd0js2bNHbNu8ebPWvnhu4PlRFZzKYmcKBGnDXAxzpzxmDLNMWLDgCjEFzMeYYSBWBJYvaNiYscvdsHPnziVHBFl3cG916dJFsw3mXsyE8PthxjYF3Law8CErFG7tbdu2iUBVzNZh6YBrAZaL8+fPi96/zsKOHTuoZcuWWvE/uDaIx9u/f79Yh2sSvxHWFfzNMQPDTMxdgIUai1x+cO/Auof7RwlwX2LGClcNEiTg6kbMndzagCBwRwT3Ou55+e+HhQ6uSfx++XPAGLDQwO2CWE4pOxbHhKUHMgiLHTwIK1asIGeSH7jXEAYiAZmRPsN1gmsOFhX8djyL4fKW/+1dHTxLkFAGl5ycvn37asWLmRp/kLyHWC1YlK9cuSLCTJxBfuBKRoymXH5wr8OLAvmBR0UJsALDwocxRsqOxRgOix+snggFwP31ww8/kLOwY8cO8SzFtZCARwTjET6D5wteAbjgYanF3xzeDoxNlcGlFDsIAYDLSA782bhYSsCNg3InuMi4KeXxdcXFxTR79myDMVyO8PujoqK0gjaxDp++0t+PG03XVI6HDY6LLFm4FACUJLi2nQUo6fgNcqT3UpwQlFfEtUg40++ztvxIf3dTwE2ChzjkBw8yKDJSiANANrXklnXE3w+XiO59Ys7zA8C9L3dTIfwDCi/CN3AdEQguKXjOLD8YaBFPKckPJkLI6lPqnnY1EJuNMaIq4w+etUisQcwWJhl4zspjURFv17ZtW3LV8RdAMZbH22HSgPsMzxUoOoi1b9q0qRjXnIXU1FRxvrouV8iUJD+I/5bLj6HkC7dT7AyBCwSBUwricORWLwlYIRA34Yy/X2lLYDxEDCVF4Lrg4e2M4BpgRq0bNwQkxQMxVbYOSHa1+0eSE7mCLAfWcFf//brJIvLrIp+xO/szFNcEyockP1BKMDFmqnb/YH9YqPQB67mr/37EPusDShESslxJBykqKtLIDxJELCU/TpUVawoEZgLdTC0EcUufuTL4jQjMlAsRLAeYSbrD7zcG3Ei6s0YkUABjpR3cCZafWCE7utnm7vL8MCU/krxI4DphsGL5Kbe+YJB25/EHuOvvNyU/UikuCUyKIEPWkB+XUuykGCpkbUnA5w+3kD4LnKuB3wg3D2KF5HF3uJnc4fcbAzNdxGXIBydk88FFpiT20B1A/BQeMnL5wcCNrFZ3uH8QYoGZtfz3I9YUMZfu8PtNyQ8GbLgI5fIDRcbdr43c2wE3qfz+ASjN4Q7XCGFLsNrKfz9i3hHa5A6/3xhSFQJ56Rtk32O8tooVVuVCWbHgmWeeUVWvXl21a9cuVVpammrChAmqGjVqqLKyslSugqGsWNC7d29Vx44dRfbauXPnVO3btxfbXB1kNCYnJ4u/f3x8vFjHUlxcrMnuRFZV3759xb2BLEVkUOvLbHMHDGXFzpkzR2S2rVu3TmSUI/s5NDRUdfnyZZWrYCgrFuB5Ub9+fZEVffXqVdWgQYNUTZo0URUVFalcmevXrwt5ee+998S9IckPMh0lIDutW7dW/ffff6rVq1eL5+zDDz+sckcMZcX++uuvIgv0jz/+UGVmZorsZ7zXd685K4ayYsH06dNVsbGxorpEenq6qCARFxdXofKAq4HfB3lBRj2uDTJe8T43N1ezz9ixY1X16tUTz9aNGzeqGjRooBo5cqRVzsepFLsff/xRPHSw4OJ5enqK9ZdfflmzDx7ATz75pKpatWqizEn37t1Vhw4dUrkCzz77rPi9+N34/dK1gJIiF7pRo0aJ0h5YsK5PAXQ17rjjDvGw1V0gXBJQTiZOnKhKSkoSAxTK4kjp8+4ASt/ok597771Xsw+ux8yZM1UxMTHis3bt2qm2bt2qcgWgtMp/v7SOUj4SKIczefJkofT7+fmpBg4cqDp79qzK1UHpFX3ygwFa4saNG6L0BgYkTJJQDgkTJnfh2LFjeuUHyr+cuXPnirJB+AyTApSFcQWgtOr7/S+88ILW+Pv000+L8dfb21vVrVs31YEDB1SuzhtvvKFXfhYvXqzZB0oeSkk1btxYlMB56qmntMpvWRIP/IecBClYVxe4T6qSQeIswJSrrygk3CEWL3DIuBzuLj+Gfj/LD6MUfQHw7i4/7vL7nQmnUuwYhmEYhmEYw7CazTAMwzAM4yKwYscwDMMwDOMisGLHMAzDMAzjIrBixzAMwzAM4yKwYscwDMMwDOMisGLHMAzDMAzjIrBixzAMwzAM4yKwYscwDMMwDOMisGLHMAzDMAzjIrBixzAMwzAM4yKwYscwDMMwDOMisGLHMAzDMAzjIrBixzAMwzAM4yKwYscwDMMwDOMisGLHMAzDMAzjIrBixzAMwzAM4yKwYscwDMMwCti6dSstWbKEbt68ydeLcVg8VCqVyt4nwTAMwzCOzOOPP04rV66kpKQkOn78OG3bto2ioqLsfVoMUwFW7BiGYRjGCJcvX6ZWrVrRmTNnKDg4mB5++GGKj4+n6dOn83VjHA52xTIMwzAuTUFBAS1YsIDuvvtu8aqP1NRU+t///kf33XefeE1LS9N8dvToUWrdurVQ6kDfvn3p4MGDNjt/hjEHVuwYhmEYl2X//v2UmJhIK1asoI0bN9KuXbsq7JOSkkJt27aldevWCcvc2rVrqU2bNnTt2jXxeWFhIfn4+Gj2xzq2MYwj4k1uQmlpqTCnh4SEkIeHh71Ph3EAEF6alZVFNWrUIE9PnuMYg+WHcVb5qVmzJu3bt0/Ew7Vr107vPm+99Rb5+fnR8uXLydfXl6ZMmUKNGzcW2+fMmUN16tShI0eOaPY/dOgQ1a1bV/E5sPwwtpQft1HsoNQlJCTY+zQYByQ5OVnEyzCGYflhnFV+lCQ4LF26lIYPHy6UOgAlb8SIEWI7FDsoeVAQJ0yYQC1atKD333+f1q9fb9T1i0Xi0qVL1KRJEwv9IsaVSLaC/LiNYgdLnXQRQ0ND7X06Lj0LSc9NF+uRgZEObR3NzMwUyr50b7g6Z8+epc8//5yKi4vFAAWXk1JYftxDJtxVfpAUUbt2ba1teI/tEsuWLaO5c+fSlStXhMJnTFGbPXs2zZw5s8J2Hn/cW2ZsJT9uo9hJNwaUOlbsrEdOYQ4lfpAo1rOnZ1OQbxA5Oq740NAlPT2dxowZQ3feeSfl5eVRv379hHtK6UyR5ce9ZMKd5KeoqIhKSko0iRESGHAxCcLi7e0txo0XXnhB0TGRLTtt2rQKgziPP8pwdZmxtvy4jWLH2J5LN3LpXGoWNYgNoTpRriuYzkBQUJAICMcrWLVqFZ07d86hXWiuyOnUbLpyI4sCfLyoYVwIxYb62/uU3B4kQgQEBFBGRobWtbh+/ToFBgYKpc5c4MrFwlSd/06nkZdHNjWuHkrVwwL4kiqAFTvGatzywSZSlaofbuM71aJXhjYlHy/HDbJ2ZJCt99lnn9GmTZvoxRdfpEceeaTCPn/88Qe9++67Ih4OMUEo2YDMPuDv70/Z2dk0fvx4unjxIjVq1Ii6du1qh1/i3gz5eDN5UrkyVz8mmAY0jaWxHWtTzXAetOxF8+bNRUKEHJQzwXbGvtz3/S6NzPRrHEtv3N6MYkJ4QmQMHmUZq1FSqqK6UUEES/OCbRfo9aXlWWWMcn755Rd67bXX6PbbbxfvoaDpglIOo0ePpnHjxonMPmTs9e7dmy5cuKBlmRg4cCANGjRIKIiozcVYn9Ts8iB6Xy9PahkfRonRQeTpQXTyWjZ9su409Xx7Hb3w50G6mVvEfxI7MHbsWPrzzz818gJr9l9//SW2M7bnys08zXp0sK+w1mEcWXM0hcZ+tZ2y8llOjOE2nScQ4xAWFiZ6/HGMnfW4lnWTYt8LF+uvtdtNMwa3oeUHr9BDP+4R2xZN7Uxta1cjR8BZ7gmUSpDS4eE6hbXu+eef19qnW7duIobn559/Fu8h1ijRgJi6d955R5RqiI2NpcjISPH55MmTRd2uqVOnutS1cjTwd5j03Waaf6GHeH/0gWvUKC5arEOJW3/iGv2yI5m2nlEHiseG+tG8ie2pWc0wcnSc5Z7Izc0V5UukCVBMTIy495EcAau2FGcHWdm8eTN16NCBtm/fTt27d6fffvtNq36dq18rR+GBBVvoy9PdxHrqUzcpKjiUTqRk0d3zdtDVzHya1KUOvTqsKZ1Pz6GjV7KoTe1wp7PiZVrxnmBXLGNRft9zUbP+cO8k8TqoeXUa3S6Bft2VTB+sOUk/3NeRr7oZmKpxhEKpGIjuvfderYDcAQMGiIKs0jH69OkjLHk3btwQFolXX31VcbkGPIQY81l/PJXWHb9GVOZlTagWqPksLNCHbmtVUyzbzqTTC38cpDNpOTT6i6208MEu1KQGKwCWQLJUA+kVVKtWTWsfWOxQvBiZsMhoNVTzjrEuF9JzaeXhqyRFLAT4eolXxGq/fUcLuvubHfTzjgvi/cuLD1FxqYr8fTzp+YGNaGKXOk6fzGMJWLFjLGqdWLgrWfPez1stkOCRPkn02+5k2nwqjZKv52oNcEzVQNV8ZO7BIicH7xFvBxBTByUPCxIoEF9nLLjbULkGxjx5eHf1cUX7dqoXSX890pUmf7+Ldpy9TpO/30krnuhBYQFVtxa5O1DaEFuqBChzrNDZl/lbz5EhP2L3+lHUKC6Ejl3NEqELICLQhzJyi+jVJUdo57kMofwF+bm3asMxdozF2Jd8g86k5lNoaT8a22wCeXuWCxcUuc71IoXArsJsjLEYUjSFbvYe3qOMgwTM/kOHDhWWO1MZeyjXABeBtKD+FmMe/xxJocOXMynI14fGNJ1AE1tO1JIJXUL9feirCe2oTmQgXb6ZT3MUKoUM4yoUlZQKr48HedEtdUZXkBlY43o3itG8rxHmTzte7EcvD2lC3p4etOzgFY3C5844nWKH4Nbff/+dvvvuO9G0mXEcENjqQT40vuFb9OPI+eTnra089G6oFsgtp8qbazNVB3FzeODJm5YDyAfiiSoDFD+p5hbX3qoc3245J14ndWlAP98xn74b/l0FmdAF7tk3RqgzMX/cfoEuZuRW8tsZxvnA2HAjt4iig4Np2YSf9cpMU1mIQo8G0aLSwr3d6tL8ezuIhKTF+y7T0SvuHTriVIodlDlUy//xxx9FOxeO+3Es1hxRN8zu31jbJSjRJUkduL/97HWRMctYBrhWmzZtKgK/5cDtikBwxvacupYlEiIw0IzvpN3RwBRdkqKoa1KkkBFJOWQYd2DpgSvidVDzOPKC8OihdrXymqiouiCXm4HN4sT6LzvKqwG4I06j2KF45GOPPUaLFy8WQa5Q8hIT1ZWpGftz+UYeHU/JIg8PFbWvGygqh+smXDeKCxVBrrmFJSKbibEcyJRdsGABbdmyRWTRfvHFF6KcidKsV8ayoLwP6Ns4VriLIA/6ZMIQk7vVE69/7r0k3FMM4+oUFpdqwnQGNYszKDORwep+vqC6Tu3H21urC66vOXpNsay5IhaLMESVbihbe/bsoYceeoi6dOlSYZ/jx49rXKitW7cWJRekWB/U5oKLVR933HEH7d27V5RvgGtp4cKF1L59e/GecQx2nrsuXhvX8KP4D6vpbQWDGVjD2BDaf/GmSFGvF63dwofRz6lTp0Q5EwDZQYmGDz74QMTK/fTTT2L7Aw88IBIlkPWHRIqIiAhh2YacMbYlp6CYFu1WZ4ff3bk25RblUvDsYLPaIyFIPDLIl9JzCum/0+nUs4G6RArDuCqbTqZSVn4xxYT4UdOa/gZlJlSWUKSrvMEr5OvtSZdu5IkuL0kxzt/H2G4WOxRQRYVuxL9hMJE3TpbYsWOHGGTQQLlZs2b0ySefiHIMUnB3fn6+cK/qW/AZahHh9cEHHxSKHTKXUIiVcQx2nVO342mdoK5hZwhY7cDxq+4dA2EOKFGCvq5YLl26RCdPnhTrkCE5yGKFZRsKHvZDwWLG9iDGJ6ugWLiJuiZGVeoY3l6edGtztVtpxUG1e4phXJllGjdsdfI04IYF/t7laotuSE+grze1qaUeg/acv0HuikUsdp07dxZWBfTb+/DDD/Xu8/TTTwtrAix2YOTIkWLAQgHIu+66i6KiojSf6aNevXpCsUO/SwSKz5s3TyiUqKLPOI7FThQf3m94v9pR6jInFzPKK4szxvHy8qK4OPUgbwpkwsJax9gHWBBQrgGM61jL6ABlCrhx4dLddDJNHJfrczGuSn5RCa0+kiLWh7asbnLSI6EvVLtlQjhtO3Od9ibfoDvbJ5A7YhGLHSp4Q6kzBMolILBbbkFAlXzU0lq6dKmi72jSpAklJSXRs88+K3pmfvzxx9SpUyeD+6O4KpIr5AtjPaFEVXDQyoTFTuqHefEGK3aM67H7fIaosYVY0lFtqzaodKxbjXy8PIRb6Xw6Z8cyrsuGE6mUXVBM1cP8qXWC8ompvtbjrcvGoP3J7muxs0nyxNmzZ8WMEwqgHLzX57Y1xN9//y1KOxw+fFjU2UIsn7ECq6jbJS1QJBnrcOpatpg5hQf6iPgIJYrdJbbYMS7ID9vOi9dhLWuI0iVVQe1WUg9ym7hEEOMGbtjBJtywunjq6TLRPF6t2MHY4K6JRzZR7PLy1NaZ4GDtYPmQkBDNZ0rAv0ePzLlz55qMH+ICq7ZDstahxYspd1HNCLVih35/XPKEcSXSsgtEX2Rwd2fLJHZ1TlSXCNpdFurAMK5GXmGJqIEKhrSsYda/1afY1Qjzp2A/b9FqzF2rL9hEsYPFDCCwWzeTVvrM0nCBVdtxIiVbvCLj1RSRQWqLHpS6zLwiq58bw9iKX3cmU1GJSoQjNKtpmeeaFNqAri4M44qsP35NlMCKjwiglvFhVVbsPDw8KDFanUV7smxscjds0lANsXGIwTt06BB1795ds/3gwYPUq1cvW5wCY0XOpalnRfWig8jL04vuaHKHeI91XZCKHuLnLbIGM3ILKSKovCYRwzgrmKj8tF1du26CTkFiUzKhRLE7l55LGTksL4zrFiUe3KK6xuOjVGb0xdgBlDlBWS2ECbkjNlHsfH19RRbsl19+SZMmTRJK3j///CNi5bCNcW6u3FS702uEB5C/tz8tHLXQ6P5Q5iTFTt8ACdGuSjYhw9iatceuiSQHxJligJKjRCYMER7oK8qmnE3LoX0Xb2ja8jGMK5BbWEz/HitzwzavYbbM6LPYgaQYddjXqVRW7CoNFDQkK0gga3XlypXUu3dvuu+++8S2OXPmUL9+/UTro4YNG4p2RzNmzNBbyJhxbJAIs+t8hoit69c4VjQsBzXCDGdG6yp2F67n0vWcIq3g2Y/XnhQZhciM+vn+TlQnKkhYA1G4EuVRMGA2qR5Key7cEOb76BA/mti5Dl2+mUdT5u+mI1cyqVO9ajR3bBuKCjaexMEw1kiaGN0ugfx9zLPKmQJZflDskOXHih3jSvx79BrlF5VS7chAalazvAesUgxVYUiSFDu22FUeZKqiRh2QXsXFTUrSrKNjBLpSbNq0idLT0+mjjz6i+vXrV+FbGXuALKPpfxyk38sq689ZfYKu56gtb9XD/RUdI7yscviNMotdVn4RPbVwnxBwcOVmPvV6d32Ff/fFxooZ1DOXHNF6j/pF7V5fQ3tm9Kdq7OZlbAAmHxtPpBKMB+M6mtcXVglNa4bRH3svuX1jc8a1s2HNqdN44NUBlI0uFaH6x5zakep6qcnX3bNMkEVcsSieOn78eNNf5u0trHiM81rqnl64X1TWR3swVACXlDrU20ILJPT2M9U+KchPbdHIKyqhAxdv0LC5Wyx+rmO/2kYrHu9OKZkFwrKI/oJNa1gnUYdxb37crrbW9WoQTbXKBhQ5SmTCGI3j1ElJsGYzjKuAunXrjl8T60Na1DBLZkL9fcRiiPiy6guZ+cV0M6+IwmRtyNwBm2TFMq7Bp+tPC6XO29ODvpzQll4Y3FjzGQRH6YwrwEc9n0Am1F97L1vlXDEIIu5p48lUuvubHfTuquNW+R7GvUGpht92qa3XEzpb3loHGpYpdihSjD60DOMK/Hs0hQqKS6leVBA1rm7Znq6Bvt7C0AAuZrif1Y4VO0YR28+k07ur1crRK8OainZH8viGECOzJ10CfdUWu9yCYjqTZr3g1vu+3yXM9cDLk291xvIsOXBZWARgIejZwDqJDZHBfprC38fLakYyjLOzZL/aDTtElg1rSeKrSe5Y9+tyxKMdYxJ1DNx+UqmI7mgbrynnkFAmOABWPHMVu4/WnqL1x1Ot+hd4bekRs8+PYZSyoCxpArF1CE+wFo2qqwPLj11hxY5xfjLzi0RcKhis44a1FAll7li22DGMHmYtPSKyUmGVeGVoE8121KOTQLycOWZyW8MGO8bSIEv1wMWbojbjaCs3Gy+Ps+Oe14zz88/hFCosKaX6McGaUANLEx/hvgkUbLFjjLLmSIqIIYKl/L07W2m5XOXm81I0i1UIBkJbs/zgVZt/J+MeJU6GNK9u9QxstOuTt+9jGGdmWVnrPd2aj5YkoZpksWNXLMNoZS299NchsX5/93rUoW41g1cHffmUggxahnFm0AViyX514s94KyVNyEFXF4B6dgzjzNzMLRK1SaX4OmtRPUxdCiUlS11n1Z2wvU+McRqQSXo1M1/UBJrWv4HJ+nZS+5dB9Qdp1vXB8W6Ms7Nwd7LI6GtaI1QUEDaGEpkwRb0odekHlO9BZmyQLAyCYZyJVUeuip7KjeJCROsva8lMTEiZYpdZQO4GPx0Yg/FD3289J9b/N7y5yWr6hcWlmlYwy8YuM7pvftm+DOOMIOxgwbbyvrCmMvqUyIQpwgJ9RPmG9JxCYbVrVpNrMjLO3RvWmLXOEjITE6rOJE/PLqDiklLyNtRY1gVxn1/KKKa4rLsEsmBHtK5J3epHmfw3mIEpBf1gGcZZQW1EtMQL8fem21rVtNn3omcsOMPuWMaJQxi2nEqzajasRGSQn8hUx3CDCZE7wYodU4Fvt5wTfVfR0PxFWRFiS8GKHePM/LBVnTQxqm0CBZSV7rEFUpzdGTdtbM44PysPXxXPf4QwSBMVa+Hl6UFRweqkppRM94qzY8WO0QKp4e/9c0Ksv3BrY4oKVpuzlYJWMEFvBIkF68bctgzjjPKxtqwN0rhOtSwmE0qoWxZnxwkUjNP3hjWRNGEpmYkt6yV7zc3i7DjGjtHqBfvy4kOiJh0yYEe1i6/U1cktMl43CPWLGMYZ+WnHBRGi0C0pihKj1YqWJWTCPIsdZ8YyzkdadgH9d1rthh3SvIZNZCZGJFDcdLvMWLbYMVq13tYdTyVfL096Y0Rzq7R5AWyxY5yRguIS+nVnslgfX9Z9xZZIrqtz6azYMc7HykNXRbxbi/gwqhVZ3rXImsSUJVC4W2YsK3aMpm3YzCWHxfrUXomUFKPcGmENvpnUjv8yjEOx4uBVup5TKOpj9Wtsnb6wxqgZri64mpVfLPrTMowzsfTAZavXrtMlOrg8M9adYMWOEXyw5iRdyyqgOpGBQrGztsvXGHd1qEV9GsVqtSwDLU3UCzOGqTp8DGOK+WXlf8Z2qGWX0gmoXSd1uLjkhtX0GeflWmY+bT97XawPam47xU6Sl4xczopl3Az0n/zuP/Wg9eqwpiZr1lUVfWrdpmd7m9zvp8kdK/2d1mzQzrg+hy7dpD0Xboji2qM7WLcvrBKrnTs2NmeclxWHrorY1Na1wjU9XG1BRJliB0u7O8EWOzdHJEz8dVikoA9sGke9GprnYprUpY54fe7WRmZ8p/b7DnWqUUK1cmGXQvt0LXuBvl70xYS25O/jSe1qR1Q47oL7Kq/4MYwxftyuLnEysFmcpqK9PYiPUCt2l26wxY5xRjesdWvX6RIRqO5tfiPXvUIXOCvWzflr3yXace46Bfh40YyhTcz+968MbUL3dq2rabjs6eFJPWv31KzrQ6Vji/tlSiet97XKlDxdix2SOW5pGkeHZw6kb7ecpV3nM7Q+jyvrDagPK+WBMG4A4tn+2ntZ02nCXJTIhLmKnTs2Nmeck6s382nnOfWzelDzOJvKTESge1rsWLFzYzLzi+h/y46J9Uf7JmncPOYAZUue4RTgE0DrJ603y2LnWeYmhcXt32MpdE9XtRXQUCieupq4yuzYPYapDH/suShKADWMDRFlgMxFiUwoRXJjcYwd4ywsO6iuXde+TgRVDwuwqcxUk8XYYXywVqUHR4NdsW7Me6tPiNpCqI81uVs9m33vI32S9G5H67JXhjYlP291jJ8+5U1C30es1jGWBoPBD9vUbtjxnU33hbVZjN0NjrFjnINlZW7YwTZMmtC12KHlZXZBMbkLrNi5KUcuZ2qy/GYOa0q+3ra7FZTO2lRmfmbMYOdB7jFTYyzLf6fTRUHgIF8v0TfZ3sSXhTywxc72bN26lcaMGUNDhw6lBQsW2OEMnA/EgiLpCPMhW2bDSqDlH8KMQEaO+8TZsWLnhpSWqjtMoFgkZlHd60db7Nho/xL9TrRYqtIKxpRrVb/Fjm12jHX6wt7eJp6Cdcrv2EMm4spaJGXkFomCyYxtyMjIoGHDhlH//v3pkUceoXnz5tHSpUv58ptgeVkLMSTIxZTdu7aWmWpuWPKEFTs35I+9l0TiAbJMXxrS2OLHT8tNE4sx3ry9uXj9cEwrg/sYtcB5VH1/hjHGlZt59M/RFLE+oXNtq8uEEsICfDTWdXfrf6mEwsJCKi427nIrLTW/pWFKSgoFBQXR3XffTbfccgvdeuut9MMPP1ThTN0sG7ZlDbvJTHhZZux1VuwYVwVxBm+tVCdMPNa3vmK3qKUZ06EWHZs1kG5rZdi9pTJRxBgZgvKED86dYCzJzzuSRRmgjnWrUYPYEIe4uIjxiwlRV9O/5mb9Lw1RVFREv/76K/Xq1Yv8/Pzo6aef1rsf3Kd169Ylb29v8arrTh0yZAh169atwrJ+/Xpq2LAhtWvXjurUqUNt2rShNWvWUHKyur0co5/k67m0/+JNQm4cSmnZixB/b03HFneBs2LdjE/XnaLUsg4TKFNiT0wVQjbmioXlAkWNMfA+uGA3ta4VYdQVywY7xtx+xj/vuGARa52lgWKHcidssSuPffvjjz/olVdeoWeeeUbvNVu7di3dc8899PXXX9OoUaPot99+o0mTJlHNmjWpd291cfQZM2YIJVGXxo0bC4X6999/p9OnT1NBQYH4zr/++suqf2dnZ2mZG7ZzYiRFl01G7EGIv9pil82KHeOqM6ivN58V6y8MamzThInKMKptAv26y/CsGA9bby8P+npie/EeMUcIcs8prBh7xK5YokaNGtGpU6c01wQDlJeXdbuMOCurj1wVEyAMSAOa2M/aoI/YslillEy22IEePXqIxRgffPAB9e3blyZOnCjeQ6mDxQ7bJcWuY0fTBc4TExMpKyuLxo4dSw888IAF/pquy7KDUjasbYsS6yK1pkQ/dHfBsUd2xqK8ueKYsER0TYqk/k1iHf7qor3ZYDMaRqNMyp6X+2u6YTDaIPYoPT2d8vPzxcJKnemkibvaJzjcBEij2GVxjJ1SYGHr2VNd8FYCCh22K+XRRx+lrl27Uu3atalZs2Z0//33G9wXk6bMzEytxZ04l5ZDhy5lipqj6NZiT0Lc0BXrWE8sxmrsOHtdFIpEvMOMIU3sXo9Laar6CCMxeIaUO2ftC4uH/4YNG+jCBbULUB/4bNu2bUJBqwz16tUTcUL/+9//qnCmrs2JlCzRsBz30V0da5GjIbm12BWrDCRLpKWlUXS0dvZ/TEwMpaamKk6mmDJlCr3zzjt0+PBhYe1DrJ4hZs+eTWFhYZolIcF+/YXtWZS4S2KkJivVXkiuWLbYMS4FYtX+t+yIJumgUVyo1b4L7V/a1Wgnlqq2TwK9GkZT9/pR9FCvRMX/Rl9oniPXsUMQNtw6CNAeMGAA/fTTT3qz/UaPHi3ifTDAIDZIrpzBQoCBRt+yfft2sc/x48fp6tWrtHLlShFjtHjxYpv+TmdhQVlB4v6NYy2SXGRpmZAsdpw8YR66ChzemzPBbd68OXXp0oWqVzftRZg+fTrdvHlTs7hbosWS/Wo37NBK9oa1pMyESBY7NypQ7JDJEzCPl5SUUGhoKLVo0ULrsxs3btDFixfFIOjjo9bEGeOsOpwispNQ3uTJ/g2sernQCmbn/TstdjxvL0/64T7TsS/OXM/u7NmzItNuzpw5Ig5OH2+99Zaw5h07dkzM/v/9919RUwtxQf369RPZgHCv6kOyLMD1igVuJBRa3bt3L912221W/W3OmDX+x55LFk2asLRMaLJiudyJIjw9PYV17tq1a1rb8R7b8bmlgTxicUdOXcumY1ezyNvTgwY0jbW7zIRoLHbuo9g5pCsW2U2IZ4BlQg5S2pGmjkEJs6crV9TmXsYwyBp975/jYv2+bnUpKtj1Hzad6kWSM4HAb1jsgoODDe7z7bffihpakksHgeCdO3cW2yUMWex0QWYfMvwgQ4Zw1xihP/deEsod2uzBjeSIRAb7ul1drqqCsiXr1q3T2obJEWLmGMuyrCwbFp6W8LKWXvYkWBNjx8kTdmX16tVaAxaABe/JJ58UNYUOHTokqoDDwsEY5+/9l+hESjaF+nvT5O626wdrTwY0iaV5E9vRf8/30WxzgpBCg8CVA6te27ZttbbjPaxuSkBckKTowZ2EtkgjR440uL87xgghZGFBWdLE+I727wtrspJ+jrqxOUOahCBcD4wVWEf4gsRTTz1FGzdupI8++kgYBJANu2XLFoM17xgLZMNW0g1raULcMHnCbFcshGbZsmW0Z88euv322yu4SsH169fpzz//FIGprVu3FpW65ZaAnTv1m1jbt29v0HwN92tAQAC1bNlSvMegZKhmEVPeOuzjf9XlLR7omShqv1mb3KJcavJJE7F+5OEjFOgTaPM/Bwbkvo21XQCeDjpIK21nBKpVq6a1PSoqSvOZKZo2bSoGO1wbJdmwiBGaNm2a5j0sdq6u3O08l0HHU7JEb8mRbeMdViakxubFpSoRNxRa5mpyVzDxiY2N1ZrEfPXVV2KskOJLMZmBlRreoJdeekkkEeE9rN6MZROPYEjw9fKsUuUFS8pMKCt2xlm1ahU9+OCDYpCAcpeUlFRBsTt58iR1796dGjRoID7DzAgxQFKVbwxEzz//vN7jQ9Di4vSnRmdnZ4uWLhJwW6GeEGOYNUdT6ExajrixJ9qoBAhmzOdvqq0ejmBNmNKjHq09do3ubO+8Somvr3ogz8vL09qem5ur+UwJxrL4dHHHGKEfypImhreuYdFJkKVlAoW9ES+bW1girHburtjBomwovlQO4kk5ptQ2RYl7NIiqkgxZUmaCyurYQV7cBbMsdpgVIYC7Vq1aBt0UmOUjAByVvhGUilo/sNqNGzdO9NeD4rZ582azT7RGjRoiswiVwZE0gUKrrm5BqCpfbTojXsd2rF3pBubODgoxY3FmIHf+/v506ZI6qF8C71FTi6k6yDBdeUg9KI3v5PjXFFa73MI8up5TSLUjyye8DGMvoIBpesM6iBsWwAIP8ovcR7EzK3miVatWQqkzBCwIKKWAqt5SphHM4eixB2ucUvbt2ycWWOSgBKIBc0REhMgAfOyxx2jp0qWi/QuqfxvCXYO/JQ5duilcSz5eHlyw18mB6xTFVP/++2/NNlgoIGvIjGWqzq87kqmoREVtaoVT0xphDn9JI4LU1pAMTqBgHISjV7LoTGqOKOjdz4EK4AeUKXZ5RSUO4UVyuqxYZNuhun39+vW1tuM9amgp5cMPPxQ9/aDMwW0rxeShvhcGuc8++4weeughkR1rCHcM/pbz++6L4hXtkOLC1HWvGMcEEyIkBWHBhOTMmTNi/cCBA5p9Zs2aJbYhWxzxqyNGjKDAwEB65JFH7HrurkBxSSn95KB9YU3F2V3PcZ9MP8Y5kiZ6N4x2KA+Rv6+XpkIEJm/ugEWvPuLgABQpOeHh4SKgVSm6GbESCB6fO3euomO4Y/C3BNqGLd6ndtvd0c5yQeCMdUBV/FdffVWsI371xIkT4n2HDh3o7bff1mTAIovv448/ps8//1wUKp43b56Y/DBV499j1+jKzXyRbTqoufIWdo6QGXuDLXaMAwBLmFTmxFGyYXUtdiCvsMThWgQ6vGIn1eFClpJuUWFjNbqsgZLg770XMuj1ZUfFOiIGpbBB0aVA/X/1e7HuUb4u208eaoi4Q+1/o3+7+JeaY+g/nvw7PT09KCzAm8IDfCk80EfE1DSKC6H4iAC9sY7/nU6jjNwi0Xqoe1KUeReOsTkIb4A1zhQoYmxo0sNUvdPE6PYJoiWdc1nsuJYdY38OX86kc+m55OftSX0bxZAj4ePlKYolI4sc7tgwcv1kI4sqdomJiSLzDpmx8sKPeG+sGKq9yMwvpt3nlZWLcETqRAbSHW3j6Z6udTWZP2D98VTx2q9xjOjcYEugaDaJVqepO2odMIaROJOaTZtOpomJ1NgOtZxGJjS17NhixzgAy8t6w/ZpFKM1FjmKzAT4eInSQFDs3AGLKnaI+Rk4cCB9//33oko+Eij2799Pu3bt0riaHIkm1UPp8/Eo+qrS9BfFS/m67vZy/7zefVTq/dTrssZWYrtKzz4Vv0N6Iz8PzDRu5hXRzdxCSs8ppNOpOXTqWpaYIb27+gT9vCOZvpnUnhrGhYj91x1Xt87p1dD2MyfUGzr8kHK3O8PYkwXb1LF1fRrGUEK1QKeRCak2V2ae+xRdZRzYDVum2A1uYZlQBkvLjL9vmWLnJiVPzFLsENQ9f/58zfs//vhDlB2BiwidIMB7770n6tghiw917BYuXEh33XUXDRo0iBwNuCoHNtNfN8/RySkoppWHrtL7a07QxYw8Gj9vOy17rJvQCM+n5woLhKO2RGIYRyC3sJgW7lY3Zx/vJEkTEsFS/0s3amzOOK4bFmOOv4+nsNg5IoFlCRRssTMBKnjrAxmwR44coUWLFlF6erqw3sk7TzCWAeZuVMfv2ziG7vxiq6j2/eaKYzS4LPg7KTpY0/yYYZiKLNl/WbQZqlUtkHrWj3aqSyS1Scp2o/6XjGMiWeug1AX6Ok42rDvXsjPrr4A2LEpcqsheRWFixvqgyfLbd7Sk4Z9sob/2XhJV6UHzePvU4kIrmPZftRfrO+/faZeWYgyjxH00X+oL26mWSFByJpkI8XO//peMY2fDWjKj3NIy41c2LrpL9wnHVK8Zs2iVEE4tE8Jpf/IN+mm7OmaocVyo3QT9SOoRzTrDOCJ7k28IFxJKH4xqm+B0MhEsWezYFcvYEcjQheuWd8NaWmb8ypIIi0pKyR1w/YIubkI/HaGyViA4w7gCC8qsdUNb1KCIsgxTZ0IKs8hmix3jAL1h+zaKdVg3LPDxVlvkWbFjnIoWCeFa71HjjmGYiqD2mzQgOUunCV2kyv7ZhcVUWsqWccZe2bDqbhOOXtjbp8xih+L97gBb7FyE+jHaBaBrhrNixzD6+G1XMhWWlFKL+DARxuCMSMkT8FLlFHKcHWN7Dl3KpOTreSIxoXejaKdQ7IrcpKUYK3YuQkyIdpeNsADOiGUYXdAvUuo0Mb6Tc1rrACr8+3ip3UscZ8fYg6Vl1jpHzoaV8OUYO8YZ0e0wYc0sP4ZxVjacuCbqPmLig/g6ZwXV+KUK/xxnx9i3N6xju2GBNAlylxg7x1azGacccGqHqS0h3FKMcTR+KEuaGNU2ngLKipY6q0zABXaDitym6CrjOBy8dFNMkIQb1godjiwtMz5SjB0rdgxjPqg3dO6Jc3zpGIfjQnourT+h7qM8zoZuWGvJRHnRVfewQjCOw/KDV8Vrn8YxVpkgWVpmfLzLYuyKOcaOYRjGZfhxx3mRbNCjQTTVjQoiZ8fPzarpM47jhl19WK3YDWzqHC05fTnGjmEYxrWA8vPbTnVf2AlOnDQhB0VhAbtiGVty6lo2nUnLEcpSr4aOnQ2rG2PnLq5Yzop1IRwhXyKvKE+0gsGCdYZxBBDonZFbJMoA2bpRubVkwt36XzKOweojKeK1a1Kk1fqRW1pmfNzMYsfJEy6Et6en3WckpapS2nV5l2adYRyBH8pKnIztWIu8bDwDspZMSH2hCzjGjrEha49dE6/9m8Q5jcx4lyl2xWV17Hafz6AGscFCMUUJJDwSXCnZjxU7F0IMWDx5ZxgtDl68SfuSbwh3zJ3trNsX1pawK5axNTdzi2jvhQyx7ixuWOBTNplLzymgOs8vI0vRvk4EdUmMEsrh2bQcahAbIrrZfLvlrKiXueyx7lTDDs0CWLFzIbwRR1Bk77NgGMdCKkiMtkfROoW8nRnJYseuWMZW7EnOIHSwQ/KRPRSWqmbFLi/L5rUUO89liEVi2cEr9P6aE5r3Xd5cS8dmDdTIqq3gGDsXwnUMyQxjOQvD4v2XXCppwl0z/Rj7s/fCDfHaupZzteLztmMAeqMZK23+nWyxcyFQyoFhmHIW7k4Wdd4axYVQ29oRrmehF5l+LPjOCFrBPfTjHnIWWsWH0d5kSbFzLlny0enMZGu+2XyW7u1W12bfx4odwzAuSWmpin7cfkGsI+7FlYKjpWQpUMwWO6cEf7eNZQWznQH5ubZOCHfKSZC9eG3pEVbsmMrhKPP2qMAoe58Cw9CW02kioDnYz5uGt6rpcjIh1eYqRtAT43SgY8N7d7YkRwf317O/H9Dalhgd7FQy4+VikzpTsMXOxSqC25sg3yBKfcZ5ZqGM6ydN3N6mJgX5ebucTEglHDjGzjnx8/ai29vEkzMwrGUNrVgxa/dZtrTM5Ba6V7kITp5wIeyv1jGMY3D1Zj6tOaqutzXexZImdEs4SLW5GMZa2Dqr09LkFBSTO8EWOxfCAQx2DOMQ/LTjgqgt1aFONVFbyhXxLFPsSsoEH8osaozVjw2mqGA/OnktW7ihQ/y9RXwhYg7RfgzbCotLKb+4hAJ9yoeA67mFYvv1nEJacuAyvTKkCcWE+tvt9zGOl4Vt7wL4lSXHzSx2rNi5ECoHsNmh/cutP94q1leMW0EBPs5T64hxDaCc/FSWNDG+c22XlQmPsgJH0Os+XX+K3l55nCzdhm3jM72pVmSgRY/LOCe2LIBvaZkJ8a+o6lQP86d2darRkv2XK3w2qm08PTuwEbX/3xpFxx/UPM7iNfKqArtiXQhHsNih/cuG8xvEwi3FGHuw4tAVSssuoNhQP7q1mfXaHtlbJqTSXD/vuGBxpU6ixzvrrHJcxvmwZSk4S8vMpC519GbKzhnVkn6Z0klr+7ujWtI7o1qKYuZzx7bW+qxedJDe4z/UK8no9795e3OyJWyxcyEcQK9jGLvz5opj4nVM+1p2r19lTXacu26T73l64X66pWkc9W8Sa5PvYxwTZy4XFKQneWp0uwTy9fakTvUi6bXbmorQjXEda4ttEkNa1KDBzatT3enLK/W9Z94YpAmZsCWs2LkSrNkxbs6eCxl05Wa+WL+zvev0hdXHppNpNvme33dfFNeVFTv3xon1ugqMaF2TpsqsbHd3rmjRM0ehNZRcYg+lTnyvXb6VcdkYO4axJw8tUFfyD/DxoppO1MvS0TmTmmPvU2DszN1l8ao9GkSTM9MlMZLeH91KHTNYReIjAuj14c0oKUa7rl+QrxfNm9iO7AVb7FwIR4ixYxh7gWzOq5lqa91zAxvyH4KpFBcuXKDc3FxhqWnYUPs+KiwspCtXrlBsbCz5+7tXxvAT/RpQh7qR1M5JW/N9fFdr+mLjaZptoXi3r+9uR/1k4QmP9E6iuetOifWDr95iN2sdYMXOhWC9jnFnXltyWLM+zkVr1zHW56WXXqIdO3bQ6dOnqaioSLP977//pnvvvZdCQkLo5s2b9Nlnn9Ho0aPd5k+CeNWeTmytG9qyhlgshVypA1N7JYowkMEt4uyq1AF2xboQjtB5AgT6BIqFYWzZUP2vfZc1rhZHS5pgmXAe5s+fT8eOHSMvL+24qXfffZfmzZtHZ8+epV9//ZXefvttu52jO+CIMuNhIkFjzp0tqU8j+ycZOaTFbufOnVRSUiJmRk2bNq3weUpKCl26dInatGljl/NzVBxBrUMrmJwXOB7Hnty4cYOKi4vFwBQRUdFtkp+f73JupHNp5ffcWyNbkCNhLZkID/ShG7nlFiVjzBjShGYtPaL3s+/v7UATv9lBzsKJEydozZo11KJFC+rWrVuFz0tLS2ndunV05swZqlevHvXu3Zs8PcsV/VOnTgn50KVmzZpizDFEhw4daNOmTVSnTh1av349dezY0YK/inGGcaRRXCiddoJ4U4dU7J577jlKS0ujwMBA2rZtm9ZneXl5NG7cODp06BBdveo4BQEdAQcx2DF25tZbbxWDX0BAAF28eFGzHYPhAw88IOSmSZMm9Pvvv1Pt2s7vsryWmU9D527W1JlKqOZYs3xrdgLQzfR7aXBjem7RAU07NYn7utWl0e0T6LstZ+nd1Se0PoPXKNTfmzLzDbdd2jujP9mbc+fO0f3330/nz5+n69ev0/jx4ysodpi0DB48WNz/PXr0oNdee03EyS1dulQzmZkwYQJlZGRUOP5HH31EAwYMMPj9o0aNEq7XP/74Q7hoYbVj3IO/H+lKO85ep7pRQbTs4BVydBzLX1HG2rVrhTnckNKHhWEY/WzdupWOH69YsHb37t3C0pCVlUXdu3en9957zyUu4YYTqZpJTYMY12wfpo82tSIqFFaNDPajrye219qO9mIArcQe6VOffpqsbWlqER9OCx/sQsNb1aB1T/eivo1iKnyXj6y2l72AF+fZZ58V9zasZvqAcnbgwAHatWsX/fjjjyJWbu/evfTxxx9ryQdcrbqLMaVOUuygIMISuGHDBrr99tst/hsZx6RFfDhN7l7PaUq+mG2xg5l75cqVtGfPHho+fDg1a9ZMryto8eLFlJqaSq1bt6a+fftqPisoKBCCpg/s6+enfgjpY+HChcI1i/0YxyS/OJ9G/jZSrC+6cxH5e7uWy89SWXcYXOBKaty4sd5YSYQjXL58WXyum5kHa7Y+wsPDydvbsEhjQpSZmSmseJDNdu3sl45vSdD/FMSE+NGHd7Uid5GJN0c2p5WH1V6LTc/2Nli+4d5u2kpQl6Qozfp397SnsAAfsXwwRv1cLZWZ/mEB9fP2EuUb7E1iYqJYjAErGhQuZK2C6tWri/fY/swzzyj6Hli0MYZBDqHwIZwBx4MFHGMfxsCNGzcaDWfAOIdFAnLHKIfHERsqdv/88w89+OCDVL9+fVq1apWYNekqdsgkgjWgbt261Lx5cxFgOmjQIPruu+/E5zChP/HEE3qP/+effwpBNGSG/+qrr4RpHZYHmMIxK3OVwclVKCktoeUnl2vWmXLgHsLgsn//fhEn+sorr1RQ7HJycoQrCVYJyA8UwEmTJmksDhgsGjVqpPeyQibbtm1r9JLfc889YnCCfL7zzjtV+vOcT8+hJ37dZ/c/8bVM9QDarX6UUELcRSbCA33p7OxBeouooobfpRt5opXRne0MF2qGQqdLqSyk458ne4qAcWfpOnDkyBHhapUDGYP1TimffPKJMCJARmC8GDNmDL366qv0yy+/0MyZM2nBggVUq1YtWrRokcFjzJ49W+zLuNY4olK5oGIXGRkp4nRwwxsS9GnTpgnFD+5UBG8jpgdJDhCOgQMHCsVNN25OCYcPHxazHiiFCHyFO2n69OlC2WQYZwAlElAuYciQIQZj22bNmiUmMYghhbxhEoMg7X79+tFtt90mLNqGLHZKkAYjlGqAbMKyXlnyi0pp74Ub5CjUrqa/j6MrY+g5vGZaT0rPKaD4COPxhp56/n2TGqHCvQ0sUcTVVmBcQIwdLNdyYHFDbDY+N2bRlssgFl3gKfrrr78UnQvGJoyFEhi7EhJcuxOKO6ByRcXOVBYqijouX76cvvzyS02qOIQBVjUEakOxU8LBgwfFkp2dLZRAmN9hxcACMLDBUmhMqXNHU7iU+fZQL+PuCsY+tG+vHfukD1gDoPxBqQOwwPXs2VNsh2KnBNzrsIzDZSQlIWFB0hFilMLCwoRl3cenorXGHPmpEe5PX93tGBZzdJroWK+avU/DYQjw9aJ4X8NKHRQ29MZM1KmYDx7rU1+UixngZL1hobRhwaRfDu5d3OtKlDpLgQmYsbAixjlpU1acGfGqjoxFzw6DBWZFDRo00NqO94hVUApcRHBbBQcHCwvdCy+8QMOGDdN8DiE15XJyR1M4Mt8GNY+juFCOa3NGkKmHMj664Q1wycJ9qpSpU6cKtyyA2xbKHJaxY8fSfffdJ5S+zp07awWUV0Z+Qvx9uH+ok3Lw1QFUVKzSO0BBKZzWX/sZ7izAW4Q6c3KQ7IDtDFNVqgX5igxxyIjbKHawsAFYBOTANA5XqlIMZcRK4PjLli0zuo+7msKrh3F/TGd21YJq1bQtT7DeIZhbKYbiieRWb1O4q/y4C4G+3kS+5HLAAIBYuNdff11YqRGzithtWKsZxhJEBDm+4FhUsQsKCtLrtsGAJX1mK9gUzjgbkutGmiBJ4L2tCwqz/DCOBvq0IswHIKsbSUhz586l6OhoTWsvWKZRZ65Pnz5iEiPVr8N2hnEXLKrYIRYOcQyo7N2lSxfN9pMnT+rtIGGPdlvuEGtnT3IKc4jUfdjFtS7xdZyMJl2ke8FRWrGhpAImQCiHIgcFWVFB356w/LiHTDiy/KCOnRTSM3ToUPGK9/KJEKzdqJYArw9csMiQnThxotGOEraA5cc8XFVmbCY/qkqCf/rDDz9U2D5o0CBVnz59VCUlJeL9wYMHVR4eHqolS5ao7ElycrI4Z174GujeA7g3bE3NmjVVs2fPrrB95MiRqu7du6tKS0vF+5s3b6rCwsJU7777rsqesPyw3DiS/Dgbp0+f5rGHZUil7xrg3rA0HviPUiUQZRiQnQdmzJhBd9xxB7Vs2VJkvkqxO6i/hTp2CADHZygMidYuiHuwJ8gQRMFX/FzUIEpOTqbQ0FByN6RYKf79yWIWjwy6GjVqaPWStBb4Lik29OGHH6ZbbrlFxAShBBAyXyULRKdOnUQVfPS4/P7778W/QwV9W4cz6MoPZButyNz13gHuLj+61wF141BA2xby48wgRhZlV2CN141BdydYfrRD1KCLIGlOt0SPTV2xMIWjThB48cUXxSveo1iwBIQcwo4Cj+np6aKoMAoU2xs8eOLj4zXmTzyU3fnBzL9f/fe35UMWCppUB6t///5CWcL7Vq1aaRQ7ZLGiMwtiiVDqBwVSH3roIbsqdZL8oEk6cPd7B/A1UIN7gpU600jXCM8bd5cdwPJTjjXkxyyLnSsAxQ7CBW3ZHQWMf797//2rgrvfO4CvAV8Hvm9Yfhz9WcL2c4ZhGIZhGBfB7RQ7lHFAj053rQrOv9+9//5Vwd3vHcDXgK8D3zcsP47+LHE7VyzDMAzDMIyr4nYWO4ZhGIZhGFeFFTuGYRiGYRgXwaKdJxjG2VsWYQEoL+Lh4WHvU2IYhmEYs2CLnR7mzZsnCiw3b95c1OEDKEgaFRWltbz99tvkamzfvt3g73vzzTdFncKkpCR64YUXHKYVl6VA4/u4uDiRgo5ivIx5TJ06VUs+cC8BKMuPPvqoaDk4cOBA0SLNVUFdz+eff17ISMeOHWn58uVanxcUFIiahVJvU1cENUzbtm1LDRo0oJdeesnlnhPW4vDhw6LmK2oDQn5wr+zevbvCuPPdd9+RK4Pfh7EXY/Dnn3+u2f7DDz+Imp+o9fn666+TK/Pll1+K39+iRQv65ptvzP73bLHT4cSJE6K59O+//y4qQt92223Uq1cvMShJfQoBugLgM1cDD2T8zo8++ohyc3M12/GA+eyzz0RTbfQDRtcRDFDonuAqzJkzRyx4eDCVK8CMBxI6zQCpmvoHH3xAp0+fplWrVgm5uueee2jt2rUueYkx+KBfKX4rZObOO+8UhdqlzDdMiFCcevPmzeSKoLvPokWLxIQYhVehwLZp04Zuv/12e5+aw9c0w5jy1FNPCRny9/cX9wy6N0njDhoEdOjQQdPlyRVBf9+dO3fSb7/9Jq6JNP7iXlqzZo3oxIOGCBh/cC3QocfVOHLkiFjwrLx+/bq4Brg36tat69qKHf7gaM2CH2qoIn9qaqrYr06dOuTl5aX42JhlQqkBUOxgvfHx8RE3FmZLAB0BsA7rlT1ISUkRv69x48YGfxssjABtf8wBSht+W2BgoKbLCMB7FFFEM3p8JwZtezfW1qW4uJg2bNggHoCGBB6DLAZcnDseDObcG64ALJEBAQGilY0+YCXAvRMdHV2prhyPP/64GJAw+Lz11lvifsJkYNasWcKK9eyzzwpLMJRAe90/eFhCAalfv77BUgNXrlwR9z+eH+a45CdPnqzZH51uIDfS+7///lvII2bijqzYwcKG+yQ4OFj8Bn3g2uA+iY2N1SquivZ48vaRmCThHnAFlN43kKHatWubdd/88ccf4rjPPfec3ucxQJeaLl26CNl0hPEXsoF7xJLjL8aXTz75RKyjcK80/mI7lDqJpk2bOvR9lZeXJyazsL6ilZw+oF9gPMKz2NfXV7MdbRsxGZbuOciX2b9V5UQcOXJENXnyZFVUVJRonvvPP/9U2AdN0wcNGqTy8/NTRUdHq6pXr65avXq15vNdu3apIiMj9S75+flinwsXLoj33t7eqldeeaXCd4wfP171888/q2zNhg0bVCNGjFCFhISI35+amlphn+PHj6tatGgh9gkNDRXr2Cbx3Xff6f3tnTp10joOGtTr/vbp06erfH19xbWdOnWqypF4/fXXVbVq1VLVrFlTVbt2bb37fP/996qgoCDxW7FPo0aNVOfPn6+wX8uWLVVHjx5VuQq4rz/88ENV48aNVf7+/qrbbrtN735ffvmluG8gM/g7P/DAA6ri4mLN53379tV773zyySfi86ysLHFPHjp0SNW/f3/N/dOgQQPViRMnNMfBeZw8eVJlayD748aNU4WHhwv5OXjwYIV9rly5ourevbsqICBAVa1aNVW9evVU27dv13y+fPlyvdcA+8kpKSlR3XvvveKaguTkZNV9990n1vHcuuWWW1SORm5urmrOnDni74X7ZPTo0Xr3mzt3rpCjGjVqiPvk0UcfVZWWllbY788//1QNHTpUXAtnRsl9c+nSJVXXrl1VgYGBqoiICFVSUpL4dxJ///233vsG1xq8+uqrqgkTJoh7r27duqonnnhCS/ZAv379VOvWrVPZi2PHjqmmTJkixlVchxUrVlTYJzMzUzVkyBDN+BsXF6dauXKl5vN9+/YZHH+zs7PFPpcvX9aMvy+++GKF7/jxxx9Vo0aNUjkiFy5cUE2bNk08Qz08PFRfffVVhX0KCwtVEydOFLKD64P7asGCBVr7nDlzRnMNZs2aZfZ5OJVi98UXX4gFg4IhxQ7C0aRJE1V6erp4//LLL4vBKiUlRbwvKioSg4++RQIPIrzfs2ePUIw2btyo+Qzb4+PjVQUFBSpbM2PGDNXvv/+uWrJkiV7FDufdrFkz1fDhw8XvxA00bNgwsU16uObl5en97RkZGUYVOwhnhw4dhMKDQRqD/G+//aZyFN544w0xeEII9Cl2586dE4KE+wfg2nTr1k01cOBAl1fscF0w+B4+fFg1cuRIvYrdtm3bVJ6enqqFCxeK9/j9GKDefvttzT43btzQe+9AIdAFkylJeYEijeNLxMbGauTTlrzzzjuqH374QZyLoQEaCmmXLl1UOTk5Qmag3OIhjfcAcq/vGsh/DxTpMWPGqD7//HPNtqefflpMtPCwxquPj4+QTUfi9OnTQqHAAD548GC9ih0ml7hPFi9eLN4fOHBA/J6PPvpIa79vvvlG3GvSZNmZUXLf9O7dWyhlkAXcN1DiMcmUZMPUfYOJFyaauJ54vkJJxERUApNzfG5PoKR89tlnqrNnzxpU7O655x5Vw4YNNWPTzJkzxSQAypq54+/evXtVrVq1Uq1du1ZrUjF27Fjx/HZEFi1apHr33XdVaWlpQrnVp9hhHIdCB+UNzJs3T+Xl5aV1X0nXYPfu3aqmTZuqtmzZ4rqKnXxWrU+xg7UOD8xvv/1Wsw2KTHBwsOr9999XdGzMyHEjYQaK42HwlwY7SeF55plnVPYEAqVPsYMCqvvggXBg26ZNm8z6Dl3FDpYHKEF4UEOoMHDhgedoGFLs3nrrLWGBwYNFAn9XzKquXr0q3uN3werUvHlzIVD6FBZnx5BiB+tS27ZttbY9/vjjqsTERLO/A/fIpEmTVI899ph4/9xzz4njwwKBiQkmS/ZEkgndARoPWt0BCxNCKDJKLfTXr18Xkx7d/WGNkAYwPPz79OkjFGVHxZBih0EVSoccKL8YfCRgfbr77ru1ZM0VMHTf6DM0QJHBs0U+dhgDx2zfvr24T/AcgoxCiZLLIqypjgDuYX2KHZ6dusoMFFoo/krHilWrVqnWrFkjxl9Y/3r16iVkCe8x7uJecxYLsJ8BxQ4TW11vGCy8+BuDpUuXigkUfjOeEZ07dxbWb3NwqazYAwcOiMBKZKNJIAi1devWIq5KCe3ataP33ntP+LVr1Kgh4tiGDx8uPistLRWBrVOmTCFHBL8RMT2I4ZHHuCCmSunvv3btmojpQEwUYqGwjriRMWPGiNgbxNYh7gHb7r33XnIWkBCjG5eBa4PfdOjQIfEeAd/IikUALxIAXDE5xhC4P+RyAxDPgzgRxLooAfE0uF9wjyAO9OWXXxbbn3nmGTp79qyIx5k2bZqQIUdEkhH5dYiJiRGJU0rl59NPP6WNGzfSI488oslixG9HLLD0Hs8WxA1VJobRUe8TBHsjrgixea+++qqIq4Qs4fdKMcuuyq5du8Sr/Log1hDyoPS+wTMbCSaIwYT84Lk0ceJE8RmS2BC3KL13VPAcRXyh/DogdgwJeUqvA/bF/QLZwDWE7I0cOZL27NlD77zzjkgogEzivkL1Cmfj4sWL4tmoK0OdO3fWXKP27duL+GQ8JxCjhwSaoUOHmvU9jht9WAkQiAgiIyO1tuN9WlqaomMgMHXJkiXiIQWlUDcAFkKMrDdH/f26v70yv1+e/Qvwe5E8snLlSlG6Ag8dZ+sXCuVEN4hVulY3btwQrw899JBY3BF99470HveOEiVEejBJiov8OMiCxUPfke8bXAPc51I2b2XkB4rrAw88oLVN93mBbHIk7rjSfYJnAgK9kSCDwHk5hhLcXAVcE9zvuslA5tw3AGVykFyEJDB5MD3W8UzWvS9dcfzFvosXLxbJOXhWSOMvlBvd+8pQ4oazXiNkAwMorsuWLTOog7idYidZY6QisxIYUOQDjRJg5dIFD31HVeqk36/72839/biJpCwsfcgfOM4EzhuZmHKys7PFqyMrG/a8d3DfAKX3jr5JhRxHv864BrDKY2CV/2Zz5AfPDX3PDjk4lrnPI2e5T5ABaez54YrgmiATH/cOxoiqjDv497rPWBzf0ZU6S4+/UGh0j+0K95W3GdfI1HPEGC7lipVKe8BNKAfvzS374YzgN2JGIL9pcMNgJu0Ov98YSJeXSsBISO/NqQ/kquD+0Cc3eBDBpeYOSDJy9epVt3x+VOU+wUDsCgNvZa8JlDq42OTgPnKn+8bdx18lSOWDrH2NXEqxQwwVzJjyau/waSO+CgX+XB0UcsTM8Z9//tFsQ6FUPHTwmTtz6623ivgfKZ5OqpCPGkKoG+TuQD5Wr14trFUScAd07drVaa205tKpUyehoMifH4jtwQDtDs8PJeA6SM8U+X0C97LcWuVOIMYQMiK/b3bs2CFch+5036AjBCaB8usAhQUy5E7XwRgIaUHBbvk1gssVoSqWvEbezhYnBSuL5Kc+d+6cGKihzGGBG+CVV16hp59+WmjGsMTMmDFDJE+MGDGCnB0MMIhVkFoySXEXUE6k4sGTJk0SrZ3mzp0r9nn44YdFpX9Xt0qh4CuuzdGjR0WwMYp5AhQqRkJJ3759aciQIeI+wP2Ba/jxxx+LoGR36AmL6wKlH0VD8Qq5gbwgOQgg2P+LL76g8ePHi3tm/fr1ItYUyp6rgOcGBhokhIBTp06JVyRJIcQCMoRED7SWwwMYMZnoBIB7qFu3buQOIAkCShvCFqT7BC4iqRg7ClAjaB3Pmfvvv19MItERAPeLq2LqvsEzGPcJ4uMQ94V7B7GWaA+GyYKrII2/UkwynqG4PxCXjULVUOxnzpxJjz32mBiTkPiA8RjtwdApwh3Izc0VyXcAcacoaI1rhHtEsta99tprIjEPBgXE2iJZE/cM5MlSeCA1lpwEZFohwFQXBCujF6XE/PnzRZVqDGLINsHNZSr+xxlAu6tvv/22wvb3339ftCkCcMO+++674loBKDNQZFzd6oKelHJrnAQyMKH0A2RMQ3nZsmWLCHSeMGECde/endzFqgB5kANF5r///tO8x4CFhw56ViIj7YknnqB+/fqRK/WghGzo8uKLL9Jdd90l1vE4RGbrr7/+KsIY+vTpIz53xkDtyoCsRClmTgIuVrniBss37hNMLJG1B6UGFjtXRcl9A2UYHRPgBcD1g9ygfZwrJY4geQ5jib5uK3hWSPz444+ivykUQWn8dRc3/d69e8W4oguyWmfPnq1l5YbxBVUokBiCa4RuJW6p2DEMwzAMwzCGcc+gCIZhGIZhGBeEFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBeBFTuGYRiGYRgXgRU7hmEYhmEYF4EVO4ZhGIZhGBfBm9yE0tJSunz5MoWEhJCHh4e9T4dxAFQqFWVlZVGNGjXI05PnOMZg+WFYfhjGOXAbxQ5KXUJCgr1Pg3FAkpOTKT4+3t6n4dCw/DCGYPlhGMfCbRQ7WOqkh1BoaKhFrD3pueliPTIwkq2ATkhmZqZQ9qV7gzEMyw/D8sMwzoHbKHaS+xVKnSUUu5zCHEr8IFGsZ0/PpiDfoCofk7EP7JpXfo1YfhiWH4ZxbBxSsfv111+pqKiIoqOj6ZZbbtFsX7VqFaWmpmre33HHHeTv72+ns2SqyunUbNp59jqFB/rQwGbVxbbsgmJaeegq9W8cS2GBPnyRGZtRVFJKWfnFVC3IV/G/OZeWQ2uPXaNxnWqRn7eXVc+PYRjGaRW7f/75h65cuULp6elait0rr7xC1atXp6AgtXVs6NChbqPYlZSqqLC4lAJ8bT94rD2WQvd+t4teGdqE7ula12K/Z/jcLZRVUCzeh/p706bn+tA7q47Rgm0XqHfDaPr2ng4W+S6GkVNQXELZ+cUUGexHry89Ql9vPksHXh1Aryw+TEsPXKZvJ3WgbvWjtMIuMAmpGxVMXp7aiVcP/LCbjqdkifv5/h71NNt3nbtOd3y+Vayfe3NwBQXyhT8OUu3IQHqkT32L/XHyCkvo993JNKRFDYrQUU4zcgrp/vm7qH+TWHqgp9rTwDCMa+KQqYBff/01/e9//9P7GZS5CRMm0BdffEFhYWHkDpSWqijxheXU+OWVYiCq8/wy2nnuuk2++2JGrlDqwMwlR8z+9xjwMJDqkltYrFHqQGZ+Mb3/zwmh1IF1x8sts5Xllx0XxLXCtVt24EqVj8e4Bg//uIc6v7mWNp9ME0odWLr/Cv259xIVlajok3Wn6PKNPPro35OUU1BMH/57kvq9t5G+KdtXfm9DqQMbT2rfr6uPpGjWr9zM0/oMVuqFuy/Su6tP0M28Ir3nCGUSpGTmi3sYC8A5n0nN1jo2zhE8/ft+mrH4ML389+EKx/tj7yXadT6DZq84Jo6NZwpkUPqukylZVFxSatZ1ZBjGRSx2N27coPnz59OePXvogQceoM6dO1fY5+TJk2IfuE1bt25N99xzD/n6qmeQOTk59Oeff+o99ogRIzTWOH0MHDiQ1q5dS2fPnqWLFy/Stm3bhAXP1Tl2VT14AGkgGlVmDQj286ZDM8utmpYgv6iECopKKcTfm7q9tU7rMyiWLw1povhYQz7eTDdzC2ndM720XFVbT6sTT+R89985rffYp23tCPL1rtz84/k/DmoG4Id/2kODW2hbThj3Aff0oz/vpYhAH1pz9JrY9vqy8onKocs3Neu5RSVCvi7dyKML13Pp990XxfZ3Vh/Xssql5xRo1hFCoGuVk+g8ey3Nm9iO3lxxjGbe1lQcVyL5ei75xQSLCVRidLCY7LSbtYYKS0rprZHN6UxqjmZfTObGz9su1m9rVYPu7lybRn5WbhWUJi9L9l+mj+9qLRTAbWeu08i2NWnW0vLfmplXTM8u2i+UxF8f6CxkFEzr34Ae62s5CyLDMPbBrBHzt99+oyZNmtCJEyfo+++/p9OnT1fYZ9euXdSqVSuhfCUlJdH7778vFDLUwQJ5eXm0cuVKvQs+M8arr75KCxYsoC1bttBtt91Gn332GbkDVzMNXxcMKKsPX6VNOhYD8PyiA2Kmb8gqoA+4exvNWEktX1tN56/nVvgciiXcOlCWPl1/isZ+tU1YN+78fKtmAJTYeCKVjl7JpMs387UGqH3JN2jKD7tNnstdX22jZ37fr/jcGUYOLFEII4BVa9Xhq/TPkRT6bddFvRMmKFgSmXlFGuVrzdEULdmA9Xn5wSt029zNWpOTixnq/d9bfZx6vrOObuRqy9x93++ik9ey6cuNZ+haVrlCCMXxmd8PCIvgqsMpQmah1IHnFh3UijPdJvu+xfsu0/KDVzXv91zIqPDH7zNnA73w50HhYpaTkpUvviunsIRGfvafZjsslQzDuJnFrn379nTq1CkKDAykTz75RO8+Tz31FPXv318oYGDUqFGUmJhICxcupNGjR1NUVJTms6pQq1YtUVvLHUjLKjT6uaQk7X6pn4gbgnUCA9MvO5PF9qkLdtNP93cy+T0rDl4RVg2JX8v+vS4HLt2kid/s0Lzv8uZa8boDcUVt1fXgTl3Lortl+5xIyRKu1luaxtFTC5UraxjAPhzTWvH+DCOxaM8lenrhfuqWFEUtE4yHbZxMKXdvXr2Zr1nXVdDWHLkmrL/g8V/2abZfzymkLzeepo/WqpWj8+kVJ0Vg/fFUqlUtUEuxg4UN4N8fvFRuOQTXMsuVwGNlbl8Jb1m834t/HtLrypW+U84TsvMuKC6tsP7zjgsiIeT90a3Ed3y2/jT1axxLzePdI/SFYdxKsatbt67JumCbNm2in376SbOtdu3a1KVLF1qyZIlQ7JSwfPly2rdvH6WlpQklEO7emjVr0u+//y4+P3funLAE4piGKCgoEIv83CyJt6c3TWw5UbNuDRbvuyQGj5FtlBXPhSWhXnQwTf5+F+UVlce11YlSVooFMXTFpeUDwucbKlpkgVyp0wesIwgqlyMNgvLYI8Z9sYX8LNylnphsPpUmQhaMcTWzXJmTy44uklKnCyzYbyw/pui85IqjPG5vz4UbpNsUR7IEgsM6St9pmRUclnE5L/5VruiVyJQ8cERnX4nqYepEtOllIQyIOUzPLhAxhlh0k0AYhnFMLPpEPXPmjJgp1qlTR2s73iPuTilwtZ4/f546deokXLToCgBLH9ZRTys2NlaUPmnXrp3BY8yePZtmzpxp9HvgVnnkp700qm28mJF66mS8GcPP24++G/4dWRq4ezBb7lwvUqMMLdqj7eI0BAKn9REboixzWD64VZZDl25WUOqsBe413Rp0+rYxjoe15EcOLNcSG05UPRnHUsgnN3K3LNDRwbRcwed0rICIyzPET9vVSUggVec7jD17+r+3QfMeSRlHLlt2QswwjJMpdlKMnG4CBKrWm4qfk2MoI9YcF+706dNp2rRpFboMyPlzzyURd4OlaY1Qeu/OVtQwznAXAigNcLHUCA+odEC/KV5efEi4UHE+lkIeyC23MKCEAwK2S1Uq8vGyzO+RArEtiZQRCOaMakkj28aL+mFjvtwmgtnv61ZXZPQhQHz5oav00+SOZinpjGuSLLN2GbPCWRO4MuVWcEuC2FZzqBMZWEE5lJOeUygWid92JWvFHjIM44aKndTRAZmzcq5fv27z0iR+fn5iMUbfxrE0tVcuLdh6ng5fzqThn2yh7+5pTx3rRerdv+705Zr1fS/3Jx9vdfxNoE+gxaxEUlwczsdSzF13Sjykt7/QV7y/cjOfBry/USuTDzW1nAHE50Gxm7nksLAwQpmDYvfEr/toaVlWYP/3N9r7NBkTYJKUW5RrcfmRI5UBsScxIX4ieUgf+Mm6FjpzQIkgXbrXj6JNJ9P07o9JnDHFThd5whPDMM6DRc1OyIJFweDDh7VdgocOHaJmzZqRoxEd4kfPDWxEa5/uRV0SI8WsHkU89c2EYd2S0+e9VRQ8O1gsU39SlxzQB9wgF8x4mFoLuHygmGJBsoNueQZDwd6OCLJy5RaYd1cd1yh1jHMApU6SH0nBsySo0yZPDLDEs0LCHB00JtRwGESrhHBFxxjYNE7x98UZ+T5j58IwjOtgUcUOFrLbb7+dvvzyS8rPV89SUXcOit1dd91Fjgoe2t9Mak8tE8LFLPhlPbFqfeeUx56AtOxCraSFab+WZ5rJaf+/NdTjnXUiKxT8dyqNftiqXa/tWmY+fb3pDN3MLSJfC7lEXZnWs/4R9bnkFknGfUFYAeQKMWIS+XqKYleFSFknhxA/b5J7+qOCfY1a7AxhLKEjKrj838WEah9Dt/uFHLTnMwRq+DEM4/qYpUUcOXKEJk2aJBYABQ7r3377rWaf9957T2SjNm/eXHSJGDZsmIh369atGzky/j5eIn4Lz0wELB+4qO1ONgUqu0v8tfeSiAv7Q5b08OKfB4X7aezX20WSA1yjEh3e+JdeX3aUnvh1r6aGFcMwyliw7byQq3av/6PVXssY/j7mTaAiAsuVN4TMBfqWK2UDZBY1tMaTo6uUyQnwMdweUK4shvr7aCmSxqxy4bLz1EW3B67cCskwjJvG2EVERFCvXr3EuvQKGjRooFlHxipKlaxfv170en3nnXeoUaNG5AwkxQTT0JY1RO20Oz7bSlun9xF14eQ1oZSAeC8w7bfyem0d60bSznPlRUSf/f0ADWtZg3q/u16zzRJttBjm33//paysLAoICNDqtbxz5066dKl8AgIZDg9X5g60BEhwQexoCwvXQ5M6SMDaDlldsP0CzZCV+9AHlCN98WZQzPTFroUF+GglI4UG+GjCGWqGB2g+C/H30fx7WN/xXn4MqVg4erYGyvo+B/l6iYLBkqtXbnlDopa3p6dm0lcj3F9TQPnWZnG08vBVTaye/Dx9vDxEizRDSh8shkozZhmGcVHFDu27JGudMXx8fESRYmdkVNsEodjhITrqi6209qleoseixKtDm9BrS4+IWbs5YBDQLT6KDg/m8OPkjuLB/d4/J0RJFIbRB1r2ofTQgQMHROs9ibfeeouuXbtG1apVE+9hVbeVYgdFpGtZIWuw66XuFjs2stSlGFG0yzKl1EnxZvoUu6gQP72KnZ/MwgfFzk+WFQ9FSwIKn6R0Bfl5aRURhhVOUuygyAXIrH743pyy84ElL0j2Gb5LbsmvGxWkmSTCcugjU/rkCiG8EOGBXhrlTddCh/NjGMb1sE5lUCemc2Jkhaywb7eUFxEd0TqeXl1S3ndRN6g/0MDDEn1Qq2qpwEO7aY0wozE2zghKu1gyC9jdmTt3rijujdZ+uowZM4aaNm0qakAa68tsaeRKHej85r9EFgr5kneHWHpQWTcauDcNxbbpywaVK3KY1CGuTyIutNxiFxZQ/kgN8vPWklVY/6WiwoF+UMg8tFy952WKXYDMmif/bl0FDcqZPJlDbrHDv4OVVF7uRI7cncwwjOvAkq2DrtKEkgnynozy3o26zNt8lu7pql2cWc6Bi9oWO3PBDFzK+LMld7aL1+qxaWng/nYXxa6oqEhY1NChBfGn+izbqamp9MMPP4iWeY0bN6bx48drSveg5/Lff/+t99g9e/YU4RKG6NChA61evVr0eYYlb926dVphFNYCyUW6iIxVCyh2SJiQ90L+dJ3+bim67k5D1ip5koR8f926lfLix7GyODq5wghXp9xiJ4+/w7Hl9e3kChmUuiCZ0uXrrX2u/8l6xmJfeZ1K+ffDfVtSWn6etSO1FXlT3TgYhnFOWLL18OWEtpr+q8eu6lc4PMiTAku6atYBXB65JoK2q4IUbJ2lx1VkTby9POm9O1tqxQxaksbVLVeM2ZFBRxVYzDp27Ehr1qwRbfJ0FTup4wrKA3Xv3l0kI3399dciZhXKXUlJCX33nf6ODU2aNDGq2D377LOa9VmzZon416+++oqszUM/lrfhmtSljrBeQ2Y6xg2ihGqB5OVZeZdgRq52H2XJDaqPasG+lHNd/bk8vk1eT06uGMWG+Wusd75e2ucoL6XiJ0uCkMfUwWIH2ZHILyrVmqTJEzyCZUofzi01uzz2Ta5UQhlrnRBBey+ok7uCfL21wkLkCquPtwflFBieBMqvAcMwrgMrdnpAllvHutVo+9nrokm3PjzIl6ILp2ttQ7kUa1a4l2b1/jZ+IMNldHubeNEDdtVhy/Z6xaDVo36UsNpJzdCHt6pBf+1T5lJzJqDIIYEhLi5OtMnTx0svvSQ6pKB9npeXFz344INUr149mjdvHj300EMifvWvv/6q8rnAErh/v3UUdTln07Tdmq8Oa1qm2PlSm+DX6NNRbat0fLm1zhTBfpAftWLnJ7OCoXyJFFcnV7CqBfrSGcoxabGTu1QDfD21FTvZZ+hZK/cMeHmVf4ZOKnKlTx5DKz8G/p3cQqibWevlWf798tg7fVhzEsowjP3gomkGqFPmtriQXtEC8Hjf+lrvO9RVB6MvO3iZ/thTnnVoaaRYG7hxbIlkdbBGbB+so+g6MKJ1Dc22O9tpt35zFdAzGUqdIZDRCTcrrHpQ6kBMTIzIbF28eLHi79m2bRutWLFC1JKEEnjsmLo5PY6N95999hk99dRTouakIVCyCG345EtlkGd9b3ymt9ZnO86W1yI0BZrRL9p9UUuhArrvjREgS4CQx63JrWxy96RuvJpc0ZJbyeRWObg/Jfy9PbVk5vbWNbXOx0sWHHdP17qy8/SiJ/uVu8jlMXT47iEty2UF7QANHRNtAo0l9OOaSnCNO4ZxHVixM0CtskDjZFmjbVjxpAw2OdJDccupdPp8g+EYn6oiDSB3tk8wWfzUot9bNjh5WqHtU6+GMeJV3lLKWn14HR1krEKBqlu3fJAHsNidPHnSrHInixYtErUj4bZF+SGA2Dosu3fvpo8++ojGjh1r8BizZ88WbQClRbfPclVkSqqnJi/ybQqERqCdHFrJyTFVr06OPCFBfo/JXZIhMoud3Hon31+3D7G3zPImFxEflCmRKX23NCtX6qFwyS1x8pZ+OM+uSeVJXHLlEN8tj9XT1dtkeqVwxRqbjMldw+4qcwzjirAr1gBS5pnUMQK8OLixePXz8qRSyqfkgDvUF9FrC9mSXg2iaemj6oLPQz7ebPXvk5QuSyt2ciuIp46lwR3Jy1Nbh0NCQir0YM7NVd5268UXX9S7HcqeUlBUfNq0aZr3UDjNVe7QUUXim0ntNOtPD2hIz/+5U8iPx0yi7OnZFORrPEN3d1nJoZ93JNPs21totueb0TZM7raU33vyUiZyi518f9SEk9DVleDylPCg8g/xnJArb/JjC4VMds/Lv8vf20uTKKX+Pu3vlitr8uxcIP8M1kP59+siDxuRWxoZhnFuWLEzgJQdJ89kRQFjgc6zUj4w2AIoWs1qhgnX3aDmcbQ/+abRoPGqkpWvPI7JHJY9Vl7LTD7+uKtiFxysvr9u3NDuepKRkSGUO1uCRA0pE7eySPUfG8aGUJ9GsXotYUrQVV7MsdihSLAUZyZXluQWKrn7EmVIJAwpV7qnY9Bi56XtitXqdqFSaVnb5J/BgqhlpdN53sg/0y2eLv8t+O3yOD5d5C3YdEuqMAzjvLBiZwDUnNJFmlUj1kfOqWvZZA+g4H06ri3tvZBBIz79z2rfc7Ls91nSYPdQr8RyRVln4PT1dq06fUqJiooSMXVHjx7V2o73yHh1JqBwSNmwjatrWyC7yGpFGuPqzXzqNPtfo/sU6OkJ27leJG09k16uBJXos9jpV/Lk+8hdt/JQAWPKlFzpglIlt5jJvxNHkB9G/hm+V24hlH+37vfpKplyNzEUTqVWdrkSyzCMc8PTNAPI61npPmDb1dEuKbEvuWr16aqKM1q4jlzRDsbXtXS4K6NHjxY17LKz1co0Eh8QM4ftzgS6t8i7PJiSLX2gd7I+MsssyCi+e1BPbcj6sfIJA+mNpdOy2GkpX/qVPLl6pJuQoH3valva5DF2cquc7jHk54NMfHl2q65yJj9f3eQJ+b7Yz5haJz8slz5hGNfBfUdQExgrRNyvcblbyRGwthtFms1b0o62rcyi4k4xdikpKfTII4+IBe5WZKli/dNPP9XsM3PmTAoMDKQ2bdrQuHHjqEePHjRy5EiRKetMSP2SQd9G6gQZQxYoQ6C/sj4kCzn6LX+9ubwrjL6OCvLvklulDMV3yrfLFTG5AqWrTMm/Q8t656FtsZPXwtN2xKrdphKbTqbplDghg98nt9ihZ638+/G7jF1q+Udy6yTDMM4Nu2INEGjENaGreDx7S0N6d9V5rW14LtuqQYS1FSEpU1DpgKyEUp2Ydy0Xlou1TJNAzFqjRo3E+ptvvqnZLk9KQIFh1LpDhwh0npg6darIbnUmknVqP3asp8z1qkuKLPlCjqT0/LFXf2kh3eLD+hQ7uSVNrtjJ95Fb7ORdIoyJtZaS56kdY2cs8xQZtBJ3dailE7dnWB7kbmHsJs+BUCdHeCg8V9eUOYZxR1ixM3RhdJSlbklRBh+C+ma7yKpNySyvE2VNLP1Qnn5rI5q9Ql37TF9MkSXQLZwq/wXWKKviCISHhwsLnSlQhHjw4MHkrKCwt8RrtzXVuw9qxCXrJEf8ezSFXl58WHQ5gTIoFazWZdjcLdSudkQFZU4quCtX7LQtwfota54GlC95R4kiWaKBMXHQTXqQJ37I+0jjGLr16SQSo4N0jmNYHuTWQ1H0WPbvUCdQ3leWYRj3wDV9XlagXnSQ1kMYLZECStqJxVtPSyRLKSdSiYQBTQy7fy2tB8WF+Ru1rlkbth44NzvOpmtcgxM61da7T9fEaCE7MT6dqP3/1tKmk6l03/e7RHb35Pm7xD5Sn1ZjGbcS8lZg8omWtiVYf1ydoYxsuXtUbrEzhvxYUBjl/07u5lXpyK3u80Jp+RH5/AjH0D2O0hg7hmFcB7bYKb1QOoMCWiLFFL4q3m8/U17rztKK3eDm1em14U21suas9V2GBhXJKmDNcUA+bMqtKYzzWuxeH97MoBsx2C9QLT+FRLBrT5i3Q/NZZXohy610QfIYO9k+uq259GZky5Q5+akrtVnLf69a0dK/n67VT34+OIaxBAnt46gM1rhTH8vYuRo+H4ZhnBe22ClEHvOiq/joq6VlKd0E32tMqbOGYqd7OFs88+UDCy7vh2Na2eBbGUuDEiXn03OFktFWJ3tcjm6PU10um1mX0U9BmRKtUiCGLHayUjueldB8dIsJy9/Lc1R1kycqFD2WPW+MhUJUcMXKvm9yt7pa36mL8ZxZhmGcFVbsFCIv5qmr+Dw1oKHV3IlKhhNLxz3rjiPWiLHTRR6LBHfYba20+2oyzsH2MjdskxqhWu5RXbSK9ZroiqAEeUisoeQJLWXOgMVO7oqtzIRJfh7GLHa6gl2hVp1WdwnD3yf3EIvvk/27asG+ii12DMO4DqzYKWTpgSta79FS7IL/SLoUeAf5eBdazYqm5Ci6vSsl5I3Eq4Kk1zWubr3uB3Ll0VgbJMY53LCGSpVIeHoWCPnBAlnSpdTMlHK5C1W7Y4T8Ow0kTxhQ7Epk96RiV6xMYtVfJ3exau1o5Bj6jmN6QqQ7mcRvNCZJ7H5lGNeEFTuF6KsoovIooGJVvl7rnKVafCmz2Ol/fD/er75FzkFy90zsUofubBdvkWNW/I7ydU6ecF62l9Un7Fi3mtH9/H29hPxg0Ye5NmJD7b8MKUjyaAr5ulxBLKli1hAUSfl3aut1HkZj57SOo7Dcia7cGPt32FXXHcwwjGvAip0RbmtVQ7Muj3PTrRunz2Imd91aG4u7YnUe+JLShVIQj/S2jLKoi9w6Ysl6eYztSM8uoNOpOWK9gynFzkTc6MNl7ciUIi9Top1tqn9/eZys/H6Tx9LKXaBK70hjma66+xkySorkLLlCqPDLdeUGbw2pbkF+3myxYxgXhRU7I8g7TMgHDt1yINa0MCmZ1FtbEZKfgrW+qqrWEcb+7L1wQ7yiB3B4oG+VepNK/YmVIlfUtCx2Wj1ey/eXz80MuWW1LGyVuPF1HwvyY2DNkMXO2L/TRf5ZgE7corHnEveGZRjXhRU7I8hjvYx1d/Cyc3ZZVfXKPx/qojh5wlqKXZPqYdY5MGMz9iWrFbvWCeFWaYMn1XTUh1w8tRUy/eu62av6kLtoK3PfG4p9lY5nKI4QyppHJeTbV8cKakyxY5s4w7guXMfOCFoV6WUuGmP72YOqWgx1rSu6w43csmCtrhCwgq57upemfRnjvIpdq1qmFbszqeZZ5EB2geH6dtqKmv56dXIM1bHTVqgMlD5RCP6NlrVb9zMD1viKRYaNK4jl/073M8Pfgc3yz0w5BsZ2rGViD4ZhHAW22FnCYmdVxc60L7aqypbuv9YtbyL3klrT61s3KoiigrkFkjMC69N+SbFTYLGT90Y1RmVkS36Pehl0xep31xo8puLvNmwJ1LIeGj2G8eMoPceqPJb6NIrRev9Aj3qVPxjDMDaFFTsjyB/+8qBqNR7kV9KM6oa0J18v4/FC1sbSypbuLN8WFjvGuTmTlk1ZBcWi8HDD2BCT+4f4+Qr5wWJMzfFXqADK71kliQfaMXn699eO1VN0Gsp7Hps4oNanHkRj2ieI1af6a9fM1M76rZgVayzz1Vh9yopPO5Z7hnEW2O9l7OLIHv663SY8yY/iCt+kB5okUpBvoF2TJ6qqbEXpNArXHQxskTyhDzSDn/bbftt9IVPlxInmNcPI24h1WyI8IFjIjym0a8x5UFGJaYGQKyHyyZn8X8onaobuaUNJGEqp4FLVcfka+iX6LG2zb29Oj/atL/rvGqJCkWOjZVIMn7f+Y5u3P8Mw9oMtdsYujqf+Fj8V9jPx0JsxpAlZk6oodr8/2LlCUHrXpCiD+9ty5t6pnvEit4zjcODiTfHaMkFZEkx7I+3G5MAKqMQtK5+MaNWo03LFymq+GZAZQy5Q5SVHtNcNKVBGjXn4n554OX1KnXy/+Ajtz42fs/EqdqzIMYzzwoqdEeRWOmMxdqZm8/d1q0vHZg20osWOKk296OAK22JC/Gnfy/017yuToScRFuBDTSrZsUJeVZ9xbI5eyRSvzWoqU+zqK3DX6uKjYzVXMvkwXO5EQVydBd2y+s7RkGwHm5lA9P29HWhE65o0bYB2pxljCRqmny1somMYZ4UVOyPIdTndGDu0QUr2H0uzdnehnEJ1UVZzeXpAA6oXFURVpSp17AwNcIbqkFXGOqhv/Hh3VEuT/05pZX7GvsASduxqllhvFKdMiYfMQH6w6Gsppg8vI1ZzQzF2chmODPbVm8luyAqt6zpVdI4KZz76xOjVoU1oeKsadEvTOJ3vNn7Mng2i6f3RrSr05jV1Ltx5gmFcE46xM4rxh2upRyblFFd+bivKEZB1mTexHd33/S6jFjVTGApG75YURZtPpRn9tyhWm6OnTIV8kDVEtE7sH+OYXMzIE6VIEK5QL1r5RAXyYw5KewhrtQ6T3bDVgnzpp8kdRTszOcpi7EhRfJyWhVD2X2PnKDGpa10yF1PZtZWFXbEM47ywxc4IlWnrYw7qGByVVWfVfRvHUv8m5R005Jhq+2Rq4AoPNK0UPta3vn6XqoKfFejL8w5nQLLWJcWEGA1ZqCrGY+zkGLa0dUmKoja1IhQqduZbyI0lLCg9hjkYOwyulyExw2NHq46dznOIHbEM47ywYqcQc+tp/W9EM9HRYceLfQ0+gG2ViFDVbzHUSF0JQb5e1KiSMXZKaBnPHSvszbGy+LrG1c2PmzMH3cx0OXK9ROse9fCg+jHB5OvlSU1rGLpXDLli5Xsou/GD/JSXPrKEK9SYgmgsbEIUKDZ6XKJlj3Wr4tkxDGMPWLFTiLGZuL6PAn29qHWtCJGIYPDiKxgrHC3MTD6QrDt2TcH+RFN7Jlotvic0wIfOvTlYLB0rYYFkqs6xFCm+ruqKnfFyHkqt69oTkb8e7kq7Z/RTFHagfUwDCh8RPd63vli/p2sd8frcwEaiqO+g5tW19q1MVqylqFryBNeuYxhnhX1dCqmq60TfjN+SD/cf7utA1zIL6KmF1q37JldG4db650iKiX/hQX46zcktqbAqjbtirMfZVHXyUL2oihnW5mKsh6yxe8ZY5naQnh6zpkIgjAG5faJffRrasrrmN0/tlUhTSXsCo+8r/H08Kb+olHrUj6bfd1+s9DlozsVKssEFiRnGeWGLnULMDR1SWljYUga57vWj6fY2NfV+ZkkFUv7Ajws1bI00RVUUuyf7lZd1eHVY0/JjVv6QTCWBgnQuXa3Y1bFAhnfFDi9UiTIj5mezmjymjlsWEz3EFJrbJ3r79H606okeisvCVAZ0qUCh6B4Nog3uo1ZsjXSe4PkSwzgtbLEzgnbcju6TzoN8S+tTTIgfeXl6mVRc9D0oMaM2peCYo6xYKiC74nH1ryvF0u5kuLwe76d2hTH2JTWrgHILS4SVrFY15R1YPD08hfxIsXNSP2KlcXRK71FDMqGkbI81pCks0EcsIFFhBrHRU9Xz2ZsjW8jeGWspVsnvZBjGoWHFTiG6AwRailUveJ8e6pxIAT6G44KMEVMFi5c59GoYQ6sOm3KZKkOrkr9CtVOf26squh4POo7D2TS1ta5mRAD5KuzrCiAzkB+x7utFOYUlpju8KDy8bmkSfVQP86d+jWOFaxT9bc3CQ7n10dh9fleHWpSWXWi000tVMRpjZ+TfsSuWYZwXdsVayxVrZCyY1KUO3d25Ng1sGmcTa9ed7dQNxO1lsStxtAwQxmJo3LCRlXfD+skUK2PZ58asbNqZ26a7RGCi9vXEdjR3bBvDx6zkDALxdkgkuaNtvNH90FP3yf4NKlV2qKoKmKoKLnGGYRwbVuwq0VJICcaCs0e2iafXbmtmdnyOOcgDpw0NlpX5dnOvQ2SQr946dlUJXq9hJHOSsS0XrueK19qRyt2wxhImoOzIkSs9Su+9ypQpUcLLZT2fPxrTyuh+yJBd+UQPh6/DaEgG4VJ/dmAjm58PwzCWgRU7I8ife6iDJQdtkC763Utv7u1LuUXqwc0YWi2CPJy3rY85umiL+DARUK9vcK3Mr0YXi+WPdRcdBBjH4MpNdTuw6mHmKduQGcgPFi+vQoOZnPISKvKPdr/UT9wLJidhCu7XB3rWE6VQ7jXR+eHesp7PA5tplzQxhiWM1VXpLmGsQLEhNj7b22jZGYZhHBvHnlI6EHCv6FLieY0yCvXPfBE3pATTyRP2V/wMNVU3xagyVxQK1yKeKS7MjxZsu1DpAQ/uviY1rFfsmDGflMz8SmVIQ2YgP7pxdUpdsZHBfmKRMFOX0yI21J/2zOivqAi5v7nxeA4Krr+Kg1UZxiVhxU4hSq1EXRIjRTNu3fg57Tpb1o9fcaRnthTPBCTFTkk7Msbxuaqx2FU+EUiuUOnKhtxNmxgdTCevZZs+oIdhS7uSc9BzGKtlnFeVqpwVh74yjGvCip1ClD7Y7+9Rj3o3jDFxLKXf6hjF2Qydr7HSFIaYM6olnUrNtk6XCAe4Vu6q2MVaTLEr396keig91CuJvtp0Vrwf0DSW2tWJoBbx4UaPB+Vw1vBm9Pn60/TabeV1Du2BtS3uVdE3zYlzdVC9lmEYPXCMnY0wFAP0aJ8kshdVfVh3qhdJnetFiixfpV8wsm28CC53VAsIo5ys/CJNmZKqFKuWJ0zIlbzlj3enCB1L+eTu9UxmkeIIEzrVpi3P96F60ZXvhuEKt6iu8nZL01hNvCDDMK4JW+xsCJSgjNxCkQQgMbp9LepYN5J6vbuebE2T6hWr34f4K78lMAj/PKWTWP/uv3MWPTfGeeLrQvy89bbtUoo8YcJo43qFfU+tEepQXyazjoSprF/dS/bRXa3p8OVMahkfTvM2qy2hDMO4FqzYVZKHeyfS89uU7w8L1U/3dxQDkG6ZE2OtmKzlyMEpPDWgvDVXVa0BX9/djibP32WBM2OciZ4Noo32d1WCl0wRU5LAoI9S2b1oSb1u8cNd6fjVLOpe33pFhE2RYEZHD1P4eXtRm1oRYj062I+y8ovFOsfbMYzrwIqdEZrVDKXYUD+9ddMe7dOA5p9uUrGUiZHjYT9Hce88NaChXitLZa0d/ZrEipp16TnlpSss8VM/GduGHv5pjwWOxFga9Er9/t4Olfq3kAWf0lpi3UsWq2nUYmfkeHLFxJJu/pYJ4WKxByse7043couM1m2sH1t5S+IXE9rSi38doif61qdP15+u9HEYhnEsWLEzMbvd8lwfvVaEQJ9AOvzQYYv/QdA/Eg/yTSfTqnScyhZmNWdMtEWuwuAW1enhn2zwRYxNgfzUKPhUrNeKiKCdZ9UdLCpbtFt+L1pKr7N3W63G1Q2X9vnr4a6053wGDW1Rw+gxjFni6seG0G8PdBbrrNgxjOvAyRMKArttGejviEkFSs+Ja8wx5vDV3e3okd5JIttVwpheZyyLU8ti50B/Bmu5OFslhIsECGt2r2EYxjlhxc7BqUrrLWMY7KFZhWPOubMlje+kdq8xjCn6N4mlp29pqHXPyePtKoulkifkhZMZhmGcBVbsKglaIjX9tKlYlLQUcxarnb7vNnQ2ujpnTIg/vT68uXVOTFH7JC5k54zyk1+cq+jeV9lIsXugRz3q1ziG2texQq1FJ50YOqIngWEY/XCMXRUemEdSj2jWHe4B6FG5+CEHOXvGjeRHjr5GEVJSTtckY5mplsuKnT6oMVkKnmowDGNrWLFzMDxsNDAYGvz0lV7R3RfJJCWlKmpdyz7Zgozros/ahkLDmXlFFGOkCHIpa1B6UXpZ2NrNMK4Du2LdBNTjMsafD3WhIS2qiwKmptj/ygDaNr2vaJ6uD38f9W1l3MLCMBXRZ/H29/EyqtTpWs1t0YuZYRjGUWGLnYNjqdwJ1OIKD/QRdbGA7tDXulYEzR2rLlxqimA/b7EYYtdL/Skjp9CihVUZ90CfK9Ze5U4cOfmJYRjGEKzYuRG+lR01zcSU4scwhqistc3aLcWcFtYrGcbtYFeshanqkGLNMenLu9uZtX+/xur6YpO71bPSGTGMhRQ72TqrdQzDuDNsVqlCLFDtsNqadUsSHxFQ5Qk3+kDqK2oqoeSUv5zQltJyCkQZE0eAB2zXl5/KW+ys0yuWYRjG2WDFrgotkc49cY6swXO3NKKftl+o0jHqRVfMbpVTq5rxzwGq2juKUqcEDmdyTvn550iKZrslGik4TMkhF/LE8hVlGOeBFTsHJCzQx2rB1z/f34n2X7xBt8jaODEMwzAM4xo4pGL3xhtvUGFhIcXHx9PkyZM12/Py8mjhwoV09epV6tChA/Xq1YscDUc3FnROjBSLMxIaUK7wMq5JZeWnblQQbTqZZunTcXqUTgzZ2s0wroPDJk9Aefv666+1tg0ePJh++uknSk9Pp4kTJ9K3335rt/PLK8qj9l+1FwvWLYWhjhCOmgFrCz4c04o61q1Gzw1sZO9TYawgPwUlVZcfxJSivuKR126xyPkxDMM4Kw5psXvhhRdo37599OCDD2pt37ZtG2VkZJCfnx81bNiQ/vvvP7rnnnvsco6lqlLadXmXZt1amOuIfX14M/p60xl6ZWhTchVua1VTLIzrYEh+zI2Pw/2+6vBVurdbXQriEjsMwzDmK3ZHjhyhzz//nPbs2UMvv/wyDRgwoMI+69evpy+++IJSU1OpdevW9Pzzz1NkpNr9d+PGDfrggw/0HvuJJ56g8HDDbapeeeUVGjNmDDVo0IC2b99u8DiuRNMaoWbtP75TbbEwjLMgV+XMtVc7+v1ubxcnl7FjGPfDLH8dlLU77riD6tWrR1u2bKFr165V2GflypXUv39/oXw98sgjQgHr0aMH5efnVzlWBFY8Hx8f8vT0FMc7ffo0uSorHu9Oz9/aiGvIMYwTE+Dr5daKJcMwDm6xGz16ND3wwANi/cknn9S7z/Tp02nChAk0c+ZM8b5nz55UvXp1mj9/Pk2ZMkVY5F599VWzTxRK3NatW+ncOXWJhM2bN4vvGjlyJDkSVY2RkzxRjauHioVh3AoHTz4yFxT5Htg0jlokhNn7VBiGcRPMUuyMuUlBWlqasKrBZSoREREhLHb//POPUOyUAFcvjnPx4kWhBA4bNoyaNWsmLHWjRo2ipKQkWrx4sVGlrqCgQCwSmZmZir6bcV7YOOGcNI8Pt1gNO0fDy9ODPp/Q1t6nwTCMG2HR1Mnz58+L15o1tQPd8f7CBfMK7sbFxWmVOvH19aVdu3aJmD4omO+++y699tprBv/97NmzKSwsTLMkJCSY/XsYhrE+yGjd/kJfOvDqLRbLCmfUqCw03XH0Mk4Mw1gpK7aoqEi8+vtrdysICAgQdemUopsNK1GtWjW6//77FR0Dbtpp06ZpWewsrdxFBUZV2MYPQIYxX35iQ52nw4krwrF4DOM6WFSxg+IFUGdODt5Ln9kKlETBYi2CfIMo9ZnUCttrRwZa7TsZxlUwJD88MWIYhnEgVyyyZUNDQ2n37t1a23fu3CnKnrgya6b1oIUPdqb4CFbsGIZhGIZxAcXO29ub7r77bvr0009FIgVYsGCBiL1DpwhXJikmhNrXqbpVkhuYM+4Mh3JZFnaxMoz7YZZih+SFbt26iQXMmjVLrL/11luafd58803RFaJOnTrUuHFjUR4F9e+aN29OrtYSqdd3vcRiyZZiSns7MowzYy35YbThpwnDuB9mxdjVr19fKG76MlglgoKCaPny5aLeHKx2UPJCQkLI1UAbpA3nN2jWGYapuvxwjB3DMIwNFTuUDZGsdaaAxQ4LYx7siq08bO1kGIZh3B2LxtgxDMMwzueLNVXvjusLMozzwIodwzAOAysQDMMwVYMVO4ZxMaZOnUpDhgyhSZMmaW2/evUqPfPMM6ItH3o5Z2dn2+0cGdswsUtt8dq3UQxfcoZxE1ixczC43ANTVUaPHk1jx46lNWvWaG2fMGGC6MAyZswYUWsSSp6jwckTluXZgY3op8kdae7YNhY+MsMwbtF5wt0I9OFixIzj0atXL5GR/uyzz2ptv3LlCn300UeiDJGPjw99++23ZE9YfqyPj5cndUmq2PqQYRjXhRW7KrREynkhx7J/DbZYuDTFxcW0ZMkS+uyzz2jTpk2iDuTTTz9dYT8oXO+88w5dvnxZKGFvv/02de/eXdOPecSIEXqPP2fOHFFeyBCffPIJjRw5kmrWrEnXrl2jhQsXkqPJD1usGYZhqgYrdgxjIxYtWkS//PILTZs2jQ4fPiwUPX37oKg3lLvevXvTxx9/TAMHDqT9+/dTUlISeXl50YMPPqj3+LGxsUa//9VXX6Xhw4dT27ZtaenSpfThhx8KZY9hGIZxHVixY1wGlRPEvmExVq8Q1rm77rqLxo0bJ97Pnj1bWNag4EER8/T0FIkR5pKfn0/btm0TCh2KiDdp0oQGDx5MDgcH2TEMw1QJTp6oJPnF+TT4p8FiwTrDVBUoX0hqgKVOTt++fWnLli2Kj/Paa68JxTA9PV0ogT/99BP5+/uLbFi4dgcMGEA9evSg+++/3+AxCgoKRKKFfLEkLD+OhalOhqxvM4zzwBa7SlJSWkLLTy7XrFsKfoC6L4h7KykpoZgY7dIUeI9SJUq59dZbqU2bNvToo4+K9w0aNBCv8+fPpyNHjojYPbh1jXWGgaUQJVFsLT8cY8cwDFM1WLFzMDxZs3N74G7Vuic8Pc1ql9a+fXuDn8EFi8UU06dPF7GAErDYJSQkWP1v4+XJqh3DMExVYFesg/DGiOYUE+JHb9/Rwt6nwtiJ6OhoocSlpqZWsOSZSoywNH5+fhQaGqq12IK7O9emhGoB9EDPejb5PoZhGFeDLXYOwtiOteiuDgkGg+oZ1ycgIIBatmxJGzZsEMWEJdavX099+vQhdyA80Jc2PtOb5YBhGKaSsMXOgWCljnnyySfpxx9/pGXLllFubi699dZbdObMGXr44Yfd5uKwHDAMw1QeVuwYxkacOHFCZKdiuXTpEs2YMUOsDxs2TLMPLHVvvPEGTZ48mYKDg0U9uz///FNRXBzDMAzDuI0rVgo+t1TZhpzCHKKyKic4Zomv5TJjmcpRlJdDpQW5Bj/X/dtL7//f3nnHRpFkYbwWFgtMWJPBRJMxSYCJNghMzhlEsoQAIZERIP4ACUQQSJicc8Ym54wwYDIGBDY5Y4LJyYhMnb636rnxeOwbbu88M93fT0LbXd077qquV/X6harfSUz4J5QsWVK9e/cuWTkWHXa02uHfr1+/kiVSuAvKj3Vkx5CLxI8fbGUfP3xQmdQ3t8oPIcQ1/tAWkcrHjx+nSVYf8T7i4+NVwYIF3f0YHg3lh6QE5YcQz8Iyih2sH1i/C9UtXLiwDEZplennSRjLVrD+8Spr1qzq48ePyt/f32MsY54K5edvrC4/9m3w6NEjiYek/BDiWVjGFYuJG1YZw32Qlks4eCKs/9/v/6+//nL3q/AKKD9Jsbr8AMiO1duAEE+EZgpCCCGEEJNAxY4QQgghxCRYTrHDivpjx46V/1oR1t/a7/+fwv7D/mP1PkCIp2OZ5AlCCCGEELNjOYsdIYQQQohZoWJHCCGEEGISLLPcye/y6tUrlSNHjmTrm719+1bWP/vzT3M23devX9WzZ8/k2M/PT/458vz5c/X582dZPsZM7YC9Wc+dOyfHBQoUkJ0iyH/H69evpe847qrx/v17lSlTJuXj42PKpv3x44cs5gwwTuTMmdPp2JKYmKjy589vqji1nz9/qujoaDnOlSuXKl++vLsfiRBLQoudA5cuXZIBqVy5cjK5Hz58WMqxuHHDhg1VqVKlZNBatGiRMiOxsbGqXr16qnLlymrmzJlJrh05ckQWd0b74J6EhARlJjDhjhs3TvXr10/NmjXL3Y/jldy7d0/VqlVLlSlTRuXJk0dFRkZKObZS69SpkypevLgoO+PHj1dmBDIB2ahWrZoaNWpUkmsxMTHSLqVLl5Z7rl27pszEt2/fRH4GDx6sxowZ4+7HIcS6IHmC/JvVq1fr27dvy3FkZKQOCQmR4/379+sTJ07I8fXr13W2bNlM3WyTJ0/WY8eOtZ2/fftW58iRQ0dERGizs2TJEj1gwAB3P4ZXsnXrVn3p0iU5hrwULVpUjs+ePat3796tf/36pZ8+fSrygz5lVtasWaN79+5tO//69au0xcyZM7XZ2bdvn27Tpo27H4MQy+J1frRPnz6pvXv3iguwXbt2KVoNzp8/Lyuj48s4Y8aMydwgjhhuk549e4q79fbt2+ry5ctiuQNNmjSRv43fPnv2rCpbtqxy19ZOsCLCgti1a1enrhy4wY4fPy7HdevWTeIOwhZauO5IhgwZxEKZElFRUapYsWKqffv20oawWnqixWDr1q0qLi5O3iMsI84sKlu2bBELUo0aNcQKayXQRvv27RMZ6N69u9N74Io/ceKEyA3kB7JhANmAO9URuFfz5s0rMondXe7evSsWKkN+qlevrr58+aIePHggVmG4ITNnzqzcwbFjx9T9+/dV27ZtnYYaQEaOHj0qzxsSEiLPau+uf/HiRbL/ByEbsGanxIULF8RV2b9/f/Xy5UuVO3du5Wng+TC2IhyhdevWYnV05M2bN2rz5s3SBhUrVlStWrWSbcUIIR6E9iIGDx6s8+fPr4sVK6ZLly7t9J7w8HDt6+urmzVrpsuWLasDAgL0vXv3bNeHDh2qixQpkuzfqFGjbPdMmjRJ+/v763z58unTp0/byrdt26YLFiyos2bNqteuXavTmsWLF0t9AgMDsUSNfvnyZbJ7Dhw4INYQWBrr1KkjxygzwHM7q39oaGiqFrsFCxboevXq6ZIlS+qcOXPqihUr6idPnmhPYdOmTfJuWrVqJW2za9euZPfAkuTn56ebNm2qBw0apHPlyqX79etnGYvdxIkTdYECBXSpUqV05syZnd6D/gH5adCgga5SpYrOkyePvnDhgu36lClTnPafsLAw2z3Lli2Tv5M9e/Yk7wGyVLhwYfn96dOn67Rm48aNukyZMrpcuXLSR2JjY5Pdg7qizlWrVpU2wLPayzpkyVn9K1SokKrFDmNHUFCQyE3u3Ll1iRIl9I0bN7SnEBUVJRbF5s2bax8fH5F3R+7evSvjL8YVjKN4x23bthUrrD202BHiXrxKsZs7d664b0aPHu1Usbt69apOly6d3rx5s5x///5d161bVyZyV/n582cSRQAKnmN5QkKClMOllJZggrl//74MnM4Uu8+fP+u8efPqESNG2MqGDRsmCiqu/Q6Oit327dtFIUhMTJRzKD54D55CTEyMfv78ufSPlBS72rVry0RkAFch7o2OjraEYod6oe9i0nam2KH9oMjYuws7d+6sy5cv7/LfsJeTBw8eiPL86dOnJOXv37+Xj5OLFy/qtGTLli0SRgG5Tkmxg9LXtWtX2/m0adOkTdA2v4OjYnfmzBlR6F6/fi3n48ePT3Ld3cTFxcn7AugbzhS79u3b6+DgYP3jxw85v3nzpk6fPr18VNlDxY4Q9+JVyRMDBgxw6joxQKA23CZwFwK4a+H6OHjwoLgPXQGB8wcOHFA3btwQ96OxyTWCgvH7N2/elMwvuGl8fX1VWgLXWdGiRVO8juQGZKwieNlgyJAh4n5EXVx1x8BdBpcb3JU4RlmDBg3wESBuGrjS4Kr2JHdS1apVJVg/JdAup06dUr169bKVBQcHSzIM3LcA9YMLDu/4yZMncuzMbe+t9OnTR9ylKbF9+3Zpg759+9rK0Jfg2sY7d4WRI0fK76AN4fIEyICdM2eOWrp0qcjVyZMnxaWXJUsWlZZgXEDyQkpcuXJFXb16NYn8YDxA+MOOHTtc/jsPHz60hXxAfpBpjv4JeTl9+rS6fv26/B1Pkh+4zIsUKZKqC3/Pnj0qLCzMlukM2YEMGfIDIGNoR9Qf8uMs7IMQ8v/FqxS7/wQmIAxQ9jEfyODEwIzB1NWJaf78+apDhw4yCBuDFhQkKIiIIcIEhTgTxPB5Wv2hiBYqVMhWhsEaEyiuuQImXMRVbdiwQSZoHCMmCL+xcuVKNWHCBNWtWzeJr4HS7C1A0QAlSpRIUo4lTYxr6CdQ4BGfCcUWx2bL/E0N9JGAgIAkHyzGkhWu9p/hw4erjRs3ipxARnbv3i0fWFAW8RuQq6lTp4qMedpyMkYdjbhAgDhAfEy5Wn+AjyBklJ85c8aW/Yo2gExBwUV2cPbs2dXo0aOVt2AoqKnJDwgPD7fFQEN+bt265YanJcTaeF3yRGogqNsxqB9r0RnXXAFfoc6+zpGAsHz5cuXJoI7OLJpoA1frDysCBnFn1K5dW6yC3ggSX4BhgTWAcg7rHIAlAlYGq+Ks/6B90C6u9h9/f3+1fv36ZOVQFh2Xz/E0UEfU1T5Z5HflB9y5c8dpOZTk/fv3K7PJj3EN2FvvCCHuwVQWO2Tm2Q8yRoabcc3sOKu/0QZWqH9qGG4/xwka7ua0dgl6U//BQtRwxVuh/6COqCvCLOyh/FB+CPEmTKXYYfFTR2uTcY5rZgd1hAsRy00YQJGB8mKF+qeGsfSJo2sI56nFXVkJ9JH4+HhxSRtgWRDjmtkx6mg/hkDRw04SVqh/asAdjeVvKD+EeD6mUuxatmwpQcn28TARERESM5Na0oFZwJpsWI9u06ZNtjIkfCB43WrrtTmCxIo6deqIOx0JAgBuV7jNEPdFlGrRooV8GBw6dCiJ/MA9jzX/zE7NmjUllAOxcAZwneLDCG1jZTCuYM26VatWybZpALGDSJbo2LGjux+PEOKtMXbIykIgP7KuYIlCMD/o0qWLuFEaNWokQdtQ8BDYj0l73bp1siCrGcCCr/YZilDa4EasX7++JElgAsZWTcjqQ2aeEcyMMk9cUPh/CRR6KCEI8AZr166V4HUsMNu0aVMpmzdvnrQVgtsR9A0FGG2FLbCsABRZWKOQFITJ2ZAfTNiIIQ0MDFQDBw5UPXr0UEOHDpVEmtmzZ8t9mNjN0EeQGPPo0SM5RywtZAoKHay2qCPiAJE5DfcrEhxmzJghbeKuBcnTClglFy5caMuA3blzp5QhSapz585SjqQXfBxBprDl4LZt2yQRBAs9E0I8hz+w5onyEpCRiRXtHcG+nkaGKlwnmNQxeaEMk1SFChWUGYAlwZmSioknKCjIdo7sXWQjAii5jRs3VmYHy2ggC9MRKG1Q5AywDAOyfY2dJzBRWQUotlBsHEH2or1FGztzIEkGu5pgUofiYwZgfTP2rrUHu5TY9xGMHVD68ZEQGhpqCYsuEohWrFiRrBzeDvsdfhDmAYUOO09UqlTJEmMLId6GVyl2hBBCCCHEIjF2hBBCCCFWhoodIYQQQohJoGJHCCGEEGISqNgRQgghhJgEKnaEEEIIISaBih0hhBBCiEmgYkcIIYQQYhKo2BFCCCGEmAQqdoQQQgghJoGKHSGEEEKISaBiRwghhBBiEqjYEUIIIYQoc/AvSYs4IVwhLwEAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(' minimum pole and max error intersection')\n", + "gs = gridspec.GridSpec(3, 3)\n", + "\n", + "ax2 = plt.subplot(gs[0,0])\n", + "pole_er(-36,er2,-2,ax2)\n", + "\n", + "ax4 = plt.subplot(gs[0,1])\n", + "pole_er(-36,er4,-4,ax4)\n", + "\n", + "ax6 = plt.subplot(gs[0,2])\n", + "pole_er(-36,er6,-6,ax6)\n", + "\n", + "ax8 = plt.subplot(gs[1,0])\n", + "pole_er(-36,er8,-8,ax8)\n", + "\n", + "ax16 = plt.subplot(gs[1,1])\n", + "pole_er(-48,er16,-10,ax16)\n", + "\n", + "ax24 = plt.subplot(gs[1,2])\n", + "pole_er(-64,er24,-16,ax24)\n", + "\n", + "ax32 = plt.subplot(gs[2,0])\n", + "pole_er(-32,er32,-32,ax32)\n", + "\n", + "ax40 = plt.subplot(gs[2,1])\n", + "pole_er(-32,er40,-40,ax40)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "e9696dbb-69ba-4e47-a32b-94fb6f70f4b8", + "metadata": {}, + "source": [ + "__Adapting the rational approximation function to estimate $A^{1/2}\\mathbf{u}$, implements the Clenshaw Algorithm for the Chebyshev polynomial sum__\n", + "\n", + "$$A^{1/2}\\mathbf{u} \\approx r(A)\\mathbf{u} = \\sum^{N_1}_{j=1}a_j p_j (A-p_j I)^{-1}\\mathbf{u} + \\sum^{N_2}_{j=0}b_j T_j(A)\\mathbf{u}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ac3585d7-8680-410f-9017-e2c1e1918757", + "metadata": {}, + "outputs": [], + "source": [ + "def matrix_rat(a,b,p,A,u):\n", + " \n", + " #first part of sum\n", + " sum1 = 0\n", + " I = np.eye(A.shape[0])\n", + " for i in range(len(a)):\n", + " sum1 += a[i]*p[i]*np.linalg.solve(A-p[i]*I,u)\n", + " \n", + " #Chebyshev part w/ Clenshaw \n", + " W = 2*A - I\n", + " \n", + " bb = np.zeros((len(b)+2,W.shape[0],1))\n", + " for k in range(len(b)-1,0,-1):\n", + " bb[k] = b[k]*u + 2*W@bb[k+1] -bb[k+2]\n", + " sum2 = b[0]*u +W@bb[1] -bb[2]\n", + "\n", + " return sum1+sum2" + ] + }, + { + "cell_type": "markdown", + "id": "c242f882-feba-42fd-9047-1ebd68563dac", + "metadata": {}, + "source": [ + "__First Tests__" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "da488d60-44f7-4629-8fd0-9470437e59b4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2.22044605e-15],\n", + " [-2.22044605e-15],\n", + " [ 1.11022302e-15]])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.diag((0.25,(4/9),(9/25)))\n", + "u = np.array([2,1.5,(5/3)]).reshape(3,1)\n", + "\n", + "a,b,p = coeffs(N1[79],N2[79],-16)\n", + "approx = matrix_rat(a,b,p,A,u)\n", + "\n", + "error = approx - np.array([1,1,1]).reshape(3,1)\n", + "error" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "2458a362-1c56-4726-8549-7f98ea01e0ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.923572826167401e-12" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m = 1000\n", + "A = np.zeros((m,m))\n", + "A_root = np.zeros((m,m))\n", + "for i in range(m):\n", + " A[i,i] = (i+1)**2/(i+2)**2\n", + " A_root[i,i] = (i+1)/(i+2)\n", + "\n", + "u = np.random.rand(m,1)\n", + "\n", + "a,b,p = coeffs(N1[20],N2[20],-16)\n", + "approx = matrix_rat(a,b,p,A,u)\n", + "exact = A_root @ u\n", + "\n", + "error = np.linalg.norm(approx-exact,np.inf)\n", + "error" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7c973d6c-5296-4f64-9024-b824402e83a9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.6517406522073534e-11" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#householder\n", + "m = 5\n", + "A = np.zeros((m,m))\n", + "A_root = np.zeros((m,m))\n", + "for i in range(m):\n", + " A[i,i] = 1/(i+1)**2\n", + " A_root[i,i] = 1/(i+1)\n", + "\n", + "v = np.random.randn(m,1)\n", + "v = v/np.linalg.norm(v,2)\n", + "\n", + "V = np.eye(m)-2*v@v.T\n", + "\n", + "A = V@A@V.T #same eigenvalues of original A\n", + "A_root = V@A_root@V.T\n", + "\n", + "u = np.random.randn(m,1)\n", + "\n", + "a,b,p = coeffs(N1[20],N2[20],-16)\n", + "approx = matrix_rat(a,b,p,A,u)\n", + "exact = A_root @ u\n", + "\n", + "error = (np.linalg.norm(approx-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "error" + ] + }, + { + "cell_type": "markdown", + "id": "17047386-813d-48c1-9b61-d80b5fb0fabf", + "metadata": {}, + "source": [ + "__Random Adjacency Matrix__" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "66b9c86f-5d6b-48af-92c4-ef75cee020a1", + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "def random_adjacency_matrix(n): \n", + " matrix = [[random.randint(0, 1) for i in range(n)] \n", + " for j in range(n)]\n", + "\n", + " # No vertex connects to itself\n", + " for i in range(n):\n", + " matrix[i][i] = 0\n", + "\n", + " # If i is connected to j, j is connected to i\n", + " for i in range(n):\n", + " for j in range(n):\n", + " matrix[j][i] = matrix[i][j]\n", + "\n", + " return np.array(matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "b2d9059a-933f-419f-b1c0-a7e490e6cab5", + "metadata": {}, + "source": [ + "__Example of a graph__" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c8f76a56-9173-43b2-b512-b630e6bf9732", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "plt.figure(figsize=(3,3))\n", + "G = nx.Graph()\n", + "G.add_nodes_from(range(1,8))\n", + "G.add_edges_from([(1,3),(2,3),(3,4),(3,5),(3,6),(5,6),\n", + " (6,8),(6,7)])\n", + "nx.draw(G)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0446e24a-89a2-4310-9aba-e6edfa45d2be", + "metadata": {}, + "source": [ + "__K Nearest Neighbors Graph Adjacency Matrix__" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "afea9ceb-b778-4fe6-9263-85f9746d1112", + "metadata": {}, + "outputs": [], + "source": [ + "#sklearn.neighbors\n", + "from sklearn.neighbors import kneighbors_graph\n", + "from scipy.stats import qmc\n", + "from scipy.sparse import identity\n", + "\n", + "def randmat(n,k):\n", + " \n", + " sampler = qmc.Halton(d=2, scramble=False)\n", + " X = sampler.random(n)\n", + "\n", + " A = kneighbors_graph(X,k,mode='connectivity', \n", + " include_self=False)\n", + " #A.toarray()\n", + "\n", + " #A = A - identity(n,format='csr')\n", + "\n", + " A = scipy.sparse.tril(A) + scipy.sparse.tril(A).T\n", + "\n", + " return (A)" + ] + }, + { + "cell_type": "markdown", + "id": "454434cc-9431-42b2-bdb6-b5d1dd327a7c", + "metadata": {}, + "source": [ + "__Adapting the matrix rational approximation for sparse matrices__" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c14bd18d-47e2-4e64-a405-67e432bae2ae", + "metadata": {}, + "outputs": [], + "source": [ + "def matrix_rat_sparse(a,b,p,A,u):\n", + " \n", + " #first part of sum\n", + " sum1 = 0\n", + " I = identity(A.shape[0],format='csr')\n", + " for i in range(len(a)):\n", + " sum1 += (a[i]*p[i]*\n", + " scipy.sparse.linalg.spsolve(A-p[i]*I,u))\n", + "\n", + " sum1 = sum1.reshape(-1,1)\n", + "\n", + " #Chebyshev part w/ Clenshaw \n", + " W = 2*A - I\n", + " \n", + " bb = np.zeros((len(b)+2,W.shape[0],1))\n", + " for k in range(len(b)-1,0,-1):\n", + " bb[k] = b[k]*u + 2*W@bb[k+1] -bb[k+2]\n", + " sum2 = b[0]*u +W@bb[1] -bb[2]\n", + "\n", + " return sum1+sum2" + ] + }, + { + "cell_type": "markdown", + "id": "0b31fa2f-8c3e-4498-a0ff-02776bcace00", + "metadata": {}, + "source": [ + "__Initial tests__" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f068a9ff-6586-4d31-b30b-2aa631abf593", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "7.585339320051707e-12" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n = 100\n", + "k=5\n", + "u = np.random.randn(n,1)\n", + "\n", + "A = randmat(n,k)\n", + "D = A@np.ones(n)\n", + "D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "\n", + "L_norm = identity(n,format='csr') - D@A@D\n", + "T = identity(n, format='csr') - 0.5*L_norm\n", + "\n", + "a,b,p = coeffs(N1[20],N2[20],-16)\n", + "approx = matrix_rat_sparse(a,b,p,T,u)\n", + "exact = scipy.linalg.sqrtm(T.toarray()) @ u\n", + "\n", + "error = (np.linalg.norm(approx-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "error" + ] + }, + { + "cell_type": "markdown", + "id": "94ff7790-9dfd-4e48-a12a-fe18fdfb707e", + "metadata": {}, + "source": [ + "__Comparing the relative error by matrix size and $N_1$ values for the dense solver__" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "9834cea8-e305-4864-b6dd-202517967365", + "metadata": {}, + "outputs": [], + "source": [ + "def mat_err(n, N1, N2):\n", + " A = random_adjacency_matrix(n)\n", + " \n", + " D = np.zeros(A.shape)\n", + " D_root = np.zeros(A.shape)\n", + " for i in range(n):\n", + " D[i,i] = sum(A[:,i])\n", + " D_root[i,i] = 1/np.sqrt(D[i,i])\n", + "\n", + " u = np.random.randn(n,1)\n", + "\n", + " L_norm = np.eye(n) - D_root@A@D_root\n", + " T = np.eye(n) - 0.5*L_norm\n", + "\n", + " a,b,p = coeffs(N1,N2,-16)\n", + " approx = matrix_rat(a,b,p,T,u)\n", + " exact = scipy.linalg.sqrtm(T) @ u\n", + "\n", + " error = (np.linalg.norm(approx-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + " return (error)\n", + "\n", + "def full_errs(j,m):\n", + " n = np.linspace(10,2000,m).astype(int)\n", + "\n", + " n1 = N1[j]\n", + " n2 = N2[j]\n", + "\n", + " errors = np.zeros(m)\n", + " for i in range(m):\n", + " errors[i] = mat_err(n[i],n1,n2)\n", + "\n", + " return (errors)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "47a61e89-782c-48ff-bdc3-130723a539fb", + "metadata": {}, + "outputs": [], + "source": [ + "m = 11\n", + "\n", + "errors9 = full_errs(9,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d73eae57-c98a-458e-ac02-3dde27d344eb", + "metadata": {}, + "outputs": [], + "source": [ + "errors19 = full_errs(19,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d93778a9-3963-4b2e-bc0d-e74eedab1c55", + "metadata": {}, + "outputs": [], + "source": [ + "errors29 = full_errs(29,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6157ce3-2132-49de-8fb9-f18c868980ae", + "metadata": {}, + "outputs": [], + "source": [ + "errors39 = full_errs(39,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17387f6e-3413-4bab-a6c0-4e531cf10a0c", + "metadata": {}, + "outputs": [], + "source": [ + "errors49 = full_errs(49,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6303941-fcc8-412d-9177-76fc0732123c", + "metadata": {}, + "outputs": [], + "source": [ + "errors59 = full_errs(59,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f62754e-5c72-4e99-80db-2274db9210ff", + "metadata": {}, + "outputs": [], + "source": [ + "errors69 = full_errs(69,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b962754-8026-4ef1-b398-8cc8e72f4822", + "metadata": {}, + "outputs": [], + "source": [ + "errors79 = full_errs(79,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38353c38-874b-44f5-92d0-b3523e58c2d5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Text(0.5, 0, 'n'),\n", + " Text(0, 0.5, 'Error'),\n", + " Text(0.5, 1.0, 'Dense Relative Error by Matrix Size (nxn)')]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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8K9/+/bt/HH+Pg8HDhzw+rfjOI7bvn07B4D79ttvffZv6v32bFuwYIFX2htvvMEB4N59913uxx9/5FiW5R5//PFmXx/HcVxZWRkXHR3NAeAGDhzIPfTQQ9x7773H/502tGDBAr+fX4/9+/dzIpGIu//++/m0559/nlMoFNypU6e89l2yZAnHsix3/vz5ZssXHx/P3XbbbT7pns9Aw3NxHMfNmTOHi4yM9ErTaDRcREQEd8MNN3BWq5UbMWIEl5iYyGm1Wn4fz99CZGQkV1NTw6d/8sknHADu008/9SnDtGnTuGuuuabZ8pO2oRok0iUplUp+NFtNTQ327NnD/1rz1DBUV1cjLS0Np0+f9mk2Wbx4MRiG4devu+46OJ1OvtkoLCwMAPDZZ581WRO0fft2qFQq3HDDDV41G6NGjYJSqcS3337botcyYMAAREdHIykpCffffz/69u2LL774AnK5HABQUFCA06dPY968eaiurubPYzQacf3112Pfvn3NNgc07IfjeX+uu+46mEwmnDhxokVlbOzOO+/E4cOHvZoB8/PzIZFIcMsttwSl3B6LFy/G119/7bMMGjTIa7/evXs32Sy1YMECr/fh559/RkVFBR5++GGvZpobb7wRAwcOxOeff+6Tx1//+tfLlrWhjIwMr/VHH30UAPhmE5VKhVtuuQXbtm0Dx3EAAKfTifz8fMyePTugPk7z5s3DRx99BJvNhg8//BAsy2LOnDl+9234PtjtdlRXV6Nv374ICwvDkSNHWnzO5t7vxhYvXoy0tDQ8+uijuPfee5GcnIxVq1Zd9rjY2FgcPXoUDz30EGpra7FhwwbMmzcPMTExeP755/n37XLKyspw++23IyUlBa+99hqfvn37dlx33XUIDw/3+htOTU2F0+nEvn37ms23urraq6a3sYa1ZoD7e6a6uppv4gXcnarz8vLw9ddf47rrrkNBQQE2btyI0NBQn/zuvPNOr/N5muP/+OMPn309r4m0H+qkTbokg8HAV5MXFRWB4zj885//xD//+U+/+1dUVKBnz578emJiotd2z5eOp+/MpEmTcNttt+G5557D//3f/2Hy5MmYPXs25s2bx3dCPX36NLRard9mDM85W+I///kPQkNDUVlZifXr1+Ps2bNeF7HTp08DcF/km6LVapv8ov7999/xj3/8A3v27PH6YvYc1xp33HEHsrKykJ+fj2effRYcx2H79u2YMWMG/8Xe1nJ79OvXj+9T0ZzevXu3eJsnEB4wYIDPvgMHDvQZQSgUChEfH3/ZMjTUePh9cnIyBAKBV1+f++67D/n5+fjuu+8wceJEfPPNNygvL+ebkVvqrrvuwpNPPokvvvgCW7duxU033YSQkBC/+5rNZqxevRqbNm1CSUmJV5ARyOehuffbn7fffhvJyck4ffo0fvjhhxYPsOjRowdef/11vPbaazh9+jS+/PJLrFmzBkuXLkWPHj3wl7/8pdnjHQ4H5s6dC6fTiY8++sirE/np06fx66+/Ijo62u+xLfkbbi5Ia+57pmEAdNddd+Hdd9/F559/jsWLF+P6668POD9/5Wr4I5AEHwVIpMu5ePEitFot+vbtCwB8LcSTTz7Z5C9az74eLMv63c/zZeeZO+bHH3/Ep59+ii+//BL3338/XnzxRfz4449QKpVwuVyIiYnB1q1b/ebV1JduYxMnTuRHsc2aNQtDhw7F/PnzcfjwYQgEAv71rVu3zm8/DwD8UOfG6urqMGnSJISGhmLFihVITk6GVCrFkSNH8Mwzz7R6WHRcXByuu+46fPDBB3j22Wfx448/4vz581izZg2/T1vK3RrNXXDbOtpRIpG0eei6v4tVWloaYmNj8e6772LixIl49913oVarWxQQNtSjRw9MnjwZL774Ivbv39/syLVHH30UmzZtwuOPP45rr70WKpUKDMPgrrvuCujzEOh7unfvXlitVgDufjbXXnttQMczDIP+/fujf//+uPHGG9GvXz9s3br1sgHSU089hQMHDuCbb77xCXJdLhduuOEGPP30036P7d+/f7N5R0ZGNjsg43LfMx7V1dX4+eefAbinV3C5XH4/by3ND3AHTZ7vFdI+KEAiXY6nw6YnGPIMYxWJRAFfWC5n/PjxGD9+PFauXIn33nsP8+fPx/vvv4+//OUvSE5OxjfffIM//elPQZtuQKlUYtmyZVi4cCE++OAD3HXXXUhOTgbgHrUT6Ovbu3cvqqur8dFHH3mNtDl79qzPvoH+2rzzzjvx8MMP4+TJk8jPz4dcLsesWbP47W0pd3vr1asXAHdH46lTp3ptO3nyJL+9LU6fPu1Vy1JUVASXy+U10oplWcybNw+bN2/GmjVrsGPHDixatKjJC2Fz5s2bh7/85S8ICwvzO2+Ux4cffogFCxZ4DU23WCw+HdODWfug0Wjw6KOPYtq0aRCLxfyPmda+z3369EF4eDg0Gk2z+73//vvIzc1Fbm4uJk2a5LM9OTkZBoOh1Z/PgQMH+v1bClRGRgbfmTs7Oxu5ubkt6iTenLNnzzY5SpIEB/VBIl3Knj178Pzzz6N37978UOuYmBhMnjwZb7zxht8vzMbD91uitrbW51eZpxbE8yvYU23//PPP+xzvcDhaPRv2/PnzER8fz9fGjBo1CsnJyXjhhRf8zhzc3OvzXGgbvhabzebVD8NDoVAE1MRy2223gWVZbNu2Ddu3b8dNN93k1W+mLeVub6NHj0ZMTAw2bNjA/3sCwBdffIHjx4/jxhtvbPM58vLyvNZfeeUVAO75vRq69957UVtbiwcffBAGgyHgOZ88br/9dixbtgyvvfaa1/xAjbEs6/PZfuWVV7ymfQDA/1sGY1b3RYsWweVy4e2338abb74JoVCIBx544LJ9iH766Se/0wAcPHgQ1dXVfptIPX777Tf85S9/wT333IPHHnvM7z5z587FgQMH8OWXX/psq6ur8xkp2di1116L3377zeszFKgPP/wQ+fn5yMnJwZIlS3DXXXfhH//4B06dOtXqPLVaLc6cOeMzdxQJLqpBIp3miy++wIkTJ+BwOFBeXo49e/bg66+/Rq9evbBz506vzrV5eXn485//jKFDh2LRokXo06cPysvLceDAAVy8eBFHjx4N6NxbtmzBa6+9hjlz5iA5ORl6vR5vvfUWQkND+V/nkyZNwoMPPojVq1ejoKAA06ZNg0gkwunTp7F9+3a8/PLLuP322wN+3SKRCI899hieeuop7Nq1C9OnT8e//vUvzJgxA4MHD8bChQvRs2dPlJSU4Ntvv0VoaCg+/fRTv3lNmDAB4eHhWLBgATIzM8EwDN555x2/F6ZRo0YhPz8fWVlZGDNmDJRKpVeNUGMxMTGYMmUKXnrpJej1etx5551e2wUCQavL3dCRI0d85rwC3L/+A22m8RCJRFizZg0WLlyISZMm4e6770Z5eTlefvllJCUl4YknnmhVvg2dPXsWN998M6ZPn44DBw7g3Xffxbx583x+1Y8YMQJDhgzB9u3bcc0112DkyJGtOp9KpcLy5csvu99NN92Ed955ByqVCoMGDeKbnyIjI732S0lJAcuyWLNmDbRaLSQSCaZOndpkn7umbNq0CZ9//jk2b97MN3G98soruOeee/D666/j4YcfbvLYd955B1u3bsWcOXMwatQoiMViHD9+HBs3boRUKsWzzz7b5LELFy4EAL7psqEJEyagT58+eOqpp7Bz507cdNNNSE9Px6hRo2A0GnHs2DF8+OGHKC4ubraZ6pZbbsHzzz+P//3vf5g2bVogbwsAdx+nv/71r5gyZQo/zcirr76Kb7/9Funp6fj+++9b1bT7zTffgOM4fsAEaScdP3COXO08Q9U9i1gs5tRqNXfDDTdwL7/8MqfT6fwed+bMGe6+++7j1Go1JxKJuJ49e3I33XQT9+GHH/rk3Xj4vmc4tGdI85EjR7i7776bS0xM5CQSCRcTE8PddNNN3M8//+xz3jfffJMbNWoUJ5PJuJCQEG7o0KHc008/zZWWljb7Oj1DgSsrK322abVaTqVScZMmTeLTfvnlF+7WW2/lIiMjOYlEwvXq1YubO3cut3v3bp/X13CY//79+7nx48dzMpmMi4uL455++mnuyy+/9BnCbTAYuHnz5nFhYWEcAH7ItL9h/h5vvfUWB4ALCQnxGi7fUEvK7c/lhvk3HEreq1cv7sYbb/TJw98w94by8/O5ESNGcBKJhIuIiODmz5/PXbx40WufBQsWcAqFotmyNuT5dy0sLORuv/12LiQkhAsPD+ceeeSRJt+jtWvXcgC4VatWtfg8DYf5N8Xf66+treUWLlzIRUVFcUqlkktLS+NOnDjhd3j+W2+9xfXp04djWdbr89LU++3Z5snnwoULnEql4mbNmuWz35w5cziFQsH98ccfTZb/119/5Z566ilu5MiRXEREBCcUCrkePXpwd9xxB3fkyBGvfRsP8/dMReBvafhZ1uv1XHZ2Nte3b19OLBZzUVFR3IQJE7gXXniBs9lsTZbNY9iwYfwUCx5N/W03/vu89dZbuZCQEK64uNhrP8/w/TVr1nAcd+lvYd26dT7nB8AtW7bMK+3OO+/k/vznP1+27KRtGI5r4ThKQgghrfLyyy/jiSeeQHFxsc9IJdK1vfPOO8jIyMD58+f56UE6U1lZGXr37o3333+fapDaGQVIhBDSjjiOw/DhwxEZGdniubNI1+FyuTBs2DDcfffd+Pvf/97ZxcGSJUuwZ8+eFs9UT1qPAiRCCGkHRqMRO3fuxLfffou33noLn3zyCd19nZBuhAIkQghpB8XFxejduzfCwsLw8MMPY+XKlZ1dJEJIAChAIoQQQghphOZBIoQQQghphAIkQgghhJBGaKLIVnK5XCgtLUVISAjdMJAQQgjpJjiOg16vR1xcXLMTdVKA1EqlpaVISEjo7GIQQgghpBUuXLjgc4PjhihAaqWQkBAA7jc4NDS0k0tDCCGEkJbQ6XRISEjgr+NNoQCplTzNaqGhoRQgEUIIId3M5brHUCftAOXl5WHQoEEYM2ZMZxeFEEIIIe2E5kFqJZ1OB5VKBa1WSzVIhBBCSDfR0us31SARQgghhDRCfZAIIYSQduB0OmG32zu7GFcdkUgElmXbnA8FSAHKy8tDXl4enE5nZxeFEEJIF8RxHMrKylBXV9fZRblqhYWFQa1Wt2meQuqD1ErUB4kQQog/Go0GdXV1iImJgVwup8mEOxDHcTCZTKioqEBYWBh69Ojhs09Lr99Ug0QIIYQEidPp5IOjyMjIzi7OVUkmkwEAKioqEBMT0+rmNuqkTQghhASJp8+RXC7v5JJc3Tzvf1v6gFGAFCCaB4kQQsjlULNa5wrG+08BUoAyMjJQWFiIQ4cOdXZRCCGEENJOKEAihBBCSNAsX74cDMOAYRjk5uYGdKznuLCwsHYpWyAoQOpiNFozfjhTBY3W3NlFIYQQchVJT08HwzDIycnxSt+xYwffZGWxWJCeno6hQ4dCKBRi9uzZfvMaPHgwNBoNFi9ezKedOXMGc+bMQXR0NEJDQzF37lyUl5d7HafRaAIOqtoLBUhdSP6h8/hTzh7Me+sn/ClnD/IPne/sIhFCCLmKSKVSrFmzBrW1tX63O51OyGQyZGZmIjU1tcl8hEIh1Go131naaDRi2rRpYBgGe/bswf79+2Gz2TBr1iy4XC7+OLVaDZVKFdwX1Uo0zL+L0GjNyP7oGFz1s1K5OOCZ/xzDobM1GNM7AoPjVOgXq4RE2PbZQYmbRmvG2Sojekcp0EMl6+ziEEKIl874jkpNTUVRURFWr16NtWvX+mxXKBR4/fXXAQD79+9v8WSY+/fvR3FxMX755Rd+7qEtW7YgPDwce/bsaTbY6iwUIAWovWbSPltl5IOjhj48UoIPj5QAAIQCBn1jlBjUIxSD4uqXHqEIk4uDWparQf6h83xAKmCA1bcOxZ1jEju7WFckCkTJ1Y7jOJjtgV0z/nP4Ipbt/J3/jnru5sG4bVR8QHnIRGzAo7lYlsWqVaswb948ZGZmIj4+sHM2xWq1gmEYSCQSPk0qlUIgEOD777+nAOlKkJGRgYyMDH4mzmDpHaWAgIFXkMQwwF1jEnC+xoTfS3WoM9lxokyPE2V6fPRLCb9fzzAZrqkPmgbXB03x4TIaZgr3F1OVwYZz1UYUV5twrtqI4xo9vjl+qd3bU1u3aX8xQqRCSEUsZCIWMrH7UVq/uNMEfJpMzEIqrH/0OUYAqYiFRCgI6r9Ddws2KBAlBDDbnRi09MtWH+/igH9+8jv++cnvAR1XuCINcnHgl/k5c+YgJSUFy5Ytw9tvvx3w8f6MHz8eCoUCzzzzDFatWgWO47BkyRI4nU5oNJqgnCPYKEDqInqoZFh961A8+9FvcHIcWIbBqluH8BcTjuOg0VpQWKpDoUaHwlIdftdocaHGjJI699Lwoh8iFWJQj1AMjlPxNU19Y5QQC6+8bmcuF4dyvQXFVSavQKi42oTz1UYYbS375XaiTB/0sjGM+1fcpUBL4BV4yUTewVXDQMwrMBOx+OlsNf71/VlwnDvfRdf1waT+0XC6ODg5Di4XB6eLg4vj4HQBTo6D0+WC0+V+j9zrnu0NFv5YXHreaB+Xz7Fw582BP2/jY002Bw6fq7v078QB2R8dQ+8oBUb1igAroACekK5qzZo1mDp1Kp588smg5BcdHY3t27fjr3/9K9avXw+BQIC7774bI0eOhEDQNa9LFCB1IXeOScTE/tEorjIhKUruVUPAMAziwmSIC5MhdVAsn64123FCcyloKtTocKpcD73FgZ/O1uCnszX8viKWQb+YEHctU33QdE1cKEKlog59na3hcLqg0VpQ7AmAquoDoBojzlWbYHW4mjyWYYA4lQxJUXL0ilQgXCbCa3vPoGGLpoAB1t0+HHIxC7Pd6V5sTlj45y5YHE5YbE6f7Ra7i0+z2Jww2Z1w1lcFchxgsjlhamGQ1lIcB7y57w+8ue+PoObb3lwcMPeNHyEVCdAvJgT9Y0MwUB2CAfVLTIiEaj7JFUcmYlG4Iq3F+5dpLUh96X9eLQoCBvgmaxLUKmlA522tiRMnIi0tDdnZ2UhPT291Pg1NmzYNZ86cQVVVFYRCIX9D2T59+gQl/2CjAKmL6aGSBdR0opKJMK5PJMb1uXTPH5vDhaIKw6WaplItCjU66C0Od5pGBxy+lEdChAyDe1yqaRoUF4oeKmmHX6hsDhcu1ppwrtqE4moj/3i+2oQLtSbYnU3fV5kVMEgIl6FXpAJJke5AqFf9Y0KEzKdze2Kk3Ke2LtD2/ebYnS4+uLLYXN5BVROBlrlBsNV4e5XBijOVRp/zxIdLoZSIwAoYsAIGAobhn7P1zwUCBiwDfruQbbAf49le/ygAhAJB/Xbw23zy9joW/HmEDfbTW+xYvrMQjf/VxCwDi92FYyVaHCvRem0Lk4v4oIl/VId0iyCeBK67NRm3FsMwATV19YlW+m1R6BOtbMdS+srJyUFKSgoGDBgQ1HyjoqIAAHv27EFFRQVuvvnmoOYfLBQgXYHEQgHfiRuj3Gkcx+FirblB0KTDcY0OJXVmXKhxL7t+L+PzCJeLvAKmQT1USI5WQMj6rwpt6Redxe7E+RoTiquMXoHQuRojSmrNfjuq86+LFSAxUs4HQEmRciTWP8aFySBqomz+NFdbFwwiVgARK0BIkC7sGq0Zf8rZ4/X+sAyD7Q9N6NIXFqmI9fmSv32Uu1/dyTIdTpTpcarc3a+uuMqIOpMdB8/W4GCDmk8AiFNJMaA+WBqoDsGA2FAkxyhoVGc3w3EcdGYHSurMyD90Hv8+cA4cAAbuJuO7xyVCHSqFTEz/ru39HdUSQ4cOxfz587F+/Xqv9MLCQthsNtTU1ECv16OgoAAAkJKS0mx+mzZtwjXXXIPo6GgcOHAAjz32GJ544omgB2DBQgHSVYJhGCREyJEQIUfaYDWfXmeyeTXPFZbqcLrCgFqTHfuLqrG/qJrfVywUYKA6pEHQFIpreoTis19LvTriLps1GKOTwi8FQFXuAOhctQkaraXZcspELHpFypEUqUCvqPrHCDl6RSmgDpUGtd9KoLV1nampPmpdvfxNfcn3jlKgd5QC04f04Pe12J0oqjDgVLkeJ+sHI5wq10OjtaC0fvn2ZCW/Pytg0DtKgQGxl5roBsSGIDFCDgH1b+oUNocLZVoLSurMKPUsWjNK6izQ1K/76xPIAXjzuz/w5nfuJuNQqRCxoVKoVVL3Y6gUsaESr7QopeSK78cWrO8om8MFm8MJsZANuB/qihUrkJ+f75U2c+ZMnDt3jl8fMWIEAHcA3JyTJ08iOzsbNTU1SEpKwt///nc88cQTTe5vsNhbVeZgYbjLvSLil2cUm1ar5ed0uFJ4LlQNm+eOa/QwWB1ByT9EKnQHPp5AKFKOpCh3IBRNfVCapdGaO/UXZWfQmuw4VeEOmE6W6XCqzIATZTroLP4/jzIRi36xSu/ASR2CaCV9ttqC4zjUmuworR8UwgdAdZcCokqDFS25ooRKhX7//cSsADZn0/0JG2IFDKKVEsSqpIgNkTQKpqRQq9wBVbBqcVvKYrHg7Nmz6N27N6TSlvcXai81RitKas18TV3PcBnC66eG4er/5/kn4xqs8Gkcv6XRvpf+13jbyudX4LNPP8H+n35ukIdnO+eTz6XPDAeOAzZv3ozn/v40vv/dHYTFh8sQobg0PUBLNPfv0NLrN9UgBai95kHqSqQiFkN6qjCkpwpAAgD3SKULtSa+ec5T21Sm818jFCIVom+M0jcQilQgTC6iC1Urdadar2BRyUUYkxSBMUkRfBrHcSjXWXGiTMc30Z0s0+N0hQFmuxO/XtTi14ve/ZvC5SK+lmmAOtTdZBer9HsBvVr6xjRksTvdtXWNAiBNgxohi/3ywYtEKEDP+gElcWFSfnCJJ62HSopak81vk/HepyZBKRWhXGtBmc6CMq0FFXoryurXy+uXSr0VThfn3qeJ7yAPhZhFLB80SRETKoHaE0jVB1UxIZIWN9F31GeD49yjRl2e0aX1z131z52N1l0uDi4O/GhT93OX1wAWDsDFWjMu1rbvraxqTTb8/ttviI0MxxPPLsedC/7S4mPHD4iH0+nwmi+ppNYCpUTU4TVJVIPUSldyDVIgCku1uPGV771+NQoYYP+SqVfNhYV0HU4Xh+JqI06VXQqaTpXrUVztfyJWwD2PmKeWaaA6BGcrjVi/53S3m7upuQu3y8Wh2mjjg56S+pofTxNYaZ0ZVQZbi84THSKpD3ikiFPJGgVAUkQoxC36AZR/6HyT05pcjsPpQpXBhnLdpcCpTGtBuc56KU1rgb6Ftd4MA0QqJO5apxB34NS4WU8dKsWu38rw7Me+83pxHAeL3QWjzQGt3ghjtQbxib0gEkvqp75AgyDGN5DxTI/ROAjqbAwY1P9Xv44G601tY1BXWwNdXS3AAJGRUQgJVYFh+L0a5QP+88IAOHOmCGabEwKWRXxiL74sfaKUUEpbXqcTjBokCpBaiQKkS9ryRUdIR/A0GzfsFH6yTIdynbVFx8eHSSERsRAKBGAF7pGAbP2oPfejwHudZcAKBA22Xxrld2k/7+0s20R6E/k1PO//TlXgjX1/uOfIAjB1YAzC5OL6GiAzSrUW2JqZCsNDJmLRM1zmEwD1CJOiZ5gMapU0qB3j27vJ2Gh18AFThc7K10qV87VR7oDK0dzokMtQ1E8N4smiZwiL5VNiEBMXD0bY9rscMGAgEAAChrk0urT+uUDAQMCAH1HqTr80YtXFcThfY2qUH9A3RumuMWsQ7DQVtHQ0m8OFk2U6r9GvDBgMUIcEVINETWykS+gKoy0IaY53s/EldSYbX8t0okyPQ8U1OFVu8Dn+Yl3zzThdCQdg94kKn3SGAWJDpHyz16VmMHfNT88wGVSyjm3+bu8mY4VEiD7RymaHx7tcHGpMNj5wKvMETo2a9WpNdr/HN+50LhWxYAUMxKwAQhHbdCDTTNDDMpfWGaZtwYqL41BSawEHDgwY9AyXQtaK2bU7ilgoQM9wmU+ZO6Ojdtd9l0i3cjX2jSHdX5hc7DWPmL/pFAQM8Pr8kVDJxXC6ODhc7hnKHU53M4ijfiZxh5Pz3u5quO7Z7ifd5fJzfIN0n/y90/UWO0r8BHB3jknA+D4RfC2QWiUNaCqMq4VAwCBKKUGUUuITQDdUXGXE1Bf3+nw2ti0aj95RCsglQshFLGw2q7vmIlrZJTppRygkUEpEsDlcEAsF3eJuCl2lzBQgEUJIvaamU0hrMB1BV9PUHFmPp/ajHy1BlBSl8PvZaDhJb1fVXQKjhrpCmSlAIoSQBrpbk3F3nSOrO+punw3SNhQgEUJII92tyZgu3B2nu302SOt1rzq3IPu///s/DB48GIMGDUJmZuZlZwElhJCuqodKhmuTI+niTUiQXLUBUmVlJV599VUcPnwYx44dw+HDh/Hjjz92drEIIYSQbm358uVgGAYMwyA3NzeoeRcXF/N5X+7eb2111QZIAOBwOGCxWGC322G32xETE9PZRSKEEEI6RXp6OhiGQU5Ojlf6jh07+KkGLBYL0tPTMXToUAiFQsyePdtvXoMHD4ZGo8HixYv5tDfffBOTJ09GaGgoGIZBXV2dz3FHjhzBDTfcgLCwMERGRmLx4sUwGC5NvZGQkACNRoO//e1vbX/Bl9FlA6R9+/Zh1qxZiIuLA8Mw2LFjh88+eXl5SEpKglQqxbhx43Dw4MEW5x8dHY0nn3wSiYmJiIuLQ2pqKpKTk4P4CgghhJDuRSqVYs2aNaitrfW73el0QiaTITMzE6mpqU3mIxQKoVarIZfL+TSTyYTp06fj2Wef9XtMaWkpUlNT0bdvX/z000/YtWsXfv/9d6Snp/P7sCwLtVoNpbLpua2Cpct20jYajRg+fDjuv/9+3HrrrT7b8/PzkZWVhQ0bNmDcuHHIzc1FWloaTp48ydcEpaSkwOHwnWr+q6++gkwmw2effYbi4mLIZDLMmDED+/btw8SJE9v9tRFCCCGXpS0Bas4AEcmAqmeHnDI1NRVFRUVYvXo11q5d67NdoVDg9ddfBwDs37/fby1QUx5//HEAwN69e/1u/+yzzyASiZCXlweBwF1/s2HDBgwbNgxFRUXo27dvQK+lrbpsgDRjxgzMmDGjye0vvfQSFi1ahIULFwJwv4mff/45Nm7ciCVLlgAACgoKmjx++/bt6Nu3LyIi3DfAvPHGG/Hjjz82GSBZrVZYrZduS6DT6QJ9SYQQQq5GHAfYTZffr6GC94AvngY4F8AIgBlrgZR5geUhkgMBzsLNsixWrVqFefPmITMzE/Hx8YGdsw2sVivEYjEfHAGATOYedPD9999TgNQSNpsNhw8fRnZ2Np8mEAiQmpqKAwcOtCiPhIQE/PDDD7BYLBCJRNi7d69XW2ljq1evxnPPPdfmshNCCLnK2E3AqrjWH8+5gP8+6V4C8WwpIFYEfLo5c+YgJSUFy5Ytw9tvvx3w8a01depUZGVlYd26dXjsscdgNBr5Cg+NRtNh5fDosn2QmlNVVQWn04nY2Fiv9NjYWJSVlbUoj/Hjx2PmzJkYMWIEhg0bhuTkZNx8881N7p+dnQ2tVssvFy5caNNrIIQQQrqqNWvWYMuWLTh+/HiHnXPw4MHYsmULXnzxRcjlcqjVavTu3RuxsbFetUodpVvWIAXLypUrsXLlyhbtK5FIIJFIkJeXh7y8PDidzssfRAghhIjk7tqcltKVAnlj3TVHHgwLZPwEhAZQEyWSX36fJkycOBFpaWnIzs726iTd3ubNm4d58+ahvLwcCoUCDMPgpZdeQp8+fTqsDB7dMkCKiooCy7IoLy/3Si8vL4darW7Xc2dkZCAjIwM6nQ4qVdM3NiSEEEIAuPsBBdLUFdUPmPUy8OnjAOd0B0ezct3pHSgnJwcpKSkYMGBAh54XAN9CtHHjRkilUtxwww0dXoZuGSCJxWKMGjUKu3fv5udgcLlc2L17Nx555JHOLRwhhBDSViPvA5KvB2r+ACL6dNgotoaGDh2K+fPnY/369V7phYWFsNlsqKmpgV6v5wdEXW7ixrKyMpSVlaGoqAgAcOzYMYSEhCAxMZEfMPXqq69iwoQJUCqV+Prrr/HUU08hJycHYWFhwX55l9VlAySDwcC/iQBw9uxZFBQUICIiAomJicjKysKCBQswevRojB07Frm5uTAajfyotvZCTWyEEEI6hKpnpwRGDa1YsQL5+fleaTNnzsS5c+f49REjRgDAZW/XtWHDBq/BTp5R45s2beKb8Q4ePIhly5bBYDBg4MCBeOONN3DvvfcG46UEjOG66A3I9u7diylTpvikL1iwAJs3bwbgjjTXrVuHsrIypKSkYP369Rg3blyHlM/TxKbVahEaGtoh5ySEENK1WSwWnD17Fr1794ZUKu3s4nSK5cuXY8eOHc1OtdPe52ju36Gl1+8uW4M0efLky0ajjzzySIc3qVENEiGEENK8Y8eOQalUYu3atXj44YeDlu/58+cxaNAg2Gw2DBo0KGj5+tNla5C6OqpBIoQQ0hjVIAE1NTWoqakB4L6tVzAHNDkcDhQXFwNwjy5PSEjwu98VXYNECCGEkO4nIiKC73QdbEKhsMNm1O6WE0USQgghhLQnCpAClJeXh0GDBmHMmDGdXRRCCCGEtBMKkAKUkZGBwsJCHDp0qLOLQgghhJB2QgESIYQQQkgjFCAFiJrYCCGEkCsfBUgBoiY2Qggh5MpHARIhhBBCgmb58uVgGAYMwyA3Nzeoee/du5fP23Mv1vZCARIhhBBCkJ6eDoZhkJOT45W+Y8cOMAwDwD0BY3p6OoYOHQqhUNhkkDJ48GBoNBosXrwYgHvyyEcffRQDBgyATCZDYmIiMjMzodVqvY7bvXs3JkyYgJCQEKjVajzzzDNwOBz89gkTJkCj0WDu3LlBfOX+UYBECCGEEACAVCrFmjVrUFtb63e70+mETCZDZmYmUlNTm8xHKBRCrVZDLpcDAEpLS1FaWooXXngBv/32GzZv3oxdu3bhgQce4I85evQoZs6cienTp+OXX35Bfn4+du7ciSVLlvD7iMViqNVqyGSyIL3iplGAFCDqpE0IIaQjlBnLcFBzEGXGsg47Z2pqKtRqNVavXu13u0KhwOuvv45FixZBrVa3ON8hQ4bgP//5D2bNmoXk5GRMnToVK1euxKeffsrXEOXn52PYsGFYunQp+vbti0mTJmHt2rXIy8uDXq8PyusLBN1qJEAZGRnIyMjg7+VCCCGENIfjOJgd5oCO2XlmJ1b/tBouuCCAANnjsnFz8s0B5SETyvimsZZiWRarVq3CvHnzkJmZifj4+ICOD4TnXmhCoTsUsVqtPvdNk8lksFgsOHz4MCZPntxuZfGHAiRCCCGkHZkdZox7b1yrj3fBhZU/rcTKn1YGdNxP836CXCQP+Hxz5sxBSkoKli1bhrfffjvg41uiqqoKzz//PN9HCQDS0tKQm5uLbdu2Ye7cuSgrK8OKFSsAABqNpl3K0RxqYiOEEEKIlzVr1mDLli04fvx40PPW6XS48cYbMWjQICxfvpxPnzZtGtatW4eHHnoIEokE/fv3x8yZMwEAAkHHhytUg0QIIYS0I5lQhp/m/dTi/ctN5Zi9YzZccPFpAkaAHbfsQKw8NqDzttbEiRORlpaG7OxspKentzqfxvR6PaZPn46QkBB8/PHHEIlEXtuzsrLwxBNPQKPRIDw8HMXFxcjOzkafPn2CVoaWogCJEEIIaUcMwwTU1NVb1RvLJizDcweeg4tzQcAIsOzaZeit6t2OpfSVk5ODlJQUDBgwICj56XQ6pKWlQSKRYOfOnT79jTwYhkFcXBwAYNu2bUhISMDIkSODUoZAUIAUoLy8POTl5cHpdHZ2UQghhFyhbu13KybETcAF/QUkhCRArWj5iLFgGTp0KObPn4/169d7pRcWFsJms6GmpgZ6vR4FBQUAgJSUlCbz0ul0mDZtGkwmE959913odDrodDoAQHR0NFiWBQCsW7cO06dPh0AgwEcffYScnBx88MEH/PaORAFSgGgUGyGEkI6gVqg7JTBqaMWKFcjPz/dKmzlzJs6dO8evjxgxAoB7tF5Tjhw5gp9+cjcz9u3b12vb2bNnkZSUBAD44osvsHLlSlitVgwfPhyffPIJZsyYEYyXEjAKkAghhBCCzZs3+6QlJSXBarV6pRUXFwec9+TJk5sNoDz27NkTcN7thUaxEUIIISSojh07BqVSiddeey2o+X733XdQKpXYunVrUPP1h2qQCCGEEBI0mZmZuOeeewC4+xcF0+jRo/k+T0qlMqh5N0YBEiGEEEKCJiIiAhEREe2St0wm8+nD1F6oiY0QQgghpBEKkAghhBBCGqEAKUB5eXkYNGgQxowZ09lFIYQQQkg7oQApQBkZGSgsLMShQ4c6uyiEEEIIaScUIBFCCCGENEIBEiGEEEJIIxQgEUIIISRoli9fDoZhwDAMcnNzg5r33r17+bxnz54d1LwbowCJEEIIIUhPTwfDMMjJyfFK37FjBxiGAQBYLBakp6dj6NChEAqFTQYpgwcPhkajweLFi/m0Bx98EMnJyZDJZIiOjsYtt9yCEydOeB23e/duTJgwASEhIVCr1XjmmWfgcDj47RMmTIBGo8HcuXOD9KqbRgESIYQQQgAAUqkUa9asQW1trd/tTqcTMpkMmZmZSE1NbTIfoVAItVoNuVzOp40aNQqbNm3C8ePH8eWXX4LjOEybNg1OpxMAcPToUcycORPTp0/HL7/8gvz8fOzcuRNLlizh8xCLxVCr1ZDJZEF6xU2jAIkQQgjpguxlZTD++BPsZWUdds7U1FSo1WqsXr3a73aFQoHXX38dixYtglqtDijvxYsXY+LEiUhKSsLIkSPx//7f/8OFCxf4m9/m5+dj2LBhWLp0Kfr27YtJkyZh7dq1yMvLg16vb+tLC9hVHSC98MILGDx4MIYMGYJ33323s4tDCCHkCsRxHFwmU0BLzXvvoWjq9Tifno6iqdej5r33As6D47iAy8qyLFatWoVXXnkFFy9ebId3w81oNGLTpk3o3bs3EhISAABWqxVSqdRrP5lMBovFgsOHD7dbWZpy1d6L7dixY3jvvfdw+PBhcByHKVOm4KabbkJYWFhnF40QQsgVhDObcXLkqNZn4HKhfMXzKF/xfECHDThyGEyDJq6WmjNnDlJSUrBs2TK8/fbbAR/fnNdeew1PP/00jEYjBgwYgK+//hpisRgAkJaWhtzcXGzbtg1z585FWVkZVqxYAQDQaDRBLUdLXLU1SMePH8e1114LqVQKmUyG4cOHY9euXZ1dLEIIIaTTrVmzBlu2bMHx48eDmu/8+fPxyy+/4H//+x/69++PuXPnwmKxAACmTZuGdevW4aGHHoJEIkH//v0xc+ZMAIBA0PHhSpetQdq3bx/WrVuHw4cPQ6PR4OOPP/bpLZ+Xl4d169ahrKwMw4cPxyuvvIKxY8e2KP8hQ4bgueeeQ11dHTiOw969e9G/f/92eCWEEEKuZoxMhgFHWt5EZC8vxx833gS4XJcSBQL0+fwziGJjAzpva02cOBFpaWnIzs5Genp6q/NpTKVSQaVSoV+/fhg/fjzCw8Px8ccf4+677wYAZGVl4YknnoBGo0F4eDiKi4uRnZ2NPn36BK0MLdVlAySj0Yjhw4fj/vvvx6233uqzPT8/H1lZWdiwYQPGjRuH3NxcpKWl4eTJk4iJiQEApKSkeA0P9Pjqq68waNAgZGZmYurUqVCpVBg/fjxYlm3310UIIeTqwjBMQE1dkt690WPFc9AsXeYOkgQC9FjxHCS9e7djKX3l5OQgJSUFAwYMaJf8OY4Dx3GwWq1e6QzDIC4uDgCwbds2JCQkYOTIke1ShuZ02QBpxowZmDFjRpPbX3rpJSxatAgLFy4EAGzYsAGff/45Nm7cyA8JLCgoaPYcDz74IB588EEAwF/+8hf069evyX2tVqvXP6JOp2vpSyGEEEICEnb77VD8+c+wnTsPca9EiAIcMRYMQ4cOxfz587F+/Xqv9MLCQthsNtTU1ECv1/PX2pSUlCbz+uOPP5Cfn49p06YhOjoaFy9eRE5ODmQyGd+MBgDr1q3D9OnTIRAI8NFHHyEnJwcffPBBp1RgdNkAqTk2mw2HDx9GdnY2nyYQCJCamooDBw60OJ+KigrExMTg5MmTOHjwIDZs2NDkvqtXr8Zzzz3XpnITQgghLSVSqzslMGpoxYoVyM/P90qbOXMmzp07x6+PGDECAJodNSeVSvHdd98hNzcXtbW1iI2NxcSJE/HDDz/wrT4A8MUXX2DlypWwWq0YPnw4Pvnkk2YrS9pTtwyQqqqq4HQ6EduoLTY2NtZnVs7m3HLLLdBqtVAoFNi0aROEwqbfjuzsbGRlZfHrOp2OH5pICCGEdHebN2/2SUtKSvJpAvPMWxSIuLg4/Pe//73sfnv27Ak47/Zy1Y5iA4ADBw6gsLAQhw4dwqhRzQ/BlEgkCA0NxTvvvIPx48fj+uuv76BSEkIIId3LsWPHoFQq8dprrwU13++++w5KpRJbt24Nar7+dMsapKioKLAsi/Lycq/08vLygGf2DFRGRgYyMjKg0+mgUqna9VyEEEJId5OZmYl77rkHABAdHR3UvEePHs33eVIqlUHNu7FuWYMkFosxatQo7N69m09zuVzYvXs3rr322nY9d15eHgYNGoQxY8a063kIIYSQ7igiIgJ9+/ZF3759g16RIJPJ+Lzbu0Kky9YgGQwGFBUV8etnz55FQUEBIiIikJiYiKysLCxYsACjR4/G2LFjkZubC6PRyI9qay9Ug0QIIYRc+bpsgPTzzz9jypQp/Lqng/SCBQuwefNm3HnnnaisrMTSpUtRVlaGlJQU7Nq1y6fjNiGEEEJIoLpsgDR58uTL3mjvkUcewSOPPNJBJXLLy8tDXl4enE5nh56XEEIIIR2nW/ZB6kwZGRn8yDdCCCGEXJkoQCKEEEIIaYQCpADRKDZCCCHkykcBUoCoiY0QQghp2vLly9036GUY5ObmBjXvvXv38nnPnj07qHk3RgESIYQQQpCeng6GYZCTk+OVvmPHDjAMAwCwWCxIT0/H0KFDIRQKmwxSBg8eDI1Gg8WLF/ts4zgOM2bMAMMw2LFjh9e23bt3Y8KECQgJCYFarcYzzzwDh8PBb58wYQI0Gg3mzp3bthfbAhQgEUIIIQSA+6aya9asQW1trd/tTqcTMpkMmZmZSE1NbTIfoVAItVoNuVzusy03N5cPuBo6evQoZs6cienTp+OXX35Bfn4+du7ciSVLlvD7iMViqNVqyGSyVry6wFCAFCDqg0QIIaQjGGotuHiyFoZaS4edMzU1FWq1GqtXr/a7XaFQ4PXXX8eiRYtaNZN1QUEBXnzxRWzcuNFnW35+PoYNG4alS5eib9++mDRpEtauXYu8vDzo9fqAz9VWXXYepK6KZtImhBASCI7j4LC5AjrmxAENvss/BY4DGAa47s7+GHhtj4DyEIoFfmtqmsOyLFatWoV58+YhMzMT8fHxAR3fHJPJhHnz5iEvL89vcGW1WiGVSr3SZDIZLBYLDh8+jMmTJwetLC1BARIhhBDSjhw2F9587H+tPp7jgH3vn8K+908FdNzilydBJGEDPt+cOXOQkpKCZcuW4e233w74+KY88cQTmDBhAm655Ra/29PS0pCbm4tt27Zh7ty5KCsrw4oVKwAAGo0maOVoKWpiI4QQQoiXNWvWYMuWLTh+/HhQ8tu5cyf27NnT7Ki2adOmYd26dXjooYcgkUjQv39/zJw5EwAgEHR8uEI1SAGiW40QQggJhFAswOKXJ7V4f0OdFduW/4iGd9tiGODu5eOhDJMEdN7WmjhxItLS0pCdnY309PRW5+OxZ88enDlzBmFhYV7pt912G6677jrs3bsXgPu+q0888QQ0Gg3Cw8NRXFyM7Oxs9OnTp81lCBQFSAGiPkiEEEICwTBMQE1d4bFyTL5nIPZuPQHOBTACYPL8gQiP9R0R1p5ycnKQkpKCAQMGtDmvJUuW4C9/+YtX2tChQ/F///d/mDVrllc6wzCIi4sDAGzbtg0JCQkYOXJkm8sQKAqQCCGEkC5m0J/ikDgoAtoKM1QxMijDpZc/KMiGDh2K+fPnY/369V7phYWFsNlsqKmpgV6vR0FBAQAgJSWlybzUarXfjtmJiYno3bs3v75u3TpMnz4dAoEAH330EXJycvDBBx+AZQPvS9VWFCARQgghXZAyXNopgVFDK1asQH5+vlfazJkzce7cOX59xIgRANyj9drqiy++wMqVK2G1WjF8+HB88sknmDFjRpvzbQ0KkAghhBCCzZs3+6QlJSXBarV6pRUXFwflfP4Cqj179gQl72CgUWyEEEIICapjx45BqVTitddeC2q+3333HZRKJbZu3RrUfP2hGqQA0Sg2QgghpGmZmZm45557AADR0dFBzXv06NF8nyelUhnUvBtjuGA0Gl6FPKPYtFotQkNDO7s4hBBCugCLxYKzZ8+id+/ePrNCk47T3L9DS6/f1MRGCCGEENIIBUiEEEIIIY1QgEQIIYQQ0ggFSIQQQgghjVCARAghhBDSCAVIhBBCCCGNUIAUoLy8PAwaNAhjxozp7KIQQgghXc7y5cvBMAwYhkFubm5Q8967dy+f9+zZs4Oad2MUIAUoIyMDhYWFOHToUGcXhRBCCAma9PR0MAyDnJwcr/QdO3aAYRgA7vmF0tPTMXToUAiFwiaDlMGDB0Oj0WDx4sV82uTJk/ngxrM89NBDXsft3r0bEyZMQEhICNRqNZ555hk4HA5++4QJE6DRaDB37twgveqmUYBECCGEdEH66iqc/+1X6KurOuycUqkUa9asQW1trd/tTqcTMpkMmZmZSE1NbTIfoVAItVoNuVzulb5o0SJoNBp+Wbt2Lb/t6NGjmDlzJqZPn45ffvkF+fn52LlzJ5YsWcLvIxaLoVarIZPJ2vhKL49uNUIIIYS0I47j4Gh0w9fL+f1/u7Fn0wZwHAeGYTB14UMYPOn6gPIQSiR8zU9LpaamoqioCKtXr/YKXjwUCgVef/11AMD+/ftRV1cXUP5yuRxqtdrvtvz8fAwbNgxLly4FAPTt2xdr167F3LlzsWzZMoSEhAR0rraiAIkQQghpRw6rFesX3N7q4zmOw+6Nr2P3xtcDOi5zy4cQBXi7E5ZlsWrVKsybNw+ZmZmIj48P6PjL2bp1K959912o1WrMmjUL//znP/laJqvV6nNbEJlMBovFgsOHD2Py5MlBLcvlUBMbIYQQQnhz5sxBSkoKli1bFtR8582bh3fffRfffvstsrOz8c477/A3tQWAtLQ0/PDDD9i2bRucTidKSkqwYsUKAIBGowlqWVqCapAIIYSQdiSUSJC55cMW76+vqcbmrIfQ8F7yjECA9BdfR0hEZEDnba01a9Zg6tSpePLJJ1udR2MNO2wPHToUPXr0wPXXX48zZ84gOTkZ06ZNw7p16/DQQw/h3nvvhUQiwT//+U989913EAg6vj6HapAIIYSQdsQwDERSaYuXiLieuGHxo2DqgwJGIMANix5BRFzPgPIJtP9RQxMnTkRaWhqys7OD9Tb4GDduHACgqKiIT8vKykJdXR3Onz+Pqqoq3HLLLQCAPn36tFs5mkI1SIQQQkgXM3TqNCQNH4m6slKEqeMQEhnV4WXIyclBSkoKBgwY0C75FxQUAAB69Ojhlc4wDOLi4gAA27ZtQ0JCAkaOHNkuZWjOVVGDNGfOHISHh+P22307yX322WcYMGAA+vXrh3/961+dUDpCCCHEV0hkFBIGD+uU4AhwN4PNnz8f69ev90ovLCxEQUEBampqoNVqUVBQwAc7TTlz5gyef/55HD58GMXFxdi5cyfuu+8+TJw4EcOGDeP3W7duHY4dO4bff/8dzz//PHJycrB+/XqwLNseL7FZV0UN0mOPPYb7778fW7Zs8Up3OBzIysrCt99+C5VKhVGjRmHOnDmIjGx5Gy8hhBBypVqxYgXy8/O90mbOnIlz587x6yNGjAAArz5TjYnFYnzzzTfIzc2F0WhEQkICbrvtNvzjH//w2u+LL77AypUrYbVaMXz4cHzyySeYMWNGEF9Ry10VAdLkyZOxd+9en/SDBw9i8ODB6NmzJwBgxowZ+Oqrr3D33Xd3cAkJIYSQzrV582aftKSkJFgbzeFUXFwccN4JCQn43//+d9n99uzZE3De7aXTm9j27duHWbNmIS4uDgzDYMeOHT775OXlISkpCVKpFOPGjcPBgweDcu7S0lI+OAKAnj17oqSkJCh5E0IIIVerY8eOQalU4rXXXgtqvt999x2USiW2bt0a1Hz96fQaJKPRiOHDh+P+++/Hrbfe6rM9Pz8fWVlZ2LBhA8aNG4fc3FykpaXh5MmTiImJAQCkpKR43avF46uvvuI7ehFCCCGk/WVmZvLzG0VHRwc179GjR/P9nZRKZVDzbqzTA6QZM2Y027740ksvYdGiRVi4cCEAYMOGDfj888+xceNG/v4sl+sc1pS4uDivGqOSkhKMHTvW775Wq9WrmlGn07XqnIQQQsiVLCIiAhEREe2St0wmQ9++fdsl78Y6vYmtOTabDYcPH/a6IZ5AIEBqaioOHDjQ5vzHjh2L3377DSUlJTAYDPjiiy+Qlpbmd9/Vq1dDpVLxS0JCQpvPTwghhJCuqUsHSFVVVXA6nYiNjfVKj42NRVlZWYvzSU1NxR133IH//ve/iI+P54MroVCIF198EVOmTEFKSgr+9re/NTmCLTs7G1qtll8uXLjQ+hdGCCGEkC6t05vYOsI333zT5Labb74ZN99882XzkEgkkEgkyMvLQ15eHpxOZzCLSAghhJAupEvXIEVFRYFlWZSXl3ull5eXQ61Wd0qZMjIyUFhYiEOHDnXK+QkhhBDS/rp0gCQWizFq1Cjs3r2bT3O5XNi9ezeuvfbaTilTXl4eBg0ahDFjxnTK+QkhhBDS/jq9ic1gMHjdqO7s2bMoKChAREQEEhMTkZWVhQULFmD06NEYO3YsPwunZ1RbR8vIyEBGRgZ0Oh1UKlWnlIEQQggh7avTa5B+/vlnjBgxgp+qPCsrCyNGjMDSpUsBAHfeeSdeeOEFLF26FCkpKSgoKMCuXbt8Om4TQgghpPMtX74cDMOAYRjk5uYGNe/i4mI+75SUlKDm3VinB0iTJ08Gx3E+S8Mpzx955BGcO3cOVqsVP/30E8aNG9dp5aUmNkIIIVei9PR0MAyDnJwcr/QdO3aAYRgAgMViQXp6OoYOHQqhUIjZs2f7zWvw4MHQaDRYvHixV/qBAwcwdepUKBQKhIaGYuLEiTCbzfz2I0eO4IYbbkBYWBgiIyOxePFiGAwGfntCQgI0Gg3+9re/BelVN63TA6TuhjppE0II6QgOrRWWM3VwaK2X3zlIpFIp1qxZg9raWr/bnU4nZDIZMjMzveYobEwoFEKtVkMul/NpBw4cwPTp0zFt2jQcPHgQhw4dwiOPPAKBwB2KlJaWIjU1FX379sVPP/2EXbt24ffff0d6ejqfB8uyUKvV7T6LNtAF+iARQgghVzKO48DZXQEdYzxcDu3OMwAHgAFUNydDMSqwriWMSMDX/LRUamoqioqKsHr1aqxdu9Znu0KhwOuvvw4A2L9/P+rq6lqc9xNPPIHMzEz+LhgAMGDAAP75Z599BpFIhLy8PD5o2rBhA4YNG4aioqIOm0HbgwKkANE8SIQQQgLB2V0oXfpDGzIAtJ+cgfaTMwEdFrdiAhgxG9AxLMti1apVmDdvHjIzMxEfHx/Q8U2pqKjATz/9hPnz52PChAk4c+YMBg4ciJUrV+LPf/4zAPctvcRiMR8cAe5biwDA999/3+EBEjWxBYia2AghhFzJ5syZg5SUFCxbtixoef7xxx8A3B24Fy1ahF27dmHkyJG4/vrrcfr0aQDA1KlTUVZWhnXr1sFms6G2tpavbdJoNEErS0tRDRIhhBDSjhiRAHErJrR4f6fWivKXDrub1/hMgNisUWBVkoDO21pr1qzB1KlT8eSTT7Y6j4ZcLncT44MPPshP0zNixAjs3r0bGzduxOrVqzF48GBs2bIFWVlZyM7OBsuyyMzMRGxsrFetUkehGiRCCCGkHTEMA4GYbfEiipYj/NZ+gKf7EAOE39oPomh5QPkE2v+ooYkTJyItLQ3Z2dlBeQ969OgBABg0aJBX+jXXXIPz58/z6/PmzUNZWRlKSkpQXV2N5cuXo7KyEn369AlKOQJBNUgBoj5IhBBC2ptijBqS/uFwVJkhjJJBGEDNUbDk5OQgJSXFqyN1ayUlJSEuLg4nT570Sj916hRmzJjhs79nrsONGzdCKpXihhtuaHMZAkUBUoBoJm1CCCEdQaiSdEpg5DF06FDMnz8f69ev90ovLCyEzWZDTU0N9Ho9CgoKAKDZiRsZhsFTTz2FZcuWYfjw4UhJScGWLVtw4sQJfPjhh/x+r776KiZMmAClUomvv/4aTz31FHJychAWFtYOr7B5FCARQgghxK8VK1YgPz/fK23mzJk4d+4cv+65EwbHcWjO448/DovFgieeeAI1NTUYPnw4vv76ayQnJ/P7HDx4EMuWLYPBYMDAgQPxxhtv4N577w3iK2o5CpAIIYQQ4nUHC4+kpCRYrd4TVRYXF7f6HEuWLPGaB6mxf//7363OO9iok3aA6FYjhBBCSPOOHTsGpVKJ1157Laj5nj9/HkqlEqtWrQpqvv4w3OXqxIhfnj5IWq0WoaGhnV0cQgghXYDFYsHZs2fRu3dvSKXSzi5Op6ipqUFNTQ0AIDo6Oqj9dR0OB1+DJZFIkJCQ4He/5v4dWnr9piY2QgghhARNREQEIiIi2iVvoVDYYTNqUxMbIYQQQkgjFCARQgghhDRCARIhhBBCSCMUIAWIRrERQgghVz4KkAKUkZGBwsJCHDp0qLOLQgghhJB2QgESIYQQQkgjFCARQgghJGiWL18OhmHAMAxyc3ODmvfevXv5vGfPnh3UvBujAIkQQgghSE9PB8MwyMnJ8UrfsWMHGIYB4J6AMT09HUOHDoVQKGwySBk8eDA0Gg0WL14MwH17Ek9g03jZvn07f9zu3bsxYcIEhISEQK1W45lnnoHD4eC3T5gwARqNBnPnzg3yq/dFARIhhBDSBV28eBHffvstLl682GHnlEqlWLNmDWpra/1udzqdkMlkyMzMRGpqapP5CIVCqNVqyOVyAEBCQgI0Go3X8txzz0GpVGLGjBkAgKNHj2LmzJmYPn06fvnlF+Tn52Pnzp1e924Ti8VQq9WQyWRBfNVNvIZ2PwMhhBByFeM4DiaTKaBjtmzZgkcffRQulwsCgQCvvPIKFixYEFAecrmcr/lpqdTUVBQVFWH16tVYu3atz3aFQoHXX38dALB//37U1dW1KF+WZaFWq73SPv74Y8ydOxdKpRIAkJ+fj2HDhmHp0qUAgL59+2Lt2rWYO3culi1bhpCQkIBeS1tRgEQIIYS0I5PJxAcBreFyuZCRkYGMjIyAjjMYDFAoFAEdw7IsVq1ahXnz5iEzMxPx8fEBHd9Shw8fRkFBAfLy8vg0q9Xqc980mUwGi8WCw4cPY/Lkye1SlqZQE1uAaB4kQgghV7I5c+YgJSUFy5Yta7dzvP3227jmmmswYcIEPi0tLQ0//PADtm3bBqfTiZKSEqxYsQIAoNFo2q0sTaEAKUA0DxIhhJBAyOVyGAyGFi8nT56EQOB9eWZZFidPngwoH0//n9ZYs2YNtmzZguPHj7f15fswm81477338MADD3ilT5s2DevWrcNDDz0EiUSC/v37Y+bMmQDg8350BAqQCCGEkHbEMAwUCkWLl/79++PNN98Ey7IA3MHRG2+8gf79+weUT6D9jxqaOHEi0tLSkJ2dHay3gffhhx/CZDLhvvvu89mWlZWFuro6nD9/HlVVVbjlllsAAH369Al6OS6H+iARQgghXcwDDzyAtLQ0FBUVoW/fvu3WF6g5OTk5SElJwYABA4Ka79tvv42bb74Z0dHRfrczDIO4uDgAwLZt25CQkICRI0cGtQwtQQESIYQQ0gXFx8d3SmDkMXToUMyfPx/r16/3Si8sLITNZkNNTQ30ej0KCgoAACkpKZfNs6ioCPv27cN///tfv9vXrVuH6dOnQyAQ4KOPPkJOTg4++OADvjatI1GARAghhBC/VqxYgfz8fK+0mTNn4ty5c/z6iBEjALinM7icjRs3Ij4+HtOmTfO7/YsvvsDKlSthtVoxfPhwfPLJJ/w8SR0t4ADJbrdDJpOhoKAAQ4YMaY8yEUIIIaSDbd682SctKSkJVqvVK624uLjV51i1ahVWrVrV5PY9e/a0Ou9gC7iTtkgkQmJiIpxOZ3uUhxBCCCHd3LFjx6BUKvHaa68FNd/vvvsOSqUSW7duDWq+/rRqFNvf//53PPvss6ipqQl2edrFnDlzEB4ejttvvz2gbYQQQggJTGZmJk6ePImCggLMnz8/qHmPHj0aBQUFOH78ODZs2BDUvBtrVR+kV199FUVFRYiLi0OvXr18Zuo8cuRIUAoXLI899hjuv/9+bNmyJaBthBBCCAlMREQEIiIi2iVvmUyGvn37tkvejbUqQGrq7r1d1eTJk7F3796At3UKbQlQcwaISAZUPTu7NC3XHcvdHctMCCGkQ7QqQArm9OP79u3DunXrcPjwYWg0Gnz88cc+AVheXh7WrVuHsrIyDB8+HK+88grGjh0btDJ0GUf+DXz6GMC5AEYAzHoZGOk7kVa74jj34l6pf+7n0bMvOKDgPeCLpy+VO20VMPQO93qTC3eZ7S3Yx3W545vJ49wPwK/57vIzAuCmXGBUYDeCJISQprRkRBdpP8F4/9s0zP/w4cP8NOSDBw/mh/oFwmg0Yvjw4bj//vtx6623+mzPz89HVlYWNmzYgHHjxiE3NxdpaWk4efIkYmJiALjnXnA4HD7HfvXVV/xkU12etuRScAS4H3c+Cny9HBAILhOooJltTRznLwgKBs4F7FriXroLzgV8mgkceA1QDwaiBgDR/YGo/kBkX0Ao6ewSEkK6CZFIBMB9g1qZTNbJpbl6mUwmAJf+PVqjVQFSRUUF7rrrLuzduxdhYWEAgLq6OkyZMgXvv/9+k7Nj+jNjxoxm5zh46aWXsGjRIixcuBAAsGHDBnz++efYuHEjlixxX4Q9k1S1J6vV6jXUUafTBfcENWcuBUcNmauDe56OxgiaWZg2bGdbf7y5Frh40LesVSfcS+Pyhyd5B02e51JVh7yF3R41ZZKrCMuyCAsLQ0VFBQD3fdjacssPEhiO42AymVBRUYGwsLA2TTDZqgDp0UcfhV6vx++//45rrrkGgHtmzQULFiAzMxPbtm1rdYEastlsOHz4sNe9YAQCAVJTU3HgwIGgnKOlVq9ejeeee679ThCR7L4YNwySGAEw/z9ASCwAxn3Bb/gINErDpUd/+ze3zSevhvs3s02nAV4b16jcLPDYUSAsIRjvTPBpS4DcIb7v9c2vAMYqoOqUe6k8BVi1QM0f7uXUF975KNVAVD8gekCDAGoAEKL2fu+uZl2h2ZiQDqZWqwGAD5JIxwsLC+P/HVqL4VrRUKdSqfDNN99gzJgxXukHDx7EtGnTUFdX17rCMIxXH6TS0lL07NkTP/zwA6699lp+v6effhr/+9//8NNPP7Uo39TUVBw9ehRGoxERERHYvn07n19z2xryV4OUkJAArVaL0NDQVr1eH0f+DXz6OMA53UHGrNzucTHpjuVuSZk5DjCUA5UnGwRN9c/1mqbzloS6A6eGQVNUf3dNFHuFTF7PcYBFC5iq3UGlqarBY7U7XXcRKP7e99j4sYA8EhDLAbECECsBked5g0Wk8JMmd+/f3u9jd6z16o5lvsI5nU7Y7fbOLgagLwe05wFVYv0P7iubSCRqtuZIp9NBpVJd9vrdqm8Zl8vlt11PJBLB5fLTTNTJvvnmm1Zta0gikUAikSAvLw95eXntM1HmyPuA5OvdtRURfbrPl1x3LHdLysww7tqgEDXQZ5L3NosWqDrtHTRVngRqzwJWHVBy2L00xIrdF6/GTXWR/dzBQmdyOd1Nj36DnQbrppr659WAq5Vf/P6aNwPFSuoDLGWDwCmAAEus8HN8feDVHWu9umOZge4Z1AVQZpZl2/8eYk474LAADmujx/rnxz8DfnwN7gEpDDApGxi9EJCFA2zr++dcDVpVg3TLLbegrq4O27Zt4ztBl5SUYP78+QgPD8fHH3/cusI0qkGy2WyQy+X48MMPvUa2LViwAHV1dfjkk09adZ5gaGkESq4yDqs76GoYNFWdBKqKAIe5iYMYd3Nkw6DJU+ukiPTetaVfzg6bO4jhg5umanrqt5lq0KqO+uIQQB4BKKIAeVT9Y6T7kWGBr/7hnS8jAKavAURSwGYEbAbAZqp/bgTs9Y82U/02I2Bv8NzlOxgjqAQi/4FfeB93Z32+b1t9/zYw8OnvhgbP/e7rb/+W5CNo0MTdIN1uBo6+7/0+gwHG/AWQhbn/HQRC92APhgUE7GXSWHfeLUpjG+ThL60+nT+H4FJawTbgv3/rXkGdv0A0Zb6f4MTq/nv3m+4niPE82ltyTKNHrg0/1iWh7kBJHuH+u5VFuJ97Hhs+9zyK5N2+C0FLr9+tCpAuXLiAm2++Gb///jsSEhL4tCFDhmDnzp2tvvtw4wAJAMaNG4exY8filVdeAeCuvUpMTMQjjzzCd9LuDBQgkYC4XID2QqOg6bT7ubmZGenlkZeCJosO+P1juC+EDDDoFneznU9NT7W7Fqs1pGH+gx1/6/JId6DTnGA3vzpsfgIn06Vgy27qmoEXCYCf/pT8enPb6teb2+aTTzPnbHwc52r+b7UrYMWAUOoO5oVS99+drjTI55C4//blEZeCK1lEgzQ/QZZE5Q6aA9GOtYvtGiAB7p7i33zzDU6ccI/6ueaaa5CamhpwPgaDAUVFRQDcdwR+6aWXMGXKFERERCAxMRH5+flYsGAB3njjDYwdOxa5ubn44IMPcOLECcTGdnxbasMmtlOnTlGARNrOWOW/n5P2QtvyZQT1X1rNBDteAU9E+1S5a0u6fvOrJ/Cq+QN4+wbfDvy3bXTX5nnNr1U/xxYaz7XVYB0N9vNJ97c/LpOXJ73BflYt8OMG+NQgpcwHRDL3RdJVv3BNPPqkudxBY0vSOKc73SfNeWl/fyN0r0QCoXeA0uyjrAX7XSYPUYM8WIlvEOJ3QAoLPFbgboI217hrjz2PpupGabXeaa1tVmcE7mCKD5o8tVX+0iKAot3A1/9st9rFdguQ7HY7ZDIZCgoKMGTIkDYXdO/evZgyZYpP+oIFC/g7C7/66qv8RJEpKSlYv349xo0b1+ZztwXVIJF2ZzUA1UXuYOn018CxD3z3uWYWoB7uvnjzgU/9ozQs8F9t5ModdNCZPIGeJ4iqOw+8Nt43EF28Fwjp4T1Pm+d4r+eNt9WvN7fNa/0y+fg7p6ECeHeOb5kf+r5+AIakaw7CCNZng+PcPyL44KnaHUB5BVTV3sGVucZ9TFsxLPD4saD9wGrXGqQ+ffrg448/xvDhw9tUyO6IapBIp2jql2AQvzRIA92h1qux7lbmrh7U+dMdywx07mfDYfWupfKqrar1TTOU+w+qFnwG9L4uKEVq1wDp7bffxkcffYR33nmn3W5I19VRDRLpcN31y5mQpnS3oA7onmXuTjrgx2C7BkgjRoxAUVER7HY7evXqBYVC4bX9yJEjgZe4m6EAiXQK+nImhFzp2vnHYLvOg9T4ZrKEkA6i6kmBESHkytZF5tYLOEByOBxgGAb3339/q4fzd2ftOlEkIYQQQrrEj8FWNbGFhITg2LFjSEpKaocidQ/UxEYIIYR0Py29frdqDPDUqVPxv//9r9WFI4QQQgjpylrVB2nGjBlYsmQJjh07hlGjRvl00r755puDUriuiJrYCCGEkCtfq5rYBM1MPscwzFURPFATGyGEENL9tOsoNpfrKpk2nhBCCCFXpYD6IM2cORNarZZfz8nJQV1dHb9eXV2NQYMGBa1whBBCCCGdIaAA6csvv4TVauXXV61ahZqaS3c3djgcOHnyZPBKRwghhBDSCQIKkBp3V2pF96VuLy8vD4MGDcKYMWM6uyiEEEIIaSd0q+8AZWRkoLCwEIcOHersohBCCCGknQQUIDEMA4ZhfNIIIYQQQq4kAY1i4zgO6enpkEgkAACLxYKHHnqInwepYf8kQgghhJDuKqAAacGCBV7r99xzj88+990XvDvuEkIIIYR0hoACpE2bNrVXOQghhBBCugzqpB0gGsVGCCGEXPladasRQrcaIYQQQrqjll6/qQaJEEIIIaQRCpAIIYQQQhqhAIkQQgghpBEKkAghhBBCGqEAiRBCCCGkEQqQCCGEEEIaoQApQDQPEiGEEHLlo3mQWonmQSKEEEK6H5oHiRBCCCGklShAIoQQQghphAIkQgghhJBGKEAihBBCCGmEAiRCCCGEkEYoQCKEEEIIaeSqCJDmzJmD8PBw3H777V7pFy5cwOTJkzFo0CAMGzYM27dv76QSEkIIIaQruSoCpMceewz//ve/fdKFQiFyc3NRWFiIr776Co8//jiMRmMnlJAQQgghXclVESBNnjwZISEhPuk9evRASkoKAECtViMqKgo1NTUdXDpCCCGEdDWdHiDt27cPs2bNQlxcHBiGwY4dO3z2ycvLQ1JSEqRSKcaNG4eDBw8GvRyHDx+G0+lEQkJC0PMmhBBCSPfS6QGS0WjE8OHDkZeX53d7fn4+srKysGzZMhw5cgTDhw9HWloaKioq+H1SUlIwZMgQn6W0tLRFZaipqcF9992HN998MyiviRBCCCHdm7CzCzBjxgzMmDGjye0vvfQSFi1ahIULFwIANmzYgM8//xwbN27EkiVLAAAFBQWtPr/VasXs2bOxZMkSTJgwodn9rFYrv67T6Vp9TkIIIYR0bZ1eg9Qcm82Gw4cPIzU1lU8TCARITU3FgQMH2pw/x3FIT0/H1KlTce+99za77+rVq6FSqfiFmuIIIYSQK1eXDpCqqqrgdDoRGxvrlR4bG4uysrIW55Oamoo77rgD//3vfxEfH88HV/v370d+fj527NiBlJQUpKSk4NixY37zyM7Ohlar5ZcLFy60/oURQgghpEvr9Ca2jvDNN9/4Tf/zn/8Ml8vVojwkEgkkEgny8vKQl5cHp9MZzCISQgghpAvp0jVIUVFRYFkW5eXlXunl5eVQq9WdUqaMjAwUFhbi0KFDnXJ+QgghhLS/Lh0gicVijBo1Crt37+bTXC4Xdu/ejWuvvbZTypSXl4dBgwZhzJgxnXJ+QgghhLS/Tm9iMxgMKCoq4tfPnj2LgoICREREIDExEVlZWViwYAFGjx6NsWPHIjc3F0ajkR/V1tEyMjKQkZEBnU4HlUrVKWUghBBCSPvq9ADp559/xpQpU/j1rKwsAMCCBQuwefNm3HnnnaisrMTSpUtRVlaGlJQU7Nq1y6fjNiGEEEJIsDAcx3GdXYjupGEn7VOnTkGr1SI0NLSzi0UIIYSQFvC0AF3u+k0BUiu19A0mhBBCSNfR0ut3l+6kTQghhBDSGShAChCNYiOEEEKufNTE1krUxEYIIYR0P9TERgghhBDSShQgEUIIIYQ0QgFSgKgPEiGEEHLloz5IrUR9kAghhJDuh/ogEUIIIYS0EgVIhBBCCCGNUIAUIOqDRAghhFz5qA9SK1EfJEIIIaT7oT5IhBBCCCGtRAESIYQQQkgjFCARQgghhDRCARIhhBBCSCMUIAWIRrERQgghVz4axdZKNIqNEEII6X5oFBshhBBCSCtRgEQIIYQQ0ggFSIQQQgghjVCARAghhBDSCAVIhBBCCCGNUIBECCGEENIIBUgBonmQCCGEkCsfzYPUSjQPEiGEENL90DxIhBBCCCGtRAESIYQQQkgjFCARQgghhDRCARIhhBBCSCMUIBFCCCGENEIBEiGEEEJIIxQgEUIIIYQ0clUESHPmzEF4eDhuv/12r/S6ujqMHj0aKSkpGDJkCN56661OKiEhhBBCupKrYqLIvXv3Qq/XY8uWLfjwww/5dKfTCavVCrlcDqPRiCFDhuDnn39GZGTkZfOkiSIJIYSQ7ocmimxg8uTJCAkJ8UlnWRZyuRwAYLVawXEcroJ4kRBCCCGX0ekB0r59+zBr1izExcWBYRjs2LHDZ5+8vDwkJSVBKpVi3LhxOHjwYNDOX1dXh+HDhyM+Ph5PPfUUoqKigpY3IYQQQrqnTg+QjEYjhg8fjry8PL/b8/PzkZWVhWXLluHIkSMYPnw40tLSUFFRwe/j6UPUeCktLb3s+cPCwnD06FGcPXsW7733HsrLy4P22gghhBDSPQk7uwAzZszAjBkzmtz+0ksvYdGiRVi4cCEAYMOGDfj888+xceNGLFmyBABQUFDQ5nLExsZi+PDh+O6773w6cwPuJjir1cqv63S6Np+TEEIIIV1Tp9cgNcdms+Hw4cNITU3l0wQCAVJTU3HgwIE2519eXg69Xg8A0Gq12LdvHwYMGOB339WrV0OlUvFLQkJCm89PCCGEkK6pSwdIVVVVcDqdiI2N9UqPjY1FWVlZi/NJTU3FHXfcgf/+97+Ij4/ng6tz587huuuuw/Dhw3Hdddfh0UcfxdChQ/3mkZ2dDa1Wyy8XLlxo/QsjhBBCSJfW6U1sHeGbb77xmz527NgWN89JJBJIJBLk5eUhLy8PTqcziCUkhBBCSFfSpWuQoqKiwLKsT8fp8vJyqNXqTilTRkYGCgsLcejQoU45PyGEEELaX5cOkMRiMUaNGoXdu3fzaS6XC7t378a1117bKWXKy8vDoEGDMGbMmE45PyGEEELaX6c3sRkMBhQVFfHrZ8+eRUFBASIiIpCYmIisrCwsWLAAo0ePxtixY5Gbmwuj0ciPautoGRkZyMjI4GfiJIQQQsiVp9MDpJ9//hlTpkzh17OysgAACxYswObNm3HnnXeisrISS5cuRVlZGVJSUrBr1y6fjtuEEEIIIcFyVdyLLZgadtI+deoU3YuNEEII6UZaei82CpBaiW5WSwghhHQ/dLNaQgghhJBWogApQDSKjRBCCLnyURNbK1ETGyGEENL9UBMb6VBlxjIc1BxEmbHlt4AhhBBCuqpOH+ZPur+PTn+E5w48BxfngoARYNm1y3Brv1s7u1iEEEJIq1GAFKCr+V5sHMehzlqHi/qLuGi4iIv6izhVewq7infx+7g4F5b/sByVpkoMjBiIHsoeiFPEQSlWdmLJCSGEkMBQH6RWulL7INlddpQZynBBf4EPgho+N9gNrco3VByKOGUceih68I89lT35ACpMEgaGYYL8agghhBBvLb1+Uw3SVUhr1XoHPw1qhDRGDVycq9njY2QxiA+JR3xIPMIkYXin8B1wuBRnM2Awvsd41FprUWoohc6mcy81OpyoOeE3T5lQhh6KHuih7IGeikuBkyeYipZHQ8BQlzlCCCEdgwKkK5DD5UC5qfxS8NOoFkhn0zV7vISVIF7pDoASQhLcwZDS/TxOGQepUOq1f3JYcrN9kIx2I0oNpdAYNSgxlEBj0KDUWMo/VpmrYHaY8Yf2D/yh/cNvmYQCIdRytVetU8NHtUINkUDU9jePEEIIATWxBay9bzVSZizDed15JIYmQq1QN7mfwWbwWwt0QX8BGoMGDs7R7HkipZGXgh9PIFQfFEXJogKurSkzupvlEkISmi23P1an1Sdo8jyWGkpRYaqAk2u+z5eAESBaFt1kM14PRQ/IhDKfMrfkvSaEEHLloFuNtLP26IPkNRoMAjw28jEMjR7qtyms1lrbbF4igQg9lT19gp+EkAT0VPaEXCQPSpk7gsPlQIWpgq+F8qqNMmqgMWhgc9kum0+ENIIPngw2A37U/AgOHBgweGbMM5h3zTzqB0UAUPBMSGdrz79BCpDaWbADpDJjGdL+k3bZ/j8NhUvC3QFPSE++CcwTBMXIY66aPjsuzoUaSw1KDaV8rVPjYMpoN142Hykr9apxilPGQa1Qu58r4hAtj4ZQQK3SVzK7045Nv23CqwWv8sFzRkoGbut/G1QSFTXjEgqe25nD5cC7x9/FSz+/xP8NLp+wPKhTx1CA1M6CHSAd1BzEA1894JMeI4tB3/C+fmuBaOh8y3AcB51NxwdQP5b+iPdPvh9wPizDIkYew3cm76HwXuKUcd2qZu5qZbKb+BrZ8/rzuKC/gPP687iov4hSQ6nXgIPGFCIFVGIVVJJLS5gkDKHiUP55w20qsQqhklAKrK4QNOdb67k4F+qsdag0VaLcVI5KUyUqzBWoNFV6Pa8yV/n8DQoYAb687cugBaQ0iq2bSQxNhIAReNUgCRgBtt64lX6ltBHDMPwF65rIazA4cjA+OPWBz3v9r2n/gt1lh8agcTfdeRaDBmWmMjhcDj4NFf7P5ZnOoGHNk1qpdncmV/RApCzyqqnZ60xaq9Yd+Oi8A6Dz+vOoMle1Ol+j3egedGAsDeg4pUgJlUSFUHGo3yCqYXAVKgnlg65AaiypZiN4HC4HdDYdtFYttFYtdDYdzuvOY+2htfzF2zPnm8VhQWJoIkLEIQgRhyBUHIpQcSjErLiTX0XH4DgOerveK/CpNFeiwlThHQSZK+FwNd83tikuzoUL+gsd/rmmGqRWavc+SPTrpF0F+l47XU5UW6pRaihFmbGMb74rM5a5O5UbNdDb9Jc9r0gg4oMnT01UnMIdUHkCKwkrafJ4ugi6cRyHSnOlVxDUsEbociM1VRIVEkMSER8Sj8SQRCSEJCAxNBFSVoq7Pr/LJ3j+Ys4XkIvk0NrcF8w6ax1/4fQ891ps7n1a8ploTogoBKGSBrVT4ksBVMMarCPlR7Dxt43gwEEAAf4x/h+4Y8AdbTr3lcDqtHoFOf6ee/5NG6a3dr63hiSshA+aPIGTv8fGgVWIOARKsTKotY6t/d4w2U18sNM44KkwVaDS7K79sTgtLc4zQhqBGHkMomXR7kd5NKJl0YiVxyJaHg0GDO767C644P032Bk1SBQgBagjRrG1djQYCUyw32uDzeBV66QxukfieQKqClNFi/qYRUojfZvxlD1wvPo43vr1LbhwdQTQDpfD/cXuqf1pUBtUYiiB2WFu9njPfF2JofUBUH0gFB8SD5VE1eRxwfyh4nQ5L12Mbd5BFB9YNUrXWrXQ29sWWAHuJmGZUAapUAopK/V+FErd21gpJEIJpKyU31fCSpo/jpW5j6l/LhQIWz24oSUXbo7jYHaYfd+r+uc6q67J9EAu3P6EiEP4oFTKSnGk4ojPPinRKbA6rdDZdNDb9NDb9M0207aUTCjzG0w1ft440PIsnppqf5/nm/rcxAc3zTV3BRIohopD+cAnWh7NP/cEPjHyGERKIyFiLx/4tXdlAQVI7exKnUmbtB+7y45KUyXfcbxxM57GqLnsRb+xGFkMlGIlZEIZZEIZ5CI5/7ypRS6s30fkf3uwO6I3dxG0Oq0o0ZfwgU/D5rASfUmz01UIGAF6KHp41QB5aoTiQ+J9pnUItMyd+UPF4XJAb9N71041rr2yumuvSo2lOKc71+Fl9GAZ1juwqg+mvAItP8FWUW0Rvjr3Fd8Rd1yPcYiRx/gNeFrbNAO4PyeeZsxQSah3H7L64KdhU6fnuVKs9PlbaMmF28W5YLQb+WDJM1Fuw3WvbVYd9HY9n9aSASWXw4CBUqSEXChHubm8TXnJhDI+yOFrfWTRiFHEIEZ2qQao8fx4bdWef4MUILUzCpBIsHEcB61V613zVD8fVFFtEc7qznZIOUQCUWCBlmfxE3B9f/F75BXkwQUXGDC4PvF6qCQqPhAqN5Y3+2tbLBB7BT0Na4N6KHtQ52f4HwErYAR4d8a7CBGHwOK0wOKwXHps9NzsNMPqsPJpZocZFocFVqfV/bw+nV+vPz6QEbfBIBKIvAIZf8EOn95gXSFSBLXfX3sHzw6XAwabwR1A2d3BlM6qazLgahx0tbTWTCwQe9X0eJq7YuSXAp8YeQwUIkXQX2NnowCpnVGARDpSUxfBlye/DLlIDrPDzC8mh8lrnV/szW/v6Aueh0Kk8Nsf6GqbrqItOrr/IsdxsLvs3oGWwwyr08oHUD6BVoPA7Lz+PPZd3OeT7+39b8eQyCF80OMZHRgqDoVMKKN5ylrA5rTxAVOxthiPffuY148QASPAh7M+RN+wvlft+0kBUjujAIl0tPa8CHIcB5vLxgdRlw22GgRcTS111jrUWet8znVz8s0Y32M8HwiFS8Kv2i/qYOrsZsFANBXwB7MjLnH76PRHeOXL5YitcaI8gsWjacGdU6g7omH+hFxhbu13KybETWiXiyDDMJCwEkhYCcIQFpQ8m7oIPjriUboItgO1Qt1t3le1Qo1l1y7zCfi7S/m7k6lHXbjmNSfgcgECoIfaBfTr7FJ1D1SD1EpUg0TI5dHUFaQ53anWqzvhbDbYNRqYfv0VmqefARpe5hkGPde/DNmwYRBGR4MRXH1N2NTE1s4oQCKkZegiSEhwcS4XHJVVsJdchP3iRdguXID9Yon7eclFOMrK3TVGl8GIRBDG9YC4Z0+IesZD1LOn1yKMjuq0AMpQa0FdhRlhMTIow4M7Qo6a2NpJw3mQCCGX152afjyKC8/g5JFCDBg5CEmDkju7OOQq5NTpvAIfe8lF2C5ehP3CRdhLSsDZmr9BNyORQBgbC/v587BIwmCWRUNmroTUWgehWg1HZSU4ux32c+dhP3fefx5iMURxcT6Bk6hnHMTx8WCjotql/2Dh/lLsffcEOA5gGGDyPQMx6E9xQT/P5VANUitRDRIhV6a8Z19EZs7TfLPg+mfXIuP//a2zi3VZFy9exOnTp9GvXz/Ex8d3dnGuWMGq2XBZrbCX1Nf6eAKf+hog+8USuHS+s8FzADhGAI5hwbEisOo4sHE9wap7QqBWg43tAUFULATR0WCUKnAu4MR/fsCJcxKAEQCcC33jbegzfRRcDiccdXWw19TCUV0LR20dnHVaOOq0cGi1cOoN4DgGHONeAEH9uQUAGPejUARGGQJBSAgYRQgYpRIChQKMXAFGJgfEEnAcwLk4cC7OXanFcXC5OHc6x/lss9ucqCj2niiVEQD3rZwQtJokamJrZxQgEdIy7VlVHgiHw4Hq6mqUl5Wj/FwpyopLUXZBg4rSclSWl6OiqhKllRocLT3hc2xsSBTkUhkkYgnEEjEkEgnEUgmkMikkcikkMimkCtmlbWL3Y8PnzaUFsr/AT5PH22+/jcWLF8PlckEgEODNN9/EAw/43vy6q7GXlcFWfA7ipF4QqbtWLaPLxcFuccBmccJuccJmcaDocAWO7r7A79N/XCxieoXC5eTgcrrqHzk4HS53AKI3wq41wGEwwmE0w2k0w2G2wmmxwWV3wMWw4ARCcAxb/5z1eu5iReAEIvdzCMChdc1dtYZKVGovIloVj3BldLDeonYl4QyQMyaYODmsjBKznxiBngPCg5I3NbERQjpd4f5SfPvvQ3A6asEKwzHlvjFBqyp3OhyoKC9D6cWLKNNoUK7RoKysDJWVlagsr0BVeTVqampRXVuHGl0dtGY9Wvt7sFxfBbT97h9BIRQKvYImgUCA0tJLN891uVxYtGgRDAYDRo8ejT59+kCtVne5qRRqt3+IE2tyUacIR5ixFgOfeQxht9/epnI6nS4+mHE/Ovkg51Ja/aPVCZvZAXvDRz4gcsBh89+Hp2Gwceon4NRPLZmpWlK/hAEiuJcgYQQMWJaBgGUAAeDkbLBzVjhddpgtZuw7/AW+PLKVn7H8pjH346brb0NEZATEYgkYhoFAAIBhIBAwYATuUa1M/XMBwwACBgLGfS5+G+cCZzHBZTCAMxrAGXRw6fVw6XRw6bTgDHqAc4LhODCcCww4gHN5PReIhBCGqcCGh0EUHg5RRDgcyjCUHivHSFUSGCYcHOfCEd0FqGImBO9Na+l7SzVIrUM1SIS42W1OGGutMNZZYahzPxrrrKirMOGPI/9DVdWnqDIYEKVUIjJ8Mnr0GwKxFBAIHWBZFxjGAUZgB8fZYTLrUaerRa2uFrW6OtRq61Cn1aFWp4NWb4DWaITOaILebIHRaoMrwK8vBgwi5CpEyMIQLgtBqEwGpUQChUQEmVgAF+fEph/3+kys97cps6CUSCCABAyEEEAEcEIAQjAQumsbnA7YnHZYHXbYnXbYnO5Ha4PnNs/COWCHA3Y4YXPZYXPZYXc5YHPUb7fbYLVZYbPZYLfb2/xvJGVZJISEIFGpRIJSiUSFEgkKBRIVCiTIZJCyrLtTr8vlDiLrnwPu5g9/21r1vMH6saQUXFAZ4G44YtDDEIl+ZRfgEMrgFMrgEErhrF8crPejk5XCwUrc66wEDoEETlYCVzvMrM5wTgg5GxjOib2n92HbvpfAcRwYhsHdE7MwMzYZEqsWAs4JhnNA4HKC4dyLABxYhQycQgqnQgqnQgKnXAKHXAynTAIby8DusMJqs/CLxWqB1W6B1WKBxWaGxWKG2WKB1WqG2WKGxWKB2WyC2exeN5ncz00mE6xWa0CvTSwWQ6VSITQ0lH9s+Lypx8bPWZaFw2aFzWyGzWyCzWyGVa+DqbQU5jINLBXlsFRXw15nhMvsAmwCCBgphGIlhKIQiEQhEAuVkIgUkLAhkLJylOkrcbb2InqHx7trcOdGIGrU0KD8m1ITWzujAIlc6TiOg8Vg9wp6DLUNntc/Wk2O+oufCZyzBi5XLZyOalgtpThw+gA+O3q8/hIIjEqKR0yIEgarFUarDQarDQaL1f1otcHZgpE3jamkIYiUhyFSHo4oeRj/PEyuRKhSAVWoHKrwEIRGKBEaEwI2VAhBqAgiqRQiiQRCqRQiiXuxmU144dGleGP/Ljg5F1hGgMV/mo47H7wNNrMJhppq6Ksqoa+ugsV46UaeDBhIWDlkrBJSVgEpq4RM6H5UiFWQS1SQCRQQQQIB1/JmEk7AwClmYBW6YLKbYTLrYTTqYdDXwaCrg8FkwEWTDjn7/+Vzy5a+kcmos9Sh2lRz2ZqzUKkK0cpoRCtjEB0Si+iQGEQpYxAdooZKHg4BwwIMAw4M3P1P6mt5GEF9kOoABxtcnBUcZwMHKzjOCg42cJwFHGcDOIs7jbOAc5kBmJoojRBgWAAsAAEYz/MGj0z9Nu80AcAI3cdwDAQcBwHngsDlXliXC6zLAdblBOtyQui0g3U6IHTawDrtEDrtEDltYO1WiJ1WcDYTjBYTdHYr6hwOFDkEWKsp9inteFU4WKkEVlYAC8PAynEwO52w2O0wWSwwm82trrlsC6lUCqFQCIOh5TecbS0xy0IulkAukkAhlkEpkSNEokCoJAQqSQhU0jCES8OgkoZAKZZDKVEgVKKAUlz/KFFAIZbxs+a/f/QzPPPlC3w/wDVpT2L2Hdei7/2zg1JeCpDaGQVIpDMEqyOu0+GCsc4KfY0ZlWV1qC6vRVV5HWoq61BbrUVdjRZ1tTpYrRZY7Wb34rDAajfBatPCatfBatPD6jDBajfBZrfA5nDA6nDA6nDC3oZRnnKRDFGKcETJwxEhVyFKHo5IeTgi5WH1AZD7ebgsDGJpKBwQwcRxMLoAk5OD0cXB7AIcAFihABK5EBK5EGKZEBK5yL0uq0/jn4v4/X7a8Rl+/TYfBjMHpYzBsCl34trbbobD7oTD5oLD5n60mEww1lTDWFcNU101TPoaWAy1sBrrYDPVwmaug8vp+4teJJC4AyhWUR9QKSEVhkImDIOs/tezlJVCHMBNg7cd/QzZX77AB3Wr057EmAEzYHABBrsdJfpylNSVQqPToEqnQbXe/VilK4XZ1vzNUVkBi0hlOCKVKkQoQxCpUCBCIUWkQoJwhQhSoRMIwt3r25vD6YTRaofB6g7IPQG60WqFwWLzSjNYrbDYW3+D3KawAgFEQhZioRBi/rF+Efl5LhLx65L65xKRECKRCBKREBKR+NI2kRASsRgSkQgikRACgQBV1bV4/PWNXv86DMNg+a0zIAQHk8UKi8MBi90Oi90Bi90Bq90Bm8MFuwOwOwGb3QWrw1W/jx0mmw0muwUGqxlWZ/Mj6QLBMAyUcgVkIgkq6qq93zdGgCOf7cKwmTcE5VwUILUzCpBIR2vcEffpp5/GlClTYDQaYTAY+EVbp0NttRa6Oj20dTrotAYYDQYYjAaYzCaYzSZYbCZY7RbYHC27sWUwTR4wHgOj+iBSpKoPesIRIQ9DlCIcEbIwyEQS944MwISIwYSIwclFcMhY2EUsbKwAFgYwO1ywmp2wmh2wmhywmuyweZ6bHW26ZnMuPVzOOgjYMDCCkNbnw1nBuQzgXHp+gUvvlQb4b0JjGWF9bZS7JkrOhkIuCoNcpIJcFAqpSAGJQAqhSwAGDDS6ChTXlSAprCd6hMb4Lw842Bk7rLDA4jLC7DCgXK/BH1XFOF9TghJdJcp0Nag06FBtNKHWaL5sM6ZCIkaEQo6oECViwsPQIyoKcTExiO8Rhx5xcVAoQyFWKCFVKCFVhECqVMKoNePbTS+gzmRClcGIKKUCYXI55mTnIDIuCk6HAy6HHU6HA06HHU6753n9usMBk9GI6qpqVFZXo7q6GjW1taipq0VNnRa1dVrUarWo0+lRp9dDazDCZAn8s84wqG+CFUMiZHGuus57O4Abhw2ESiaDiGUhFrIQsd7LpTQBWEFg/auau5FzS50p5fBmgxrRR6+bjTG94yFjFZCwCnegLg6FTKSEVKCARCCDsIWdpGxOO4w2E3ROE0xCG4yMBUbGCoPLAoPLDL3DBKPdBJ3VAL3FCIPJAK1eB51OB61Wyz86HJcPRr/99ltMnjy5je+GGwVIDcyZMwd79+7F9ddfjw8//NBnu8lkwjXXXIM77rgDL7zwQovypACJtBeHw4GzZ8/ixIkTOHnyJE6cOIFff/0Vhw4dardzMmAgFYshFYohEYogE4ogE0kgE0kgF0khF8sgF8kgF8vc1eKyEIRIQ6AUKxEiVkIhlEPOSiAXy6AQuffVWw2Y/K97vW41wjICHHjoA/4CzkiFEEZKIQyXgI2QQRghhTBCCjZCCmGYBIywdaN2OBcHm9V5KWgyOrwCKavZAZvpUjDl2c+otcFi8A1YxDIWErkIQpEAQjELobj+sbl1kfuRhQNcVTm4shI4Sy7AdaEYznNnwFVXQuCygePssAk5WERCWEQsLDIJbBHhsMplMAsYmGyWZi8gcjYENyU8BKbBTX05jkOx4XeIBRLIhErIWCUkbMvvau/iXLAxFphhRqm5AheMZbhoqECJvhKl2kqUVJfjQpkGNXW1zeYjFAqRlJSEPn36oE+fPujduzf//F9rX8GG/M188+vD8x7AU6v+6e5kX79UVFR4rTdMa03TkVAoRFRUFGKiohEVEYWo8EhEqiIQFRqBqJAIRCrcTbQRUhUiJCqEsgrA4oTL4oBDb8G2/Tu9aupy0p7EXcNvCrgcHa0lwbMPoQBsiAisUgxBiBisUuR+9JMmELOtLhvHcbBYLHzAdOrUKdxyyy1wNWhuZ1kWxcXFQZu+ggKkBvbu3Qu9Xo8tW7b4DZD+/ve/o6ioCAkJCRQgkQ5TW1uL338rxG+/FuL33wpx6tQpFJ05hfMl5+BwtKxjbo/QOIQrwvngRS5yBygKiacfgAxKsQwKkQQKkRQKVgalWO69r1gGqVASvFFODMCIWUAAbPvxEyxpdEFZ9Le/QnZNFIThEgjkwe9U2xaGWgv+/ewP3ndmaOEcLJzDAdv587CeOgXrqVOwnDoF66nTsF+44H2rBz5jBqLEBEj794ekX39I+rsXcWICGOGl5jV3XzA99NVVDRZ3PyhDdRVqNCWIscdjdFQaBIwALs6Fn6u+hIb7A4rwCEiVSkiVIZDKlVBIVZCLVJCxSoghhdglBusQQWBlADMHzuCAy9jyTuF6pwkl9ipcNFfgvEGD87WlOFddgnPlF3Cu9AJs9uA1wfgjEokQFR6FqLAIRKkiEKWKRKQiHJGKMETIwxApUSFSqkK4KBQRohCEcHLAHng/t4ZaFWx0MWyUFKIoOQRKEdiGwY9SDEGIO42RsJ028vHtt9/Ggw8+CKfTCZZl8cYbbwR12goa5t/A5MmTsXfvXr/bTp8+jRMnTmDWrFn47bffOrZg5IrkdLhg1ttg0tmgqzHh9KkzOHniBE4XncYf54pwvuQPXCwrhs7U9K9viVCK+LB49I5MRN+IBPRQhGP57pe9OnuyjACfzF/f6i9ph8sOJ+eAS+CERWiCQCIEKxNBpJBBHCIHK3P/MmTELBiJAIyIda/XP2fELAQSFoxY4N5HzEIgFgBCARiGgUNrxV05TkzqPfbSBUUVA8WYHhCqJK0qc3tThksx+Z6B3rP4zh/oFRxxHAdHRQUfCFlPnYLl9GnYis40ObsxGxkJSf9+7mDIsyQnQyCXX7ZMDMNAFhIKWUgoYpL6+GzXV1fhrYyFKDOfhVIUBoO9DhbOiEWvbkRIZFTA7wHndMGpt8Ops8Kls8Gpt8Gpq1/0Nrh0Vjh1NrhMDoSwcgxkEzFQmgiEA0i4lI+Lc6FcX4Vz2lJc0Jfhgqkc5/XuIOp06R+oM/pOhChiRYgOj3TX5ijDEFHf8T5CqkKEWIVwUYg76FG4+6GFiBUtu4hzAGwAcCk4YkQCMFIhBDIWAqnQ/VzKQiDzPPfexjmcqNl6Aj1CYy79zTFA7OMjwYY2+Dy3oc6hTdUVfg526qyoeKXAu7mZAaIXDeuyf4MA8MADDyAtLQ1FRUXo27dvp0182ukB0r59+7Bu3TocPnwYGo0GH3/8MWbPnu21T15eHtatW4eysjIMHz4cr7zyCsaOHRuU8z/55JNYt24dfvjhh6DkR7qPQCYwdDpcMOlsfODjWcw6G0x6G6rKq3HmbBGKL5xBSUUxyusuoFx7AZXaEjhdTTePRCqj0Ss8AX2jeqF/ZCIGRiSib2QieoRE+zSHyIVin9oYqciMC4ajMDutsLlscLjscHA2ODh7fQBkh8Nlg0AihCIyHKGx0QhL6ImIpERExPdFaEwMBILWV483R6iSIPzWfsBHcF9QGCD81n5d+osZAOI0P+DaA/8HszQSMks1IvvehtoLPb2CIZdW6/dYRiaDpF8/dzDUrx8fDAkjI9utvCGRUbhh8aP4+q1XYbbowQgEuGHRI60KjgCAYQUQhkkgDGv+34mzu9zBk94GpydoahBIOXVWxMnE6BEag/GNjtXoKjB+w1yv5lcBI8D3i99DXGhsCwoJMBL/wY17veHzS/vx26TCVjXfcrc6UfvRac/MBAi/tR9EsYqA8+korFKM8Fv7+ZS5q/8NAkB8fHynzwjf6QGS0WjE8OHDcf/99+PWW33v8p2fn4+srCxs2LAB48aNQ25uLtLS0nDy5EnExLij+JSUFL9t9F999RXi4pqelO6TTz5B//790b9/fwqQrjINJzAUCMMxbOo1iIpXegU9Ju2lgMhqcsDlcqJaX44K7QWU1Z1HRd0FdyBUdwF6c9O1QWKhGIlRPdE7MgH9IhPRL7wXBoQloU9EAhRi3xoEB2eH3l4JvaUSemsldPZqmF1W3Dnsbq/amNiQKHx2YQPMzvoZDDkOcpsdSosdCqsdEVYbFBY7lFYbxE7vZgWbRIIKpRJVCgUESgVYhRICpWdRgFUqIVC4bxvgleZJr19nZLJmf8ErxqjBhtlhOXER0oHxkPZr22zJnNMJzmoFZ7PBZbOBs9nB2dzrnsVl9az722bzWuds1vp8bOCsNjh1OpgOHIAUgNRSAwCoeest34IIBBAnJdUHQJdqhkTx8Z1yc8+hU6chafhI1JWVIkwd1+rgKBCMSMD3GWuOy+aEq2EtlM4G6YUorDn7pE/A32fsQAhj5JeCGVl94CMV1tfs1Ac3YhZMgB2eg0ExRg1J/3A4qswQRsm6RaDRHcvcVXSpPkgMw/jUII0bNw5jxozBq6++CsA9S2xCQgIeffRRLFmypMV57927F6+++qpXH6Ts7Gy8++67YFkWBoMBdrsdf/vb37B06VKf461Wq9ckXDqdDgkJCdQHqYuzW53QVpqhrTRBW2GGtsqMmhIjLhb+D1XVn/MjaCLDxkMg7AEODpitOlRoy1CuLUeFthwVuipUaKtQqa+D09X08PVwuRKJYTHoHRGPAZHJuCZ6AAZE9UFcaIzfzrEmhx46ezX0tmro7NXQ2Wugt1fD7PTf+bS3cphPPxNhmA7x6niEsiIonBwYswlOgwEuo3uGW8/iNBrdM962YiRPswQCPohilYr64MkTSMnh0GhgPPAjPO1VimvHQ9SrFx+Q+AYq9vptjQKb+kd00k2ipUOGQD52LB8MiZOTIZDQhaa1HForynIOQqOt8Gp+VS8ZSxdw0u6uiD5INpsNhw8fRnZ2Np8mEAiQmpqKAwcOtDn/1atXY/Xq1QCAzZs347fffvMbHHn2fe6559p8ThJ8FqMduiqzOwCqNNUHRGbUamph0laAc9WBc9bB5Xl0VGN/0Ul88svvfNN8n6gCMAxQoTdCb2l6NlqhgEVPVQR6hfdAcmQvXBPVD9dEDUByZCJCJL5V7S7OCROng4nTweyog9lSCbOuFJbqc4DNBNbF1U9gxyGKcyFOroQ0IQGypCTIk/tCMaA/pFHRsJpNyF/2jHc/E5cBi9ZuCqi2gHM44KoPlpwGI1zGBkGUwQCXwXhpu7F+3RNoGT3HuNM8MyK79Hq49HpcdqAux8H4wwHgh7b/7QIAGAaMRAJGLAYjFkNQ/8gvEgkYsajBNonXdoGk4f7ubS6zCZUv/Z93fw6BAPGvvtLl7hXWnXXX5ldydenSAVJVVRWcTidiY73bpGNjY3HihO8NJZuSmpqKo0ePwmg0Ij4+Htu3b8e1114bUFmys7ORlZXFr3tqkIhbe950kuM4mPV275qgSjPqKkyoK6+C1VANq7UCOtNF6E0V7sVcA6PV6DVLs7F+Aji9xQqny7vi9I+qGq/1yNAw9I7uieSoRPSNSEJ/VRL6qnqhZ2gsWH99diQCCKOkEMbIwUqdcOlKYb94EtbCn8H8/htkJhNkjQ4RqFSQDR4M6dChkA0dAunQoRDFNt3/YtqDmfj6zfp+JowANyx+NOCmFEYoBKtSgVWp2nQ7KI7jwJnNDYIqTxBl5NMsx49D+5//+BwbOns2JL171wcmIggkEp9AhRGL3EGNxDuoaRgIQShsl1E2wvBwaJYucweAAgF6rHiOgqN2QE0/pKvr0gFSsHzzzTeX3Sc9Pb3Z7Z67aufl5SEvLw/OTqrq74rqPvzQ54ISdvvtAeXBuTgY6qzQ1df+/P/27j6s6ev+G/g7CSQhPIXHEERQxKooaEVBqq225ara/vq4bq51k2pnZ4f3z1121rpes63bPW1trVvH1N6rtWv91W731N5brauiVK34REVFlALiI4+KAcJTSPK5/0AyAyhV0STwfl1XLsj5nnxzPh6S78fv95zvqbpwGedOleHc2TKUnz8NU+0F1DdVob7pIuqbLsPcXAdzcwPMLc0wN1tu6c7N7eben47JMeMRq49CgMavcwUFoNJr4BWmg3eYT9tYCbUFrRWn0PLdMTQfzUddfj5slzuPR1L4+EAbHw+fESMcCZF3dPQNHeBdMc7kWhQKBRQ6XdssrGtMomutqEDtpk1X1vS6QqlE+C/nuXXCoX/6afhOmADLmbNQx0S7dVs9nVeghokRuS23TpBCQ0OhUqlQWem8WnJlZSUiXPSllZGRgYyMDMc1zL6utaIC5YsX44xoUaTQYrA0A79ZDLFaoY6JgTIgAKrAQNi0WlSbG3DmVBnOlFzA+dPluHC+HJUVVaiqrkJNTQXqG2tQ32yCubkeLTdx/xRvLy8E6/UIDQmBISICxn79YAg1INgnECHegQhS+kNv08Fy0Ywn3p/T6QaGM4Y+2na630vZlgCF+bQlQ+FtP5UaK1q+O4GmYzkwf3UUTcfyYa2o6KIh3tDedRe0CSPgk5AA7YgEaAbFOt3b5mb5h4S6NDG6Ed4RETAuecMjz8Z4R0R4RDuJ6PZx6wRJrVYjKSkJWVlZjoHbdrsdWVlZmDt3rmsbR7A3NaHqnXfwvlWPPxTtc9wWf4Q+EkEZL6HGZkeN1YJaSxMaW5tueP8qpQK+GjX8NBro/f0QEhyMsPBwGI2RiIyORvTAWAwYfBcijEaE+uihaVTCVt2M1qpGWKsa0VrVCHv7XZGvvvedHnhzcucZNEN+lAxdYhhUeg2kpRnNJ06iOf8gzF/lo/nYMVhOn+7cSIUC6kGx8BmR4EiINEOHQqlW33C8vRHPxhCRp3J5gmQ2m1FcXOx4Xlpairy8PAQHByM6Ohrz589Heno6xowZg+TkZKxcuRINDQ2YOXOmS9rLS2xt40/qv9qGyjeXYVNpBVaePuG0Pd9U1uXrlIr2hKft4avRwE975blajRCVCmEKJcIVCkQIEG6zw9dihY/FCqVCAaXaF15ewVDZw6GsCYGySQ0UmQBYYZZyXGvhAVWgGl7hOniH69oui+m88GOI8w0MA8LQem4/qrOOoOlYPlqKirqcMeUdFdWWCF1JiLTxw6Hyc9/7oLgDno0hIk/k8mn+2dnZuP/++zuVp6enY926dQCAP/3pT44bRY4aNQp//OMfkZKScodb6qyvLjXScuoUKn73v3Hy8Gm8XVOL7Wdzu6x37+ABGBgWDF+NGv5XFnv09/VFUGgYAgIC4a/zQ4BaC1+FCr52QNPSAtTVw1ZXB1udGfZmBcSmA5QBUPqEQelvhNIvAgqvrs/MiNghDdWw1ZfDfvXDXAHYLFD6+0MVEABVQACg1cB2SQfNyJ9AoVRB7Da0HPkErWe+cdqnKizU6cyQdsQIeAUF9fi/KRER3Tlci+02ufoM0nfffddnEiSbuQHlme/j+PZibGy049PDG1DfZOqyrkKhwB//1xyMSh0HvcEIfYQR+ohI+OqDnAYl2y02WKubHJfDHD8vNQP2a/xZKgGlTqDUtEKhbITYa4GWS7CZq2CvM8FWVwt7bd2VRKsO0nTtS3sKrR5Kv3DYzVWQZhO0w+PhO36CIyHyMhhcthYRERHdHkyQbrO+cgbJbrej6ON/I39rIY5LID79JhMnz7edNTIE+OHppARU1Zvxj9x82EWgVCjwgzGJ+ODL7Y7BxPYmq3MCVNWI1uom2C43O68RdBWFWgWvcB/HZbH2n15BWihU3z9pEYvFkSzZamthr6uD5exZVP5+aad73cTtyOKlICKiXq5X3CiSXKehtgX5/zyGgl3nUSc+yDqVj625H6PVZoGXUom0+DikJcRj3BNPI7ghFL86WIczpnLE6CMRclcIrHtMqK4qQ2tVE+z1156RptR5OSVA7T9VgeoeOXujUKvhFRoKr1DnmV9KHx+PnF1FRER3Bs8g3aTeeAbJbhecPX4JBV+fxen8GgiUKKnIx4av30a56RwAYHB4CJ4ak4D7H30C9/xoOrxNXrj4/rFu960KUMPLoIN32NWJkA9Ufq6b7dVaUcHZVUREfQzPIN0mvXEWW92lJpzYW44Te8vRcLltmY3GlgZs2fUOsk/tBgD4atR4bNQwPPlf/4X7np2JgGY9zJvKUFtk6nKf2pGh8BkcDG+DDl5hPlBq3e9PjbOriIjoWngG6SZ5+hkkm9WO00cvomBPGc6eqHGMBVJZ6lF8+EOsPbEVl68szps8MAozpj6ER2a8iJBmA8z7ymG7fO31yqAAF50kIiK3xDNI1CVTZSMK9pTh5L5yNNX/5+6JQZcLoSj9N/5Q9DX2m0wAgHB/X0yfeA+en/UrRLRGo+mfl1BrPQ2gbeyQbkwE/MYZ0VJiwuWNRW1JFhedJCKiXoAJ0g3yxEtsVosNJYerUbCnDGVXXRLTqu2IOLcboaVZ+KSyGO9XX4TFZoNKqcTkhGF47fnFiEYcrPsb0IRqAIB3Pz/4pRqhGxkGhXfboq1ewVx0koiIehdeYrtJnnCJ7eL5ehTsKcd3ByrQ0mgFACgUQFS0GuH5/w/+336B3OZGLK65hDN19QCAuwzheHP6rzE2cCyk8UoSqFJAlxAK33sioe7vz3sDERGRx+Iltj7K0mxF0cFKFOwpQ9WZeke5f7AWQ0YHIfTwRlj+uh6XbVYsbDRjy4VyCAA/jRavPPQzzIj/IRRQQBptUAWo4ZtihG9yBFT+XFuMiIj6DiZIvYCIoLK0DgV7ylCUWwVrS9uZH6VKgYEjwzDsHgP8j2Xh4vL5aDaZ8JnNgj9cKENdc9tA6ydHPIjX75+HYJ0eAKCJDYRvaiR84kNu6KaMREREvQUTJA/W3NCKwn0VKPimDDVlDY5yvUGH+AmRGJISAZQcR+XiOagsKMBxlQJL6mpwrKJtPNHAoCi8OWUBUqPvhkKthG60AX6pRngbuPgqERH1bUyQbpCrB2mLXXChyISCPWU4dbgaNqsdAODlrcSgpHDET4iEcVAgbDU1qFr2Bmo3bkSttwp/UFixsfA0LDYr1CpvzB33E/xi3HT4GgPhN84IXZLBLe9VRERE5AocpH2T7vQg7YbaFpzMKUfBN+Woq/7PAqyh/f0QPz4SdyUboNF5Q6xWXP6fT1H93ntobmzAV35+WFV8BqU1lQCAcf1HYemUlzBiwmj4pRqhidNz0DUREfUZHKTtocyXm2GqaoI+3Ae6QE3b0h97ynD62CXIlRXuvbUq3JUcgfjxRoTH/KdzGw8eRMVvf4fGou9wqt8QfNRswqYDuyAQ6LUB+M3kuZj18+fhNy4SXkFaV4VIRETk9pgguZGCb8qQ/clJxyLzGp2XY3o+AETEBiJ+ghFxSQZ4a1SO8taqKlQtfxu1X3wJc9x47I6NxVu7PkaV+RIA4Aejp+DtN99GzMRhUHgr72hMREREnogJkpswX252So4AoKXRCo2PF4beY8Sw8UaERPo5vUZaW1Hz8Se49Jf/QWv/VNRMWIA3dqxGVkkOAGBAWBRW/SETU5557E6GQkRE5PGYILkJU1UTuhoN9tDs4YiOD+lUbs7JQdXK9bDrhsF7/Cv4OHcj3tm0HE2tzfBSeWHBL+dj8e/egFbLS2lEREQ3ignSDbpds9j04T5QKOCUJCmUQLDRecp9y+nzqP7TZtiaDVAPnIa88hN45a8v4nhVEQDgntRU/OWDDzBs2LAebR8REVFfwllsN+l2zGIr+KYM2etPQuxtydGk6UMRPz4SANByzoSav+6C9bIOCi8N6lsa8OauNfjrt5+3DcIODMTb77yDmTNnQqnkOCMiIqKucBabB4ofH4moKD/UldYiYGAg/KP80HisGrVfnoStBgCCAJXgHwX/wm+zVuFSY9tSIj/5yU/wzjvvIDw83KXtJyIi6i2YILmRhoMVqNtYBAhQB6BerYBY2k7w2cWO3Mp9+G3Wahw+fxoAMGjQIKxevRppaWmuazQREVEvxATJTVhrW3D5H98B+M9NG8UisLQ24GT9t1h76P/in8eOwmK1wdvbGy+//DJeffVV+Pj4uK7RREREvRQTJDfR8t0FXJ0ctVtfuBbv7/0K5y/XAgDGjx+PNWvWYPjw4Xe4hURERH0HEyQ3UV9RAhE1KuovovTyeYT7huDjvM1Y9+1G2EWg1+uxfPlyzJo1i4OwiYiIbjMmSG6iUe+Nt/e+hTXfbIVd7E7bnn32WaxYsQIGg8FFrSMiIupbeCriBmVmZiI+Ph5jx47t0f1a9MFYvWdLp+To/6xehfXr1zM5IiIiuoOYIN2gjIwMFBQU4ODBgz263/KLl9DVDanihgzt0fchIiKi7jFBchODBw/uNLZIpVIhLi7ORS0iIiLqu5gguYmoqCi8//77UKlUANqSozVr1iAqKsrFLSMiIup7uNTITbodS40AwPnz51FcXIy4uDgmR0RERD2MS414qKioKCZGRERELsZLbEREREQdMEEiIiIi6qBPJEhPPvkkgoKC8PTTT3faNmDAACQmJmLUqFG4//77XdA6IiIicjd9YgzSvHnzMGvWLHz00Uddbt+7dy/8/PzucKuIiIjIXfWJM0iTJk2Cv7+/q5tBREREHsLlCdKuXbvw6KOPIjIyEgqFAps3b+5UJzMzEwMGDIBWq0VKSgoOHDjQY++vUCgwceJEjB07FuvXr++x/RIREZHncvkltoaGBowcORKzZs3CU0891Wn7Z599hvnz52P16tVISUnBypUrMXnyZBQWFiI8PBwAMGrUKFit1k6v/eqrrxAZGXnd99+zZw/69euH8vJypKWlISEhAYmJiT0THBEREXkklydIU6dOxdSpU6+5fcWKFZg9ezZmzpwJAFi9ejW++OILrF27Fq+88goAIC8v76bfv1+/fgAAo9GIhx9+GN9++22XCVJLSwtaWlocz+vq6m76PYmIiMi9ufwS2/VYLBbk5uYiLS3NUaZUKpGWloacnJxb3n9DQwPq6+sBAGazGTt27MDw4cO7rLt06VIEBgY6Hv3797/l9yciIiL35NYJ0sWLF2Gz2WAwGJzKDQYDKioqvvd+0tLS8MMf/hBbtmxBVFSUI7mqrKzEhAkTMHLkSIwbNw4zZszA2LFju9zHokWLUFtb63icO3fu5gMjIiIit+byS2x3wvbt27ssj42NxZEjR77XPjQaDTQaDTIzM5GZmQmbzdaTTSQiIiI34tYJUmhoKFQqFSorK53KKysrERER4ZI2ZWRkICMjA7W1tdDr9RyLRERE5EHaj9sict16bp0gqdVqJCUlISsrC0888QQAwG63IysrC3PnznVp29rHLnEsEhERkeepr69HYGDgNbe7PEEym80oLi52PC8tLUVeXh6Cg4MRHR2N+fPnIz09HWPGjEFycjJWrlyJhoYGx6w2V4mMjMS5c+fg7+8PhUJxy/urq6tD//79ce7cOQQEBPRAC90PY/R8vT0+oPfH2NvjAxhjb3A74xMR1NfXd3sbIJcnSIcOHXJaA23+/PkAgPT0dKxbtw7Tpk1DdXU1Fi9ejIqKCowaNQpbt27tNHD7TlMqlYiKiurx/QYEBPTKP/arMUbP19vjA3p/jL09PoAx9ga3K77rnTlq5/IEadKkSd1eB5w7d67LL6kRERFR3+HW0/yJiIiIXIEJkpvQaDR47bXXoNFoXN2U24Yxer7eHh/Q+2Ps7fEBjLE3cIf4FNLd9S0iIiKiPoZnkIiIiIg6YIJERERE1AETJCIiIqIOmCARERERdcAEyU1kZmZiwIAB0Gq1SElJwYEDB1zdpO9l6dKlGDt2LPz9/REeHo4nnngChYWFTnUmTZoEhULh9JgzZ45TnbNnz+KRRx6BTqdDeHg4FixYAKvVeidD6dLrr7/eqe1Dhw51bG9ubkZGRgZCQkLg5+eHH/zgB53WDnTX2NoNGDCgU4wKhQIZGRkAPLP/du3ahUcffRSRkZFQKBTYvHmz03YRweLFi2E0GuHj44O0tDQUFRU51ampqcH06dMREBAAvV6P559/Hmaz2anO0aNHce+990Kr1aJ///546623bndoAK4fX2trKxYuXIiEhAT4+voiMjISM2bMQFlZmdM+uur3ZcuWOdVxVXxA93343HPPdWr/lClTnOq4cx8C3cfY1edSoVBg+fLljjru3I/f5/jQU9+h2dnZGD16NDQaDeLi4rBu3bpbD0DI5TZs2CBqtVrWrl0rx48fl9mzZ4ter5fKykpXN61bkydPlg8//FDy8/MlLy9PHn74YYmOjhaz2eyoM3HiRJk9e7aUl5c7HrW1tY7tVqtVRowYIWlpaXL48GHZsmWLhIaGyqJFi1wRkpPXXntNhg8f7tT26upqx/Y5c+ZI//79JSsrSw4dOiTjxo2Te+65x7HdnWNrV1VV5RTftm3bBIDs3LlTRDyz/7Zs2SKvvvqqbNy4UQDIpk2bnLYvW7ZMAgMDZfPmzXLkyBF57LHHZODAgdLU1OSoM2XKFBk5cqTs27dPdu/eLXFxcfLMM884ttfW1orBYJDp06dLfn6+fPrpp+Lj4yNr1qxxaXwmk0nS0tLks88+k5MnT0pOTo4kJydLUlKS0z5iYmJkyZIlTv169efWlfF1F6OISHp6ukyZMsWp/TU1NU513LkPRbqP8erYysvLZe3ataJQKKSkpMRRx5378fscH3riO/TUqVOi0+lk/vz5UlBQIO+9956oVCrZunXrLbWfCZIbSE5OloyMDMdzm80mkZGRsnTpUhe26uZUVVUJAPn6668dZRMnTpR58+Zd8zVbtmwRpVIpFRUVjrJVq1ZJQECAtLS03M7mduu1116TkSNHdrnNZDKJt7e3/P3vf3eUnThxQgBITk6OiLh3bNcyb948GTRokNjtdhHx7P4TkU4HHrvdLhEREbJ8+XJHmclkEo1GI59++qmIiBQUFAgAOXjwoKPOl19+KQqFQi5cuCAiIn/+858lKCjIKcaFCxfKkCFDbnNEzro6sHZ04MABASBnzpxxlMXExMi77757zde4S3wiXceYnp4ujz/++DVf40l9KPL9+vHxxx+XBx54wKnMk/qx4/Ghp75DX375ZRk+fLjTe02bNk0mT558S+3lJTYXs1gsyM3NRVpamqNMqVQiLS0NOTk5LmzZzamtrQUABAcHO5WvX78eoaGhGDFiBBYtWoTGxkbHtpycHCQkJDitrzd58mTU1dXh+PHjd6bh11FUVITIyEjExsZi+vTpOHv2LAAgNzcXra2tTn03dOhQREdHO/rO3WPryGKx4JNPPsGsWbOcFmH25P7rqLS0FBUVFU79FhgYiJSUFKd+0+v1GDNmjKNOWloalEol9u/f76hz3333Qa1WO+pMnjwZhYWFuHz58h2K5vupra2FQqGAXq93Kl+2bBlCQkJw9913Y/ny5U6XLTwhvuzsbISHh2PIkCF48cUXcenSJce23taHlZWV+OKLL/D888932uYp/djx+NBT36E5OTlO+2ivc6vHUJevxdbXXbx4ETabrdPiuwaDASdPnnRRq26O3W7HL3/5S4wfPx4jRoxwlD/77LOIiYlBZGQkjh49ioULF6KwsBAbN24EAFRUVHQZf/s2V0pJScG6deswZMgQlJeX44033sC9996L/Px8VFRUQK1WdzroGAwGR7vdObaubN68GSaTCc8995yjzJP7ryvtbeqqzVf3W3h4uNN2Ly8vBAcHO9UZOHBgp320bwsKCrot7b9Rzc3NWLhwIZ555hmnRT//+7//G6NHj0ZwcDD27t2LRYsWoby8HCtWrADg/vFNmTIFTz31FAYOHIiSkhL8+te/xtSpU5GTkwOVStWr+hAAPvroI/j7++Opp55yKveUfuzq+NBT36HXqlNXV4empib4+PjcVJuZIFGPycjIQH5+Pvbs2eNU/sILLzh+T0hIgNFoxIMPPoiSkhIMGjToTjfzhkydOtXxe2JiIlJSUhATE4O//e1vN/2hc2cffPABpk6disjISEeZJ/dfX9fa2oof/ehHEBGsWrXKadv8+fMdvycmJkKtVuPnP/85li5d6hHLV/z4xz92/J6QkIDExEQMGjQI2dnZePDBB13Ysttj7dq1mD59OrRarVO5p/TjtY4P7oyX2FwsNDQUKpWq06j9yspKREREuKhVN27u3Ln417/+hZ07dyIqKuq6dVNSUgAAxcXFAICIiIgu42/f5k70ej3uuusuFBcXIyIiAhaLBSaTyanO1X3nSbGdOXMG27dvx89+9rPr1vPk/gP+06brfeYiIiJQVVXltN1qtaKmpsZj+rY9OTpz5gy2bdvmdPaoKykpKbBarTh9+jQA94+vo9jYWISGhjr9XXp6H7bbvXs3CgsLu/1sAu7Zj9c6PvTUd+i16gQEBNzSf2SZILmYWq1GUlISsrKyHGV2ux1ZWVlITU11Ycu+HxHB3LlzsWnTJuzYsaPTqdyu5OXlAQCMRiMAIDU1FceOHXP6Mmv/Qo+Pj78t7b5ZZrMZJSUlMBqNSEpKgre3t1PfFRYW4uzZs46+86TYPvzwQ4SHh+ORRx65bj1P7j8AGDhwICIiIpz6ra6uDvv373fqN5PJhNzcXEedHTt2wG63OxLE1NRU7Nq1C62trY4627Ztw5AhQ1x+aaY9OSoqKsL27dsREhLS7Wvy8vKgVCodl6XcOb6unD9/HpcuXXL6u/TkPrzaBx98gKSkJIwcObLbuu7Uj90dH3rqOzQ1NdVpH+11bvkYektDvKlHbNiwQTQajaxbt04KCgrkhRdeEL1e7zRq3129+OKLEhgYKNnZ2U7TTBsbG0VEpLi4WJYsWSKHDh2S0tJS+fzzzyU2Nlbuu+8+xz7ap3E+9NBDkpeXJ1u3bpWwsDC3mAr/0ksvSXZ2tpSWlso333wjaWlpEhoaKlVVVSLSNkU1OjpaduzYIYcOHZLU1FRJTU11vN6dY7uazWaT6OhoWbhwoVO5p/ZffX29HD58WA4fPiwAZMWKFXL48GHHLK5ly5aJXq+Xzz//XI4ePSqPP/54l9P87777btm/f7/s2bNHBg8e7DRF3GQyicFgkJ/+9KeSn58vGzZsEJ1Od0emT18vPovFIo899phERUVJXl6e0+eyfdbP3r175d1335W8vDwpKSmRTz75RMLCwmTGjBluEV93MdbX18uvfvUrycnJkdLSUtm+fbuMHj1aBg8eLM3NzY59uHMfdhdju9raWtHpdLJq1apOr3f3fuzu+CDSM9+h7dP8FyxYICdOnJDMzExO8+9N3nvvPYmOjha1Wi3Jycmyb98+VzfpewHQ5ePDDz8UEZGzZ8/KfffdJ8HBwaLRaCQuLk4WLFjgdB8dEZHTp0/L1KlTxcfHR0JDQ+Wll16S1tZWF0TkbNq0aWI0GkWtVku/fv1k2rRpUlxc7Nje1NQkv/jFLyQoKEh0Op08+eSTUl5e7rQPd43tav/+978FgBQWFjqVe2r/7dy5s8u/y/T0dBFpm+r/m9/8RgwGg2g0GnnwwQc7xX7p0iV55plnxM/PTwICAmTmzJlSX1/vVOfIkSMyYcIE0Wg00q9fP1m2bJnL4ystLb3m57L93la5ubmSkpIigYGBotVqZdiwYfL73//eKblwZXzdxdjY2CgPPfSQhIWFibe3t8TExMjs2bM7/afSnfuwuxjbrVmzRnx8fMRkMnV6vbv3Y3fHB5Ge+w7duXOnjBo1StRqtcTGxjq9x81SXAmCiIiIiK7gGCQiIiKiDpggEREREXXABImIiIioAyZIRERERB0wQSIiIiLqgAkSERERUQdMkIiIiIg6YIJERERE1AETJCIiIqIOmCARERERdeDl6gYQEbmLSZMmITExEVqtFn/5y1+gVqsxZ84cvP76665uGhHdYTyDRER0lY8++gi+vr7Yv38/3nrrLSxZsgTbtm1zdbOI6A7jYrVERFdMmjQJNpsNu3fvdpQlJyfjgQcewLJly1zYMiK603gGiYjoKomJiU7PjUYjqqqqXNQaInIVJkhERFfx9vZ2eq5QKGC3213UGiJyFSZIRERERB0wQSIiIiLqgAkSERERUQecxUZERETUAc8gEREREXXABImIiIioAyZIRERERB0wQSIiIiLqgAkSERERUQdMkIiIiIg6YIJERERE1AETJCIiIqIOmCARERERdcAEiYiIiKgDJkhEREREHTBBIiIiIurg/wNggjIU4qI2WQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = np.linspace(10,2000,m).astype(int)\n", + "\n", + "fig,ax = plt.subplots(1)\n", + "ax.plot(n,errors9,\".-\",label='N1[9]')\n", + "ax.plot(n,errors19,\".-\",label='N1[19]')\n", + "ax.plot(n,errors29,\".-\",label='N1[29]')\n", + "ax.plot(n,errors39,\".-\",label='N1[39]')\n", + "ax.plot(n,errors49,\".-\",label='N1[49]')\n", + "ax.plot(n,errors59,\".-\",label='N1[59]')\n", + "ax.plot(n,errors69,\".-\",label='N1[69]')\n", + "ax.plot(n,errors79,\".-\",label='N1[79]',color='k')\n", + "\n", + "ax.set_yscale('log')\n", + "ax.legend()\n", + "ax.set(xlabel='n',ylabel='Error',\n", + " title='Dense Relative Error by Matrix Size (nxn)')" + ] + }, + { + "cell_type": "markdown", + "id": "ccb56801-16a1-4c0c-9be9-549f144308c8", + "metadata": {}, + "source": [ + "__Comparing the relative error by matrix size and $N_1$ values for the sparse solver__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86069aaf-56a6-468c-90b9-004c6de51127", + "metadata": {}, + "outputs": [], + "source": [ + "def mat_err_sparse(n, N1, N2):\n", + " #Forming the matrix T and vector u\n", + " k=5\n", + " u = np.random.randn(n,1)\n", + "\n", + " A = randmat(n,k)\n", + " D = A@np.ones(n)\n", + " D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "\n", + " L_norm = identity(n,format='csr') - D@A@D\n", + " T = identity(n, format='csr') - 0.5*L_norm\n", + "\n", + " #Computing the approximation and error\n", + " a,b,p = coeffs(N1,N2,-16)\n", + " approx = matrix_rat_sparse(a,b,p,T,u)\n", + " exact = scipy.linalg.sqrtm(T.toarray()) @ u\n", + " \n", + " error = (np.linalg.norm(approx-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + " return (error)\n", + "\n", + "def full_errs_sparse(j,m):\n", + " n = np.linspace(10,2000,m).astype(int)\n", + "\n", + " n1 = N1[j]\n", + " n2 = N2[j]\n", + "\n", + " errors = np.zeros(m)\n", + " for i in range(m):\n", + " errors[i] = mat_err_sparse(n[i],n1,n2)\n", + "\n", + " return (errors)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2b03ab0-1d92-41f3-a87a-f37af97e7959", + "metadata": {}, + "outputs": [], + "source": [ + "m = 11\n", + "\n", + "sp_errors9 = full_errs_sparse(9,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1c045fd-e663-4c31-91f9-0a87fa42bb82", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors19 = full_errs_sparse(19,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4896f88-1277-4a74-8b69-8f503f30ec2f", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors29 = full_errs_sparse(29,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b2a408f-3e98-4694-a419-9d5692758050", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors39 = full_errs_sparse(39,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ce0cf77-695a-4f51-8fd1-443234c6613e", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors49 = full_errs_sparse(49,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "296066f6-65ea-429f-bc4b-d46326c591be", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors59 = full_errs_sparse(59,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a73a026-ec64-4bf9-8ff4-3abe12f9cea0", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors69 = full_errs_sparse(69,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a32eb106-f37e-483a-9920-339f13c677d9", + "metadata": {}, + "outputs": [], + "source": [ + "sp_errors79 = full_errs_sparse(79,m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1419ba85-12b5-4136-b1fb-0faaed89bc6d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Text(0.5, 0, 'n'),\n", + " Text(0, 0.5, 'Error'),\n", + " Text(0.5, 1.0, 'Sparse Relative Error by Matrix Size (nxn)')]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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ICMiIrjtttt46KGHyM7OZsGCBdSoUaPQ7sbx48fzxBNPANf3moobD+dwxx13MH/+fAYOHMjdd9/NxYsXiY2NJSIiwm0sS8eOHdmwYQPz588nJCSEhg0bFjpuqzgXL17koYceok+fPkyePBmwD0r++eefmTBhAr/++muR+/rMmTN06dKFvn370q9fP4KDg7l48SKffPIJ+/bt47HHHivy87No0SJ++ukn/v3vf7sNtq5Tpw79+/encePGvPTSS0yfPp0TJ05w55134uvry/Hjx1m9ejWTJk1yvi+FadSoEa1atWLDhg3cd999Hu0Xh0cffZQrV66wYcMGtFotAwcO5IEHHuCll15i+PDhtG3b1uMyc3Nzndd2ExWgck6eE39H33//vXrfffepzZs3V318fFS9Xq9GRESojzzyiHrhwgWXvIAaExOjLl++XG3SpIlqMBjU9u3bu53am5iYqN57771qzZo1VR8fH3XAgAHqX3/9pYaHh7uctpz/VOn8srOz1SeffFJt27at6uvrq5rNZrVt27bqO++841b/P/74Qx05cqRao0YN1WAwqOHh4eqYMWPUjRs3Fvu6HacCz5s3r9DlEyZMULVarXrkyBFVVe2noE+fPl2NiIhQ9Xq9WrNmTbV79+7q66+/7nJJBAqc5l/afaGqqvr++++rjRo1UrVarcsp0wVP83dISUlRTSaTCqjLly8v9HWUtt6FKe40//w/U45Tyy9duuRWRmGnuTscPXpUHTVqlBoQEKAajUa1S5cu6tq1a13yOE4fz3/ZheLkf1/feOMNNTQ0VDUYDGqPHj3Uffv2FbrO+fPnVa1WqzZt2rRU21DVoj+7BRX2+v/73/86vz/NmzdXlyxZUujp+X/99Zfas2dP53vs+LwUt78LljNy5EjV19dXPXHihEs+xynvr776apF1T0lJUf/zn/+oAwYMUOvXr696eXmpvr6+ardu3dT333/f5fIaBU/zd9SjsKngZ3nVqlXqbbfdpprNZtVsNqvNmzdXY2Ji1Pj4+CLr5jB//nzVx8fH5dIJxX23838/HfvgjTfecHvd4eHhatu2bZ3fkV69eqktW7Z0Ky86OloNDw93Sfv+++9VQD18+HCJ9ReeU1S1iKt+CVGJFEUhJibG5UrNQlR3ly9fpm7dusyYMYPnn3++sqsjPJCcnEyjRo147bXXuP/++yu7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0CduX/HDH/4w8nj48OGMGDGCAQMGsGrVKiZPnhzDmp0azz33HDfeeCMWiyVqfV9px0MdH3ozOcUWY0lJSej1+m6j9mtra0lLS4tRrY7d3XffzX//93/z3nvvkZmZediyRUVFAGzbtg2AtLS0HuPv3NabuFwuBg4cyLZt20hLS8Pv9+P1eqPKHNx2fSm2HTt2sGLFCn784x8ftlxfbj/4rk6H+86lpaVRV1cXtT0YDLJv374+07adydGOHTt45513onqPelJUVEQwGOTbb78Fen98XeXn55OUlBT1uezrbdjpgw8+oLy8/IjfTeid7Xio48PJ+g09VBmHw3FC/5GVBCnGTCYTY8aMYeXKlZF14XCYlStXUlxcHMOaHR2lFHfffTd/+9vfePfdd7t15fakrKwMgPT0dACKi4v58ssvo37MOn/QhwwZckrqfbyam5vZvn076enpjBkzBqPRGNV25eXl7Ny5M9J2fSm2559/npSUFC699NLDluvL7QeQl5dHWlpaVLs1NjayZs2aqHbzer2sW7cuUubdd98lHA5HEsTi4mLef/99AoFApMw777zDoEGDYn5qpjM52rp1KytWrCAxMfGIrykrK0On00VOS/Xm+HpSVVXF3r17oz6XfbkND/bss88yZswYRo4cecSyvakdj3R8OFm/ocXFxVH76CxzwsfQExriLU6KV155RZnNZrV06VK1adMmdccddyiXyxU1ar+3uuuuu5TT6VSrVq2Kmmba2tqqlFJq27Ztav78+Wrt2rWqoqJCLV++XOXn56sLLrggso/OaZwXX3yxKisrU2+99ZZKTk7uFVPh7733XrVq1SpVUVGhPvroI1VSUqKSkpJUXV2dUqpjimp2drZ699131dq1a1VxcbEqLi6OvL43x3awUCiksrOz1ezZs6PW99X2a2pqUuvXr1fr169XgHrkkUfU+vXrI7O4Fi5cqFwul1q+fLnasGGDuuKKK3qc5n/22WerNWvWqA8//FAVFhZGTRH3er0qNTVV3XTTTWrjxo3qlVdeUTab7bRMnz5cfH6/X11++eUqMzNTlZWVRX0vO2f9fPzxx+p3v/udKisrU9u3b1cvvviiSk5OVjfffHOviO9IMTY1Nalf/OIXavXq1aqiokKtWLFCjR49WhUWFqr29vbIPnpzGx4pxk4NDQ3KZrOpp556qtvre3s7Hun4oNTJ+Q3tnOZ/3333qa+//lotWbJEpvn3J48//rjKzs5WJpNJjR8/Xn3yySexrtJRAXpcnn/+eaWUUjt37lQXXHCBSkhIUGazWRUUFKj77rsv6jo6Sin17bffqqlTpyqr1aqSkpLUvffeqwKBQAwiinbdddep9PR0ZTKZVEZGhrruuuvUtm3bItvb2trUT3/6U+V2u5XNZlNXXXWVqq6ujtpHb43tYP/7v/+rAFVeXh61vq+233vvvdfj53L69OlKqY6p/r/61a9UamqqMpvNavLkyd1i37t3r7r++uuV3W5XDodD3XrrraqpqSmqzBdffKHOO+88ZTabVUZGhlq4cGHM46uoqDjk97Lz2lbr1q1TRUVFyul0KovFos466yz18MMPRyUXsYzvSDG2traqiy++WCUnJyuj0ahycnLU7bff3u0/lb25DY8UY6c//OEPymq1Kq/X2+31vb0dj3R8UOrk/Ya+9957atSoUcpkMqn8/Pyo9zhe2oEghBBCCCHEATIGSQghhBCiC0mQhBBCCCG6kARJCCGEEKILSZCEEEIIIbqQBEkIIYQQogtJkIQQQgghupAESQghhBCiC0mQhBBCCCG6kARJCCGEEKILSZCEEEIIIbowxLoCQgjRW0yaNIkRI0ZgsVh45plnMJlM3HnnncybNy/WVRNCnGbSgySEEAd54YUXiIuLY82aNSxatIj58+fzzjvvxLpaQojTTG5WK4QQB0yaNIlQKMQHH3wQWTd+/HguuugiFi5cGMOaCSFON+lBEkKIg4wYMSLqeXp6OnV1dTGqjRAiViRBEkKIgxiNxqjnmqYRDodjVBshRKxIgiSEEEII0YUkSEIIIYQQXUiCJIQQQgjRhcxiE0IIIYToQnqQhBBCCCG6kARJCCGEEKILSZCEEEIIIbqQBEkIIYQQogtJkIQQQgghupAESQghhBCiC0mQhBBCCCG6kARJCCGEEKILSZCEEEIIIbqQBEkIIYQQogtJkIQQQgghupAESQghhBCii/8PZ4JU8SXhzxUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = np.linspace(10,2000,m).astype(int)\n", + "\n", + "fig,ax = plt.subplots(1)\n", + "ax.plot(n,sp_errors9,\".-\",label='15 Poles')\n", + "ax.plot(n,sp_errors19,\".-\",label='32 Poles')\n", + "ax.plot(n,sp_errors29,\".-\",label='49 Poles')\n", + "ax.plot(n,sp_errors39,\".-\",label='65 Poles')\n", + "ax.plot(n,sp_errors49,\".-\",label='82 Poles')\n", + "ax.plot(n,sp_errors59,\".-\",label='98 Poles')\n", + "ax.plot(n,sp_errors69,\".-\",label='115 Poles')\n", + "ax.plot(n,sp_errors79,\".-\",label='132 Poles',color='k')\n", + "\n", + "ax.set_yscale('log')\n", + "ax.legend()\n", + "ax.set(xlabel='n',ylabel='Error',\n", + " title='Sparse Relative Error by Matrix Size (nxn)')" + ] + }, + { + "cell_type": "markdown", + "id": "711caef5-cd8a-4f31-97c0-74b5fa158271", + "metadata": {}, + "source": [ + "__Comparing the computation times between the sparse solver and exact root__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8536041a-5590-41b4-8a8c-1a66e56170d9", + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "def timing_approx(N1,N2,n):\n", + " times = np.zeros(len(n))\n", + " \n", + " for i in range(len(n)):\n", + " #make T and u\n", + " k=5\n", + " u = np.random.randn(n[i],1)\n", + " A = randmat(n[i],k)\n", + " D = A@np.ones(n[i])\n", + " D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "\n", + " L_norm = identity(n[i],format='csr') - D@A@D\n", + " T = identity(n[i], format='csr') - 0.5*L_norm\n", + " \n", + " #time it\n", + " start = time.perf_counter()\n", + " a,b,p = coeffs(N1,N2,-16)\n", + " approx = matrix_rat_sparse(a,b,p,T,u)\n", + " end = time.perf_counter()\n", + " times[i] = end-start\n", + "\n", + " return times\n", + "\n", + "def timing_exact(n):\n", + " times = np.zeros(len(n))\n", + "\n", + " for i in range(len(n)):\n", + " #make T and u\n", + " k=5\n", + " u = np.random.randn(n[i],1)\n", + " A = randmat(n[i],k)\n", + " D = A@np.ones(n[i])\n", + " D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "\n", + " L_norm = identity(n[i],format='csr') - D@A@D\n", + " T = identity(n[i], format='csr') - 0.5*L_norm\n", + " \n", + " #time it\n", + " start = time.perf_counter()\n", + " result = scipy.linalg.sqrtm(T.toarray()) @ u\n", + " end = time.perf_counter()\n", + " times[i] = end-start\n", + " \n", + " return times" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2951b140", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting tabulate\n", + " Downloading tabulate-0.9.0-py3-none-any.whl.metadata (34 kB)\n", + "Downloading tabulate-0.9.0-py3-none-any.whl (35 kB)\n", + "Installing collected packages: tabulate\n", + "Successfully installed tabulate-0.9.0\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install tabulate " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ebe1be2-0793-4b00-9e71-2b05a76154f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "╒══════╤════════════════════════════════╤════════════════════════╕\n", + "│ n │ Exact Computation Time (sec) │ Lightning (32 Poles) │\n", + "╞══════╪════════════════════════════════╪════════════════════════╡\n", + "│ 10 │ 0.003169 │ 0.143525 │\n", + "├──────┼────────────────────────────────┼────────────────────────┤\n", + "│ 100 │ 0.010215 │ 0.079882 │\n", + "├──────┼────────────────────────────────┼────────────────────────┤\n", + "│ 1000 │ 1.386967 │ 0.230912 │\n", + "├──────┼────────────────────────────────┼────────────────────────┤\n", + "│ 2000 │ 17.020127 │ 0.586629 │\n", + "╘══════╧════════════════════════════════╧════════════════════════╛\n" + ] + } + ], + "source": [ + "from tabulate import tabulate\n", + "\n", + "n = np.array([10,100,1000,2000])\n", + "\n", + "exact_times = timing_exact(n)\n", + "approx_times = timing_approx(N1[19],N2[19],n)\n", + "\n", + "ns = np.array(['10','100','1000','2000'])\n", + "np.set_printoptions(suppress=True)\n", + "table = np.column_stack((ns,exact_times,approx_times))\n", + "headers = ['n','Exact Computation Time (sec)',\n", + " 'Lightning (32 Poles)']\n", + "\n", + "print(tabulate(table,headers = headers, \n", + " tablefmt='fancy_grid',floatfmt='.6f'))" + ] + }, + { + "cell_type": "markdown", + "id": "4d09d013-e8eb-4b34-8410-7bbb96f981e3", + "metadata": {}, + "source": [ + "__New Method: Minimax__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc28fdc6-002a-4a8e-9737-d07a0e5d9a02", + "metadata": {}, + "outputs": [], + "source": [ + "def minimax(a,p,x):\n", + " total = -a[0] \n", + " for i in range(len(p)):\n", + " total += a[i+1]/(x-p[i]) \n", + "\n", + " return (total)" + ] + }, + { + "cell_type": "markdown", + "id": "4a953064-9c27-43cc-8be0-79ca690a4a29", + "metadata": {}, + "source": [ + "__Loading coefficients and poles from chebfun for n=10 and n=14__\n", + "\n", + "_Similar complexities for lightning are $N_1[6]$ and $N_1[8]$ (10 and 14 poles)_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d118dd2f-1b61-4a24-aba9-401c6c254447", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.io import loadmat\n", + "file_name = 'MinMaxRatN10.mat'\n", + "m_dict = loadmat(file_name)\n", + "a10 = m_dict['a']\n", + "p10 = m_dict['p']\n", + "\n", + "file_name = 'MinMaxRatN14.mat'\n", + "m_dict = loadmat(file_name)\n", + "a14 = m_dict['a']\n", + "p14 = m_dict['p']" + ] + }, + { + "cell_type": "markdown", + "id": "71125bb3-35c1-4f87-b374-a7532b542c54", + "metadata": {}, + "source": [ + "__Evaluating the different methods and comparing errors__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec9e7202-c75f-424d-9cf7-74e4446f9f84", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9l/7llcw8rd1jjgq13k9ckd1sf80000gr/T/ipykernel_12248/2842374665.py:7: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", + " min10_est[i] = minimax(a10,p10,z[i])\n", + "/var/folders/9l/7llcw8rd1jjgq13k9ckd1sf80000gr/T/ipykernel_12248/2842374665.py:8: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n", + " min14_est[i] = minimax(a14,p14,z[i])\n" + ] + } + ], + "source": [ + "j = 100\n", + "z = np.logspace(-16,0,j)\n", + "\n", + "min10_est = np.zeros(j)\n", + "min14_est = np.zeros(j)\n", + "for i in range(j):\n", + " min10_est[i] = minimax(a10,p10,z[i])\n", + " min14_est[i] = minimax(a14,p14,z[i])\n", + "\n", + "a10_o, b10_o, p10_o = coeffs(N1[6],N2[6],-32)\n", + "a14_o, b14_o, p14_o = coeffs(N1[8],N2[8],-32)\n", + "\n", + "app10_est = rat_approx(a10_o,b10_o,p10_o,z)\n", + "app14_est = rat_approx(a14_o,b14_o,p14_o,z)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50e341f9-cca7-4396-bf65-365fa0e6dd8a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "exact = np.sqrt(z)\n", + "\n", + "min10_er = abs(min10_est-exact)\n", + "min14_er = abs(min14_est-exact)\n", + "\n", + "app10_er = abs(app10_est-exact)\n", + "app14_er = abs(app14_est-exact)\n", + "\n", + "fig, ax = plt.subplots(1)\n", + "ax.plot(z,min10_er,color = 'g',label = 'Minimax10')\n", + "ax.plot(z,min14_er,linestyle='dashed',color = 'g',\n", + " label='Minimax14')\n", + "ax.plot(z,app10_er,color = 'r',label='Rational10')\n", + "ax.plot(z,app14_er,linestyle = 'dashed', color = 'r',\n", + " label='Rational14')\n", + "\n", + "ax.set_xscale('log')\n", + "ax.set_yscale('log')\n", + "ax.set(ylabel='Error')\n", + "ax.set(xlabel='x')\n", + "\n", + "ax.set(title = 'Minimax vs Rational Errors')\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "id": "e0574c86-c6e5-47c6-9814-68be59e8a444", + "metadata": {}, + "source": [ + "__Adjusting the minimax function for dense and sparse matrices__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba53470e-6826-46c4-8eda-2b548b457f97", + "metadata": {}, + "outputs": [], + "source": [ + "def minimax_mat(a,p,A,u):\n", + " total = -a[0]*u\n", + " I = np.eye(A.shape[0])\n", + " for i in range(len(p)):\n", + " total += a[i+1]*np.linalg.solve(A-p[i]*I,u)\n", + " return(total)\n", + "\n", + "\n", + "def minimax_mat_sp(a,p,A,u):\n", + " total = -a[0]*u\n", + " I = identity(A.shape[0], format='csr')\n", + " for i in range(len(p)):\n", + " test = scipy.sparse.linalg.spsolve(A-p[i][0]*I,u)\n", + " fix = test.reshape(A.shape[0],1)\n", + " total += a[i+1]*fix\n", + " return(total)" + ] + }, + { + "cell_type": "markdown", + "id": "86c9b1bd-ee74-46fa-bcb8-b026708cc5e9", + "metadata": {}, + "source": [ + "__Initial Tests and Relative Error Comparisons__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28c9e8b2-7661-4051-8a9b-b3225e4e53aa", + "metadata": {}, + "outputs": [], + "source": [ + "#Forming a matrix to test\n", + "n = 200\n", + "k=20\n", + "\n", + "u = np.random.randn(n,1)\n", + "\n", + "A = randmat(n,k)\n", + "D = A@np.ones(n)\n", + "D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "L_norm = identity(n,format='csr') - D@A@D\n", + "T = 0.5*L_norm\n", + "\n", + "exact = scipy.linalg.sqrtm(T.toarray()) @ u" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8352ad0-35b2-4df5-873e-ca38071d5f33", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "╒══════════════╤══════════════════╤══════════════════╤════════════════════╕\n", + "│ Complexity │ Dense Minimax │ Sparse Minimax │ Sparse Lightning │\n", + "╞══════════════╪══════════════════╪══════════════════╪════════════════════╡\n", + "│ 10 │ 0.00000475080555 │ 0.00000475080556 │ 0.00000168862466 │\n", + "├──────────────┼──────────────────┼──────────────────┼────────────────────┤\n", + "│ 14 │ 0.00000028998245 │ 0.00000028998241 │ 0.00000007811952 │\n", + "╘══════════════╧══════════════════╧══════════════════╧════════════════════╛\n" + ] + } + ], + "source": [ + "min10_mat_est = minimax_mat(a10,p10, T.toarray(),u) \n", + "error10 = (np.linalg.norm(min10_mat_est-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "min14_mat_est = minimax_mat(a14,p14,T.toarray(),u)\n", + "error14 = (np.linalg.norm(min14_mat_est-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "sp_min10_mat_est = minimax_mat_sp(a10,p10,T,u)\n", + "sp_error10 = (np.linalg.norm(sp_min10_mat_est-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "sp_min14_mat_est = minimax_mat_sp(a14,p14,T,u)\n", + "sp_error14 = (np.linalg.norm(sp_min14_mat_est-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "a10r,b10r,p10r = coeffs(N1[6],N2[6],-16)\n", + "ratapp10 = matrix_rat_sparse(a10r,b10r,p10r,T,u)\n", + "raterror10 = (np.linalg.norm(ratapp10-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "a14r,b14r,p14r = coeffs(N1[8],N2[8],-16)\n", + "ratapp14 = matrix_rat_sparse(a14r,b14r,p14r,T,u)\n", + "raterror14 = (np.linalg.norm(ratapp14-exact,np.inf)\n", + " /np.linalg.norm(exact,np.inf))\n", + "\n", + "min_dense = np.array([error10,error14]).reshape(2,1)\n", + "min_sparse = np.array([sp_error10,sp_error14]).reshape(2,1)\n", + "rat_sparse = np.array([raterror10,raterror14]).reshape(2,1)\n", + "complexity = np.array(['10','14']).reshape(2,1)\n", + "\n", + "table = np.column_stack((complexity,min_dense,min_sparse,\n", + " rat_sparse))\n", + "headers = ['Complexity','Dense Minimax','Sparse Minimax',\n", + " 'Sparse Lightning']\n", + "\n", + "print(tabulate(table,headers = headers, tablefmt='fancy_grid',\n", + " floatfmt='.14f'))" + ] + }, + { + "cell_type": "markdown", + "id": "7203818f-a166-406e-9764-251bdaee8f5e", + "metadata": {}, + "source": [ + "__Comparing Lightning Approximation to Chebyshev polynomials for $\\sqrt{x}$ on [0,1]__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb910e4e-c063-401d-b0bd-4de8fe7c4bed", + "metadata": {}, + "outputs": [], + "source": [ + "def chebycoeffs(f, n):\n", + " \"\"\"\n", + " Computes the Chebyshev expansion coefficients for a \n", + " function defined on [0,1].\n", + "\n", + " Parameters:\n", + " f : callable\n", + " Function defined on [0,1].\n", + " n : int\n", + " Number of Chebyshev coefficients.\n", + "\n", + " Returns:\n", + " coeffs : ndarray\n", + " Chebyshev coefficients.\n", + " \"\"\"\n", + " m = n - 1\n", + " x = np.sin(np.pi * np.arange(-m, m+1, 2) / (2 * m))\n", + "\n", + " # Map [-1,1] to [0,1]\n", + " fd = f(0.5 * (x + 1))\n", + " #fd = f(2*x-1)\n", + " \n", + " reordered = np.concatenate([fd[n-1:0:-1], fd[:n-1]])\n", + " coeffs = np.fft.ifft(reordered)\n", + "\n", + " result = np.zeros(n, dtype=complex)\n", + " result[0] = coeffs[0]\n", + " result[1:n-1] = 2 * coeffs[1:n-1]\n", + " result[n-1] = coeffs[n-1]\n", + "\n", + " return result.real # Return real part if f is real-valued\n", + "\n", + "#compare with sqrt(x)\n", + "def f(x):\n", + " return np.sqrt(x)\n", + "\n", + "#implement the chebyshev coefficients\n", + "def cheb_approx(x,c):\n", + " return np.polynomial.chebyshev.chebval(2*x-1,c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a307798d-5424-4aa5-af85-15af5f50b13f", + "metadata": {}, + "outputs": [], + "source": [ + "#implementing with n=11 for degree 10\n", + "\n", + "# Coefficients for degree n of Chebyshev coefficients\n", + "n = 11\n", + "\n", + "# Compute the Chebyshev coefficients using the previously \n", + "#defined function\n", + "cheb_coeffs = chebycoeffs(f, n)\n", + "\n", + "#cheb approximation of sqrt(x) on [0,1]\n", + "x = np.linspace(0,1,1000)\n", + "\n", + "cheb = cheb_approx(x,cheb_coeffs)\n", + "abs_er_cheb = abs(cheb-f(x))\n", + "\n", + "a,b,p = coeffs(N1[6],N2[6],-64)\n", + "rat = rat_approx(a,b,p,x)\n", + "abs_er_rat = abs(rat-f(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7225666f-c1ea-49be-b269-e815f8167ad6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHHCAYAAABTMjf2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC5+klEQVR4nOydd3wT9f/HX9ltuveADkaBstqydwsUkI0TUFkqIhZFEcUJfnHgT4aoVEVkiQNwADJEhmzZUFZpKVBKC917pk1yvz8+uYw2aZs0O5/n45HHJZcbn1ySu9e9J4dhGAYUCoVCoVAoDgjX0gOgUCgUCoVCsRRUCFEoFAqFQnFYqBCiUCgUCoXisFAhRKFQKBQKxWGhQohCoVAoFIrDQoUQhUKhUCgUh4UKIQqFQqFQKA4LFUIUCoVCoVAcFiqEKBQKhUKhOCxUCFEodkxcXBzi4uIsPQyjsGnTJnA4HNy7d0/vdWfOnInw8HCjj8na4XA4+PDDDy09DACO+x1QrB8qhCgUK4K92LMPJycndOjQAfPmzUNubq6lh0dpIeHh4Rrfr4uLC/r06YMff/zR4G3u27fPasQOhWKL8C09AAqF0pClS5eiTZs2qKmpwcmTJ/Htt99i3759uH79OsRisaWHZxGmTZuGKVOmQCQSWXooLSI6OhpvvPEGACA7Oxs//PADZsyYAYlEgtmzZ+u9vX379iExMVGrGKqurgafT0/zFEpj0H8IhWKFjB49Gr169QIAvPDCC/Dx8cGqVauwa9cuTJ061cKjsww8Hg88Hs/Sw2gxrVq1wrPPPqt8PXPmTLRt2xZffPGFQUKoMZycnIy6PQrFHqGuMQrFBhg2bBgAID09HQAglUrx0UcfoV27dhCJRAgPD8e7774LiUSicxsVFRVwcXHB/PnzG7yXlZUFHo+HZcuWAVC56E6dOoUFCxbAz88PLi4uePTRR5Gfn99g/W+++QZdunSBSCRCcHAwEhISUFJSorFMXFwcunbtiqtXryI2NhZisRjt27fH77//DgA4duwY+vbtC2dnZ3Ts2BGHDh3SWF9bjNCuXbswduxYBAcHQyQSoV27dvjoo48gk8maPqj1GDduHNq2bav1vf79+yuFKQAcPHgQgwYNgqenJ1xdXdGxY0e8++67eu8TAPz8/NCpUyfcuXNHY/6JEyfw5JNPIjQ0FCKRCCEhIXj99ddRXV2tXGbmzJlITEwEAA2XG4u2GKHLly9j9OjRcHd3h6urK4YPH44zZ85oLKPP92/M74BCsQRUCFEoNgB7kfTx8QFArESLFy9Gjx498MUXXyA2NhbLli3DlClTdG7D1dUVjz76KLZt29bgIvXrr7+CYRg888wzGvNfeeUVXLlyBUuWLMHcuXOxe/duzJs3T2OZDz/8EAkJCQgODsbKlSvx+OOPY+3atRg5ciTq6uo0li0uLsa4cePQt29ffP755xCJRJgyZQq2bduGKVOmYMyYMfjss89QWVmJJ554AuXl5Y0el02bNsHV1RULFizAl19+iZ49e2Lx4sV4++23Gz+gWpg8eTLS09Nx/vx5jfkZGRk4c+aM8tjeuHED48aNg0QiwdKlS7Fy5UpMmDABp06d0nufABG1WVlZ8PLy0pj/22+/oaqqCnPnzsXXX3+NUaNG4euvv8b06dOVy8yZMwcjRowAAGzZskX50MWNGzcwePBgXLlyBW+99RY++OADpKenIy4uDmfPnm2wfHO+f2N+BxSKRWAoFIrVsHHjRgYAc+jQISY/P5/JzMxktm7dyvj4+DDOzs5MVlYWk5SUxABgXnjhBY11Fy5cyABg/v33X+W82NhYJjY2Vvn6n3/+YQAwf//9t8a63bt311iOHUd8fDwjl8uV819//XWGx+MxJSUlDMMwTF5eHiMUCpmRI0cyMplMudyaNWsYAMyGDRs0xgKA+eWXX5TzUlJSGAAMl8tlzpw502CcGzdubDCm9PR05byqqqoGx3DOnDmMWCxmampqlPNmzJjBhIWFNVhWndLSUkYkEjFvvPGGxvzPP/+c4XA4TEZGBsMwDPPFF18wAJj8/PxGt6eNsLAwZuTIkUx+fj6Tn5/PXLt2jZk2bRoDgElISNBYVttnW7ZsmcZYGIZhEhISGF2ncgDMkiVLlK8nTZrECIVC5s6dO8p5Dx8+ZNzc3JghQ4Yo5zX3+9c1TkO/AwrFElCLEIVihcTHx8PPzw8hISGYMmUKXF1dsWPHDrRq1Qr79u0DACxYsEBjHTYAd+/evY1uNzg4GD///LNy3vXr13H16lWNuBWWF198UcPVMnjwYMhkMmRkZAAADh06hNraWrz22mvgclWnk9mzZ8Pd3b3BWFxdXTWsVh07doSnpyciIyPRt29f5Xz2+d27d3V+FgBwdnZWPi8vL0dBQQEGDx6MqqoqpKSkNLpufdzd3TF69Ghs374dDMMo52/btg39+vVDaGgoAMDT0xMAcQnJ5XK99gEABw4cgJ+fH/z8/NCtWzds2bIFs2bNwvLly3V+tsrKShQUFGDAgAFgGAaXL1/We78ymQwHDhzApEmTNFyAQUFBePrpp3Hy5EmUlZVprNPU919/nC39DigUS0CFEIVihSQmJuLgwYM4cuQIkpOTcffuXYwaNQoAcdVwuVy0b99eY53AwEB4enpqXKTqw+Vy8cwzz2Dnzp2oqqoCAPz8889wcnLCk08+2WB59uLPwrpviouLlWMBiKBRRygUom3btg3G0rp1a40LKwB4eHggJCSkwTz1/ejixo0bePTRR+Hh4QF3d3f4+fkpBV1paWmj62pj8uTJyMzMxOnTpwEQl+TFixcxefJkjWUGDhyIF154AQEBAZgyZQq2b9/ebFHUt29fHDx4EPv378eKFSvg6emJ4uJiCIVCjeXu37+PmTNnwtvbG66urvDz80NsbKzBny0/Px9VVVUNvisAiIyMhFwuR2Zmpsb8pr5/wPjfAYVibmjWGIVihfTp00cjOFcb9QVFc5k+fTqWL1+OnTt3YurUqfjll18wbtw4pfhQR1eWlrrFRB90bc+Q/ZSUlCA2Nhbu7u5YunQp2rVrBycnJ1y6dAmLFi0yyFozfvx4iMVibN++HQMGDMD27dvB5XI1RKKzszOOHz+OI0eOYO/evdi/fz+2bduGYcOG4cCBA01mtvn6+iI+Ph4AMGrUKHTq1Anjxo3Dl19+qbTyyWQyjBgxAkVFRVi0aBE6deoEFxcXPHjwADNnzjTosxlCU9+LKb4DCsXcUCFEodgYYWFhkMvlSEtLQ2RkpHJ+bm4uSkpKEBYW1uj6Xbt2RUxMDH7++We0bt0a9+/fx9dff23wWAAgNTVVw91SW1uL9PR05QXfFBw9ehSFhYX4888/MWTIEOV8NrPOEFxcXDBu3Dj89ttvWLVqFbZt24bBgwcjODhYYzkul4vhw4dj+PDhWLVqFT799FO89957OHLkiN6feezYsYiNjcWnn36KOXPmwMXFBdeuXcOtW7ewefNmjeDogwcPNli/uYLYz88PYrEYqampDd5LSUkBl8ttYJlrClN8BxSKuaGuMQrFxhgzZgwAYPXq1RrzV61aBYBcWJti2rRpOHDgAFavXg0fHx+MHj3aoLHEx8dDKBTiq6++0rDerF+/HqWlpc0ai6Gw1gr1/dbW1uKbb75p0XYnT56Mhw8f4ocffsCVK1c03GIAUFRU1GCd6OhoAGi0fEFjLFq0CIWFhVi3bh0A7Z+NYRh8+eWXDdZ1cXEBgAblCurD4/EwcuRI7Nq1S6MEQW5uLn755RcMGjQI7u7ueo3bVN8BhWJOqEWIQrExoqKiMGPGDHz//fdK18S5c+ewefNmTJo0CUOHDm1yG08//TTeeust7NixA3PnzoVAIDBoLH5+fnjnnXfwv//9D4888ggmTJiA1NRUfPPNN+jdu7fWAGxjMWDAAHh5eWHGjBl49dVXweFwsGXLFoPddixjxoyBm5sbFi5cCB6Ph8cff1zj/aVLl+L48eMYO3YswsLCkJeXh2+++QatW7fGoEGDDNrn6NGj0bVrV6xatQoJCQno1KkT2rVrh4ULF+LBgwdwd3fHH3/8oTVmqmfPngCAV199FaNGjQKPx9NZRuHjjz9W1kB6+eWXwefzsXbtWkgkEnz++ed6j9tU3wGFYk6oRYhCsUF++OEH/O9//8P58+fx2muv4d9//8U777yDrVu3Nmv9gIAAjBw5EgCxDrWEDz/8EGvWrMH9+/fx+uuvY/v27XjxxRdx4MABgwVWc/Dx8cGePXsQFBSE999/HytWrMCIESMMuqCr4+TkhAkTJqC8vBxDhw6Fv7+/xvsTJkxAaGgoNmzYgISEBCQmJmLIkCH4999/tcZZNZeFCxciMzMTP//8MwQCAXbv3o3o6GgsW7YM//vf/xAREaG1J9ljjz2GV155Bfv378e0adMarTzepUsXnDhxAl27dlVuNywsDEeOHNHI2msupvoOKBRzwmGodKdQHJJHH30U165dw+3bty09FAqFQrEY1CJEoTgg2dnZ2Lt3b4utQRQKhWLr0BghCsWBSE9Px6lTp/DDDz9AIBBgzpw5lh4ShUKhWBRqEaJQHIhjx45h2rRpSE9Px+bNmxEYGGjpIVEoFIpFoTFCFAqFQqFQHBZqEaJQKBQKheKwUCFEoVAoFArFYaHB0k0gl8vx8OFDuLm5GdzbiUKhUCgUinlhGAbl5eUIDg4Gl6vb7kOFUBM8fPhQ7/47FAqFQqFQrIPMzEy0bt1a5/tUCDWBm5sbAHIg9e3DQ6FQKBQKxTKUlZUhJCREeR3XBRVCTcC6w9zd3akQolAoFArFxmgqrIUGS+sgMTERnTt3Ru/evS09FAqFQqFQKCaC1hFqgrKyMnh4eKC0tJRahCgUCoVCsRGae/2mFiEKhUKhUCgOC40R0kFiYiISExMhk8ksPRQKhWIlyGQy1NXVWXoYFAoFgEAgAI/Ha/F2qGusCahrjEKhMAyDnJwclJSUWHooFApFDU9PTwQGBmoNiG7u9ZtahCgUCqUJWBHk7+8PsVhMi6tSKBaGYRhUVVUhLy8PABAUFGTwtqgQolAolEaQyWRKEeTj42Pp4VAoFAXOzs4AgLy8PPj7+xvsJqPB0hQKhdIIbEyQWCy28EgoFEp92P9lS2L3qBDSAa0jRKFQ1KHuMArF+jDG/5IKIR0kJCQgOTkZ58+ft/RQKBQKhUKhmAgqhCgUCoWilU2bNsHT09PSw2gWH374IaKjo/Vah8PhYOfOnSYZj7Uwc+ZMTJo0ySL7vnfvHjgcDpKSkiyy/+ZChRCFQqHYKTNnzgSHwwGHw4FQKET79u2xdOlSSKVSSw/N6CxcuBCHDx82ybZPnz4NHo+HsWPHmmT7puTLL7/Epk2bTL4fbYIrJCQE2dnZ6Nq1q8n33xKoELIwUpkcVbX2d1KiUCjWwSOPPILs7GykpaXhjTfewIcffojly5dbelhGx9XV1WRZfevXr8crr7yC48eP4+HDhybZR31qa2uNsh0PDw+LWfV4PB4CAwPB51t3gjoVQhYkt6wGw1cdQ4+PDmJX0gNLD4dCodghIpEIgYGBCAsLw9y5cxEfH4+//voLAFBcXIzp06fDy8sLYrEYo0ePRlpamtbt3Lt3D1wuFxcuXNCYv3r1aoSFhUEul+Po0aPgcDg4fPgwevXqBbFYjAEDBiA1NVVjnW+//Rbt2rWDUChEx44dsWXLFo33ORwO1q5di3HjxkEsFiMyMhKnT5/G7du3ERcXBxcXFwwYMAB37txRrlPfNXb+/HmMGDECvr6+8PDwQGxsLC5duqT38auoqMC2bdswd+5cjB07toF1hf3Me/fuRffu3eHk5IR+/frh+vXrymVYF+POnTsREREBJycnjBo1CpmZmQ3G/8MPP6BNmzZwcnICANy/fx8TJ06Eq6sr3N3d8dRTTyE3NxcAkJKSArFYjF9++UW5ne3bt8PZ2RnJyckAGlpq4uLi8Morr+C1116Dl5cXAgICsG7dOlRWVmLWrFlwc3ND+/bt8ffffyvXkclkeP7559GmTRs4OzujY8eO+PLLLzXGvnnzZuzatUtpgTx69KhW19ixY8fQp08fiEQiBAUF4e2339awUMbFxeHVV1/FW2+9BW9vbwQGBuLDDz/U+3vTByqEdGCOrLHN/91DRmEVaurkWPTHVeSV15hsXxQKxXgwDIOqWqnZH8ZoBODs7Ky0NsycORMXLlzAX3/9hdOnT4NhGIwZM0ZrKnJ4eDji4+OxceNGjfkbN27EzJkzweWqLifvvfceVq5ciQsXLoDP5+O5555Tvrdjxw7Mnz8fb7zxBq5fv445c+Zg1qxZOHLkiMZ2P/roI0yfPh1JSUno1KkTnn76acyZMwfvvPMOLly4AIZhMG/ePJ2fs7y8HDNmzMDJkydx5swZREREYMyYMSgvL9freG3fvh2dOnVCx44d8eyzz2LDhg1av4c333wTK1euxPnz5+Hn54fx48drHMeqqip88skn+PHHH3Hq1CmUlJRgypQpGtu4ffs2/vjjD/z5559ISkqCXC7HxIkTUVRUhGPHjuHgwYO4e/cuJk+eDADo1KkTVqxYgZdffhn3799HVlYWXnrpJfzf//0fOnfurPMzbd68Gb6+vjh37hxeeeUVzJ07F08++SQGDBiAS5cuYeTIkZg2bRqqqqoAAHK5HK1bt8Zvv/2G5ORkLF68GO+++y62b98OgLgln3rqKaX1MTs7GwMGDGiw3wcPHmDMmDHo3bs3rly5gm+//Rbr16/Hxx9/3GB8Li4uOHv2LD7//HMsXboUBw8ebOY3ZgAMpVFKS0sZAExpaanRt/3I6uNM2KI9ysdnf980+j4oFErLqK6uZpKTk5nq6mrlvEpJncZ/11yPSkmdXmOfMWMGM3HiRIZhGEYulzMHDx5kRCIRs3DhQubWrVsMAObUqVPK5QsKChhnZ2dm+/btDMMwzMaNGxkPDw/l+9u2bWO8vLyYmpoahmEY5uLFiwyHw2HS09MZhmGYI0eOMACYQ4cOKdfZu3cvA0B5/AYMGMDMnj1bY5xPPvkkM2bMGOVrAMz777+vfH369GkGALN+/XrlvF9//ZVxcnJSvl6yZAkTFRWl81jIZDLGzc2N2b17t8Z+duzYoXMddryrV69mGIZh6urqGF9fX+bIkSPK99nPvHXrVuW8wsJCxtnZmdm2bRvDMOQ4AmDOnDmjXObmzZsMAObs2bPK8QsEAiYvL0+5zIEDBxgej8fcv39fOe/GjRsMAObcuXPKeWPHjmUGDx7MDB8+nBk5ciQjl8uV76n/BhiGYWJjY5lBgwYpX0ulUsbFxYWZNm2acl52djYDgDl9+rTO45KQkMA8/vjjOvfDMAyTnp7OAGAuX77MMAzDvPvuu0zHjh01xpeYmMi4uroyMplM6/gYhmF69+7NLFq0SOs4tP0/WZp7/aYWIQvBMAwyi4jafnt0JwDAT2cyUFNHm7xSKBTjsWfPHri6usLJyQmjR4/G5MmT8eGHH+LmzZvg8/no27evclkfHx907NgRN2/e1LqtSZMmgcfjYceOHQCIy2fo0KEIDw/XWK579+7K52zrA7YVws2bNzFw4ECN5QcOHNhgn+rbCAgIAAB069ZNY15NTQ3Kysq0jjU3NxezZ89GREQEPDw84O7ujoqKCty/f1/r8tpITU3FuXPnMHXqVAAAn8/H5MmTsX79+gbL9u/fX/nc29u7wXHk8/kaHoZOnTrB09NTY5mwsDD4+fkpX9+8eRMhISEICQlRzuvcuXOD9TZs2ICrV6/i0qVL2LRpU5O1ddSPLY/Hg4+PT4NjC6i+M4B4SXr27Ak/Pz+4urri+++/1+tYsp+nf//+GuMbOHAgKioqkJWVpXV8APkNqY/F2Fh3BJMdU1YtRYWE+EWn9QvDplP3kFNWgxNpBRjROcDCo6NQKI3hLOAheekoi+xXX4YOHYpvv/0WQqEQwcHBLQpcFQqFmD59OjZu3IjHHnsMv/zyi0asCItAIFA+Zy96crlcr31p24Y+250xYwYKCwvx5ZdfIiwsDCKRCP3799crCHn9+vWQSqUIDg5WzmMYBiKRCGvWrIGHh4den6kpXFxcDFrvypUrqKysBJfLRXZ2dpN9t9SPI0COZWPHduvWrVi4cCFWrlyJ/v37w83NDcuXL8fZs2cNGm9TaBufvr8ffaAWIQvxoKQaAODtIoSLiI8x3cgPd+9V82QkUCgUw+FwOBAL+WZ/GFJF18XFBe3bt0doaKiGCIqMjIRUKtW4mBUWFiI1NbXR+JIXXngBhw4dwjfffAOpVIrHHntMr/FERkbi1KlTGvNOnTrV6D4N4dSpU3j11VcxZswYdOnSBSKRCAUFBc1eXyqV4scff8TKlSuRlJSkfFy5cgXBwcH49ddfNZY/c+aM8nlxcTFu3bqFyMhIje2pB5qnpqaipKREY5n6REZGIjMzUyOoOjk5GSUlJcrjVVRUhJkzZ+K9997DzJkz8cwzz6C6urrZn7M5nDp1CgMGDMDLL7+MmJgYtG/fXiNQHSAiWSZr3KPBBr0zajFWp06dgpubG1q3bm3UMesDFUIWorBSAgDwdxMBAMZ2DwQAHE7Jg0ze8oBICoVCaYyIiAhMnDgRs2fPxsmTJ3HlyhU8++yzaNWqFSZOnKhzvcjISPTr1w+LFi3C1KlTlY0vm8ubb76JTZs24dtvv0VaWhpWrVqFP//8EwsXLmzpR9IgIiICW7Zswc2bN3H27Fk888wzeo11z549KC4uxvPPP4+uXbtqPB5//PEG7rGlS5fi8OHDuH79OmbOnAlfX1+NbC2BQIBXXnkFZ8+excWLFzFz5kz069cPffr00TmG+Ph4dOvWDc888wwuXbqEc+fOYfr06YiNjUWvXr0AAC+99BJCQkLw/vvvY9WqVZDJZCY5lhcuXMA///yDW7du4YMPPmjQdSE8PBxXr15FamoqCgoKtAbcv/zyy8jMzMQrr7yClJQU7Nq1C0uWLMGCBQs0gu3NDRVCFoIVxFzFHV50iBfcnfgor5HialaJ5QZGoVAcho0bN6Jnz54YN24c+vfvD4ZhsG/fvgauifo8//zzqK2t1cgGay6TJk3Cl19+iRUrVqBLly5Yu3YtNm7ciLi4OAM/hXbWr1+P4uJi9OjRA9OmTcOrr74Kf39/vdaPj4/X6v56/PHHceHCBVy9elU577PPPsP8+fPRs2dP5OTkYPfu3RAKhcr3xWIxFi1ahKeffhoDBw6Eq6srtm3b1ugYOBwOdu3aBS8vLwwZMgTx8fFo27atcr0ff/wR+/btw5YtW8Dn8+Hi4oKffvoJ69at00h/bylz5szBY489hsmTJ6Nv374oLCzEyy+/rLHM7Nmz0bFjR/Tq1Qt+fn4NrH4A0KpVK+zbtw/nzp1DVFQUXnrpJTz//PN4//33jTZWQ+AwjBHyMe2YsrIyeHh4oLS0FO7u7kbb7vFb+Zi+4Rw6B7lj3/zBAICXtlzE/hs5WDiyA+YNizDavigUiuHU1NQgPT1do7aLo/PRRx/ht99+0xACjsrRo0cxdOhQFBcX6yxcuGnTJrz22msoKSkx69gcgcb+n829flOLkA4s0X1+YIQvAODU7UKz7ZNCoVCaS0VFBa5fv441a9bglVdesfRwKBSjQIWQDizRfb5vG28AQFJmCaQy00XIUygUiiHMmzcPPXv2RFxcnEFuMQrFGqFCyIpo7+cKNxEf1XUypOToV/2UQqFQTM2mTZsgkUiwbds28Hj6p/LbI3FxcWAYptF+XjNnzqRuMSuGCiErgsvlIDrUEwBwObPEomOhUCgUCsURoELIyogJ9QIAXL5fbOGRUCgUCoVi/1AhZGV0b0VSNZMfai8b3xzkcsYozRkpFAqFQrF3aIsNK6NTkBsA4E5+BWqlcgj5zdOqDMNgZ9ID/HTmPq49KEWdTI42Pi4Y3S0Q0/uHI8Cdpv1SKBQKhVIfahGyMlp5OsNNxEedjMGd/IpmrVMpkWLWpvN4fdsVXMwoRq1UDoYB7hZUIvHIHcQtP4ofT9+jViIKhUKhUOph90IoMzMTcXFx6Ny5M7p3747ffvvN0kNqFA6Ho7QKpeQ07R6rk8nx/ObzOJqaDycBF2+M6ICjC+Nw9t3hSHy6B2JCPVFdJ8PiXTfwxvYrqKNp+RQKhUKhKLF7IcTn87F69WokJyfjwIEDeO2111BZWWnpYTVKZBCpgJmS3XQK/aqDt3DmbhFcRXxsfbE/XhkegXBfFwS4O2Fs9yD88dIALBnfGTwuB39efoB5v1yivcwoFEqLOXr0KDgcjtnTwj/88ENER0ebdZ/m5t69e+BwOEhKSrLI/mfOnKnRJ83esXshFBQUpPzTBAYGwtfXF0VFRZYdVBO093cFQFxbjXE7rxzrjt8FACx/ojuiQzwbLMPlcjBrYBt8P60nhHwu/rmRi4/3Jht9zBQKxfqYOXMmOBwOOBwOBAIB2rRpg7feegs1NTV6bScuLg6vvfaaxrwBAwYgOztbay8ua2HUqFHg8XhmLYxrDEJCQpCdnY2uXbuadD+6BNeXX36JTZs2mXTf1oTFhdDx48cxfvx4BAcHg8PhYOfOnQ2WSUxMRHh4OJycnNC3b1+cO3fOoH1dvHgRMpkMISEhLRy1aQnzcQEA3GtCCK06eAtSOYP4SH+M7hbU6LLDIwOw8skoAMDGU/fw15WHxhkshUKxah555BFkZ2fj7t27+OKLL7B27VosWbKkxdsVCoUIDAwER9E42tq4f/8+/vvvP8ybNw8bNmww2361dV3XFx6Ph8DAQPD5lsln8vDwaLRApL1hcSFUWVmJqKgoJCYman1/27ZtWLBgAZYsWYJLly4hKioKo0aNQl5ennKZ6OhodO3atcHj4UPVxb6oqAjTp0/H999/b/LP1FLaKIRQRlEV5DrcWJlFVdh/PQcAsHBUx2Ztd3xUMF4Z1h4A8N6Oa3hQUm2E0VIoFGtGJBIhMDAQISEhmDRpEuLj43Hw4EHl+4WFhZg6dSpatWoFsViMbt264ddff1W+P3PmTBw7dgxffvml0rp07949ra6xP/74A126dIFIJEJ4eDhWrlypMZbw8HB8+umneO655+Dm5obQ0NAG5+RFixahQ4cOEIvFaNu2LT744AODxMXGjRsxbtw4zJ07F7/++iuqqzXPd3FxcZg3bx7mzZsHDw8P+Pr64oMPPtBIKgkPD8dHH32EqVOnwsXFBa1atWpwreJwOPj2228xYcIEuLi44JNPPgEAfPvtt2jXrh2EQiE6duyILVu2KNd57rnn0L17d0gkEgBAbW0tYmJiMH36dAANLTXssf7nn38QExMDZ2dnDBs2DHl5efj7778RGRkJd3d3PP3006iqqlLuZ//+/Rg0aBA8PT3h4+ODcePG4c6dO8r327RpAwCIiYkBh8NBXFwcgIauMYlEgldffRX+/v5wcnLCoEGDNKxs7PgOHz6MXr16QSwWY8CAAUhNTdXrO7MYjBUBgNmxY4fGvD59+jAJCQnK1zKZjAkODmaWLVvW7O3W1NQwgwcPZn788cdmLVtaWqp8ZGZmMgCY0tLSZu+vORxLzWPCFu1hRq8+3uC9OqmMaf/uXiZs0R4mq7hK6/r/9/dNJmzRHubZH87otd86qYyZlHiSCVu0h3l+03mDxk6hOBLV1dVMcnIyU11drZoplzOMpML8D7lcr7HPmDGDmThxovL1tWvXmMDAQKZv377KeVlZWczy5cuZy5cvM3fu3GG++uorhsfjMWfPnmUYhmFKSkqY/v37M7Nnz2ays7OZ7OxsRiqVMkeOHGEAMMXFxQzDMMyFCxcYLpfLLF26lElNTWU2btzIODs7Mxs3blTuKywsjPH29mYSExOZtLQ0ZtmyZQyXy2VSUlKUy3z00UfMqVOnmPT0dOavv/5iAgICmP/7v/9Tvr9kyRImKiqq0c8tl8uZsLAwZs+ePQzDMEzPnj0bnP9jY2MZV1dXZv78+UxKSgrz008/MWKxmPn+++81xuvm5sYsW7aMSU1NVR6bAwcOKJcBwPj7+zMbNmxg7ty5w2RkZDB//vknIxAImMTERCY1NZVZuXIlw+PxmH///ZdhGIYpLy9n2rZty7z22msMwzDMwoULmfDwcOV1Jj09nQHAXL58mWEYRnms+/Xrx5w8eZK5dOkS0759eyY2NpYZOXIkc+nSJeb48eOMj48P89lnnynH9vvvvzN//PEHk5aWxly+fJkZP348061bN0YmkzEMwzDnzp1jADCHDh1isrOzmcLCQq2/m1dffZUJDg5m9u3bx9y4cYOZMWMG4+XlpVyeHV/fvn2Zo0ePMjdu3GAGDx7MDBgwoNHvyRho/X8qKC0tbdb126qFkEQiYXg8XgNxNH36dGbChAnN2qZcLmemTJnCLFmypFnLL1myhAHQ4GFOIcQwDDN0xREmbNEe5mRafoP35HI5M+Tzf5mwRXuYv5Ie6L3vtNwypt07RGj9ezNX7/UpFEdC64lWUsEwS9zN/5BU6DX2GTNmMDwej3FxcWFEIhEDgOFyuczvv//e6Hpjx45l3njjDeXr2NhYZv78+RrL1BdCTz/9NDNixAiNZd58802mc+fOytdhYWHMs88+q3wtl8sZf39/5ttvv9U5luXLlzM9e/ZUvm6OEDpw4ADj5+fH1NXVMQzDMF988QUTGxursUxsbCwTGRnJyNXE5aJFi5jIyEiN8T7yyCMa602ePJkZPXq08jUApaBhGTBgADN79myNeU8++SQzZswY5ev//vuPEQgEzAcffMDw+XzmxIkTyvd0CaFDhw4pl1m2bBkDgLlz545y3pw5c5hRo0bpPC75+fkMAObatWta98OiLoQqKioYgUDA/Pzzz8r3a2trmeDgYObzzz/XOb69e/cyALQKFGNiDCFkcddYYxQUFEAmkyEgIEBjfkBAAHJycpq1jVOnTmHbtm3YuXMnoqOjER0djWvXrulc/p133kFpaanykZmZ2aLPYCjhCvdYupY4oRsPy5BRWAUnARfDOvnrve32/m54bhAxiX60N9msWWQSqQxpueU4kpKHwzdzcTKtAFnFul2AFAqlZQwdOhRJSUk4e/YsZsyYgVmzZuHxxx9Xvi+TyfDRRx+hW7du8Pb2hqurK/755x/cv39fr/3cvHkTAwcO1Jg3cOBApKWlQSaTKed1795d+ZzD4SAwMFAj1GHbtm0YOHAgAgMD4erqivfff1/vsWzYsAGTJ09WxthMnToVp06d0nALAUC/fv00Ypz69+/fYLz9+/fXWKd///64efOmxrxevXppvNZ1LNTX69+/PxYuXIiPPvoIb7zxBgYNGtTk51I/dgEBAUr3ofo89WOZlpaGqVOnom3btnB3d0d4eDgA6HU879y5g7q6Oo3PIxAI0KdPnwbHQX18QUEkblV9PNaK3VeWHjRoEOTy5tfOEYlEEIlEJhxR8wj1FgMAsoobxvEcSSE/rNgOfnARGfYVvjKsPbZfyMTd/ErsufoQE6NbGT7YJqiVyvH39Wz8fjELZ+8WoVZLLSMPZwGGdPDDmK6BGNE5AHyeVWt0iqMjEAPvWiDhQCDWexUXFxe0b09iAzds2ICoqCisX78ezz//PABg+fLl+PLLL7F69Wp069YNLi4ueO2111BbW2vUobMIBAKN1xwOR3mOPn36NJ555hn873//w6hRo+Dh4YGtW7c2iDVqjKKiIuzYsQN1dXX49ttvlfNlMhk2bNigjOExJi4uLnqvI5fLcerUKfB4PNy+fbtZ66gfOzYTUB31YwkA48ePR1hYGNatW4fg4GDI5XJ07drVLN8tKzD1uf5aCqu+2vj6+oLH4yE3N1djfm5uLgIDA02678TERHTu3Bm9e/c26X50EehBWmLkljVMcz2bTtL/B7b3NXj7bk4CvKCwCn11OM0kViGGYfDPjRwMXXEU87cm4URaAWplcriJ+Ogc5I6oEE+083OBgMdBaXUddl95iLk/X0Ls8qPYciYDUlr8kWKtcDiA0MX8jxZmaHG5XLz77rt4//33lcHDp06dwsSJE/Hss88iKioKbdu2xa1btzTWEwqFGlYSbURGRuLUqVMa806dOoUOHTqAx+M1a3z//fcfwsLC8N5776FXr16IiIhARkaGHp8Q+Pnnn9G6dWtcuXIFSUlJysfKlSuxadMmjc9x9uxZjXXPnDmDiIgIjfGeOXOmwTKRkZGNjkHXsejcubPy9fLly5GSkoJjx45h//792Lhxo16fsykKCwuRmpqK999/H8OHD0dkZCSKizWbeQuFQgBo9LtlA77VP09dXR3Onz+v8XlsGau2CAmFQvTs2ROHDx9WRrDL5XIcPnwY8+bNM+m+ExISkJCQgLKyMovUyQhU9AbLKdUUQrVSOS5kECHUr61Pi/YxY0A41p1Ix538Shy+mYuRXYwnLmvqZHh/53X8fjELAODnJsKzfcMwtnsQ2vm5aJijpTI5rmSV4kByDn67kIUHJdX4YOd1/HwmA8se64aYUC+jjYtCcXSefPJJvPnmm0hMTMTChQsRERGB33//Hf/99x+8vLywatUq5ObmalzkwsPDcfbsWdy7dw+urq7w9vZusN033ngDvXv3xkcffYTJkyfj9OnTWLNmDb755ptmjy0iIgL379/H1q1b0bt3b+zduxc7duzQ6/OtX78eTzzxRIMaPCEhIXjnnXewf/9+jB07FgBxES1YsABz5szBpUuX8PXXXzewPp06dQqff/45Jk2ahIMHD+K3337D3r17Gx3Dm2++iaeeegoxMTGIj4/H7t278eeff+LQoUMAgMuXL2Px4sX4/fffMXDgQKxatQrz589HbGyshqurJXh5ecHHxwfff/89goKCcP/+fbz99tsay/j7+8PZ2Rn79+9H69at4eTk1OB65+Ligrlz5+LNN9+Et7c3QkND8fnnn6OqqkppVbR1LG4RqqioUCp2AEhPT0dSUpLSh7lgwQKsW7cOmzdvxs2bNzF37lxUVlZi1qxZJh2XtVqErj0oRU2dHN4uQkQoCi8aipuTAFP6kJpKP53VzwffGOU1dXjmh7P4/WIWuBzg5bh2OPZmHObHR6C9v2uDuiN8Hhc9w7zwzuhI/Pf2MHw4vjM8xQKk5JTjye9O45ujt2kMEYViJPh8PubNm4fPP/8clZWVeP/999GjRw+MGjUKcXFxCAwMbFBVeOHCheDxeOjcuTP8/Py0xpj06NED27dvx9atW9G1a1csXrwYS5cuxcyZM5s9tgkTJuD111/HvHnzEB0djf/++w8ffPBBs9e/ePEirly5ohEDxeLh4YHhw4dj/fr1ynnTp09HdXU1+vTpg4SEBMyfPx8vvviixnpvvPEGLly4gJiYGHz88cdYtWoVRo0a1eg4Jk2ahC+//BIrVqxAly5dsHbtWmzcuBFxcXGoqanBs88+i5kzZ2L8+PEAgBdffBFDhw7FtGnTmrS8NRcul4utW7fi4sWL6Nq1K15//XUsX75cYxk+n4+vvvoKa9euRXBwMCZOnKh1W5999hkef/xxTJs2DT169MDt27fxzz//wMvLPm5SOQxj2U6cR48exdChQxvMnzFjhrKy5Zo1a7B8+XLk5OQgOjoaX331Ffr27WuW8bEWodLSUri7uxttu8dv5WP6hnPoHOSOffMHN3j/XkEl4lYchbOAh+Slo5TiYcuZDHyw8zqGdvTDxll9WjyO+4VViF1xBAwDHF0Yh3Bf/X3d6lTXyvD0D2dw+X4JPJwF+PaZHhhggAuvpKoW7++8jj1XswEAE6KCsfzJ7hDxm2dip1CMRU1NDdLT09GmTRs4OTlZejgUIxEXF4fo6GisXr1a5zLh4eF47bXXGlTVplgPjf0/m3v9trhFKC4uDgxJ49d4qJf3njdvHjIyMiCRSHD27FmziSBLwlqEqutkKKuRKuenKhqxdgw0jigL9REjroMfAODX8y2zCjEMg7f+uIrL90vgKRbgl9l9DRJBAOApFuLrqTFY9lg38Lkc/HXlIWZtPI+qWmnTK1MoFAqF0kwsLoSsFUu7xpwEPHg4kwh8dffYrZwKAECnQDej7eupXsQ9tudKNlpiIPzxdAZ2X3kIPpeD76f1QpfglsVWcTgcTO0Tig0ze8NFyMN/dwrx0k+XUCulQdQUCoVCMQ5WHSxtSSwdLA0AQR5OKK2uQ3ZpDToEuIFhGKQoLEIdAownhIZ28oeLkIcHJdW4nFmCHgYEJ2cWVeH/9qcAAN4bG4k+bRoGUxrKkA5++PH5vnj2h7M4fisfC7Yn4eupMVbV40gqkyM5uwzn7xXjdl4FHpRUo0oihUQqh1jIg4+rEK08ndG1lQeiWnu22AVJoVBaxtGjR5tc5t69eyYfB8XyUCFkxQS4OyElpxy5isyx3DIJymqk4HE5aOdvvAupk4CH+M4B2JX0EHuuZBskhD786waqamXoE+6NGf3DjTY2lp5hXlg7rSee33wee65mo2srD7wU287o+9GXa1ml2HbhPvZczUZJVfP7IbX1dcGIzgF4sldrtPc3nqilUCgUin5QIaSDxMREJCYmGi2C3xB8XEmNh6IqUvwqo5BUmQ7xcjZ60PC47sHYlfQQf1/PxgfjIvWytly4V4TDKXngcTlY9ng3cLmmsdQM6eCHDyd0wXs7ruPz/Sno3srD4BiklnI1qwQrDtzC8Vv5ynluTnz0CfdG52B3hHiL4e7Eh4jPQ7lEiqIKCe4WVOL6g1Jcf1CGuwWVWHv8LtYev4tB7X3xUmw7DIqwzGehNA8L55VQKBQtGON/SYWQDqzBNeYtJkKouJIIoWyFZSjIw9no+xoc4QsRn4vs0hrczqtAhB6ut5UHSPG1p3q1Rju/lqX0N8XTfUJx+X4Jfr+Yhde3J+HA67HKWCpzUCGRYsU/qdh8+h4YBuBxORjbLQhP9mqNAe18wWuGCCyvqcPxWwXYmfSAtBm5XYCTtwswpIMf3h3TCZ2MFAhPMQ5stdyqqio4Oxv/v0ehUAynqqoKQMOK5fpAhZAV462wCBU2EELGT+F1EvDQp403TqQV4HhaQbOF0OX7xTh9txBCHhfzhkUYfVz14XA4+HhSV1zMKEZ6QSWW7buJzx7v3vSKRuB2XgXmbLmAO/nEMjcxOhhvjOiIUB/92h64OQkwtnsQxnYPQmZRFdafTMfPZzNw/FY+/rtdgFeHR+DluHa0zYiVwOPx4OnpqeyZJBaLrSo+jUJxRBiGQVVVFfLy8uDp6dns6uXaoELIimloESIl8YM8TVPLZEiEH06kFeBEWj6eV7TfaIqfFYUYx0UFoZWnee6WnQQ8fPZYN0z+/gy2ns/E+KjgFrUbaQ7/3S7Ai1suokIiRYC7CCuejMLgCL8WbzfEW4wPJ3TBrIHh+GTvTRxIzsWqg7dwOCUPiU/HoLWX/r2lKMaHbeljCw0kKRRHwtPTs8Utt6gQ0oE1xAh5uWjGCD0sIRahQBO4xgBgcAdfYB9w5m4hJFJZk3FIpdV12HOVNJ58pm+oScaki75tfTCtXxi2nMnA/3bfwL5XB5vMgnL8Vj5m/3gBEqkcfcK9kfhMD/i5Gbcxb5iPC9ZO64ldSQ/xwa7ruJJZgolrTuG7aT3RO9x4GXjmpqymDoUVtaiokaJOLoezgAdXER+BHk4Q2JDFi8PhICgoCP7+/qira35QPIVCMR0CgaBFliAWKoR0YBUxQi6aFqGcMmIRCjaBawwAOga4wc9NhPxyCS5llKB/u8Z7me1KeoCaOjk6BrgZlGnWUhaO7Ii/rjzErdwK/H4xC1P6GF+MXbpfjBd+vIBaqRzDO/njm2d7mKy6NYfDwaSYVujdxhuzN19AcnYZnll3FmuejjFqHzhTIZXJcel+CU7dLsC59CKk5VWgoEKidVkuBwj2dEbXYA/0DPPCgPY+6BzkbvUuJx6PZ5QTL4VCsR6oELJi3JzI11OuqCydrbQImUYIcTgc9Gnjjb1Xs3HpfnGTQohtf/Fkr9YWuYB5iAV4dXgEPtqTjFUHb2FSTCs4CYx3kcourcacLReVIujbZ3tCyDe9FaOVpzN+n9sfr29Lwj83cjH350tYPTka46OCTb5vQ7iTX4Ft5zPx56UHWoWPi5AHNycB+DwOaurkKKupQ61UjqziamQVV2P/jRwAQIi3M8Z0C8IzfcL0jruiUCgUQ6FCyIpxcyJR8OU1UtTUyZRB08Emco0BQEyIJ/Zezcbl+yWNLpdfLsH5e0UAgNHdgkw2nqaY1i8M60/cxcPSGvxxKQvP9A0zynZrpXK8tOUi8ssl6BTohq+mxphFBLGIhXwkPt0Db/5+FTsuP8Dr25Lg5sRHXEd/s42hKW7nVeCrw2nYffUh2AxWL7EAA9v7YkA7X3QJdkdbPxfl75iFYRjkl5NyAkmZJTifXoRTdwqQWVSNtcfu4vvjdzGsoz9eHR6BqBBP838wCoXiUFAhpANriBFyV1iEamVyPCghbjEBjwNPsenSxWMULq6kzGIwDKPT0vNvSi4YBujWysNsQdLaEPK5mD2kLf63OxnfHbuDyb1CjBIrtObIbVzJKoWnWIB103vBRWT+vwqfx8XKJ6MgZxjsSnqIl3++hK0v9kP31p5mH4s61bUyrD58Cz+cSIdMThTQsE7+mNI7BEM7+TcZ+8PhcODv7gR/dyf0a+uDl2LboapWiqOp+dh6PhPHb+XjcEoeDqfkYXTXQLw9uhPCfGglbgqFYhpsJ1rRzCQkJCA5ORnnz5+32BhchHywOiSziNRK8BQLTeqG6hLsDgGPg4KKWmQVV+tc7kRaAQDSnsPSTOkdCm8XITKLVG6WlnDjYSkSj9wGAHw0sStCvC3npuFyOVj+RBQGtfdFVa0Mc7ZcRJHCMmgJbjwsxegvj2PtsbuQyRkM7+SPPa8MwoaZvTGyS6DBAdBiIR9jugXhx+f64PAbsXi8R2twOMDf13MwavVxrDt+Vym6KBQKxZhQIWTFcLkcuCosEUohZOLigU4CHiIULR+Ss8u0LiOXMzh9pxAAMLCJOCJz4CzkKbPWflGk8xsKwzBYujsZMjmD0V0DrSIuR8jn4ttne6CtnwuyS2swf+tli4iCPy9l4bFv/sO9wioEeThh3fReWD+zN7q2Mm4yQTs/V6x8Kgr75w/BgHY+qKmT45N9N/HU2tPIKa1pegMUCoWiB9Q1ZuW4OwlQXiPFfYUQ8lLUFjIlnQLdkJxdhtSccozSkq2UmluOwspaOAt4SleapZncOwRrjtzGf3cKcTe/Am0NrHD9z41cnE0vgojPxfvjOht5lIbj5iTAt8/0xMTEkziRVoC1x+/g5bj2Ztv/uuN38cm+mwCAuI5++OKpaGV5B1PRMdANP7/QF9svZOLjPTdxMaMY474+icSnY9C3reUFuL5USKS4mFGMK5kluFdYicyiKpRVS1FdJwOXA7iI+PASCxHmI0ZbP1f0CPVE11YeNlVmgEKxRagQsnLYzDFWCHmYMD6IpVOQG3AZSM0p1/r+hYxiAECvcC+zBhA3RmsvMYZ29Me/KXnYej4T746J1HsbcjmDVQdTAQCzB7e1aOyTNjoGumHphK5464+rWH0oDaO6BJq8pQkAfHU4DasOkjYqswe3wTujI03WT64+HA4Hk3uHol9bH8zZchEpOeV45oezWPlUFCZGtzLLGFpCSVUt9l7Lxq6kh7iYUdwsS97J26rnzgIeBkf4YlxUMOIj/SEW0lM2hWJs6L/KymGDdNliil5mEEIdFb2uUnK0u8auZpYAAKKtLKNncu8Q/JuShz1XHuLtRzrpfbE+nJKHW7kVcBPx8WJsWxONsmU82as19l7LxrFb+Xj7j6vY9mJ/k4qSn85kKEXQW490NKsVSp0wHxf8+fIAvPn7Vey9mo3XtiWhrEaKaf2MkyVobDKLqrDuxF1sO58JiVSunB/i7YxeYd5o7++KUG8xvMRCOAt5YBgG5RIpCsoluFdYidScclzIKEZJVR0OJOfiQHIu3Jz4eLpPKGYODDdJv0EKxVGhQkgH1pA1BgBiIamLk1NGhJA5Gox2CiQxQukFlaipkzWozXPtQSkAkjFmTcR28IOriI+HpTW4nFmCnmHNd9sxDINvj5Jb8Wf6hcHdyXyNXPWBw+Hgk0e7YtQXx3H+XjF+v5iFp3qHmGRfR1LzsHjXdQBQ9D+zjAhiEQv5+HpKDHxdhNh8OgMf7LwOEY9rss9vCBUSKb48dAsbT92DVGH96RTohkdjWmFMtyC9Au/lcgbJ2WXYdy0bu68+JOUFjt/FhlPpmDkgHPOGRZi14TCFYq9Yh1/DCrGGrDEAShFSqChUZ440bn83EdxEfMgZVZA2S3WtDLdyicvM2mq8OAl4GB5Jstj2XcvWa90bD8tw6X4JhDwunhsUboLRGY/WXmK8Ft8BALDiQCoqJVKj7yO7tBoLtiVBzgCTe4Xg9XjTN9RtDlwuBx9O6IIXhxCL3dt/XsXfen7XpuLflFwMX3kU606kQypnMKi9L355oS/+nj8Yc2Lb6Z19yOVy0LWVB956pBOOLRyKH6b3Qp823qiTMVh3Ih1xy4/gj4tZYBiaTUehtAQqhKwcZ4UQYkMLXMwQI8DhcJSVfe/XE0LJ2WWQM4CfmwgB7qapcN0SxiqKO/59LVuvC8RvFzIBACO7BMDfzfo+V32mDwhDqLcYeeUSrDtx16jblsrkmP9rEoqr6tC1lTuWTupiVa0vOBwO3hndCVN6h0DOAK9vT8KNh6UWG0+dTI5P9ibjuU0XkFsmQai3GBtn9sZPL/TFgPa+Rjl2XC4H8Z0DsH1Of2ya1RsR/q4orqrDG79dwdyfLilvlCgUiv5QIWTlONdzS4lF5ulzFKq4e80o1BRCd/IrAJC+ZNbIkA5+cBbw8LC0Bik6gr3rU1Mnw84k0jz2qV7W42ZpDBGfhzdHdQQArD+ZjrIa4zUC3fTfPZy7VwRXER9rppqut1pLIC7Cbojt4IeaOjle/NEy9ZUqJVI8v/kC1p1IBwDMHBCOA68PMWl9rbiO/vh7/mAsHNkBfC4H+2/kYPzXJy0qBluKTM4gr7wGD0qqcb+wCqXVddTSRTEbNEbIynEWal6EzGERAqDTIsQKobZ+1lnp10nAQ7+23jiSmo/jt/IRGeTe5Dr/puShtLoOQR5OGNje1wyjNA5juwXhy8NpuJ1XgS2nM5AwtOUxPFnFVVh5gARHvz82EuG+1vk9AwCPy8FXU2IwIfEkMgqrsPC3K1g/o5fZrFclVbWYvuEcrmaVwlnAw6qnoszWbobP42LesAjEdfTHq79ext2CSjzx7Wl8NTUGIzoHmGUMLSGruAon0grw351C3HhQiqziatTK5BrLiPhctPF1QVRrT/Ru4434SH94mqF8CMXxoBYhK6e+EBILzWsRqi+E7uZXAgDaWvEFckgHPwDA8bT8Zi1/QFGNekJUMHhmSgs3BlwuBy/HtQNArEI1dS0P7F/2dwqq62ToHe5lE9YxD7EAa6f1hJDHxb8pediucHGamgqJFDM2nsfVrFJ4uwjx64v9LNJzr2srD+x4eSAGR/iiuk6Gl366iF1JD8w+juYglcmxK+kBnlp7GoP+7wje+fMadl95iLsFlaiVycHhkOKhrBVcIpUjJacc2y5kYuFvV9Dr40OYufEcDt/MhZxWGacYEWoRsnLqu8bM1fMqzJsInYzCSo35dxUWoXb+pq9fYyisEDp/rxgSqaxR145UJsfRW0QwxdvAnXR9JkQFY+WBW3hQUo29V7PxeM/WBm/rWlYp9l7NBocDLJ3Y1Wy1glpKp0B3LBzVAZ/uS8HS3ckY0M7XpG1R6mRyzNlyAVcyS+ApFmDri/3QwYKuYg+xABtn9sZbv1/Fn5cf4LVtSeByOFZRFR0gGZm7r2Zj5YFUpaudwwF6hnphYHtf9A73RrivGEEezsobkZo6GfLKJLiZU4akzBIcTc3HzewyHE3Nx9HUfET4u+Lt0Z0wrJO/VcWvUWwTKoSsnPoWIHNbhDKLq5XNV+tkcuWJzNDKzeagra8LfF2FKKioxfUHpegZ5q1z2cuZJSipqoOnWIAYK8uCaw58HhdT+4RgxYFb+OlsRouE0PIDpJjkpOhWzXIpWhPPD2qLQ8l5OHevCB/tScb303uZbF/L9qXg1O1CuAh5+PG5PhYVQSx8HhcrnoyCSMDFr+cysWB7EnxchBhgYVfv/cIqvLPjKk7dJi15vMQCzBzQBk/2ao3gRgqWOgl4CPURI9RHjFFdArHokU64k1+Bbecz8evZ+0jLq8Dzmy9gcIQvPnu8u9UVP6XYFtQ1ZuXUr+FjLotQgIcIAFArlaO4igTiPiiuhlTOQMTnIsgKM8ZYOByOsobQ+XvFjS57+GYeACCug59RutZbgqd6h4DP5eDy/RKDA2avPyjF8Vv54HE5eF2Rmm9L8LgcfPxoV/C4HBxIzsVJRVNgY/PXlYfYcIoERn8xORrdW3uaZD+GwOVy8PGkbhjTLRB1MgYvbrmI23nNSxgwBX9fy8bYr07g1O1CiPhcvB7fAScXDcP8+IhGRZAu2vm54t0xkTj1zjC8FNsOQh4XJ9IK8MgXx63WHUixDWzzzG8GEhMT0blzZ/Tu3dui42iQNWYmi5CIz4O3opcU2+iSLeoY7Ols9W6T3uHECnQ+vajR5Y4p3GKmzPIxNf5uTsqecDsuGXZB2HCSXNzHdgtSBsrbGh0C3JSVppfuuQFpveDblpJTWoP3/rwGAEgY2g4jtfThszQ8LgernopGn3BvVEikmPvTJZPUmWoMhmHw1eE0zP35EsolUvQM88LB12MxPz7CKDdy7k4CvD26E/55fQhiQj1RLpFi/tYkLPv7pkWaEVNsHyqEdGAtBRVFAs2vqL6FyJSwdYJyy4kAylUIIX83kdnGYCg9FBahK1klOtNwy2rqlG1E+ttgE091JkaTeJC917L1DiTNK6vB7qukfMDzg9oYfWzm5PX4DvASC3Art0JZEsEYMAyD93deQ7lEiugQTywY0dFo2zY2TgIeEp/pAX83EdLyKvDejmtm27dczuDDv24o27K8OKQttr7YzyTiuo2vC36b0x8JQ0nCwNpjd/HKr5dQZ2QBTLF/qBCycvhcza/InJ2oA92J4Mkt1RRCgR7W6xZjiQx0B5cDFFTUIr9ce7G5SxnFYBggzEcMfyt29TWH2I5+cBPxkV1ag4v3G3cH1uf3S1mokzHoGeZlddXC9cVDLMCcWHJhTDxy22hWob3XsnHoZh4EPA4+f6K71WcX+rmJsObpHuBxOdiZ9BD7r5un+vZn+1Ow+XQGOBzgfxO64N0xkSY9Z/F5XLw5qhO+nBINIY+LfddyMO+XS6iVWp8YYhgGD0uqkZpTjhsPS5FXXkOz36wEGixt5fDrnXAFPPOdgP0Ulp8CRdXa3DIytcaK0vVxFvLQ1s8Vt/MqcONhmVahc0ERP6RPTzJrRcTnYUSXAPx56QF2X3modA02BcMwSnfaU70MD7S2Jqb1C8PaY3eQXlCJPVezMSmmZV3qa+pkWLYvBQDwclx7qwiObg592nhjbmw7rDlyG+/vvIF+bX1MWodn3fG7+P44qXL+f493N2v5hYnRreDuJMCcny7inxu5ePuPq1j5VJTFM8oKKiTYdy0b+6/n4GpWKSrquSnFQh76tPHGsE7+mBTTymp7HNo71CJk5fB59YWQ+b4ybxcihAoVFXvZGCFbEEIA0CWYZD7pCiBOyiwBYB9CCFC1Fzl8M6/ZVXlvPCxDWl4FhHyuRergmAIXEV/p4mMDm1vCltMZeFBSjSAPJ8xV1G2yFeYNa492fi4oqJDgk703Tbafk2kF+PRvsv13RneySA2qoZ38sfbZnuBxOfjz8gN8/e9ts4+BJb9cgv/tvoGBn/2Lxbtu4L87haiQSCHgceDjIoSvqwhcDlBVK8PR1Hws3nUD/T49jE/2Jhu1SjyleVAhZOXUFz71LUSmxNeV3D0WVhAhlKcUQtYfIwSoC6GyBu8xDOnsDQBdgz3MOi5T0b+dD4Q8Lh6UVCO9oLLpFQDsvEysQSMiA+zqbnRqn1AI+VxczSpVCl5DqJRIkXiUXFBfH9HBrDF6xsBJwMPnT3QHAPx2MQvXHxi/DUdeWQ1e23YZDANM6R2ibIhrCYZ28sfSiV0AAKsO3sKh5Fyz7p9hGOy8/ADxq45h46l7kEjl6NrKHe+PjcQ/rw1B8tJHcPGDEbjwfjxSPx6Nfa8OxjujOyHC3xVVtTKsO5GOYSuOWU0jYUeBCiErRz0WQcDjmNXUy2aNFdWzCAXaiEWoYyARQmxbEHXyyiUoqqwFlwN0DLQNV0dTiIV89Aon1q3jt5pXVfvQTXKhsJbie8bCx1WEcd2JhevH/+4ZvJ3tFzJRUlWHcB8xHu9hm67DnmHeymD6j/cmG7WHF8MweOO3KyioqEWnQDd8OMHyDXqf6RuGmQPCAQBv/XFVeQNnaupkciz64ype25aE0uo6dAl2x0/P98XueYPwwuC26BjopnFjK+Bx0TnYHXNi2+HA60OwcWZvtPUl1ru5P1/Csn03jZ75SNEOFUJWjnpMkDndYoBKCBVW1oJhGJuKEQJUbUDuFVY1SKtlrUFtfF1s7i6/MQZHkKraJ5pRR+deQSXuFVZBwONgUITt9FhrLtP7hwMA9lzLRrkB7gapTI71irICLwxua/UB0o3x5qiOEPK5OHO3SFnc0BjsSnqIE2kFEPK5WPN0jNX8l94Z0wmRQe4oqqzFwt+vmryBa6VEiuc2ncf2C1ngcoAFIzpgZ8JADIrwbZYw5HA4GNrJH3+/NhhzFBa1tcfv4uWfrTPw296weyFUUlKCXr16ITo6Gl27dsW6dessPSS9UM8aM6dbDAB8FDFCxZW1KJdIlX9IPxtInwdIvSMhj4taqRwPS6o13rupEEKd7cQtxjKkAxE0p+8WNnkCPZpKikn2CvOGq5kKdZqTqNYeaOfnglqpHP/c0N9FcjA5F1nF1fB2EeKJFlTstgZae4nxdJ9QAMCaI2lG2WZpdR0+2pMMAHh1WHu097cey6qIz8NXU6Ih4nNx/FY+dpqw4GJNnQwvbrmAE2kFEAt5+GFGL7w6PMKgG1cRn4d3xkQi8ekeEPK5OJCci4RfLlHLkImxeyHk5uaG48ePIykpCWfPnsWnn36KwkLj3RGZGvW7UCHfvF+XuzO5OJbV1KFUUV3aScC1mru+puBxOcr6JfVjZm7nEndZJztxi7FEBrrDSyxAVa2sySrTbI+1uI5+5hia2eFwOJgYTTLG/rqif02h3y5mASBxL7bym2+MF4e0hYDHwZm7RbiY0Xih0ebw/fE7KKysRTs/F7w4xPqCyCMC3DA/PgIA8MnemyitNn4QMsMwePP3q8qWKz+/0BfDOrW8Z+HY7kH4YXoviPhcHEzOxccmDHSnOIAQ4vF4EIvJxVAikYBhGJObSY2J+l1F/ZpCpoYNnq2qlSFfkULv6Wy69FtT0EbpHtMUQhlFpGdamI1WUdYFl8tBj1ASJ3T5fonO5SRSGU7fITcEcR1tt6p2U0xQxD6dul2gs56UNvLKapRVx23dGsQS7OmMx2LIZ9lw8l6LtpVXVqN0Gy56pJPZb9KaywuD2iqy5mqx5l/jWMLUWX8yHbuvPASfy8G66b0QE2q8DNQhHfzwxeRoAMCm/+7hd4Uwpxgfi/96jx8/jvHjxyM4OBgcDgc7d+5ssExiYiLCw8Ph5OSEvn374ty5c3rto6SkBFFRUWjdujXefPNN+PraTjyEevq8gG9e15ibk8pdklVMXEsezraVWcTGCd3NryeEFM1jw7xdzD4mUxMT6gmANJTVxfUHZZBI5fBxEaJDgPU20G0p4b4u6NbKAzI5gyMpec1eb2fSA8jkpMikNTcY1pcZiiDif27ktCiI+Ltjd1FTJ0ePUE+M6NxyC4ipEPK5eH9cZwDAj6czlO2CjMH1B6VY9jepL/XBuM4maXA7plsQFowgvf8W77re7GxQin5YXAhVVlYiKioKiYmJWt/ftm0bFixYgCVLluDSpUuIiorCqFGjkJenOqmx8T/1Hw8fEnO4p6cnrly5gvT0dPzyyy/IzTVvSmVLUI8LEpjZIsTnceGi6G2WqbCgeIhtSwiFeBOLDyvkABLYyBaJtNW+Wo3B3pVeytBdYfqyovp0TKiXxbN8TM0wRR+5o7eaL4R2XyHpy7aaKaaLzsHu6BHqCamcwfYLmQZto7S6DtvO3wcAvDo8wup/P3Ed/NA73AsSqRxfG8kqVCuV483fr0ImZzCmWyCm9w8zyna1kTC0Pfq19UZVrQxv/X7FpjwatoLFhdDo0aPx8ccf49FHH9X6/qpVqzB79mzMmjULnTt3xnfffQexWIwNGzYol0lKSsL169cbPIKDNVOCAwICEBUVhRMnTugcj0QiQVlZmcbDkvDrpVuaGzeFe4wVQp42ZhFiU/3zylV3gvfZzyIW2JyFqzl0b00CwB+UVCtLH9TnokIk9QjzNNewLEZsR1UmXXOCTnPLanDtQSk4HFi1tcNQnlU0pt16PtOgi+q28/dRWStDhwBXxHaw/vgyDoeDhSNJb7jfLmYpb4Jawqb/0nEzuwzeLkIsndjVpGKQx+Vg5VPREAt5OH+v2OQusjqZHMkPy3AyrQA3s8scIlDb4kKoMWpra3Hx4kXEx8cr53G5XMTHx+P06dPN2kZubi7Ky8sBAKWlpTh+/Dg6dtTdMHHZsmXw8PBQPkJCzF8hVR2BmkWofpVpc8AGTLPiwdaEA5vqr24SV7nF7M8aBBDx2trLGQCQmlOudRk2fqinEWMarJWo1p7wFAtQXiNtVnHFfxUutKjWnjaTIakPY7oFQSzkIau4Gley9CuwKJcz2PxfBgASf2Pt1iCWPm28ER3iiVqpHD+dyWjRtoora5VVq98e3Qm+rqb/jbTydMb84STwe9nfKQ1adRiDCokUy/9JQe9PDmHMVyfw7PqzGP3lCfT99DBWH7qF6lqZ0fdpLVi1ECooKIBMJkNAgOZdWUBAAHJycpq1jYyMDAwePBhRUVEYPHgwXnnlFXTr1k3n8u+88w5KS0uVj8xMw8zHxkI9a8zc6fOAKmA6WyEkXJ1sK806wEPVL429s2GtW6E+9hcfxMJmw6XmNLRoFlXWKotjdmllX+UDtMHjcpT1lY6mNl1o8vBNIoSGd7LPIHInAQ/xkeScukfPbLpz94rwoKQabiI+JkTbThFODoeDFwaTtitbTmegps7wi/qaI7dRXiNFp0A3s7pOnxvUBm19XVBUWYvNLSgSqo3rD0oxYtUxJB65g5KqOrg78dEhwBVuIj4KK2ux+lAaxn19Ane1FKe1B6xaCBmDPn36ICkpCVeuXMHVq1cxZ86cRpcXiURwd3fHli1b0K9fPwwfPtxMI9WOumvMEndfYkV9mQJFxo2L0LaEkK+LCHwuB3IGysw3VgQEedhGYUhDYKtlp+Y2tAilKMRRiLezXdYP0sZgRSDrufTG08Zr6mQ4dZsUoxwWaZ9CCCDp2QCw71q2Xh3Q/7xE3DJjugXZXEmBR7oEItjDCYWVtThoYOuN4spa/HKWxEe9PbqTWYtsCnhcZTmA74/fNVpPsrN3C/Hkd6eRXVqDMB8xvnu2By4vHokDr8fi8uIR+HpqDALcRbiTX4nJ35+xSzFk1ULI19cXPB6vQXBzbm4uAgMDTbrvhIQEJCcn4/z58ybdT1OYs9u8NpwF5CdSrjDFikW2dfLjcjnwV7g32MrYbIwA20vNHmHbi6RocY2x7rKOAe5mHZMl6aloPXIlq6TRQpNXs0pRXSeDr6sInYPs9/jEdvCDq4iPh6U1uJJV0qx1qmtl2HeNWOIf69HKhKMzDXweF48pLDisoNOXn85koLpOhi7B7haJjxrXPRjt/V1RWl2HXxWCrCXcya/Ai1suorpOhsERvtj9yiA80jVIKfD4PC7GRwVj9yuD0CnQDfnlErzw4wWDKrVbM1YthIRCIXr27InDhw8r58nlchw+fBj9+/c36b4TExPRuXNn9O7d26T7aQr1Ow5LuOOd69312ZpFCAD868UJqYSQ/cV/sHQMIBah27kVDQJiWSEUGWRfxSQbo62vC7zEAkik8kYLTZ6/RyxGfdrYdzadk4CnvJA3x10IACfS8lEhkaKVpzN6h3ubcngmgxVwx9MKNBIomkNNnQybT98DQIpTWuL3weNy8OJg0oJjy5mMBq2D9EEileHlny6htLoOPUI9sW56L52Nl/3dnLDl+b4I8nDC3fxKLN2dbPB+rRGLC6GKigokJSUhKSkJAJCeno6kpCTcv0/U7oIFC7Bu3Tps3rwZN2/exNy5c1FZWYlZs2aZdFxWYxFSS5m3xGnZuZ7wEQttyyIEqDLHchUusYJykkllz0IoVBEIXi6RoqRK8+6NtRLZS7PZ5sDhcNAzjFiFLjZSVoB1nfUKs80LvT6wQuhYMxv0HlEIpvhIf3BttO9aWz9XxIR6QiZn8FeSfvFR/6bkoaCiFoHuThjTLchEI2yaCdHB8BQLkFVcrVdtrPokHrmD1Nxy+LgI8f30Xk26Ov3cRPhqagw4HJJ9xxZktQcsLoQuXLiAmJgYxMTEACDCJyYmBosXLwYATJ48GStWrMDixYsRHR2NpKQk7N+/v0EAtb3C1bAImf/k08AiZIMxJYEe9YSQA1iEnIU8pUuQzfhjYatst7OjQoHNIaq1JwASGKoNuZxR1l7q08b+hdAQhRC6klWCYh1lFlgYhlH2pouz8SByttq4vnFCrDvtsR6tLFLKhMVJwMPkXiSb+eezhmXA3S+swrdHSebb/yZ2afa5sHe4t7Jn3Wf7U+ymppHFhVBcXJyy7YX6Y9OmTcpl5s2bh4yMDEgkEpw9exZ9+/Y1+bisxTWmjmUsQtx6r23PIuQlJrFAxVW1kMkZFFUpLEJu9hsjBKisQupCqLymTmkhCrHT8gG6iFTE/NzM1l5SIKOoCuUSKUR8rt31oNNGoIcT2vm5gGFULkFdpOaWI7u0BiI+F/3b+phphKaBzZi7kFGs7KHYFAUVEqUL0Rrioyb3JkLoRFpBkyJWG1//m4Y6GYPBEb4Yq6d167X4DhALebiSWaIsNWHrWFwIWSvW4hpTx80Cqevieq4xW4wR8nIhfu+SqjoUVdaCYUi8lbfYMYRQZrFKCGUWkQrb3i5Ch8kYY+kcTITQnfwKSKQN06fZ2KFOgW4a2Zr2DGv5utCIuxAAjqQQETCgnY/NZYvVJ8RbjA4BrpDJmWZXG997NRtSOYOo1h5o7295kdzWzxWdg9whlTPYf6N5pWRYMgor8eflBwCABSM66O1p8HMTYZqiKOcPJ9L1WtdacYx/u53g72b+dO/6Jz1bjBHyVLMIsW4xb7HQ7i92rMUnU80ixIqiEEXBRUciyMMJHs4CSOUM0nIbpgAnPyRlBVjB5AiwQc9NlRU4m07iQQZFWH8l6eYwXGEVYmtGNcVhheWDLTtgDYxXuPj2XNUv1mnjqXuQyRnEdvAzuEnsjAHh4HE5OH23UGfRVlvCvq8ELcAaXWP+7uaPaakfI2SLQshLrLIIOUJ8EIs21xgrilo7mFsMIDF2bKbczeyGhSZvKIWQ/ReZZGGF0PUHpTqLDKrHTvUOt49K5Gz/uRNp+U3WUaquleHM3UKN9ayBcQpRdvpOoc5WOvWpqZNhh8IaNGtguMH7DvZ0RryizpahpQisCSqEdGCNrrH2/uYPbq0vfIR82/vJeDo3tAjZe3wQAGWbjQdqDWdZIRTi5XhCCAAiFG4NbV282UKT9lw/qD6tvZzh4yKEVM5orTkFALfzK1BWI4WzgKeMs7J1okM84SzgobiqDrebKBB4+m4BaqVytPJ0tqoEgxBvMToFukHOEEHXHA4m56K0ug5BHk7KauuG8mgMqcm04/KDFqXxWwO2d1VzQJY91g1TeodgXHfzl7Sv7xoT2qA7yVNhESquqlMGR3raeXwQoOqzllcuUWZ3ZCpEUYi347nGACDMhwhAtt8cS1WtVFlws70VXexMDYfDUboCddVXYssNxIR6WjRbypgIeFxlOYWzTbgF2fiooZ38rK62FNtQuLklEH5TNGx9omfrFlfFHtrJD+5OfOSVS3DpfuMxZtaOffyq7ZypfULx2ePdzVrOnUVUzwJkiydCtkhYrVSuNCG7OUCgMOtKraqVKZs0skXk2NpKjka4or8cW0KA5V4BEUZeYgE8xLbVWLildFG4AlnXYH3YcgNRIZ7mGpJZYAPFz95tvB4Oa22J62A9bjEWthbU8VsFTaayl1bX4T9F+5jHjNAjTcTnIa4jOSbNjbWyVmzvqmYmrDFGyBLU73gvsEHXmItaWxC2z5glMvDMjVjIV35O1tpRWEGEoI8DxEhpI9xXZRFSv3Cwwijc134b8eqii9IipF0IsfFU9uIWY+mliHdKyizRuUxBhQT3FNbD3lZYW6pnmBeEfC4KKiRa3b3qHE3Ng1TOIMLfFW2M9DsfHskKIcN6t1kLtndVMxPWGCNkCepboSzd+8wQ+DwunBQ907IVbTZcRY5x188WVcwrrwHDMChUWMR8XOzfNaiN1l5icDhAhUSqPBaAKmaojY/jCqHUnLIGgcNytdihSDurrdS1FbGEZRVX66zFwwaJdwhwhYez9Z0zRHweohWFQi/ca9w9dUhhtYnvbLxixHEd/MHlAGl5FcoWRrYIFUKURqnvClNv+WFLsDVz2D+rI1iEAJXlp6iyFpW1MmXDUR87bjjbGE4CHoI9SHxUhpp77F6B41qEQr3F4HM5qKmTKy2mLJnFVaiqlUHI5xrNimAtuDsJEK6IGbuuKz5KEfvSw8A0c3PAWrYaK4rJMAxO3yFusTgjNov1EAuUMWbnmijKac3Y5lWNYjbULUI8Lsdmewy51BNCro4ihBSWn+LKWhQqMuacBNwGhTIdCW1lBdjgaTaY2pHg87gIVXzu+u4Vtgp3hwBXu6y71UVhFbqmo+3KFYXbzJqFEFsCobEeenfyK1BQUQsRn4voUE+j7r9POKk0fi7ddnuP2d8vm2JU+GrCxxbdYixsRexyRdCwu4MIIS+FECqsrFVzizlmfBBLkCcJFM8plSjnZZeRbLpWno6ZTce6BO/WE0J3C0hqub1m0nVTCKEbDxrGRzGMyi1ozUU2u7UmnyG9sFKZFFGfM3eJtaZHqBdEfOPWgmODzpsqymnNUCGkAxosTeCrucJsMWOMpX47CUeJEWLbiBRX1qJIGSjtmG4xliAPVggR8cMwDPIUweQBDppNx7q90vM1hRBbdyrUTmOnOgQQgXdHSy2h3DIJSqrqwONyLFLDrbn4uooQ4C4Cw5A4L21cULit+rY1fsA3W4YgLa8ClTqEmLVju1c2E0ODpQnqWWO2LITUM8cA22weawisRaioqg6FlYr2Ig4aKM3Clg5gA+fLaqSQKGKn/Nwc01rWxk8hhAo0BYHSZWinlcjZAonpBZUNigKyBTbb+LpYfX81tgRCso7Mv2smLIHg5yaCvxsRYrqKcgLkhuOrw2kYuuIo3vnzmjJe0Rqw3SsbxSzYjWusnkWIzSKzd9j2IsXUNaaEtfrkKgKD8xW1ldyd+FZ/wTMVbZT1lTQLTdp77FRrLzGEPC4kUjkellRrvMde1DvZQLYcWw09WUvrmEqJVOny7Gqi9jGs6zBZR9A5APx89j5WHbyF9IJK/HruPr48fMskYzEEx7gaUAzGXlxj9S9wjnLBY4tJlkukajWEHNsixFp9ChTHg3WL+TuoWwwAghSxUTmlNcr6SrVSObIV7sNQOxVCPC5HWVuqvnvsVi4RQh0DrF8IRSqFUEOLzM3sMjAMEOAuMpnFky3BoE2IAYBUJsc3R24DAHoogrU3nbqnM6bJ3NjulY1iFtRdY7bYXoOlfo80RxFCbHZceU2dsqq2o7vG2Ia7BRWk9UheuUIIOahbDCAXSQCorpMpEwqyiqsgZ0jjZT87LsDZ1peNE9KMj7qvsIaxbkNrpq1ijBmFDYsqspXBTWUNApp2zR26mYeHpTXwdhHil9n9EOYjRmWtDCea2RrE1NjulY1iFtRdY/WrTNsS9VuF1H9tr7gphZAU5TWkzxprJXJUWIuYRCpHZa1M2XbEkYWQRhVyReyUel86a+uxZUxYEXGvXsZcZrHtNChmXZclVXUoqdIsDpmaSyxdpqwMHqEIJr9bUKm11cfuqw8BAE/1CoGTgIf4SFLU8XhagcnGpA+OcTUwAJo1RtCsI2S7PxdHtQi5KbLjKmqkSjN0/cBxR0Ms5MNZ8f0XVkioa0wBG0Seo4ydcoxMulZexC3IugEBoKZOpmxLE2oDgeJiIV9p1atfC4oVeKYsiBniTSq2l9dIlZZnFrmcwek7pMZQvKIlR29FEcgrjbQ3MSe2e2UzMTRrjKBeRM2GPWMNamc4OZhFqLpOhtJqIoTqlxJwRHzdiFWooKKWusYUBHqwQeTkeBQoCnD62rFbDFCVU8hWaxGRpbCGuYr48LSRJrxsQ+GMegHv5uij5yTgIUghmOsH3KfmlqOoshZiIQ/dFe1A2GlqbjkkUpnJxtVcHONqQDEYddcYB7ZrHld3hfG4HLuskqsN9QrabJYUFUKApzMRQqXVtSiuorFTAODvpplNV1DOCiH7Pi6B7qpAcRa2fhKxdNjGeY8VQuoWoepamVLgmbpFSpiPdhcjaw3qHe6ttMwHeTjBVcSHTM4oj7UlcYyrAcVg1OOCbOR8oBV1IeQo1iCAZPqxpQJYk3X9UgKOiLszOQZl1VKUVpPYKWtsqmlOAj2I5YcVBI5mESqsrEVNHbFOqOKDbKfSOGvxuacWMJ1RRJ67O/GVpTRMvf/6AdtsJlmMWmsPDoejFGZ38xsGeJsbx7kiUAxCPX3ehnWQRoyQo8QHsdSvok0tQirRU1ZTR4WQgsB69ZXY8gL2LoQ8xQLljRIbL8a6xlrbQKA0S7BnQxefenyQqS1bbAPb9HqusTQdZQjaaBFuloIKIUqjqPdYtRUTsTbULUKOkjHGUr94JLUIqTLnSquoEGJha8zkV9SLEbLz2CkOh6MWJ0QEEPvZ/d1t57OzQe1skDugaixsjhYpbFB5VrFKCMnlDNLySNZaRD0hFOzJBqnXwNI41hWBojfq4seWqzE7skWo/uelFiGV6CmprkMZFUIAAE9FX7rSKnI8WDFgzzWEWNhAcTZjji0+aktxY2ywf16ZSliwFq5AMwg6ZbC9mrB5UFKNqloZhDyu0mLEwma5sWO0JLZ7ZaOYHVsWEEKeauwiG/4chqAuYLkc2xa0xsJdIXqyS6vBtphyd3ghpBKHMjmjjCljM+zsmSAPTeuE8rPbUKA4W/6hslambH6qyog0fQkE9hjmlkuUfdvY6txt/VwaJKjUb3VjSegZUQe0jlBDnPi2KyDU3WFCGy4MaQjq35uTgGfTLk5jwYqezCLiChHyuTYt9I2Bl8IiVFJVi8JKCeQMSZDwFtuOGDAUVvCwAqhQYQ2zpb58riI+xIpm0qwAUhYLNYNFyM9NBB6XA5mcUVoT2VR+trmtOqxFKIcKIeuF1hFqiC1bEtRdY1yuYwkB9Qt8/cKSjoqL4oLBxlO4UXeh0jUoZ4B7BeQC5iUWOkSpCS8XlRBiGAYFNtqOpr6VhRVEpuoxpg6Py1G6UdnMQ1bksG4zdViRWb8AoyWw/184xWjY8h2zukWI62AWEXUBa8v94owJe+dcWEkuFM5C2/1tGwsnAU9ZcZtNgXaUuCnW6lVcWYvKWhlqpXIAttegmBU8rADKN3OxUJ96ljVWEAVqqU7O/raqamWok8nNMj5d0LMipdnYshDSsAg5lg7SiImiFiGCs5BYgOpkJJZBTIUQAFWckHplZUdAaRGqqlW6xcRCHsRC2/r86gHTNXUylNeQWCE/M8QIAZoNjQGVRShAi0XITa3YK5uwYCnoWZHSbGxZCAl4DmwRUosRcrTSAbqoL3ycbeyCZyrY0gqsa0X9YmXPsC6w4spaZf0kW3OLAaqg6LxyVQ89EZ8LdzN9j6xFiD2G7O9Im0WIz+MqhXYpFUIUW8GWY4TUxY/DCSF115gNB7wbE+d6ol5swyLfmLBCiM2echQhxFZdLqqsVbp1fGywbIC6a0o9UNpcCRKsRaiwQgKGYRp1jQEq9xgVQhSrZ1z3IPC5HEzpHWrpoRgMT80fxnWwXz0Nlm5I/Zgg6hojuIrIcchRCiHHiBFiC2xWSKRKt46PDVqE1IUFGx9kzjpQ7DErrKxFaXUdJIpYK11Za+7KCu9S8wxQB44h9ykt4uupMZBI5TbtGlOPC3I0i5BGVW0aLA1Am2vMdn/bxsRFyFqEHCtGiG1OLGeA7BLy2W2l67w66kKoRGFlMaeLT33/bHyQl1ig89rh4UxdY2alqqoKYWFhWLhwoaWHYnNwOBybFkGAZsq8owkhahFqiFigeYGnFiECK3zYO3RzxZZYGmcBT2k1VroFbVAEsuKtTK1iursZrXrKHn7VdchVxCgF6HCLASrhXSWxrEXIYc6Kn3zyCfr162fpYVAshGaMkAUHYgEcuc+aLhq6xmzvomcK6vehc3UQIcThcJQikLVk2GJPPmXrmKo6lNUohJAZSyBoWKSqmg46Z2/Saupkph9cIzjEWTEtLQ0pKSkYPXq0pYdCsRA8NSHEczAlpP55qUWIIORzwVc7LtQ1RqgvfOoHldszSiGksAjZoghUFyKsu8mcQshdQwg13cNPpEjkqJE6eB2h48ePY/z48QgODgaHw8HOnTsbLJOYmIjw8HA4OTmhb9++OHfunF77WLhwIZYtW2akEVNsEXVvmKO1mFC3hlEhpELdZWjL7WOMSf2YIEfqy8dmyCmFkA1bhKrrZMrGseZ0bypdYzUqIdaYEKIWIQWVlZWIiopCYmKi1ve3bduGBQsWYMmSJbh06RKioqIwatQo5OXlKZeJjo5G165dGzwePnyIXbt2oUOHDujQoYO5PhLFCtHIGnMsHaRpEaLB0koEaj3nBHwH+1HooH6slK3HBuoDK4TKFfEqLjboLlV357GxTma1CCnikWrq5MqstUaFEJ+nXN6SWPybHj16dKMuq1WrVmH27NmYNWsWAOC7777D3r17sWHDBrz99tsAgKSkJJ3rnzlzBlu3bsVvv/2GiooK1NXVwd3dHYsXL9a6vEQigUQiUb4uKysz4FNRrA2uA7vG1D+uyIZrQRkb9R5aAkerqaCD+hZDJweyINa3ANmia0zA40LI46JWJldatswZLK1edyqzmPSr82gk+46tcebwFqHGqK2txcWLFxEfH6+cx+VyER8fj9OnTzdrG8uWLUNmZibu3buHFStWYPbs2TpFELu8h4eH8hESEtLiz0GxPOrXOYdzjWlYhBznDr8pBGrHhc9zrN+ELupbDB3JIlQ/TswWXWMAIFbUgspX1EMy5+fgcjnKuDJWiDXHNSaRUiGkk4KCAshkMgQEBGjMDwgIQE5Ojkn2+c4776C0tFT5yMzMNMl+KOZF3SLkaJc89UBx6gJSoW4RcoQO682hgUXIgYSQqF6cmC1mjQGqKukyOemjZ+5EANa9ymbfNWaRUlmEHNw1Zk5mzpzZ5DIikQgikQiJiYlITEyETGZZpUoxDupiwJEtQnwHcws2hroVSEgtQgAallew5bY6+lL/s9pqxpxYZNnMP2chD6iEMmvMRaR7/zRYuhn4+vqCx+MhNzdXY35ubi4CAwNNuu+EhAQkJyfj/PnzJt0PxTyoW4QYhrHgSMyPRnyUg4nAxlCPC+LTGCEADa0ijmwRstWaW/UD3s1dLLR+kLmzQLe9RRUsTYWQToRCIXr27InDhw8r58nlchw+fBj9+/e34MgotoYjX+fUvT48Rz4Q9VC3CNEYIULDYGkHEkL1LEK2WmrC0u1j9OnjJ6KuMUJFRQVu376tfJ2eno6kpCR4e3sjNDQUCxYswIwZM9CrVy/06dMHq1evRmVlpTKLzFRQ15h94WiZYupoZsxZcCBWhkbWGD0wALTFCDnOcakv+mzVItTAImOhGCFdr9VRusYsHCxtcSF04cIFDB06VPl6wYIFAIAZM2Zg06ZNmDx5MvLz87F48WLk5OQgOjoa+/fvbxBAbWwSEhKQkJCAsrIyeHh4mHRfFNPjaP3F1NFoL+LAgrA+6nFBNHaKUD9rzJEKKtqLRai+8DF3jJA+FilVjJCDW4Ti4uKajNmYN28e5s2bZ6YRUewRRxZC6tYwGiOkQj0uiFqECNQipKJ+zJCtoG4REvA4Zv9tO9ezSDXWx489H1k6btNxfuV6kpiYiM6dO6N3796WHgrFCDjyDb8jF5NsDBoj1JD67iBHqkRePzBcYKO/CXUxa4lgd7HAssHahuA4v3I9oVlj9oW6AHCsnDFNEejIlrH6CGiMUAPUL6JcjmOVmlAXgSI+12Y/u/pv2RIiRKyWLs/h2EaslfWPkEIxArZ6UjMGPFpBWSvqcUG2evdvbNSFkKNZD9WtJ7YaHwRoFk21RC0k9WMnFvBs4txru9+2iaGuMYq9wNVoOGv9JyVzoX7nTOsIEURqLVgcrNxWPYuQ9btzdKFeH8sSgk59//XjhawV+u/XAXWN2TEOdoLn0RghrdAYoYaoXzilcsf6o6hbhGzBnaMLSwt89f3bynG0jVFSKBSDoZWltUOzxhpiyy6hlqLuHrWVC7g21F1jlhD46vu0FZez7X7bJoa6xij2gvpNIa0jpEKofsGgxwWAY1sM1f8btiwI1TP9LPF9qosfW/k92e63bWKoa4xiL/BoZWmtUIsQRR31a7YtW4Q0kgAs7Bqzlf+VbYySQqEYjPqdLu01pkLThE+Pi6Oj7kK2ZYuQwMKZf+qta2wl9s52v20KhdIsaIyQdgQ2eMKmmA71/4ktC2NL/64F6uU6bOTGyzZGSaFQDEajxQb9xytRv0RYwoVAsS7spQK7wMI99DRdY7ZxHOm/Xwc0WJpiL6hbgWgdIRVcWmiSooa6FraFIoC60LQImf8Sr1GWwkZuMGxjlBaABkvbL4yDFRJSP6fb8p2usRnbLQhtfV0wMToYLiLbKPxGMR2aLmQLDqSFaNYRsqxFyFZuMOi/n0Kxc9TFD02fV9G1lQf+XRhn6WFQrASunVhONVxjFrAIWVqIGQK1CFEodo5GrzEbOTFRKOZGXTPY8g2DpYUI38JCzBBsY5QUCsVg1M+FNGuMQtEOR8MiZMGBtBCBhQsqCmmwNIVCsTY0TP62fIanUEyI/WSNWVaI8Gn6vP1As8Yo9oJm+rztnuApFFNiL9mVlm5xwacxQvYDzRqzXxjHShqzmyBQCsWUqP81bPl/Yunu80IbzBqjQohCsXO41CJEoTSJvfxPaLC0/tjGKCkUisGom/xtxVRNoZgb9f+JDRuE4CSwbEFFddecwEbON1QIUSh2jrp13JZN/hSKKbGX7EpXteKgligea+nK1oZgG6OkUCgGo5k1ZsGBUChWDMdOYunUq6RL6uRm3z8NlqZQKFaHhskftnFiolDMjXpckA3rIA2LjEQqM/v+xQKe8rmt5KVQIURxOBwua8xG7sooFEtij3+TGgtYhDzFAuXzkqpas+/fEKgQ0gGtI0SxF9RP8LZ8p0uhmBKOnQRLq1NTZ36LkPpxLKqsM/v+DYEKIR3QOkIUe8GWU4EpFHNhj/8TSwghdYoqJRbdf3OhQojicLT3d7X0EMwKVyNGiEKhaMMOdZBFXGPqqAduWzNUCFEchj/mDsCcIW2RMLS9pYdiVuzxTpdCMTaamWL28Z9p5eVskf1ufq4P+rf1wUcTu1pk//qit1yrq6uDs7MzkpKS0LWrbXxICgUAeoZ5oWeYl6WHYXbUT/BCPr33oVC0Ycsp8/XZ9mI/bLuQiXdGd7LI/mM7+CG2g59F9m0IegshgUCA0NBQyGSW9T1SKJTmweNyMDeuHcqq6xDm42Lp4VAoVok9GU77tvVB37Y+lh6GzWDQ7eF7772Hd999F0VFRcYeD4VCMQGLHumETx7tZulhUChWiz1ZhCj6YVAk05o1a3D79m0EBwcjLCwMLi6ad5mXLl0yyuAoFAqFQjEHXDspqEjRH4OE0KRJk4w8DAqFQqFQKBTzY5AQWrJkibHHYVLCw8Ph7u4OLpcLLy8vHDlyxNJDolAoFAqFYgW0KMn/4sWLuHnzJgCgS5cuiImJMcqgTMF///0HV1fHqh9DoVAoFAqlcQwSQnl5eZgyZQqOHj0KT09PAEBJSQmGDh2KrVu3ws/PdtLmKBQKhUJRh4YIORYGZY298sorKC8vx40bN1BUVISioiJcv34dZWVlePXVV/Xa1vHjxzF+/HgEBweDw+Fg586dDZZJTExEeHg4nJyc0LdvX5w7d06vfXA4HMTGxqJ37974+eef9VqXQqFQKBSK/WKQRWj//v04dOgQIiMjlfM6d+6MxMREjBw5Uq9tVVZWIioqCs899xwee+yxBu9v27YNCxYswHfffYe+ffti9erVGDVqFFJTU+Hv7w8AiI6OhlQqbbDugQMHEBwcjJMnT6JVq1bIzs5GfHw8unXrhu7du+v5qSkUCoVCodgbBgkhuVwOgUDQYL5AIIBcrl9vk9GjR2P06NE631+1ahVmz56NWbNmAQC+++477N27Fxs2bMDbb78NAEhKSmp0H61atQIABAUFYcyYMbh06ZJOISSRSCCRqBrFlZWV6fNxKBQKhUKh2BAGucaGDRuG+fPn4+HDh8p5Dx48wOuvv47hw4cbbXC1tbW4ePEi4uPjlfO4XC7i4+Nx+vTpZm2jsrIS5eXlAICKigr8+++/6NKli87lly1bBg8PD+UjJCSkZR+CQqFQKBSK1WKQEFqzZg3KysoQHh6Odu3aoV27dmjTpg3Kysrw9ddfG21wBQUFkMlkCAgI0JgfEBCAnJycZm0jNzcXgwYNQlRUFPr164fp06ejd+/eOpd/5513UFpaqnxkZma26DNQKBQKxbagBRUdC4NcYyEhIbh06RIOHTqElJQUAEBkZKSG5cZaaNu2La5cudLs5UUiEUQiERITE5GYmEh7qlEoFIci3EeMe4VVaOVpmc7lFIq5aVH3+REjRmDEiBGmGBcAwNfXFzweD7m5uRrzc3NzERgYaLL9AkBCQgISEhJQVlYGDw8Pk+6LQqFQrIUfn+uL747fwYuD21p6KBSKWdDbNWbO7vNCoRA9e/bE4cOHlfPkcjkOHz6M/v37m3TfiYmJ6Ny5c6NuNAqFQrE3Qn3E+PTRbgj3dWl6YQrFDrB49/mKigokJSUpM7/S09ORlJSE+/fvAwAWLFiAdevWYfPmzbh58ybmzp2LyspKZRaZqUhISEBycjLOnz9v0v1QKBQKxbrg0JKKDoXFu89fuHABQ4cOVb5esGABAGDGjBnYtGkTJk+ejPz8fCxevBg5OTmIjo7G/v37GwRQUygUCoVCoeiLxbvPx8XFgWGYRpeZN28e5s2bZ7R9NgcaLE2hUCgUiv2jtxCSSqXgcDh47rnn0Lp1a1OMySqgwdIUCoVCodg/escI8fl8LF++XGtLCwqFQqFQKBRbwuDK0seOHTP2WKwKmjVGoVAojgktqOhYGBQjNHr0aLz99tu4du0aevbs2SBYesKECUYZnCWhrjEKhUKhUOwfg4TQyy+/DIA0RK0Ph8OhAcYUCoVCoVBsAoO7z1MoFAqFQqHYOnrFCI0ZMwalpaXK15999hlKSkqUrwsLC9G5c2ejDc6S0BghCoVCcUzCfWhVbUdCLyH0zz//QCKRKF9/+umnGtWlpVIpUlNTjTc6C0IrS1MoFIpjsfXFfng5rh2e7Rdm6aFQzIherrH6hQ+bKoRIoVAoFIqt0K+tD/q19bH0MChmxqD0eQqFQqFQKBR7QC8hxOFwwKlXYKH+a3uBxghRKBQKhWL/6O0amzlzJkQiEQCgpqYGL730krKOkHr8kK1D6whRKBQKhWL/6CWEZsyYofH62WefbbDM9OnTWzYiCoVCoVAoFDOhlxDauHGjqcbhsIiYGuDiJqDzRMDJEzi+AshPASauAQTOlh4ehUKhUCh2DQ2WtjDjJXuA3fOBb/oDd48ARz4Grv8O3Nhp6aFRKBQKhWL3UCFkQQJRiMnV28mL8mzg3knVm7f+brjCjZ3A3oVA1gWzjI9CoVAoFHuHCiEdmCNr7IzTK3BBlWrGvVOq53kpmgvf+gf4bQZwfh2weTyQbx+FKykUCoVCsSRUCOnA1JWl+ZKShjPzbqqeF90BZHWq1ydWqp7XVQFHPjHJuCgUCoVCcSSoELIQLiU3G86UqPq4QS4FSu6T5+U5QOZZABxg2g4y7+YeoCLP5OOkUCgUCsWeoULIQnBltU0vVJ5DpuknyDSoO9BuGBAcAzAyIO1g83YmlQBn1wJ/zAYOfADk3zJs0BQKhUKh2BlUCFkIDiPX/aZvRzKtUAih7CQyDelHpu2Gk+ndo03vqKoIWDcM+Pst4Np24L+vgG8HAOfXGzJsCoVCoVDsCiqELAUj0/2efycyZS1CudfJNLArmbaNI9O7R4HGGt8yDAmwzr0OuPgBsYuIiJLXAXsXAEm/tOQTUCgUCoVi81AhZCE4ugSMyANwb02el2eTKZtB5t+ZTEP6AHxnoDIPKEjTvZPknUD6cUDgAkz/Cxj6LvDsH8CAV8n7exY0zE6jUCgUCsWBoELIQnB0WYScPAAXX/K8qgioq1G5yLzakClfpLIO5V7Tvh2GAY58Sp4PfBUIUIgoDgeI/x+JNZJWA3+/2bhViUKhUCgUO4YKIUuhSwjxRYCzJ3leUwqUPSDPBWJA7K1aLqALmeZc176drPNAwS1iDeqfoPkelwuMWw3wnYjF6NY/hn4K7cjlwP2zwMkvgH1vAv+8B5xbR2sfUSgUCsXq0KvXmCORmJiIxMREyGSNxPK0AJ2uMb6I9BwDgOoSVQq9Rwix5rAEsBahG9q3c+VXMu08ARC5NXzfKwzoOwc49SVwYgXQYZTm9g2BYYCbu4FDS4Ciu9qXadUTGLQA6DS25fujUCgUCqWFUCGkg4SEBCQkJKCsrAweHh5G375O1xhPoGYRKlHFCbkHay6nFEJaLEIMA6TsI8+7PaF7EP0SgDPfEetR5jkgtG9zh98QaS2w53Ug6SfyWugGtB8OeLcFZLVknPdOAQ8uAtueAdrHAxO/AdwCDN8nhUKhUExDXQ1QeJuEZkgqFN4Kb8CvA+DsZenRGRUqhCyFrvR5Xj2LUGUBee7ip7kcG/NT9oC40JzUxBr74+WJgLCBusfgFkCEUtLPwKUfDRdCsjpg61Tg9iGAwyUWn0GvAyJXzeUq8oEz3wCn15Bl1w4GpvwKtO5p2H4pFAqFYhwYBnhwCUjdR87POVd1X6e82xFvQ/cpqixnG4bGCFkIDnT8wPhClaipKQGqWCHkq7mckwcg9iHPWfcZS/pxMg3pAwicGx9IjxlkeuNPQFLerLFrwDCkRtHtQySO6enfgOEfNBRBAODqB8QvAV46CfhFAhW5wI8TVOOlUCgUinmRSoALG4HvBgM/DCOhEtlJRAQ5eQIB3YDQ/kBwDxKiAZAWUCe/AL7pC2yfDhSlW/ITtBhqEbIQul1jIpXZsbYCKM8lz1nRo45nKFBVSIRQYDfV/AxF89bwwU0PJKQPUfdFd0jQdGOuNG3c/Au4sAEAB3h8PRAR3/Q6fh2BFw4RF9ndo8AvU4BZe0nFbGtAVkdceTnXgdIsoLqInBT4ToBbEOAVTo63V5ilR0qhUCiGIZcD134D/v0YKFXcTPOdgI5jgIiRQNtYcr6rH8tZVQSkHwOubANu7QeSdwFph4DRnwE9ppv/cxgBKoQshU7XmBAQqllTSjLItL5FCCDq/OFloCRTc36OIqW+VTNcThwOMXGe/IKIGn2EUE0psO8t8nzwAqDTmOavK3IFnt4O/PIUEUM/PwXMOdYwFspcyOXEqnXlF+D2YUBS1vQ6HqFAuzig+2QgdADJxqNQKBRrp/AOsHOuoocliODpPw+IflozO1kbYm+gy6PkkXuDZAZnnAL+eoVkKscvtblzIRVCFkJniw2+kDy4fNJ4tTSLzNdlEQI0XWNSCfmRA6o4oqaIVAihtIMkQE7g1Lz1jq8gsUjebYEhbzZvHXX4IuCpLcCGR4C8G8AfL5DCjzwz/iwZhrgF//2EWMVYnDxJbzfvduTYc3lAbSWJySq8A+Qlk7uoSz+Sh2cYOZH0mN7840ehUCjmhGGA8z+QnpPSapLUMngB0PclQCjWf3sBXYAZe4g77cgnwH9fA+AAIz8y+tBNCRVClkLdNebfhQgBgLjGABJvIylTtdlw0pK5xgqhUjUhVJBGtu3kQVR+cwiOAVwDSMxO5lliEm2KygLyhwKAUZ82HYukCyd3YPIWYO0Qcldx8gsg1gBRZQjF94Adc4H7/5HXIg8g5lmg62PEH97YXY2kArh/hlTvvrGTWO7+fhM4uYpU8I5+1ubuiigUih1TV6NorfQzed02DpiwBvAMadl2uVwg9i1yvflrHuln6RkK9Jnd4iGbC4cQQunp6XjuueeQm5sLHo+HM2fOwMXFxaJjYusIHRcMxpCokcDBD8gbfCGZskJIXkdeC7UEH2uzCOXdJFP/zs2v08PhkD/F1W3ETdUcIXR+PVBXBQRFAR0ead5+dOHTDhi7CtjxInD8c6DLJMA3omXbbIrkv4Bd8wBJKWlXMuh1UnhSW5C3NkSuJB4qIh4Y/Tk5uZz8gliM/nqF9HEbt9ouMioAADIpEesPLhKLWFE6+ay1FUQUMjJyHAVOgIs/4NGanGADupDfiFcbWjeKYnkYhtzwFaWT82Z5NrH01lWR9wRO5KbONZCcX73CiLXX1n+7VUUkDCHrPMnsHfEROd8Z83P1mEaSew59CPzzLhDaTzN21YpxCCE0c+ZMfPzxxxg8eDCKioogEoksPSRlsLQcXOJ2YeGxQqiehaVRIaQWI5SXTKb+kfoNqO1QhRA6AmBJ48vKpMClzeR5/3nG+TN1fwq4tp3E6ex5HZix23Qnn3PrgH0LyfPWfYDHf2hZ4LNQTO5+ekwn2z7yKXD/NPB9LDB2JbEy2SIVeUDKXiBlD7F+1VY0b72CWw3nOXuTti4RI4D2IwAXLa5eCqG2kvynq4uA2ipy3BkZCWTlO5ECqW5BgFsgqTtG0Y1cTtLAbx8EMs+TmMrKPP224eQJtO4FhPQDOj5CarjZkjCqLAB+nEgSQJw8gSc3Ae2GmmZfA18jXQVu/Q38MRt46YRN/EbtXgjduHEDAoEAgweTDCpv7yYCwcwFK4Q4HBIPxMK6xoT1LFbaLBWs66u6iBQ05AuBYkUao097/cbTZgiZZl8hJ+L6+1fnzr/EGuDsTeKLjAGHQ6xCiX2AeydIvFKHkcbZtjr/rQEOvEee934BeOQz4/1R+SJgwDyg80Rg93zgzmFgVwIRRWNXkfetHYYhGSHn1gGpf2u6cEXu5ILgFwl4tyFWH5E7+W1yeCQ+ra6K3HGXZpK77uwrRJxXFwHXfycPLh+IGEUCMzuMsokTpUlgGOLKzjxL0pUfJpH/b1VhMzfAIecA1uoWFAWEDdCeWOFIMAzw8BKxyt7cTX6P6nB4CotlKODeivx+BWJyDqqrAeoqSUhCyX2gOIOUMbl9iDyOfEzWi3qaWEA8WlvkIzabinxg8zggP4VYamfsNq2VmsMBJq4h5/H8m8DFTTbhIrO4EDp+/DiWL1+OixcvIjs7Gzt27MCkSZM0lklMTMTy5cuRk5ODqKgofP311+jTp0+ztp+WlgZXV1eMHz8eDx48wBNPPIF3333XBJ9EP1jXmBxcYqpk4ethEXLyVAVVV+YDHq2AMh2VqJvCoxU5KZQ9IHdN4YN0L5u8i0y7Pm7cwGD1th+HlpDK1OrWspZy7XeVCBq8EBj2vmnu7DxDgGd+B06sJAGEl38iQe+Tf9Le7sQaYBgi3P79mHz/LMExQOR4kk7r39mw70NaCzy4QMRt2gFyZ5q6lzw8QhRB5tMaF9/2gqwOuHMESNkN3P4XKMvSvpzIg1jNhK7kweECMgkgrVH0IMwmbvPyh+Rx+6Bq3cDu5L/T5THimrAl60VLqKshrYXOriUXYRaBC3H9txkCtOpBjklzYxqliqr4Dy6SG8A7R4hAOvYZceN3ngTEvU1KglgbtZXEHZafQgTzjN2mDzkAiBCPe4dY3Y8uI9Z+bTGuVoTFhVBlZSWioqLw3HPP4bHHHmvw/rZt27BgwQJ899136Nu3L1avXo1Ro0YhNTUV/v7+AIDo6GhIpdIG6x44cABSqRQnTpxAUlIS/P398cgjj6B3794YMWKEyT9bY2i6xtQtQmoxQupou0hwuaTidHk2Mfd6tALKHpL33AxIQ2/VkwihrAu6hZCsjlzAAGL5MDaDXid3EXnJJJ2/y6PG2W72FWDny+R5vwRS9NGUcLkk6Ds4hhQcu3sU2DwBmL7T+k4KRXeJO/LuUfJa4EKsNb2f19/Fqg2+kFgqwgaQgpq5yeSCdeVXYjnavwg49n/kgtLrOfu0EOXfIskF1/9QFUkFiAW4dW+gVQwQFE0uqB4hqjY7upDLyXaK0onrJ+cqkHWRxHGxr09+Afh1AqKmErdtU2nRtkpdDXB+HbH2ViiSS/hORMB3nwK0GWy4NZYvJOKpVQ9i2aitIu7iS5uJ5frGn8CNHeT/MmKp9Vjj5DLg9+eJZczZm2R2+erpJWgJPWcSQVqYRurMDXrdfPs2AIsLodGjR2P06NE631+1ahVmz56NWbNmAQC+++477N27Fxs2bMDbb78NAEhKStK5fqtWrdCrVy+EhJDI+DFjxiApKUmnEJJIJJBIJMrXZWXNqCdjCIr0eUZnjJCaEBKIdd+Ju/gSIVSRT06OunqTNYfWvYn4yDqve5n7Z4DqYkDsSy5sxsbZi6RyHvs/4NRX5I6rpXe0tZXkpCCTkMBuc6Z2RsSTO7GfnyAnpV+mAM/+YViqqrGRy0m7kyOfEEsDT0TchYNeJ1XATUVAZ/IdDH2XuC/++4pk8P39FnHJjV1B7uDtgXunyOe7tV81T+xLMhMjRpH/kCG/BS4XcPUnD/XWOOW5RNCm7CEFUvNTiHX16GdA9FRgwCuk3IU9wDDkfHXgfVXCiHsrVT2cpsSkIQjFQPcnySP7KjlPpewhyRKp+4CRn5B9W9oKd+xzEqfDEwFTt5pXBAHkZmbwG8DOl4gg6peg8nZYIVad31tbW4uLFy8iPl5VrZjL5SI+Ph6nT59u1jZ69+6NvLw8FBcXQy6X4/jx44iM1H2Xu2zZMnh4eCgfrIAyNmwdIVl9ixB756J+ctTmFmNxIVYxVOaR2AJ5HUjsQKD+g2ILMGZf0b0M2w6j3TDjuq3U6T2b/IEfXiLxNS3l8EfkzsQtGJj0renGrYvWPYklSORBUvV/n0Xu2CxJdQmw9WmSrSitAdrEAglngEc+Na0IUkfgTKxO8y4C474gAqEwjQR27p4P1JjoJsQc5CYDPz0BbBqjEEEcoONY4jJ9IwUYs5yIZGMLYrcAIGoyKUnxZhpJjw7sRmrGXNgArOlNCuBV5Bt3v+amJJP8TrZPJyLIvRX5rK8mAf1fNo0Iqk9Qd2DKz8Dzh0gAdXUxsOtl4PfnDGtXZCxuHyYCDQAmfN2yZtotoevjJPuuPJuIRCvGqoVQQUEBZDIZAgI0O5QHBAQgJyenWdvg8/n49NNPMWTIEHTv3h0REREYN26czuXfeecdlJaWKh+ZmZk6l20JStcYp75rjK0jpObDbix2gi20WFVEYgUA4i4zxL3AukFKM3VfhFghxAZXmwJXP3L3CgDnvm/ZtnKuAefWkueTEi3nHgiKAp7ZTkz2t/aTWBxLUXAbWDdUdcc4bjUwfZflLAU8PnGJvXqJWKQA4h5dO5jcddsSknJg7xvAdwNJ3A6XD/ScBcy7AEz9hWTNmcv15+RBYq/mnCCukXbDSDzhue+Br6KBM99aXpDrC8MASb8C3w4gQf18JyB2ETDvPPmslrA6hPQGXjwKDF9Cvu8bfwLrhpFAa3NTWQD8+SIAhrinoiabfwwsfKHqPH7lV8uNoxlYtRAyFqNHj8a1a9dw/fp1rFq1qtFlRSIR3N3dsWXLFvTr1w/Dhw83zaCUrjGOZrA0e5Lkqf2hGwvsY+98akoMD5RmEXsTBQ8A+akN35dUkKBXgPjdTUmv58g0ZS8ReYbAMKQFCCMnLrZ2w4w2PIMI7UfuWgFSePHGDvOPIfsqsPEREhfkEQo8/w/Qa5blTfkAuXCPXUku2h6hxF22fgRxn9kCtw8D3/QnsUCMnGRUJpwDxq82v2tCHQ6H/F+n7SCV24NjSEr+/rfJ8dX2X7dGpBJg96vE3SIpI6Uv5v5HXKyWDrTnCUiF5ll/E+tUwS1ybM0t5P9eRGLH/DuTjFhLE/U0maYdJCLNSrFqIeTr6wsej4fcXM30x9zcXAQGGuD60YOEhAQkJyfj/PlG4mVaANt9vkGwNOsa46rdNTZ2B+nkSaY1pSTQGWhZvy7WKsTWI1In+wq5o3RvRRqPmpKgKNL1WFZLAkwNIf0YcUXxnYBRnxh3fIbS/UlgwKvk+e75QOkD8+075xpJpa3MJ5lFs/+1nka36rQZTPrORYwkbrudc0mMiyLT0uqQy4DDS4GfHiPWVM8wIjgmbyHFQq2JtrHAC/8SK6DInWRDfR9HrCzWTHkusGksaWfD4QJD3yeiw9qOb0gf0lDavwtJ2/9xAnGTmoPUv0l5Cg6XpLAbWu3fmPh1IOcaRkYyRq0UqxZCQqEQPXv2xOHDh5Xz5HI5Dh8+jP79+1twZEagqYKK6uKH24gQYi1C1SWqehmGxAex+Cv6k+WnNHyPjR0KijZ8+/oQ8wyZsiXh9YFhgKMKP3nPmdZV72P4EhKPVVNKYgrkOvrOGZPie8BPj5N9hvQFZu4xXyyQIYi9ganbVD3sji4jmW3W5sqpKgK2PEpKJQBAr+eBl083rzq7peByiRUw4SwJSq+rIlaWv14lWaHWRnEGsGEUSeJw8gCe+Y1kZJqzJ6E+uAcDz/0NtOpF4oZ+nKjq/2gq6qpJ7BdAgsWb03DbXHRUJEOl/m3ZcTSCxYVQRUUFkpKSlJlf6enpSEpKwv37JAtgwYIFWLduHTZv3oybN29i7ty5qKysVGaRmYrExER07twZvXv3Nsn22WBp3RYhLeJIG0qLUInKhaStQWtzYYttsa061MlOItPgaMO3rw/dniR3Nw8va7YRaQ6ZZ4k1iCcEBs43zfgMhccHHl1LWlLcPQpc2mTa/dWUkcDdilxyp/r0dutL4dcGl0tqPY1ZAYADXNwI7HnNeixDpQ+AjaOJ5VEgBh5fD4xbZXk3TXNxDwae/ROIexcAh6SE/zqFuMCthYI0coyL04mlbfYRoH180+tZGicP4NnfiVW7Mo8cV1MG/5/9jlgj3VsTV6E10WEUmd751zqFNqxACF24cAExMTGIiSEm+gULFiAmJgaLFy8GAEyePBkrVqzA4sWLER0djaSkJOzfv79BALWxMblrTJcQYkVPc11j6hahmhLynBVHhuDVhky1CQ+lRSjK8O3rg4svKWsPAKn7G1+2Phc2kmm3p1rmKjQVvhHAcPIbx+GPyJ2jKWAY0vusMI24NJ/93TwZNcakz2zSBoXDJa6RA+9bXgwVpAHrR6qK1b1wCOj2hGXHZAhcHhC3iKRYC8SkevKmMYbH5RmTkkxSe6vsAamH9Nx+63OFNYazFzDtT1XM0I6XTGP9rSwATihiX4d/YB0uMXWCYkgto9oKq01+sLgQiouLA8MwDR6bNm1SLjNv3jxkZGRAIpHg7Nmz6NvX9OmAprYIKYOlOfWDpbW4xpprEaouIc9bcqFTdrTP1PzT1lWrekgFdjd8+/qiNKvqkX5ZXUy6wgPEBWCt9JlN2lVUFwFHlplmH+d/IMeCyyc9hqxRFDaHbk8A478iz0+vIbV5LEVxhuICnQX4RADPHyBtLmyZjo+QIHWxL7nh2TJJdT6xBFVFJOaq/CH5j8zcZ5u/XVd/4Kkt5Byeuhc4843x93FiJQkeD+xObvysDS6XJIoAxEpvhVhcCFkr5rMI8VrmGmN7kNVWGsci5N6K9OKR1aqqtAIkxoSRk1o4LYlB0pdOY8n03kkS39Icrm4nQbYBXa3LV14fngAYrcjsOP+D8bN3iu8BBxQVtEcsJYGctkyPaaRgHQAcXAKkHTL/GMpzScxH+UOVlYK9ebB1WvcEZu5ViaGfnyA3QOZGKiGupIJbCivmH7bdpLd1T1UG1+Glxv2fVxaorN/xS4josEaUQuiMZcehAys9avYPW0dI1iBYWlvWWCNBgUI1IWQMixCPT1p1AJruMTbYz6eteVOtfdqRu255naoFRFOwaekx06wjLbwx2sYBHceQ4PljnxtvuwwD7FlACumFDwb6vWy8bVuS/glAjxkAGOCP50gZAHMhlQDbniXxKl7hwLSd1tNSwVj4dyI1pZw8SXCyqdw5jfHPuyTGz8mDxDCx5yNbptdzQLvhpLr9rnnGc+2e/Y78x4OiyfatlVBFctP9M5Z3a2uBCiFLoV5HSCNGSCGAtMUNaYNtxWEsixBAghIBTSHEXnAsUXSv3VAyvXey6WUr8lV3HZG6C2daFXGkVQyu/0F6UhmD63+QJqpswURrF4TNhcMhVZlb9yEWwj/nALKGfQaNDisss86pLtDuQabfryUI7EoqJnMFxK16zIz1aK5uJ9ZRcEjwuSk7pZsTDodUeRa4kN/Q1e0t32Ztlarg7OAF1v0fD+xGQkCqClTZzQrac7IQJMsmDW4tBBVCOrB41lhzY4TYDBVGRurDAC3PCGKFkHplVEsKIbYBbHOE0K2/ATDkDsmaUuYbIyiKtF8AA5xa3fLtSSXAof+R54PfsGwxP1PAFwFPbCB1cLLOGeeYNcWVX4Gkn8jJ/ImNthW0awjhg4DxX5Lnxz5vvjW2JZRkErEJALFvkSrc9oRHK2DIG+T5wcXk5rUl3PiT3Ax4hgGdrPymT+Csunbk3tB4a7nge2wsfxFI+8cCAyNQIaQD08cIqdUR0hYsrc1KpA1tqbotTd9lYx5KtAkhC1wAwgaSaV5y09VJUxRB1Wxska3Adme+9nvLK7Be3ASU3idVwge80uKhWSWeIcQyBJAaQ/VOrkal+B6pUA6Q1OT2VuyCMCYxz6jckH/OMW1lYIYhVaNry0mdq9hFptuXJemXQIRLRY4qtsdQ2PV7zTJ//0RDYGvU1SvWG8hRZChaMBieCiFLwVqE6vcaUwZLq81rrKAil6eKK2JR71xvCKzJX92EaUmLkIsv4NuRPM+6oHs5qQS4e4Q87zjG9OMyJq17ESuWTELquRhKXQ1wfAV5HvuWdXS5NxXdJ5M7YblU0UrFBLEHcjmwY67iAt0PGLTA+PuwZh75jPz3KnKAvSb87Jd/InVm+E7AxETbuLAbgsAJGLKQPD/1peHB6DnXSLsjrgCIftZ44zMlbGaleqVtuRR+KCHP3S0XC0aFkA7M6hprSfo8oGkB4nBVYspQ2H5j5YqsMbkcKFM0dPUMadm2DaVVDzJ9eEn3Mg8ukWwxFz/bS2fmcIC+c8jz8xsMD1C99hsp4ObeGugx3Xjjs0Y4HOCRZaQwZcZJ4iowNld+JSm/Ahfg0e/s9wKtC6FYUcOJByTvIj2jjE1NGXDoQ/J86LukxpY9030K6aVXmUcEoCFc3UamncZYd4V4ddhzcp7KeiusKQCfI4cUPHLethBUCOnAXOnzDDjKdhsA9HeNAZpCSODS8qA5V38yrcgj0+oi1Rgt9WMNZoXQZd3LZChiiMIGWHfgoC66PEbKE5RlARmn9F+fYYDTieR5v5fM1+XckniGqtyKBz4gFjFjUVOqukDHvgV4tzHetm2JoO5Av7nk+d43jJ9Sf3IVCaL1aW8/2Y2NwReqXNbn1ulvyWQY4MZO8ryrDRXx9FHEKhbfU84SVpGb7UKOt0VvMqgQshTqMULq/ZO0ucaasgipu8KMUVXUVVG1uzKPjI0VRM7elru4shahB5d0nzgyFMW6wgaZZ0zGRuAEdJ5Anl8zIKvk7lEg/yYpqWDv1iB1Br5KLGBlD0h8lLE49jn5DzjKBbox4t4mrouSDOC/NcbbbnEGcFpRZHDkx44h3gEgajK5aS1I1f+mJ+sCKXgrdLWtgHIPhTehplTZbkRYTRJ8irlelhoVACqELAbbfV4GrjJeCIAqHkjDNaaHRcgYMSGs1YeRA1WF5GIAqCxFliCgKxGHVQUqN506crkqfogt3mWLdFdUhk3eRWKe9OGKooN498m20UvMWAicVdk4J1cZx2JR9pDcrQMkTobfxM2IvSNyI0U5AVLV21gtOE6sIHFx4YOBDo8YZ5u2gJMH0P1J8vz8D/qty9ZJ6zja+tppNIbIlbQdAYiQAyCQkNZCpRx3S40KABVClkPpGuNqXrTYyqD6uMb4TqrnAiM0fOTxVWOqKlJZhCzow4XASRWonZ/S8P2Se6TMPE8E+EeadWhGJWwQ4BZM7ppuH27+epJy4OZu8jz6adOMzZqJfpbEXVTkGh53oc7J1eQCHTrANpp8moMuj5EbEkmZcUoWlD4AkhTifdj7tunObgk9Fe1/Uv/Wr9HtLUXfxcgJxh+TqWGtQiVECPEVQqiMCiHrxGzB0hwuCQ4c+Qnw2DrVAlw9gqXVhZKx7hCcvcm0ulglhFiXmaXwU2SOsT3P1GGb+QV0tm3zOperKgSZdqD5693cDdRVETeONbcVMRXqcRdn17asGnJ5rsrFFve2412gdcHlEsECAOfXt7wX2ek1pGJ82EDbtuIaSlAUubmT1qjETVMU3wOK7pDg9bZxphydaVDvZQk1ixCXCiGrxKx1hABgwDyVWwRofq+x+u8bK11azAqhIutwjQGktxOg3SKUfYVMzdkQ1lS0V/j9bx9qfiDl9T/ItPsUx71wR08lRRYL00gqtqFc3EisQa37AG2GGG989kCHR8j/sLaiZWUeJBXApS3kORvs7mhwOEDnSeQ52yS6Ke4oyoOE9AGcLCseDEJpESJdCwTUIuTgKNPndVy01K0a6m4yrcuqCSFjuMYAlUWoqoi0rQAs6xoDVLWEtDUtzFFYhILsQAiFDyLuztJM7aKvPrWVQPoJ8jxyvGnHZs2I3IAYRU0VtvWAvkhrgQsbyPO+cxxXVOqCw1FZ3s58B8jqDNvO9T9IbSbvttbdI8vUdJlEpmkHm+ceYwV+u2EmG5JJYcuvlFLXGAX1us9rQ9011pTy52kpyNhS1C1CbGFFi1uEWCGkRRyw7jK2eqktIxSr2oo0p25L+nFiwfAMVR0jR6XX82R6+5DKpasPN/8iv3fXQKDzROOOzV7o9iS5KSp/qJ/7Vh1WbPacZb0d081BYHfSwFdaA9w70fiychmQfow8t1UhxLY9Kn0AABBISNA9DZZ2UFjXGKPLIqRuBWoqNkfdImSs+Bg2ur+6WM01ZuEYIba/U3UxCSZmkUqA0izy3BItQEwB6x5jK2U3BnsxihhJLRi+ihgpRqZyF+pD0i9k2nOGbceamRK+CIiaQp4bEpiecw3ITiLnrehnjDo0m4PDUYmaO0381/OSyXlP6AYEx5h+bKaA9SpUkXYtStcYjRFyTApCHsF66Whk8nRUauYZKISacqM1F5HihykpVwVFOlu21gOELiqXnSLrAAAJIGTk5ARhaauVsQgbQKaZ5zXrTNWHYVRWo4hRph+XLdBdcZFmq+82l4o8VXPR7pONOiS7g23rcOsf/S1vbPp3h1GAi49xx2WLKIVQE3FtWYp41dY9bbfCOSuEKgsBqFxj1CJkpZg6ayw7Yio+kk5DGl9HOXmZVPW8qYu7PvFEzUXkSqaScpIuC6jEkSVR+pizVPMK75CpT1v7sYgEdCHCrra88YaixenE384Tqtxpjk7Xx8j/4OFl1W+jOdzYSSxJrXraf3f5luLfSWV5u/Z789djGJUQ6vKoacZma4QPJq2RCtOAsmzdy2WyQsg01ySzIFYIX0kpUFsFQS2x7NMYISvF1FljTaJeZLEpAcI1hRByI1NJOXkA1pGl4KEZbAeApJMC9uMWA8gdX4jihJd5Vvdy98+QaXCMfTdY1QcXXyC0P3muTwzLtd/ItNuTxh+TPcIep5S9zV8n5ypp4Mx3phZMFmdPwF/RhyvrnO7llBahPiYfkslw8iSp/wARfgDkDAcVHFfLjQlUCFkvrXsBPWYAoz5t2sphCteYUCGEKnJVoowVR5ZEmxBSWoTsSAgBQEhfMs1qRIyzQohdlkJgqxTf+qd5y1cWqI4zDZJuHh3HkOn9/5pfaTr5LzKNGKGyOlNUNz26/uuScqVwsOk6YVwuuVEBgHyS4FIKF8g5lnX1USFkrXA4wISvgP4JTS+rTzuO5sKKHradBYen2dPMUrCuMfUYIVYUeYaZfzymJCiKTHOu6V6GtRY5YkG6xuigsDZknGpmWvIRAAypnOwebNKh2Q1eYeR4MfLmC042+N+R2mk0B9bdlalDCOXdJFO3INuPq3LyJFPFebuCsXybECqE7AENi5CRlDV7t1au8FmL3Kwj/kaZfqkWI1SuSO93CzL/eEwJWxwyP1V7V/XaSlVNJVuOGzAFPu0BrzaArFYVAN0Ytw+RaXsHrmljCB1Hk2lqM9xj1cUkbgsA2g013ZhsEdbdlZ2kGR/KwsYJ2kN5EDbEQnFtqYBTIwubByqE7AGNYGkjW4RYrCE+CFBzjakJoYocMnWzcHq/sXEPJllyjIykztYnNxkAQ7IK7SVbzlhwOKrO3GztFV3I5cAdRV832ldMPzoohNDd441nNwKk3hUjJ4VRqdVNE++2xOIurSExVPVhhVCAPQghRR9LhbehigohilEwRdaYsJ7/3hoyxgBVKYHKPHIBk0lJfAdAiuDZExyOqlI2WzlbHXZeYDfzjcmWYEsQZJxufLnca0BlPqnKHkJdjHoRFEXODZLSxl24gMoyZ4s9skwNl6tqIaTtpoedF9DVfGMyFey1pIwUVaxkqBCiGANTFFSsL4SERmrd0VLYQDu5FKgpURR7ZEgMk9jGfefaYLNJ8rU0ms29Tqb2cHI0BaEKIZR7vfEGoWzAeWg/0ryV0nx4fFWG3r2TjS97l62KTN1iWmGtPdqEEFtNnxVLtgzrXVBYhCpAY4SsFlPXETIqpogRqt+qw1itO1oKX6QyrVbma7b/sMdS/T5tybRISz0c9g6cWoS04xZAXA5ggMxG0pLZ92jAuWGw9asaE0JVRarfMM1w1I6/DiFUUwZUkQKE5Pds47Dnb8W5m7rGrBiL1xHSB3V3mLFihPj1fpx8y6t2JS6KeJiKPFWgtKXbf5gKtjaStsKABYp0Wnu4SzQV7EWXDdLVBiuEaMC5YbAC8sFFUjBRGw8ukal3O1UfQ4omrBDKrSeESjLIVOxjPbGaLaFemEUFdY1RjIIp6gjx6rkIrMUiBKiVac9XC5S2s/ggFp/2ZFp8TzObpLqYuAYBwLuNuUdlOwQ2EmMFECFdep9U9rXl+iyWJKArcU1X5qnKbdTnwQUypcdYN+x/veS+ZuB5UTqZeoWbfUgmoZ4QohYhinEwRYwQl6u5XYEVWYTYO8rqYvu3CLm3ItY5eR25YLOwJ0fXAOuJ37JG2FpM2Ve0v8+6F33a28fdtiUQilXWjIeXtC/z4CKZtu5lnjHZIu7B5EZWXgeU56jmF98jUy87ueERaAofGixNMQ4aWWNGrNCp7h6zJosQW5BLGSwN+00f53JVJ8BCtbRaNsXWXk6OpoKNnyrN1F79mAacG4fgaDJ9oEMIsenfrIWO0hAuT1UnjXWHAaSfIGA/FqF6YRY1MNLNewugQsgeUBcpxooRqr9da4oRcvYk0+oSVTaQs5eFBmMGWNdXyT3VPPbkaA/Bk6bEyV11jLS5x5T1WbqYb0z2CCuEtDUIrilVpkrDP9JsQ7JJPEPJtOT/27v74KjKew/g380muyGYBGkgEBvMBa8oLyZtkDSoRTRtBhys03s1M3pp8LaodWM7ZmzFYo1TRRjHobR2W1oqpXPHKWpHqSMMtaZNuRq4wUCcjEEcSlAQE4hANi/kbfPcPzZnc3aTJdmXc86z5/l+ZjIJm5Pk2Yfd8/zO7/k9z9Flf7WMkF2mwMMyQv2wfqUmAyE70E+NJKpGCACc+kBI0oxQX2foY3ak7ZitTQMCwPmTgc92OTkaSSsm14rL9YKBEDNCccmZH/jccWzs986OLP3OnD16EUPj024TdEGXEdLqrrKuMr89Rgi7qB5AAsesGDEQsgN9IJSoGiEgNPiRqUZInxEKBkLZVrXGeMFA6PPRx7TUuV3S5Ub6UoSVd/5BoGNkfyY77NhrpRkjgdCFT4DBS6HfOzdynyxmgyamBUL6jFC3Nv1vkzrIsLFkQHBqzHDHjh1DUVFR8GPKlCnYvXu31c1KrDR9RkixGiFt5ZSdrzS1FXH6Aspum95fzQjaapwvjoc+fvHTQGFq6pTRW7dQbKbOGHlfirH9rGWEZjAQmtCVWiA0cqHjHwQujdS22aUOMmxqTIaMkPUtMNj8+fPR1NQEAOju7kZBQQG+8Y1vWNuoRAuZGktkRkg3dytTjZCW/enrVCwjNE4gZJeTo5G+9O+Bz1+ETY0FV+MUyHFD4WTmcASyQqf+L3AjYP0mn1pgNONaa9qWTLR7sGnZ355zgc8OZ+C+g3YQNpb0s1jaXG+++SZuv/12TJ1qs+XGRi2fljUjpD3fgV5FAiEtIzRychzsG33eDIQmpt+fZah/9HF9IETxyxkJdDrCbgejTfNo0z4UmTb9pU2HaZ+nzrDPzvljMkIMhLB//36sXr0aeXl5cDgc405beb1eFBQUID09HSUlJWhouMx2+Zfx6quvoqKiIs4WS0gfCPkHEvd7Za0R0p7vpQuBuzUD8twU1ghaRqi3AxgaGN0ywOmyd5F4olwxE3BlBu58rgU/gP2WJVstuLrx1OhjQugCoTnmtynZaBc2/b7AhZ6WEbpihnVtSrTwYmnWCAE9PT0oLCyE1+sd9/uvvPIKqqurUVNTg8OHD6OwsBDl5eU4e/Zs8JiioiIsWrRozMeZM6O7nPp8PtTX12PVqlWGPyfT6Tc+1F/xxkv2jFBvh+6xK8Y/1g4ypo9OeXa3A93ayTGXUzqT4XCM7s+iLeMG7Lcs2WpZI33cqQuEejqAoUsAdP8HFJk7azRQ6Dk7OgU+1UaZX9YIjbVy5UqsXLky4ve3bNmCdevW4f777wcAbNu2DXv27MGOHTuwfv16AAjWAF3OX/7yF3zzm99Eevrld7Hs7+9Hf/9oMOHz+SbxLCymHwz9CQyE9AGWI4FF2PEKnwp0ugJ3wbYrhyOQFer8NFAnFLxKtNHJ0WhZswOrl8bdsbfAihbZT/bI8m59sKnthp45S66LKVk5HIHsz8VPA9NidlsxBoyzfJ4ZocsaGBhAY2MjysrKgo+lpKSgrKwMBw4ciOp3TXZabNOmTcjOzg5+5Ocn2WoS/2DifldIICTRSyUtI+zfEk3bGUULevRXiXY6ORpNm17U3wvrAmtXEkrL+HR+NnrzVU6LRS/jS4HPvedtOjXmBjB68c6dpSfQ0dEBv9+P3NzQE35ubi7a2toi/NRYnZ2daGhoQHl5+YTHPvHEE+js7Ax+nDp1asKfkULxWiAzD1h8d+J+pz74kSkQCs8Ipdms+H082s7Zly7qrhKZEZq08L2YBvuA/pGCc7vesNdsmXkAHIGsdM/ItDUDoehpq8MuXbDn1JjDEbLfHafGTJKdnY329vaJDwTgdrvhdidhCnf1L4Dh4cSuLAgJhCSqRXGmBbJVWmG4ChmhYCB0YbRY2k4nR6NlaRkhbVmyvuDcxisOzZTqCmQpu9sA3+lAFqPzdOB7rA+aPP17/dKFwNdalsgudKUWAyINVl/KSnSZP1ZOTg6cTueYIKa9vR2zZhl7Fef1erFgwQLceOONhv6dhEr08kpZM0JA6PSYKyPycXYREgiNXG1PzbGuPckmU9ufZWRqTCs4nzpTriA/2Wl1QloApL1WOY07efr3et9IjWq6fVfFypARkmx0C+VyuVBcXIza2trgY8PDw6itrUVpaamhf9vj8aClpQWHDh0y9O9ITT9AyBYI6VeJhdcM2ZH+5NivnRyZyZi0MRkhLRBiMJlQ2v2wOkcKprWVnXbLaBgpJBAamb612/Ygw0PBL2W46arloVh3dzeOHx/dkr21tRVNTU2YPn065syZg+rqalRWVmLJkiVYunQptm7dip6enuAqMqN4vV54vV74/X5D/47UpA6EdMGPaoGQCptIJpqWEeo5C/iHRqfGWGeVWFrmRws0e0duD5Fhk12RzRB8r5+370XP8OiiHhkyQpa34P3338eKFSuC/66urgYAVFZWYufOnaioqMC5c+fw1FNPoa2tDUVFRdi3b9+YAupE83g88Hg88Pl8yM622YtwsmStEQIAp36zRxUCoWmBz/p0ud2uEo00dUbg9SyGA1mKbtZZGULLsGmZoN4vAp8zmHmbtOAthHxKTI0NwfqtWSwPhG699VYIballBFVVVaiqqjKpRRQUkgWSLRDSvXRVqBFyZwY+D/QwIxSLlJTALtyXztt3WbIMtCmwno7AEvoeTo1FLWTn/EuBr2190WP92CLZfIc8krJYOtFkLpbW73GUevlNMm0heH+1bl263M4nRwNo0zOXzofew4kSJ5gR+gLo7xqdAmEgNHnukfpHbasHwOaBkPUkG93kwWJpJE8g5LS+2M5wWnF47/nR+6sxIxQdbX8WfUaIU2OJpU2B9XSMToulZaiRtU0U7b2ubf6ZNtXeO+dLQLLRjaQicyCUkjr+13alZYS6dRuJujKtaUuy0meEuAWBMYK7In/B+qBYBVfEjpSMMIg0nGSjmzw4NQaEzN3KFgiFZISs36LdcOE3lU3LSPy+UXanrcbpPQ/0XQx9jBJDy1L2+3T1QVwxFpXwnfNTFdgw1mI8k0bAqTFIvmpMF/ykWL/qwHBjbivCk2PUtKCn76ISq3EsofXn8FBgd2mA9UHRGnPRw/e60RgIUWQyT42FBEIKZoR4lRg9beVdXycw2DPyGAOhhHJdMXquON8a+MxAKDpuBkJmk2x0I6nIvKGialNjqa7QgI8nx+hpwWSXrs7KzTqrhHI4RoNL7Yar2h5YNDmp6aHnW77XDSfZ6CYP1gghiTJCCkyNAaFXijw5Rk/rP9/I7R+cbiA1CW+wLDttekxb/h0+rUuX53AEVopp+F43nGSjmzxYIwS5a4RSFJsaA0Knw3hyjJ62yk5blsz6IGNoBdNaPzMQil6qfp80vteNxkCIIgsJfiQLhPRTYyosnwdCs2AMhKKnZYS0Zd2sDzKGWwuERjJv3OYhevrzG9/rhmMgRJEly9SYCjVCQNjJkXuLRC284Dy8KJUSI3zfG2aEoseLHlNJNrrJgzVCkDwQ0meEFKkRUu22Iok2ZjUOB2hDhA/cDISix4yQqSQb3eTBGiFIHggpWCMUcpXIjFDUwqfC0hhMGiL8tRmeiaOJMRAylWSjG0klaQIhVWqEeHKMS/gAzSJUY4RnKzkFGT39+Y3ZX8NJNrqRVGReNabaPkJA2NQYl31HLbzPmBEyxpiMEKfGoqbi+c1CDIToMiTeUDFFwX2EQgrEXZGPo/GFB0LMCBkjPFvJadzo6d/fDkXObxaSbHQjqUi9s7SKNUIKFognkpMZIVOE9yuD9uipOPVvIclGN3lw1RgkrxFSfB8hVZ5zIjlTQ6+uWXthjDG1WJzGjRovekwl2egmD64ag9w1QvqTrSpz6EyXx08/KDMQMkb41BgzQtFT8ULPQgyEKLKQLJBkgZD+ZpmqnCh4lRg/fSDEqTFjhNdeqXKhkkh8r5uKgRBFJvPUmP4+UcoEQpwai5u+TojF0sZgRih+zP6aSrLRjaQicyCkzwipcsXJq8T46W9myYyQMcIDIVUWMyQSL3pMJdnoRlKRedWY8lNjijznRNPXBTEjZAz9azMlFUiR7NyRDPheNxVfoRSZ1BkhBe8c7lRw76REC5ka42omQ+hfm5wWiw2zv6aSbHQjqci8akyfERq8ZF07zMS6gfjpgx9VplTNps9gsI9jw4seUzEQoshknhrTnyiG+q1rh5mYLo+fPhBiMGmMkECIWbeY8KLHVJKNbvLghoqA1LfYAIDrVwPTrgYKbrK6JebgVWL8QgYYCV/TdhASCHFqLCa86DEVezgCj8cDj8cDn8+H7Oxsq5tjPRkHjXv+BxDD6gQFPDnGT18srcrrxmz6cwWnxmLDVWOmYg/T5MhWIwQE2qRS2pgFlPFLZUbIcMwIxY/vdVPxTECTJGEgpBr9VaJKAWAi6fe0YSBkDAZC8WMgZCqeCWhyOGhYj1Nj8dMPKnxNGyNk+TynxmLCqTFT8UxAk8NBw3oMhOKnfx3zStsYzAjFj6vGTMXRjSaHgZD1uGosfg5mhAzHjFD8eNFjKp4JKDKZ9xFSEesG4qe/3QOvtI2h71fu3h0bXvSYSonR7ec//zkWLlyIBQsW4Ac/+AGEEFY3KTno+0nGVWOqYbo8fvp+4wBjDE6NxY8XPaayfSB07tw5/OpXv0JjYyOam5vR2NiIgwcPWt2s5MOMkPVYQBk/FksbL/ymqxQ9To2ZSokeHhoaQl9fHwBgcHAQM2fOtLhFSYiDhvV4cowfa4SMpw82+TqNDbfKMJXlZ4L9+/dj9erVyMvLg8PhwO7du8cc4/V6UVBQgPT0dJSUlKChoWHSv3/GjBl47LHHMGfOHOTl5aGsrAzz5s1L4DNQBAcN6zFdHj9mhIzHPo6f3S96Vv8CAHCi+EmLGxJg+au0p6cHhYWF8Hq9437/lVdeQXV1NWpqanD48GEUFhaivLwcZ8+eDR5TVFSERYsWjfk4c+YMLly4gLfeegsnT57EZ599hvr6euzfv9+sp2cfrBGyHgso48fl88bTD9wMhGJj94ue4rXA+lM4c939VrcEgARTYytXrsTKlSsjfn/Lli1Yt24d7r8/0GHbtm3Dnj17sGPHDqxfvx4A0NTUFPHnX3vtNVxzzTWYPn06AOCOO+7AwYMH8fWvf33c4/v7+9HfP3o3c5/PF+1Tsg8GP3Kx+1WiGfQDMwdpY7AgPX4qXPSkZwHosLoVACTICF3OwMAAGhsbUVZWFnwsJSUFZWVlOHDgwKR+R35+Purr69HX1we/34+6ujrMnz8/4vGbNm1CdnZ28CM/Pz/u50GUEKwbiF/ItA370BDMCMWPFz2mkvpV2tHRAb/fj9zc3JDHc3Nz0dbWNqnf8bWvfQ2rVq3CV77yFdxwww2YN28e7rzzzojHP/HEE+js7Ax+nDp1Kq7nkNS4zYBceHKMH4uljccaofjxosdUSpxNN27ciI0bN07qWLfbDbfbDa/XC6/XC7/fb3DriCbJ7nUDZkjhtI3h9FPq7OPY8KLHVFKH6zk5OXA6nWhvbw95vL29HbNmzTL0b3s8HrS0tODQoUOG/h2iSePtCuIXkhFiDZzhmBGKTcheTAwmjSb1q9TlcqG4uBi1tbXBx4aHh1FbW4vS0lJD/7bX68WCBQtw4403Gvp3pMaBQi76q0ROW8aGt9gwFwOh2LDfTGV5zq27uxvHjx8P/ru1tRVNTU2YPn065syZg+rqalRWVmLJkiVYunQptm7dip6enuAqMqN4PB54PB74fD5kZ2cb+reIJiUkEOKUbUy4oslcDDZjkzZl9GtOjRnO8h5+//33sWLFiuC/q6urAQCVlZXYuXMnKioqcO7cOTz11FNoa2tDUVER9u3bN6aAmsj29FNjriusa0cyYyGvudjHsUnPCmw6KMTIMnMykuWB0K233jrhTVCrqqpQVVVlUosCWCwNTr/IxuEA/uMloK8TyL7K6tYkJwenxkzFQCh2xWutboEyLA+EZMWpMZLS4v+0ugXJjcvnzZXCPib58VVKkbFYmuyGS7vNxawbJQEGQhFw1RiRzTHQNx6DTUoCDIQi4D5CRDbHbIXxOP1ISYCvUiJSiC4LxEHaeOxjSgJ8lVJkXDVGdsZpG+MU/Vdgi4cl/211S4gmxEAoAtYIAZj+b1a3gMg4zFYY5y4v8PhJINPYWyERJQLPBBGwRgjA3BXAyueByresbglR4rFGyFi8Nx4lCe4jRJE5HEDJg1a3gihxuHyeiMIwI0REauLyeSICAyEiUgqDHyIKxUAoAhZLExER2R8DoQhYLE1ERGR/DISISB2sCyKiMAyEiIiISFkMhIiIiEhZDISIiIhIWQyEIuCqMSIiIvtjIBQBV40RERHZHwMhIiIiUhYDISJSh9NldQuISDIMhIhIHYvvBmbdACx7xOqWEJEkePd5IlKHKwN46H+tbgURSYQZISIiIlIWAyEiIiJSFgOhCLiPEBERkf0xEIqA+wgRERHZHwMhIiIiUhYDISIiIlIWAyEiIiJSFgMhIiIiUhYDISIiIlIWAyEiIiJSFgMhIiIiUhYDISIiIlIWAyEiIiJSFgMhIiIiUlaq1Q2QnRACAODz+RL6e3u6uzDc34vBPmfCfzcREZHstHFwqC/FkHFQ+53aOB6JQ0x0hOJOnz6N/Px8q5tBREREMTh16hS+/OUvR/w+A6EJDA8P48yZM8jMzITD4UjY7/X5fMjPz8epU6eQlZWVsN9LY7GvzcF+Ngf72RzsZ3MY2c9CCHR1dSEvLw8pKZErgTg1NoGUlJTLRpLxysrK4pvMJOxrc7CfzcF+Ngf72RxG9XN2dvaEx7BYmoiIiJTFQIiIiIiUxUDIIm63GzU1NXC73VY3xfbY1+ZgP5uD/WwO9rM5ZOhnFksTERGRspgRIiIiImUxECIiIiJlMRAiIiIiZTEQIiIiImUxEDKQ1+tFQUEB0tPTUVJSgoaGhsse/9prr+G6665Deno6Fi9ejL1795rU0uQWTT9v374dt9xyC6688kpceeWVKCsrm/D/hUZF+5rW7Nq1Cw6HA3fddZexDbSJaPv54sWL8Hg8mD17NtxuN6699lqePyYh2n7eunUr5s+fjylTpiA/Px+PPvoo+vr6TGptctq/fz9Wr16NvLw8OBwO7N69e8Kfqaurw1e/+lW43W5cc8012Llzp7GNFGSIXbt2CZfLJXbs2CE+/PBDsW7dOjFt2jTR3t4+7vHvvfeecDqd4vnnnxctLS3iySefFGlpaaK5udnklieXaPv53nvvFV6vVxw5ckQcPXpUrF27VmRnZ4vTp0+b3PLkE21fa1pbW8VVV10lbrnlFvGtb33LnMYmsWj7ub+/XyxZskSsWrVKvPvuu6K1tVXU1dWJpqYmk1ueXKLt55dfflm43W7x8ssvi9bWVvHXv/5VzJ49Wzz66KMmtzy57N27V2zYsEG8/vrrAoB44403Lnv8iRMnREZGhqiurhYtLS3ixRdfFE6nU+zbt8+wNjIQMsjSpUuFx+MJ/tvv94u8vDyxadOmcY+/5557xB133BHyWElJiXjwwQcNbWeyi7afww0NDYnMzEzxxz/+0agm2kYsfT00NCSWLVsmfv/734vKykoGQpMQbT//5je/EXPnzhUDAwNmNdEWou1nj8cjbrvttpDHqqurxU033WRoO+1kMoHQj3/8Y7Fw4cKQxyoqKkR5eblh7eLUmAEGBgbQ2NiIsrKy4GMpKSkoKyvDgQMHxv2ZAwcOhBwPAOXl5RGPp9j6OVxvby8GBwcxffp0o5ppC7H29c9+9jPMnDkT3/3ud81oZtKLpZ/ffPNNlJaWwuPxIDc3F4sWLcJzzz0Hv99vVrOTTiz9vGzZMjQ2Nganz06cOIG9e/di1apVprRZFVaMhbzpqgE6Ojrg9/uRm5sb8nhubi4++uijcX+mra1t3OPb2toMa2eyi6Wfwz3++OPIy8sb88ajULH09bvvvouXXnoJTU1NJrTQHmLp5xMnTuDvf/877rvvPuzduxfHjx/Hww8/jMHBQdTU1JjR7KQTSz/fe++96OjowM033wwhBIaGhvDQQw/hJz/5iRlNVkaksdDn8+HSpUuYMmVKwv8mM0KkrM2bN2PXrl144403kJ6ebnVzbKWrqwtr1qzB9u3bkZOTY3VzbG14eBgzZ87E7373OxQXF6OiogIbNmzAtm3brG6ardTV1eG5557Dr3/9axw+fBivv/469uzZg2eeecbqplGcmBEyQE5ODpxOJ9rb20Meb29vx6xZs8b9mVmzZkV1PMXWz5oXXngBmzdvxjvvvIMbbrjByGbaQrR9/a9//QsnT57E6tWrg48NDw8DAFJTU3Hs2DHMmzfP2EYnoVhe07Nnz0ZaWhqcTmfwseuvvx5tbW0YGBiAy+UytM3JKJZ+/ulPf4o1a9bge9/7HgBg8eLF6OnpwQMPPIANGzYgJYV5hUSINBZmZWUZkg0CmBEyhMvlQnFxMWpra4OPDQ8Po7a2FqWlpeP+TGlpacjxAPC3v/0t4vEUWz8DwPPPP49nnnkG+/btw5IlS8xoatKLtq+vu+46NDc3o6mpKfhx5513YsWKFWhqakJ+fr6ZzU8asbymb7rpJhw/fjwYaALAxx9/jNmzZzMIiiCWfu7t7R0T7GjBp+AtOxPGkrHQsDJsxe3atUu43W6xc+dO0dLSIh544AExbdo00dbWJoQQYs2aNWL9+vXB49977z2RmpoqXnjhBXH06FFRU1PD5fOTEG0/b968WbhcLvHnP/9ZfP7558GPrq4uq55C0oi2r8Nx1djkRNvPn376qcjMzBRVVVXi2LFj4q233hIzZ84Uzz77rFVPISlE2881NTUiMzNT/OlPfxInTpwQb7/9tpg3b5645557rHoKSaGrq0scOXJEHDlyRAAQW7ZsEUeOHBGffPKJEEKI9evXizVr1gSP15bP/+hHPxJHjx4VXq+Xy+eT2YsvvijmzJkjXC6XWLp0qTh48GDwe8uXLxeVlZUhx7/66qvi2muvFS6XSyxcuFDs2bPH5BYnp2j6+eqrrxYAxnzU1NSY3/AkFO1rWo+B0ORF28/19fWipKREuN1uMXfuXLFx40YxNDRkcquTTzT9PDg4KJ5++mkxb948kZ6eLvLz88XDDz8sLly4YH7Dk8g//vGPcc+5Wt9WVlaK5cuXj/mZoqIi4XK5xNy5c8Uf/vAHQ9voEII5PSIiIlITa4SIiIhIWQyEiIiISFkMhIiIiEhZDISIiIhIWQyEiIiISFkMhIiIiEhZDISIiIhIWQyEiIiISFkMhIhIGX6/H8uWLcO3v/3tkMc7OzuRn5+PDRs2WNQyIrIKd5YmIqV8/PHHKCoqwvbt23HfffcBAL7zne/ggw8+wKFDh3ijUiLFMBAiIuX88pe/xNNPP40PP/wQDQ0NuPvuu3Ho0CEUFhZa3TQiMhkDISJSjhACt912G5xOJ5qbm/HII4/gySeftLpZRGQBBkJEpKSPPvoI119/PRYvXozDhw8jNTXV6iYRkQVYLE1EStqxYwcyMjLQ2tqK06dPW90cIrIIM0JEpJz6+nosX74cb7/9Np599lkAwDvvvAOHw2Fxy4jIbMwIEZFSent7sXbtWnz/+9/HihUr8NJLL6GhoQHbtm2zumlEZAFmhIhIKT/84Q+xd+9efPDBB8jIyAAA/Pa3v8Vjjz2G5uZmFBQUWNtAIjIVAyEiUsY///lP3H777airq8PNN98c8r3y8nIMDQ1xioxIMQyEiIiISFmsESIiIiJlMRAiIiIiZTEQIiIiImUxECIiIiJlMRAiIiIiZTEQIiIiImUxECIiIiJlMRAiIiIiZTEQIiIiImUxECIiIiJlMRAiIiIiZTEQIiIiImX9P3myNOJWHeZkAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig,ax = plt.subplots(1)\n", + "\n", + "ax.plot(x,abs_er_cheb,label='Polynomial Approximation')\n", + "ax.plot(x,abs_er_rat,label='Rational Approximation')\n", + "\n", + "ax.set(xlabel='X',ylabel='Error',\n", + " title='Polynomial vs Rational')\n", + "ax.legend()\n", + "ax.set_yscale('log')" + ] + }, + { + "cell_type": "markdown", + "id": "65b22862-a47b-4728-a261-8772a04e7d61", + "metadata": {}, + "source": [ + "Recurrence Relation: (indexing at 1)\n", + "\n", + "$$f_j(t) = \\sqrt{t^{2^{j-1}} - t^{2^j}}$$\n", + "$$f_1(t) = t^{1/2}\\sqrt{1-t}$$\n", + "$$f_2(t) = t\\sqrt{1-t}\\sqrt{1+t}$$\n", + "$$f_n(t) = t^{2^{n-3}}\\sqrt{1+t^{2^{n-2}}}*f_{n-1}(t) \\text{ for } n=3,4,...$$\n" + ] + }, + { + "cell_type": "markdown", + "id": "b043923d-7143-49c7-b56e-4c699d1f25c1", + "metadata": {}, + "source": [ + "__Recurrence Relation Function for Scalars__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad5f5da5-b342-4eb3-bd18-4b3a83bb95f0", + "metadata": {}, + "outputs": [], + "source": [ + "def rec_rel(t,n,N1,N2,res):\n", + " fs = np.zeros((len(t),n,1))\n", + " \n", + " a,b,p = coeffs(N1,N2,res)\n", + " f0a = rat_approx(a,b,p,t) #f0a = t**0.5\n", + " f0b = rat_approx(a,b,p,1-t) #f0b = np.sqrt(1-t)\n", + " #fs0 = (f0a*f0b)\n", + " fs[:,0] = f0a*f0b\n", + "\n", + "\n", + " f1c = rat_approx(a,b,p,1+t)\n", + " fs[:,1] = t*f0b*f1c #fs[1] = t*f0b*np.sqrt(1+t)\n", + "\n", + " for i in range(2,n):\n", + " fia = t**(2**(i-2))\n", + " fib = rat_approx(a,b,p,1+t**(2**(i-1))) \n", + " #fib = np.sqrt(1+t**(2**(n-1)))\n", + " fs[:,i] = fia*fib*fs[:,i-1]\n", + "\n", + " return fs[:,n-1]\n", + "\n", + "def true_rec_rel(t,n):\n", + " fs = np.zeros((len(t),n,1))\n", + "\n", + " f0a = t**0.5\n", + " f0b = np.sqrt(1-t)\n", + " fs[:,0] = f0a*f0b\n", + "\n", + " fs[:,1] = t*f0b*np.sqrt(1+t)\n", + "\n", + " for i in range(2,n):\n", + " fia = t**(2**(i-2))\n", + " fib = np.sqrt(1+t**(2**(i-1)))\n", + " fs[:,i] = fia*fib*fs[:,i-1]\n", + "\n", + " return fs[:,n-1]\n", + "\n", + "def true2_rec(t,n):\n", + " return np.sqrt(t**(2**(n-1))-t**(2**n))" + ] + }, + { + "cell_type": "markdown", + "id": "efa19844-6459-4c3d-9bee-363956b48ac4", + "metadata": {}, + "source": [ + "__Replacing the $f_1$ and further terms with Chebyshev approximations__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6945163e-bf12-4755-b38b-612d67a1354d", + "metadata": {}, + "outputs": [], + "source": [ + "def chebycoeffs2(f, k, n):\n", + " \"\"\"\n", + " Computes the Chebyshev expansion coefficients for a \n", + " function defined on [0,1].\n", + "\n", + " Parameters:\n", + " f : callable\n", + " Function defined on [0,1].\n", + " n : int\n", + " Number of Chebyshev coefficients.\n", + "\n", + " Returns:\n", + " coeffs : ndarray\n", + " Chebyshev coefficients.\n", + " \"\"\"\n", + " m = k - 1\n", + " x = np.sin(np.pi * np.arange(-m, m+1, 2) / (2 * m))\n", + "\n", + " # Map [-1,1] to [0,1]\n", + " fd = f(0.5 * (x + 1),n)\n", + " #fd = f(2*x-1)\n", + " \n", + " reordered = np.concatenate([fd[k-1:0:-1], fd[:k-1]])\n", + " coeffs = np.fft.ifft(reordered)\n", + "\n", + " result = np.zeros(k, dtype=complex)\n", + " result[0] = coeffs[0]\n", + " result[1:k-1] = 2 * coeffs[1:k-1]\n", + " result[k-1] = coeffs[k-1]\n", + "\n", + " return result.real # Return real part if f is real-valued\n", + "\n", + "#for f2 and further\n", + "def f(x,n):\n", + " return (x**(2**(n-2)))*np.sqrt(1+x**(2**(n-1)))\n", + "\n", + "#for f1c\n", + "def f2(x,n):\n", + " return x*np.sqrt(1+x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd99e501-512d-4dc6-8b36-5cdb8feef70e", + "metadata": {}, + "outputs": [], + "source": [ + "#new version with Cheb coeffs\n", + "def rec_rel_cheb(t,n,N1,N2,res,f):\n", + " \n", + " fs = np.zeros((len(t),n,1))\n", + " \n", + " a,b,p = coeffs(N1,N2,res)\n", + " f0a = rat_approx(a,b,p,t) #f0a = t**0.5\n", + " f0b = rat_approx(a,b,p,1-t) #f0b = np.sqrt(1-t)\n", + " #fs0 = (f0a*f0b)\n", + " fs[:,0] = f0a*f0b\n", + "\n", + " f1coef = chebycoeffs2(f2,1*(max(N1,20)),0)\n", + " f1c = cheb_approx(t,f1coef)\n", + " \n", + " fs[:,1] = f0b*f1c #fs[1] = t*f0b*np.sqrt(1+t)\n", + "\n", + " for i in range(2,n):\n", + " cheb_cs = chebycoeffs2(f,1*(max(N1,20)),i)\n", + " fi = cheb_approx(t, cheb_cs)\n", + " \n", + " fs[:,i] = fi*fs[:,i-1]\n", + "\n", + " return fs[:,n-1]" + ] + }, + { + "cell_type": "markdown", + "id": "43d1424b-06a7-41c0-8454-decbb3e402e8", + "metadata": {}, + "source": [ + "__Comparing the relative error across different $N_1$ values__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "682a8487-71d6-48be-addb-f084bf0eed8c", + "metadata": {}, + "outputs": [], + "source": [ + "def rec_err(N1,N2,t,res,n,f):\n", + " y = np.zeros(len(N1))\n", + " true = true_rec_rel(t,n)\n", + " \n", + " for i in range(len(N1)):\n", + " app_cheb = rec_rel_cheb(t,n,N1[i],N2[i],res,f)\n", + " y[i] = (np.linalg.norm(app_cheb - true,ord=np.inf)\n", + " /np.linalg.norm(true, ord=np.inf))\n", + "\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "120ac69e-ebac-4512-9127-4c3207eabda2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Text(0.5, 0, 'Root N1'),\n", + " Text(0, 0.5, 'relative error'),\n", + " Text(0.5, 1.0, 'Relative Error VS N1')]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t1 = (1-np.logspace(-16,0,200)).reshape(200,1)\n", + "t = t1[:-1] #removing the zero at the end\n", + "\n", + "#setting inputs\n", + "res = -16\n", + "n=6\n", + "\n", + "rel_err = rec_err(N1,N2,t,res,n,f)\n", + "\n", + "fig,ax = plt.subplots(1)\n", + "ax.plot(np.sqrt(N1),rel_err,\".-\")\n", + "\n", + "ax.set_yscale('log')\n", + "ax.set(xlabel='Root N1',ylabel='relative error',\n", + " title='Relative Error VS N1')" + ] + }, + { + "cell_type": "markdown", + "id": "0d1e6878-a53c-438f-bb3c-1560dc432e40", + "metadata": {}, + "source": [ + "__Adjusting the recurrence relation for matrices__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4a0fe40-deb3-40eb-8ae5-e7eb0c6309dc", + "metadata": {}, + "outputs": [], + "source": [ + "def clenshaw_matvec(c, A, u):\n", + " # Clenshaw scheme for evaluating sum c_k T_k(A)*u \n", + " #where T_k are the Chebyshev\n", + " # polynomials over [-1,1].\n", + " bk1 = np.zeros_like(u)\n", + " bk2 = bk1.copy()\n", + " A = 2 * A\n", + " for k in range(len(c) - 1, 0, -1):\n", + " bk = c[k] * u + A @ bk1 - bk2\n", + " bk2 = bk1.copy()\n", + " bk1 = bk\n", + " y = c[0] * u + 0.5 * (A @ bk1) - bk2\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1a19b2c-55a8-429a-8e94-06612fb6445d", + "metadata": {}, + "outputs": [], + "source": [ + "def mat_rec_cheb(A,u,n,N1,N2,res):\n", + "\n", + " fs = np.zeros((n,A.shape[0],1))\n", + " \n", + " ##first term\n", + " a,b,p = coeffs(N1,N2,res)\n", + " I = np.eye(A.shape[0])\n", + " \n", + " f0b = matrix_rat(a,b,p,I-A,u)\n", + " fs[0] = matrix_rat(a,b,p,A,f0b)\n", + "\n", + " ##second term\n", + " A2 = 2*A-I\n", + " f1coef = chebycoeffs2(f2,1*(max(N1,20)),0)\n", + " \n", + " f1c = clenshaw_matvec(f1coef,A2,f0b)\n", + " fs[1] = f1c \n", + "\n", + " ##remaining terms\n", + " for i in range(2,n):\n", + " cheb_cs = chebycoeffs2(f,1*(max(N1,20)),i)\n", + " \n", + " fi = clenshaw_matvec(cheb_cs,A2,fs[i-1])\n", + " fs[i] = fi \n", + " \n", + " return fs\n", + "\n", + "\n", + "def mat_rec_true(A,u,n):\n", + " fs = np.zeros((n,A.shape[0],1))\n", + "\n", + " #first term\n", + " I = np.eye(A.shape[0])\n", + " f0b = scipy.linalg.sqrtm(I-A) @ u\n", + " fs[0] = scipy.linalg.sqrtm(A) @ f0b\n", + " \n", + " #second term\n", + " f1b = scipy.linalg.sqrtm(I+A) @ f0b\n", + " fs[1] = A @ f1b\n", + "\n", + " #remaining terms\n", + " for i in range(2,n):\n", + " fia = np.linalg.matrix_power(A,2**(i-2))\n", + " fib1 = fia @ fia\n", + " \n", + " fib = scipy.linalg.sqrtm(I+fib1)\n", + "\n", + " fs[i] = fia @ (fib @ fs[i-1])\n", + " \n", + " return fs" + ] + }, + { + "cell_type": "markdown", + "id": "4a655d51-6735-48e1-9b9e-5f9e10e5a436", + "metadata": {}, + "source": [ + "__Testing the Algorithm__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "952deaf3-3c38-40a3-a5a6-3ae505e735cb", + "metadata": {}, + "outputs": [], + "source": [ + "#forming the matrix\n", + "n = 100\n", + "k=10\n", + "u = np.random.randn(n,1)\n", + "\n", + "A = randmat(n,k)\n", + "D = A@np.ones(n)\n", + "D = scipy.sparse.diags((1/np.sqrt(D)))\n", + "\n", + "L_norm = identity(n,format='csr') - D@A@D\n", + "T = 0.5*L_norm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cee33284-44c0-4fc8-bc61-e6d718d08b5b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "╒═════════════════════╤══════════════════╕\n", + "│ Recurrence Number │ Relative Error │\n", + "╞═════════════════════╪══════════════════╡\n", + "│ 1 │ 5.36343e-10 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 2 │ 6.95443e-15 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 3 │ 7.84906e-15 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 4 │ 7.97309e-15 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 5 │ 9.75619e-15 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 6 │ 9.77375e-15 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 7 │ 2.98332e-11 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 8 │ 2.32605e-05 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 9 │ 227.278 │\n", + "├─────────────────────┼──────────────────┤\n", + "│ 10 │ 1.43698e+18 │\n", + "╘═════════════════════╧══════════════════╛\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/9l/7llcw8rd1jjgq13k9ckd1sf80000gr/T/ipykernel_12248/1415741659.py:35: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " fs[0] = scipy.linalg.sqrtm(A) @ f0b\n" + ] + } + ], + "source": [ + "#test to find errors\n", + "n=10\n", + "\n", + "test = mat_rec_cheb(T.toarray(),u,n,N1[36],N2[36],-32)\n", + "test\n", + "testTRUE = mat_rec_true(T.toarray(),u,n)\n", + "testTRUE\n", + "\n", + "errors = np.zeros(n)\n", + "for i in range(n):\n", + " errors[i] = (np.linalg.norm(test[i] - testTRUE[i],\n", + " ord=np.inf)\n", + " /np.linalg.norm(testTRUE[i], ord=np.inf))\n", + "\n", + "table1 = errors.reshape((n,1))\n", + "numbers = np.linspace(1,n,n)\n", + "table = np.column_stack((numbers, table1))\n", + "\n", + "print(tabulate(table, headers=['Recurrence Number','Relative Error'],\n", + " tablefmt='fancy_grid'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a910f120-03e3-449e-8000-7d92888b2a9f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_per_seed.csv b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_per_seed.csv new file mode 100644 index 0000000..2cd5e77 --- /dev/null +++ b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_per_seed.csv @@ -0,0 +1,46 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,lr_values,weight_decay,cv_folds,no_grid_search,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,best_cv_accuracy,best_params,n_pca +PEMS03,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07985757884028484,0.08304398148148148,0.012883634743706398,0.012570476998880881,0.007002085812132636,0.08304398148148148,0.09521458109841269,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08799593082400814,0.08830845771144279,0.02607753657828459,0.02506223128348228,0.018407899891118944,0.08830845771144279,0.08578747344166143,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.0849440488301119,0.08516497403651337,0.022455837375853268,0.02250046192660312,0.031841126987284245,0.08516497403651337,0.08708939350110012,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07807731434384538,0.08333333333333333,0.013211496042558715,0.012512298803283695,0.007195015012035961,0.08333333333333333,0.09189238647358766,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08621566632756866,0.08626635161975209,0.023591041736716167,0.02406526511778227,0.03194187728833998,0.08626635161975209,0.08758309975295342,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.25457782299084436,0.25588196939890134,0.18539704705305093,0.1872927355495292,0.1573385887745384,0.25588196939890134,0.2497758444486158,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24364191251271616,0.24602544042456934,0.16570621348525214,0.16359840301726855,0.14956337649916415,0.24602544042456934,0.2395856279526268,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23830111902339776,0.23711572944508771,0.1636194864732713,0.16297985553806568,0.13646813891749335,0.23711572944508771,0.2406180910157928,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24008138351983724,0.24318859222559874,0.17095358426128868,0.17042695285882606,0.1512714655459628,0.24318859222559874,0.24358026202716032,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24160732451678535,0.24729940597290354,0.16896019649371322,0.16553553497131585,0.13801036090118196,0.24729940597290354,0.23936084065359586,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30264496439471006,0.29770918274776453,0.26404477623489075,0.26769034244171896,0.26453759421253137,0.29770918274776453,0.2888310038772378,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2927263479145473,0.29447138058579575,0.26286616605135166,0.26262972077040425,0.2618905656747316,0.29447138058579575,0.29215292645762164,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29781281790437436,0.2983270894038131,0.2573602228507646,0.25767766857095964,0.24672804007455262,0.2983270894038131,0.2912100566970843,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2965412004069176,0.2973828912412841,0.2575181616810304,0.25672497049073606,0.2588434394777129,0.2973828912412841,0.28936971837052633,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29247202441505593,0.29545148490111983,0.2590849634798644,0.2567769743524916,0.263582888101102,0.29545148490111983,0.2883822695942276,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.15488301119023398,0.1594051183862426,0.07476999210084971,0.07287505741626006,0.06036133328580746,0.1594051183862426,0.16618765686006912,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS03,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16251271617497456,0.16426072403261172,0.07263118387027381,0.07160289858843842,0.04692490595874975,0.16426072403261172,0.16668180442846028,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1655645981688708,0.16634908310408086,0.07660538981541538,0.07613933025971499,0.059388333717047326,0.16634908310408086,0.16825294571232266,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16480162767039674,0.16436863416470926,0.07733780436345246,0.07732568696171578,0.05801423841217242,0.16436863416470926,0.16641209956947456,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS03,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1564089521871821,0.15530736914412482,0.0897420057458257,0.08984106501230066,0.08709219764632561,0.15530736914412482,0.16946489160691514,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.15869786368260427,0.16302474714305135,0.07309909048635846,0.07109555043052844,0.053839898296743134,0.16302474714305135,0.17108098067789243,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16531027466937945,0.16784519248217558,0.07932770615191861,0.07825188797480517,0.09035431806701764,0.16784519248217558,0.1688814409166326,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17065106815869788,0.1716119868740901,0.0827426390392766,0.08217348058165111,0.1250162890948618,0.1716119868740901,0.1725624319322138,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16861648016276704,0.16861120611139416,0.08060948202644617,0.08045750762516046,0.07814532838596573,0.16861120611139416,0.1720237295297893,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16454730417090538,0.16302134116950054,0.07931447601620907,0.079676366420651,0.08023759166692389,0.16302134116950054,0.17157498315591502,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.22227873855544253,0.2199446148902533,0.1913396674693684,0.1919119032131627,0.2132646403973036,0.2199446148902533,0.2147604240628749,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.21464903357070192,0.21633981463930024,0.19477123020224635,0.19391268619728985,0.2039769550492569,0.21633981463930024,0.22005732278647264,"{'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.21286876907426247,0.21390801909702065,0.194881837816194,0.1943914919421158,0.20576543804002917,0.21390801909702065,0.21655577228429368,"{'n_estimators': 100, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.21871820956256358,0.21992523355013158,0.1931104845196629,0.19256357894569504,0.20981378903393724,0.21992523355013158,0.21803722958404706,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2169379450661241,0.21688355956634187,0.1892602644679556,0.18890397201903694,0.20640774084720745,0.21688355956634187,0.21880033237785282,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2998474059003052,0.25,0.11533946390138916,0.13833695619505373,0.0749618514750763,0.25,0.3090770348244089,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2973041709053917,0.25,0.11458537541658499,0.1362668401444434,0.07432604272634792,0.25,0.30952595047037995,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30671414038657174,0.25,0.11736084079408332,0.14398491759681026,0.07667853509664294,0.25,0.30786496802117597,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3268056968463886,0.25,0.1231550699635806,0.1609911138384548,0.08170142421159715,0.25,0.3043185543679305,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3051881993896236,0.25,0.11691348402182385,0.1427224626919518,0.0762970498474059,0.25,0.3081343161996722,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2998474059003052,0.25,0.11533946390138916,0.13833695619505373,0.0749618514750763,0.25,0.3090770348244089,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2973041709053917,0.25,0.11458537541658499,0.1362668401444434,0.07432604272634792,0.25,0.30952595047037995,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30671414038657174,0.25,0.11736084079408332,0.14398491759681026,0.07667853509664294,0.25,0.30786496802117597,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3268056968463886,0.25,0.1231550699635806,0.1609911138384548,0.08170142421159715,0.25,0.3043185543679305,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3051881993896236,0.25,0.11691348402182385,0.1427224626919518,0.0762970498474059,0.25,0.3081343161996722,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2990844354018311,0.2541554913319663,0.15100995959363417,0.17124157546275373,0.2523374252473731,0.2541554913319663,0.3042735158993351,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2980671414038657,0.25614676758034605,0.15954661274004237,0.1782666066640011,0.27996723581368554,0.25614676758034605,0.3069220982606385,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30340793489318413,0.25486139676217995,0.16568562530512487,0.18786990831351424,0.25516870876316183,0.25486139676217995,0.3049021864211738,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30747711088504576,0.24818351593358978,0.18275137813450038,0.21176742549852165,0.24811109888191585,0.24818351593358978,0.297854367356118,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30391658189216686,0.2556214666138392,0.16325522514190205,0.18537277012993192,0.2659677968284609,0.2556214666138392,0.3022986062558735,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 diff --git a/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_summary.csv b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_summary.csv new file mode 100644 index 0000000..2c97516 --- /dev/null +++ b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025019_summary.csv @@ -0,0 +1,10 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean,best_cv_accuracy_mean +PEMS03,DAY,W2,4,1 2 3,1,LR,0.16083418107833164,0.0043802746981914525,0.16193818576635383,0.004028434886381561,0.07821727517916341,0.005987975195489582,0.07755680764768598,0.006485883998842859,0.0623562018040205,0.013278815980783728,0.16193818576635383,0.004028434886381561,1.0,0.16739987963544836 +PEMS03,DAY,W2,4,1 2 3,1,MLP,0.16556459816887079,0.004085040285912773,0.16682289475604234,0.0033483216219802616,0.07901867874404178,0.0032131932549828673,0.07833095860655923,0.003832875987620164,0.08551868510230244,0.023105176640459187,0.16682289475604234,0.0033483216219802616,1.0,0.1712247132424886 +PEMS03,DAY,W2,4,1 2 3,1,XGB,0.21709053916581894,0.0032672404583421635,0.21740024834860955,0.00229941311909606,0.19267269689508548,0.0021399750547316204,0.19233672646346006,0.0019350168047499886,0.20784571267354685,0.0033045633089814398,0.21740024834860955,0.00229941311909606,1.0,0.2176422162191082 +PEMS03,HOUR,W2,4,1 2 3,1,LR,0.08341810783316378,0.0038029655427301596,0.08522341963650461,0.0019458139602060317,0.019643909295423825,0.005512814278090881,0.01934214682600645,0.005612566313808926,0.019277600998182355,0.011096482473680324,0.08522341963650461,0.0019458139602060317,1.0,0.08951338685354307 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,0.2436419125127162,0.005743433260750875,0.24590222749341212,0.006101293337482884,0.17092730555331526,0.007666911370061353,0.16996669638700107,0.009048864747187944,0.14653038612766817,0.008029118978799722,0.24590222749341212,0.006101293337482884,1.0,0.24258413321955832 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,0.2964394710071211,0.0037398527862974114,0.2966684057759555,0.0014596406177099812,0.26017485805958035,0.002770829572224523,0.2602999353252621,0.004292177258265423,0.2591165055081261,0.006489696863053409,0.2966684057759555,0.0014596406177099812,1.0,0.2899891949993395 +PEMS03,WEEK,W2,4,1 2 3,1,LR,0.3071719226856562,0.01039856607306049,0.25,0.0,0.11747084681949238,0.003016683136367419,0.1444604580933428,0.008730887660866783,0.07679298067141405,0.0025996415182651224,0.25,0.0,1.0,0.3077841647767135 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,0.3071719226856562,0.01039856607306049,0.25,0.0,0.11747084681949238,0.003016683136367419,0.1444604580933428,0.008730887660866783,0.07679298067141405,0.0025996415182651224,0.25,0.0,1.0,0.3077841647767135 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,0.3023906408952187,0.0034310115878006258,0.25379372764438424,0.0028852276316221016,0.16444976018304075,0.010417030199979999,0.18690365721374452,0.013721396989693296,0.2603104531069194,0.01146495177501817,0.25379372764438424,0.0028852276316221016,1.0,0.3032501548386278 diff --git a/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_per_seed.csv b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_per_seed.csv new file mode 100644 index 0000000..ca4ad39 --- /dev/null +++ b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_per_seed.csv @@ -0,0 +1,61 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,weight_decay,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,n_pca +PEMS03,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.20218718209562564,0.20595365936563034,0.13177336295062694,0.13426716795938518,0.1318965255079851,0.20595365936563034,1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.18591047812817904,0.19094687544725308,0.11969978076528416,0.11578438694402152,0.09585688028712554,0.19094687544725308,1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.1889623601220753,0.18649194833871516,0.11446875521816952,0.11368583055596274,0.09704374466910248,0.18649194833871516,1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.16022380467955238,0.16517384880361027,0.09100189673160101,0.08934604940045474,0.07023847974983537,0.16517384880361027,1 +PEMS03,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.19277721261444558,0.19480699711273475,0.12394773966358293,0.12183713042341218,0.11384815325984221,0.19480699711273475,1 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.17980671414038657,0.18112422238852713,0.10234468238603618,0.1012604616824468,0.08272252146389565,0.18112422238852713,1 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.16429298067141404,0.16673389738405545,0.08876523459597481,0.08866352789708927,0.06579844204966512,0.16673389738405545,1 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.16632756866734486,0.17200609487953036,0.09197362877234234,0.08904029905880802,0.06905698649879927,0.17200609487953036,1 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.15081383519837233,0.15071462728222593,0.08027474851011983,0.08086487685906091,0.09113114349963831,0.15071462728222593,1 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.17395727365208546,0.17468845364167898,0.08734911652323511,0.08672818996669,0.07175516194490981,0.17468845364167898,1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.2706002034587996,0.26498262414642887,0.20255767796170235,0.2074972153959879,0.202386925449607,0.26498262414642887,1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.26703967446592064,0.2716834431327191,0.20678737299500818,0.20488213689485124,0.20512064948237407,0.2716834431327191,1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.26220752797558494,0.26508079200256773,0.20898989766797235,0.20666500627193057,0.1828389813099495,0.26508079200256773,1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.2606815869786368,0.2588147904522308,0.2067339768198789,0.20881262952257623,0.19672990460142267,0.2588147904522308,1 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.2774669379450661,0.2796659437559805,0.22625150045477085,0.22457482764222497,0.20111997029378478,0.2796659437559805,1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.28814852492370296,0.28296157226019597,0.2535111773201977,0.2575576499003138,0.26300473588751494,0.28296157226019597,1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.2777212614445575,0.2812229105945076,0.24607676498635947,0.24433266833550038,0.24549643427668463,0.2812229105945076,1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.28585961342828076,0.28841046782296736,0.2522995456875173,0.2505261451999603,0.2429577777407609,0.28841046782296736,1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.2850966429298067,0.283321726481302,0.25138856418559063,0.25278922643241264,0.26682658950790006,0.283321726481302,1 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.28102746693794506,0.2852584222781946,0.24821045771681552,0.24597932865824795,0.25988706773019027,0.2852584222781946,1 +PEMS03,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.15564598168870802,0.16035817804990726,0.07923999607595923,0.07701609286386887,0.06073560008444957,0.16035817804990726,1 +PEMS03,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.1617497456765005,0.16457839569072047,0.11074811022066942,0.10942212591970224,0.13784719462911862,0.16457839569072047,1 +PEMS03,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.16810783316378433,0.16906892877293617,0.13093306037101143,0.13073342753161446,0.12894153429747388,0.16906892877293617,1 +PEMS03,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.16963377416073244,0.16941944104995274,0.09528231385512258,0.09488176446537899,0.09115249709185215,0.16941944104995274,1 +PEMS03,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.15996948118006105,0.15878125868401405,0.10132147428023497,0.10156396516485373,0.10245783281548572,0.15878125868401405,1 +PEMS03,DAY,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.1564089521871821,0.16117706001688248,0.07868306712726471,0.07647026195766925,0.06163703419260213,0.16117706001688248,1 +PEMS03,DAY,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.16276703967446593,0.16472314857240544,0.08850341920278963,0.0873514099870438,0.09722882140501375,0.16472314857240544,1 +PEMS03,DAY,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.1747202441505595,0.17640378530455872,0.11606177207993393,0.11468865576510895,0.09867190775118831,0.17640378530455872,1 +PEMS03,DAY,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.16632756866734486,0.1663207528038451,0.0958245162525607,0.09527774133393187,0.09279551156137913,0.1663207528038451,1 +PEMS03,DAY,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.1607324516785351,0.16139290809128434,0.10433930384817733,0.10391429690149663,0.08589739663753292,0.16139290809128434,1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.20498474059003052,0.20421423333293393,0.1405331011194068,0.14117877635802384,0.12487107859860218,0.20421423333293393,1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.20116988809766023,0.20562782592199055,0.13811031241530985,0.13638182973574237,0.12494931754421122,0.20562782592199055,1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.1986266531027467,0.19717962079066836,0.1377195026508598,0.139681681000777,0.16395873685977344,0.19717962079066836,1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.1996439471007121,0.20111508527142205,0.12148046860759701,0.12074260451872992,0.12609389495936818,0.20111508527142205,1 +PEMS03,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.18769074262461852,0.18542134251704165,0.11075006475895356,0.11234405137912178,0.11204660310027427,0.18542134251704165,1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.21439471007121058,0.2123649308497068,0.19159433216730165,0.19269768099572365,0.20333156079152062,0.2123649308497068,1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.2105798575788403,0.21285732752084513,0.1839069492046607,0.18286575167432967,0.19956130140364312,0.21285732752084513,1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.19811800610376398,0.1993567202236475,0.17679107435522062,0.17600502425062078,0.18568084095497,0.1993567202236475,1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.19989827060020346,0.2012197276764919,0.1797829028873272,0.17916309942468495,0.19138008399416107,0.2012197276764919,1 +PEMS03,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.19811800610376398,0.1979567590043771,0.1765875267932453,0.17628597233451654,0.18495010810664644,0.1979567590043771,1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.2998474059003052,0.25,0.11533946390138916,0.13833695619505373,0.0749618514750763,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.2973041709053917,0.25,0.11458537541658499,0.1362668401444434,0.07432604272634792,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.30671414038657174,0.25,0.11736084079408332,0.14398491759681026,0.07667853509664294,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.3268056968463886,0.25,0.1231550699635806,0.1609911138384548,0.08170142421159715,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.3051881993896236,0.25,0.11691348402182385,0.1427224626919518,0.0762970498474059,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.2998474059003052,0.25,0.11533946390138916,0.13833695619505373,0.0749618514750763,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.2973041709053917,0.25,0.11458537541658499,0.1362668401444434,0.07432604272634792,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.30671414038657174,0.25,0.11736084079408332,0.14398491759681026,0.07667853509664294,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.3268056968463886,0.25,0.1231550699635806,0.1609911138384548,0.08170142421159715,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.3051881993896236,0.25,0.11691348402182385,0.1427224626919518,0.0762970498474059,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.2990844354018311,0.24948090501525616,0.1161889879530593,0.13907871912433473,0.11653911564625849,0.24948090501525616,1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.2973041709053917,0.25,0.11458537541658499,0.1362668401444434,0.07432604272634792,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.30671414038657174,0.25,0.11736084079408332,0.14398491759681026,0.07667853509664294,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.3268056968463886,0.25,0.1231550699635806,0.1609911138384548,0.08170142421159715,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.3051881993896236,0.25,0.11691348402182385,0.1427224626919518,0.0762970498474059,0.25,1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.2970498474059003,0.2625953266683712,0.21067467822593883,0.2260844096597533,0.27686435043653446,0.2625953266683712,1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.3003560528992879,0.2644632020629711,0.199131430021605,0.21467083896516523,0.28743571191227096,0.2644632020629711,1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.301881993896236,0.26245517098848237,0.21095519458074646,0.22893662637876533,0.27359901124306774,0.26245517098848237,1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.3158697863682604,0.26374762304024085,0.2201822798357902,0.2450093600516733,0.28483668927006167,0.26374762304024085,1 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.3013733468972533,0.2604454936863878,0.20081468957738466,0.21915862699834107,0.2869099551570565,0.2604454936863878,1 diff --git a/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_summary.csv b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_summary.csv new file mode 100644 index 0000000..40544b2 --- /dev/null +++ b/results/PEMS03/torch_blis_PEMS03_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_174403_summary.csv @@ -0,0 +1,13 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean +PEMS03,DAY,W2,4,1 2 3,1,LR,0.16302136317395727,0.005194678100381195,0.16444124044950614,0.004357145490846299,0.10350499096059954,0.017122686172583747,0.10272347518908367,0.017624617717425725,0.104226931783676,0.027592390754894114,0.16444124044950614,0.004357145490846299,1.0 +PEMS03,DAY,W2,4,1 2 3,1,MLP,0.1984231943031536,0.005784727623381741,0.1987116215668113,0.007250762722769261,0.1297186899104254,0.011653847887632213,0.13006578859847898,0.011461570492221443,0.13038392621244585,0.017560502027372568,0.1987116215668113,0.007250762722769261,1.0 +PEMS03,DAY,W2,4,1 2 3,1,SVC,0.16419125127161752,0.006164079743129075,0.16600353095779521,0.005558020586332312,0.09668241570214527,0.012851427267197277,0.0955404731890501,0.013172521095802789,0.08724613430954324,0.01355465256195438,0.16600353095779521,0.005558020586332312,1.0 +PEMS03,DAY,W2,4,1 2 3,1,XGB,0.20422177009155645,0.0068864867939272875,0.20475109305501368,0.006502527786191687,0.18173255708155112,0.005597737554159408,0.18140350573597513,0.006165204439182481,0.19298077905018823,0.007359143343635506,0.20475109305501368,0.006502527786191687,1.0 +PEMS03,HOUR,W2,4,1 2 3,1,LR,0.1860122075279756,0.014008215923206703,0.18867466581358874,0.013404362705215864,0.11617830706585293,0.013803947499133893,0.11498411305664727,0.014686295225117621,0.10177675669477815,0.02051842265168089,0.18867466581358874,0.013404362705215864,1.0 +PEMS03,HOUR,W2,4,1 2 3,1,MLP,0.2675991861648016,0.006059947852362229,0.26804551869798543,0.007094308198559749,0.21026408517986656,0.008260253093573844,0.2104863631455142,0.007158649881200167,0.1976392862274276,0.007880381164617284,0.26804551869798543,0.007094308198559749,1.0 +PEMS03,HOUR,W2,4,1 2 3,1,SVC,0.16703967446592066,0.009820180873642547,0.16905345911520359,0.010274898217438919,0.09014148215754167,0.007201647771036783,0.089311471092819,0.006652669183031809,0.07609285109138163,0.009427582542933995,0.16905345911520359,0.010274898217438919,1.0 +PEMS03,HOUR,W2,4,1 2 3,1,XGB,0.2835707019328586,0.003720432054508588,0.2842350198874335,0.0024499099580719396,0.2502973019792961,0.002745785106720774,0.250237003705287,0.0047576943434956285,0.2556345210286102,0.009603616409834934,0.2842350198874335,0.0024499099580719396,1.0 +PEMS03,WEEK,W2,4,1 2 3,1,LR,0.3071719226856562,0.01039856607306049,0.25,0.0,0.11747084681949238,0.003016683136367419,0.1444604580933428,0.008730887660866783,0.07679298067141405,0.0025996415182651224,0.25,0.0,1.0 +PEMS03,WEEK,W2,4,1 2 3,1,MLP,0.30701932858596137,0.010509932078846738,0.24989618100305125,0.0002076379938975359,0.11764075162982641,0.0029140321382309952,0.144608810679199,0.008631312682517281,0.08510843350565048,0.015902572824736616,0.24989618100305125,0.0002076379938975359,1.0 +PEMS03,WEEK,W2,4,1 2 3,1,SVC,0.3071719226856562,0.01039856607306049,0.25,0.0,0.11747084681949238,0.003016683136367419,0.1444604580933428,0.008730887660866783,0.07679298067141405,0.0025996415182651224,0.25,0.0,1.0 +PEMS03,WEEK,W2,4,1 2 3,1,XGB,0.3033062054933876,0.006503126975123923,0.26274136328929065,0.0013675918550617693,0.208351654448293,0.007667554182343904,0.22677197241073963,0.010413080584914367,0.2819291436037983,0.005632545340089249,0.26274136328929065,0.0013675918550617693,1.0 diff --git a/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_per_seed.csv b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_per_seed.csv new file mode 100644 index 0000000..34fa50e --- /dev/null +++ b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_per_seed.csv @@ -0,0 +1,46 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,lr_values,weight_decay,cv_folds,no_grid_search,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,best_cv_accuracy,best_params,n_pca +PEMS04,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08160062769713614,0.0850261452427294,0.019727884558098745,0.019658068190720357,0.018925434216361958,0.0850261452427294,0.0880013483230735,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07806983130639467,0.0842911877394636,0.014376776345541624,0.013300462269492832,0.011847359681155753,0.0842911877394636,0.08786267640116811,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.0796390741467242,0.08333333333333333,0.012651639435739477,0.012043178293632823,0.006848669425640684,0.08333333333333333,0.08855541764580432,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08473911337779522,0.08788269593328994,0.019271902970620165,0.01818703532671244,0.01392596136062644,0.08788269593328994,0.09340196033174845,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08395449195763044,0.08333333333333333,0.013398489331954871,0.013598082785361185,0.007296905044240916,0.08333333333333333,0.10551887788918413,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24597881522165554,0.24772545071267218,0.16431590907535024,0.1643273707367001,0.14165842639772894,0.24772545071267218,0.24039395308163583,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2518634758728913,0.26246033068599467,0.17838393685558107,0.1725252326447282,0.14923402197501934,0.26246033068599467,0.24357874797791088,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.26206355433503337,0.25915773775351414,0.18621389161113058,0.18956650918810583,0.160332437135257,0.25915773775351414,0.24814807624525384,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24401726167124363,0.243200574931111,0.1713292692812345,0.17229075399679417,0.1476572174391828,0.243200574931111,0.25271816668327624,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23813260102000786,0.24244143008647442,0.16730564398066972,0.16710937928168912,0.14243239640699595,0.24244143008647442,0.24863242852169232,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3118870145154963,0.3080888806399399,0.2584000713649905,0.26139071374948325,0.25064421866077796,0.3080888806399399,0.2894138375394369,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.30796390741467244,0.30954728136326165,0.257294602833835,0.2567850052518778,0.2508196616146343,0.30954728136326165,0.28934455191051023,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2954099646920361,0.2921944766009859,0.24593951112568813,0.24914837707506643,0.2457232697245936,0.2921944766009859,0.29474533648613144,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2926637897214594,0.29187004516773235,0.23791318811779552,0.23893193305783877,0.22008135508239732,0.29187004516773235,0.28989863561381995,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29501765398195373,0.2906738959224988,0.24167220318299165,0.2466753187389308,0.24460702894362515,0.2906738959224988,0.29419100831298123,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1702628481757552,0.16807006938206914,0.09069888037432342,0.09205980574796549,0.07183616970795707,0.16807006938206914,0.16672405955687974,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1804629266378972,0.1726258640698187,0.11924683812657064,0.12454147275201156,0.09957977645514764,0.1726258640698187,0.16859346290522495,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1624166339741075,0.16058018766850848,0.09982430247037075,0.10055740022065195,0.08350307737873727,0.16058018766850848,0.17129419313663866,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.15221655551196547,0.15788178515358503,0.08817601678891704,0.08575030495049368,0.08142151394456798,0.15788178515358503,0.17316351020151075,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17418595527657904,0.16584054563210562,0.10638812301751213,0.11223267433461143,0.09562691990462446,0.16584054563210562,0.16880175120937072,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16790898391526088,0.16878587875662213,0.08760939390592547,0.08826883013827165,0.06976627328180733,0.16878587875662213,0.17212487289365863,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17418595527657904,0.16842727989091458,0.11369820993358623,0.11840477326238005,0.09436251432212248,0.16842727989091458,0.17115539178952355,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16594743036484896,0.1658062359944304,0.11026813529760135,0.11120663457888436,0.09461275290622558,0.1658062359944304,0.17392494747134057,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1573165947430365,0.1652263557893002,0.09090730203566517,0.08846131911703183,0.09159574808423858,0.1652263557893002,0.17302535598044413,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1757551981169086,0.16847309661880264,0.09540066976616078,0.10053180525144925,0.08685307565574031,0.16847309661880264,0.17177897683044277,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.21498626912514712,0.21914213350139672,0.20682594962726195,0.20530537308686303,0.22051780676784305,0.21914213350139672,0.20646650051345858,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2153785798352295,0.21431468694882683,0.20339035905191832,0.20490233940531982,0.21068017208928977,0.21431468694882683,0.20805950913619745,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.20557081208316988,0.21021795759542097,0.1968806116122229,0.19452111330896502,0.20660241488370254,0.21021795759542097,0.21131334519155867,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.20557081208316988,0.20697558553952417,0.1955732374289882,0.1959711296473684,0.20685387315222065,0.20697558553952417,0.21345944525766622,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.20870929776382896,0.21142873609975746,0.20069745638833925,0.20031409547416407,0.21189370889042625,0.21142873609975746,0.2132525087279328,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29109454688112985,0.25,0.11273169249468246,0.13126232378352984,0.07277363672028246,0.25,0.28761338906670475,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2934484111416242,0.25,0.11343645738550197,0.13315099274124043,0.07336210278540604,0.25,0.28719794852414277,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28050215770890546,0.25,0.1095281862745098,0.12289157031977167,0.07012553942722637,0.25,0.29142158205637386,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2734405649274225,0.25,0.10736290819470118,0.11742949707604036,0.06836014123185563,0.25,0.29072907090099936,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS04,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29933307179285995,0.25,0.11518719806763285,0.13791735131518848,0.07483326794821499,0.25,0.28615939749976377,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29109454688112985,0.25,0.11273169249468246,0.13126232378352984,0.07277363672028246,0.25,0.28761338906670475,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2934484111416242,0.25,0.11343645738550197,0.13315099274124043,0.07336210278540604,0.25,0.28719794852414277,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28050215770890546,0.25,0.1095281862745098,0.12289157031977167,0.07012553942722637,0.25,0.28948279241505,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2734405649274225,0.25,0.10736290819470118,0.11742949707604036,0.06836014123185563,0.25,0.29072907090099936,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29933307179285995,0.25,0.11518719806763285,0.13791735131518848,0.07483326794821499,0.25,0.28615939749976377,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.292271479011377,0.2661161112241035,0.21942342388743202,0.23068675021154267,0.28214272060991996,0.2661161112241035,0.28165875087703557,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2801098469988231,0.2549255303605189,0.215982194323872,0.22795013963301758,0.2488570744662435,0.2549255303605189,0.2836666679609188,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28874068262063557,0.2697440336436994,0.22036665624828053,0.22846615728979278,0.28985179245068,0.2697440336436994,0.2854663974047082,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27736367202824636,0.2620010171540312,0.20612084014490675,0.21208183210992754,0.26948451187252753,0.2620010171540312,0.2895521355662921,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2981561396626128,0.26782272484920294,0.22907172268658277,0.24280072660639296,0.2777159580245768,0.26782272484920294,0.2814514692134097,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 diff --git a/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_summary.csv b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_summary.csv new file mode 100644 index 0000000..b0089e0 --- /dev/null +++ b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_060046_summary.csv @@ -0,0 +1,10 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean,best_cv_accuracy_mean +PEMS04,DAY,W2,4,1 2 3,1,LR,0.16790898391526085,0.009787346334727453,0.1649996903812174,0.00526287694987694,0.1008668321555388,0.011259131214413808,0.10302833160114684,0.01394617821162353,0.08639349147820688,0.010041165105533136,0.1649996903812174,0.00526287694987694,1.0,0.16971539540192496 +PEMS04,DAY,W2,4,1 2 3,1,MLP,0.1682228324833268,0.006580537103573712,0.167343769410014,0.001508410005239077,0.0995767421877878,0.01048368195097025,0.10137467246960344,0.012049232631997824,0.08743807285002685,0.009266551771388512,0.167343769410014,0.001508410005239077,1.0,0.17240190899308191 +PEMS04,DAY,W2,4,1 2 3,1,XGB,0.21004315417810906,0.004351643663824887,0.21241581993698527,0.004104876947460116,0.20067352282174614,0.004138434826001799,0.20020281018453606,0.004434476452511813,0.21130959515669648,0.00505053518017652,0.21241581993698527,0.004104876947460116,1.0,0.21051026176536275 +PEMS04,HOUR,W2,4,1 2 3,1,LR,0.08160062769713614,0.002518133626658487,0.08477333911642992,0.0016799829768817426,0.015885338528390976,0.0030050280304498747,0.015357365373183926,0.002993754778558914,0.01176886594560515,0.0044739794234759395,0.08477333911642992,0.0016799829768817426,1.0,0.0926680561181957 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,0.24841114162416633,0.00811391119390821,0.25099710483395327,0.008278775829584797,0.1735097301607932,0.007911068830298143,0.17316384916960348,0.008774478202697078,0.1482628998708368,0.006702201125381414,0.25099710483395327,0.008278775829584797,1.0,0.2466942745019538 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,0.30058846606512357,0.0077808180941973575,0.2984749159388837,0.00847289493432765,0.24824391532506018,0.008249655189304797,0.25058626957463936,0.007852986296308888,0.24237510680520566,0.011427088466047355,0.2984749159388837,0.00847289493432765,1.0,0.29151867397257597 +PEMS04,WEEK,W2,4,1 2 3,1,LR,0.2875637504903884,0.00932676944189515,0.25,0.0,0.11164928848340565,0.00281973423976062,0.12853034704715416,0.0073750198061960206,0.0718909376225971,0.0023316923604737873,0.25,0.0,1.0,0.2886242776095969 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,0.2875637504903884,0.00932676944189515,0.25,0.0,0.11164928848340565,0.00281973423976062,0.12853034704715416,0.0073750198061960206,0.0718909376225971,0.0023316923604737873,0.25,0.0,1.0,0.2882365196813321 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,0.287328364064339,0.007682080831258888,0.26412188344631116,0.0052602799976685585,0.21819296745821481,0.0074190300851156125,0.2283971211701347,0.009788763622737284,0.2736104114847896,0.014022760129450388,0.26412188344631116,0.0052602799976685585,1.0,0.28435908420447287 diff --git a/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_per_seed.csv b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_per_seed.csv new file mode 100644 index 0000000..551e0dd --- /dev/null +++ b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_per_seed.csv @@ -0,0 +1,61 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,weight_decay,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,n_pca +PEMS04,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.6932130247155748,0.6941319639145171,0.6942625572684392,0.6939806896556191,0.6976121692042306,0.6941319639145171,53 +PEMS04,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.6834052569635151,0.6835452444262821,0.6836340741974372,0.6839088051326119,0.6874783190932171,0.6835452444262821,53 +PEMS04,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.6814437034131032,0.6824255071543726,0.6816665948315458,0.6813189325254241,0.6849944720997171,0.6824255071543726,53 +PEMS04,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.6881129854845037,0.6845245089178612,0.6852462279996206,0.6881332549136298,0.688928663944414,0.6845245089178612,53 +PEMS04,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.675166732051785,0.6756355426721327,0.6761461985832917,0.6767237095666553,0.6865117653582242,0.6756355426721327,53 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.6822283248332679,0.6821269505128856,0.6831440953767758,0.6834370641688398,0.687817374090756,0.6821269505128856,53 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.6779129070223617,0.6775684821171238,0.6787822958959145,0.6788981975625373,0.6838138040696364,0.6775684821171238,53 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.6822283248332679,0.6827925585434866,0.6824149298484574,0.6823392821536937,0.6864014465488708,0.6827925585434866,53 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.6763436641820322,0.6736923919966814,0.6746638811232893,0.6770885375404581,0.680653700937624,0.6736923919966814,53 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.6582973715182424,0.6589270552298094,0.6591832740427505,0.6595675945572759,0.671250258644659,0.6589270552298094,53 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.8540604158493527,0.8551493435263238,0.855319525511535,0.8550514889179491,0.8590473788194197,0.8551493435263238,53 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.8528834837191055,0.851988799303922,0.8515250496528849,0.8521134473895307,0.8563696101427842,0.851988799303922,53 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.8622989407610828,0.8631119441362224,0.8624763260422009,0.862277124493617,0.8649770552835093,0.8631119441362224,53 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.8532757944291879,0.8528650255963891,0.8520984440234369,0.8530750944085073,0.8538422679494571,0.8528650255963891,53 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.8579835229501765,0.8583922696064641,0.8576696805317064,0.8574305971883442,0.8598067128958228,0.8583922696064641,53 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.8109062377402904,0.8123804308711019,0.8122972787540933,0.811573140108613,0.8148489012840919,0.8123804308711019,53 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.8073754413495489,0.8087592571002702,0.8079660805742882,0.8077387515568938,0.8104191267759395,0.8087592571002702,53 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.8077677520596312,0.8070951267205647,0.8077542642761246,0.8084083615606901,0.8103616707020213,0.8070951267205647,53 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.8022754021184778,0.8006155886551323,0.8015925022804898,0.8034613793277408,0.804230989031156,0.8006155886551323,53 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.8069831306394665,0.8074804695204222,0.808463647011869,0.8082571836056719,0.8116410542911501,0.8074804695204222,53 +PEMS04,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.5515888583758337,0.5578443651693926,0.5508492488558924,0.546014554358646,0.5488932726460009,0.5578443651693926,53 +PEMS04,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.5562965868968223,0.5592148152835473,0.5538385814717234,0.5508199068115147,0.554852148110947,0.5592148152835473,53 +PEMS04,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.5441349548842683,0.5510802865034146,0.5440684490604276,0.5386300068555716,0.542331091904402,0.5510802865034146,53 +PEMS04,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.5500196155355042,0.5564654626031593,0.5481185707398095,0.5449437373472824,0.5479994477897242,0.5564654626031593,53 +PEMS04,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.5366810513927031,0.5398836514219405,0.5341203435831314,0.5316087272016756,0.5314962659389452,0.5398836514219405,53 +PEMS04,DAY,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.5351118085523735,0.5406832319667982,0.5365244000814129,0.5318403662798307,0.5365455884764614,0.5406832319667982,53 +PEMS04,DAY,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.5421734013338564,0.5444329418724202,0.5416292613206393,0.538901516715777,0.5434904505652481,0.5444329418724202,53 +PEMS04,DAY,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.5323656335817968,0.5390907716415964,0.5349421639439039,0.5291309796804679,0.5337608180298633,0.5390907716415964,53 +PEMS04,DAY,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.5347194978422911,0.5408159433130691,0.5357608754066502,0.5317195790283707,0.5354190415596174,0.5408159433130691,53 +PEMS04,DAY,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.5194193801490781,0.5226897311728835,0.5196784022627716,0.5167498270113985,0.5187052745336678,0.5226897311728835,53 +PEMS04,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.9380149078069832,0.9388902041594421,0.9388830293639581,0.9380794058703231,0.9393803169082063,0.9388902041594421,53 +PEMS04,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.9313456257355825,0.9317424949176881,0.931555348417862,0.9313245758377113,0.9314695650207387,0.9317424949176881,53 +PEMS04,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.9207532365633582,0.9217838578022802,0.922407080024095,0.9211197441714482,0.9241908094304738,0.9217838578022802,53 +PEMS04,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.9282071400549236,0.9286515652483702,0.9285827040003427,0.928051863977812,0.9288580939853748,0.9286515652483702,53 +PEMS04,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.926637897214594,0.9264616926553233,0.9276039038052682,0.9266900831363677,0.9295710359902003,0.9264616926553233,53 +PEMS04,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.8277755982738328,0.8288802160949185,0.8280076301982808,0.8275943850254385,0.8288429526241118,0.8288802160949185,53 +PEMS04,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.8434680266771283,0.8447455251135552,0.8436266702830547,0.8431229497717828,0.8434965848930908,0.8447455251135552,53 +PEMS04,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.8301294625343272,0.8323612763604195,0.8311694068186597,0.8298841572414152,0.8324488110176421,0.8323612763604195,53 +PEMS04,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.8477834444880346,0.8498091947567933,0.8482068870553526,0.8476131180955276,0.8488602693486377,0.8498091947567933,53 +PEMS04,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.8340525696351511,0.8357871591995278,0.8342730255740506,0.8339807240452561,0.8344519879521028,0.8357871591995278,53 +PEMS04,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.47979599843075715,0.47307593969142797,0.47258514139108043,0.4768911591462789,0.47479363083573944,0.47307593969142797,53 +PEMS04,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.46606512357787366,0.4598108970543641,0.4602328116786179,0.4637159950065879,0.4636992678101131,0.4598108970543641,53 +PEMS04,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.47430364848960377,0.4695126559998576,0.46829326980466246,0.4705301389142278,0.4730306488125466,0.4695126559998576,53 +PEMS04,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.4680266771282856,0.4644854466877528,0.46319523521236394,0.465258497399166,0.46549849999162307,0.4644854466877528,53 +PEMS04,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.4864652805021577,0.478532278127797,0.47758801894607666,0.48315033385453265,0.47988229657549936,0.478532278127797,53 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.47155747351902705,0.46482812265331486,0.4643541627492264,0.4685483707515256,0.46711470541653466,0.46482812265331486,53 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.4648881914476265,0.4580189781675413,0.45821592674919986,0.46245494840998896,0.46146500898925663,0.4580189781675413,53 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.46998823067869755,0.4655526935994883,0.4641972621926237,0.4663748157522915,0.4685096806846736,0.4655526935994883,53 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.4688112985484504,0.46548205628249584,0.46450377838904955,0.46655866270790775,0.46745952460436024,0.46548205628249584,53 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.48332679482149865,0.47529534064745815,0.47496843781673165,0.4807329183029803,0.4772140933873115,0.47529534064745815,53 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.947038054138878,0.9482191579690773,0.9474004193568386,0.9469861979219573,0.9467407126194636,0.9482191579690773,53 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.9391918399372303,0.9404485777401478,0.9394342005185543,0.9391701532639547,0.9387690085194011,0.9404485777401478,53 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.9411533934876423,0.939755770759911,0.9408785445570662,0.9411127430280404,0.9428271306388784,0.939755770759911,53 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.9513534719497843,0.9513568180218525,0.9513189573952184,0.9513425516776304,0.951495880834793,0.9513568180218525,53 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.9333071792859945,0.933202578988727,0.9331069821234323,0.9332730977286716,0.9333888817315449,0.933202578988727,53 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.818752451941938,0.8148761858765448,0.8175088058034927,0.8184335849282177,0.8234487930557632,0.8148761858765448,53 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.8152216555511965,0.8136373650447467,0.8152923253996827,0.8152636062771066,0.8176681975674562,0.8136373650447467,53 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.8175755198116909,0.8160901186670332,0.8175009674112325,0.8176395605139031,0.8203285389467372,0.8160901186670332,53 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.8140447234209494,0.8129084421252389,0.8138971591152253,0.8141136631893274,0.8166628920645007,0.8129084421252389,53 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.8226755590427619,0.8205811346202259,0.8221100375405851,0.8227337527079066,0.8246609360026018,0.8205811346202259,53 diff --git a/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_summary.csv b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_summary.csv new file mode 100644 index 0000000..6b4f604 --- /dev/null +++ b/results/PEMS04/torch_blis_PEMS04_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_202612_summary.csv @@ -0,0 +1,13 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean +PEMS04,DAY,W2,4,1 2 3,1,LR,0.5477442134170263,0.00676050505407234,0.5528977161962909,0.0070678543279352225,0.5461990387421969,0.006842601251648799,0.542403386514938,0.006649733726889122,0.5451144452780039,0.007881973061937853,0.5528977161962909,0.0070678543279352225,53.0 +PEMS04,DAY,W2,4,1 2 3,1,MLP,0.9289917614750882,0.00567428316414737,0.9295059629566207,0.005704288619828493,0.9298064131223052,0.005413730297518688,0.9290531345987324,0.005588528556110379,0.9306939642669988,0.004959368693094257,0.9295059629566207,0.005704288619828493,53.0 +PEMS04,DAY,W2,4,1 2 3,1,SVC,0.5327579442918793,0.0074311560565251105,0.5375425239933534,0.007629675019467118,0.5337070206030756,0.007392503720343357,0.529668453743169,0.0072298487655211635,0.5335842346329717,0.00814473919133132,0.5375425239933534,0.007629675019467118,53.0 +PEMS04,DAY,W2,4,1 2 3,1,XGB,0.8366418203216949,0.007726031306451907,0.838316674305043,0.007801539642292264,0.8370567239858797,0.007639187253573845,0.8364390668358841,0.007704185849911207,0.8376201211671169,0.007412043732030809,0.838316674305043,0.007801539642292264,53.0 +PEMS04,HOUR,W2,4,1 2 3,1,LR,0.6842683405256963,0.00610493955713674,0.6840525534170332,0.005925672447988624,0.6841911305760668,0.005898328398719992,0.684813078358788,0.005891236234825932,0.6891050779399606,0.004442306125028728,0.6840525534170332,0.005925672447988624,53.0 +PEMS04,HOUR,W2,4,1 2 3,1,MLP,0.8561004315417812,0.003590446822643436,0.8563014764338643,0.004061765011361477,0.8558178051523528,0.004006869662146646,0.8559895504795897,0.003633411384557117,0.8588086050181987,0.0037340650991055536,0.8563014764338643,0.004061765011361477,53.0 +PEMS04,HOUR,W2,4,1 2 3,1,SVC,0.6754021184778345,0.008865180453820617,0.6750214876799974,0.008696684153477728,0.6756376952574374,0.008761983292691658,0.6762661351965609,0.008657374817852002,0.6819873168583093,0.005897001175157806,0.6750214876799974,0.008696684153477728,53.0 +PEMS04,HOUR,W2,4,1 2 3,1,XGB,0.8070615927814829,0.0027673898922790977,0.8072661745734984,0.0038128830472273453,0.807614754579373,0.0034367736809508835,0.8078877632319219,0.002592472784898468,0.8103003484168717,0.0034450491288640956,0.8072661745734984,0.0038128830472273453,53.0 +PEMS04,WEEK,W2,4,1 2 3,1,LR,0.47493134562573563,0.007528277954530237,0.4690834435122399,0.006519607615554265,0.46837889540656025,0.006256785220919929,0.4719092248641587,0.0072724860934170925,0.4713808688051043,0.006004202687951358,0.4690834435122399,0.006519607615554265,53.0 +PEMS04,WEEK,W2,4,1 2 3,1,MLP,0.9424087877599059,0.006264208287551853,0.9425965806959431,0.00646972208158222,0.9424278207902219,0.006356399912895778,0.942376948724051,0.006267201458393066,0.9426443228688163,0.006258516725987511,0.9425965806959431,0.00646972208158222,53.0 +PEMS04,WEEK,W2,4,1 2 3,1,SVC,0.47171439780306007,0.00621091170723055,0.4658354382700597,0.005510105437353814,0.46524791357936623,0.005410985608798992,0.46893394318493886,0.006221461947042529,0.4683526026164273,0.0050659572834395655,0.4658354382700597,0.005510105437353814,53.0 +PEMS04,WEEK,W2,4,1 2 3,1,XGB,0.8176539819537073,0.0030123740793177923,0.815618649266758,0.0027081545776752713,0.8172618590540436,0.002786512466681208,0.8176368335232922,0.0029885897067475197,0.820553871527412,0.003123016471764293,0.815618649266758,0.0027081545776752713,53.0 diff --git a/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_per_seed.csv b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_per_seed.csv new file mode 100644 index 0000000..42169ce --- /dev/null +++ b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_per_seed.csv @@ -0,0 +1,46 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,lr_values,weight_decay,cv_folds,no_grid_search,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,best_cv_accuracy,best_params,n_pca +PEMS07,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08502598016060463,0.08665070685240649,0.029147735315112805,0.028296158345499544,0.03703616038699395,0.08665070685240649,0.08736978634788613,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08455361360415682,0.08359031703901527,0.017998361433107544,0.0182240502760218,0.01575842553190753,0.08359031703901527,0.08411836383783156,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08573452999527634,0.08632215619694396,0.01935346806629717,0.018881150718475195,0.013756205237478919,0.08632215619694396,0.0861192288028471,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.08006613131790269,0.08612975391498882,0.015461842031619502,0.014345264656882356,0.008724152940035888,0.08612975391498882,0.08766135912773193,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS07,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07628719886632027,0.08683863360418419,0.018063613814819055,0.01619260804224483,0.02122819374661233,0.08683863360418419,0.08912040635381673,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2531884742560227,0.24925249595868046,0.17770570687544443,0.18003993533254486,0.151922279023698,0.24925249595868046,0.23222145231258454,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.25743977326405293,0.2572336452625252,0.17692759577300857,0.17702821455752726,0.14885835121380356,0.2572336452625252,0.2437682045974844,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2593292394898441,0.2536046640094182,0.19339213117131723,0.19880017808699157,0.17613753229082804,0.2536046640094182,0.2392248758700554,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2420878601794993,0.24196772389309074,0.17622990615491374,0.17587284780513376,0.1568130159225171,0.24196772389309074,0.24318463158051454,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2298063297118564,0.23681723708313127,0.1809700607500094,0.17757305649290425,0.1713699948658658,0.23681723708313127,0.2286369936666887,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2775153519130846,0.27472227593078064,0.238516407436405,0.24064265156979886,0.23434099938030117,0.27472227593078064,0.2766566529065041,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28247520075578647,0.2815116630195719,0.2457169832132096,0.24666454388713518,0.23697467977177342,0.2815116630195719,0.2758648300015958,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27704298535663674,0.27261286232385146,0.235323660647633,0.23926131800079117,0.2293723313392979,0.27261286232385146,0.2751564238206803,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.26547000472366555,0.26543102214340575,0.22989791587153077,0.2291127408015637,0.21398984458357173,0.26543102214340575,0.27899108572251197,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2749173358526216,0.2812087820738212,0.24251044839256766,0.2378980507907492,0.23647679750448405,0.2812087820738212,0.27832438269069926,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.15422768068020784,0.16286685418571384,0.06930284034110037,0.06548587600303173,0.04459175884307444,0.16286685418571384,0.1720718378863476,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16721776098252245,0.16765137200944333,0.08379113984138155,0.08453148075670266,0.08213909539190223,0.16765137200944333,0.16952909784057132,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1740670760510156,0.1732527194068085,0.08934555879860566,0.08945760892274558,0.10459177443369404,0.1732527194068085,0.16827837348293584,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS07,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16650921114785072,0.16337642380801798,0.08084363478113614,0.08167223425368822,0.07868643917989648,0.16337642380801798,0.16873705078123655,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS07,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17784600850259802,0.18126924300430527,0.08850432752275854,0.08736747006650297,0.08973409093473587,0.18126924300430527,0.1688202120734412,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS07,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.15635333018422296,0.1654722899050302,0.0705389030616673,0.06661647898451376,0.044856396766427456,0.1654722899050302,0.17348907249256326,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16863486065186584,0.16792474896533813,0.08538135156187236,0.08605536331425324,0.0980072144534859,0.16792474896533813,0.16552737312343388,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1750118091639112,0.17471917917451824,0.08935938866601069,0.08938985228409939,0.08388675326947959,0.17471917917451824,0.17077947293433302,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.16887104393008975,0.1667221720581483,0.08744374198653919,0.08804823625202937,0.09055760834364064,0.1667221720581483,0.1685285767388717,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17879074161549363,0.18187681013950902,0.08560649358231445,0.08451230513266324,0.11222348690199987,0.18187681013950902,0.16786148795292985,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23405762871988664,0.2373147541303629,0.2249132591322172,0.22371813704439283,0.23666724458256794,0.2373147541303629,0.24085044377050768,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2437411431270666,0.2427287411151499,0.2283970036700548,0.22864804582585543,0.24173218233099375,0.2427287411151499,0.2426013296340138,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23405762871988664,0.23392592464863182,0.22338146501346406,0.22348539406250018,0.22819693350632791,0.23392592464863182,0.24514400191217278,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23972602739726026,0.23906090327938925,0.22926849800089633,0.22981641414457685,0.24238602450811286,0.23906090327938925,0.24251794418738273,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS07,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23830892772791687,0.2385754677376383,0.23106876826584347,0.23101457341512674,0.24414714763325254,0.2385754677376383,0.24431000669773426,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.29948039678790744,0.25,0.11523082515448929,0.13803749295785775,0.07487009919697686,0.25,0.28824510312761314,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS07,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2853094000944733,0.24827456126744657,0.1783792581626199,0.2046012258927255,0.1421975794687121,0.24827456126744657,0.2853271859138272,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS07,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28956069910250354,0.2509141652075494,0.17028504442987716,0.19496406494197302,0.14289423122849673,0.2509141652075494,0.28703637905401785,"{'C': 0.1, 'lr': 0.001, 'weight_decay': 10.0}",1 +PEMS07,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2855455833726972,0.25,0.11106007716332904,0.12685085809207824,0.0713863958431743,0.25,0.2852439307895372,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS07,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27680680207841285,0.25,0.10839807621161672,0.1200212993103588,0.06920170051960321,0.25,0.2861609465480521,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2713745866792631,0.25,0.10672487460523872,0.11584967493757137,0.06784364666981578,0.25,0.28824510312761314,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2827113840340104,0.25,0.11020069968698215,0.12461996932009223,0.0706778460085026,0.25,0.28624426943995945,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2760982522437411,0.25,0.1081806403849713,0.11947394294759701,0.06902456306093528,0.25,0.2874114206867929,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2855455833726972,0.25,0.11106007716332904,0.12685085809207824,0.0713863958431743,0.25,0.285744061018046,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27680680207841285,0.25,0.10839807621161672,0.1200212993103588,0.06920170051960321,0.25,0.28728636858131457,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27704298535663674,0.2500290484191259,0.19216231374904263,0.21226812922063856,0.21646105589524167,0.2500290484191259,0.2824511543004214,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.28719886632026453,0.2513051706324063,0.188150139396488,0.21407014549869902,0.20501750290872245,0.2513051706324063,0.28270134713057,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2805857345299953,0.24855026981054978,0.1889639649587071,0.2119379196876695,0.2690985490482851,0.24855026981054978,0.2793248203861007,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2831837505904582,0.2469347311695443,0.18936037895005875,0.21534576476382652,0.25381781430336414,0.2469347311695443,0.2816177116527085,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2742087860179499,0.24358412581849742,0.18173318705346747,0.20376214714029195,0.18665955013808463,0.24358412581849742,0.2834513261382473,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 diff --git a/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_summary.csv b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_summary.csv new file mode 100644 index 0000000..900d110 --- /dev/null +++ b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_025029_summary.csv @@ -0,0 +1,10 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean,best_cv_accuracy_mean +PEMS07,DAY,W2,4,1 2 3,1,LR,0.16797354747283894,0.00807788246125865,0.16968332248285778,0.0068897631656985245,0.08235750025699647,0.007230320937174159,0.08170293400053422,0.008523104379420464,0.07994863175666062,0.01979666343398322,0.16968332248285778,0.0068897631656985245,1.0,0.16948731441290651 +PEMS07,DAY,W2,4,1 2 3,1,MLP,0.16953235710911668,0.007624587388014108,0.1713430400485088,0.006162166338050261,0.0836659757716808,0.006718848552667195,0.0829244471935118,0.008322600951593392,0.08590629194700669,0.022582445619706914,0.1713430400485088,0.006162166338050261,1.0,0.16923719664842635 +PEMS07,DAY,W2,4,1 2 3,1,XGB,0.2379782711384034,0.0036638109456146035,0.23832115818223443,0.0028414647771806086,0.22740579881649517,0.0028382211730612937,0.2273365128984904,0.0031407616300629364,0.238625906512251,0.005777047253298362,0.23832115818223443,0.0028414647771806086,1.0,0.24308474524036225 +PEMS07,HOUR,W2,4,1 2 3,1,LR,0.08233349078885215,0.0036178467905274648,0.08590631352150775,0.0011840635637260996,0.020005004132191216,0.004742361561217594,0.019187846407824744,0.0048250670972481875,0.019300627568605726,0.009730511451575283,0.08590631352150775,0.0011840635637260996,1.0,0.0868778288940227 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,0.2483703353802551,0.011042269206479865,0.24777515324136914,0.007475706933523832,0.18104508014493867,0.006383514531947513,0.18186284645502035,0.00857732190256132,0.1610202346633425,0.010807729818995067,0.24777515324136914,0.007475706933523832,1.0,0.23740723160546554 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,0.275484175720359,0.005586321212402557,0.2750973210982862,0.005970666081825525,0.2383930831122692,0.0055171847738391755,0.2387158610100076,0.005658274223891654,0.23023093051588567,0.008554434397932223,0.2750973210982862,0.005970666081825525,1.0,0.27699867502839826 +PEMS07,WEEK,W2,4,1 2 3,1,LR,0.2873405762871989,0.007356796347258124,0.2498377452949992,0.0008580447424248819,0.1366706562243864,0.030933611062397195,0.15689498823899867,0.03561758984507585,0.10011000125139262,0.03469661595148144,0.2498377452949992,0.0008580447424248819,1.0,0.2864027090866095 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,0.27850732168162495,0.0050355249773212755,0.25,0.0,0.10891287361042759,0.001539967571479255,0.12136314892153952,0.003911262865411717,0.06962683042040624,0.0012588812443303189,0.25,0.0,1.0,0.2869862445707452 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,0.28044402456306095,0.004551908061085171,0.24808066917002475,0.002681275523101644,0.1880739968215528,0.003445949035376275,0.2114768212622251,0.0040509019061114706,0.2262108944587396,0.030692086844909407,0.24808066917002475,0.002681275523101644,1.0,0.2819092719216096 diff --git a/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_per_seed.csv b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_per_seed.csv new file mode 100644 index 0000000..1c27a10 --- /dev/null +++ b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_per_seed.csv @@ -0,0 +1,61 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,weight_decay,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,n_pca +PEMS07,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.21256495040151158,0.21134094364709757,0.17674075603006836,0.17782225955162792,0.18709408687830034,0.21134094364709757,2 +PEMS07,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.20406235238545112,0.2035324020721286,0.17689666809054727,0.1776671442333195,0.1823408511851781,0.2035324020721286,2 +PEMS07,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.21185640056683988,0.21156757996887834,0.18490760898355982,0.18612827715830269,0.17556200385751253,0.21156757996887834,2 +PEMS07,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.20642418516769012,0.2063367174104556,0.17637638170096573,0.1774616819317334,0.1796681305041022,0.2063367174104556,2 +PEMS07,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.21232876712328766,0.21388168836279822,0.18692246239547192,0.18600151170038262,0.1822387299799423,0.21388168836279822,2 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.19839395370807747,0.20206911377642056,0.16353169877879234,0.16297954810583798,0.19994548860037673,0.20206911377642056,2 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.19910250354274917,0.19713501542098252,0.16703334728652555,0.1685982167526022,0.1705757944399088,0.19713501542098252,2 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.19390647142182332,0.19385892349893327,0.16019226509313142,0.16226450302069637,0.15892813670162934,0.19385892349893327,2 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.1905999055266887,0.18954088720378384,0.1669034856685245,0.1683252542414998,0.17006763771082242,0.18954088720378384,2 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.19744922059518186,0.20301670946092046,0.1756846689074659,0.17314583835272887,0.17827207234084122,0.20301670946092046,2 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.2697213037316958,0.26960270071450265,0.23568527829331787,0.23625999996059302,0.2574340322945069,0.26960270071450265,2 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.27350023618327823,0.27243996620921446,0.23885376804417502,0.24036484724672744,0.2602621909098552,0.27243996620921446,2 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.27657061880018896,0.2757628117036622,0.25144199473683165,0.2527004407341263,0.26098153271684715,0.2757628117036622,2 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.2718469532357109,0.27295386993004217,0.24133112618653088,0.240960121414714,0.2558443878489541,0.27295386993004217,2 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.28153046764289086,0.281016990190377,0.2567163106841224,0.25739745538423453,0.25629784565071373,0.281016990190377,2 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.2727916863486065,0.27419773501769157,0.25947277002342445,0.25884071612032666,0.2673119472499193,0.27419773501769157,2 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.29026924893717526,0.2874906248970506,0.27698405620797445,0.2789959264836125,0.2850460711572546,0.2874906248970506,2 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.2867264997638167,0.28467797014348906,0.27338575825235806,0.275570727485699,0.2768830736983335,0.28467797014348906,2 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.26877657061880017,0.26913917662835657,0.25510909982229735,0.25425229209509587,0.26377021396177536,0.26913917662835657,2 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.28011336797354747,0.2811655351346165,0.2664413527334772,0.26602891594321265,0.2724240862630857,0.2811655351346165,2 +PEMS07,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.17784600850259802,0.18382545891463034,0.1278620109418801,0.12517618426526014,0.1617654330061137,0.18382545891463034,2 +PEMS07,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.18020784128483702,0.17998805547519403,0.1304168759832818,0.12987944026111115,0.11905013975432523,0.17998805547519403,2 +PEMS07,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.18209730751062825,0.18416861408427604,0.13978366931029387,0.13863606496785044,0.19454375692248702,0.18416861408427604,2 +PEMS07,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.17902692489371752,0.1795370728739851,0.12592806483959743,0.12489932185695608,0.12717997290064745,0.1795370728739851,2 +PEMS07,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.17879074161549363,0.17826777770789604,0.12820156246676068,0.1284740267579501,0.3614829378197532,0.17826777770789604,2 +PEMS07,DAY,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.17879074161549363,0.18551810530117918,0.1289602948695238,0.12517202844331765,0.14637711396271796,0.18551810530117918,2 +PEMS07,DAY,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.19201700519603213,0.1916086819372153,0.14219364015748498,0.1431620956646572,0.13075294087393582,0.1916086819372153,2 +PEMS07,DAY,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.18115257439773264,0.1816514101980377,0.13589292739045286,0.13575836117961962,0.1409343543842419,0.1816514101980377,2 +PEMS07,DAY,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.18752952290977798,0.18654498492963284,0.13624441016439168,0.13665579676732012,0.15438237143328526,0.18654498492963284,2 +PEMS07,DAY,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.18469532357109117,0.1861387840823718,0.13795619182187796,0.13680735735151628,0.27823491500281067,0.1861387840823718,2 +PEMS07,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.2560226735947095,0.2596198374782044,0.24667258084286678,0.24537351166657193,0.2749453630483513,0.2596198374782044,2 +PEMS07,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.2553141237600378,0.2534448272613191,0.23382817691332883,0.23433418230178024,0.25559562105871747,0.2534448272613191,2 +PEMS07,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.24775625885687294,0.2475606007030328,0.23501945971401117,0.23518015562716832,0.24194764275118338,0.2475606007030328,2 +PEMS07,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.2453944260746339,0.24699152627722196,0.22497537896508418,0.22378303987456508,0.2579880394609685,0.24699152627722196,2 +PEMS07,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.24822862541332075,0.24732086151637897,0.21863116335197583,0.21892147195301517,0.2501465585195056,0.24732086151637897,2 +PEMS07,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.26759565422768067,0.2699422115905146,0.2609908430664323,0.2597299750102129,0.2719359953571661,0.2699422115905146,2 +PEMS07,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.2683042040623524,0.266121877234682,0.2609987729208358,0.2621393320698086,0.2684103337101898,0.266121877234682,2 +PEMS07,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.26310817194142655,0.26293476317386216,0.25588242592344257,0.2559379924297771,0.2629329876349112,0.26293476317386216,2 +PEMS07,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.2659423712801134,0.2655799887804827,0.2610919974265978,0.26128112845362705,0.26959789996062405,0.2655799887804827,2 +PEMS07,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.2546055739253661,0.2545107838608483,0.2475243810846545,0.24760597384300703,0.2566501512274861,0.2545107838608483,2 +PEMS07,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.30987246102975907,0.2722132879228406,0.1975335746887471,0.22505213026119317,0.1550493584076723,0.2722132879228406,2 +PEMS07,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.3129428436466698,0.2734962406015038,0.19904770487536333,0.22801992753200923,0.1576293969994642,0.2734962406015038,2 +PEMS07,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.3112895606991025,0.27528533977510017,0.19774504378722635,0.2246614299020164,0.1582032832923393,0.27528533977510017,2 +PEMS07,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.30514879546528106,0.26471576718810064,0.19376332160743065,0.22354515835985053,0.1538196415400251,0.26471576718810064,2 +PEMS07,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.30278696268304206,0.26789268633531726,0.19361818051736251,0.2194046071510051,0.15340589823373296,0.26789268633531726,2 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.31459612659423714,0.27015313686568765,0.1919730645294555,0.22056183558451276,0.1631131464900738,0.27015313686568765,2 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.3070382616910723,0.2697616734561703,0.1843393634337145,0.2107017801287847,0.16176478187290882,0.2697616734561703,2 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.29853566367501183,0.2669075649762096,0.176424681466502,0.1994206139111106,0.16075732112586472,0.2669075649762096,2 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.30467642890883323,0.2655620156208807,0.17981874428610756,0.20703814237091311,0.1654844491085267,0.2655620156208807,2 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.2959376476145489,0.26449711595744085,0.17652751024827446,0.19912482185656677,0.1592685863519197,0.26449711595744085,2 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.3127066603684459,0.2785731844359601,0.2233957157128064,0.24680011347887415,0.3041448079702346,0.2785731844359601,2 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.31648559282002836,0.2814119410171174,0.2291897673540154,0.25372591305238373,0.3097247873757292,0.2814119410171174,2 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.31908360888049125,0.2863578364391656,0.2379526048770491,0.2605483716303191,0.30414237860497906,0.2863578364391656,2 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.3240434577231932,0.2860501545798235,0.23432131945540313,0.2589345429463996,0.3247169506463802,0.2860501545798235,2 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.31554085970713275,0.2811747265978746,0.21484921039412466,0.23942812308840342,0.2896026317536653,0.2811747265978746,2 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.33136513934813416,0.3066101950410869,0.27711972338205976,0.29329930319684594,0.32292404126092256,0.3066101950410869,2 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.3209730751062825,0.293342203240036,0.27035853815477323,0.28842992815423907,0.29865257007145424,0.293342203240036,2 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.31837505904581953,0.2900676467918273,0.2589217015535709,0.2783783227538825,0.28314794906830637,0.2900676467918273,2 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.3422295701464336,0.3107315051363952,0.28063622845804376,0.3012501377848487,0.3304299766181168,0.3107315051363952,2 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.3252243741143127,0.2993135414010627,0.2667489856361187,0.2834528162240949,0.30257163818002103,0.2993135414010627,2 diff --git a/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_summary.csv b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_summary.csv new file mode 100644 index 0000000..7c86022 --- /dev/null +++ b/results/PEMS07/torch_blis_PEMS07_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_181419_summary.csv @@ -0,0 +1,13 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean +PEMS07,DAY,W2,4,1 2 3,1,LR,0.1795937647614549,0.0014605219493377692,0.18115739581119633,0.0023886687605112044,0.13043843670836278,0.004885056145973157,0.12941300762182556,0.004989750747612597,0.1928044480806653,0.08850440474016498,0.18115739581119633,0.0023886687605112044,2.0 +PEMS07,DAY,W2,4,1 2 3,1,MLP,0.250543221539915,0.0042993142193605135,0.25098753064723145,0.0049337894190246015,0.23182535195745335,0.009546335220317117,0.23151847228462014,0.009293218990234239,0.25612464496774523,0.010905929064819525,0.25098753064723145,0.0049337894190246015,2.0 +PEMS07,DAY,W2,4,1 2 3,1,SVC,0.1848370335380255,0.004668071527097004,0.18629239328968739,0.003177690018082412,0.13624949288074628,0.0042779733648750954,0.13551112788128616,0.005804926997169465,0.1701363391313983,0.0545926704892805,0.18629239328968739,0.003177690018082412,2.0 +PEMS07,DAY,W2,4,1 2 3,1,XGB,0.2639111950873878,0.004984754259148952,0.263817924928078,0.005163773850667352,0.25729768408439263,0.005277399032999617,0.2573388803612865,0.005310272055888579,0.2659054735780755,0.005491305751744516,0.263817924928078,0.005163773850667352,2.0 +PEMS07,HOUR,W2,4,1 2 3,1,LR,0.20944733112895605,0.003520319486799566,0.20933186629227168,0.003803692690001509,0.18036877544012261,0.004576222999350249,0.1810161749150732,0.004124043996685354,0.1813807604810071,0.0037707032347985606,0.20933186629227168,0.003803692690001509,2.0 +PEMS07,HOUR,W2,4,1 2 3,1,MLP,0.27463391591875297,0.004110946192165246,0.27435526774955965,0.0038620956778134775,0.2448056955889956,0.007957176685263018,0.24553657294807904,0.00807151777027942,0.2581639978841754,0.002085036265506358,0.27435526774955965,0.0038620956778134775,2.0 +PEMS07,HOUR,W2,4,1 2 3,1,SVC,0.19589041095890408,0.0031918839691121694,0.19712412987220812,0.00504663492925111,0.16666909314688796,0.005162572465080728,0.16706267209467304,0.004016248268416581,0.1755578259587157,0.013664805833858706,0.19712412987220812,0.00504663492925111,2.0 +PEMS07,HOUR,W2,4,1 2 3,1,XGB,0.2797354747283892,0.008102979819532678,0.27933420836424083,0.006764003383876136,0.2662786074079063,0.008200268719824415,0.26673771562558934,0.009455544731767185,0.27308707846607366,0.007456845839998782,0.27933420836424083,0.006764003383876136,2.0 +PEMS07,WEEK,W2,4,1 2 3,1,LR,0.30840812470477086,0.0038270437601377496,0.2707206643645725,0.003868443096935527,0.19634156509522596,0.00222611746594338,0.22413665064121488,0.002790535229302463,0.15562151569464677,0.0019585804260212614,0.2707206643645725,0.003868443096935527,2.0 +PEMS07,WEEK,W2,4,1 2 3,1,MLP,0.3175720358998583,0.003824710907887986,0.2827135686139882,0.003020547770924683,0.22794172355867975,0.008179910637529394,0.251887412839276,0.007863445158949293,0.3064663112701977,0.011303780178420904,0.2827135686139882,0.003020547770924683,2.0 +PEMS07,WEEK,W2,4,1 2 3,1,SVC,0.30415682569674074,0.006583373222554313,0.26737630137527785,0.0022450777530324266,0.18181667279281083,0.005840492965175129,0.20736943877037758,0.00795501244038812,0.16207765698985876,0.002117098322060655,0.26737630137527785,0.0022450777530324266,2.0 +PEMS07,WEEK,W2,4,1 2 3,1,XGB,0.32763344355219653,0.008518852882028298,0.3000130183220816,0.007775707774178216,0.27075703543691326,0.00767307818356857,0.28896210162278224,0.007905175008371327,0.3075452350397642,0.017083692789504654,0.3000130183220816,0.007775707774178216,2.0 diff --git a/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_per_seed.csv b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_per_seed.csv new file mode 100644 index 0000000..081a90f --- /dev/null +++ b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_per_seed.csv @@ -0,0 +1,46 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,lr_values,weight_decay,cv_folds,no_grid_search,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,best_cv_accuracy,best_params,n_pca +PEMS08,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07092198581560284,0.08371913580246915,0.012790339808644876,0.011139221123332106,0.011182679184902818,0.08371913580246915,0.08638070764973316,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS08,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07465472191116088,0.08333333333333333,0.01232009287231376,0.01097494435057904,0.006671914181994827,0.08333333333333333,0.0894116096725308,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07017543859649122,0.08425925925925926,0.012794972042467512,0.010622447653099304,0.009008449159547278,0.08425925925925926,0.09198128747446795,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.0851063829787234,0.08378136200716846,0.015205387957810151,0.015456919398161273,0.01313023052359725,0.08378136200716846,0.09942676418264479,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.07764091078760732,0.08333333333333333,0.012491313250498617,0.011729737907692564,0.00677650258455727,0.08333333333333333,0.10146932858931279,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23030981709593132,0.23981292798807674,0.1691505990189218,0.16574811095128367,0.1398037482682814,0.23981292798807674,0.23113922382552543,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.20940649496080627,0.21245027781014822,0.155497912353472,0.15408334645542673,0.14394452243989891,0.21245027781014822,0.22494564143111287,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1955953714072415,0.20912532314273036,0.14707500864549014,0.1405286163939281,0.1233308739180216,0.20912532314273036,0.2328523423601502,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.21799178798058977,0.21619425715715826,0.15313594541655492,0.15497480176155237,0.12939975480755891,0.21619425715715826,0.2226395203268103,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23441582680104517,0.23540959072628906,0.16842154745170138,0.1697710805460362,0.1538935608282509,0.23540959072628906,0.22527508730315612,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27547592385218367,0.2804068683887362,0.2330426672679714,0.23019594464127596,0.23203442259597531,0.2804068683887362,0.27245173617974566,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.27435610302351626,0.27436984387198016,0.2363812429356664,0.23740059667073482,0.2431790521119235,0.27436984387198016,0.2717269552612506,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.269130272489735,0.2774522588903619,0.23276851747968683,0.22955067717699104,0.24832881021088693,0.2774522588903619,0.2710021743427555,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2642777155655095,0.2656957071318485,0.22792970693297207,0.2280596716830847,0.22888724484070458,0.2656957071318485,0.2738354088423272,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.2892870474057484,0.2874269509803571,0.24826963377190323,0.2525050187718001,0.24814463989095467,0.2874269509803571,0.2682348290175924,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17170586039567,0.17156226815762768,0.0848020534341286,0.08502131816318366,0.07429175534664492,0.17156226815762768,0.18106345127495552,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1776782381485629,0.17412913537711835,0.08522052239177724,0.0868546663995502,0.1016442602726485,0.17412913537711835,0.1764512090663504,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17357222844344905,0.16661047565546486,0.07989650920623552,0.08259975884679051,0.062341787244856846,0.16661047565546486,0.17855966264742704,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1862635311683464,0.17342805729506963,0.08859718280812245,0.09430025512469917,0.0675501350041052,0.17342805729506963,0.17249785860183173,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1773049645390071,0.1776343974738094,0.0886351163205596,0.08862467692844091,0.1289923816641374,0.1776343974738094,0.1730908611715095,"{'C': 10.0, 'lr': 0.001, 'weight_decay': 0.1}",1 +PEMS08,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.18029115341545351,0.18041073296584434,0.10001467556640042,0.0993027708588731,0.08472714972052994,0.18041073296584434,0.17533109310140346,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17469204927211646,0.17099246508208318,0.08557751741214406,0.0872916878263556,0.07882209841475239,0.17099246508208318,0.17302497199710087,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.17282568122433745,0.16823526014728915,0.08445440569129227,0.08684908504852516,0.06727272979912388,0.16823526014728915,0.1751334255781775,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1952220977976857,0.18382695794223491,0.10358432865668146,0.10911007612500412,0.10191230194260534,0.18382695794223491,0.1692033998813995,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.1787980589772303,0.17896137579260998,0.08612193736804329,0.0861241773710275,0.07965180504617561,0.17896137579260998,0.17164129933451933,"{'hidden_layer_sizes': (150, 50), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23814856289660322,0.24050158468497865,0.21940400196972779,0.21817976301648914,0.23007900976965448,0.24050158468497865,0.2377940304407986,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS08,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23665546845837998,0.2378045557458115,0.21203907000417624,0.2111137293989622,0.2193899640457015,0.2378045557458115,0.23522435263886146,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.25046659201194477,0.24484853162301062,0.2218394772023187,0.2254489388564316,0.249194585586172,0.24484853162301062,0.232522896488107,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.23926838372527062,0.23388504856323486,0.20987896943992584,0.2144542073862032,0.22074323374622942,0.23388504856323486,0.2320616722672465,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS08,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.24598730869727511,0.24414279227621302,0.2179850005450872,0.21938826302740552,0.22732520356702077,0.24414279227621302,0.24016604071950978,"{'n_estimators': 100, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3318402388951101,0.25,0.12457959641255606,0.16536209213999603,0.08296005972377753,0.25,0.32094616854450814,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3198954833893244,0.25,0.12118212669683258,0.15506245999131843,0.0799738708473311,0.25,0.3230546221255848,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3146696528555431,0.25,0.1196763202725724,0.1506340246207966,0.07866741321388578,0.25,0.3239770705673058,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3284807764091079,0.25,0.12363023321157628,0.16244061997191062,0.08212019410227697,0.25,0.32153917111418595,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3135498320268757,0.25,0.11935208866155157,0.1496913094075451,0.07838745800671892,0.25,0.3241747380905317,"{'C': 1.0, 'lr': 0.001, 'weight_decay': 1.0}",1 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3318402388951101,0.25,0.12457959641255606,0.16536209213999603,0.08296005972377753,0.25,0.32094616854450814,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3198954833893244,0.25,0.12118212669683258,0.15506245999131843,0.0799738708473311,0.25,0.3230546221255848,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3146696528555431,0.25,0.1196763202725724,0.1506340246207966,0.07866741321388578,0.25,0.3239770705673058,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3284807764091079,0.25,0.12363023321157628,0.16244061997191062,0.08212019410227697,0.25,0.32153917111418595,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3135498320268757,0.25,0.11935208866155157,0.1496913094075451,0.07838745800671892,0.25,0.3241747380905317,"{'hidden_layer_sizes': (0, 0), 'activation': 'relu', 'alpha': 0.01, 'lr': 0.001, 'weight_decay': 0.01}",1 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3236282194848824,0.24962543194339765,0.15400493358101827,0.19045772025565544,0.2508017751681173,0.24962543194339765,0.31462080780127827,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3176558417319896,0.2554699539398027,0.1606773651172885,0.18951756530079056,0.2702923924527129,0.2554699539398027,0.3230546221255848,"{'n_estimators': 50, 'learning_rate': 0.1, 'max_depth': 6}",1 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3131765584173199,0.2539089295672336,0.15160725331392794,0.17919899272690504,0.27843805690662077,0.2539089295672336,0.31949660670751795,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3310936916759985,0.26031208914016474,0.16803636940205466,0.20157283443594093,0.3320912776867303,0.26031208914016474,0.31903538248665747,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,None,0.0001,3,False,cuda,0.3098170959313177,0.25160490086140036,0.14692727146895926,0.17396809355725257,0.2453113923702159,0.25160490086140036,0.3192330500098834,"{'n_estimators': 50, 'learning_rate': 0.05, 'max_depth': 6}",1 diff --git a/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_summary.csv b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_summary.csv new file mode 100644 index 0000000..d8561e9 --- /dev/null +++ b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_MLP_XGB_W2_L1_2_3_M1_20260708_055244_summary.csv @@ -0,0 +1,10 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean,best_cv_accuracy_mean +PEMS08,DAY,W2,4,1 2 3,1,LR,0.1773049645390071,0.0050135523375530655,0.17267286679181798,0.0036136915533419513,0.08543027683216468,0.0032050440030619368,0.08748013509253287,0.003951685142955137,0.08696406390647857,0.025002528698319825,0.17267286679181798,0.0036136915533419513,1.0,0.17633260855241484 +PEMS08,DAY,W2,4,1 2 3,1,MLP,0.18036580813736472,0.007902123850630379,0.17648535838601231,0.005893628926741596,0.09195057293891232,0.00813824767449295,0.0937355594459571,0.009102194836382574,0.08247721698463743,0.011272124907007,0.17648535838601231,0.005893628926741596,1.0,0.17286683797852015 +PEMS08,DAY,W2,4,1 2 3,1,XGB,0.24210526315789474,0.005260907182515234,0.2402365025786497,0.004070761922247356,0.21622930383224714,0.0045281349556317105,0.21771698033709833,0.004838163834866359,0.22934639934295564,0.010693152104599183,0.2402365025786497,0.004070761922247356,1.0,0.2355537985109047 +PEMS08,HOUR,W2,4,1 2 3,1,LR,0.07569988801791713,0.005416456035003226,0.0836852847471127,0.0003428011288677563,0.013120421186346983,0.001058136050274614,0.011984654086572857,0.001772652569795142,0.009353955126919888,0.0025123879940674946,0.0836852847471127,0.0003428011288677563,1.0,0.0937339395137379 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,0.21754385964912282,0.01411230969809029,0.2225984753648805,0.012537845199098693,0.15865620257722807,0.00871855958670692,0.1570211912216454,0.010232716862030304,0.13807449205240235,0.010773261926685257,0.2225984753648805,0.012537845199098693,1.0,0.22737036304935096 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,0.2745054124673386,0.00840189063015061,0.27707032585265673,0.007144405180948139,0.23567835367763998,0.006848210038308134,0.23554238178877734,0.009073696940258235,0.240114833930089,0.00815706353126034,0.27707032585265673,0.007144405180948139,1.0,0.27145022072873426 +PEMS08,WEEK,W2,4,1 2 3,1,LR,0.3216871967151922,0.007319970670701176,0.25,0.0,0.12168407305101778,0.002092499341089887,0.1566381012263134,0.006270035709861002,0.08042179917879805,0.001829992667675294,0.25,0.0,1.0,0.3227383540884233 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,0.3216871967151922,0.007319970670701176,0.25,0.0,0.12168407305101778,0.002092499341089887,0.1566381012263134,0.006270035709861002,0.08042179917879805,0.001829992667675294,0.25,0.0,1.0,0.3227383540884233 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,0.31907428144830163,0.007585448776934989,0.2541842610903998,0.003652810220655904,0.15625063857664973,0.007376025363361033,0.1869430412553089,0.009605535346058323,0.2753869789168794,0.03085324792178243,0.2541842610903998,0.003652810220655904,1.0,0.31908809382618436 diff --git a/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_per_seed.csv b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_per_seed.csv new file mode 100644 index 0000000..c7250ae --- /dev/null +++ b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_per_seed.csv @@ -0,0 +1,61 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,weight_decay,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,n_pca +PEMS08,HOUR,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.7211646136618141,0.721984628292072,0.720019196633495,0.7210948752386652,0.7225799894079864,0.721984628292072,83 +PEMS08,HOUR,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.7338559163867114,0.7333896436542839,0.7326845154562355,0.7338566251441947,0.7352593086221475,0.7333896436542839,83 +PEMS08,HOUR,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.7263904441955954,0.7280728901466341,0.7258979747860455,0.7265365317272172,0.7311573646372139,0.7280728901466341,83 +PEMS08,HOUR,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.7084733109369168,0.7118688618025114,0.7111148764623408,0.7078952516312271,0.713327045738283,0.7118688618025114,83 +PEMS08,HOUR,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.7103396789846957,0.7115491678493404,0.7089511003018379,0.7089036020991358,0.7122592607905102,0.7115491678493404,83 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.7159387831280328,0.7165076488051968,0.7148415763745527,0.7160232312975026,0.7175978927841954,0.7165076488051968,83 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.7297499066815976,0.7295922840121163,0.7288803028347001,0.7298906853137707,0.7325210164110464,0.7295922840121163,83 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.7297499066815976,0.7315088427002324,0.7293264915721792,0.7302512172617526,0.7348594475898397,0.7315088427002324,83 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.7084733109369168,0.7111207173136783,0.7107951174939173,0.7077861667519281,0.7128959406447705,0.7111207173136783,83 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.7148189622993655,0.7157291714425842,0.71325560112939,0.7133862268197073,0.7160009947782885,0.7157291714425842,83 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.8857782754759238,0.8857962709725106,0.8846577628999871,0.8859461676754851,0.8856276851326571,0.8857962709725106,83 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.8745800671892497,0.8728032376477376,0.8726155715321724,0.8741575576123859,0.8777932617530152,0.8728032376477376,83 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.8924972004479284,0.8933975453959647,0.8925480589943807,0.8924834999495226,0.893060876433092,0.8933975453959647,83 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.8812989921612542,0.8836168046007095,0.8828859103866685,0.8814893415004263,0.8840830906001308,0.8836168046007095,83 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.8812989921612542,0.8821559740635969,0.8818749221369867,0.8808825174110193,0.8828756440941984,0.8821559740635969,83 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.8312803284807764,0.8318485903098621,0.8312844419070117,0.8321336654870006,0.8342934144162785,0.8318485903098621,83 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.8234415826801045,0.8230345918289933,0.8221992393308338,0.8242027520443926,0.8248807965854974,0.8230345918289933,83 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.8268010451661068,0.8281469198560997,0.8268387641254504,0.8281836936650061,0.8309264219391528,0.8281469198560997,83 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.8238148562896603,0.8258843136279609,0.8255151214012134,0.8243605740086906,0.8267188024668708,0.8258843136279609,83 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.8249346771183277,0.8264135776102485,0.8266381807972635,0.8255738075951272,0.828522266996783,0.8264135776102485,83 +PEMS08,DAY,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.6838372527062336,0.6859821908183034,0.6805588534865711,0.678565773038469,0.6779923529325984,0.6859821908183034,83 +PEMS08,DAY,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.6864501679731243,0.6869138333135315,0.6830866993397644,0.6824682545030062,0.6804525326121903,0.6869138333135315,83 +PEMS08,DAY,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.6759985069055617,0.6768221540902059,0.6715579521758753,0.6719005226537214,0.6687432186390794,0.6768221540902059,83 +PEMS08,DAY,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.6842105263157895,0.6830666369408454,0.6783968982239651,0.68054619702517,0.6760661505326924,0.6830666369408454,83 +PEMS08,DAY,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.6853303471444568,0.6838102878889819,0.6808692032500662,0.6826129992271739,0.6795105190875022,0.6838102878889819,83 +PEMS08,DAY,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.6737588652482269,0.675453319499771,0.6718723036123426,0.6702959888222273,0.6706816891947283,0.675453319499771,83 +PEMS08,DAY,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.6715192235908921,0.6718747981329715,0.6697961043821099,0.6692508007119351,0.6684524696249038,0.6718747981329715,83 +PEMS08,DAY,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.6733855916386712,0.674188495522712,0.6704809858162571,0.6705195433868777,0.6681722385750805,0.674188495522712,83 +PEMS08,DAY,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.6774916013437849,0.6762797339851667,0.6725781717661362,0.6748496286346741,0.6707873599998149,0.6762797339851667,83 +PEMS08,DAY,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.6741321388577828,0.6723977883443705,0.6709406727187613,0.6729617710983168,0.670383783416324,0.6723977883443705,83 +PEMS08,DAY,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.9671519223590892,0.9669174208780384,0.9672097453520964,0.9671101306534607,0.9677158412148915,0.9669174208780384,83 +PEMS08,DAY,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.9738708473310936,0.9740372358031166,0.9739270502519559,0.973845557989879,0.9738360209104951,0.9740372358031166,83 +PEMS08,DAY,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.9708846584546472,0.9710024800989653,0.9706174593814945,0.9708937031394017,0.9703350651950892,0.9710024800989653,83 +PEMS08,DAY,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.9738708473310936,0.9735080741268413,0.9737796403063653,0.9738822838535571,0.9741226047016115,0.9735080741268413,83 +PEMS08,DAY,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.9712579320642031,0.9707682664913141,0.9708823867257658,0.9712259716237411,0.9711087088902389,0.9707682664913141,83 +PEMS08,DAY,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.9070548712206047,0.9066280844118552,0.9065318965210202,0.906775417322893,0.9068927487022977,0.9066280844118552,83 +PEMS08,DAY,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.9130272489734975,0.9131972898511943,0.913538740650899,0.9130658598309905,0.9143533268543742,0.9131972898511943,83 +PEMS08,DAY,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.9107876073161627,0.9105111746353461,0.9100564150145057,0.9105112962377866,0.9103159529276318,0.9105111746353461,83 +PEMS08,DAY,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.9257185516983949,0.9254748776669875,0.9258336772073089,0.9256381263547789,0.9264905103601988,0.9254748776669875,83 +PEMS08,DAY,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.9119074281448302,0.9109497289743206,0.9108710801910586,0.9116177057071178,0.9114709341041938,0.9109497289743206,83 +PEMS08,WEEK,W2,4,1 2 3,1,LR,42,0.99,100,512,0.001,0.0001,cuda,0.662187383351997,0.6506378434730364,0.6542346345448455,0.6606602133808187,0.6601182426680015,0.6506378434730364,83 +PEMS08,WEEK,W2,4,1 2 3,1,LR,43,0.99,100,512,0.001,0.0001,cuda,0.6648002986188877,0.6573203086193842,0.6591203320610064,0.6641118299829813,0.6618754943557936,0.6573203086193842,83 +PEMS08,WEEK,W2,4,1 2 3,1,LR,44,0.99,100,512,0.001,0.0001,cuda,0.658454647256439,0.6505689945897867,0.652392439860616,0.6569343599076605,0.6559685295520195,0.6505689945897867,83 +PEMS08,WEEK,W2,4,1 2 3,1,LR,45,0.99,100,512,0.001,0.0001,cuda,0.6674132138857782,0.6601746984921275,0.661264805494422,0.6671067519824336,0.6629132972523613,0.6601746984921275,83 +PEMS08,WEEK,W2,4,1 2 3,1,LR,56,0.99,100,512,0.001,0.0001,cuda,0.6782381485628965,0.6718699575006659,0.6745764943734005,0.6772057235377832,0.6797981859940614,0.6718699575006659,83 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,42,0.99,100,512,0.001,0.0001,cuda,0.6524822695035462,0.6419035195197607,0.6444237449359007,0.6511931888463904,0.6490639473731763,0.6419035195197607,83 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,43,0.99,100,512,0.001,0.0001,cuda,0.658454647256439,0.6512520315218244,0.6531382494342826,0.6579356026838863,0.6560597142826075,0.6512520315218244,83 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,44,0.99,100,512,0.001,0.0001,cuda,0.6521089958939903,0.6446087560072706,0.6461954481647096,0.6511405041453883,0.6485990119780191,0.6446087560072706,83 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,45,0.99,100,512,0.001,0.0001,cuda,0.6677864874953341,0.6612849441382826,0.6624451323810256,0.6675672987990967,0.6646297028309711,0.6612849441382826,83 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,56,0.99,100,512,0.001,0.0001,cuda,0.6745054124673385,0.668971318057315,0.671143097149583,0.6736736552887956,0.675130348484689,0.668971318057315,83 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,42,0.99,100,512,0.001,0.0001,cuda,0.9761104889884286,0.9747497293853326,0.975568794274867,0.9760930321287822,0.9764686914088864,0.9747497293853326,83 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,43,0.99,100,512,0.001,0.0001,cuda,0.9772303098170959,0.9773190034765511,0.9772316441337565,0.9772352277552264,0.9771536303652599,0.9773190034765511,83 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,44,0.99,100,512,0.001,0.0001,cuda,0.9813363195222098,0.9805944019862237,0.9812695777967027,0.9813310221830641,0.9819882010748506,0.9805944019862237,83 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,45,0.99,100,512,0.001,0.0001,cuda,0.9776035834266518,0.9783276536562919,0.9773957765457624,0.9776021612974274,0.9765385121625798,0.9783276536562919,83 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,56,0.99,100,512,0.001,0.0001,cuda,0.9776035834266518,0.9767575757428222,0.9771251530037071,0.9775847553117575,0.9775373894271986,0.9767575757428222,83 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,42,0.99,100,512,0.001,0.0001,cuda,0.8951101157148189,0.8895839779690545,0.8948427554799623,0.8950970931796154,0.9020499323393567,0.8895839779690545,83 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,43,0.99,100,512,0.001,0.0001,cuda,0.9036954087346024,0.9005874367694463,0.9028527406012478,0.9035986516420831,0.9057540612722237,0.9005874367694463,83 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,44,0.99,100,512,0.001,0.0001,cuda,0.8984695782008212,0.8954361926665025,0.8982083373999412,0.8984116318833113,0.9018123270365448,0.8954361926665025,83 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,45,0.99,100,512,0.001,0.0001,cuda,0.910414333706607,0.906812756636952,0.9092225281149692,0.9102773336117626,0.9121744216381887,0.906812756636952,83 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,56,0.99,100,512,0.001,0.0001,cuda,0.9025755879059351,0.8999853999522623,0.9029804912685904,0.9026306625288619,0.9069969172156321,0.8999853999522623,83 diff --git a/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_summary.csv b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_summary.csv new file mode 100644 index 0000000..bd5b29c --- /dev/null +++ b/results/PEMS08/torch_blis_PEMS08_HOUR_DAY_WEEK_LR_SVC_MLP_XGB_W2_L1_2_3_M1_20260702_201015_summary.csv @@ -0,0 +1,13 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean +PEMS08,DAY,W2,4,1 2 3,1,LR,0.6831653602090332,0.0036982354838375133,0.6833190206103736,0.0035363673328358426,0.6788939212952484,0.003957691261002806,0.6792187492895081,0.003945254195611968,0.6765529547608125,0.004177432654394872,0.6833190206103736,0.0035363673328358426,83.0 +PEMS08,DAY,W2,4,1 2 3,1,MLP,0.9714072415080253,0.0024715110649117934,0.9712466954796553,0.0025271368268484314,0.9712832564035356,0.0024665381798206257,0.9713915294520079,0.002483212824457354,0.9714236481824653,0.0023721694989256325,0.9712466954796553,0.0025271368268484314,83.0 +PEMS08,DAY,W2,4,1 2 3,1,SVC,0.6740574841358715,0.0019381493073157242,0.6740388270969984,0.0016982863493163623,0.6711336476591214,0.0009883816408243007,0.6715755465308062,0.002039513955155364,0.6696955081621703,0.0011405184198343974,0.6740388270969984,0.0016982863493163623,83.0 +PEMS08,DAY,W2,4,1 2 3,1,XGB,0.913699141470698,0.0063364225976626914,0.9133522311079407,0.006419350957248112,0.9133663619169585,0.006623530200940664,0.9135216810907133,0.006406490972552554,0.9139046945897393,0.006731621965968917,0.9133522311079407,0.006419350957248112,83.0 +PEMS08,HOUR,W2,4,1 2 3,1,LR,0.7200447928331467,0.009595382762558937,0.7213730383489685,0.008677541850692647,0.7197335327279909,0.008903392479625873,0.719657377168088,0.010049866532613888,0.7229165938392281,0.009229348780842559,0.7213730383489685,0.008677541850692647,83.0 +PEMS08,HOUR,W2,4,1 2 3,1,MLP,0.883090705487122,0.005908580496426838,0.883553966536104,0.006625110975108738,0.8829164451900391,0.0063717167639899255,0.8829918168297679,0.006059223538351062,0.8846881116026187,0.004943198006470446,0.883553966536104,0.006625110975108738,83.0 +PEMS08,HOUR,W2,4,1 2 3,1,SVC,0.719746173945502,0.008555704730337071,0.7208917328547616,0.008121177130253744,0.7194198178809479,0.008012319007650877,0.7194675054889322,0.009057922133771467,0.7227750584416281,0.009069775179471093,0.7208917328547616,0.008121177130253744,83.0 +PEMS08,HOUR,W2,4,1 2 3,1,XGB,0.826054497946995,0.0028623052650512564,0.8270655986466329,0.002902269680772162,0.8264951495123546,0.0029151723783898795,0.8268908985600435,0.0029840015706584402,0.8290683404809165,0.0032896174045326846,0.8270655986466329,0.002902269680772162,83.0 +PEMS08,WEEK,W2,4,1 2 3,1,LR,0.6662187383351996,0.006699819379226424,0.6581143605350002,0.007834830099614517,0.660317741266858,0.007816103241154117,0.6652037757583354,0.006897646151784931,0.6641347499644474,0.008182406706754,0.6581143605350002,0.007834830099614517,83.0 +PEMS08,WEEK,W2,4,1 2 3,1,MLP,0.9779768570362075,0.0017666531640461646,0.9775496728494444,0.0019181209159127063,0.9777181891509592,0.0018933899471682651,0.9779692397352516,0.001768789679257519,0.977937284887755,0.0020638451825533573,0.9775496728494444,0.0019181209159127063,83.0 +PEMS08,WEEK,W2,4,1 2 3,1,SVC,0.6610675625233295,0.00879215857883524,0.6536041138488907,0.010183307721411725,0.6554691344131003,0.010077425917705829,0.6603020499527115,0.008989872245743609,0.6586965449898925,0.01006948107126738,0.6536041138488907,0.010183307721411725,83.0 +PEMS08,WEEK,W2,4,1 2 3,1,XGB,0.9020530048525568,0.005175462489716186,0.8984811527988436,0.005736659591398958,0.9016213705729422,0.004873181613883117,0.9020030745691269,0.005137978884062553,0.9057575319003892,0.0037953523640011774,0.8984811527988436,0.005736659591398958,83.0 diff --git a/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_per_seed.csv b/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_per_seed.csv new file mode 100644 index 0000000..fbe9a78 --- /dev/null +++ b/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_per_seed.csv @@ -0,0 +1,2 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,seed,pca_variance,epochs,batch_size,lr,weight_decay,device,accuracy,balanced_accuracy,macro_f1,weighted_f1,macro_precision,macro_recall,n_pca +PEMS08,DAY,W2,4,1,1,LR,42,0.99,5,512,0.001,0.0001,cpu,0.1534154535274356,0.14800469719004988,0.1306853884201596,0.1346955481705436,0.15227362084825022,0.14800469719004988,6 diff --git a/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_summary.csv b/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_summary.csv new file mode 100644 index 0000000..559fd9a --- /dev/null +++ b/results/torch_blis_PEMS08_DAY_LR_W2_L1_M1_20260702_162438_summary.csv @@ -0,0 +1,2 @@ +dataset,task,wavelet_type,largest_scale,layers,moments,model,accuracy_mean,accuracy_std,balanced_accuracy_mean,balanced_accuracy_std,macro_f1_mean,macro_f1_std,weighted_f1_mean,weighted_f1_std,macro_precision_mean,macro_precision_std,macro_recall_mean,macro_recall_std,n_pca_mean +PEMS08,DAY,W2,4,1,1,LR,0.1534154535274356,0.0,0.14800469719004988,0.0,0.1306853884201596,0.0,0.1346955481705436,0.0,0.15227362084825022,0.0,0.14800469719004988,0.0,6.0 diff --git a/run_results/10fold_partly_cloudy_0000_BlisNet_16_EMOTION3.csv b/run_results/10fold_partly_cloudy_0000_BlisNet_16_EMOTION3.csv new file mode 100644 index 0000000..d9971b2 --- /dev/null +++ b/run_results/10fold_partly_cloudy_0000_BlisNet_16_EMOTION3.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +BlisNet,16,100,0.001,EMOTION3,partly_cloudy,0000,68.62745098039215,11.764705882352942 diff --git a/run_results/10fold_synthetic_gaussian_pm_0_BlisNet_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_0_BlisNet_16_PLUSMINUS.csv new file mode 100644 index 0000000..2384369 --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_0_BlisNet_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +BlisNet,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_0,100.0,0.0 diff --git a/run_results/10fold_synthetic_gaussian_pm_0_GAT_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_0_GAT_16_PLUSMINUS.csv new file mode 100644 index 0000000..c82ba71 --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_0_GAT_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +GAT,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_0,99.16666666666667,0.0 diff --git a/run_results/10fold_synthetic_gaussian_pm_0_GCN_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_0_GCN_16_PLUSMINUS.csv new file mode 100644 index 0000000..87ed03e --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_0_GCN_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +GCN,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_0,99.58333333333334,0.4166666666666643 diff --git a/run_results/10fold_synthetic_gaussian_pm_0_GIN_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_0_GIN_16_PLUSMINUS.csv new file mode 100644 index 0000000..f545027 --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_0_GIN_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +GIN,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_0,99.58333333333334,0.4166666666666643 diff --git a/run_results/10fold_synthetic_gaussian_pm_0_GPS_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_0_GPS_16_PLUSMINUS.csv new file mode 100644 index 0000000..fb3adea --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_0_GPS_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +GPS,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_0,100.0,0.0 diff --git a/run_results/10fold_synthetic_gaussian_pm_1_BlisNet_16_PLUSMINUS.csv b/run_results/10fold_synthetic_gaussian_pm_1_BlisNet_16_PLUSMINUS.csv new file mode 100644 index 0000000..b9156c4 --- /dev/null +++ b/run_results/10fold_synthetic_gaussian_pm_1_BlisNet_16_PLUSMINUS.csv @@ -0,0 +1,2 @@ +model,hidden_dim,epochs,learning_rate,task_type,dataset,sub_dataset,score,stdev +BlisNet,16,100,0.001,PLUSMINUS,synthetic,gaussian_pm_1,100.0,0.0 diff --git a/run_torch_pems03.slurm b/run_torch_pems03.slurm new file mode 100644 index 0000000..e859723 --- /dev/null +++ b/run_torch_pems03.slurm @@ -0,0 +1,51 @@ +#!/bin/bash +#SBATCH -J torch_PEMS03 +#SBATCH -o /bsuscratch/desmondboateng/blis/logs/%x-%j.out +#SBATCH -e /bsuscratch/desmondboateng/blis/logs/%x-%j.err +#SBATCH -p gpu-v100 +#SBATCH --gres=gpu:1 +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 16 +#SBATCH --mem=128G +#SBATCH -t 3-00:00:00 + +set -eo pipefail + +cd /bsuscratch/desmondboateng/blis + +mkdir -p logs +mkdir -p results/PEMS03 + +source ~/miniforge3/etc/profile.d/conda.sh +conda activate blis + +echo "Starting GPU BLIS W2 Torch classifier run for PEMS03" +echo "Date: $(date)" +echo "Working directory: $(pwd)" +echo "Python: $(which python)" +echo "CUDA_VISIBLE_DEVICES: ${CUDA_VISIBLE_DEVICES:-not_set}" + +python torch_classify_scattering.py \ + --data_dir data \ + --dataset traffic \ + --sub_datasets PEMS03 \ + --task_types HOUR DAY WEEK \ + --wavelet_type W2 \ + --largest_scale 4 \ + --highest_moment 3 \ + --layer_list 1 2 3 \ + --moment_list 1 \ + --models LR MLP XGB \ + --seeds 42 43 44 45 56 \ + --pca_variance 0.99 \ + --epochs 100 \ + --batch_size 512 \ + --lr 1e-3 \ + --weight_decay 1e-4 \ + --cv_folds 3 \ + --device cuda \ + --results_dir results/PEMS03 + +echo "Finished GPU BLIS W2 Torch classifier run for PEMS03" +echo "Date: $(date)" \ No newline at end of file diff --git a/run_torch_pems04.slurm b/run_torch_pems04.slurm new file mode 100644 index 0000000..40f96cb --- /dev/null +++ b/run_torch_pems04.slurm @@ -0,0 +1,51 @@ +#!/bin/bash +#SBATCH -J torch_PEMS04 +#SBATCH -o /bsuscratch/desmondboateng/blis/logs/%x-%j.out +#SBATCH -e /bsuscratch/desmondboateng/blis/logs/%x-%j.err +#SBATCH -p gpu-v100 +#SBATCH --gres=gpu:1 +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 16 +#SBATCH --mem=128G +#SBATCH -t 3-00:00:00 + +set -eo pipefail + +cd /bsuscratch/desmondboateng/blis + +mkdir -p logs +mkdir -p results/PEMS04 + +source ~/miniforge3/etc/profile.d/conda.sh +conda activate blis + +echo "Starting GPU BLIS W2 Torch classifier run for PEMS04" +echo "Date: $(date)" +echo "Working directory: $(pwd)" +echo "Python: $(which python)" +echo "CUDA_VISIBLE_DEVICES: ${CUDA_VISIBLE_DEVICES:-not_set}" + +python torch_classify_scattering.py \ + --data_dir data \ + --dataset traffic \ + --sub_datasets PEMS04 \ + --task_types HOUR DAY WEEK \ + --wavelet_type W2 \ + --largest_scale 4 \ + --highest_moment 3 \ + --layer_list 1 2 3 \ + --moment_list 1 \ + --models LR MLP XGB \ + --seeds 42 43 44 45 56 \ + --pca_variance 0.99 \ + --epochs 100 \ + --batch_size 512 \ + --lr 1e-3 \ + --weight_decay 1e-4 \ + --cv_folds 3 \ + --device cuda \ + --results_dir results/PEMS04 + +echo "Finished GPU BLIS W2 Torch classifier run for PEMS04" +echo "Date: $(date)" \ No newline at end of file diff --git a/run_torch_pems07.slurm b/run_torch_pems07.slurm new file mode 100644 index 0000000..6023203 --- /dev/null +++ b/run_torch_pems07.slurm @@ -0,0 +1,51 @@ +#!/bin/bash +#SBATCH -J torch_PEMS07 +#SBATCH -o /bsuscratch/desmondboateng/blis/logs/%x-%j.out +#SBATCH -e /bsuscratch/desmondboateng/blis/logs/%x-%j.err +#SBATCH -p gpu-v100 +#SBATCH --gres=gpu:1 +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 16 +#SBATCH --mem=128G +#SBATCH -t 7-00:00:00 + +set -eo pipefail + +cd /bsuscratch/desmondboateng/blis + +mkdir -p logs +mkdir -p results/PEMS07 + +source ~/miniforge3/etc/profile.d/conda.sh +conda activate blis + +echo "Starting GPU BLIS W2 Torch classifier run for PEMS07" +echo "Date: $(date)" +echo "Working directory: $(pwd)" +echo "Python: $(which python)" +echo "CUDA_VISIBLE_DEVICES: ${CUDA_VISIBLE_DEVICES:-not_set}" + +python torch_classify_scattering.py \ + --data_dir data \ + --dataset traffic \ + --sub_datasets PEMS07 \ + --task_types HOUR DAY WEEK \ + --wavelet_type W2 \ + --largest_scale 4 \ + --highest_moment 3 \ + --layer_list 1 2 3 \ + --moment_list 1 \ + --models LR MLP XGB \ + --seeds 42 43 44 45 56 \ + --pca_variance 0.99 \ + --epochs 100 \ + --batch_size 512 \ + --lr 1e-3 \ + --weight_decay 1e-4 \ + --cv_folds 3 \ + --device cuda \ + --results_dir results/PEMS07 + +echo "Finished GPU BLIS W2 Torch classifier run for PEMS07" +echo "Date: $(date)" \ No newline at end of file diff --git a/run_torch_pems08.slurm b/run_torch_pems08.slurm new file mode 100644 index 0000000..dec26de --- /dev/null +++ b/run_torch_pems08.slurm @@ -0,0 +1,51 @@ +#!/bin/bash +#SBATCH -J torch_PEMS08 +#SBATCH -o /bsuscratch/desmondboateng/blis/logs/%x-%j.out +#SBATCH -e /bsuscratch/desmondboateng/blis/logs/%x-%j.err +#SBATCH -p gpu-v100 +#SBATCH --gres=gpu:1 +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -c 16 +#SBATCH --mem=128G +#SBATCH -t 3-00:00:00 + +set -eo pipefail + +cd /bsuscratch/desmondboateng/blis + +mkdir -p logs +mkdir -p results/PEMS08 + +source ~/miniforge3/etc/profile.d/conda.sh +conda activate blis + +echo "Starting GPU BLIS W2 Torch classifier run for PEMS08" +echo "Date: $(date)" +echo "Working directory: $(pwd)" +echo "Python: $(which python)" +echo "CUDA_VISIBLE_DEVICES: ${CUDA_VISIBLE_DEVICES:-not_set}" + +python torch_classify_scattering.py \ + --data_dir data \ + --dataset traffic \ + --sub_datasets PEMS08 \ + --task_types HOUR DAY WEEK \ + --wavelet_type W2 \ + --largest_scale 4 \ + --highest_moment 3 \ + --layer_list 1 2 3 \ + --moment_list 1 \ + --models LR MLP XGB \ + --seeds 42 43 44 45 56 \ + --pca_variance 0.99 \ + --epochs 100 \ + --batch_size 512 \ + --lr 1e-3 \ + --weight_decay 1e-4 \ + --cv_folds 3 \ + --device cuda \ + --results_dir results/PEMS08 + +echo "Finished GPU BLIS W2 Torch classifier run for PEMS08" +echo "Date: $(date)" \ No newline at end of file diff --git a/scripts/calculate_scattering.py b/scripts/calculate_scattering.py index 53d2b83..0ca8328 100644 --- a/scripts/calculate_scattering.py +++ b/scripts/calculate_scattering.py @@ -1,6 +1,9 @@ +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import numpy as np import matplotlib.pyplot as plt -import os + import blis.models.scattering_transform as st import blis.models.wavelets as wav from blis import DATA_DIR @@ -9,6 +12,7 @@ # example usage: python calculate_scattering.py --scattering_type blis --wavelet_type W2 --largest_scale 4 --highest_moment 3 --dataset traffic --sub_dataset PEMS08 +print('Started') def validate_args(args): # Check if dataset is 'traffic' and sub_dataset is valid if args.dataset == 'traffic' and args.sub_dataset not in ['PEMS08', 'PEMS07', 'PEMS04', 'PEMS03']: @@ -46,23 +50,31 @@ def main(): dataset_dir = os.path.join(DATA_DIR, args.dataset, args.sub_dataset) # the processed directory records scattering type and the largest wavelet scale - processed_dir = os.path.join(dataset_dir, 'processed', args.scattering_type, args.wavelet_type, f'largest_scale_{args.largest_scale}') + processed_dir = os.path.join(dataset_dir, 'processed', args.scattering_type, args.wavelet_type, f'largest_scale_{args.largest_scale}') + print(processed_dir) if not os.path.exists(processed_dir): os.makedirs(processed_dir) # load adjacency matrix and signal A = np.load(os.path.join(dataset_dir, 'adjacency_matrix.npy')) x = np.load(os.path.join(dataset_dir, 'graph_signals.npy')) - import pdb; pdb.set_trace() + print(f'this is the shape of x initially: {x.shape}') + print('Adjacency matrix and signals loaded)') + #import pdb; pdb.set_trace() if len(x.shape) == 2: x = x[:,:,None] + print(f'this is the shape of x in calculate scattering: {x.shape}') # ensure that we're working with symmetric matrices! assert((A == A.T).all()) if args.wavelet_type == 'W2': - wavelets = wav.get_W_2(A, args.largest_scale, low_pass_as_wavelet=(args.scattering_type == 'blis')) + wavelets= wav.get_W_2(A, args.largest_scale, low_pass_as_wavelet=(args.scattering_type == 'blis')) + #wavelets = wav.compute_W_2_transform(A,x,args.largest_scale,low_pass_as_wavelet=(args.scattering_type == 'blis')) + print(f'this is the shape of wavelets in calculate: {wavelets.shape}') else: wavelets = wav.get_W_1(A, args.largest_scale, low_pass_as_wavelet=(args.scattering_type == 'blis')) - st.scattering_transform(x, args.scattering_type, wavelets, args.num_layers, args.highest_moment, processed_dir) + print('Started calculating') + print(f"this is the shape of x in pre-calculating scattering: {x.shape}") + st.scattering_transform(x, args.scattering_type, wavelets, args.num_layers, args.highest_moment, processed_dir,args.wavelet_type) if __name__ == "__main__": start_time = time.time() # Record the start time diff --git a/scripts/classify_scattering.py b/scripts/classify_scattering.py index 01ea247..f2df83b 100644 --- a/scripts/classify_scattering.py +++ b/scripts/classify_scattering.py @@ -1,3 +1,8 @@ +import os +import sys +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + + from blis.data import traffic, cloudy, synthetic import argparse from sklearn.pipeline import Pipeline @@ -15,10 +20,11 @@ import numpy as np import pandas as pd import warnings -import os from sklearn.exceptions import ConvergenceWarning warnings.filterwarnings('ignore', category=ConvergenceWarning) +print(f'this is the initiating the classifier') + def run_classifier_scattering(args,scattering_dict): full_test_scores = [] full_train_scores = [] @@ -115,6 +121,7 @@ def run_classifier_scattering(args,scattering_dict): } clf = GridSearchCV(pipeline, param_grid, cv = 3) + print(f"Fitting model {args.model} for dataset {args.dataset} with sub-dataset {args.sub_dataset}, scattering type {args.scattering_type}, wavelet type {scattering_dict['wavelet_type']}, largest scale {scattering_dict['scale_type']}, task type {args.task_type}, PCA variance {args.PCA_variance}, moment list {args.moment_list}, layer list {args.layer_list}") clf.fit(X_train, y_train) y_pred = clf.predict(X_test) @@ -122,8 +129,8 @@ def run_classifier_scattering(args,scattering_dict): print("Best parameters found: ",clf.best_params_) train_score = clf.score(X_train, y_train) test_score = clf.score(X_test, y_test) - #print("Train score : ", train_score) - #print("Test score : ", test_score) + print("Train score : ", train_score) + print("Test score : ", test_score) full_test_scores.append(test_score) full_train_scores.append(train_score) full_n_pca.append(n_comp) @@ -234,7 +241,13 @@ def run_classifier_scattering(args,scattering_dict): save_name = f'{args.dataset}_{sub_dataset}_{wavelet_type}_{scattering_type}_{args.task_type}_{layer_list}_{args.largest_scale}_ignore_graph.csv' else: save_name = f'{args.dataset}_{sub_dataset}_{wavelet_type}_{scattering_type}_{args.task_type}_{layer_list}_{args.largest_scale}.csv' - df_results.to_csv(os.path.join('run_results', save_name), index = False) + save_dir='run_results' + if os.path.exists(save_dir): + df_results.to_csv(os.path.join(save_dir,save_name), index = False) + else: + os.mkdir(save_dir) + df_results.to_csv(os.path.join(save_dir,save_name), index = False) + #Example : python classify_scattering.py --dataset=traffic --largest_scale=4 --sub_dataset=PEMS04 --scattering_type=blis --task_type=DAY #Example : python classify_scattering.py --dataset=partly_cloudy --sub_dataset=0001 --largest_scale=4 --scattering_type=blis --task_type=EMOTION3 --moment_list 1 --layer_list 1 2 3 --model SVC diff --git a/scripts/classify_torch.py b/scripts/classify_torch.py index 4d9beff..416d119 100644 --- a/scripts/classify_torch.py +++ b/scripts/classify_torch.py @@ -1,9 +1,11 @@ +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from blis.data import traffic, cloudy, synthetic from blis.models.GPS import GPS import argparse import torch import torch_geometric.transforms as T - from blis.models.GNN_models import GCN, GAT, GIN, GNNML1, GNNML3, ChebNet, MLP, PPGN from blis.models.blis_legs_layer import BlisNet import argparse @@ -21,7 +23,7 @@ def main(args): print(f'Training {args.model} on dataset {args.dataset, args.sub_dataset} on task {args.task_type}') total_performance = [] #for seed in [42,43,44,45,46]: - for seed in np.arange(1,11): + for seed in np.arange(1,5): if args.model == "GPS": transform = T.AddRandomWalkPE(walk_length=20, attr_name='pe') @@ -29,7 +31,7 @@ def main(args): transform = T.LaplacianLambdaMax(normalization="sym", is_undirected = True) # Check that all graphs are indeed undirected. elif args.model == "GNNML3": transform = SpectralDesign(nmax=0,recfield=1,dv=2,nfreq=4) - elif args.model == "PPGN": + elif args.model == "PPGN": transform = SpectralDesign(nmax=-1,recfield=1,dv=2,nfreq=4) else: transform = None @@ -105,7 +107,7 @@ def main(args): edge_in_channels = None, trainable_laziness = False) elif args.model == 'MLP': - raise ValueError("Not yet implemented (at least correctly lol)") + #raise ValueError("Not yet implemented (at least correctly lol)") model = MLP(in_features = mlp_in_dim, hidden_channels = args.hidden_dim, num_classes = num_classes) else: raise ValueError("Invalid model") @@ -208,7 +210,7 @@ def csv_to_list(csv_str): results_list = [] model_list = args.model if args.model[0] == 'all': - model_list = ['GCN', 'GAT', 'GIN', 'ChebNet', 'BlisNet', 'GNNML1', 'GNNML3', 'MLP'] + model_list = ['GCN', 'GAT', 'GIN', 'ChebNet', 'BlisNet', 'GNNML1', 'GNNML3'] for model in model_list: for sub_dataset in sub_datasets: @@ -236,7 +238,13 @@ def csv_to_list(csv_str): args.model = 'multi-model' save_name = f'10fold_{args.dataset}_{sub_dataset}_{args.model}_{args.hidden_dim}_{args.task_type}.csv' - df_results.to_csv(os.path.join('run_results',save_name), index = False) + print(save_name) + save_dir='run_results' + if os.path.exists(save_dir): + df_results.to_csv(os.path.join(save_dir,save_name), index = False) + else: + os.mkdir(save_dir) + df_results.to_csv(os.path.join(save_dir,save_name), index = False) #main(args) diff --git a/scripts/process_results.ipynb b/scripts/process_results.ipynb index df735b3..b2e5aa0 100644 --- a/scripts/process_results.ipynb +++ b/scripts/process_results.ipynb @@ -3063,9 +3063,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python (blis)", + "display_name": "Python 3", "language": "python", - "name": "blis" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -3077,7 +3077,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.18" + "version": "3.12.4" }, "orig_nbformat": 4 }, diff --git a/torch_classify_scattering.py b/torch_classify_scattering.py new file mode 100644 index 0000000..2bc950e --- /dev/null +++ b/torch_classify_scattering.py @@ -0,0 +1,1223 @@ +import os +import sys +import argparse +import itertools +import numpy as np +import pandas as pd +import torch + +from datetime import datetime +from sklearn.model_selection import train_test_split, StratifiedKFold +from sklearn.metrics import ( + accuracy_score, + balanced_accuracy_score, + f1_score, + precision_score, + recall_score, +) + +sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) + +from new_class import GraphScattering + + +def make_graph_scattering(device): + try: + gs = GraphScattering(device=device) + except TypeError: + gs = GraphScattering() + + return gs + + +def load_moment_features( + data_dir, + dataset, + sub_dataset, + wavelet_type, + largest_scale, + layer_list, + moment_list, +): + base_dir = os.path.join( + data_dir, + dataset, + sub_dataset, + "processed", + "blis", + wavelet_type, + f"largest_scale_{largest_scale}", + ) + + features = [] + + for layer in layer_list: + for moment in moment_list: + path = os.path.join( + base_dir, + f"layer_{layer}", + f"moment_{moment}.npy", + ) + + if not os.path.exists(path): + raise FileNotFoundError(f"Missing moment file: {path}") + + print(f"Loading: {path}") + + X = np.load(path) + X = X.reshape(X.shape[0], -1) + features.append(X) + + X_features = np.concatenate(features, axis=1) + X_features = X_features.astype(np.float32) + + return X_features + + +def load_labels(data_dir, dataset, sub_dataset, task_type): + label_path = os.path.join( + data_dir, + dataset, + sub_dataset, + task_type, + "label.npy", + ) + + if not os.path.exists(label_path): + raise FileNotFoundError(f"Missing label file: {label_path}") + + y = np.load(label_path) + + classes = np.unique(y) + class_to_id = {c: i for i, c in enumerate(classes)} + + y = np.array([class_to_id[c] for c in y], dtype=np.int64) + + return y + + +def split_like_blis(X_features, y, seed): + all_idx = np.arange(len(X_features)) + + train_idx, val_test_idx = train_test_split( + all_idx, + test_size=0.30, + random_state=seed, + ) + + val_idx, test_idx = train_test_split( + val_test_idx, + test_size=0.50, + random_state=seed, + ) + + train_val_idx = np.concatenate([train_idx, val_idx], axis=0) + + X_train = X_features[train_val_idx] + y_train = y[train_val_idx] + + X_test = X_features[test_idx] + y_test = y[test_idx] + + return X_train, X_test, y_train, y_test + + +def set_seed(seed, device): + np.random.seed(seed) + torch.manual_seed(seed) + + if device.type == "cuda": + torch.cuda.manual_seed_all(seed) + + +def torch_fit_pca(X_train, pca_variance): + """ + Match the BLIS-Net behavior: + + pca_variance == 1 -> no PCA + 0 < pca_variance < 1 -> keep enough components for that variance + pca_variance > 1 -> use int(pca_variance) fixed components + """ + if pca_variance == 1: + return X_train, None, -1 + + if pca_variance <= 0: + raise ValueError("pca_variance must be positive.") + + mean = X_train.mean(dim=0, keepdim=True) + X_train_centered = X_train - mean + + U, S, Vh = torch.linalg.svd( + X_train_centered, + full_matrices=False, + ) + + max_components = Vh.shape[0] + + if pca_variance > 1: + num_components = int(pca_variance) + num_components = min(num_components, max_components) + + else: + eigvals = S ** 2 + explained = eigvals / eigvals.sum() + cumulative = torch.cumsum(explained, dim=0) + + num_components = int(torch.searchsorted(cumulative, pca_variance).item()) + 1 + num_components = min(num_components, max_components) + + V = Vh[:num_components].T + + X_train_pca = X_train_centered @ V + + pca_state = { + "mean": mean, + "V": V, + } + + print(f"PCA components: {num_components}") + + return X_train_pca, pca_state, num_components + + +def torch_apply_pca(X, pca_state): + if pca_state is None: + return X + + return (X - pca_state["mean"]) @ pca_state["V"] + + +def torch_fit_standardizer(X_train, eps=1e-12): + mean = X_train.mean(dim=0, keepdim=True) + std = X_train.std(dim=0, keepdim=True) + + std = torch.where( + std > eps, + std, + torch.ones_like(std), + ) + + scaler_state = { + "mean": mean, + "std": std, + } + + return scaler_state + + +def torch_apply_standardizer(X, scaler_state): + return (X - scaler_state["mean"]) / scaler_state["std"] + + +def torch_standardize_fit_transform(X_train, X_test): + scaler_state = torch_fit_standardizer(X_train) + + X_train = torch_apply_standardizer(X_train, scaler_state) + X_test = torch_apply_standardizer(X_test, scaler_state) + + return X_train, X_test, scaler_state + + +class TorchLR(torch.nn.Module): + def __init__(self, input_dim, num_classes): + super().__init__() + + self.linear = torch.nn.Linear(input_dim, num_classes) + + def forward(self, x): + return self.linear(x) + + +class TorchMLP(torch.nn.Module): + def __init__(self, input_dim, num_classes, hidden_layer_sizes): + super().__init__() + + layers = [] + previous_dim = input_dim + + for hidden_dim in hidden_layer_sizes: + layers.append(torch.nn.Linear(previous_dim, hidden_dim)) + layers.append(torch.nn.ReLU()) + previous_dim = hidden_dim + + layers.append(torch.nn.Linear(previous_dim, num_classes)) + + self.net = torch.nn.Sequential(*layers) + + def forward(self, x): + return self.net(x) + + +def build_torch_model(model_name, input_dim, num_classes, params): + if model_name == "LR": + return TorchLR(input_dim, num_classes) + + if model_name == "MLP": + return TorchMLP( + input_dim=input_dim, + num_classes=num_classes, + hidden_layer_sizes=params["hidden_layer_sizes"], + ) + + raise ValueError( + f"Unknown torch model: {model_name}. " + "SVC is intentionally left out for now." + ) + + +def compute_metrics(y_true, y_pred): + metrics = { + "accuracy": accuracy_score(y_true, y_pred), + "balanced_accuracy": balanced_accuracy_score(y_true, y_pred), + "macro_f1": f1_score(y_true, y_pred, average="macro", zero_division=0), + "weighted_f1": f1_score(y_true, y_pred, average="weighted", zero_division=0), + "macro_precision": precision_score(y_true, y_pred, average="macro", zero_division=0), + "macro_recall": recall_score(y_true, y_pred, average="macro", zero_division=0), + } + + return metrics + + +def train_torch_model( + model_name, + X_train, + y_train, + params, + epochs, + batch_size, + device, + verbose=False, +): + input_dim = X_train.shape[1] + num_classes = int(torch.max(y_train).item()) + 1 + + model = build_torch_model( + model_name=model_name, + input_dim=input_dim, + num_classes=num_classes, + params=params, + ).to(device) + + loss_fn = torch.nn.CrossEntropyLoss() + + optimizer = torch.optim.Adam( + model.parameters(), + lr=params["lr"], + weight_decay=params["weight_decay"], + ) + + n_train = X_train.shape[0] + + for epoch in range(1, epochs + 1): + perm = torch.randperm(n_train, device=device) + + model.train() + total_loss = 0.0 + + for start in range(0, n_train, batch_size): + end = min(start + batch_size, n_train) + + idx = perm[start:end] + + xb = X_train[idx] + yb = y_train[idx] + + optimizer.zero_grad() + + scores = model(xb) + loss = loss_fn(scores, yb) + + loss.backward() + optimizer.step() + + total_loss += loss.item() * xb.shape[0] + + if verbose and (epoch == 1 or epoch % 50 == 0 or epoch == epochs): + print(f"Epoch {epoch}, loss = {total_loss / n_train:.6f}") + + return model + + +def predict_torch_model(model, X): + model.eval() + + with torch.no_grad(): + scores = model(X) + y_pred = torch.argmax(scores, dim=1) + + return y_pred + + +def get_torch_param_grid(model_name, input_dim, args): + """ + Manual Torch grid search. + + LR approximates sklearn LogisticRegression C by using weight_decay = 1 / C. + MLP uses the same hidden layer choices as the BLIS-Net sklearn grid. + """ + lr_values = args.lr_values if args.lr_values is not None else [args.lr] + + if model_name == "LR": + grid = [] + + for C, lr in itertools.product([0.1, 1.0, 10.0], lr_values): + grid.append( + { + "C": C, + "lr": lr, + "weight_decay": 1.0 / C, + } + ) + + return grid + + if model_name == "MLP": + hidden_options = [ + (input_dim // 2, input_dim // 4), + (input_dim // 2, input_dim // 4, input_dim // 8), + (150, 50), + ] + + grid = [] + + for hidden_layer_sizes, lr in itertools.product(hidden_options, lr_values): + grid.append( + { + "hidden_layer_sizes": hidden_layer_sizes, + "activation": "relu", + "alpha": 0.01, + "lr": lr, + "weight_decay": 0.01, + } + ) + + return grid + + raise ValueError( + f"Unknown torch model for grid search: {model_name}. " + "SVC is intentionally left out for now." + ) + + +def torch_cross_val_score( + model_name, + X_train, + y_train, + params, + epochs, + batch_size, + cv_folds, + device, + seed, +): + y_train_np = y_train.detach().cpu().numpy() + + cv = StratifiedKFold( + n_splits=cv_folds, + shuffle=True, + random_state=seed, + ) + + fold_scores = [] + + for fold_id, (inner_train_idx, inner_val_idx) in enumerate( + cv.split(np.zeros(len(y_train_np)), y_train_np), + start=1, + ): + inner_train_idx = torch.as_tensor( + inner_train_idx, + dtype=torch.long, + device=device, + ) + + inner_val_idx = torch.as_tensor( + inner_val_idx, + dtype=torch.long, + device=device, + ) + + X_inner_train = X_train[inner_train_idx] + y_inner_train = y_train[inner_train_idx] + + X_inner_val = X_train[inner_val_idx] + y_inner_val = y_train[inner_val_idx] + + # StandardScaler is inside the BLIS-Net sklearn Pipeline, + # so we fit it inside each CV fold. + X_inner_train, X_inner_val, _ = torch_standardize_fit_transform( + X_inner_train, + X_inner_val, + ) + + set_seed(seed + fold_id, device) + + model = train_torch_model( + model_name=model_name, + X_train=X_inner_train, + y_train=y_inner_train, + params=params, + epochs=epochs, + batch_size=batch_size, + device=device, + verbose=False, + ) + + y_pred = predict_torch_model(model, X_inner_val) + + score = accuracy_score( + y_inner_val.detach().cpu().numpy(), + y_pred.detach().cpu().numpy(), + ) + + fold_scores.append(score) + + return float(np.mean(fold_scores)) + + +def train_torch_with_grid_search( + model_name, + X_train, + y_train, + X_test, + y_test, + args, + device, + seed, +): + input_dim = X_train.shape[1] + + param_grid = get_torch_param_grid( + model_name=model_name, + input_dim=input_dim, + args=args, + ) + + best_score = -np.inf + best_params = None + + print(f"Manual Torch grid search for {model_name}") + print(f"Number of settings: {len(param_grid)}") + + for params in param_grid: + cv_score = torch_cross_val_score( + model_name=model_name, + X_train=X_train, + y_train=y_train, + params=params, + epochs=args.epochs, + batch_size=args.batch_size, + cv_folds=args.cv_folds, + device=device, + seed=seed, + ) + + print(f"params={params}, cv_accuracy={cv_score:.6f}") + + if cv_score > best_score: + best_score = cv_score + best_params = params + + print(f"Best params: {best_params}") + print(f"Best CV accuracy: {best_score:.6f}") + + # Refit StandardScaler on the full training split before final model, + # matching GridSearchCV refit behavior. + X_train_scaled, X_test_scaled, _ = torch_standardize_fit_transform( + X_train, + X_test, + ) + + set_seed(seed, device) + + model = train_torch_model( + model_name=model_name, + X_train=X_train_scaled, + y_train=y_train, + params=best_params, + epochs=args.epochs, + batch_size=args.batch_size, + device=device, + verbose=True, + ) + + y_pred = predict_torch_model(model, X_test_scaled) + + y_true_np = y_test.detach().cpu().numpy() + y_pred_np = y_pred.detach().cpu().numpy() + + metrics = compute_metrics(y_true_np, y_pred_np) + metrics["best_cv_accuracy"] = best_score + metrics["best_params"] = str(best_params) + + return metrics + + +def train_torch_without_grid_search( + model_name, + X_train, + y_train, + X_test, + y_test, + args, + device, + seed, +): + if model_name == "LR": + params = { + "lr": args.lr, + "weight_decay": args.weight_decay, + } + + elif model_name == "MLP": + params = { + "hidden_layer_sizes": (256, 128), + "lr": args.lr, + "weight_decay": args.weight_decay, + } + + else: + raise ValueError( + f"Unknown torch model: {model_name}. " + "SVC is intentionally left out for now." + ) + + X_train_scaled, X_test_scaled, _ = torch_standardize_fit_transform( + X_train, + X_test, + ) + + set_seed(seed, device) + + model = train_torch_model( + model_name=model_name, + X_train=X_train_scaled, + y_train=y_train, + params=params, + epochs=args.epochs, + batch_size=args.batch_size, + device=device, + verbose=True, + ) + + y_pred = predict_torch_model(model, X_test_scaled) + + y_true_np = y_test.detach().cpu().numpy() + y_pred_np = y_pred.detach().cpu().numpy() + + metrics = compute_metrics(y_true_np, y_pred_np) + metrics["best_cv_accuracy"] = np.nan + metrics["best_params"] = str(params) + + return metrics + + +def get_xgb_param_grid(): + grid = [] + + for n_estimators, learning_rate in itertools.product([50, 100], [0.05, 0.1]): + grid.append( + { + "n_estimators": n_estimators, + "learning_rate": learning_rate, + "max_depth": 6, + } + ) + + return grid + + +def build_xgb_model(params, device): + from xgboost import XGBClassifier + + xgb_device = "cuda" if device.type == "cuda" else "cpu" + + model = XGBClassifier( + n_estimators=params["n_estimators"], + learning_rate=params["learning_rate"], + max_depth=params["max_depth"], + objective="multi:softprob", + eval_metric="mlogloss", + tree_method="hist", + device=xgb_device, + ) + + return model + + +def xgb_cross_val_score( + X_train, + y_train, + params, + cv_folds, + device, + seed, +): + X_train_np = X_train.detach().cpu().numpy() + y_train_np = y_train.detach().cpu().numpy() + + cv = StratifiedKFold( + n_splits=cv_folds, + shuffle=True, + random_state=seed, + ) + + fold_scores = [] + + for fold_id, (inner_train_idx, inner_val_idx) in enumerate( + cv.split(X_train_np, y_train_np), + start=1, + ): + X_inner_train = torch.as_tensor( + X_train_np[inner_train_idx], + dtype=torch.float32, + device=device, + ) + + X_inner_val = torch.as_tensor( + X_train_np[inner_val_idx], + dtype=torch.float32, + device=device, + ) + + # StandardScaler is inside the BLIS-Net sklearn Pipeline, + # so we fit it inside each CV fold. + X_inner_train, X_inner_val, _ = torch_standardize_fit_transform( + X_inner_train, + X_inner_val, + ) + + X_inner_train_np = X_inner_train.detach().cpu().numpy() + X_inner_val_np = X_inner_val.detach().cpu().numpy() + + y_inner_train_np = y_train_np[inner_train_idx] + y_inner_val_np = y_train_np[inner_val_idx] + + model = build_xgb_model( + params=params, + device=device, + ) + + model.fit(X_inner_train_np, y_inner_train_np) + + y_pred = model.predict(X_inner_val_np) + + score = accuracy_score(y_inner_val_np, y_pred) + fold_scores.append(score) + + return float(np.mean(fold_scores)) + + +def train_xgb_with_grid_search( + X_train, + y_train, + X_test, + y_test, + args, + device, + seed, +): + param_grid = get_xgb_param_grid() + + best_score = -np.inf + best_params = None + + print("Manual XGB grid search") + print(f"Number of settings: {len(param_grid)}") + + for params in param_grid: + cv_score = xgb_cross_val_score( + X_train=X_train, + y_train=y_train, + params=params, + cv_folds=args.cv_folds, + device=device, + seed=seed, + ) + + print(f"params={params}, cv_accuracy={cv_score:.6f}") + + if cv_score > best_score: + best_score = cv_score + best_params = params + + print(f"Best params: {best_params}") + print(f"Best CV accuracy: {best_score:.6f}") + + X_train_scaled, X_test_scaled, _ = torch_standardize_fit_transform( + X_train, + X_test, + ) + + X_train_np = X_train_scaled.detach().cpu().numpy() + X_test_np = X_test_scaled.detach().cpu().numpy() + + y_train_np = y_train.detach().cpu().numpy() + y_test_np = y_test.detach().cpu().numpy() + + model = build_xgb_model( + params=best_params, + device=device, + ) + + model.fit(X_train_np, y_train_np) + + y_pred = model.predict(X_test_np) + + metrics = compute_metrics(y_test_np, y_pred) + metrics["best_cv_accuracy"] = best_score + metrics["best_params"] = str(best_params) + + return metrics + + +def train_xgb_without_grid_search( + X_train, + y_train, + X_test, + y_test, + args, + device, +): + params = { + "n_estimators": 100, + "learning_rate": 0.1, + "max_depth": 6, + } + + X_train_scaled, X_test_scaled, _ = torch_standardize_fit_transform( + X_train, + X_test, + ) + + X_train_np = X_train_scaled.detach().cpu().numpy() + X_test_np = X_test_scaled.detach().cpu().numpy() + + y_train_np = y_train.detach().cpu().numpy() + y_test_np = y_test.detach().cpu().numpy() + + model = build_xgb_model( + params=params, + device=device, + ) + + model.fit(X_train_np, y_train_np) + + y_pred = model.predict(X_test_np) + + metrics = compute_metrics(y_test_np, y_pred) + metrics["best_cv_accuracy"] = np.nan + metrics["best_params"] = str(params) + + return metrics + + +def run_one_seed( + X_features, + y, + model_name, + seed, + args, + device, +): + set_seed(seed, device) + + X_train_np, X_test_np, y_train_np, y_test_np = split_like_blis( + X_features, + y, + seed, + ) + + X_train = torch.as_tensor( + X_train_np, + dtype=torch.float32, + device=device, + ) + + X_test = torch.as_tensor( + X_test_np, + dtype=torch.float32, + device=device, + ) + + y_train = torch.as_tensor( + y_train_np, + dtype=torch.long, + device=device, + ) + + y_test = torch.as_tensor( + y_test_np, + dtype=torch.long, + device=device, + ) + + # Match BLIS-Net order: + # flatten -> PCA if requested -> StandardScaler inside CV/final training. + X_train, pca_state, n_pca = torch_fit_pca( + X_train, + args.pca_variance, + ) + + X_test = torch_apply_pca( + X_test, + pca_state, + ) + + if model_name == "SVC": + raise ValueError("SVC is intentionally left out for now.") + + if model_name == "XGB": + if args.no_grid_search: + metrics = train_xgb_without_grid_search( + X_train=X_train, + y_train=y_train, + X_test=X_test, + y_test=y_test, + args=args, + device=device, + ) + + else: + metrics = train_xgb_with_grid_search( + X_train=X_train, + y_train=y_train, + X_test=X_test, + y_test=y_test, + args=args, + device=device, + seed=seed, + ) + + else: + if args.no_grid_search: + metrics = train_torch_without_grid_search( + model_name=model_name, + X_train=X_train, + y_train=y_train, + X_test=X_test, + y_test=y_test, + args=args, + device=device, + seed=seed, + ) + + else: + metrics = train_torch_with_grid_search( + model_name=model_name, + X_train=X_train, + y_train=y_train, + X_test=X_test, + y_test=y_test, + args=args, + device=device, + seed=seed, + ) + + metrics["n_pca"] = n_pca + + return metrics + + +def summarize_results(rows, metric_names): + df = pd.DataFrame(rows) + + summary_rows = [] + + group_cols = [ + "dataset", + "task", + "wavelet_type", + "largest_scale", + "layers", + "moments", + "model", + ] + + for keys, group in df.groupby(group_cols): + row = dict(zip(group_cols, keys)) + + for metric in metric_names: + row[f"{metric}_mean"] = group[metric].mean() + row[f"{metric}_std"] = group[metric].std(ddof=0) + + row["n_pca_mean"] = group["n_pca"].mean() + + if "best_cv_accuracy" in group.columns: + row["best_cv_accuracy_mean"] = group["best_cv_accuracy"].mean() + + summary_rows.append(row) + + summary_df = pd.DataFrame(summary_rows) + + return summary_df + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument("--data_dir", type=str, default="data") + parser.add_argument("--dataset", type=str, default="traffic") + + parser.add_argument( + "--sub_datasets", + nargs="+", + type=str, + default=["PEMS03", "PEMS04", "PEMS07", "PEMS08"], + ) + + parser.add_argument( + "--task_types", + nargs="+", + type=str, + default=["HOUR", "DAY", "WEEK"], + ) + + parser.add_argument("--wavelet_type", type=str, default="W2") + parser.add_argument("--largest_scale", type=int, default=4) + parser.add_argument("--highest_moment", type=int, default=3) + + parser.add_argument("--layer_list", nargs="+", type=int, default=[1, 2, 3]) + parser.add_argument("--moment_list", nargs="+", type=int, default=[1]) + + parser.add_argument( + "--models", + nargs="+", + type=str, + default=["LR", "MLP", "XGB"], + help="Torch/XGB models to run. SVC is intentionally left out for now.", + ) + + parser.add_argument( + "--seeds", + nargs="+", + type=int, + default=[42, 43, 44, 45, 56], + ) + + parser.add_argument( + "--pca_variance", + type=float, + default=1.0, + help="PCA behavior: 1 means no PCA, 0.99 keeps 99 percent variance, >1 uses fixed components.", + ) + + parser.add_argument("--epochs", type=int, default=100) + parser.add_argument("--batch_size", type=int, default=512) + parser.add_argument("--lr", type=float, default=1e-3) + + parser.add_argument( + "--lr_values", + nargs="+", + type=float, + default=None, + help="Optional learning-rate values for manual Torch grid search.", + ) + + parser.add_argument("--weight_decay", type=float, default=1e-4) + parser.add_argument("--cv_folds", type=int, default=3) + parser.add_argument("--no_grid_search", action="store_true") + + parser.add_argument("--device", type=str, default="cuda") + parser.add_argument("--force_recompute", action="store_true") + parser.add_argument("--skip_moments", action="store_true") + + parser.add_argument("--results_dir", type=str, default="results") + + args = parser.parse_args() + + if args.sub_datasets == ["full"]: + args.sub_datasets = ["PEMS03", "PEMS04", "PEMS07", "PEMS08"] + + if args.device == "cuda" and not torch.cuda.is_available(): + print("CUDA requested but not available. Falling back to CPU.") + args.device = "cpu" + + device = torch.device(args.device) + + if device.type == "cuda": + torch.set_float32_matmul_precision("high") + + os.makedirs(args.results_dir, exist_ok=True) + + print("=" * 90) + print("BLIS MOMENTS FROM new_class.py + TORCH CLASSIFICATION") + print("SVC intentionally left out for now") + print("=" * 90) + print(f"Device: {device}") + + if device.type == "cuda": + print(f"GPU: {torch.cuda.get_device_name(0)}") + + gs = make_graph_scattering(device=device) + + all_rows = [] + + for sub_dataset in args.sub_datasets: + print("=" * 90) + print(f"DATASET: {sub_dataset}") + print("=" * 90) + + data_path = os.path.join( + args.data_dir, + args.dataset, + sub_dataset, + ) + + adjacency_path = os.path.join(data_path, "adjacency_matrix.npy") + signal_path = os.path.join(data_path, "graph_signals.npy") + + if not os.path.exists(adjacency_path): + raise FileNotFoundError(f"Missing adjacency file: {adjacency_path}") + + if not os.path.exists(signal_path): + raise FileNotFoundError(f"Missing graph signal file: {signal_path}") + + A = np.load(adjacency_path).astype(np.float32) + X = np.load(signal_path).astype(np.float32) + + print(f"A shape: {A.shape}") + print(f"X shape: {X.shape}") + + if not args.skip_moments: + gs.save_scattering_moments( + A=A, + X=X, + data_dir=args.data_dir, + dataset=args.dataset, + sub_dataset=sub_dataset, + scattering_type="blis", + wavelet_type=args.wavelet_type, + largest_scale=args.largest_scale, + highest_moment=args.highest_moment, + layer_list=args.layer_list, + force_recompute=args.force_recompute, + ) + + X_features = load_moment_features( + data_dir=args.data_dir, + dataset=args.dataset, + sub_dataset=sub_dataset, + wavelet_type=args.wavelet_type, + largest_scale=args.largest_scale, + layer_list=args.layer_list, + moment_list=args.moment_list, + ) + + print(f"X_features shape: {X_features.shape}") + + for task_type in args.task_types: + print("-" * 90) + print(f"TASK: {task_type}") + print("-" * 90) + + y = load_labels( + data_dir=args.data_dir, + dataset=args.dataset, + sub_dataset=sub_dataset, + task_type=task_type, + ) + + if len(y) != X_features.shape[0]: + raise ValueError( + f"Label/features mismatch for {sub_dataset} {task_type}: " + f"len(y)={len(y)}, X_features.shape[0]={X_features.shape[0]}" + ) + + print(f"y shape: {y.shape}") + print(f"classes: {np.unique(y)}") + + for model_name in args.models: + if model_name == "SVC": + raise ValueError("SVC is intentionally left out for now.") + + print("-" * 90) + print(f"MODEL: {model_name}") + print("-" * 90) + + for seed in args.seeds: + print(f"Seed: {seed}") + + metrics = run_one_seed( + X_features=X_features, + y=y, + model_name=model_name, + seed=seed, + args=args, + device=device, + ) + + row = { + "dataset": sub_dataset, + "task": task_type, + "wavelet_type": args.wavelet_type, + "largest_scale": args.largest_scale, + "layers": " ".join(map(str, args.layer_list)), + "moments": " ".join(map(str, args.moment_list)), + "model": model_name, + "seed": seed, + "pca_variance": args.pca_variance, + "epochs": args.epochs, + "batch_size": args.batch_size, + "lr": args.lr, + "lr_values": str(args.lr_values), + "weight_decay": args.weight_decay, + "cv_folds": args.cv_folds, + "no_grid_search": args.no_grid_search, + "device": str(device), + } + + row.update(metrics) + + all_rows.append(row) + + print(f"accuracy = {metrics['accuracy']:.6f}") + print(f"balanced_accuracy = {metrics['balanced_accuracy']:.6f}") + print(f"macro_f1 = {metrics['macro_f1']:.6f}") + print(f"weighted_f1 = {metrics['weighted_f1']:.6f}") + print(f"macro_precision = {metrics['macro_precision']:.6f}") + print(f"macro_recall = {metrics['macro_recall']:.6f}") + print(f"n_pca = {metrics['n_pca']}") + print(f"best_cv_accuracy = {metrics['best_cv_accuracy']}") + print(f"best_params = {metrics['best_params']}") + + metric_names = [ + "accuracy", + "balanced_accuracy", + "macro_f1", + "weighted_f1", + "macro_precision", + "macro_recall", + ] + + results_df = pd.DataFrame(all_rows) + summary_df = summarize_results(all_rows, metric_names) + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + sub_dataset_name = "_".join(args.sub_datasets) + task_name = "_".join(args.task_types) + model_name = "_".join(args.models) + layer_name = "_".join(map(str, args.layer_list)) + moment_name = "_".join(map(str, args.moment_list)) + + base_name = ( + f"torch_blis_{sub_dataset_name}_{task_name}_{model_name}_" + f"{args.wavelet_type}_L{layer_name}_M{moment_name}_{timestamp}" + ) + + per_seed_path = os.path.join(args.results_dir, f"{base_name}_per_seed.csv") + summary_path = os.path.join(args.results_dir, f"{base_name}_summary.csv") + + results_df.to_csv(per_seed_path, index=False) + summary_df.to_csv(summary_path, index=False) + + print("=" * 90) + print(f"Saved per-seed results to: {per_seed_path}") + print(f"Saved summary results to: {summary_path}") + print("=" * 90) + + print(summary_df) + + +if __name__ == "__main__": + main() \ No newline at end of file