diff --git a/docs/changelog.md b/docs/changelog.md index 81ad377..5382efa 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,20 @@ # Changelog +## v0.3.2 (upcoming) + +### New features + +- Publishes ensemble tide modelling code for combining multiple global ocean tide models into a single locally optimised ensemble tide model using external model ranking data (e.g. satellite altimetry or NDWI-tide correlations along the coastline) + - Update ensemble code to latest version that includes FES2022, GOT5.6 and TPXO10 + - Make ensemble model calculation function a top level function (i.e. rename from `_ensemble_model` to `ensemble_tides`) + - Load tide model ranking points from external flatgeobuff format file for faster cloud access +- Make buffer distance applied when cropping model files configurable via the `crop_buffer` param, with a default of 5 degrees +- Reorder `model_tides` params to provide more logical flow and move more common params like `mode`, `output_format` and `output_units` higher + +### Bug fixes + +- Fix warnings from `load_gauge_gesla` function + ## v0.3.1 (2024-11-15) ### New features diff --git a/docs/migration.md b/docs/migration.md index 9e18ed1..b45ce26 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -49,6 +49,21 @@ The `ds` param in all satellite data functions (`tag_tides`, `pixel_tides`, `tid tag_tides(data=your_data) ``` +## `times` param renamed to `time`, accepts any format supported by `pandas.to_datetime()` + +The `times` parameter has been renamed to `time`, and updated to more flexibly accept any time format that can be converted by `pandas.to_datetime()`; e.g. `np.ndarray[datetime64]`, `pd.DatetimeIndex`, `pd.Timestamp`, `datetime.datetime` and strings (e.g. `"2020-01-01 23:00"`). For example: `time=pd.date_range(start="2000", end="2001", freq="5h")`. + +!!! tip "Action required" + + Update: + ``` + model_tides(..., times=...) + ``` + To: + ``` + model_tides(..., time=...) + ``` + ### `tag_tides` now returns an array instead of updating data in-place The `tag_tides` function now returns an `xarray.DataArray` output containing tide heights, rather than appending tide height data to the original input dataset in-place. This change provides better consistency with `pixel_tides`, which also returns an array of tide heights. diff --git a/eo_tides/__init__.py b/eo_tides/__init__.py index 236afb2..e6e810e 100644 --- a/eo_tides/__init__.py +++ b/eo_tides/__init__.py @@ -28,7 +28,7 @@ # Import commonly used functions for convenience from .eo import pixel_tides, tag_tides -from .model import model_phases, model_tides +from .model import ensemble_tides, model_phases, model_tides from .stats import pixel_stats, tide_stats from .utils import clip_models, idw, list_models from .validation import eval_metrics, load_gauge_gesla @@ -38,6 +38,7 @@ "list_models", "model_tides", "model_phases", + "ensemble_tides", "tag_tides", "pixel_tides", "tide_stats", diff --git a/eo_tides/eo.py b/eo_tides/eo.py index 1fe4fea..95429ca 100644 --- a/eo_tides/eo.py +++ b/eo_tides/eo.py @@ -39,7 +39,7 @@ def _resample_chunks( return data.shape # if data has chunks, then return just spatial chunks - if data.chunks is not None: + if data.chunks: y_dim, x_dim = data.odc.spatial_dims return data.chunks[y_dim], data.chunks[x_dim] @@ -197,10 +197,12 @@ def tag_tides( that can be converted by `pandas.to_datetime()`. For example: `time=pd.date_range(start="2000", end="2001", freq="5h")` model : str or list of str, optional - The tide model (or models) used to model tides. If a list is - provided, a new "tide_model" dimension will be added to the - `xarray.DataArray` outputs. Defaults to "EOT20"; for a full - list of available/supported models, run `eo_tides.model.list_models`. + The tide model (or list of models) to use to model tides. + If a list is provided, a new "tide_model" dimension will be + added to the `xarray.DataArray` outputs. Defaults to "EOT20"; + specify "all" to use all models available in `directory`. + For a full list of available and supported models, run + `eo_tides.model.list_models`. directory : str, optional The directory containing tide model data files. If no path is provided, this will default to the environment variable @@ -326,10 +328,12 @@ def pixel_tides( that can be converted by `pandas.to_datetime()`. For example: `time=pd.date_range(start="2000", end="2001", freq="5h")` model : str or list of str, optional - The tide model (or models) used to model tides. If a list is - provided, a new "tide_model" dimension will be added to the - `xarray.DataArray` outputs. Defaults to "EOT20"; for a full - list of available/supported models, run `eo_tides.model.list_models`. + The tide model (or list of models) to use to model tides. + If a list is provided, a new "tide_model" dimension will be + added to the `xarray.DataArray` outputs. Defaults to "EOT20"; + specify "all" to use all models available in `directory`. + For a full list of available and supported models, run + `eo_tides.model.list_models`. directory : str, optional The directory containing tide model data files. If no path is provided, this will default to the environment variable diff --git a/eo_tides/model.py b/eo_tides/model.py index 59e8aa3..6ccedf1 100644 --- a/eo_tides/model.py +++ b/eo_tides/model.py @@ -24,171 +24,6 @@ from .utils import DatetimeLike, _set_directory, _standardise_models, _standardise_time, idw, list_models -def _ensemble_model( - tide_df, - crs, - ensemble_models, - ensemble_func=None, - ensemble_top_n=3, - ranking_points="https://dea-public-data-dev.s3-ap-southeast-2.amazonaws.com/derivative/dea_intertidal/supplementary/rankings_ensemble_2017-2019.geojson", - ranking_valid_perc=0.02, - **idw_kwargs, -): - """Combine multiple tide models into a single locally optimised - ensemble tide model using external model ranking data (e.g. - satellite altimetry or NDWI-tide correlations along the coastline) - to inform the selection of the best local models. - - This function performs the following steps: - 1. Takes a dataframe of tide heights from multiple tide models, as - produced by `eo_tides.model.model_tides` - 1. Loads model ranking points from a GeoJSON file, filters them - based on the valid data percentage, and retains relevant columns - 2. Interpolates the model rankings into the "x" and "y" coordinates - of the original dataframe using Inverse Weighted Interpolation (IDW) - 3. Uses rankings to combine multiple tide models into a single - optimised ensemble model (by default, by taking the mean of the - top 3 ranked models) - 4. Returns a new dataFrame with the combined ensemble model predictions - - Parameters - ---------- - tide_df : pandas.DataFrame - DataFrame produced by `eo_tides.model.model_tides`, containing - tide model predictions with columns: - `["time", "x", "y", "tide_height", "tide_model"]`. - crs : string - Coordinate reference system for the "x" and "y" coordinates in - `tide_df`. Used to ensure that interpolations are performed - in the correct CRS. - ensemble_models : list - A list of models to include in the ensemble modelling process. - All values must exist as columns with the prefix "rank_" in - `ranking_points`. - ensemble_func : dict, optional - By default, a simple ensemble model will be calculated by taking - the mean of the `ensemble_top_n` tide models at each location. - However, a dictionary containing more complex ensemble - calculations can also be provided. Dictionary keys are used - to name output ensemble models; functions should take a column - named "rank" and convert it to a weighting, e.g.: - `ensemble_func = {"ensemble-custom": lambda x: x["rank"] <= 3}` - ensemble_top_n : int, optional - If `ensemble_func` is None, this sets the number of top models - to include in the mean ensemble calculation. Defaults to 3. - ranking_points : str, optional - Path to the GeoJSON file containing model ranking points. This - dataset should include columns containing rankings for each tide - model, named with the prefix "rank_". e.g. "rank_EOT20". - Low values should represent high rankings (e.g. 1 = top ranked). - ranking_valid_perc : float, optional - Minimum percentage of valid data required to include a model - rank point in the analysis, as defined in a column named - "valid_perc". Defaults to 0.02. - **idw_kwargs - Optional keyword arguments to pass to the `idw` function used - for interpolation. Useful values include `k` (number of nearest - neighbours to use in interpolation), `max_dist` (maximum - distance to nearest neighbours), and `k_min` (minimum number of - neighbours required after `max_dist` is applied). - - Returns - ------- - pandas.DataFrame - DataFrame containing the ensemble model predictions, matching - the format of the input `tide_df` (e.g. columns `["time", "x", - "y", "tide_height", "tide_model"]`. By default the 'tide_model' - column will be labeled "ensemble" for the combined model - predictions (but if a custom dictionary of ensemble functions is - provided via `ensemble_func`, each ensemble will be named using - the provided dictionary keys). - - """ - # Extract x and y coords from dataframe - x = tide_df.index.get_level_values(level="x") - y = tide_df.index.get_level_values(level="y") - - # Load model ranks points and reproject to same CRS as x and y - model_ranking_cols = [f"rank_{m}" for m in ensemble_models] - model_ranks_gdf = ( - gpd.read_file(ranking_points) - .to_crs(crs) - .query(f"valid_perc > {ranking_valid_perc}") - .dropna()[model_ranking_cols + ["geometry"]] - ) - - # Use points to interpolate model rankings into requested x and y - id_kwargs_str = "" if idw_kwargs == {} else idw_kwargs - print(f"Interpolating model rankings using IDW interpolation {id_kwargs_str}") - ensemble_ranks_df = ( - # Run IDW interpolation on subset of ranking columns - pd.DataFrame( - idw( - input_z=model_ranks_gdf[model_ranking_cols], - input_x=model_ranks_gdf.geometry.x, - input_y=model_ranks_gdf.geometry.y, - output_x=x, - output_y=y, - **idw_kwargs, - ), - columns=model_ranking_cols, - ) - .assign(x=x, y=y) - # Drop any duplicates then melt columns into long format - .drop_duplicates() - .melt(id_vars=["x", "y"], var_name="tide_model", value_name="rank") - # Remore "rank_" prefix to get plain model names - .replace({"^rank_": ""}, regex=True) - # Set index columns and rank across groups - .set_index(["tide_model", "x", "y"]) - .groupby(["x", "y"]) - .rank() - ) - - # If no custom ensemble funcs are provided, use a default ensemble - # calculation that takes the mean of the top N tide models - if ensemble_func is None: - ensemble_func = {"ensemble": lambda x: x["rank"] <= ensemble_top_n} - - # Create output list to hold computed ensemble model outputs - ensemble_list = [] - - # Loop through all provided ensemble generation functions - for ensemble_n, ensemble_f in ensemble_func.items(): - print(f"Combining models into single {ensemble_n} model") - - # Join ranks to input tide data, compute weightings and group - grouped = ( - # Add tide model as an index so we can join with model ranks - tide_df.set_index("tide_model", append=True) - .join(ensemble_ranks_df) - # Add temp columns containing weightings and weighted values - .assign( - weights=ensemble_f, # use custom func to compute weights - weighted=lambda i: i.tide_height * i.weights, - ) - # Groupby is specified in a weird order here as this seems - # to be the easiest way to preserve correct index sorting - .groupby(["x", "y", "time"]) - ) - - # Use weightings to combine multiple models into single ensemble - ensemble_df = ( - # Calculate weighted mean and convert back to dataframe - grouped.weighted.sum() - .div(grouped.weights.sum()) - .to_frame("tide_height") - # Label ensemble model and ensure indexes are in expected order - .assign(tide_model=ensemble_n) - .reorder_levels(["time", "x", "y"], axis=0) - ) - - ensemble_list.append(ensemble_df) - - # Combine all ensemble models and return as a single dataframe - return pd.concat(ensemble_list) - - def _parallel_splits( total_points: int, model_count: int, @@ -240,12 +75,13 @@ def _model_tides( time, directory, crs, - crop, + mode, + output_units, method, extrapolate, cutoff, - output_units, - mode, + crop, + crop_buffer, ): """Worker function applied in parallel by `model_tides`. Handles the extraction of tide modelling constituents and tide modelling using @@ -268,11 +104,11 @@ def _model_tides( lat, type=pytmd_model.type, crop=crop, + buffer=crop_buffer, method=method, extrapolate=extrapolate, cutoff=cutoff, append_node=False, - # append_node=True, ) # TODO: Return constituents @@ -364,6 +200,188 @@ def _model_tides( return tide_df +def ensemble_tides( + tide_df, + crs, + ensemble_models, + ensemble_func=None, + ensemble_top_n=3, + ranking_points="https://dea-public-data-dev.s3-ap-southeast-2.amazonaws.com/derivative/dea_intertidal/supplementary/rankings_ensemble_2017-2019.fgb", + ranking_valid_perc=0.02, + **idw_kwargs, +): + """Combine multiple tide models into a single locally optimised + ensemble tide model using external model ranking data (e.g. + satellite altimetry or NDWI-tide correlations along the coastline) + to inform the selection of the best local models. + + This function performs the following steps: + 1. Takes a dataframe of tide heights from multiple tide models, as + produced by `eo_tides.model.model_tides` + 2. Loads model ranking points from an external file, filters them + based on the valid data percentage, and retains relevant columns + 3. Interpolates the model rankings into the coordinates of the + original dataframe using Inverse Weighted Interpolation (IDW) + 4. Uses rankings to combine multiple tide models into a single + optimised ensemble model (by default, by taking the mean of the + top 3 ranked models) + 5. Returns a new dataFrame with the combined ensemble model predictions + + Parameters + ---------- + tide_df : pandas.DataFrame + DataFrame produced by `eo_tides.model.model_tides`, containing + tide model predictions in long format with columns: + `["time", "x", "y", "tide_height", "tide_model"]`. + crs : string + Coordinate reference system for the "x" and "y" coordinates in + `tide_df`. Used to ensure that interpolations are performed + in the correct CRS. + ensemble_models : list + A list of models to include in the ensemble modelling process. + All values must exist as columns with the prefix "rank_" in + `ranking_points`. + ensemble_func : dict, optional + By default, a simple ensemble model will be calculated by taking + the mean of the `ensemble_top_n` tide models at each location. + However, a dictionary containing more complex ensemble + calculations can also be provided. Dictionary keys are used + to name output ensemble models; functions should take a column + named "rank" and convert it to a weighting, e.g.: + `ensemble_func = {"ensemble-custom": lambda x: x["rank"] <= 3}` + ensemble_top_n : int, optional + If `ensemble_func` is None, this sets the number of top models + to include in the mean ensemble calculation. Defaults to 3. + ranking_points : str, optional + Path to the file containing model ranking points. This dataset + should include columns containing rankings for each tide + model, named with the prefix "rank_". e.g. "rank_EOT20". + Low values should represent high rankings (e.g. 1 = top ranked). + The default value points to an example file covering Australia. + ranking_valid_perc : float, optional + Minimum percentage of valid data required to include a model + rank point in the analysis, as defined in a column named + "valid_perc". Defaults to 0.02. + **idw_kwargs + Optional keyword arguments to pass to the `idw` function used + for interpolation. Useful values include `k` (number of nearest + neighbours to use in interpolation), `max_dist` (maximum + distance to nearest neighbours), and `k_min` (minimum number of + neighbours required after `max_dist` is applied). + + Returns + ------- + pandas.DataFrame + DataFrame containing the ensemble model predictions, matching + the format of the input `tide_df` (e.g. columns `["time", "x", + "y", "tide_height", "tide_model"]`. By default the 'tide_model' + column will be labeled "ensemble" for the combined model + predictions (but if a custom dictionary of ensemble functions is + provided via `ensemble_func`, each ensemble will be named using + the provided dictionary keys). + + """ + # Raise data if `tide_df` provided in wide format + if "tide_model" not in tide_df: + raise Exception( + "`tide_df` does not contain the expected 'tide_model' and " + "'tide_height' columns. Ensure that tides were modelled in " + "long format (i.e. `output_format='long'` in `model_tides`)." + ) + + # Extract x and y coords from dataframe + x = tide_df.index.get_level_values(level="x") + y = tide_df.index.get_level_values(level="y") + + # Load model ranks points and reproject to same CRS as x and y + model_ranking_cols = [f"rank_{m}" for m in ensemble_models] + try: + model_ranks_gdf = ( + gpd.read_file(ranking_points, engine="pyogrio") + .to_crs(crs) + .query(f"valid_perc > {ranking_valid_perc}") + .dropna(how="all")[model_ranking_cols + ["geometry"]] + ) + except KeyError: + error_msg = f""" + Not all of the expected "rank_" columns {model_ranking_cols} were + found in the columns of the ranking points file ({ranking_points}). + Consider passing a custom list of models using `ensemble_models`. + """ + raise Exception(textwrap.dedent(error_msg).strip()) from None + + # Use points to interpolate model rankings into requested x and y + id_kwargs_str = "" if idw_kwargs == {} else idw_kwargs + print(f"Interpolating model rankings using IDW interpolation {id_kwargs_str}") + ensemble_ranks_df = ( + # Run IDW interpolation on subset of ranking columns + pd.DataFrame( + idw( + input_z=model_ranks_gdf[model_ranking_cols], + input_x=model_ranks_gdf.geometry.x, + input_y=model_ranks_gdf.geometry.y, + output_x=x, + output_y=y, + **idw_kwargs, + ), + columns=model_ranking_cols, + ) + .assign(x=x, y=y) + # Drop any duplicates then melt columns into long format + .drop_duplicates() + .melt(id_vars=["x", "y"], var_name="tide_model", value_name="rank") + # Remore "rank_" prefix to get plain model names + .replace({"^rank_": ""}, regex=True) + # Set index columns and rank across groups + .set_index(["tide_model", "x", "y"]) + .groupby(["x", "y"]) + .rank() + ) + + # If no custom ensemble funcs are provided, use a default ensemble + # calculation that takes the mean of the top N tide models + if ensemble_func is None: + ensemble_func = {"ensemble": lambda x: x["rank"] <= ensemble_top_n} + + # Create output list to hold computed ensemble model outputs + ensemble_list = [] + + # Loop through all provided ensemble generation functions + for ensemble_n, ensemble_f in ensemble_func.items(): + print(f"Combining models into single {ensemble_n} model") + + # Join ranks to input tide data, compute weightings and group + grouped = ( + # Add tide model as an index so we can join with model ranks + tide_df.set_index("tide_model", append=True) + .join(ensemble_ranks_df) + # Add temp columns containing weightings and weighted values + .assign( + weights=ensemble_f, # use custom func to compute weights + weighted=lambda i: i.tide_height * i.weights, + ) + # Groupby is specified in a weird order here as this seems + # to be the easiest way to preserve correct index sorting + .groupby(["x", "y", "time"]) + ) + + # Use weightings to combine multiple models into single ensemble + ensemble_df = ( + # Calculate weighted mean and convert back to dataframe + grouped.weighted.sum() + .div(grouped.weights.sum()) + .to_frame("tide_height") + # Label ensemble model and ensure indexes are in expected order + .assign(tide_model=ensemble_n) + .reorder_levels(["time", "x", "y"], axis=0) + ) + + ensemble_list.append(ensemble_df) + + # Combine all ensemble models and return as a single dataframe + return pd.concat(ensemble_list) + + def model_tides( x: float | list[float] | xr.DataArray, y: float | list[float] | xr.DataArray, @@ -371,16 +389,17 @@ def model_tides( model: str | list[str] = "EOT20", directory: str | os.PathLike | None = None, crs: str = "EPSG:4326", - crop: bool = True, + mode: str = "one-to-many", + output_format: str = "long", + output_units: str = "m", method: str = "linear", extrapolate: bool = True, cutoff: float | None = None, - mode: str = "one-to-many", + crop: bool = True, + crop_buffer: float | None = 5, parallel: bool = True, parallel_splits: int | str = "auto", parallel_max: int | None = None, - output_units: str = "m", - output_format: str = "long", ensemble_models: list[str] | None = None, **ensemble_kwargs, ) -> pd.DataFrame: @@ -419,10 +438,12 @@ def model_tides( any format that can be converted by `pandas.to_datetime()`; e.g. np.ndarray[datetime64], pd.DatetimeIndex, pd.Timestamp, datetime.datetime and strings (e.g. "2020-01-01 23:00"). + For example: `time=pd.date_range(start="2000", end="2001", freq="5h")` model : str or list of str, optional - The tide model (or models) to use to model tides. - Defaults to "EOT20"; for a full list of available/supported - models, run `eo_tides.model.list_models`. + The tide model (or list of models) to use to model tides. + Defaults to "EOT20"; specify "all" to use all models available + in `directory`. For a full list of available and supported models, + run `eo_tides.model.list_models`. directory : str, optional The directory containing tide model data files. If no path is provided, this will default to the environment variable @@ -433,10 +454,29 @@ def model_tides( crs : str, optional Input coordinate reference system for x and y coordinates. Defaults to "EPSG:4326" (WGS84; degrees latitude, longitude). - crop : bool, optional - Whether to crop tide model constituent files on-the-fly to - improve performance. Cropping will be performed based on a - 1 degree buffer around all input points. Defaults to True. + mode : str, optional + The analysis mode to use for tide modelling. Supports two options: + + - "one-to-many": Models tides for every timestep in "time" at + every input x and y coordinate point. This is useful if you + want to model tides for a specific list of timesteps across + multiple spatial points (e.g. for the same set of satellite + acquisition times at various locations across your study area). + - "one-to-one": Model tides using a unique timestep for each + set of x and y coordinates. In this mode, the number of x and + y points must equal the number of timesteps provided in "time". + output_format : str, optional + Whether to return the output dataframe in long format (with + results stacked vertically along "tide_model" and "tide_height" + columns), or wide format (with a column for each tide model). + Defaults to "long". + output_units : str, optional + Whether to return modelled tides in floating point metre units, + or integer centimetre units (i.e. scaled by 100) or integer + millimetre units (i.e. scaled by 1000. Returning outputs in + integer units can be useful for reducing memory usage. + Defaults to "m" for metres; set to "cm" for centimetres or "mm" + for millimetres. method : str, optional Method used to interpolate tidal constituents from model files. Defaults to "linear"; options include: @@ -451,24 +491,21 @@ def model_tides( Extrapolation cutoff in kilometers. The default is None, which will extrapolate for all points regardless of distance from the valid tide modelling domain. - mode : str, optional - The analysis mode to use for tide modelling. Supports two options: - - - "one-to-many": Models tides for every timestep in "time" at - every input x and y coordinate point. This is useful if you - want to model tides for a specific list of timesteps across - multiple spatial points (e.g. for the same set of satellite - acquisition times at various locations across your study area). - - "one-to-one": Model tides using a unique timestep for each - set of x and y coordinates. In this mode, the number of x and - y points must equal the number of timesteps provided in "time". - + crop : bool, optional + Whether to crop tide model constituent files on-the-fly to + improve performance. Defaults to True; use `crop_buffer` + to customise the buffer distance used to crop the files. + crop_buffer : int or float, optional + The buffer distance in degrees used to crop tide model + constituent files around the modelling area. Defaults to 5, + which will crop constituents using a five degree buffer on either + side of the analysis extent. parallel : bool, optional - Whether to parallelise tide modelling using `concurrent.futures`. - If multiple tide models are requested, these will be run in - parallel. Optionally, tide modelling can also be run in parallel - across input x and y coordinates (see "parallel_splits" below). - Default is True. + Whether to parallelise tide modelling. If multiple tide models are + requested, these will be run in parallel using `concurrent.futures`. + If enough workers are available, the analysis will also be split + into spatial chunks for additional parallelisation (see "parallel_splits" + below). Default is True. parallel_splits : str or int, optional Whether to split the input x and y coordinates into smaller, evenly-sized chunks that are processed in parallel. This can @@ -479,23 +516,12 @@ def model_tides( parallel_max : int, optional Maximum number of processes to run in parallel. The default of None will automatically determine this from your available CPUs. - output_units : str, optional - Whether to return modelled tides in floating point metre units, - or integer centimetre units (i.e. scaled by 100) or integer - millimetre units (i.e. scaled by 1000. Returning outputs in - integer units can be useful for reducing memory usage. - Defaults to "m" for metres; set to "cm" for centimetres or "mm" - for millimetres. - output_format : str, optional - Whether to return the output dataframe in long format (with - results stacked vertically along "tide_model" and "tide_height" - columns), or wide format (with a column for each tide model). - Defaults to "long". ensemble_models : list of str, optional An optional list of models used to generate the ensemble tide model if "ensemble" tide modelling is requested. Defaults to - ["FES2014", "TPXO9-atlas-v5", "EOT20", "HAMTIDE11", "GOT4.10", - "FES2012", "TPXO8-atlas-v1"]. + `["EOT20", "FES2012", "FES2014_extrapolated", "FES2022_extrapolated", + "GOT4.10", "GOT5.5_extrapolated", "GOT5.6_extrapolated", + "TPXO10-atlas-v2-nc", "TPXO8-atlas-nc", "TPXO9-atlas-v5-nc"]`. **ensemble_kwargs : Keyword arguments used to customise the generation of optional ensemble tide models if "ensemble" modelling are requested. @@ -553,12 +579,13 @@ def model_tides( _model_tides, directory=directory, crs=crs, - crop=crop, + mode=mode, + output_units=output_units, method=method, extrapolate=extrapolate, cutoff=np.inf if cutoff is None else cutoff, - output_units=output_units, - mode=mode, + crop=crop, + crop_buffer=crop_buffer, ) # If automatic parallel splits, calculate optimal value @@ -577,7 +604,6 @@ def model_tides( raise ValueError(f"Parallel splits ({parallel_splits}) cannot be larger than the number of points ({len(x)}).") # Parallelise if either multiple models or multiple splits requested - if parallel & ((len(models_to_process) > 1) | (parallel_splits > 1)): with ProcessPoolExecutor(max_workers=parallel_max) as executor: print( @@ -639,7 +665,7 @@ def model_tides( # Optionally compute ensemble model and add to dataframe if "ensemble" in models_requested: - ensemble_df = _ensemble_model(tide_df, crs, ensemble_models, **ensemble_kwargs) + ensemble_df = ensemble_tides(tide_df, crs, ensemble_models, **ensemble_kwargs) # Update requested models with any custom ensemble models, then # filter the dataframe to keep only models originally requested @@ -701,10 +727,12 @@ def model_phases( any format that can be converted by `pandas.to_datetime()`; e.g. np.ndarray[datetime64], pd.DatetimeIndex, pd.Timestamp, datetime.datetime and strings (e.g. "2020-01-01 23:00"). + For example: `time=pd.date_range(start="2000", end="2001", freq="5h")` model : str or list of str, optional - The tide model (or models) to use to compute tide phases. - Defaults to "EOT20"; for a full list of available/supported - models, run `eo_tides.model.list_models`. + The tide model (or list of models) to use to model tides. + Defaults to "EOT20"; specify "all" to use all models available + in `directory`. For a full list of available and supported models, + run `eo_tides.model.list_models`. directory : str, optional The directory containing tide model data files. If no path is provided, this will default to the environment variable diff --git a/eo_tides/stats.py b/eo_tides/stats.py index fe00f9b..660f0ac 100644 --- a/eo_tides/stats.py +++ b/eo_tides/stats.py @@ -450,10 +450,12 @@ def pixel_stats( that can be converted by `pandas.to_datetime()`. For example: `time=pd.date_range(start="2000", end="2001", freq="5h")` model : str or list of str, optional - The tide model (or models) to use to model tides. If a list is - provided, a new "tide_model" dimension will be added to `data`. - Defaults to "EOT20"; for a full list of available/supported - models, run `eo_tides.model.list_models`. + The tide model (or list of models) to use to model tides. + If a list is provided, a new "tide_model" dimension will be + added to the `xarray.DataArray` outputs. Defaults to "EOT20"; + specify "all" to use all models available in `directory`. + For a full list of available and supported models, run + `eo_tides.model.list_models`. directory : str, optional The directory containing tide model data files. If no path is provided, this will default to the environment variable diff --git a/eo_tides/utils.py b/eo_tides/utils.py index a880a46..483ac83 100644 --- a/eo_tides/utils.py +++ b/eo_tides/utils.py @@ -6,6 +6,7 @@ import pathlib import textwrap import warnings +from collections import Counter from typing import List, Union import numpy as np @@ -23,6 +24,14 @@ DatetimeLike = Union[np.ndarray, pd.DatetimeIndex, pd.Timestamp, datetime.datetime, str, List[str]] +def _get_duplicates(array): + """ + Return any duplicates in a list or array. + """ + c = Counter(array) + return [k for k in c if c[k] > 1] + + def _set_directory( directory: str | os.PathLike | None = None, ) -> os.PathLike: @@ -87,6 +96,11 @@ def _standardise_models( # Turn inputs into arrays for consistent handling models_requested = list(np.atleast_1d(model)) + # Raise error if list contains duplications + duplicates = _get_duplicates(models_requested) + if len(duplicates) > 0: + raise ValueError(f"The model parameter contains duplicate values: {duplicates}") + # Get full list of supported models from pyTMD database available_models, valid_models = list_models( directory, show_available=False, show_supported=False, raise_error=True @@ -124,13 +138,15 @@ def _standardise_models( ensemble_models if ensemble_models is not None else [ - "FES2014", - "TPXO9-atlas-v5", "EOT20", - "HAMTIDE11", - "GOT4.10", "FES2012", - "TPXO8-atlas-v1", + "FES2014_extrapolated", + "FES2022_extrapolated", + "GOT4.10", + "GOT5.6_extrapolated", + "TPXO10-atlas-v2-nc", + "TPXO8-atlas-nc", + "TPXO9-atlas-v5-nc", ] ) @@ -264,7 +280,7 @@ def clip_models( output_directory: str | os.PathLike, bbox: tuple[float, float, float, float], model: list | None = None, - buffer: float = 1, + buffer: float = 5, overwrite: bool = False, ): """ @@ -297,7 +313,7 @@ def clip_models( in the input directly. buffer : float, optional Buffer distance (in degrees) added to the bounding box to provide - sufficient data on edges of study area. Defaults to 1 degree. + sufficient data on edges of study area. Defaults to 5 degrees. overwrite : bool, optional If True, overwrite existing files in the output directory. Defaults to False. diff --git a/eo_tides/validation.py b/eo_tides/validation.py index c407450..4e310de 100644 --- a/eo_tides/validation.py +++ b/eo_tides/validation.py @@ -5,6 +5,7 @@ import geopandas as gpd import pandas as pd +import tqdm from odc.geo.geom import BoundingBox from pandas.tseries.offsets import MonthBegin, MonthEnd, YearBegin, YearEnd from scipy import stats @@ -152,21 +153,24 @@ def _load_gauge_metadata(metadata_path): def _load_gesla_dataset(site, path, na_value): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", FutureWarning) - gesla_df = ( - pd.read_csv( - path, - skiprows=41, - names=["date", "time", "sea_level", "qc_flag", "use_flag"], - sep=r"\s+", # sep="\s+", - parse_dates=[[0, 1]], - index_col=0, - na_values=na_value, - ) - .rename_axis("time") - .assign(site_code=site) + # Read dataset + gesla_df = pd.read_csv( + path, + skiprows=41, + names=["date", "time", "sea_level", "qc_flag", "use_flag"], + sep=r"\s+", + na_values=na_value, + ) + + # Combine two date fields + gesla_df = ( + gesla_df.assign( + time=pd.to_datetime(gesla_df["date"] + " " + gesla_df["time"]), + site_code=site, ) + .drop(columns=["date"]) + .set_index("time") + ) return gesla_df @@ -301,13 +305,11 @@ def load_gauge_gesla( paths_na = metadata_df.loc[site_code, ["file_name", "null_value"]] # Load and combine into a single dataframe - data_df = ( - pd.concat([_load_gesla_dataset(s, p, na_value=na) for s, p, na in paths_na.itertuples()]) - .sort_index() - .loc[slice(start_time, end_time)] - .reset_index() - .set_index("site_code") - ) + gauge_list = [ + _load_gesla_dataset(s, p, na_value=na) + for s, p, na in tqdm.tqdm(paths_na.itertuples(), total=len(paths_na), desc="Loading GESLA gauges") + ] + data_df = pd.concat(gauge_list).sort_index().loc[slice(start_time, end_time)].reset_index().set_index("site_code") # Optionally filter by use flag column if filter_use_flag: diff --git a/pyproject.toml b/pyproject.toml index bc4206d..719ff5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ dependencies = [ "odc-geo>=0.4.7", "pandas>=2.2.0", "psutil>=5.8.0", + "pyogrio>=0.7.0", "pyproj>=3.6.1", "pyTMD==2.1.8", "scikit-learn>=1.4.0", @@ -114,6 +115,7 @@ preview = true [tool.deptry.per_rule_ignores] DEP002 = [ "folium", + "pyogrio", ] [tool.coverage.report] diff --git a/tests/testing.ipynb b/tests/testing.ipynb index 0be1c52..c6bdabf 100644 --- a/tests/testing.ipynb +++ b/tests/testing.ipynb @@ -2,27 +2,11 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collecting uv\n", - " Downloading uv-0.4.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)\n", - "Downloading uv-0.4.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m143.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hInstalling collected packages: uv\n", - "Successfully installed uv-0.4.29\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "dea-tools 0.3.5 requires pyTMD<=2.1.6, but you have pytmd 2.1.7 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ - "!pip install uv\n", + "!pip install uv==0.5.0\n", "!pip install -e .. --quiet\n" ] }, @@ -32,7 +16,7 @@ "metadata": {}, "outputs": [], "source": [ - "!pip install -e /home/jovyan/Robbi/pyTMD" + "# !pip install -e /home/jovyan/Robbi/pyTMD" ] }, { @@ -110,6 +94,7 @@ "\n", "satellite_ds = load_satellite_ds()\n", "\n", + "\n", "def load_measured_tides_ds():\n", " \"\"\"\n", " Load measured sea level data from the Broome ABSLMP tidal station:\n", @@ -137,6 +122,7 @@ " # Return as xarray dataset\n", " return measured_tides_df.to_xarray()\n", "\n", + "\n", "satellite_ds = load_satellite_ds()\n", "measured_tides_ds = load_measured_tides_ds()" ] @@ -150,22 +136,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "/workspaces/eo-tides\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/workspaces/eo-tides/.venv/lib/python3.12/site-packages/IPython/core/magics/osm.py:417: UserWarning: using dhist requires you to install the `pickleshare` library.\n", - " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n" + "/home/jovyan/Robbi/eo-tides\n" ] } ], @@ -175,177 +153,209 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "============================= test session starts ==============================\n", + "\u001b[1m============================= test session starts ==============================\u001b[0m\n", "platform linux -- Python 3.10.15, pytest-8.3.3, pluggy-1.5.0 -- /env/bin/python3.10\n", "cachedir: .pytest_cache\n", "rootdir: /home/jovyan/Robbi/eo-tides\n", "configfile: pyproject.toml\n", - "plugins: anyio-4.6.2.post1, nbval-0.11.0\n", - "collected 51 items / 42 deselected / 9 selected \n", + "plugins: anyio-4.6.2.post1, nbval-0.11.0, dependency-0.6.0, cov-6.0.0\n", + "collected 40 items / 39 deselected / 1 selected \u001b[0m\u001b[1m\n", + "\n", + "tests/test_model.py::test_model_tides_ensemble \u001b[31mFAILED\u001b[0m\u001b[31m [100%]\u001b[0m\n", "\n", - "tests/test_model.py::test_parallel_splits[10000-2-8-4] PASSED [ 11%]\n", - "tests/test_model.py::test_parallel_splits[5000-1-4-4] PASSED [ 22%]\n", - "tests/test_model.py::test_parallel_splits[900-1-4-1] PASSED [ 33%]\n", - "tests/test_model.py::test_parallel_splits[2000-2-2-1] PASSED [ 44%]\n", - "tests/test_model.py::test_parallel_splits[100000-2-4-2] PASSED [ 55%]\n", - "tests/test_model.py::test_parallel_splits[100000-4-8-2] PASSED [ 66%]\n", - "tests/test_model.py::test_parallel_splits[1-1-1-1] PASSED [ 77%]\n", - "tests/test_model.py::test_parallel_splits[999999-1-8-8] PASSED [ 88%]\n", - "tests/test_model.py::test_parallel_splits[10000-8-8-1] PASSED [100%]\n", + "=================================== FAILURES ===================================\n", + "\u001b[31m\u001b[1m__________________________ test_model_tides_ensemble ___________________________\u001b[0m\n", "\n", - "=============================== warnings summary ===============================\n", + " \u001b[0m\u001b[94mdef\u001b[39;49;00m \u001b[92mtest_model_tides_ensemble\u001b[39;49;00m():\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Input params\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " good_hamtide11 = -\u001b[94m17.58549\u001b[39;49;00m, \u001b[94m123.59414\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " good_eot20 = -\u001b[94m17.1611\u001b[39;49;00m, \u001b[94m123.3406\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " y = [good_eot20[\u001b[94m0\u001b[39;49;00m], good_hamtide11[\u001b[94m0\u001b[39;49;00m]]\u001b[90m\u001b[39;49;00m\n", + " x = [good_eot20[\u001b[94m1\u001b[39;49;00m], good_hamtide11[\u001b[94m1\u001b[39;49;00m]]\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " times = pd.date_range(\u001b[33m\"\u001b[39;49;00m\u001b[33m2020\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33m2021\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, periods=\u001b[94m2\u001b[39;49;00m)\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Default, only ensemble requested\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df = model_tides(\u001b[90m\u001b[39;49;00m\n", + " x=x,\u001b[90m\u001b[39;49;00m\n", + " y=y,\u001b[90m\u001b[39;49;00m\n", + " time=times,\u001b[90m\u001b[39;49;00m\n", + " model=\u001b[33m\"\u001b[39;49;00m\u001b[33mensemble\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ensemble_models=ENSEMBLE_MODELS,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.index.names == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtime\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mx\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33my\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.columns.tolist() == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtide_model\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mtide_height\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mall\u001b[39;49;00m(modelled_tides_df.tide_model == \u001b[33m\"\u001b[39;49;00m\u001b[33mensemble\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m)\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Default, ensemble + other models requested\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " models = [\u001b[33m\"\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mensemble\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df = model_tides(\u001b[90m\u001b[39;49;00m\n", + " x=x,\u001b[90m\u001b[39;49;00m\n", + " y=y,\u001b[90m\u001b[39;49;00m\n", + " time=times,\u001b[90m\u001b[39;49;00m\n", + " model=models,\u001b[90m\u001b[39;49;00m\n", + " ensemble_models=ENSEMBLE_MODELS,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.index.names == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtime\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mx\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33my\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.columns.tolist() == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtide_model\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mtide_height\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mset\u001b[39;49;00m(modelled_tides_df.tide_model) == \u001b[96mset\u001b[39;49;00m(models)\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m np.allclose(\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df.tide_height.values,\u001b[90m\u001b[39;49;00m\n", + " [\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.094\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " -\u001b[94m3.202\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.409\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " -\u001b[94m3.098\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.803\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.664\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.989\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m1.011\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.449\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " -\u001b[94m1.269\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.699\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " -\u001b[94m1.043\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ],\u001b[90m\u001b[39;49;00m\n", + " atol=\u001b[94m0.02\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# One-to-one mode\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df = model_tides(\u001b[90m\u001b[39;49;00m\n", + " x=x,\u001b[90m\u001b[39;49;00m\n", + " y=y,\u001b[90m\u001b[39;49;00m\n", + " time=times,\u001b[90m\u001b[39;49;00m\n", + " model=models,\u001b[90m\u001b[39;49;00m\n", + " mode=\u001b[33m\"\u001b[39;49;00m\u001b[33mone-to-one\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ensemble_models=ENSEMBLE_MODELS,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.index.names == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtime\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mx\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33my\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m modelled_tides_df.columns.tolist() == [\u001b[33m\"\u001b[39;49;00m\u001b[33mtide_model\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mtide_height\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mset\u001b[39;49;00m(modelled_tides_df.tide_model) == \u001b[96mset\u001b[39;49;00m(models)\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Wide mode, default\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df = model_tides(\u001b[90m\u001b[39;49;00m\n", + " x=x,\u001b[90m\u001b[39;49;00m\n", + " y=y,\u001b[90m\u001b[39;49;00m\n", + " time=times,\u001b[90m\u001b[39;49;00m\n", + " model=models,\u001b[90m\u001b[39;49;00m\n", + " output_format=\u001b[33m\"\u001b[39;49;00m\u001b[33mwide\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ensemble_models=ENSEMBLE_MODELS,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Check that expected models exist, and that ensemble is approx average\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# of other two models\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mset\u001b[39;49;00m(modelled_tides_df.columns) == \u001b[96mset\u001b[39;49;00m(models)\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m np.allclose(\u001b[90m\u001b[39;49;00m\n", + " \u001b[94m0.5\u001b[39;49;00m * (modelled_tides_df.EOT20 + modelled_tides_df.HAMTIDE11),\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df.ensemble,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Wide mode, top n == 1\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " modelled_tides_df = model_tides(\u001b[90m\u001b[39;49;00m\n", + " x=x,\u001b[90m\u001b[39;49;00m\n", + " y=y,\u001b[90m\u001b[39;49;00m\n", + " time=times,\u001b[90m\u001b[39;49;00m\n", + " model=models,\u001b[90m\u001b[39;49;00m\n", + " output_format=\u001b[33m\"\u001b[39;49;00m\u001b[33mwide\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ensemble_top_n=\u001b[94m1\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ensemble_models=ENSEMBLE_MODELS,\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Check that expected models exist, and that ensemble is equal to at\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# least one of the other models\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mset\u001b[39;49;00m(modelled_tides_df.columns) == \u001b[96mset\u001b[39;49;00m(models)\u001b[90m\u001b[39;49;00m\n", + " \u001b[94massert\u001b[39;49;00m \u001b[96mall\u001b[39;49;00m(\u001b[90m\u001b[39;49;00m\n", + " (modelled_tides_df.EOT20 == modelled_tides_df.ensemble)\u001b[90m\u001b[39;49;00m\n", + " | (modelled_tides_df.HAMTIDE11 == modelled_tides_df.ensemble)\u001b[90m\u001b[39;49;00m\n", + " )\u001b[90m\u001b[39;49;00m\n", + " \u001b[90m\u001b[39;49;00m\n", + " \u001b[90m# Check that correct model is the closest at each row\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " closer_model = modelled_tides_df.apply(\u001b[90m\u001b[39;49;00m\n", + " \u001b[94mlambda\u001b[39;49;00m row: (\u001b[90m\u001b[39;49;00m\n", + " \u001b[33m\"\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m \u001b[94mif\u001b[39;49;00m \u001b[96mabs\u001b[39;49;00m(row[\u001b[33m\"\u001b[39;49;00m\u001b[33mensemble\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m] - row[\u001b[33m\"\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]) < \u001b[96mabs\u001b[39;49;00m(row[\u001b[33m\"\u001b[39;49;00m\u001b[33mensemble\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m] - row[\u001b[33m\"\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]) \u001b[94melse\u001b[39;49;00m \u001b[33m\"\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\n", + " ),\u001b[90m\u001b[39;49;00m\n", + " axis=\u001b[94m1\u001b[39;49;00m,\u001b[90m\u001b[39;49;00m\n", + " ).tolist()\u001b[90m\u001b[39;49;00m\n", + "> \u001b[94massert\u001b[39;49;00m closer_model == [\u001b[33m\"\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m, \u001b[33m\"\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m\"\u001b[39;49;00m]\u001b[90m\u001b[39;49;00m\n", + "\u001b[1m\u001b[31mE AssertionError: assert ['EOT20', 'EO...T20', 'EOT20'] == ['EOT20', 'HA..., 'HAMTIDE11']\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[0m\n", + "\u001b[1m\u001b[31mE At index 1 diff: \u001b[0m\u001b[33m'\u001b[39;49;00m\u001b[33mEOT20\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[90m\u001b[39;49;00m != \u001b[0m\u001b[33m'\u001b[39;49;00m\u001b[33mHAMTIDE11\u001b[39;49;00m\u001b[33m'\u001b[39;49;00m\u001b[90m\u001b[39;49;00m\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[0m\n", + "\u001b[1m\u001b[31mE Full diff:\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[0m\u001b[90m \u001b[39;49;00m [\u001b[90m\u001b[39;49;00m\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[90m \u001b[39;49;00m 'EOT20',\u001b[90m\u001b[39;49;00m\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[91m- 'HAMTIDE11',\u001b[39;49;00m\u001b[90m\u001b[39;49;00m...\u001b[0m\n", + "\u001b[1m\u001b[31mE \u001b[0m\n", + "\u001b[1m\u001b[31mE ...Full output truncated (5 lines hidden), use '-vv' to show\u001b[0m\n", + "\n", + "\u001b[1m\u001b[31mtests/test_model.py\u001b[0m:377: AssertionError\n", + "----------------------------- Captured stdout call -----------------------------\n", + "Running ensemble tide modelling\n", + "Modelling tides with EOT20, HAMTIDE11 in parallel (models: 2, splits: 1)\n", + "Interpolating model rankings using IDW interpolation \n", + "Combining models into single ensemble model\n", + "Running ensemble tide modelling\n", + "Modelling tides with EOT20, HAMTIDE11 in parallel (models: 2, splits: 1)\n", + "Interpolating model rankings using IDW interpolation \n", + "Combining models into single ensemble model\n", + "Running ensemble tide modelling\n", + "Modelling tides with EOT20, HAMTIDE11 in parallel (models: 2, splits: 1)\n", + "Interpolating model rankings using IDW interpolation \n", + "Combining models into single ensemble model\n", + "Running ensemble tide modelling\n", + "Modelling tides with EOT20, HAMTIDE11 in parallel (models: 2, splits: 1)\n", + "Interpolating model rankings using IDW interpolation \n", + "Combining models into single ensemble model\n", + "Converting to a wide format dataframe\n", + "Running ensemble tide modelling\n", + "Modelling tides with EOT20, HAMTIDE11 in parallel (models: 2, splits: 1)\n", + "Interpolating model rankings using IDW interpolation \n", + "Combining models into single ensemble model\n", + "Converting to a wide format dataframe\n", + "----------------------------- Captured stderr call -----------------------------\n", + "100%|██████████| 2/2 [00:00<00:00, 14.59it/s]\n", + "100%|██████████| 2/2 [00:00<00:00, 16.97it/s]\n", + "100%|██████████| 2/2 [00:00<00:00, 17.09it/s]\n", + "100%|██████████| 2/2 [00:00<00:00, 17.76it/s]\n", + "100%|██████████| 2/2 [00:00<00:00, 17.48it/s]\n", + "\u001b[33m=============================== warnings summary ===============================\u001b[0m\n", ":241\n", " :241: RuntimeWarning: numpy.ndarray size changed, may indicate binary incompatibility. Expected 16 from C header, got 96 from PyObject\n", "\n", "-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n", - "================= 9 passed, 42 deselected, 1 warning in 1.83s ==================\n" + "\u001b[36m\u001b[1m=========================== short test summary info ============================\u001b[0m\n", + "\u001b[31mFAILED\u001b[0m tests/test_model.py::\u001b[1mtest_model_tides_ensemble\u001b[0m - AssertionError: assert ['EOT20', 'EO...T20', 'EOT20'] == ['EOT20', 'HA..., ...\n", + "\u001b[31m================= \u001b[31m\u001b[1m1 failed\u001b[0m, \u001b[33m39 deselected\u001b[0m, \u001b[33m1 warning\u001b[0m\u001b[31m in 13.68s\u001b[0m\u001b[31m =================\u001b[0m\n" ] } ], + "source": [ + "!export EO_TIDES_TIDE_MODELS=./tests/data/tide_models && pytest tests/test_model.py --verbose -k test_model_tides_ensemble" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "!export EO_TIDES_TIDE_MODELS=./tests/data/tide_models && pytest tests/test_model.py --verbose -k test_parallel_splits" ] }, { "cell_type": "code", - "execution_count": 146, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "============================= test session starts ==============================\n", - "platform linux -- Python 3.10.15, pytest-8.3.3, pluggy-1.5.0 -- /env/bin/python3.10\n", - "cachedir: .pytest_cache\n", - "rootdir: /home/jovyan/Robbi/eo-tides\n", - "configfile: pyproject.toml\n", - "plugins: anyio-4.6.2.post1, nbval-0.11.0\n", - "collected 96 items \n", - "\n", - "tests/test_eo.py::test_tag_tides[satellite_ds_epsg3577-None-None] PASSED [ 1%]\n", - "tests/test_eo.py::test_tag_tides[satellite_ds_epsg3577--18.0008-122.2183] PASSED [ 2%]\n", - "tests/test_eo.py::test_tag_tides_multiple[satellite_ds_epsg3577] PASSED [ 3%]\n", - "tests/test_eo.py::test_pixel_tides[satellite_ds_epsg3577-None] PASSED [ 4%]\n", - "tests/test_eo.py::test_pixel_tides[satellite_ds_epsg3577-custom] PASSED [ 5%]\n", - "tests/test_eo.py::test_pixel_tides_times[satellite_ds_epsg3577] PASSED [ 6%]\n", - "tests/test_eo.py::test_pixel_tides_quantile[satellite_ds_epsg3577] PASSED [ 7%]\n", - "tests/test_eo.py::test_pixel_tides_multiplemodels[satellite_ds_epsg3577-None] PASSED [ 8%]\n", - "tests/test_eo.py::test_pixel_tides_multiplemodels[satellite_ds_epsg3577-quantiles1] PASSED [ 9%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg3577-None] PASSED [ 10%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg3577-dask_chunks1] PASSED [ 11%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg3577-dask_chunks2] PASSED [ 12%]\n", - "tests/test_eo.py::test_pixel_tides_ensemble[satellite_ds_epsg3577] PASSED [ 13%]\n", - "tests/test_stats.py::test_tidal_stats[satellite_ds_epsg3577-2h] PASSED [ 14%]\n", - "tests/test_stats.py::test_tidal_stats[satellite_ds_epsg3577-120min] PASSED [ 15%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg3577-models0-False] PASSED [ 16%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg3577-models1-False] PASSED [ 17%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg3577-models2-True] PASSED [ 18%]\n", - "tests/test_eo.py::test_tag_tides[satellite_ds_epsg4326-None-None] PASSED [ 19%]\n", - "tests/test_eo.py::test_tag_tides[satellite_ds_epsg4326--18.0008-122.2183] PASSED [ 20%]\n", - "tests/test_eo.py::test_tag_tides_multiple[satellite_ds_epsg4326] PASSED [ 21%]\n", - "tests/test_eo.py::test_pixel_tides[satellite_ds_epsg4326-None] PASSED [ 22%]\n", - "tests/test_eo.py::test_pixel_tides[satellite_ds_epsg4326-custom] PASSED [ 23%]\n", - "tests/test_eo.py::test_pixel_tides_times[satellite_ds_epsg4326] PASSED [ 25%]\n", - "tests/test_eo.py::test_pixel_tides_quantile[satellite_ds_epsg4326] PASSED [ 26%]\n", - "tests/test_eo.py::test_pixel_tides_multiplemodels[satellite_ds_epsg4326-None] PASSED [ 27%]\n", - "tests/test_eo.py::test_pixel_tides_multiplemodels[satellite_ds_epsg4326-quantiles1] PASSED [ 28%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg4326-None] PASSED [ 29%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg4326-dask_chunks1] PASSED [ 30%]\n", - "tests/test_eo.py::test_pixel_tides_dask[satellite_ds_epsg4326-dask_chunks2] PASSED [ 31%]\n", - "tests/test_eo.py::test_pixel_tides_ensemble[satellite_ds_epsg4326] PASSED [ 32%]\n", - "tests/test_stats.py::test_tidal_stats[satellite_ds_epsg4326-2h] PASSED [ 33%]\n", - "tests/test_stats.py::test_tidal_stats[satellite_ds_epsg4326-120min] PASSED [ 34%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg4326-models0-False] PASSED [ 35%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg4326-models1-False] PASSED [ 36%]\n", - "tests/test_stats.py::test_pixel_stats[satellite_ds_epsg4326-models2-True] PASSED [ 37%]\n", - "tests/test_model.py::test_standardise_time[None-None] PASSED [ 38%]\n", - "tests/test_model.py::test_standardise_time[input_value1-expected_output1] PASSED [ 39%]\n", - "tests/test_model.py::test_standardise_time[input_value2-expected_output2] PASSED [ 40%]\n", - "tests/test_model.py::test_standardise_time[input_value3-expected_output3] PASSED [ 41%]\n", - "tests/test_model.py::test_standardise_time[input_value4-expected_output4] PASSED [ 42%]\n", - "tests/test_model.py::test_standardise_time[input_value5-expected_output5] PASSED [ 43%]\n", - "tests/test_model.py::test_standardise_time[input_value6-expected_output6] PASSED [ 44%]\n", - "tests/test_model.py::test_standardise_time[input_value7-expected_output7] PASSED [ 45%]\n", - "tests/test_model.py::test_standardise_time[2020-01-12 21:14-expected_output8] PASSED [ 46%]\n", - "tests/test_model.py::test_standardise_time[input_value9-expected_output9] PASSED [ 47%]\n", - "tests/test_model.py::test_parallel_splits[10000-2-8-4] PASSED [ 48%]\n", - "tests/test_model.py::test_parallel_splits[5000-1-4-4] PASSED [ 50%]\n", - "tests/test_model.py::test_parallel_splits[900-1-4-1] PASSED [ 51%]\n", - "tests/test_model.py::test_parallel_splits[2000-2-2-1] PASSED [ 52%]\n", - "tests/test_model.py::test_parallel_splits[100000-2-4-2] PASSED [ 53%]\n", - "tests/test_model.py::test_parallel_splits[100000-4-8-2] PASSED [ 54%]\n", - "tests/test_model.py::test_parallel_splits[1-1-1-1] PASSED [ 55%]\n", - "tests/test_model.py::test_parallel_splits[999999-1-8-8] PASSED [ 56%]\n", - "tests/test_model.py::test_parallel_splits[10000-8-8-1] PASSED [ 57%]\n", - "tests/test_model.py::test_list_models PASSED [ 58%]\n", - "tests/test_model.py::test_model_tides[122.2183--18.0008-EPSG:4326-bilinear-EOT20] PASSED [ 59%]\n", - "tests/test_model.py::test_model_tides[122.2183--18.0008-EPSG:4326-spline-EOT20] PASSED [ 60%]\n", - "tests/test_model.py::test_model_tides[-1034913--1961916-EPSG:3577-bilinear-EOT20] PASSED [ 61%]\n", - "tests/test_model.py::test_model_tides[122.2183--18.0008-EPSG:4326-spline-GOT5.5] PASSED [ 62%]\n", - "tests/test_model.py::test_model_tides[122.2183--18.0008-EPSG:4326-spline-HAMTIDE11] PASSED [ 63%]\n", - "tests/test_model.py::test_model_tides_multiplemodels[single_model_long] PASSED [ 64%]\n", - "tests/test_model.py::test_model_tides_multiplemodels[single_model_wide] PASSED [ 65%]\n", - "tests/test_model.py::test_model_tides_multiplemodels[multiple_models_long] PASSED [ 66%]\n", - "tests/test_model.py::test_model_tides_multiplemodels[multiple_models_wide] PASSED [ 67%]\n", - "tests/test_model.py::test_model_tides_units[metres] PASSED [ 68%]\n", - "tests/test_model.py::test_model_tides_units[centimetres] PASSED [ 69%]\n", - "tests/test_model.py::test_model_tides_units[millimetres] PASSED [ 70%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-many-models0-long] PASSED [ 71%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-one-models1-long] PASSED [ 72%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-many-models2-wide] PASSED [ 73%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-one-models3-wide] PASSED [ 75%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-many-models4-long] PASSED [ 76%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-one-models5-long] PASSED [ 77%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-many-models6-wide] PASSED [ 78%]\n", - "tests/test_model.py::test_model_tides_mode[one-to-one-models7-wide] PASSED [ 79%]\n", - "tests/test_model.py::test_model_tides_ensemble PASSED [ 80%]\n", - "tests/test_model.py::test_model_phases[15 min] PASSED [ 81%]\n", - "tests/test_model.py::test_model_phases[20 min] PASSED [ 82%]\n", - "tests/test_model.py::test_model_phases_format[models0-long-False-expected_cols0] PASSED [ 83%]\n", - "tests/test_model.py::test_model_phases_format[models1-long-True-expected_cols1] PASSED [ 84%]\n", - "tests/test_model.py::test_model_phases_format[models2-long-False-expected_cols2] PASSED [ 85%]\n", - "tests/test_model.py::test_model_phases_format[models3-long-True-expected_cols3] PASSED [ 86%]\n", - "tests/test_model.py::test_model_phases_format[models4-wide-False-expected_cols4] PASSED [ 87%]\n", - "tests/test_model.py::test_model_phases_format[models5-wide-True-expected_cols5] PASSED [ 88%]\n", - "tests/test_model.py::test_model_phases_format[models6-wide-False-expected_cols6] PASSED [ 89%]\n", - "tests/test_model.py::test_model_phases_format[models7-wide-True-expected_cols7] PASSED [ 90%]\n", - "tests/test_utils.py::test_idw PASSED [ 91%]\n", - "tests/test_validation.py::test_load_gauge_gesla[broome_xy] PASSED [ 92%]\n", - "tests/test_validation.py::test_load_gauge_gesla[sandiego_xy] PASSED [ 93%]\n", - "tests/test_validation.py::test_load_gauge_gesla[syd_xy_correctmean] PASSED [ 94%]\n", - "tests/test_validation.py::test_load_gauge_gesla[no_nearest] XFAIL (N...) [ 95%]\n", - "tests/test_validation.py::test_load_gauge_gesla[broome_bbox] PASSED [ 96%]\n", - "tests/test_validation.py::test_load_gauge_gesla[aus_bbox] PASSED [ 97%]\n", - "tests/test_validation.py::test_load_gauge_gesla[broome_code] PASSED [ 98%]\n", - "tests/test_validation.py::test_load_gauge_gesla[aus_code] PASSED [100%]\n", - "\n", - "=============================== warnings summary ===============================\n", - ":241\n", - " :241: RuntimeWarning: numpy.ndarray size changed, may indicate binary incompatibility. Expected 16 from C header, got 96 from PyObject\n", - "\n", - "tests/test_eo.py: 8 warnings\n", - "tests/test_stats.py: 32 warnings\n", - "tests/test_model.py: 54 warnings\n", - " /env/lib/python3.10/site-packages/pyproj/transformer.py:817: 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", - " return self._transformer._transform_point(\n", - "\n", - "tests/test_eo.py: 14 warnings\n", - " /env/lib/python3.10/site-packages/rasterio/warp.py:387: NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix will be returned.\n", - " dest = _reproject(\n", - "\n", - "-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n", - "=========== 95 passed, 1 xfailed, 109 warnings in 256.12s (0:04:16) ============\n" - ] - } - ], + "outputs": [], "source": [ "!export EO_TIDES_TIDE_MODELS=./tests/data/tide_models && pytest tests --verbose" ] @@ -354,24 +364,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## `_standardise_models`" + "## Ensemble updates" ] }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 8, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running ensemble tide modelling\n", - "Models to process: ['EOT20', 'GOT5.5', 'HAMTIDE11']\n", - "Models requested: ['ensemble', 'GOT5.5']\n", - "Ensemble models: ['EOT20', 'HAMTIDE11']\n" - ] - }, { "ename": "AssertionError", "evalue": "", @@ -379,849 +379,525 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[107], line 167\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEnsemble models: \u001b[39m\u001b[38;5;124m\"\u001b[39m, ensemble_models)\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m models_to_process \u001b[38;5;241m==\u001b[39m exp_process\n\u001b[0;32m--> 167\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m models_requested \u001b[38;5;241m==\u001b[39m exp_request\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m ensemble_models \u001b[38;5;241m==\u001b[39m exp_ensemble\n", + "Cell \u001b[0;32mIn[8], line 122\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[38;5;66;03m# Check that correct model is the closest at each row\u001b[39;00m\n\u001b[1;32m 116\u001b[0m closer_model \u001b[38;5;241m=\u001b[39m modelled_tides_df\u001b[38;5;241m.\u001b[39mapply(\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m row: (\n\u001b[1;32m 118\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEOT20\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mabs\u001b[39m(row[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mensemble\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m-\u001b[39m row[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEOT20\u001b[39m\u001b[38;5;124m\"\u001b[39m]) \u001b[38;5;241m<\u001b[39m \u001b[38;5;28mabs\u001b[39m(row[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mensemble\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m-\u001b[39m row[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHAMTIDE11\u001b[39m\u001b[38;5;124m\"\u001b[39m]) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHAMTIDE11\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 119\u001b[0m ),\n\u001b[1;32m 120\u001b[0m axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m,\n\u001b[1;32m 121\u001b[0m )\u001b[38;5;241m.\u001b[39mtolist()\n\u001b[0;32m--> 122\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m closer_model \u001b[38;5;241m==\u001b[39m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEOT20\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHAMTIDE11\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEOT20\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHAMTIDE11\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 124\u001b[0m \u001b[38;5;66;03m# # Check values are expected\u001b[39;00m\n\u001b[1;32m 125\u001b[0m \u001b[38;5;66;03m# assert np.allclose(modelled_tides_df.ensemble, [0.09, 0.98, -3.20, 1.01], atol=0.02)\u001b[39;00m\n\u001b[1;32m 126\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[38;5;66;03m# \"ensemble-mean\",\u001b[39;00m\n\u001b[1;32m 179\u001b[0m \u001b[38;5;66;03m# ])\u001b[39;00m\n", "\u001b[0;31mAssertionError\u001b[0m: " ] } ], "source": [ - "from eo_tides.utils import _set_directory, list_models\n", + "dir_path = \"./tests/data/tide_models\"\n", "\n", - "directory = \"/home/jovyan/Robbi/eo-tides/tests/data/tide_models/\"\n", - "directory = _set_directory(directory)\n", - "\n", - "\n", - "# def _standardise_models(model, directory, ensemble_models=None):\n", - "\n", - "# # Turn inputs into arrays for consistent handling\n", - "# models_requested = list(np.atleast_1d(model))\n", - "\n", - "# # Get full list of supported models from pyTMD database\n", - "# available_models, valid_models = list_models(\n", - "# directory, show_available=False, show_supported=False, raise_error=True\n", - "# )\n", - "# custom_options = [\"ensemble\", \"all\"]\n", - "\n", - "# # Error if any models are not supported\n", - "# if not all(m in valid_models + custom_options for m in models_requested):\n", - "# error_text = (\n", - "# f\"One or more of the requested models are not valid:\\n\"\n", - "# f\"{models_requested}\\n\\n\"\n", - "# \"The following models are supported:\\n\"\n", - "# f\"{valid_models}\"\n", - "# )\n", - "# raise ValueError(error_text)\n", - "\n", - "# # Error if any models are not available in `directory`\n", - "# if not all(m in available_models + custom_options for m in models_requested):\n", - "# error_text = (\n", - "# f\"One or more of the requested models are valid, but not available in `{directory}`:\\n\"\n", - "# f\"{models_requested}\\n\\n\"\n", - "# f\"The following models are available in `{directory}`:\\n\"\n", - "# f\"{available_models}\"\n", - "# )\n", - "# raise ValueError(error_text)\n", - "\n", - "# # If \"all\" models are requested, update requested list to include available models\n", - "# if \"all\" in models_requested:\n", - "# models_requested = available_models + [\n", - "# m for m in models_requested if m != \"all\"\n", - "# ]\n", - "\n", - "# # If \"ensemble\" modeling is requested, use custom list of ensemble models\n", - "# if \"ensemble\" in models_requested:\n", - "# print(\"Running ensemble tide modelling\")\n", - "# ensemble_models = (\n", - "# ensemble_models\n", - "# if ensemble_models is not None\n", - "# else [\n", - "# \"FES2014\",\n", - "# \"TPXO9-atlas-v5\",\n", - "# \"EOT20\",\n", - "# \"HAMTIDE11\",\n", - "# \"GOT4.10\",\n", - "# \"FES2012\",\n", - "# \"TPXO8-atlas-v1\",\n", - "# ]\n", - "# )\n", - "\n", - "# # Error if any ensemble models are not available in `directory`\n", - "# if not all(m in available_models for m in ensemble_models):\n", - "# error_text = (\n", - "# f\"One or more of the requested ensemble models are not available in `{directory}`:\\n\"\n", - "# f\"{ensemble_models}\\n\\n\"\n", - "# f\"The following models are available in `{directory}`:\\n\"\n", - "# f\"{available_models}\"\n", - "# )\n", - "# raise ValueError(error_text)\n", "\n", - "# # Return set of all ensemble plus any other requested models\n", - "# models_to_process = ensemble_models + [\n", - "# m for m in models_requested if m != \"ensemble\"\n", - "# ]\n", + "from eo_tides.model import model_tides\n", "\n", - "# # Otherwise, models to process are the same as those requested\n", - "# else:\n", - "# models_to_process = models_requested\n", + "# Input params\n", + "good_hamtide11 = -17.58549, 123.59414\n", + "good_eot20 = -17.1611, 123.3406\n", + "y = [good_eot20[0], good_hamtide11[0]]\n", + "x = [good_eot20[1], good_hamtide11[1]]\n", "\n", - "# # Remove duplicates\n", - "# models_to_process = list(set(models_to_process))\n", - "# models_requested = list(set(models_requested))\n", + "ENSEMBLE_MODELS = [\"EOT20\", \"HAMTIDE11\"]\n", "\n", - "# return models_to_process, models_requested, ensemble_models\n", + "# times = pd.date_range(\"2020\", \"2021\", periods=2)\n", "\n", + "# # Default, only ensemble requested\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=\"ensemble\",\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", - "# model = \"EOT20\"\n", - "# # model = [\"EOT20\", \"HAMTIDE11\"] # = [\"EOT20\", \"FES2014\"]\n", - "# # model = \"all\" # = [list all available]\n", - "# # model = \"ensemble\" # = [list all ensemble]\n", - "# # model = [\"ensemble\", \"GOT5.5\"] # = [list all ensemble]\n", - "# # model = [\"all\", \"ensemble\"]\n", + "# assert modelled_tides_df.index.names == [\"time\", \"x\", \"y\"]\n", + "# assert modelled_tides_df.columns.tolist() == [\"tide_model\", \"tide_height\"]\n", + "# assert all(modelled_tides_df.tide_model == \"ensemble\")\n", + "\n", + "# Default, ensemble + other models requested\n", + "models = [\"EOT20\", \"HAMTIDE11\", \"ensemble\"]\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", + "# assert modelled_tides_df.index.names == [\"time\", \"x\", \"y\"]\n", + "# assert modelled_tides_df.columns.tolist() == [\"tide_model\", \"tide_height\"]\n", + "# assert set(modelled_tides_df.tide_model) == set(models)\n", + "# assert np.allclose(\n", + "# modelled_tides_df.tide_height.values,\n", + "# [\n", + "# 0.094,\n", + "# -3.202,\n", + "# 0.409,\n", + "# -3.098,\n", + "# 0.803,\n", + "# 0.664,\n", + "# 0.989,\n", + "# 1.011,\n", + "# 0.449,\n", + "# -1.269,\n", + "# 0.699,\n", + "# -1.043,\n", + "# ],\n", + "# atol=0.02,\n", + "# )\n", "\n", - "from eo_tides.utils import _standardise_models\n", + "# # One-to-one mode\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# mode=\"one-to-one\",\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", + "# assert modelled_tides_df.index.names == [\"time\", \"x\", \"y\"]\n", + "# assert modelled_tides_df.columns.tolist() == [\"tide_model\", \"tide_height\"]\n", + "# assert set(modelled_tides_df.tide_model) == set(models)\n", + "\n", + "# # Wide mode, default\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# output_format=\"wide\",\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " [\"EOT20\"],\n", - " None,\n", - " [\"EOT20\"],\n", - " [\"EOT20\"],\n", - " None,\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " \"EOT20\",\n", - " None,\n", - " [\"EOT20\"],\n", - " [\"EOT20\"],\n", - " None,\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " \"all\",\n", - " None,\n", - " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", - " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", - " None,\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " [\"all\"],\n", - " None,\n", - " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", - " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", - " None,\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " \"ensemble\",\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - " [\"HAMTIDE11\", \"EOT20\"],\n", - " [\"ensemble\"],\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " [\"ensemble\"],\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - " [\"HAMTIDE11\", \"EOT20\"],\n", - " [\"ensemble\"],\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - ")\n", - "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - " [\"ensemble\", \"GOT5.5\"],\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - " [\"EOT20\", \"GOT5.5\", \"HAMTIDE11\"],\n", - " [\"GOT5.5\", \"ensemble\"],\n", - " [\"EOT20\", \"HAMTIDE11\"],\n", - ")\n", - "# model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", - "# [\"all\", \"ensemble\"],\n", - "# [\"EOT20\", \"HAMTIDE11\"],\n", - "# [\"EOT20\", \"GOT5.5\", \"HAMTIDE11\"],\n", - "# [\"GOT5.5\", \"HAMTIDE11\", \"ensemble\", \"EOT20\"],\n", - "# [\"EOT20\", \"HAMTIDE11\"],\n", + "# # Check that expected models exist, and that ensemble is approx average\n", + "# # of other two models\n", + "# assert set(modelled_tides_df.columns) == set(models)\n", + "# assert np.allclose(\n", + "# 0.5 * (modelled_tides_df.EOT20 + modelled_tides_df.HAMTIDE11),\n", + "# modelled_tides_df.ensemble,\n", "# )\n", "\n", + "# # Wide mode, top n == 1\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# output_format=\"wide\",\n", + "# ensemble_top_n=1,\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", - "models_to_process, models_requested, ensemble_models = _standardise_models(\n", - " model=model,\n", - " directory=directory,\n", - " ensemble_models=ensemble_models,\n", + "# Check that expected models exist, and that ensemble is equal to at\n", + "# least one of the other models\n", + "assert set(modelled_tides_df.columns) == set(models)\n", + "assert all(\n", + " (modelled_tides_df.EOT20 == modelled_tides_df.ensemble)\n", + " | (modelled_tides_df.HAMTIDE11 == modelled_tides_df.ensemble)\n", ")\n", "\n", - "print(\"Models to process: \", models_to_process)\n", - "print(\"Models requested: \", models_requested)\n", - "print(\"Ensemble models: \", ensemble_models)\n", + "# Check that correct model is the closest at each row\n", + "closer_model = modelled_tides_df.apply(\n", + " lambda row: (\n", + " \"EOT20\" if abs(row[\"ensemble\"] - row[\"EOT20\"]) < abs(row[\"ensemble\"] - row[\"HAMTIDE11\"]) else \"HAMTIDE11\"\n", + " ),\n", + " axis=1,\n", + ").tolist()\n", + "assert closer_model == [\"EOT20\", \"HAMTIDE11\", \"EOT20\", \"HAMTIDE11\"]\n", + "\n", + "# # Check values are expected\n", + "# assert np.allclose(modelled_tides_df.ensemble, [0.09, 0.98, -3.20, 1.01], atol=0.02)\n", + "\n", + "# # Wide mode, custom functions\n", + "# ensemble_funcs = {\n", + "# \"ensemble-best\": lambda x: x[\"rank\"] == 1,\n", + "# \"ensemble-worst\": lambda x: x[\"rank\"] == 2,\n", + "# \"ensemble-mean-top2\": lambda x: x[\"rank\"].isin([1, 2]),\n", + "# \"ensemble-mean-weighted\": lambda x: 3 - x[\"rank\"],\n", + "# \"ensemble-mean\": lambda x: x[\"rank\"] <= 2,\n", + "# }\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# output_format=\"wide\",\n", + "# ensemble_func=ensemble_funcs,\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", "\n", - "assert models_to_process == exp_process\n", - "assert models_requested == exp_request\n", - "assert ensemble_models == exp_ensemble" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['EOT20', 'GOT5.5', 'HAMTIDE11', 'ensemble']" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "models_requested" + "# # Check that expected models exist, and that valid data is produced\n", + "# assert set(modelled_tides_df.columns) == set([\n", + "# \"EOT20\",\n", + "# \"HAMTIDE11\",\n", + "# \"ensemble-best\",\n", + "# \"ensemble-worst\",\n", + "# \"ensemble-mean-top2\",\n", + "# \"ensemble-mean-weighted\",\n", + "# \"ensemble-mean\",\n", + "# ])\n", + "# assert all(modelled_tides_df.notnull())\n", + "\n", + "# # Long mode, custom functions\n", + "# modelled_tides_df = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=models,\n", + "# output_format=\"long\",\n", + "# ensemble_func=ensemble_funcs,\n", + "# directory=dir_path,\n", + "# ensemble_models=ENSEMBLE_MODELS,\n", + "# )\n", + "\n", + "# # Check that expected models exist in \"tide_model\" column\n", + "# assert set(modelled_tides_df.tide_model) == set([\n", + "# \"EOT20\",\n", + "# \"HAMTIDE11\",\n", + "# \"ensemble-best\",\n", + "# \"ensemble-worst\",\n", + "# \"ensemble-mean-top2\",\n", + "# \"ensemble-mean-weighted\",\n", + "# \"ensemble-mean\",\n", + "# ])" ] }, { "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['GOT5.5',\n", - " 'HAMTIDE11',\n", - " 'ensemble',\n", - " 'FES2012',\n", - " 'TPXO8-atlas-v1',\n", - " 'TPXO9-atlas-v5',\n", - " 'FES2014',\n", - " 'GOT4.10',\n", - " 'EOT20']" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(set(models_requested + ensemble_models))" - ] - }, - { - "cell_type": "code", - "execution_count": 24, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tide_modelEOT20HAMTIDE11ensemble
timexy
2020-01-01123.34060-17.161100.0944310.8026460.094431
123.59414-17.585490.4094530.9886050.409453
2021-01-01123.34060-17.16110-3.2019040.664067-3.201904
123.59414-17.58549-3.0983021.011445-3.098302
\n", + "
" + ], "text/plain": [ - "['ensemble', 'GOT5.5']" + "tide_model EOT20 HAMTIDE11 ensemble\n", + "time x y \n", + "2020-01-01 123.34060 -17.16110 0.094431 0.802646 0.094431\n", + " 123.59414 -17.58549 0.409453 0.988605 0.409453\n", + "2021-01-01 123.34060 -17.16110 -3.201904 0.664067 -3.201904\n", + " 123.59414 -17.58549 -3.098302 1.011445 -3.098302" ] }, - "execution_count": 24, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ensemble_models\n", + "modelled_tides_df" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "ENSEMBLE_MODELS = [\"EOT20\", \"HAMTIDE11\"]\n", + "ensemble_models = ENSEMBLE_MODELS\n", "\n", - "models_requested" + "x = tide_df.index.get_level_values(level=\"x\")\n", + "y = tide_df.index.get_level_values(level=\"y\")\n", + "model_ranking_cols = [f\"rank_{m}\" for m in ensemble_models]" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['HAMTIDE11',\n", - " 'GOT5.5',\n", - " 'FES2012',\n", - " 'TPXO8-atlas-v1',\n", - " 'TPXO9-atlas-v5',\n", - " 'FES2014',\n", - " 'GOT4.10',\n", - " 'EOT20']" + "rank_EOT20 0\n", + "rank_HAMTIDE11 87\n", + "geometry 0\n", + "dtype: int64" ] }, - "execution_count": 29, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], - "source": [] + "source": [ + "model_ranks_gdf.isnull().sum(axis=0)" + ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 35, "metadata": {}, + "outputs": [], "source": [ - "## Investigate interpolation functions\n", - "\n", - "crop=True, bounds=None: \n", - "crop=False, bounds=None:\n", - "crop=True, bounds=" + "import geopandas as gpd\n", + "ranking_points=\"https://dea-public-data-dev.s3-ap-southeast-2.amazonaws.com/derivative/dea_intertidal/supplementary/rankings_ensemble_2017-2019.fgb\"\n", + "crs = \"EPSG:4326\"\n", + "ranking_valid_perc=0.02\n", + "\n", + "try:\n", + " model_ranks_gdf = (\n", + " gpd.read_file(ranking_points, engine=\"pyogrio\")\n", + " .to_crs(crs)\n", + " .query(f\"valid_perc > {ranking_valid_perc}\")\n", + " .dropna(how=\"all\")[model_ranking_cols + [\"geometry\"]]\n", + " )\n", + "except KeyError:\n", + " error_msg = f\"\"\"\n", + " Not all of the expected \"rank_\" columns {model_ranking_cols} were\n", + " found in the columns of the ranking points file ({ranking_points}).\n", + " Consider passing a custom list of models using `ensemble_models`.\n", + " \"\"\"\n", + " raise Exception(textwrap.dedent(error_msg).strip()) from None" ] }, { "cell_type": "code", - "execution_count": 148, + "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{'version': 'FES2022', 'compressed': False, 'type': 'z', 'crop': True, 'bounds': None, 'method': 'spline', 'extrapolate': True, 'cutoff': inf, 'append_node': False, 'apply_flexure': False, 'scale': 0.01}\n", - "{'version': 'FES2022', 'compressed': False, 'type': 'z', 'crop': True, 'bounds': None, 'method': 'spline', 'extrapolate': True, 'cutoff': inf, 'append_node': False, 'apply_flexure': False, 'scale': 0.01}\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[148], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mget_ipython\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_cell_magic\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtimeit\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m-n 1 -r 1\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mx=np.linspace(122.2183, 122.219, 10)\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43my=np.linspace(-18.0008, -18.01, 10)\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mtime=pd.date_range(\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m2020\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m, \u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m2021\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m, periods=10)\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mcrs=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mEPSG:4326\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mmethod=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mspline\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mmodel=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mFES2022\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m# Run equivalent pyTMD code to verify same results\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mpytmd_tides = tide_elevations(\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m x=x, \u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m y=y, \u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m delta_time=time,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m DIRECTORY=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/gdata1/data/tide_models/\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m MODEL=model,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m EPSG=int(crs[-4:]),\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m TIME=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdatetime\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m EXTRAPOLATE=True,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m CUTOFF=np.inf,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m METHOD=method,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m CROP=True,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m # CROP=False,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m # BOUNDS=bounds,\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m )\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43mpytmd_tides\u001b[39;49m\u001b[38;5;130;43;01m\\n\u001b[39;49;00m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/env/lib/python3.10/site-packages/IPython/core/interactiveshell.py:2541\u001b[0m, in \u001b[0;36mInteractiveShell.run_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2539\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuiltin_trap:\n\u001b[1;32m 2540\u001b[0m args \u001b[38;5;241m=\u001b[39m (magic_arg_s, cell)\n\u001b[0;32m-> 2541\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2543\u001b[0m \u001b[38;5;66;03m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[1;32m 2544\u001b[0m \u001b[38;5;66;03m# when using magics with decorator @output_can_be_silenced\u001b[39;00m\n\u001b[1;32m 2545\u001b[0m \u001b[38;5;66;03m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[1;32m 2546\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(fn, magic\u001b[38;5;241m.\u001b[39mMAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[38;5;28;01mFalse\u001b[39;00m):\n", - "File \u001b[0;32m/env/lib/python3.10/site-packages/IPython/core/magics/execution.py:1189\u001b[0m, in \u001b[0;36mExecutionMagics.timeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1186\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m time_number \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.2\u001b[39m:\n\u001b[1;32m 1187\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[0;32m-> 1189\u001b[0m all_runs \u001b[38;5;241m=\u001b[39m \u001b[43mtimer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrepeat\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrepeat\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1190\u001b[0m best \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmin\u001b[39m(all_runs) \u001b[38;5;241m/\u001b[39m number\n\u001b[1;32m 1191\u001b[0m worst \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmax\u001b[39m(all_runs) \u001b[38;5;241m/\u001b[39m number\n", - "File \u001b[0;32m/env/lib/python3.10/timeit.py:206\u001b[0m, in \u001b[0;36mTimer.repeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m 204\u001b[0m r \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 205\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(repeat):\n\u001b[0;32m--> 206\u001b[0m t \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimeit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnumber\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 207\u001b[0m r\u001b[38;5;241m.\u001b[39mappend(t)\n\u001b[1;32m 208\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m r\n", - "File \u001b[0;32m/env/lib/python3.10/site-packages/IPython/core/magics/execution.py:173\u001b[0m, in \u001b[0;36mTimer.timeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 171\u001b[0m gc\u001b[38;5;241m.\u001b[39mdisable()\n\u001b[1;32m 172\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 173\u001b[0m timing \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minner\u001b[49m\u001b[43m(\u001b[49m\u001b[43mit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtimer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 175\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m gcold:\n", - "File \u001b[0;32m:9\u001b[0m, in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", - "File \u001b[0;32m~/Robbi/pyTMD/pyTMD/compute.py:361\u001b[0m, in \u001b[0;36mtide_elevations\u001b[0;34m(x, y, delta_time, DIRECTORY, MODEL, GZIP, DEFINITION_FILE, CROP, BOUNDS, EPSG, EPOCH, TYPE, TIME, METHOD, EXTRAPOLATE, CUTOFF, CORRECTIONS, INFER_MINOR, MINOR_CONSTITUENTS, APPEND_NODE, APPLY_FLEXURE, FILL_VALUE, **kwargs)\u001b[0m\n\u001b[1;32m 358\u001b[0m nt \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(ts)\n\u001b[1;32m 360\u001b[0m \u001b[38;5;66;03m# read tidal constants and interpolate to grid points\u001b[39;00m\n\u001b[0;32m--> 361\u001b[0m amp, ph, c \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mextract_constants\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlat\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mtype\u001b[39;49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 362\u001b[0m \u001b[43m \u001b[49m\u001b[43mcrop\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mCROP\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbounds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mBOUNDS\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mMETHOD\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 363\u001b[0m \u001b[43m \u001b[49m\u001b[43mextrapolate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mEXTRAPOLATE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcutoff\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mCUTOFF\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[43m \u001b[49m\u001b[43mappend_node\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mAPPEND_NODE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mapply_flexure\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mAPPLY_FLEXURE\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 365\u001b[0m \u001b[38;5;66;03m# calculate complex phase in radians for Euler's\u001b[39;00m\n\u001b[1;32m 366\u001b[0m cph \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39mj\u001b[38;5;241m*\u001b[39mph\u001b[38;5;241m*\u001b[39mnp\u001b[38;5;241m.\u001b[39mpi\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m180.0\u001b[39m\n", - "File \u001b[0;32m~/Robbi/pyTMD/pyTMD/io/model.py:1037\u001b[0m, in \u001b[0;36mmodel.extract_constants\u001b[0;34m(self, lon, lat, **kwargs)\u001b[0m\n\u001b[1;32m 1035\u001b[0m model_file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_file\n\u001b[1;32m 1036\u001b[0m \u001b[38;5;66;03m# extract tidal constants for model type\u001b[39;00m\n\u001b[0;32m-> 1037\u001b[0m amp,ph \u001b[38;5;241m=\u001b[39m \u001b[43mFES\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mextract_constants\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1038\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_file\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mversion\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mversion\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1039\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompressed\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompressed\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1040\u001b[0m \u001b[38;5;66;03m# available model constituents\u001b[39;00m\n\u001b[1;32m 1041\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconstituents\n", - "File \u001b[0;32m~/Robbi/pyTMD/pyTMD/io/FES.py:297\u001b[0m, in \u001b[0;36mextract_constants\u001b[0;34m(ilon, ilat, model_files, **kwargs)\u001b[0m\n\u001b[1;32m 293\u001b[0m hci\u001b[38;5;241m.\u001b[39mdata[hci\u001b[38;5;241m.\u001b[39mmask] \u001b[38;5;241m=\u001b[39m hci\u001b[38;5;241m.\u001b[39mfill_value\n\u001b[1;32m 294\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m (kwargs[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmethod\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mspline\u001b[39m\u001b[38;5;124m'\u001b[39m):\n\u001b[1;32m 295\u001b[0m \u001b[38;5;66;03m# interpolate complex form of the constituent\u001b[39;00m\n\u001b[1;32m 296\u001b[0m \u001b[38;5;66;03m# use scipy splines to interpolate values\u001b[39;00m\n\u001b[0;32m--> 297\u001b[0m hci \u001b[38;5;241m=\u001b[39m \u001b[43mpyTMD\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minterpolate\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mspline\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlat\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43milon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43milat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 298\u001b[0m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 299\u001b[0m \u001b[43m \u001b[49m\u001b[43mreducer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mceil\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 300\u001b[0m \u001b[43m \u001b[49m\u001b[43mkx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mky\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 301\u001b[0m \u001b[38;5;66;03m# replace invalid values with fill_value\u001b[39;00m\n\u001b[1;32m 302\u001b[0m hci\u001b[38;5;241m.\u001b[39mdata[hci\u001b[38;5;241m.\u001b[39mmask] \u001b[38;5;241m=\u001b[39m hci\u001b[38;5;241m.\u001b[39mfill_value\n", - "File \u001b[0;32m~/Robbi/pyTMD/pyTMD/interpolate.py:181\u001b[0m, in \u001b[0;36mspline\u001b[0;34m(ilon, ilat, idata, lon, lat, fill_value, dtype, reducer, **kwargs)\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[38;5;66;03m# construct splines for input data and mask\u001b[39;00m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m np\u001b[38;5;241m.\u001b[39miscomplexobj(idata):\n\u001b[0;32m--> 181\u001b[0m s1 \u001b[38;5;241m=\u001b[39m \u001b[43mscipy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minterpolate\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mRectBivariateSpline\u001b[49m\u001b[43m(\u001b[49m\u001b[43milon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43milat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 182\u001b[0m \u001b[43m \u001b[49m\u001b[43midata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mT\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 183\u001b[0m s2 \u001b[38;5;241m=\u001b[39m scipy\u001b[38;5;241m.\u001b[39minterpolate\u001b[38;5;241m.\u001b[39mRectBivariateSpline(ilon, ilat,\n\u001b[1;32m 184\u001b[0m idata\u001b[38;5;241m.\u001b[39mdata\u001b[38;5;241m.\u001b[39mimag\u001b[38;5;241m.\u001b[39mT, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 185\u001b[0m s3 \u001b[38;5;241m=\u001b[39m scipy\u001b[38;5;241m.\u001b[39minterpolate\u001b[38;5;241m.\u001b[39mRectBivariateSpline(ilon, ilat,\n\u001b[1;32m 186\u001b[0m idata\u001b[38;5;241m.\u001b[39mmask\u001b[38;5;241m.\u001b[39mT, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", - "File \u001b[0;32m/env/lib/python3.10/site-packages/scipy/interpolate/_fitpack2.py:1602\u001b[0m, in \u001b[0;36mRectBivariateSpline.__init__\u001b[0;34m(self, x, y, z, bbox, kx, ky, s)\u001b[0m\n\u001b[1;32m 1600\u001b[0m z \u001b[38;5;241m=\u001b[39m ravel(z)\n\u001b[1;32m 1601\u001b[0m xb, xe, yb, ye \u001b[38;5;241m=\u001b[39m bbox\n\u001b[0;32m-> 1602\u001b[0m nx, tx, ny, ty, c, fp, ier \u001b[38;5;241m=\u001b[39m \u001b[43mdfitpack\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mregrid_smth\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxb\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxe\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43myb\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1603\u001b[0m \u001b[43m \u001b[49m\u001b[43mye\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mky\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43ms\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1605\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ier \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m]:\n\u001b[1;32m 1606\u001b[0m msg \u001b[38;5;241m=\u001b[39m _surfit_messages\u001b[38;5;241m.\u001b[39mget(ier, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mier=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (ier))\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + "Interpolating model rankings using IDW interpolation \n" ] } ], "source": [ - "%%timeit -n 1 -r 1\n", - "\n", - "x=np.linspace(122.2183, 122.219, 10)\n", - "y=np.linspace(-18.0008, -18.01, 10)\n", - "time=pd.date_range(\"2020\", \"2021\", periods=10)\n", - "crs=\"EPSG:4326\"\n", - "method=\"spline\"\n", - "model=\"FES2022\"\n", - "\n", - "# Run equivalent pyTMD code to verify same results\n", - "pytmd_tides = tide_elevations(\n", - " x=x, \n", - " y=y, \n", - " delta_time=time,\n", - " DIRECTORY=\"/gdata1/data/tide_models/\",\n", - " MODEL=model,\n", - " EPSG=int(crs[-4:]),\n", - " TIME=\"datetime\",\n", - " EXTRAPOLATE=True,\n", - " CUTOFF=np.inf,\n", - " METHOD=method,\n", - " CROP=True,\n", - " # CROP=False,\n", - " # BOUNDS=bounds,\n", - " )\n", - "pytmd_tides" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pytmd_tides" + "from eo_tides.utils import idw\n", + "\n", + "idw_kwargs = {}\n", + "\n", + "# Use points to interpolate model rankings into requested x and y\n", + "id_kwargs_str = \"\" if idw_kwargs == {} else idw_kwargs\n", + "print(f\"Interpolating model rankings using IDW interpolation {id_kwargs_str}\")\n", + "ensemble_ranks_df = (\n", + " # Run IDW interpolation on subset of ranking columns\n", + " pd.DataFrame(\n", + " idw(\n", + " input_z=model_ranks_gdf[model_ranking_cols],\n", + " input_x=model_ranks_gdf.geometry.x,\n", + " input_y=model_ranks_gdf.geometry.y,\n", + " output_x=x,\n", + " output_y=y,\n", + " **idw_kwargs,\n", + " ),\n", + " columns=model_ranking_cols,\n", + " )\n", + " .assign(x=x, y=y)\n", + " # Drop any duplicates then melt columns into long format\n", + " .drop_duplicates()\n", + " .melt(id_vars=[\"x\", \"y\"], var_name=\"tide_model\", value_name=\"rank\")\n", + " # Remore \"rank_\" prefix to get plain model names\n", + " .replace({\"^rank_\": \"\"}, regex=True)\n", + " # Set index columns and rank across groups\n", + " .set_index([\"tide_model\", \"x\", \"y\"])\n", + " .groupby([\"x\", \"y\"])\n", + " .rank()\n", + ")" ] }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 40, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The line_profiler extension is already loaded. To reload it, use:\n", - " %reload_ext line_profiler\n" - ] - }, { "data": { "text/plain": [ - "Timer unit: 1 s\n", - "\n", - "Total time: 670.222 s\n", - "File: /home/jovyan/Robbi/pyTMD/pyTMD/io/FES.py\n", - "Function: extract_constants at line 134\n", - "\n", - "Line # Hits Time Per Hit % Time Line Contents\n", - "==============================================================\n", - " 134 def extract_constants(\n", - " 135 ilon: np.ndarray,\n", - " 136 ilat: np.ndarray,\n", - " 137 model_files: str | list | pathlib.Path | None = None,\n", - " 138 **kwargs\n", - " 139 ):\n", - " 140 \"\"\"\n", - " 141 Reads files for a FES ascii or netCDF4 tidal model\n", - " 142 \n", - " 143 Makes initial calculations to run the tide program\n", - " 144 \n", - " 145 Spatially interpolates tidal constituents to input coordinates\n", - " 146 \n", - " 147 Parameters\n", - " 148 ----------\n", - " 149 ilon: np.ndarray\n", - " 150 longitude to interpolate\n", - " 151 ilat: np.ndarray\n", - " 152 latitude to interpolate\n", - " 153 model_files: str, list, pathlib.Path or NoneType, default None\n", - " 154 list of model files for each constituent\n", - " 155 type: str, default 'z'\n", - " 156 Tidal variable to read\n", - " 157 \n", - " 158 - ``'z'``: heights\n", - " 159 - ``'u'``: horizontal transport velocities\n", - " 160 - ``'v'``: vertical transport velocities\n", - " 161 version: str or NoneType, default None\n", - " 162 Model version to read\n", - " 163 \n", - " 164 - ``'FES1999'``\n", - " 165 - ``'FES2004'``\n", - " 166 - ``'FES2012'``\n", - " 167 - ``'FES2014'``\n", - " 168 - ``'FES2022'``\n", - " 169 - ``'EOT20'``\n", - " 170 - ``'HAMTIDE11'``\n", - " 171 compressed: bool, default False\n", - " 172 Input files are gzip compressed\n", - " 173 crop: bool, default False\n", - " 174 Crop tide model data to (buffered) bounds\n", - " 175 bounds: list or NoneType, default None\n", - " 176 Boundaries for cropping tide model data\n", - " 177 method: str, default 'spline'\n", - " 178 Interpolation method\n", - " 179 \n", - " 180 - ``'bilinear'``: quick bilinear interpolation\n", - " 181 - ``'spline'``: scipy bivariate spline interpolation\n", - " 182 - ``'linear'``, ``'nearest'``: scipy regular grid interpolations\n", - " 183 extrapolate: bool, default False\n", - " 184 Extrapolate model using nearest-neighbors\n", - " 185 cutoff: float, default 10.0\n", - " 186 Extrapolation cutoff in kilometers\n", - " 187 \n", - " 188 Set to ``np.inf`` to extrapolate for all points\n", - " 189 scale: float, default 1.0\n", - " 190 Scaling factor for converting to output units\n", - " 191 \n", - " 192 Returns\n", - " 193 -------\n", - " 194 amplitude: np.ndarray\n", - " 195 amplitudes of tidal constituents\n", - " 196 phase: np.ndarray\n", - " 197 phases of tidal constituents\n", - " 198 \"\"\"\n", - " 199 # set default keyword arguments\n", - " 200 1 0.0 0.0 0.0 kwargs.setdefault('type', 'z')\n", - " 201 1 0.0 0.0 0.0 kwargs.setdefault('version', None)\n", - " 202 1 0.0 0.0 0.0 kwargs.setdefault('compressed', False)\n", - " 203 1 0.0 0.0 0.0 kwargs.setdefault('crop', False)\n", - " 204 1 0.0 0.0 0.0 kwargs.setdefault('method', 'spline')\n", - " 205 1 0.0 0.0 0.0 kwargs.setdefault('extrapolate', False)\n", - " 206 1 0.0 0.0 0.0 kwargs.setdefault('cutoff', 10.0)\n", - " 207 1 0.0 0.0 0.0 kwargs.setdefault('scale', 1.0)\n", - " 208 # raise warnings for deprecated keyword arguments\n", - " 209 2 0.0 0.0 0.0 deprecated_keywords = dict(TYPE='type',VERSION='version',\n", - " 210 1 0.0 0.0 0.0 METHOD='method',EXTRAPOLATE='extrapolate',CUTOFF='cutoff',\n", - " 211 1 0.0 0.0 0.0 GZIP='compressed',SCALE='scale')\n", - " 212 8 0.0 0.0 0.0 for old,new in deprecated_keywords.items():\n", - " 213 7 0.0 0.0 0.0 if old in kwargs.keys():\n", - " 214 warnings.warn(f\"\"\"Deprecated keyword argument {old}.\n", - " 215 Changed to '{new}'\"\"\", DeprecationWarning)\n", - " 216 # set renamed argument to not break workflows\n", - " 217 kwargs[new] = copy.copy(kwargs[old])\n", - " 218 \n", - " 219 # raise warning if model files are entered as a string or path\n", - " 220 1 0.0 0.0 0.0 if isinstance(model_files, (str, pathlib.Path)):\n", - " 221 warnings.warn(\"Tide model is entered as a string\")\n", - " 222 model_files = [model_files]\n", - " 223 \n", - " 224 # adjust dimensions of input coordinates to be iterable\n", - " 225 1 0.0 0.0 0.0 ilon = np.atleast_1d(np.copy(ilon))\n", - " 226 1 0.0 0.0 0.0 ilat = np.atleast_1d(np.copy(ilat))\n", - " 227 # set default bounds if cropping\n", - " 228 1 0.0 0.0 0.0 xmin, xmax = np.min(ilon), np.max(ilon)\n", - " 229 1 0.0 0.0 0.0 ymin, ymax = np.min(ilat), np.max(ilat)\n", - " 230 # kwargs.setdefault('bounds', [xmin, xmax, ymin, ymax])\n", - " 231 1 0.0 0.0 0.0 kwargs[\"bounds\"] = [xmin, xmax, ymin, ymax] if kwargs[\"bounds\"] is None else kwargs[\"bounds\"]\n", - " 232 1 0.0 0.0 0.0 if kwargs[\"crop\"]:\n", - " 233 print(f\"Cropping to bounds: {kwargs['bounds']}, {kwargs['method']} interpolation\")\n", - " 234 # number of points\n", - " 235 1 0.0 0.0 0.0 npts = len(ilon)\n", - " 236 # number of constituents\n", - " 237 1 0.0 0.0 0.0 nc = len(model_files)\n", - " 238 \n", - " 239 # amplitude and phase\n", - " 240 1 0.0 0.0 0.0 amplitude = np.ma.zeros((npts,nc))\n", - " 241 1 0.0 0.0 0.0 amplitude.mask = np.zeros((npts,nc),dtype=bool)\n", - " 242 1 0.0 0.0 0.0 ph = np.ma.zeros((npts,nc))\n", - " 243 1 0.0 0.0 0.0 ph.mask = np.zeros((npts,nc),dtype=bool)\n", - " 244 # read and interpolate each constituent\n", - " 245 35 0.0 0.0 0.0 for i, model_file in enumerate(model_files):\n", - " 246 # check that model file is accessible\n", - " 247 34 0.0 0.0 0.0 model_file = pathlib.Path(model_file).expanduser()\n", - " 248 34 0.2 0.0 0.0 if not model_file.exists():\n", - " 249 raise FileNotFoundError(str(model_file))\n", - " 250 # read constituent from elevation file\n", - " 251 34 0.0 0.0 0.0 if kwargs['version'] in _ascii_versions:\n", - " 252 # FES ascii constituent files\n", - " 253 hc, lon, lat = read_ascii_file(model_file, **kwargs)\n", - " 254 34 0.0 0.0 0.0 elif kwargs['version'] in _netcdf_versions:\n", - " 255 # FES netCDF4 constituent files\n", - " 256 34 306.7 9.0 45.8 hc, lon, lat = read_netcdf_file(model_file, **kwargs)\n", - " 257 # grid step size of tide model\n", - " 258 34 0.0 0.0 0.0 dlon = lon[1] - lon[0]\n", - " 259 # crop tide model data to (buffered) bounds\n", - " 260 # or adjust longitudinal convention to fit tide model\n", - " 261 34 0.0 0.0 0.0 if kwargs['crop'] and np.any(kwargs['bounds']):\n", - " 262 hc, lon, lat = _crop(hc, lon, lat,\n", - " 263 bounds=kwargs['bounds'],\n", - " 264 buffer=4*dlon\n", - " 265 )\n", - " 266 34 0.0 0.0 0.0 elif (np.min(ilon) < 0.0) & (np.max(lon) > 180.0):\n", - " 267 # input points convention (-180:180)\n", - " 268 # tide model convention (0:360)\n", - " 269 ilon[ilon<0.0] += 360.0\n", - " 270 34 0.0 0.0 0.0 elif (np.max(ilon) > 180.0) & (np.min(lon) < 0.0):\n", - " 271 # input points convention (0:360)\n", - " 272 # tide model convention (-180:180)\n", - " 273 ilon[ilon>180.0] -= 360.0\n", - " 274 \n", - " 275 # replace original values with extend arrays/matrices\n", - " 276 34 0.0 0.0 0.0 if np.isclose(lon[-1] - lon[0], 360.0 - dlon):\n", - " 277 lon = _extend_array(lon, dlon)\n", - " 278 hc = _extend_matrix(hc)\n", - " 279 # determine if any input points are outside of the model bounds\n", - " 280 102 0.0 0.0 0.0 invalid = (ilon < lon.min()) | (ilon > lon.max()) | \\\n", - " 281 68 0.0 0.0 0.0 (ilat < lat.min()) | (ilat > lat.max())\n", - " 282 \n", - " 283 # interpolate amplitude and phase of the constituent\n", - " 284 34 0.0 0.0 0.0 if (kwargs['method'] == 'bilinear'):\n", - " 285 # replace invalid values with nan\n", - " 286 hc.data[hc.mask] = np.nan\n", - " 287 # use quick bilinear to interpolate values\n", - " 288 hci = pyTMD.interpolate.bilinear(lon, lat, hc, ilon, ilat,\n", - " 289 dtype=hc.dtype)\n", - " 290 # replace nan values with fill_value\n", - " 291 hci.mask[:] |= np.isnan(hci.data)\n", - " 292 hci.data[hci.mask] = hci.fill_value\n", - " 293 34 0.0 0.0 0.0 elif (kwargs['method'] == 'spline'):\n", - " 294 # interpolate complex form of the constituent\n", - " 295 # use scipy splines to interpolate values\n", - " 296 68 363.3 5.3 54.2 hci = pyTMD.interpolate.spline(lon, lat, hc, ilon, ilat,\n", - " 297 34 0.0 0.0 0.0 dtype=hc.dtype,\n", - " 298 34 0.0 0.0 0.0 reducer=np.ceil,\n", - " 299 34 0.0 0.0 0.0 kx=1, ky=1)\n", - " 300 # replace invalid values with fill_value\n", - " 301 34 0.0 0.0 0.0 hci.data[hci.mask] = hci.fill_value\n", - " 302 else:\n", - " 303 # interpolate complex form of the constituent\n", - " 304 # use scipy regular grid to interpolate values\n", - " 305 hci = pyTMD.interpolate.regulargrid(lon, lat, hc, ilon, ilat,\n", - " 306 dtype=hc.dtype,\n", - " 307 method=kwargs['method'],\n", - " 308 reducer=np.ceil,\n", - " 309 bounds_error=False)\n", - " 310 # replace invalid values with fill_value\n", - " 311 hci.mask[:] |= (hci.data == hci.fill_value)\n", - " 312 hci.data[hci.mask] = hci.fill_value\n", - " 313 # extrapolate data using nearest-neighbors\n", - " 314 34 0.0 0.0 0.0 if kwargs['extrapolate'] and np.any(hci.mask):\n", - " 315 # find invalid data points\n", - " 316 inv, = np.nonzero(hci.mask)\n", - " 317 # replace invalid values with nan\n", - " 318 hc.data[hc.mask] = np.nan\n", - " 319 # extrapolate points within cutoff of valid model points\n", - " 320 hci[inv] = pyTMD.interpolate.extrapolate(lon, lat, hc,\n", - " 321 ilon[inv], ilat[inv], dtype=hc.dtype,\n", - " 322 cutoff=kwargs['cutoff'])\n", - " 323 # convert amplitude from input units to meters\n", - " 324 34 0.0 0.0 0.0 amplitude.data[:,i] = np.abs(hci.data)*kwargs['scale']\n", - " 325 34 0.0 0.0 0.0 amplitude.mask[:,i] = np.copy(hci.mask)\n", - " 326 # phase of the constituent in radians\n", - " 327 34 0.0 0.0 0.0 ph.data[:,i] = np.arctan2(-np.imag(hci.data),np.real(hci.data))\n", - " 328 34 0.0 0.0 0.0 ph.mask[:,i] = np.copy(hci.mask)\n", - " 329 # update mask to invalidate points outside model domain\n", - " 330 34 0.0 0.0 0.0 amplitude.mask[:,i] |= invalid\n", - " 331 34 0.0 0.0 0.0 ph.mask[:,i] |= invalid\n", - " 332 \n", - " 333 # convert phase to degrees\n", - " 334 1 0.0 0.0 0.0 phase = ph*180.0/np.pi\n", - " 335 1 0.0 0.0 0.0 phase.data[phase.data < 0] += 360.0\n", - " 336 # replace data for invalid mask values\n", - " 337 1 0.0 0.0 0.0 amplitude.data[amplitude.mask] = amplitude.fill_value\n", - " 338 1 0.0 0.0 0.0 phase.data[phase.mask] = phase.fill_value\n", - " 339 # return the interpolated values\n", - " 340 1 0.0 0.0 0.0 return (amplitude, phase)" + "rank_EOT20 0\n", + "rank_HAMTIDE11 87\n", + "dtype: int64" ] }, + "execution_count": 40, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "%load_ext line_profiler\n", - "\n", - "from pyTMD.io.model import model\n", - "from pyTMD.io import FES\n", - "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"spline\", CROP=False)" + "model_ranks_gdf[model_ranking_cols].isnull()" ] }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 38, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The line_profiler extension is already loaded. To reload it, use:\n", - " %reload_ext line_profiler\n" - ] - }, { "data": { - "text/plain": [ - "Timer unit: 1 s\n", + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rank
tide_modelxy
EOT20123.34060-17.161101.0
123.59414-17.585492.0
HAMTIDE11123.34060-17.161102.0
123.59414-17.585491.0
\n", + "
" + ], + "text/plain": [ + " rank\n", + "tide_model x y \n", + "EOT20 123.34060 -17.16110 1.0\n", + " 123.59414 -17.58549 2.0\n", + "HAMTIDE11 123.34060 -17.16110 2.0\n", + " 123.59414 -17.58549 1.0" ] }, + "execution_count": 38, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "%load_ext line_profiler\n", + "ensemble_ranks_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from eo_tides.model import model_tides\n", "\n", - "from pyTMD.io.model import model\n", - "from pyTMD.io import FES\n", - "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"linear\", CROP=False)" + "df = model_tides(x= 123.73412090186251, \n", + " y=-16.997767837915056, \n", + " model=\"ensemble\",\n", + " time=pd.date_range(start=\"2000\", end=\"2001\", freq=\"5h\"),\n", + " ranking_points=\"/home/jovyan/Robbi/dea-intertidal/data/raw/tide_correlation_points_test.geojson\",\n", + " k=5,\n", + " output_format=\"wide\",\n", + " directory=\"/var/share/tide_models/\")\n", + "\n", + "with pd.option_context('display.max_rows', 5, 'display.max_columns', None): \n", + " display(df)\n", + "\n", + "# u, c = np.unique(a, return_counts=True)" ] }, { @@ -1230,11 +906,41 @@ "metadata": {}, "outputs": [], "source": [ - "%load_ext line_profiler\n", + "from eo_tides.model import model_tides\n", "\n", - "from pyTMD.io.model import model\n", - "from pyTMD.io import FES\n", - "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"spline\", CROP=True, BOUNDS=[121.218, 123.218, -19.000, -17.000])" + "df = model_tides(\n", + " x=145.372051,\n", + " y=-38.260667,\n", + " model=[\n", + " \"EOT20\",\n", + " \"FES2012\",\n", + " \"FES2014_extrapolated\",\n", + " \"FES2022_extrapolated\",\n", + " \"HAMTIDE11\",\n", + " \"GOT4.10\",\n", + " \"GOT5.6_extrapolated\",\n", + " \"TPXO10-atlas-v2-nc\",\n", + " \"TPXO8-atlas-nc\",\n", + " \"TPXO9-atlas-v5-nc\",\n", + " \"ensemble\",\n", + " ],\n", + " time=pd.date_range(start=\"2018-01-01\", end=\"2020-12-31\", freq=\"1h\"),\n", + " output_format=\"wide\",\n", + " directory=\"/var/share/tide_models/\",\n", + " ensemble_models=[\n", + " \"EOT20\",\n", + " \"FES2012\",\n", + " \"FES2014_extrapolated\",\n", + " \"FES2022_extrapolated\",\n", + " # \"HAMTIDE11\",\n", + " # \"GOT4.10\",\n", + " \"GOT5.6_extrapolated\",\n", + " \"TPXO10-atlas-v2-nc\",\n", + " # \"TPXO8-atlas-nc\",\n", + " \"TPXO9-atlas-v5-nc\",\n", + " ]\n", + ")\n", + "df" ] }, { @@ -1242,7 +948,12 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "import matplotlib.pyplot as plt\n", + "df.droplevel([\"x\", \"y\"]).head(50).drop(\"ensemble\", axis=1).plot(linewidth=0.8, figsize=(10, 6))\n", + "df.droplevel([\"x\", \"y\"]).head(50).ensemble.plot(linewidth=3, c=\"black\")\n", + "plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)" + ] }, { "cell_type": "code", @@ -1250,103 +961,193 @@ "metadata": {}, "outputs": [], "source": [ + "import matplotlib.pyplot as plt\n", + "df.droplevel([\"x\", \"y\"]).head(50).drop(\"ensemble\", axis=1).plot(linewidth=0.8, figsize=(10, 6))\n", + "df.droplevel([\"x\", \"y\"]).head(50).ensemble.plot(linewidth=3, c=\"black\")\n", + "plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## `_standardise_models`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from eo_tides.utils import _set_directory, list_models\n", "\n", + "directory = \"/home/jovyan/Robbi/eo-tides/tests/data/tide_models/\"\n", + "directory = _set_directory(directory)\n", "\n", - "from __future__ import print_function, annotations\n", - "\n", - "import logging\n", - "import pathlib\n", - "import numpy as np\n", - "from io import IOBase\n", - "import scipy.interpolate\n", - "import pyTMD.crs\n", - "import pyTMD.io\n", - "import pyTMD.io.model\n", - "import pyTMD.predict\n", - "import pyTMD.spatial\n", - "import pyTMD.utilities\n", - "import timescale.eop\n", - "import timescale.time\n", - "# attempt imports\n", - "pyproj = pyTMD.utilities.import_dependency('pyproj')\n", "\n", + "# def _standardise_models(model, directory, ensemble_models=None):\n", "\n", - "x, y, crs, method, model = -1034913, -1961916, \"EPSG:3577\", \"bilinear\", \"EOT20\"\n", + "# # Turn inputs into arrays for consistent handling\n", + "# models_requested = list(np.atleast_1d(model))\n", "\n", - "x=x\n", - "y=y\n", - "delta_time=measured_tides_ds.time\n", - "DIRECTORY=\"/var/share/tide_models/\"\n", - "MODEL=model\n", - "EPSG=int(crs[-4:])\n", - "TIME=\"datetime\"\n", - "EXTRAPOLATE=True\n", - "CUTOFF=np.inf\n", - "CROP=True\n", - "METHOD=method\n", + "# # Get full list of supported models from pyTMD database\n", + "# available_models, valid_models = list_models(\n", + "# directory, show_available=False, show_supported=False, raise_error=True\n", + "# )\n", + "# custom_options = [\"ensemble\", \"all\"]\n", "\n", - "GZIP=False\n", - "DEFINITION_FILE=None\n", - "BOUNDS=None\n", - "EPOCH=(2000, 1, 1, 0, 0, 0)\n", - "TYPE='drift'\n", - "CORRECTIONS = None\n", - "INFER_MINOR = True\n", - "MINOR_CONSTITUENTS = None\n", - "APPEND_NODE = False\n", - "APPLY_FLEXURE= False\n", - "FILL_VALUE=np.nan\n", + "# # Error if any models are not supported\n", + "# if not all(m in valid_models + custom_options for m in models_requested):\n", + "# error_text = (\n", + "# f\"One or more of the requested models are not valid:\\n\"\n", + "# f\"{models_requested}\\n\\n\"\n", + "# \"The following models are supported:\\n\"\n", + "# f\"{valid_models}\"\n", + "# )\n", + "# raise ValueError(error_text)\n", "\n", + "# # Error if any models are not available in `directory`\n", + "# if not all(m in available_models + custom_options for m in models_requested):\n", + "# error_text = (\n", + "# f\"One or more of the requested models are valid, but not available in `{directory}`:\\n\"\n", + "# f\"{models_requested}\\n\\n\"\n", + "# f\"The following models are available in `{directory}`:\\n\"\n", + "# f\"{available_models}\"\n", + "# )\n", + "# raise ValueError(error_text)\n", "\n", + "# # If \"all\" models are requested, update requested list to include available models\n", + "# if \"all\" in models_requested:\n", + "# models_requested = available_models + [\n", + "# m for m in models_requested if m != \"all\"\n", + "# ]\n", "\n", - "# check that tide directory is accessible\n", - "if DIRECTORY is not None:\n", - " DIRECTORY = pathlib.Path(DIRECTORY).expanduser()\n", - " if not DIRECTORY.exists():\n", - " raise FileNotFoundError(\"Invalid tide directory\")\n", + "# # If \"ensemble\" modeling is requested, use custom list of ensemble models\n", + "# if \"ensemble\" in models_requested:\n", + "# print(\"Running ensemble tide modelling\")\n", + "# ensemble_models = (\n", + "# ensemble_models\n", + "# if ensemble_models is not None\n", + "# else [\n", + "# \"FES2014\",\n", + "# \"TPXO9-atlas-v5\",\n", + "# \"EOT20\",\n", + "# \"HAMTIDE11\",\n", + "# \"GOT4.10\",\n", + "# \"FES2012\",\n", + "# \"TPXO8-atlas-v1\",\n", + "# ]\n", + "# )\n", "\n", - "# validate input arguments\n", - "assert TIME.lower() in ('gps', 'loran', 'tai', 'utc', 'datetime')\n", - "assert METHOD.lower() in ('bilinear', 'spline', 'linear', 'nearest')\n", + "# # Error if any ensemble models are not available in `directory`\n", + "# if not all(m in available_models for m in ensemble_models):\n", + "# error_text = (\n", + "# f\"One or more of the requested ensemble models are not available in `{directory}`:\\n\"\n", + "# f\"{ensemble_models}\\n\\n\"\n", + "# f\"The following models are available in `{directory}`:\\n\"\n", + "# f\"{available_models}\"\n", + "# )\n", + "# raise ValueError(error_text)\n", "\n", - "# get parameters for tide model\n", - "if DEFINITION_FILE is not None:\n", - " model = pyTMD.io.model(DIRECTORY).from_file(DEFINITION_FILE)\n", - "else:\n", - " model = pyTMD.io.model(DIRECTORY, compressed=GZIP).elevation(MODEL)\n", + "# # Return set of all ensemble plus any other requested models\n", + "# models_to_process = ensemble_models + [\n", + "# m for m in models_requested if m != \"ensemble\"\n", + "# ]\n", "\n", - "# determine input data type based on variable dimensions\n", - "if not TYPE:\n", - " TYPE = pyTMD.spatial.data_type(x, y, delta_time)\n", - "assert TYPE.lower() in ('grid', 'drift', 'time series')\n", - "# reform coordinate dimensions for input grids\n", - "# or verify coordinate dimension shapes\n", - "if (TYPE.lower() == 'grid') and (np.size(x) != np.size(y)):\n", - " x,y = np.meshgrid(np.copy(x),np.copy(y))\n", - "elif (TYPE.lower() == 'grid'):\n", - " x = np.atleast_2d(x)\n", - " y = np.atleast_2d(y)\n", - "elif TYPE.lower() in ('time series', 'drift'):\n", - " x = np.atleast_1d(x)\n", - " y = np.atleast_1d(y)\n", + "# # Otherwise, models to process are the same as those requested\n", + "# else:\n", + "# models_to_process = models_requested\n", "\n", - "# converting x,y from EPSG to latitude/longitude\n", - "crs1 = pyTMD.crs().from_input(EPSG)\n", - "crs2 = pyproj.CRS.from_epsg(4326)\n", - "transformer = pyproj.Transformer.from_crs(crs1, crs2, always_xy=True)\n", - "lon, lat = transformer.transform(x.flatten(), y.flatten())\n", + "# # Remove duplicates\n", + "# models_to_process = list(set(models_to_process))\n", + "# models_requested = list(set(models_requested))\n", "\n", - "# verify that delta time is an array\n", - "delta_time = np.atleast_1d(delta_time)\n", - "# convert delta times or datetimes objects to timescale\n", - "if (TIME.lower() == 'datetime'):\n", - " ts = timescale.time.Timescale().from_datetime(\n", - " delta_time.flatten())\n", - "else:\n", - " ts = timescale.time.Timescale().from_deltatime(delta_time,\n", - " epoch=EPOCH, standard=TIME)\n", - "# number of time points\n", - "nt = len(ts)\n" + "# return models_to_process, models_requested, ensemble_models\n", + "\n", + "\n", + "# model = \"EOT20\"\n", + "# # model = [\"EOT20\", \"HAMTIDE11\"] # = [\"EOT20\", \"FES2014\"]\n", + "# # model = \"all\" # = [list all available]\n", + "# # model = \"ensemble\" # = [list all ensemble]\n", + "# # model = [\"ensemble\", \"GOT5.5\"] # = [list all ensemble]\n", + "# # model = [\"all\", \"ensemble\"]\n", + "\n", + "\n", + "from eo_tides.utils import _standardise_models\n", + "\n", + "\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " [\"EOT20\"],\n", + " None,\n", + " [\"EOT20\"],\n", + " [\"EOT20\"],\n", + " None,\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " \"EOT20\",\n", + " None,\n", + " [\"EOT20\"],\n", + " [\"EOT20\"],\n", + " None,\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " \"all\",\n", + " None,\n", + " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", + " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", + " None,\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " [\"all\"],\n", + " None,\n", + " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", + " [\"GOT5.5\", \"HAMTIDE11\", \"EOT20\"],\n", + " None,\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " \"ensemble\",\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + " [\"HAMTIDE11\", \"EOT20\"],\n", + " [\"ensemble\"],\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " [\"ensemble\"],\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + " [\"HAMTIDE11\", \"EOT20\"],\n", + " [\"ensemble\"],\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + ")\n", + "model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + " [\"ensemble\", \"GOT5.5\"],\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + " [\"EOT20\", \"GOT5.5\", \"HAMTIDE11\"],\n", + " [\"GOT5.5\", \"ensemble\"],\n", + " [\"EOT20\", \"HAMTIDE11\"],\n", + ")\n", + "# model, ensemble_models, exp_process, exp_request, exp_ensemble = (\n", + "# [\"all\", \"ensemble\"],\n", + "# [\"EOT20\", \"HAMTIDE11\"],\n", + "# [\"EOT20\", \"GOT5.5\", \"HAMTIDE11\"],\n", + "# [\"GOT5.5\", \"HAMTIDE11\", \"ensemble\", \"EOT20\"],\n", + "# [\"EOT20\", \"HAMTIDE11\"],\n", + "# )\n", + "\n", + "\n", + "models_to_process, models_requested, ensemble_models = _standardise_models(\n", + " model=model,\n", + " directory=directory,\n", + " ensemble_models=ensemble_models,\n", + ")\n", + "\n", + "print(\"Models to process: \", models_to_process)\n", + "print(\"Models requested: \", models_requested)\n", + "print(\"Ensemble models: \", ensemble_models)\n", + "\n", + "assert models_to_process == exp_process\n", + "assert models_requested == exp_request\n", + "assert ensemble_models == exp_ensemble" ] }, { @@ -1355,11 +1156,7 @@ "metadata": {}, "outputs": [], "source": [ - "# read tidal constants and interpolate to grid points\n", - "amp, ph, c = model.extract_constants(lon, lat, type=model.type,\n", - " crop=CROP, bounds=BOUNDS, method=METHOD,\n", - " extrapolate=EXTRAPOLATE, cutoff=CUTOFF,\n", - " append_node=APPEND_NODE, apply_flexure=APPLY_FLEXURE)" + "models_requested" ] }, { @@ -1368,7 +1165,7 @@ "metadata": {}, "outputs": [], "source": [ - "amp" + "list(set(models_requested + ensemble_models))" ] }, { @@ -1377,7 +1174,9 @@ "metadata": {}, "outputs": [], "source": [ - "ph" + "ensemble_models\n", + "\n", + "models_requested" ] }, { @@ -1385,18 +1184,17 @@ "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "# adjust dimensions of input coordinates to be iterable\n", - "ilon = np.atleast_1d(np.copy(lon))\n", - "ilat = np.atleast_1d(np.copy(lat))\n", - "# set default bounds if cropping\n", - "xmin, xmax = np.min(ilon), np.max(ilon)\n", - "ymin, ymax = np.min(ilat), np.max(ilat)\n", - "bounds=[xmin-1, xmax+1, ymin-1, ymax+1]\n", - "\n", + "## Investigate interpolation functions\n", "\n", - "# read tidal constants and interpolate to grid points\n", - "c = model.read_constants(crop=True)" + "crop=True, bounds=None: \n", + "crop=False, bounds=None:\n", + "crop=True, bounds=" ] }, { @@ -1405,8 +1203,32 @@ "metadata": {}, "outputs": [], "source": [ - "c = model.read_constants(crop=False, bounds=bounds)\n", - "plt.imshow(c.m2.mask)" + "%%timeit -n 1 -r 1\n", + "\n", + "x=np.linspace(122.2183, 122.219, 10)\n", + "y=np.linspace(-18.0008, -18.01, 10)\n", + "time=pd.date_range(\"2020\", \"2021\", periods=10)\n", + "crs=\"EPSG:4326\"\n", + "method=\"spline\"\n", + "model=\"FES2022\"\n", + "\n", + "# Run equivalent pyTMD code to verify same results\n", + "pytmd_tides = tide_elevations(\n", + " x=x, \n", + " y=y, \n", + " delta_time=time,\n", + " DIRECTORY=\"/gdata1/data/tide_models/\",\n", + " MODEL=model,\n", + " EPSG=int(crs[-4:]),\n", + " TIME=\"datetime\",\n", + " EXTRAPOLATE=True,\n", + " CUTOFF=np.inf,\n", + " METHOD=method,\n", + " CROP=True,\n", + " # CROP=False,\n", + " # BOUNDS=bounds,\n", + " )\n", + "pytmd_tides" ] }, { @@ -1415,8 +1237,7 @@ "metadata": {}, "outputs": [], "source": [ - "c = model.read_constants(crop=True, bounds=bounds)\n", - "plt.imshow(c.m2.mask)" + "pytmd_tides" ] }, { @@ -1425,7 +1246,11 @@ "metadata": {}, "outputs": [], "source": [ - "plt.imshow(c.m2.astype(\"float32\"))" + "%load_ext line_profiler\n", + "\n", + "from pyTMD.io.model import model\n", + "from pyTMD.io import FES\n", + "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"spline\", CROP=False)" ] }, { @@ -1434,7 +1259,11 @@ "metadata": {}, "outputs": [], "source": [ - "c.m2" + "%load_ext line_profiler\n", + "\n", + "from pyTMD.io.model import model\n", + "from pyTMD.io import FES\n", + "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"linear\", CROP=False)" ] }, { @@ -1443,5230 +1272,343 @@ "metadata": {}, "outputs": [], "source": [ - "# calculate complex phase in radians for Euler's\n", - "cph = -1j*ph*np.pi/180.0\n", - "# calculate constituent oscillation\n", - "hc = amp*np.exp(cph)" + "%load_ext line_profiler\n", + "\n", + "from pyTMD.io.model import model\n", + "from pyTMD.io import FES\n", + "%lprun -u 1 -f FES.extract_constants tide_elevations(x=np.linspace(122.2183, 122.219, 2), y=np.linspace(-18.0008, -18.01, 2), delta_time=pd.date_range(\"2020\", \"2021\", periods=2), DIRECTORY=\"/gdata1/data/tide_models/\", MODEL=\"FES2022\", EPSG=4326, TIME=\"datetime\", EXTRAPOLATE=True, CUTOFF=np.inf, METHOD=\"spline\", CROP=True, BOUNDS=[121.218, 123.218, -19.000, -17.000])" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, - "source": [ - "## Compare timings" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", - "execution_count": 126, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modelling tides using FES2014\n", - "Modelling tides using FES2014\n", - "Spline method time: 456.673351 seconds\n", - "Linear method time: 332.520261 seconds\n" - ] - } - ], + "outputs": [], "source": [ - "import time\n", "\n", - "from eo_tides.model import model_tides\n", + "\n", + "from __future__ import print_function, annotations\n", + "\n", + "import logging\n", + "import pathlib\n", "import numpy as np\n", - "import pandas as pd\n", + "from io import IOBase\n", + "import scipy.interpolate\n", + "import pyTMD.crs\n", + "import pyTMD.io\n", + "import pyTMD.io.model\n", + "import pyTMD.predict\n", + "import pyTMD.spatial\n", + "import pyTMD.utilities\n", + "import timescale.eop\n", + "import timescale.time\n", + "# attempt imports\n", + "pyproj = pyTMD.utilities.import_dependency('pyproj')\n", "\n", - "# Generate random data within input bounds\n", - "n = 2000\n", - "x = np.random.uniform(112.715430, 154.727149, n)\n", - "y = np.random.uniform(-44.199061, -10.035282, n)\n", - "times = pd.date_range(\"2020\", \"2021\", periods=100)\n", - "model = \"FES2014\"\n", - "# directory = \"/var/share/tide_models/\"\n", - "directory = \"/gdata1/data/tide_models/\"\n", "\n", - "# Time the spline method\n", - "start_time = time.time()\n", - "modelled_tides_df_spline = model_tides(\n", - " x=x,\n", - " y=y,\n", - " time=times,\n", - " model=model,\n", - " method=\"spline\",\n", - " directory=directory,\n", - " parallel=False,\n", - " crop=False, \n", - ")\n", - "spline_time = time.time() - start_time\n", + "x, y, crs, method, model = -1034913, -1961916, \"EPSG:3577\", \"bilinear\", \"EOT20\"\n", "\n", - "# Time the linear method \n", - "start_time = time.time()\n", - "modelled_tides_df_linear = model_tides(\n", - " x=x,\n", - " y=y,\n", - " time=times,\n", - " model=model,\n", - " method=\"linear\",\n", - " directory=directory,\n", - " parallel=False,\n", - " crop=False,\n", - ")\n", - "linear_time = time.time() - start_time\n", + "x=x\n", + "y=y\n", + "delta_time=measured_tides_ds.time\n", + "DIRECTORY=\"/var/share/tide_models/\"\n", + "MODEL=model\n", + "EPSG=int(crs[-4:])\n", + "TIME=\"datetime\"\n", + "EXTRAPOLATE=True\n", + "CUTOFF=np.inf\n", + "CROP=True\n", + "METHOD=method\n", "\n", - "print(f\"Spline method time: {spline_time:.6f} seconds\")\n", - "print(f\"Linear method time: {linear_time:.6f} seconds\")" - ] - }, - { - "cell_type": "code", - "execution_count": 128, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modelling tides using FES2014\n", - "Cropping to bounds: [112.71844319378742, 154.71220797815425, -44.17936876485997, -10.053536747347778], linear interpolation\n", - "Linear method time: 73.067080 seconds\n" - ] - } - ], - "source": [ - "import time\n", + "GZIP=False\n", + "DEFINITION_FILE=None\n", + "BOUNDS=None\n", + "EPOCH=(2000, 1, 1, 0, 0, 0)\n", + "TYPE='drift'\n", + "CORRECTIONS = None\n", + "INFER_MINOR = True\n", + "MINOR_CONSTITUENTS = None\n", + "APPEND_NODE = False\n", + "APPLY_FLEXURE= False\n", + "FILL_VALUE=np.nan\n", "\n", - "from eo_tides.model import model_tides\n", - "import numpy as np\n", - "import pandas as pd\n", "\n", - "# Generate random data within input bounds\n", - "n = 2000\n", - "x = np.random.uniform(112.715430, 154.727149, n)\n", - "y = np.random.uniform(-44.199061, -10.035282, n)\n", - "times = pd.date_range(\"2020\", \"2021\", periods=100)\n", - "model = \"FES2014\"\n", - "# directory = \"/var/share/tide_models/\"\n", - "directory = \"/gdata1/data/tide_models/\"\n", "\n", - "# # Time the spline method\n", - "# start_time = time.time()\n", - "# modelled_tides_df_spline = model_tides(\n", - "# x=x,\n", - "# y=y,\n", - "# time=times,\n", - "# model=model,\n", - "# method=\"spline\",\n", - "# directory=directory,\n", - "# parallel=False,\n", - "# crop=True, \n", - "# )\n", - "# spline_time = time.time() - start_time\n", + "# check that tide directory is accessible\n", + "if DIRECTORY is not None:\n", + " DIRECTORY = pathlib.Path(DIRECTORY).expanduser()\n", + " if not DIRECTORY.exists():\n", + " raise FileNotFoundError(\"Invalid tide directory\")\n", "\n", - "# Time the linear method \n", - "start_time = time.time()\n", - "modelled_tides_df_linear = model_tides(\n", - " x=x,\n", - " y=y,\n", - " time=times,\n", - " model=model,\n", - " method=\"linear\",\n", - " directory=directory,\n", - " parallel=False,\n", - " crop=True,\n", - ")\n", - "linear_time = time.time() - start_time\n", + "# validate input arguments\n", + "assert TIME.lower() in ('gps', 'loran', 'tai', 'utc', 'datetime')\n", + "assert METHOD.lower() in ('bilinear', 'spline', 'linear', 'nearest')\n", "\n", - "# print(f\"Spline method time: {spline_time:.6f} seconds\")\n", - "print(f\"Linear method time: {linear_time:.6f} seconds\")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.46s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 2, 'time': 3.243055582046509, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:03<00:00, 1.02it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 4.2193474769592285, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:05<00:00, 1.01it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 6.260916709899902, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:07<00:00, 1.06it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 7.84906792640686, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:09<00:00, 1.09it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 9.473124742507935, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:10<00:00, 1.12it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 10.993525981903076, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:14<00:00, 1.13it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 14.431707620620728, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:17<00:00, 1.18it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 17.341492891311646, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:20<00:00, 1.19it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 20.59138798713684, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:26<00:00, 1.21it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 26.767624378204346, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:32<00:00, 1.23it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 32.733094453811646, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:03<00:00, 1.50s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 4, 'time': 3.549738883972168, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:02<00:00, 1.38it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 3.3015990257263184, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:03<00:00, 1.83it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 3.663120746612549, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:04<00:00, 1.74it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 4.980994939804077, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:05<00:00, 1.84it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 5.800908088684082, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:06<00:00, 1.91it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 6.713530778884888, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:07<00:00, 2.03it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 8.271213054656982, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:09<00:00, 2.08it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 9.997656106948853, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:11<00:00, 2.11it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 11.794151782989502, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:14<00:00, 2.26it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 14.622455596923828, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:17<00:00, 2.30it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 17.984022617340088, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 8, 'time': 3.5839710235595703, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:02<00:00, 1.35it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 3.5672194957733154, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:03<00:00, 1.86it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 3.840934991836548, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:03<00:00, 2.31it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 4.094923257827759, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:03<00:00, 2.95it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 4.031742811203003, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:03<00:00, 3.26it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 4.320927381515503, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:05<00:00, 3.12it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 5.7838099002838135, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:06<00:00, 3.31it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 6.58468770980835, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:07<00:00, 3.34it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 7.838033676147461, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:08<00:00, 3.56it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 9.692872762680054, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:11<00:00, 3.47it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 12.213189601898193, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:03<00:00, 1.52s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 16, 'time': 3.9789793491363525, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:03<00:00, 1.30it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 4.004520654678345, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:03<00:00, 1.94it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 4.018305540084839, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:03<00:00, 2.34it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 4.409335613250732, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:03<00:00, 2.73it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 4.634673595428467, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:03<00:00, 3.29it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 4.6058759689331055, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:04<00:00, 3.45it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 5.617724895477295, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:04<00:00, 4.11it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 5.889828681945801, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:04<00:00, 5.55it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 5.353975772857666, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:06<00:00, 4.85it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 7.742544412612915, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:07<00:00, 5.10it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 8.698545694351196, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.39s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 2, 'time': 5.165438652038574, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:05<00:00, 1.50s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 6.393255233764648, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:08<00:00, 1.41s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 8.881940841674805, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:09<00:00, 1.20s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 9.976561784744263, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:11<00:00, 1.18s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 12.158897638320923, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:12<00:00, 1.08s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 13.381953477859497, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:16<00:00, 1.04s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 17.228297233581543, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:20<00:00, 1.01s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 20.583512783050537, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:24<00:00, 1.00s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 24.490197896957397, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:30<00:00, 1.04it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 31.263490915298462, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:37<00:00, 1.06it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 38.26747488975525, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.36s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 4, 'time': 5.357771873474121, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.03s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 4.622193813323975, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:05<00:00, 1.13it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 5.817925214767456, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:05<00:00, 1.44it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 6.040789842605591, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:06<00:00, 1.44it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 7.42947244644165, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:07<00:00, 1.55it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 8.228006601333618, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:09<00:00, 1.71it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 9.86604380607605, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:11<00:00, 1.69it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 12.331735134124756, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:13<00:00, 1.79it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 13.996634244918823, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:16<00:00, 1.94it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 17.055161952972412, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:20<00:00, 1.95it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 21.018187522888184, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.41s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 8, 'time': 5.499439001083374, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.09s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 4.996423244476318, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:04<00:00, 1.43it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 5.037170171737671, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:04<00:00, 1.80it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 5.146196603775024, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:04<00:00, 2.01it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 5.687551021575928, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:05<00:00, 2.28it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 5.957857608795166, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:06<00:00, 2.53it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 7.025585412979126, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:07<00:00, 2.70it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 8.076916694641113, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:08<00:00, 2.82it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 9.199008703231812, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:09<00:00, 3.25it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 10.505664825439453, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:11<00:00, 3.34it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 12.669795036315918, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.41s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 16, 'time': 5.831315517425537, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.04s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 5.128083944320679, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:04<00:00, 1.42it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 5.169249057769775, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:04<00:00, 1.76it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 5.4696550369262695, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:04<00:00, 2.01it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 5.932654619216919, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:05<00:00, 2.36it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 6.110931158065796, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:05<00:00, 2.85it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 6.56880259513855, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:06<00:00, 3.20it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 7.181562423706055, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:05<00:00, 4.03it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 6.9272284507751465, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:07<00:00, 4.45it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 8.17851209640503, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:08<00:00, 4.60it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 9.803722143173218, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:22<00:00, 11.21s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 2, 'time': 22.900603532791138, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:23<00:00, 5.94s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 24.26825761795044, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:26<00:00, 4.39s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 26.869187116622925, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:27<00:00, 3.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 28.539355039596558, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:30<00:00, 3.04s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 30.889484643936157, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:32<00:00, 2.72s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 33.13550090789795, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:35<00:00, 2.21s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 35.95601677894592, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:38<00:00, 1.93s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 39.1878080368042, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:42<00:00, 1.75s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 42.74210977554321, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:47<00:00, 1.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 48.30967473983765, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:55<00:00, 1.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 55.995895862579346, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:22<00:00, 11.23s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 4, 'time': 23.05580997467041, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:13<00:00, 3.36s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 14.143684387207031, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:17<00:00, 2.97s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 18.470566987991333, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:15<00:00, 1.93s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 16.05748462677002, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:18<00:00, 1.87s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 19.352588176727295, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:18<00:00, 1.52s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 18.946587800979614, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:19<00:00, 1.24s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 20.531039714813232, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:22<00:00, 1.11s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 22.82627844810486, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:23<00:00, 1.04it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 23.852038383483887, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:26<00:00, 1.21it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 27.036839962005615, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:30<00:00, 1.31it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 31.188039541244507, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:21<00:00, 10.83s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 8, 'time': 22.58897566795349, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:13<00:00, 3.26s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 13.880143880844116, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:10<00:00, 1.75s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 11.362075090408325, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:09<00:00, 1.19s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 10.333516359329224, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:12<00:00, 1.21s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 12.877896070480347, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:12<00:00, 1.07s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 13.7094247341156, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:12<00:00, 1.26it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 13.51665735244751, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:14<00:00, 1.36it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 15.559411525726318, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:14<00:00, 1.65it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 15.41647720336914, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:16<00:00, 1.92it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 17.506346225738525, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:18<00:00, 2.13it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 19.70543336868286, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:21<00:00, 11.00s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 16, 'time': 23.020490169525146, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:13<00:00, 3.29s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 14.192427158355713, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:10<00:00, 1.79s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 11.834304571151733, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:09<00:00, 1.17s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 10.566474199295044, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:09<00:00, 1.06it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 10.519251823425293, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:09<00:00, 1.30it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 10.311842203140259, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:09<00:00, 1.76it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 10.208220481872559, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:10<00:00, 1.98it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 11.23732042312622, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:11<00:00, 2.10it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 12.573827266693115, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:12<00:00, 2.55it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 13.904297828674316, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:14<00:00, 2.85it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 15.160867929458618, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [03:35<00:00, 107.61s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 2, 'time': 216.1456756591797, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [03:36<00:00, 54.11s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 217.80726861953735, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [03:28<00:00, 34.70s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 209.56946969032288, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [03:27<00:00, 25.97s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 209.03941464424133, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [03:27<00:00, 20.76s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 208.94756078720093, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [03:26<00:00, 17.21s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 207.80913043022156, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [03:28<00:00, 13.03s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 209.8010458946228, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [03:32<00:00, 10.63s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 214.03874039649963, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [03:36<00:00, 9.03s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 218.1385862827301, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [03:43<00:00, 6.99s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 225.20102787017822, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [03:55<00:00, 5.88s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 236.50390100479126, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [03:37<00:00, 108.73s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 4, 'time': 218.76454377174377, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [01:51<00:00, 27.82s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 112.75051069259644, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [02:19<00:00, 23.33s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 141.4061987400055, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [01:47<00:00, 13.39s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 108.53772020339966, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [02:05<00:00, 12.53s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 126.68567848205566, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [01:46<00:00, 8.87s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 107.88863778114319, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [01:47<00:00, 6.74s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 109.28071689605713, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [01:50<00:00, 5.51s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 111.61476230621338, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [01:52<00:00, 4.69s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 114.15351700782776, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [01:56<00:00, 3.65s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 118.3428122997284, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [02:03<00:00, 3.08s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 124.77188372612, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [03:41<00:00, 110.94s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 8, 'time': 223.4452419281006, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [01:52<00:00, 28.06s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 113.88393425941467, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [01:14<00:00, 12.35s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 75.75654006004333, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:55<00:00, 6.94s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 57.20682334899902, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [01:23<00:00, 8.32s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 84.68120646476746, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [01:11<00:00, 5.96s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 73.19063377380371, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:58<00:00, 3.63s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 59.815208196640015, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [01:08<00:00, 3.42s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 69.98841643333435, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [01:01<00:00, 2.54s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 62.834444761276245, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [01:04<00:00, 2.02s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 66.36685395240784, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [01:07<00:00, 1.69s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 69.40264368057251, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [03:37<00:00, 108.61s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 1, 'parallel_max': 16, 'time': 219.03950691223145, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [01:50<00:00, 27.67s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 112.62936043739319, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [01:14<00:00, 12.44s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 76.6215124130249, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:55<00:00, 6.88s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 57.048078536987305, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:45<00:00, 4.56s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 47.484530210494995, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:40<00:00, 3.35s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 42.28424668312073, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:32<00:00, 2.06s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 34.97290015220642, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:47<00:00, 2.36s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 49.525190353393555, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 24/24 [00:43<00:00, 1.81s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 45.5628559589386, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 32/32 [00:38<00:00, 1.20s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 40.69628596305847, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20, GOT5.5 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 40/40 [00:44<00:00, 1.12s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 46.97895050048828, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': ['EOT20', 'GOT5.5']}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 2, 'time': 3.334383487701416, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.43s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 3.4773685932159424, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:05<00:00, 1.73s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 5.8094482421875, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:05<00:00, 1.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 6.097298860549927, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:07<00:00, 1.58s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 8.52026891708374, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:08<00:00, 1.35s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 8.732183694839478, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:10<00:00, 1.34s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 11.297289609909058, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:12<00:00, 1.28s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 13.449850797653198, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:15<00:00, 1.26s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 15.898078441619873, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:19<00:00, 1.25s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 20.615198850631714, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:24<00:00, 1.23s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 25.16162872314453, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 4, 'time': 3.14968204498291, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.44s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 3.5613956451416016, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:03<00:00, 1.01s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 3.689911127090454, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:03<00:00, 1.03it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 4.587037563323975, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:05<00:00, 1.12s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 6.299825191497803, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:05<00:00, 1.12it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 6.046776294708252, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:05<00:00, 1.35it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 6.627188444137573, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:08<00:00, 1.24it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 8.743812322616577, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:08<00:00, 1.45it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 8.98261284828186, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:10<00:00, 1.46it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 11.718202352523804, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:13<00:00, 1.50it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 14.138868570327759, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 8, 'time': 3.1279547214508057, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.45s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 3.735466957092285, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:03<00:00, 1.14s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 4.25137734413147, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:03<00:00, 1.20it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 4.144881725311279, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:03<00:00, 1.43it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 4.324579238891602, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:03<00:00, 1.65it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 4.473366022109985, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:04<00:00, 1.93it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 5.012174844741821, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:05<00:00, 1.68it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 6.803356647491455, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:06<00:00, 1.98it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 6.916663646697998, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:06<00:00, 2.32it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 7.747692346572876, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:08<00:00, 2.30it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 9.657457828521729, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 16, 'time': 3.063443422317505, 'points': 100, 'points_per_split': 100, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:02<00:00, 1.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 4.097646713256836, 'points': 100, 'points_per_split': 50, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:03<00:00, 1.07s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 4.319326400756836, 'points': 100, 'points_per_split': 33, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:03<00:00, 1.16it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 4.569660663604736, 'points': 100, 'points_per_split': 25, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:03<00:00, 1.57it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 4.290369749069214, 'points': 100, 'points_per_split': 20, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:03<00:00, 1.53it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 5.029247045516968, 'points': 100, 'points_per_split': 16, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:04<00:00, 1.88it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 5.3499274253845215, 'points': 100, 'points_per_split': 12, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:04<00:00, 2.33it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 5.415190696716309, 'points': 100, 'points_per_split': 10, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:05<00:00, 2.36it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 6.193004608154297, 'points': 100, 'points_per_split': 8, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:06<00:00, 2.47it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 7.601003646850586, 'points': 100, 'points_per_split': 6, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:07<00:00, 2.66it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 8.80680537223816, 'points': 100, 'points_per_split': 5, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 2, 'time': 4.7310943603515625, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:03<00:00, 1.96s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 4.629370450973511, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:06<00:00, 2.23s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 7.393319845199585, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:06<00:00, 1.63s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 7.228583335876465, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:09<00:00, 1.84s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 9.939010381698608, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:09<00:00, 1.55s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 10.017518281936646, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:11<00:00, 1.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 12.602005004882812, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:14<00:00, 1.43s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 15.180304288864136, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:17<00:00, 1.42s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 17.808774948120117, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:22<00:00, 1.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 22.807422876358032, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:27<00:00, 1.36s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 27.842896223068237, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 4, 'time': 4.86713981628418, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.11s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 5.01958155632019, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:03<00:00, 1.29s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 4.692673921585083, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.08s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 5.133579730987549, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:06<00:00, 1.26s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 7.13028883934021, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:06<00:00, 1.12s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 7.5119805335998535, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:06<00:00, 1.15it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 7.761422157287598, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:09<00:00, 1.06it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 10.226359367370605, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:09<00:00, 1.25it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 10.439139127731323, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:11<00:00, 1.37it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 12.605883121490479, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:14<00:00, 1.35it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 15.64789080619812, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 8, 'time': 4.749791860580444, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:03<00:00, 1.97s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 4.915995121002197, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:04<00:00, 1.34s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 5.00717830657959, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.10s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 5.360293626785278, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:04<00:00, 1.09it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 5.571909666061401, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:05<00:00, 1.19it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 6.079857587814331, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:05<00:00, 1.52it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 6.372717618942261, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:06<00:00, 1.48it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 7.761810541152954, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:07<00:00, 1.61it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 8.45742416381836, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:07<00:00, 2.14it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 8.473357915878296, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:09<00:00, 2.07it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 10.66265320777893, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 16, 'time': 4.76704740524292, 'points': 1000, 'points_per_split': 1000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:04<00:00, 2.11s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 5.491879463195801, 'points': 1000, 'points_per_split': 500, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:04<00:00, 1.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 5.422261476516724, 'points': 1000, 'points_per_split': 333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:04<00:00, 1.14s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 5.856306552886963, 'points': 1000, 'points_per_split': 250, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:04<00:00, 1.17it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 5.858165740966797, 'points': 1000, 'points_per_split': 200, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:04<00:00, 1.27it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 6.159771680831909, 'points': 1000, 'points_per_split': 166, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:05<00:00, 1.45it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 6.990351438522339, 'points': 1000, 'points_per_split': 125, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:05<00:00, 1.74it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 7.187536954879761, 'points': 1000, 'points_per_split': 100, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:07<00:00, 1.64it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 8.789670705795288, 'points': 1000, 'points_per_split': 83, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:06<00:00, 2.30it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 8.321991205215454, 'points': 1000, 'points_per_split': 62, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:07<00:00, 2.79it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 8.487577199935913, 'points': 1000, 'points_per_split': 50, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 2, 'time': 21.68295192718506, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:13<00:00, 6.52s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 14.026057481765747, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:18<00:00, 6.11s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 19.17806053161621, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:15<00:00, 3.84s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 16.2370023727417, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:19<00:00, 3.95s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 20.611429691314697, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:18<00:00, 3.04s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 19.21670365333557, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:20<00:00, 2.61s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 21.765028953552246, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:23<00:00, 2.34s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 24.29056668281555, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:25<00:00, 2.16s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 26.943108081817627, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:30<00:00, 1.91s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 31.49936294555664, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:35<00:00, 1.78s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 36.52475309371948, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 4, 'time': 21.668402433395386, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:12<00:00, 6.43s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 13.828262329101562, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:09<00:00, 3.29s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 10.802367448806763, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:09<00:00, 2.30s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 10.173426866531372, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:13<00:00, 2.77s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 14.819823741912842, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:13<00:00, 2.27s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 14.693720817565918, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:11<00:00, 1.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 12.84511137008667, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:14<00:00, 1.48s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 15.768202543258667, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:14<00:00, 1.18s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 15.13057255744934, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:16<00:00, 1.05s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 17.83345913887024, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:19<00:00, 1.02it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 20.75438380241394, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 8, 'time': 21.766361236572266, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:12<00:00, 6.27s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 13.665264129638672, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:09<00:00, 3.28s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 10.947334051132202, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:09<00:00, 2.32s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 10.52197265625, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:08<00:00, 1.65s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 9.36280369758606, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:08<00:00, 1.47s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 9.949939012527466, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:09<00:00, 1.17s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 10.472018480300903, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:10<00:00, 1.08s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 12.007705450057983, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:10<00:00, 1.15it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 11.651570081710815, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:10<00:00, 1.53it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 11.755990266799927, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:13<00:00, 1.50it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 14.515588283538818, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 16, 'time': 21.664205074310303, 'points': 10000, 'points_per_split': 10000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [00:13<00:00, 6.54s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 14.494793891906738, 'points': 10000, 'points_per_split': 5000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [00:10<00:00, 3.45s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 11.869606494903564, 'points': 10000, 'points_per_split': 3333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:09<00:00, 2.32s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 10.705569982528687, 'points': 10000, 'points_per_split': 2500, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:08<00:00, 1.71s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 9.93360948562622, 'points': 10000, 'points_per_split': 2000, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:08<00:00, 1.37s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 9.642301559448242, 'points': 10000, 'points_per_split': 1666, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:08<00:00, 1.09s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 10.17075800895691, 'points': 10000, 'points_per_split': 1250, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:09<00:00, 1.05it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 10.977132320404053, 'points': 10000, 'points_per_split': 1000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:08<00:00, 1.35it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 10.468158721923828, 'points': 10000, 'points_per_split': 833, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:09<00:00, 1.64it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 11.378776788711548, 'points': 10000, 'points_per_split': 625, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:10<00:00, 1.83it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 12.403078317642212, 'points': 10000, 'points_per_split': 500, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 2, 'time': 206.48058152198792, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [01:47<00:00, 53.84s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 2, 'time': 109.08918809890747, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [02:19<00:00, 46.56s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 2, 'time': 141.13791918754578, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [01:40<00:00, 25.21s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 2, 'time': 102.24982476234436, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [02:04<00:00, 24.94s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 2, 'time': 126.11200904846191, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [01:43<00:00, 17.25s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 2, 'time': 104.85350227355957, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [01:46<00:00, 13.28s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 2, 'time': 107.63330364227295, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [01:49<00:00, 10.92s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 2, 'time': 110.59881782531738, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [01:51<00:00, 9.33s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 2, 'time': 113.39743661880493, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 6.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [01:57<00:00, 7.36s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 2, 'time': 119.18248271942139, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 8.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [02:03<00:00, 6.19s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 2, 'time': 125.23232054710388, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 10.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 4, 'time': 207.57323265075684, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [01:53<00:00, 56.52s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 4, 'time': 114.5426197052002, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [01:11<00:00, 23.88s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 4, 'time': 73.1483039855957, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:54<00:00, 13.52s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 4, 'time': 55.540321588516235, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [01:24<00:00, 16.82s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 4, 'time': 85.42603087425232, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [01:09<00:00, 11.65s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 4, 'time': 71.45185613632202, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:55<00:00, 6.90s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 4, 'time': 56.7194709777832, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [01:07<00:00, 6.72s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 4, 'time': 68.70168733596802, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:58<00:00, 4.88s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 4, 'time': 60.217631578445435, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 3.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [01:01<00:00, 3.82s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 4, 'time': 62.69625210762024, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 4.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [01:05<00:00, 3.27s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 4, 'time': 67.09255361557007, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 5.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 8, 'time': 206.0199911594391, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [01:48<00:00, 54.06s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 8, 'time': 109.81371188163757, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [01:11<00:00, 24.00s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 8, 'time': 73.70318651199341, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:53<00:00, 13.46s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 8, 'time': 55.54593014717102, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:44<00:00, 8.99s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 8, 'time': 46.519240379333496, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:38<00:00, 6.49s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 8, 'time': 40.687695026397705, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:31<00:00, 3.94s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 8, 'time': 33.14250874519348, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:45<00:00, 4.56s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 8, 'time': 47.311853647232056, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:40<00:00, 3.39s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 8, 'time': 42.34663009643555, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 1.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:34<00:00, 2.16s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 8, 'time': 36.282265424728394, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 2.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:41<00:00, 2.09s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 8, 'time': 43.34943342208862, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 2.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20\n", - "{'split': 1, 'parallel_max': 16, 'time': 206.40290689468384, 'points': 100000, 'points_per_split': 100000, 'split_per_parallel': 0.0625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 2/2 [01:48<00:00, 54.26s/it] \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 2, 'parallel_max': 16, 'time': 110.53279614448547, 'points': 100000, 'points_per_split': 50000, 'split_per_parallel': 0.125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 3/3 [01:12<00:00, 24.10s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 3, 'parallel_max': 16, 'time': 74.35631084442139, 'points': 100000, 'points_per_split': 33333, 'split_per_parallel': 0.1875, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 4/4 [00:54<00:00, 13.58s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 4, 'parallel_max': 16, 'time': 56.3756320476532, 'points': 100000, 'points_per_split': 25000, 'split_per_parallel': 0.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 5/5 [00:46<00:00, 9.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 5, 'parallel_max': 16, 'time': 48.81891632080078, 'points': 100000, 'points_per_split': 20000, 'split_per_parallel': 0.3125, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 6/6 [00:38<00:00, 6.35s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 6, 'parallel_max': 16, 'time': 40.126490116119385, 'points': 100000, 'points_per_split': 16666, 'split_per_parallel': 0.375, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 8/8 [00:31<00:00, 3.97s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 8, 'parallel_max': 16, 'time': 33.65049457550049, 'points': 100000, 'points_per_split': 12500, 'split_per_parallel': 0.5, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 10/10 [00:27<00:00, 2.77s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 10, 'parallel_max': 16, 'time': 29.807040452957153, 'points': 100000, 'points_per_split': 10000, 'split_per_parallel': 0.625, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 12/12 [00:25<00:00, 2.10s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 12, 'parallel_max': 16, 'time': 27.244994163513184, 'points': 100000, 'points_per_split': 8333, 'split_per_parallel': 0.75, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 16/16 [00:22<00:00, 1.38s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 16, 'parallel_max': 16, 'time': 24.17734694480896, 'points': 100000, 'points_per_split': 6250, 'split_per_parallel': 1.0, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n", - "Modelling tides using EOT20 in parallel\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|██████████| 20/20 [00:29<00:00, 1.50s/it]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'split': 20, 'parallel_max': 16, 'time': 32.10411834716797, 'points': 100000, 'points_per_split': 5000, 'split_per_parallel': 1.25, 'directory': '/gdata1/data/tide_models_clipped/', 'model': 'EOT20'}\n" - ] - } - ], + "# get parameters for tide model\n", + "if DEFINITION_FILE is not None:\n", + " model = pyTMD.io.model(DIRECTORY).from_file(DEFINITION_FILE)\n", + "else:\n", + " model = pyTMD.io.model(DIRECTORY, compressed=GZIP).elevation(MODEL)\n", + "\n", + "# determine input data type based on variable dimensions\n", + "if not TYPE:\n", + " TYPE = pyTMD.spatial.data_type(x, y, delta_time)\n", + "assert TYPE.lower() in ('grid', 'drift', 'time series')\n", + "# reform coordinate dimensions for input grids\n", + "# or verify coordinate dimension shapes\n", + "if (TYPE.lower() == 'grid') and (np.size(x) != np.size(y)):\n", + " x,y = np.meshgrid(np.copy(x),np.copy(y))\n", + "elif (TYPE.lower() == 'grid'):\n", + " x = np.atleast_2d(x)\n", + " y = np.atleast_2d(y)\n", + "elif TYPE.lower() in ('time series', 'drift'):\n", + " x = np.atleast_1d(x)\n", + " y = np.atleast_1d(y)\n", + "\n", + "# converting x,y from EPSG to latitude/longitude\n", + "crs1 = pyTMD.crs().from_input(EPSG)\n", + "crs2 = pyproj.CRS.from_epsg(4326)\n", + "transformer = pyproj.Transformer.from_crs(crs1, crs2, always_xy=True)\n", + "lon, lat = transformer.transform(x.flatten(), y.flatten())\n", + "\n", + "# verify that delta time is an array\n", + "delta_time = np.atleast_1d(delta_time)\n", + "# convert delta times or datetimes objects to timescale\n", + "if (TIME.lower() == 'datetime'):\n", + " ts = timescale.time.Timescale().from_datetime(\n", + " delta_time.flatten())\n", + "else:\n", + " ts = timescale.time.Timescale().from_deltatime(delta_time,\n", + " epoch=EPOCH, standard=TIME)\n", + "# number of time points\n", + "nt = len(ts)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# read tidal constants and interpolate to grid points\n", + "amp, ph, c = model.extract_constants(lon, lat, type=model.type,\n", + " crop=CROP, bounds=BOUNDS, method=METHOD,\n", + " extrapolate=EXTRAPOLATE, cutoff=CUTOFF,\n", + " append_node=APPEND_NODE, apply_flexure=APPLY_FLEXURE)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "amp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ph" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# adjust dimensions of input coordinates to be iterable\n", + "ilon = np.atleast_1d(np.copy(lon))\n", + "ilat = np.atleast_1d(np.copy(lat))\n", + "# set default bounds if cropping\n", + "xmin, xmax = np.min(ilon), np.max(ilon)\n", + "ymin, ymax = np.min(ilat), np.max(ilat)\n", + "bounds=[xmin-1, xmax+1, ymin-1, ymax+1]\n", + "\n", + "\n", + "# read tidal constants and interpolate to grid points\n", + "c = model.read_constants(crop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "c = model.read_constants(crop=False, bounds=bounds)\n", + "plt.imshow(c.m2.mask)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "c = model.read_constants(crop=True, bounds=bounds)\n", + "plt.imshow(c.m2.mask)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.imshow(c.m2.astype(\"float32\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "c.m2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# calculate complex phase in radians for Euler's\n", + "cph = -1j*ph*np.pi/180.0\n", + "# calculate constituent oscillation\n", + "hc = amp*np.exp(cph)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Compare timings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "from eo_tides.model import model_tides\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# Generate random data within input bounds\n", + "n = 2000\n", + "x = np.random.uniform(112.715430, 154.727149, n)\n", + "y = np.random.uniform(-44.199061, -10.035282, n)\n", + "times = pd.date_range(\"2020\", \"2021\", periods=100)\n", + "model = \"FES2014\"\n", + "# directory = \"/var/share/tide_models/\"\n", + "directory = \"/gdata1/data/tide_models/\"\n", + "\n", + "# Time the spline method\n", + "start_time = time.time()\n", + "modelled_tides_df_spline = model_tides(\n", + " x=x,\n", + " y=y,\n", + " time=times,\n", + " model=model,\n", + " method=\"spline\",\n", + " directory=directory,\n", + " parallel=False,\n", + " crop=False, \n", + ")\n", + "spline_time = time.time() - start_time\n", + "\n", + "# Time the linear method \n", + "start_time = time.time()\n", + "modelled_tides_df_linear = model_tides(\n", + " x=x,\n", + " y=y,\n", + " time=times,\n", + " model=model,\n", + " method=\"linear\",\n", + " directory=directory,\n", + " parallel=False,\n", + " crop=False,\n", + ")\n", + "linear_time = time.time() - start_time\n", + "\n", + "print(f\"Spline method time: {spline_time:.6f} seconds\")\n", + "print(f\"Linear method time: {linear_time:.6f} seconds\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "from eo_tides.model import model_tides\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# Generate random data within input bounds\n", + "n = 2000\n", + "x = np.random.uniform(112.715430, 154.727149, n)\n", + "y = np.random.uniform(-44.199061, -10.035282, n)\n", + "times = pd.date_range(\"2020\", \"2021\", periods=100)\n", + "model = \"FES2014\"\n", + "# directory = \"/var/share/tide_models/\"\n", + "directory = \"/gdata1/data/tide_models/\"\n", + "\n", + "# # Time the spline method\n", + "# start_time = time.time()\n", + "# modelled_tides_df_spline = model_tides(\n", + "# x=x,\n", + "# y=y,\n", + "# time=times,\n", + "# model=model,\n", + "# method=\"spline\",\n", + "# directory=directory,\n", + "# parallel=False,\n", + "# crop=True, \n", + "# )\n", + "# spline_time = time.time() - start_time\n", + "\n", + "# Time the linear method \n", + "start_time = time.time()\n", + "modelled_tides_df_linear = model_tides(\n", + " x=x,\n", + " y=y,\n", + " time=times,\n", + " model=model,\n", + " method=\"linear\",\n", + " directory=directory,\n", + " parallel=False,\n", + " crop=True,\n", + ")\n", + "linear_time = time.time() - start_time\n", + "\n", + "# print(f\"Spline method time: {spline_time:.6f} seconds\")\n", + "print(f\"Linear method time: {linear_time:.6f} seconds\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import time\n", "\n", @@ -6728,7 +1670,7 @@ }, { "cell_type": "code", - "execution_count": 268, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6741,7 +1683,7 @@ }, { "cell_type": "code", - "execution_count": 273, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -6750,20 +1692,9 @@ }, { "cell_type": "code", - "execution_count": 274, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAHqCAYAAADrpwd3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3xUVdoH8N+dnt4r6aEk9I4CShAEkY4KiquAiK4FRbDhWlDXRdFdXXHVXfUVVxTUVbqAIL1DIPROEiAdkkyml3vv+0dkZFIgYMhMkt/385ll77ln7jwnicmZZ859jiDLsgwiIiIiIiIiIiIiIqpG4ekAiIiIiIiIiIiIiIi8FZPoRERERERERERERES1YBKdiIiIiIiIiIiIiKgWTKITEREREREREREREdWCSXQiIiIiIiIiIiIiolowiU5EREREREREREREVAsm0YmIiIiIiIiIiIiIasEkOhERERERERERERFRLZhEJyIiIiIiIiIiIiKqBZPoREQNQBCEOj02bNiAiRMnIikpydMhu2zYsAGCIOB///vfDX+tnTt3YvTo0UhISIBWq0VUVBRuvvlmzJgx47qul5OTA0EQMG/ePFfbvHnzIAgCcnJyXG3ffvstPvjggz8WPBEREVEzxbnu1V2ag156qFQqxMXFYdKkScjLy7vm62VkZCAjI+O6Yvn5558xa9as63puczFr1iwIguDWVvVrbjabMWvWLGzYsKFhgyMij1B5OgAiouZg+/btbsdvvvkm1q9fj3Xr1rm1t23bFvHx8Xj66acbMjyvsGLFCowYMQIZGRmYM2cOYmJiUFBQgD179mDhwoX4+9//Xi+vM3ToUGzfvh0xMTGutm+//RaHDh3CtGnT6uU1iIiIiJoTznXr7ssvv0RaWhosFgs2bdqE2bNnY+PGjTh48CD8/PzqfJ2PP/74umP4+eef8a9//YuJ9GtU9WtuNpvx+uuvA8B1f6BBRI0Hk+hERA3gpptucjuOiIiAQqGo1g4AgYGBDRWWV5kzZw6Sk5OxevVqqFS//3m69957MWfOnHp7nYiICERERNTb9YiIiIiaO8516659+/bo3r07AKB///4QRRFvvvkmFi9ejPvvv7/O12nbtu2NCtFriaIIp9MJrVbrkddvjl9zIvody7kQEXmZmm5xFQQBTz75JL788ku0adMGPj4+6N69O3bs2AFZlvHuu+8iOTkZ/v7+uO2223Dq1Klq1127di0GDBiAwMBA+Pr6ok+fPvj111/rHJfVasX06dMRHR0NHx8f9OvXD/v27XOd//rrryEIQrWVSADwxhtvQK1WIz8/v9brX7x4EeHh4W4J9EsUCvc/V0lJSRg2bBgWLVqEjh07QqfTISUlBR9++OFVx1G1nEtGRgZWrFiB3Nxct1tsiYiIiKj+Nde5bm0ufdCQm5vrimPmzJlITk6GRqNBixYt8MQTT6C8vNzteVVLi1wqY/jee+/hH//4h+vrdfPNN2PHjh2ufhMnTsS//vUvAO5leC7NjX/44Qf06tULQUFB8PX1RUpKCh566KGrjuPS9/Df//43WrduDa1Wi7Zt22LhwoXV+hYWFuLRRx9FXFwcNBoNkpOT8frrr8PpdFYbz5w5c/DXv/4VycnJ0Gq1WL9+fa0xXC32S6V75s+ff8XvdW0u/5rn5OS4Fua8/vrrrq/jxIkTr3odImqcmEQnImokli9fjs8//xxvv/02FixYAIPBgKFDh2LGjBnYunUrPvroI/znP//BkSNHcNddd0GWZddz58+fj0GDBiEwMBBfffUVvv/+e4SGhmLw4MF1fnPx0ksv4cyZM/j888/x+eefIz8/HxkZGThz5gwAYNy4cYiOjnZNyi9xOp3497//jdGjRyM2NrbW6998883YuXMnnnrqKezcuRMOh+OK8WRlZWHatGl45plnsGjRIvTu3RtPP/003nvvvTqN55KPP/4Yffr0QXR0NLZv3+56EBEREVHDaepz3dpc+kAgIiICsixj1KhReO+99/DAAw9gxYoVmD59Or766ivcdtttsNlsV73ev/71L6xZswYffPABvvnmG5hMJtx5553Q6/UAgFdeeQV33303ALjNfWNiYrB9+3aMGzcOKSkpWLhwIVasWIFXX33VLbl9JUuXLsWHH36IN954A//73/+QmJiI++67z63efGFhIXr27InVq1fj1VdfxcqVKzF58mTMnj0bU6ZMqXbNDz/8EOvWrcN7772HlStXIi0trcbXvpbYr/a9rouYmBisWrUKADB58mTX1/GVV16p8zWIqJGRiYiowU2YMEH28/Or9VxiYqJbGwA5OjpaNhqNrrbFixfLAOTOnTvLkiS52j/44AMZgHzgwAFZlmXZZDLJoaGh8vDhw92uKYqi3KlTJ7lnz55XjHX9+vUyALlr165ur5OTkyOr1Wr54YcfdrW99tprskajkYuKilxt3333nQxA3rhx4xVf58KFC3Lfvn1lADIAWa1Wy71795Znz54tGwwGt76JiYmyIAhyVlaWW/vtt98uBwYGyiaTSZZlWc7OzpYByF9++aWrz5dffikDkLOzs11tQ4cOrfY1JyIiIqLrw7ludZfmoDt27JAdDodsMBjk5cuXyxEREXJAQIBcWFgor1q1SgYgz5kzx+25l17jP//5j6utX79+cr9+/VzHl+a9HTp0kJ1Op6t9165dMgB5wYIFrrYnnnhCrikd9N5778kA5PLy8iuOpSYAZB8fH7mwsNDV5nQ65bS0NLlly5autkcffVT29/eXc3Nza3ztw4cPu40nNTVVttvtV339usR+rd/rql+jql/zkpISGYD82muvXTU+Imr8uBKdiKiR6N+/v9tmQ+np6QCAIUOGuJUfudR+6ZbQbdu2obS0FBMmTIDT6XQ9JEnCHXfcgd27d8NkMl319cePH+/2OomJiejdu7fbLZWPPfYYAOCzzz5ztX300Ufo0KEDbr311itePywsDJs3b8bu3bvx9ttvY+TIkThx4gRmzpyJDh064MKFC27927Vrh06dOlWLsaKiAnv37r3qeIiIiIjIezT1ue4lN910E9RqNQICAjBs2DBER0dj5cqViIqKcm3EWrUkyD333AM/P786raofOnQolEql67hjx44Afv96XUmPHj0AAGPHjsX333+PvLy8Oo3pkgEDBiAqKsp1rFQqMW7cOJw6dQrnz58HUHnHQf/+/REbG+v2/RoyZAgAYOPGjW7XHDFiBNRqdb3GXpfvNRFRVUyiExE1EqGhoW7HGo3miu1WqxUAUFRUBAC4++67oVar3R7vvPMOZFlGaWnpVV8/Ojq6xraLFy+6jqOiojBu3Dj8+9//hiiKOHDgADZv3ownn3yyzuPs3r07XnjhBfzwww/Iz8/HM888g5ycnGqbi9YWDwC3mIiIiIjI+zWXue5///tf7N69G/v27UN+fj4OHDiAPn36AKicw6pUKlet7UsEQagWS23CwsLcji9twmmxWK763FtvvRWLFy+G0+nEgw8+iLi4OLRv3x4LFiyo09jqMj8vKirCsmXLqn2v2rVrBwDVFs7ExMTU6bWvJfa6fK+JiKqqvnsbERE1KeHh4QCAuXPnujYuquryFSO1KSwsrLGt6kT96aefxtdff40lS5Zg1apVCA4Oxv33338dkQNqtRqvvfYa3n//fRw6dKhO8QDV3zwQERERUdPU2Oa66enp6N69e43nwsLC4HQ6UVJS4pZIl2UZhYWFrtXWN9LIkSMxcuRI2Gw27NixA7Nnz8b48eORlJSEm2+++YrPrcv8PDw8HB07dsRbb71V4zWq1pW/fMV4fcVe1+81EdHluBKdiKiJ69OnD4KDg3HkyBF07969xselFT1XsmDBArcNnHJzc7Ft2zbXDvWXdOvWDb1798Y777yDb775BhMnTnS7Nbc2BQUFNbYfPXoUQPUJ9eHDh7F//363tm+//RYBAQHo2rXrVV/vclqttk6rc4iIiIjIuzSWuW5dDBgwAEDlRqmX+/HHH2EymVzn/6i6rE7XarXo168f3nnnHQDAvn37rnrdX3/91XVnAACIoojvvvsOqampiIuLAwAMGzYMhw4dQmpqao3fq+vZnPVaY6/r97ourwPUbZU/ETV+XIlORNTE+fv7Y+7cuZgwYQJKS0tx9913IzIyEiUlJdi/fz9KSkrwySefXPU6xcXFGD16NKZMmQK9Xo/XXnsNOp0OM2fOrNb36aefxrhx4yAIAh5//PE6xTl48GDExcVh+PDhSEtLgyRJyMrKwt///nf4+/vj6aefdusfGxuLESNGYNasWYiJicH8+fOxZs0avPPOO/D19a3bF+c3HTp0wE8//YRPPvkE3bp1g0KhqHWFEBERERF5j8Yy162L22+/HYMHD8YLL7yAiooK9OnTBwcOHMBrr72GLl264IEHHqiX1+nQoQMA4J133sGQIUOgVCrRsWNH/PWvf8X58+cxYMAAxMXFoby8HP/85z+hVqvRr1+/q143PDwct912G1555RX4+fnh448/xrFjx7Bw4UJXnzfeeANr1qxB79698dRTT6FNmzawWq3IycnBzz//jE8//dSVcL8Wr776ap1jv5bv9ZUEBAQgMTERS5YswYABAxAaGorw8HAkJSVdc/xE5P2YRCciagb+9Kc/ISEhAXPmzMGjjz4Kg8GAyMhIdO7cudrGRbX529/+ht27d2PSpEmoqKhAz549sXDhQqSmplbrO2rUKGi1WvTv3x+tWrWq0/VffvllLFmyBO+//z4KCgpgs9kQExODgQMHYubMma5NpC7p3LkzJk2ahNdeew0nT55EbGws/vGPf+CZZ56p0+td7umnn8bhw4fx0ksvQa/XQ5Zlt9UpREREROS9GsNcty4EQcDixYsxa9YsfPnll3jrrbcQHh6OBx54AH/7299cK5//qPHjx2Pr1q34+OOP8cYbb0CWZWRnZ6NXr17Ys2cPXnjhBZSUlCA4OBjdu3fHunXrXDXLr2TEiBFo164dXn75ZZw9exapqan45ptvMG7cOFefmJgY7NmzB2+++SbeffddnD9/HgEBAUhOTsYdd9yBkJCQ6xrTtcR+Ld/rq/niiy/w3HPPYcSIEbDZbJgwYQLmzZt3XWMgIu8myMwSEBFRPVu2bBlGjBiBFStW4M4776z36yclJaF9+/ZYvnx5vV+biIiIiOhKbvRctzESBAFPPPEEPvroI0+HUqsNGzagf//++OGHH3D33Xd7OhwiamS4Ep2IiOrNkSNHkJubixkzZqBz584YMmSIp0MiIiIiIqoXnOsSETVf3FiUiIjqzeOPP44RI0YgJCQECxYsgCAIng6JiIiIiKhecK5LRNR8sZwLEREREREREREREVEtuBKdiIiIiIiIiIiIiKgWTKITEREREREREREREdWCSXQiIiIiIiIiIiIiolqoPB2AN/Dz84PVaoVSqURkZKSnwyEiIiKiJqy4uBiiKEKn08FkMnk6HK/CeTkRERERNaS6zs25sSgApVIJSZI8HQYRERERNSMKhQKiKHo6DK/CeTkRERERecLV5uZciY7fJ+sKhQIxMTGeDoeIiIiImrCCggJIkgSlUunpULwO5+VERERE1JDqOjdnEh1AZGQk8vLyEBMTg/Pnz3s6HCIiIiJqwuLi4pCXl8dyJTXgvJyIiIiIGlJd5+bcWJSIiIiIiIiIiIiIqBZMohMRERERERERERER1YJJdCIiIiIiIiIiIiKiWrAmOhEREVETI4oiHA6Hp8No1tRqNTcOJSIiImrmJEmC3W73dBjNWn3Ny5lEJyIiImoiZFlGYWEhysvLPR0KAQgODkZ0dDQEQfB0KERERETUwOx2O7KzsyFJkqdDafbqY17OJDoRERFRE3EpgR4ZGQlfX18mbz1ElmWYzWYUFxcDAGJiYjwcERERERE1JFmWUVBQAKVSifj4eCgUrKjtCfU5L2cSnYiIiKgJEEXRlUAPCwvzdDjNno+PDwCguLgYkZGRLO1CRERE1Iw4nU6YzWbExsbC19fX0+E0a/U1L+fHIERERERNwKUa6Jyke49L3wvWpyciIiJqXkRRBABoNBoPR0JA/czLmUQnIiIiakJYwsV78HtBRERE1LxxPugd6uP7wCQ6EREREREREREREVEtmEQnIiIiohsqKSkJH3zwgetYEAQsXry4zs+fOHEiRo0aVe9xERERERE1J5yXXz8m0YmIiIiIiIiIiIiIasEkOhERERFdM1mW4XQ6PR0GUb2RZdnTIRARERFdM87LGwaT6ERERETNQEZGBp588kk8+eSTCA4ORlhYGF5++WVX4nD+/Pno3r07AgICEB0djfHjx6O4uNj1/A0bNkAQBKxevRrdu3eHVqvF5s2bcfr0aYwcORJRUVHw9/dHjx49sHbt2muKLS8vD+PGjUNISAjCwsIwcuRI5OTkXPc4p06dimnTpiEkJARRUVH4z3/+A5PJhEmTJiEgIACpqalYuXKl6zmiKGLy5MlITk6Gj48P2rRpg3/+85+u81arFe3atcMjjzziasvOzkZQUBA+++yz64qTvIu9XI/CTVtgKS7xdChERETUxHFe3jjn5R5Nom/atAnDhw9HbGxsrTV4jh49ihEjRiAoKAgBAQG46aabcPbsWdd5m82GqVOnIjw8HH5+fhgxYgTOnz/fgKMgIiIiahy++uorqFQq7Ny5Ex9++CHef/99fP755wAAu92ON998E/v378fixYuRnZ2NiRMnVrvG888/j9mzZ+Po0aPo2LEjjEYj7rzzTqxduxb79u3D4MGDMXz4cLf52pWYzWb0798f/v7+2LRpE7Zs2QJ/f3/ccccdsNvt1z3O8PBw7Nq1C1OnTsVjjz2Ge+65B71798bevXsxePBgPPDAAzCbzQAASZIQFxeH77//HkeOHMGrr76Kl156Cd9//z0AQKfT4ZtvvsFXX32FxYsXQxRFPPDAA+jfvz+mTJlyXTGS95BlGWVHjsKhr0DJjl0o3r4Ldn2Fp8MiIiKiJozz8kY4L5c96Oeff5b/8pe/yD/++KMMQF60aJHb+VOnTsmhoaHyc889J+/du1c+ffq0vHz5crmoqMjV589//rPcokULec2aNfLevXvl/v37y506dZKdTmed42jRooUMQG7RokV9Da3OJKdTlkSxwV+XiIiImhaLxSIfOXJEtlgsNZ7v16+fnJ6eLkuS5Gp74YUX5PT09Br779q1SwYgGwwGWZZlef369TIAefHixVeNpW3btvLcuXNdx4mJifL777/vOr583vfFF1/Ibdq0cYvLZrPJPj4+8urVq2VZluUJEybII0eOvOrrXhpn3759XcdOp1P28/OTH3jgAVdbQUGBDEDevn17rdd5/PHH5bvuusutbc6cOXJ4eLg8depUOTo6Wi4pKbliLLV9Tzw59/R2nvjamAuL5J1fzJcn3TFR3vjJl3LukuVy7pLl8oW9WbLDXPN/T0RERERXcqW5Oefl3jMvl+W6zz9VNzZFf2VDhgzBkCFDaj3/l7/8BXfeeSfmzJnjaktJSXH9f71ejy+++AJff/01Bg4cCKDylof4+HisXbsWgwcPvnHB1xOH2QyFQgmVn6+nQyEiIqIm7qabboIgCK7jm2++GX//+98hiiIOHDiAWbNmISsrC6WlpZAkCQBw9uxZtG3b1vWc7t27u13TZDLh9ddfx/Lly5Gfnw+n0wmLxVLnFS+ZmZk4deoUAgIC3NqtVitOnz59XePs2LGj6/8rlUqEhYWhQ4cOrraoqCgAcLst9tNPP8Xnn3+O3NxcWCwW2O12dO7c2e26M2bMwJIlSzB37lysXLkS4eHh1xUfeRfj2XP47H/rsOfIGWQezcbgmzviT8P6AufOw5yfj4CUZAS2TIVCrfZ0qERERNREcF5eqTHNy722JrokSVixYgVat26NwYMHIzIyEr169XIr+ZKZmQmHw4FBgwa52mJjY9G+fXts27at1mvbbDZUVFS4HrInNxGSZYiO67slgoiIiKg+WK1WDBo0CP7+/pg/fz52796NRYsWAUC1Wzf9/Pzcjp977jn8+OOPeOutt7B582ZkZWWhQ4cOdb7lU5IkdOvWDVlZWW6PEydOYPz48dc1HnWVZKcgCG5tl96wXHpD8v333+OZZ57BQw89hF9++QVZWVmYNGlStTEUFxfj+PHjUCqVOHny5HXFRt7nlN6EnYdPAags7bJq235Mef0z/Lh2J+xWOypOnkb+rxtgyM6B/NvPDBEREdGNwHm5987LPboS/UqKi4thNBrx9ttv469//SveeecdrFq1CmPGjMH69evRr18/FBYWQqPRICQkxO25UVFRKCwsrPXas2fPxuuvv36jh1BnskOELMtun0ARERER1bcdO3ZUO27VqhWOHTuGCxcu4O2330Z8fDwAYM+ePXW65ubNmzFx4kSMHj0aAGA0Gq9p86GuXbviu+++Q2RkJAIDA+v8vPq0efNm9O7dG48//rirrabVNg899BDat2+PKVOmYPLkyRgwYIDbaiBqnD77YH61NovNji+XbMTPm7Pw0OgM9O7UGmUHD8NwJgfBbdPgEx3FuTsRERFdN87La+bN83KvXokOACNHjsQzzzyDzp0748UXX8SwYcPw6aefXvG5V0tIz5w5E3q93vWIjY2t19ivlSSJkEXRozEQERFR03fu3DlMnz4dx48fx4IFCzB37lw8/fTTSEhIgEajwdy5c3HmzBksXboUb775Zp2u2bJlS/z000/IysrC/v37MX78eNc8ri7uv/9+hIeHY+TIkdi8eTOys7OxceNGPP300w22WXzLli2xZ88erF69GidOnMArr7yC3bt3u/X517/+he3bt+O///0vxo8fj7vvvhv333//dW+yRN7j6UnjMahde6iVymrnikr1mP3FErzwwbc4dbYQTpMJF3ZnonjrdthKyzwQLRERETUFnJfXzJvn5V6bRA8PD4dKpar2KUJ6erqrlk90dDTsdjvKytwnsMXFxa6aOjXRarUIDAx0PTy+ikSUmEQnIiKiG+7BBx+ExWJBz5498cQTT2Dq1Kl45JFHEBERgXnz5uGHH35A27Zt8fbbb+O9996r0zXff/99hISEoHfv3hg+fDgGDx6Mrl271jkmX19fbNq0CQkJCRgzZgzS09Px0EMPwWKxNNgKmD//+c8YM2YMxo0bh169euHixYtuq1+OHTuG5557Dh9//LFrRdC//vUvlJeX45VXXmmQGOnG6XRXBl79zyz87c8PoVtSUo19jpzJwzPv/hf/+O8KXNQbYCstQ9GWbbiwZy8cJlPDBkxERESNHuflNfPmebkge7Qg+O8EQcCiRYswatQoV1vv3r2RmpqKr7/+2tU2evRo+Pj44Ntvv4Ver0dERATmz5+PsWPHAgAKCgoQFxeHn3/+uc4bi8bFxSEvLw8tWrRosE9WLrFXVMBhMEAbEgKVLzcXJSIioutjtVqRnZ2N5ORk6HS6auczMjLQuXNnfPDBBw0fXDNV2/fEk3NPb+fJr40syyg+dAa//N8S/LBpK3IuXKixn1atwt2398LoAT2h06gBQYB/UiKCWreCUqtp0JiJiIjIO11pbs55ecO70vejrvNPj9ZENxqN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t3zBggU47rjjUsaHQiEUFBS4X+mq1YmIiIiIelqvD9Hb23cR4MdGiYiIiIgOleuvvx5/+ctf8PDDD2PdunX4wQ9+gG3btuG73/1uTx8aEREREVGHaD19AF2lrX0XAetjo9dff717fdy4cQzSiYiIiIi6wIUXXoiqqir84he/wK5duzBhwgS89NJLGD58eE8fGhERERFRh/T6EL29fRcB62OjoVDIvc6PjRIRERERdZ2rr74aV199dU8fBhERERFRl+j17Vza23eRiIiIiIiIiIiIiKiten0lOmD1XZw9ezamTZuG6dOn48EHH2TfRSIiIiIiIiIiIiLqtD4RorPvIhEREREREREREREdCn0iRAfYd5GIiIiIiIiIiIiIul6v74lORERERERERERERHSoMEQnIiIiIiIiIiIiIspASCllTx9ETwsGg4jH41AUBYMGDerpwyEiIiKiPmzXrl0wTROBQACxWKynDyer8HU5EREREXWntr42Z4gOQFVVmKbZ04dBRERERP2IoigwDKOnDyOr8HU5EREREfWE1l6b95mJRTsjHA6jubkZqqqirKyspw+nV5FSYufOnaisrIQQoqcPp9fh+escnr/O4znsHJ6/zuH56zyew87pqfO3d+9eGIaBcDjcbbfZW/Tk63L+PPUPfJz7Bz7O/QMf5/6Bj3P/ke2vzVmJTp1SW1uLwsJC1NTUoKCgoKcPp9fh+escnr/O4znsHJ6/zuH56zyew87h+SMvPh/6Bz7O/QMf5/6Bj3P/wMe5/8j2x5oTixIRERERERERERERZcAQnYiIiIiIiIiIiIgoA4bo1CmhUAg///nPEQqFevpQeiWev87h+es8nsPO4fnrHJ6/zuM57ByeP/Li86F/4OPcP/Bx7h/4OPcPfJz7j2x/rNkTnYiIiIiIiIiIiIgoA1aiExERERERERERERFlwBCdiIiIiIiIiIiIiCgDhuhERERERERERERERBkwRKeMbrvtNnzuc59Dfn4+ysrK8OUvfxnr169vcZtFixZBCJHy9fHHH3fTUWePm2++OeU8VFRUtLjN4sWLMXXqVITDYRx22GH44x//2E1Hm31GjBiR9rl0zTXXpB3P5x7wxhtv4Etf+hIqKyshhMBzzz3nWy+lxM0334zKykpEIhHMnDkTa9asaXW/zzzzDI488kiEQiEceeSRmD9//iG6Bz2rpfMXj8fxox/9CBMnTkRubi4qKytx2WWXYefOnS3u89FHH037vGxubj7E96b7tfb8u+KKK1LOw7HHHtvqfvvL8w9o/Rymey4JIfDrX/864z77y3OwLa9Z+Duw9+uK/+ei0SiuvfZaDBgwALm5uTjnnHPw2Wef+cZUV1dj9uzZKCwsRGFhIWbPno2DBw/6xmzbtg1f+tKXkJubiwEDBuD73/8+YrGYb8yqVaswY8YMRCIRDB48GL/4xS/A6ajaT9d1/PSnP8XIkSMRiURw2GGH4Re/+AVM03THZNtjTx2zY8cOfP3rX0dpaSlycnIwefJkLF++3F3Px7nvue222yCEwNy5c91lfJx7v656XcbHuX+5//77MXLkSITDYUydOhVvvvlmTx9SCobolNHixYtxzTXXYNmyZViwYAF0XcesWbPQ0NDQ6rbr16/Hrl273K9Ro0Z1wxFnn/Hjx/vOw6pVqzKO3bx5M84880yceOKJWLFiBf73f/8X3//+9/HMM8904xFnj/fee8937hYsWAAAOP/881vcrj8/9xoaGjBp0iT84Q9/SLv+zjvvxN13340//OEPeO+991BRUYFTTz0VdXV1Gfe5dOlSXHjhhZg9ezY+/PBDzJ49GxdccAHeeeedQ3U3ekxL56+xsREffPABfvazn+GDDz7As88+iw0bNuCcc85pdb8FBQW+5+SuXbsQDocPxV3oUa09/wDg9NNP952Hl156qcV99qfnH9D6OUx+Hj388MMQQuCrX/1qi/vtD8/Btrxm4e/A3q8r/p+bO3cu5s+fj3nz5mHJkiWor6/H2WefDcMw3DGXXHIJVq5ciZdffhkvv/wyVq5cidmzZ7vrDcPAWWedhYaGBixZsgTz5s3DM888gxtuuMEdU1tbi1NPPRWVlZV47733cO+99+I3v/kN7r777kNwZvq2O+64A3/84x/xhz/8AevWrcOdd96JX//617j33nvdMdn02FPHVFdX4/jjj0cgEMB//vMfrF27FnfddReKiorcMXyc+5b33nsPDz74II466ijfcj7OvV9XvS7j49x/PP3005g7dy5+8pOfYMWKFTjxxBNxxhlnYNu2bT19aH6SqI327t0rAcjFixdnHLNw4UIJQFZXV3ffgWWpn//853LSpEltHn/jjTfKsWPH+pZ95zvfkccee2wXH1nvdN1118nDDz9c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AgH50EMPybVr18q5c+fK3NxcNz/LFgzRKSMAab8eeeQRd8zll18uZ8yY4V6/44475OGHHy7D4bAsLi6WJ5xwgnzxxRe7/+CzwIUXXigHDRokA4GArKyslOedd55cs2aNuz753Ekp5aJFi+SUKVNkMBiUI0aMyBiS9BevvPKKBCDXr1+fso7PvVQLFy5M+zN7+eWXSymlNE1T/vznP5cVFRUyFArJk046Sa5atcq3jxkzZrjjHf/4xz/kmDFjZCAQkGPHju2zb0y0dP42b96c8XfiwoUL3X0kn7+5c+fKYcOGyWAwKAcOHChnzZol33777e6/c92gpfPX2NgoZ82aJQcOHCgDgYAcNmyYvPzyy+W2bdt8++jPzz8pW/8ZllLKP/3pTzISiciDBw+m3Ud/fQ625TULfwf2fl3x/1xTU5OcM2eOLCkpkZFIRJ599tkpv4uqqqrkpZdeKvPz82V+fr689NJLZXV1tW/M1q1b5VlnnSUjkYgsKSmRc+bMkc3Nzb4xH330kTzxxBNlKBSSFRUV8uabb5amaXb5eenramtr5XXXXSeHDRsmw+GwPOyww+RPfvIT35vY2fbYU8f8+9//lhMmTJChUEiOHTtWPvjgg771fJz7puQQnY9z79dVr8v4OPcv9913nxw+fLgMBoPy6KOPlosXL+7pQ0ohpLRnuCEiIiIiIiIiIiIiIh/2RCciIiIiIiIiIiIiyoAhOhERERERERERERFRBgzRiYiIiIiIiIiIiIgyYIhORERERERERERERJQBQ3QiIiIiIiIiIiIiogwYohMRERERERERERERZcAQnYiIiIiIiIiIiIgoA4boREREREREREREREQZMEQnIqIuMXPmTMydO9e9PmLECPz2t7/tseMhIiIiIjpUHn30URQVFfX0YfRKQgg899xzAIAtW7ZACIGVK1f26DEREbWGIToRER0S7733Hr797W+7170vlomIiIiIerMLL7wQGzZsaNc2yUUnBAwdOhS7du3ChAkTAACLFi2CEAIHDx7s2QMjIkqi9fQBEBFR3zRw4MCePgQiIiIiokMiEokgEon09GF0uVgshmAw2G23p6oqKioquu32iIg6ipXoRETk+uc//4mJEyciEomgtLQUX/ziF9HQ0IArrrgCX/7yl3HLLbegrKwMBQUF+M53voNYLJZxX952LiNGjAAAfOUrX4EQwr1ORERERNQTZs6ciTlz5mDOnDkoKipCaWkpfvrTn0JKCQCorq7GZZddhuLiYuTk5OCMM87Axo0b3e2T27ncfPPNmDx5Mv72t79hxIgRKCwsxEUXXYS6ujoAwBVXXIHFixfjd7/7HYQQEEJgy5YtqK6uxqWXXoqBAwciEolg1KhReOSRR1o9fqcNyrx583DcccchHA5j/PjxWLRokW/c2rVrceaZZyIvLw/l5eWYPXs29u/fn3Ierr/+egwYMACnnnpqq7d98803Y9iwYQiFQqisrMT3v/99d92IESPwy1/+Epdccgny8vJQWVmJe++9t9X7sXLlSmzZsgUnn3wyAKC4uBhCCFxxxRWtHg8RUXdgiE5ERACAXbt24eKLL8aVV16JdevWYdGiRTjvvPPcPyRef/11rFu3DgsXLsRTTz2F+fPn45ZbbmnTvt977z0AwCOPPIJdu3a514mIiIiIespf//pXaJqGd955B7///e9xzz334C9/+QsAK/R+//338fzzz2Pp0qWQUuLMM89EPB7PuL9PP/0Uzz33HF544QW88MILWLx4MW6//XYAwO9+9ztMnz4dV111FXbt2oVdu3Zh6NCh+NnPfoa1a9fiP//5D9atW4cHHngAAwYMaPN9+OEPf4gbbrgBK1aswHHHHYdzzjkHVVVVAKzX9zNmzMDkyZPx/vvv4+WXX8aePXtwwQUXpD0Pb731Fv70pz+1eHv//Oc/cc899+BPf/oTNm7ciOeeew4TJ070jfn1r3+No446Ch988AF+/OMf4wc/+AEWLFjQ6n0ZOnQonnnmGQDA+vXrsWvXLvzud79r87kgIjqU2M6FiIgAWC+ydV3Heeedh+HDhwOA7wVxMBjEww8/jJycHIwfPx6/+MUv8MMf/hC//OUvoSgtvyfrtHYpKirixzWJiIiIKCsMHToU99xzD4QQGDNmDFatWoV77rkHM2fOxPPPP4+33noLxx13HADgiSeewNChQ/Hcc8/h/PPPT7s/0zTx6KOPIj8/HwAwe/ZsvP766/jVr36FwsJCBINB5OTk+F4Pb9u2DVOmTMG0adMAoN2f2JwzZw6++tWvAgAeeOABvPzyy3jooYdw44034oEHHsDRRx+NW2+91R3/8MMPY+jQodiwYQNGjx4NADjiiCNw5513tun2tm3bhoqKCnzxi19EIBDAsGHD8PnPf9435vjjj8dNN90EABg9ejTeeust3HPPPa1WuauqipKSEgBAWVkZJ24loqzCSnQiIgIATJo0CaeccgomTpyI888/H3/+859RXV3tW5+Tk+Nenz59Ourr67F9+/aeOFwiIiIiok459thjIYRwr0+fPh0bN27E2rVroWkajjnmGHddaWkpxowZg3Xr1mXc34gRI9wAHQAGDRqEvXv3tngM3/ve9zBv3jxMnjwZN954I95+++123Yfp06e7lzVNw7Rp09xjXL58ORYuXIi8vDz3a+zYsQCsqnmHE+C3xfnnn4+mpiYcdthhuOqqqzB//nzoup7xmJzrLZ03IqLegCE6EREBsCo/FixYgP/85z848sgjce+992LMmDHYvHlzi9t5//AgIiIiIuqrpJQtvvYNBAK+60IImKbZ4j7POOMMbN26FXPnzsXOnTtxyimn4H/+5386dZzOMZqmiS996UtYuXKl72vjxo046aST3PG5ublt3vfQoUOxfv163HfffYhEIrj66qtx0kkntdjmxntMRES9FUN0IiJyCSFw/PHH45ZbbsGKFSsQDAYxf/58AMCHH36IpqYmd+yyZcuQl5eHIUOGtGnfgUAAhmEckuMmIiIiImqvZcuWpVwfNWoUjjzySOi6jnfeecddV1VVhQ0bNmDcuHEdvr1gMJj29fDAgQNxxRVX4PHHH8dvf/tbPPjggx26D7quY/ny5W61+dFHH401a9ZgxIgROOKII3xf7QnOk0UiEZxzzjn4/e9/j0WLFmHp0qVYtWpV2mNyrjvH1JpgMAgA/LuBiLIOQ3QiIgIAvPPOO7j11lvx/vvvY9u2bXj22Wexb98+9w+FWCyGb37zm+7ERz//+c8xZ86cVvuhO0aMGIHXX38du3fv9rWJISIiIiLqCdu3b8f111+P9evX46mnnsK9996L6667DqNGjcK5556Lq666CkuWLMGHH36Ir3/96xg8eDDOPffcDt/eiBEj8M4772DLli3Yv38/TNPE//t//w//+te/8Mknn2DNmjV44YUX2hXU33fffZg/fz4+/vhjXHPNNaiursaVV14JALjmmmtw4MABXHzxxXj33XexadMmvPrqq7jyyis7HFI/+uijeOihh7B69Wps2rQJf/vb3xCJRNw5lQDgrbfewp133okNGzbgvvvuwz/+8Q9cd911bdr/8OHDIYTACy+8gH379qG+vr5Dx0lE1NUYohMREQCgoKAAb7zxBs4880yMHj0aP/3pT3HXXXfhjDPOAACccsopGDVqFE466SRccMEF+NKXvoSbb765zfu/6667sGDBAgwdOhRTpkw5RPeCiIiIiKhtLrvsMjQ1NeHzn/88rrnmGlx77bX49re/DQB45JFHMHXqVJx99tmYPn06pJR46aWXUlq2tMf//M//QFVVHHnkkRg4cCC2bduGYDCIH//4xzjqqKNw0kknQVVVzJs3r837vP3223HHHXdg0qRJePPNN/Gvf/0LAwYMAABUVlbirbfegmEYOO200zBhwgRcd911KCwsbHMhTLKioiL8+c9/xvHHH4+jjjoKr7/+Ov7973+jtLTUHXPDDTdg+fLlmDJlCn75y1/irrvuwmmnndam/Q8ePBi33HILbrrpJpSXl2POnDkdOk4ioq4mpJSypw+CiIiy2xVXXIGDBw/iueee6+lDISIiIiLqtJkzZ2Ly5Mn47W9/29OH0iFbtmzByJEjsWLFCkyePLmnD8c1YsQIzJ07F3Pnzu3pQyEi6lKsRCciIiIiIiIiIiIiyoAhOhERERERERFRFrn11luRl5eX9stpt3goPPHEExlvd/z48YfsdomIsh3buRARERERERERZZEDBw7gwIEDaddFIhEMHjz4kNxuXV0d9uzZk3ZdIBDwTSBKRNSfMEQnIiIiIiIiIiIiIsqA7VyIiIiIiIiIiIiIiDJgiE5ERERERERERERElAFDdCIiIiIiIiIiIiKiDBiiExERERERERERERFlwBCdiIiIiIiIiIiIiCgDhuhERERERERERERERBkwRCciIiIiIiIiIiIiyoAhOhERERERERERERFRBv8fYZryR3rR1XEAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", @@ -6783,20 +1714,9 @@ }, { "cell_type": "code", - "execution_count": 233, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAHqCAYAAADrpwd3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd2AU5boG8GdmWwiEGkihBqRIb1ItIAgCAnYUG4roOSqiYjncY8FyBBEFpKhYAKVbQHrvvfcOoYQkhJK2fafcPzZZsjubkIRNNuX53bvH7My3k2+TkMw++877CaqqqiAiIiIiIiIiIiIiIg0x2BMgIiIiIiIiIiIiIiqqGKITEREREREREREREWWDIToRERERERERERERUTYYohMRERERERERERERZYMhOhERERERERERERFRNhiiExERERERERERERFlgyE6EREREREREREREVE2GKITEREREREREREREWWDIToRERERERERERERUTYYohMRFQJBEHJ127BhAwYNGoQ6deoEe8oeGzZsgCAI+PPPPwv8c+3cuROPPPIIatWqBZPJhIiICHTs2BHDhw/P1/HOnz8PQRAwffp0z7bp06dDEAScP3/es2327NkYP3787U2eiIiIqJTiue6tZZ6DZt70ej1q1KiBF198EZcvX87z8bp06YIuXbrkay7Lli3DyJEj8/XY0mLkyJEQBMFrm+/X3Gq1YuTIkdiwYUPhTo6IgkIf7AkQEZUG27dv97r/+eefY/369Vi3bp3X9saNG6NmzZoYNmxYYU6vSFi6dCn69euHLl26YMyYMYiKikJCQgL27NmDuXPn4ptvvgnI5+nTpw+2b9+OqKgoz7bZs2fjyJEjeOuttwLyOYiIiIhKE57r5t60adPQqFEj2Gw2bNq0CaNGjcLGjRtx+PBhlC1bNtfHmTJlSr7nsGzZMkyePJlBeh75fs2tVis+/fRTAMj3GxpEVHwwRCciKgQdOnTwul+1alWIoqjZDgDly5cvrGkVKWPGjEFMTAxWrlwJvf7mn6ennnoKY8aMCdjnqVq1KqpWrRqw4xERERGVdjzXzb2mTZuibdu2AICuXbtClmV8/vnnWLhwIZ555plcH6dx48YFNcUiS5ZlSJIEk8kUlM9fGr/mRHQT27kQERUx/i5xFQQBb7zxBqZNm4aGDRuiTJkyaNu2LXbs2AFVVfH1118jJiYG5cqVw/33348zZ85ojrtmzRp069YN5cuXR2hoKDp37oy1a9fmel52ux3vvPMOIiMjUaZMGdx3333Yv3+/Z//vv/8OQRA0lUgA8Nlnn8FgMCA+Pj7b41+/fh3h4eFeAXomUfT+c1WnTh089NBDWLBgAZo3b46QkBDUrVsX33333S2fh287ly5dumDp0qW4cOGC1yW2RERERBR4pfVcNzuZbzRcuHDBM48RI0YgJiYGRqMR1atXx+uvv46UlBSvx/m2FslsYzh27Fh8++23nq9Xx44dsWPHDs+4QYMGYfLkyQC82/Bknhv/8ccfaN++PSpUqIDQ0FDUrVsXL7300i2fR+b38Mcff0SDBg1gMpnQuHFjzJ07VzM2MTERr776KmrUqAGj0YiYmBh8+umnkCRJ83zGjBmDL774AjExMTCZTFi/fn22c7jV3DNb98ycOTPH73V2sn7Nz58/7ynM+fTTTz1fx0GDBt3yOERUPDFEJyIqJpYsWYKff/4Zo0ePxpw5c5Ceno4+ffpg+PDh2Lp1KyZNmoSpU6fi2LFjeOyxx6CqquexM2fORI8ePVC+fHnMmDED8+fPR+XKldGzZ89cv7j4v//7P5w7dw4///wzfv75Z8THx6NLly44d+4cAGDAgAGIjIz0nJRnkiQJP/74Ix555BFER0dne/yOHTti586dePPNN7Fz5064XK4c53PgwAG89dZbePvtt7FgwQJ06tQJw4YNw9ixY3P1fDJNmTIFnTt3RmRkJLZv3+65EREREVHhKennutnJfEOgatWqUFUVDz/8MMaOHYvnnnsOS5cuxTvvvIMZM2bg/vvvh8PhuOXxJk+ejNWrV2P8+PGYNWsWLBYLevfujdTUVADARx99hMcffxwAvM59o6KisH37dgwYMAB169bF3LlzsXTpUnz88cde4XZOFi1ahO+++w6fffYZ/vzzT9SuXRtPP/20V7/5xMREtGvXDitXrsTHH3+M5cuXY/DgwRg1ahSGDBmiOeZ3332HdevWYezYsVi+fDkaNWrk93PnZe63+l7nRlRUFFasWAEAGDx4sOfr+NFHH+X6GERUzKhERFToXnjhBbVs2bLZ7qtdu7bXNgBqZGSkajabPdsWLlyoAlBbtmypKori2T5+/HgVgHro0CFVVVXVYrGolStXVvv27et1TFmW1RYtWqjt2rXLca7r169XAaitW7f2+jznz59XDQaD+vLLL3u2ffLJJ6rRaFSvXLni2TZv3jwVgLpx48YcP8+1a9fUu+++WwWgAlANBoPaqVMnddSoUWp6errX2Nq1a6uCIKgHDhzw2v7AAw+o5cuXVy0Wi6qqqhobG6sCUKdNm+YZM23aNBWAGhsb69nWp08fzdeciIiIiPKH57pameegO3bsUF0ul5qenq4uWbJErVq1qhoWFqYmJiaqK1asUAGoY8aM8Xps5ueYOnWqZ9t9992n3nfffZ77mee9zZo1UyVJ8mzftWuXCkCdM2eOZ9vrr7+u+ouDxo4dqwJQU1JScnwu/gBQy5QpoyYmJnq2SZKkNmrUSL3jjjs821599VW1XLly6oULF/x+7qNHj3o9n3r16qlOp/OWnz83c8/r99r3a+T7Nb969aoKQP3kk09uOT8iKv5YiU5EVEx07drVa7GhO++8EwDQq1cvr/YjmdszLwndtm0bbty4gRdeeAGSJHluiqLgwQcfxO7du2GxWG75+QcOHOj1eWrXro1OnTp5XVL573//GwDw008/ebZNmjQJzZo1w7333pvj8atUqYLNmzdj9+7dGD16NPr3749Tp05hxIgRaNasGa5du+Y1vkmTJmjRooVmjmlpadi3b98tnw8RERERFR0l/Vw3U4cOHWAwGBAWFoaHHnoIkZGRWL58OSIiIjwLsfq2BHniiSdQtmzZXFXV9+nTBzqdznO/efPmAG5+vXJy1113AQCefPJJzJ8/H5cvX87Vc8rUrVs3REREeO7rdDoMGDAAZ86cQVxcHAD3FQddu3ZFdHS01/erV69eAICNGzd6HbNfv34wGAwBnXtuvtdERL4YohMRFROVK1f2um80GnPcbrfbAQBXrlwBADz++OMwGAxet6+++gqqquLGjRu3/PyRkZF+t12/ft1zPyIiAgMGDMCPP/4IWZZx6NAhbN68GW+88Uaun2fbtm3xwQcf4I8//kB8fDzefvttnD9/XrO4aHbzAeA1JyIiIiIq+krLue5vv/2G3bt3Y//+/YiPj8ehQ4fQuXNnAO5zWL1e7+m1nUkQBM1cslOlShWv+5mLcNpstls+9t5778XChQshSRKef/551KhRA02bNsWcOXNy9dxyc35+5coVLF68WPO9atKkCQBoCmeioqJy9bnzMvfcfK+JiHxpV28jIqISJTw8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sWXLFrFhwwZxxx13CADi3XffTcSPkFC33HKLWLJkidi2bZv44YcfxFlnnSXS0tLEjh07hBCRj922bduEx+MRN910k9i4caN44YUXhN1uF++8806ifoSECwQConv37uL222+PWMdzL1J5eblYs2aNWLNmjQAgHn/8cbFmzRqxc+dOIYQQDz30kMjIyBDz588X69evF5deeqnIyckRZWVlxjamTJlimQH7u+++E4qiiIceekhs2rRJPPTQQ8Jms1lmQG8t6nr8fD6fOOecc0TXrl3F2rVrLc+JtbW1xjbCH7977rlHLFy4UPz2229izZo14qqrrhI2m00sX748ET9ik6rr8SsvLxe33HKL+P7778X27dvF4sWLxahRo0SXLl14/pnU939YCCFKS0uFx+MRc+fOjbqNtnoOxvOahc+BLV9j/J67/vrrRdeuXcUXX3whVq9eLU455RQxdOhQ4ff7jTETJ04UQ4YMEcuWLRPLli0TgwcPFmeddZax3u/3i0GDBonx48eL1atXiy+++EJ07dpVzJgxwxhTUlIiOnXqJC699FKxfv16MX/+fJGeni7+8Y9/NMMj1bpMnTpVdOnSRXz00Udi+/btYv78+SI7O1vcdtttxphkOvZ0aH788Udhs9nEAw88ILZu3Spee+014fF4xKuvvmqM4XFuncaOHStmzpxpXOdxbvka63UZj3Pb8eabbwq73S5eeOEFsXHjRjFr1iyRkpJi5GfJgiE6xQQg6te8efOMMVOnThVjx441rj/88MPiyCOPFC6XS7Rr106ceOKJ4uOPP27+nU8CkydPFjk5OcJut4vc3FxxwQUXiJ9//tlYH/7YCSHEkiVLxPDhw4XD4RA9e/aMGZK0FZ999pkAIDZv3hyxjudepMWLF0f9Pzt16lQhhBCqqoq//e1vonPnzsLpdIoxY8aI9evXW7YxduxYY3zQ22+/Lfr27Svsdrvo169fq31joq7Hb/v27TGfExcvXmxsI/zxmzVrlujevbtwOByiQ4cOYsKECeL7779v/h+uGdT1+FVVVYkJEyaIDh06CLvdLrp37y6mTp0q8vLyLNtoy+efEPX/HxZCiP/85z/C7XaLkpKSqNtoq+dgPK9Z+BzY8jXG77nq6moxY8YM0b59e+F2u8VZZ50V8VxUWFgoLr/8cpGWlibS0tLE5ZdfLoqLiy1jdu7cKc4880zhdrtF+/btxYwZM0RNTY1lzE8//SROOukk4XQ6RefOncU999wjVFVt9MeltSsrKxMzZ84U3bt3Fy6XSxxxxBHi7rvvtryJnWzHng7Nhx9+KAYNGiScTqfo16+fePbZZy3reZxbp/AQnce55Wus12U8zm3LU089JXr06CEcDoc4+uijxdKlSxO9SxEkIfQZboiIiIiIiIiIiIiIyII90YmIiIiIiIiIiIiIYmCITkREREREREREREQUA0N0IiIiIiIiIiIiIqIYGKITEREREREREREREcXAEJ2IiIiIiIiIiIiIKAaG6EREREREREREREREMTBEJyIiIiIiIiIiIiKKgSE6EREREREREREREVEMDNGJiKhRjBs3DrNmzTKu9+zZE3PmzEnY/hARERERNZWXXnoJmZmZid6NFkmSJLz33nsAgB07dkCSJKxduzah+0REVB+G6ERE1CRWrFiB6667zrhufrFMRERERNSSTZ48GVu2bGnQbcKLTgjo1q0b8vPzMWjQIADAkiVLIEkSSkpKErtjRERhbIneASIiap06dOiQ6F0gIiIiImoSbrcbbrc70bvR6LxeLxwOR7Pdn6Io6Ny5c7PdHxHRoWIlOhERGd555x0MHjwYbrcbWVlZOPXUU1FZWYlp06bhvPPOw7333ouOHTsiPT0df/jDH+D1emNuy9zOpWfPngCA888/H5IkGdeJiIiIiBJh3LhxmDFjBmbMmIHMzExkZWXhz3/+M4QQAIDi4mJceeWVaNeuHTweDyZNmoStW7catw9v53LPPfdg2LBh+O9//4uePXsiIyMDl1xyCcrLywEA06ZNw9KlS/HPf/4TkiRBkiTs2LEDxcXFuPzyy9GhQwe43W707t0b8+bNq3f/g21Q3nzzTZxwwglwuVwYOHAglixZYhm3ceNGnHHGGUhNTUWnTp0wZcoUHDx4MOJxuPnmm5GdnY3TTjut3vu+55570L17dzidTuTm5uLGG2801vXs2RP3338/LrvsMqSmpiI3NxdPPvlkvT/H2rVrsWPHDpx88skAgHbt2kGSJEybNq3e/SEiag4M0YmICACQn5+PSy+9FFdffTU2bdqEJUuW4IILLjD+kPjyyy+xadMmLF68GG+88QYWLFiAe++9N65tr1ixAgAwb9485OfnG9eJiIiIiBLl5Zdfhs1mw/Lly/Gvf/0LTzzxBJ5//nkAWui9cuVKfPDBB1i2bBmEEDjjjDPg8/libu+3337De++9h48++ggfffQRli5dioceeggA8M9//hOjRo3Ctddei/z8fOTn56Nbt274y1/+go0bN+LTTz/Fpk2bMHfuXGRnZ8f9M9x666245ZZbsGbNGpxwwgk455xzUFhYCEB7fT927FgMGzYMK1euxMKFC7F//35cfPHFUR+H7777Dv/5z3/qvL933nkHTzzxBP7zn/9g69ateO+99zB48GDLmEcffRRDhgzB6tWrceedd+Kmm27CokWL6v1ZunXrhnfffRcAsHnzZuTn5+Of//xn3I8FEVFTYjsXIiICoL3I9vv9uOCCC9CjRw8AsLwgdjgcePHFF+HxeDBw4EDcd999uPXWW3H//fdDlut+TzbY2iUzM5Mf1yQiIiKipNCtWzc88cQTkCQJffv2xfr16/HEE09g3Lhx+OCDD/Ddd9/hhBNOAAC89tpr6NatG9577z1cdNFFUbenqipeeuklpKWlAQCmTJmCL7/8Eg888AAyMjLgcDjg8Xgsr4fz8vIwfPhwjBw5EgAa/InNGTNm4MILLwQAzJ07FwsXLsQLL7yA2267DXPnzsXRRx+NBx980Bj/4osvolu3btiyZQv69OkDADjqqKPwyCOPxHV/eXl56Ny5M0499VTY7XZ0794dxx57rGXM6NGjcccddwAA+vTpg++++w5PPPFEvVXuiqKgffv2AICOHTty4lYiSiqsRCciIgDA0KFDMX78eAwePBgXXXQRnnvuORQXF1vWezwe4/qoUaNQUVGBXbt2JWJ3iYiIiIgOy/HHHw9Jkozro0aNwtatW7Fx40bYbDYcd9xxxrqsrCz07dsXmzZtirm9nj17GgE6AOTk5KCgoKDOffjjH/+IN998E8OGDcNtt92G77//vkE/w6hRo4zLNpsNI0eONPZx1apVWLx4MVJTU42vfv36AdCq5oOCAX48LrroIlRXV+OII47AtddeiwULFsDv98fcp+D1uh43IqKWgCE6EREB0Co/Fi1ahE8//RQDBgzAk08+ib59+2L79u113s78hwcRERERUWslhKjzta/dbrdclyQJqqrWuc1JkyZh586dmDVrFvbu3Yvx48fj//7v/w5rP4P7qKoqzj77bKxdu9bytXXrVowZM8YYn5KSEve2u3Xrhs2bN+Opp56C2+3Gn/70J4wZM6bONjfmfSIiaqkYohMRkUGSJIwePRr33nsv1qxZA4fDgQULFgAA1q1bh+rqamPsDz/8gNTUVHTt2jWubdvtdgQCgSbZbyIiIiKihvrhhx8irvfu3RsDBgyA3+/H8uXLjXWFhYXYsmUL+vfvf8j353A4or4e7tChA6ZNm4ZXX30Vc+bMwbPPPntIP4Pf78eqVauMavOjjz4aP//8M3r27ImjjjrK8tWQ4Dyc2+3GOeecg3/9619YsmQJli1bhvXr10fdp+D14D7Vx+FwAAD/biCipMMQnYiIAADLly/Hgw8+iJUrVyIvLw/z58/HgQMHjD8UvF4vrrnmGmPio7/97W+YMWNGvf3Qg3r27Ikvv/wS+/bts7SJISIiIiJKhF27duHmm2/G5s2b8cYbb+DJJ5/EzJkz0bt3b5x77rm49tpr8e2332LdunW44oor0KVLF5x77rmHfH89e/bE8uXLsWPHDhw8eBCqquKvf/0r3n//ffz666/4+eef8dFHHzUoqH/qqaewYMEC/PLLL5g+fTqKi4tx9dVXAwCmT5+OoqIiXHrppfjxxx+xbds2fP7557j66qsPOaR+6aWX8MILL2DDhg3Ytm0b/vvf/8LtdhtzKgHAd999h0ceeQRbtmzBU089hbfffhszZ86Ma/s9evSAJEn46KOPcODAAVRUVBzSfhIRNTaG6EREBABIT0/H119/jTPOOAN9+vTBn//8Zzz22GOYNGkSAGD8+PHo3bs3xowZg4svvhhnn3027rnnnri3/9hjj2HRokXo1q0bhg8f3kQ/BRERERFRfK688kpUV1fj2GOPxfTp03HDDTfguuuuAwDMmzcPI0aMwFlnnYVRo0ZBCIFPPvkkomVLQ/zf//0fFEXBgAED0KFDB+Tl5cHhcODOO+/EkCFDMGbMGCiKgjfffDPubT700EN4+OGHMXToUHzzzTd4//33kZ2dDQDIzc3Fd999h0AggNNPPx2DBg3CzJkzkZGREXchTLjMzEw899xzGD16NIYMGYIvv/wSH374IbKysowxt9xyC1atWoXhw4fj/vvvx2OPPYbTTz89ru136dIF9957L+644w506tQJM2bMOKT9JCJqbJIQQiR6J4iIKLlNmzYNJSUleO+99xK9K0REREREh23cuHEYNmwY5syZk+hdOSQ7duxAr169sGbNGgwbNizRu2Po2bMnZs2ahVmzZiV6V4iIGhUr0YmIiIiIiIiIiIiIYmCITkRERERERESURB588EGkpqZG/Qq2W2wKr732Wsz7HThwYJPdLxFRsmM7FyIiIiIiIiKiJFJUVISioqKo69xuN7p06dIk91teXo79+/dHXWe32y0TiBIRtSUM0YmIiIiIiIiIiIiIYmA7FyIiIiIiIiIiIiKiGBiiExERERERERERERHFwBCdiIiIiIiIiIiIiCgGhuhERERERERERERERDEwRCciIiIiIiIiIiIiioEhOhERERERERERERFRDAzRiYiIiIiIiIiIiIhiYIhORERERERERERERBTD/wMy2WzOCjvmQwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", @@ -6816,30 +1736,9 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Time by Splits per parallel')" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABNYAAAHUCAYAAAD2haUTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZxcVZk//s8599bSSxaSkKWBQEAEAgHCIg6ghAHBsIMOKC4sfh1GBAkBVBQENwJxhDhBZVx+hCEC6khQZIZNWQdEEgiCIGsAyWJDll6r7nLO+f1xq25XdVV1V1VXV93q/rxfr9bU7erbpzuh6+nnPOd5hDHGgIiIiIiIiIiIiCoiG70AIiIiIiIiIiKiZsTEGhERERERERERURWYWCMiIiIiIiIiIqoCE2tERERERERERERVYGKNiIiIiIiIiIioCkysERERERERERERVYGJNSIiIiIiIiIioiowsUZERERERERERFQFJtaIiIiIiIiIiIiqwMQaEdWEEKKst4cffhhnn302dtlll0YvOfTwww9DCIH//u//HvXP9dRTT+HUU0/F7NmzkUgkMGPGDPzTP/0TLrnkkqru9+abb0IIgRUrVoTXVqxYASEE3nzzzfDabbfdhmXLlo1s8URERDQkxkPlYTw0PgghcPXVV4ePs//GHn744YrvNZKPJRptdqMXQERjw5NPPpn3+Nvf/jYeeugh/PGPf8y7PnfuXOy000646KKL6rm8SLjnnntw0kknYcGCBVi6dClmzZqFjRs3YvXq1bjjjjvw/e9/vyaf5/jjj8eTTz6JWbNmhdduu+02vPDCC1i0aFFNPgcREREVYjw0PMZDRDTWMLFGRDXxwQ9+MO/x9ttvDyllwXUAmDhxYr2WFSlLly7FnDlzcN9998G2B378fuITn8DSpUtr9nm23357bL/99jW7HxEREZWH8dDwGA9VzvM8CCHyvl/jcQ1EUcWjoERUd8WOPgghcMEFF+Dmm2/GHnvsgZaWFhx00EH405/+BGMMvve972HOnDlob2/HP//zP+O1114ruO+DDz6Io446ChMnTkRraysOO+ww/OEPfyh7Xel0GosXL8bMmTPR0tKCI444As8++2z4/ltvvRVCiILdaAD41re+hVgshg0bNpS8/+bNmzFt2rSiAYmU+T+Od9llF5xwwglYtWoV9t13XySTSey66674j//4j2G/jsFHHxYsWIB77rkHb731Vt4xFCIiImocxkPRiod+/OMfY7/99kN7ezsmTJiAPffcE1/72teG/BzZI6hLly7Fd7/7XcyePRvJZBIHHXRQ0e/5q6++ijPPPBPTp09HIpHAXnvthR/+8Id5z8keebz11ltxySWXYIcddkAikSj6d13pGl577TWcc8452H333dHa2ooddtgBJ554Ip5//vmy1/Duu+/i/PPPx9y5c9He3o7p06fjn//5n/HYY48N+b0ayurVq3HSSSdhypQpSCaTmD9/Pn71q19VfT+iemNijYgi4/e//z1+9rOf4dprr8Xtt9+Onp4eHH/88bjkkkvwf//3f7jxxhvxk5/8BC+++CI+9rGPwRgTfuzKlStxzDHHYOLEibjlllvwq1/9ClOmTMGxxx5bdjD5ta99DW+88QZ+9rOf4Wc/+xk2bNiABQsW4I033gAAnHHGGZg5c2ZBAOT7Pv7zP/8Tp556Kjo6Okre/5/+6Z/w1FNP4Utf+hKeeuopeJ435HrWrl2LRYsW4eKLL8aqVatw6KGH4qKLLsK///u/l/X1ZP3oRz/CYYcdhpkzZ+LJJ58M34iIiCh6GA/lq0c8dMcdd+D888/HEUccgVWrVuGuu+7CxRdfjL6+vrLufeONN+Lee+/FsmXLsHLlSkgpsXDhwrx468UXX8TBBx+MF154Ad///vfx+9//Hscffzy+9KUv4Zvf/GbBPS+//HK8/fbbuOmmm3D33Xdj+vTpI17Dhg0bMHXqVFx77bW499578cMf/hC2beOQQw7Byy+/XNYatmzZAgC46qqrcM899+Dmm2/GrrvuigULFlTV/+yhhx7CYYcdhm3btuGmm27Cb3/7W+y///4444wz8nrmEUWaISIaBWeddZZpa2sr+b6dd9457xoAM3PmTNPb2xteu+uuuwwAs//++xutdXh92bJlBoD5y1/+Yowxpq+vz0yZMsWceOKJefdUSpn99tvPfOADHxhyrQ899JABYA444IC8z/Pmm2+aWCxm/t//+3/htauuusrE43Hzj3/8I7z2y1/+0gAwjzzyyJCf57333jOHH364AWAAmFgsZg499FCzZMkS09PTk/fcnXfe2QghzNq1a/Ouf+QjHzETJ040fX19xhhj1q1bZwCYm2++OXzOzTffbACYdevWhdeOP/74gu85ERERjS7GQ4WiGA9dcMEFZvLkyUOuu5js5+3o6DCpVCq83t3dbaZMmWKOPvro8Nqxxx5rdtxxR9PV1VXwuZPJpNmyZYsxZuDv4cMf/nDN1zCY7/vGdV2z++67m4svvji8XskafN83nueZo446ypx66ql57wNgrrrqqoL7PvTQQ+G1Pffc08yfP994npf3sSeccIKZNWuWUUqV/FiiqGDFGhFFxpFHHom2trbw8V577QUAWLhwYV6pfvb6W2+9BQB44oknsGXLFpx11lnwfT9801rjox/9KJ5++umydhzPPPPMvM+z884749BDD8VDDz0UXvvCF74AAPjpT38aXrvxxhsxb948fPjDHx7y/lOnTsVjjz2Gp59+Gtdeey1OPvlkvPLKK7j88ssxb948vPfee3nP33vvvbHffvsVrLG7uxvPPPPMsF8PERERNR/GQ/WPhz7wgQ9g27Zt+OQnP4nf/va3BWsYzmmnnYZkMhk+njBhAk488UQ8+uijUEohnU7jD3/4A0499VS0trbm/f0cd9xxSKfT+NOf/pR3z4997GM1XQMQVBVec801mDt3LuLxOGzbRjwex6uvvoqXXnqp4J6l1nDTTTfhgAMOQDKZhG3biMVi+MMf/lD0HkN57bXX8Le//Q2f+tSnwvXlfl82btxYtJKOKGqYWCOiyJgyZUre43g8PuT1dDoNAPjHP/4BAPj4xz+OWCyW93bdddfBGBOWrQ9l5syZRa9t3rw5fDxjxgycccYZ+M///E8opfCXv/wFjz32GC644IKyv86DDjoIX/nKV/DrX/8aGzZswMUXX4w333yzoGFvqfUAyFsTERERjR2Mh+ofD33mM5/B//f//X9466238LGPfQzTp0/HIYccggceeKCsjy+1Rtd10dvbi82bN8P3fSxfvrzg7+a4444DgIJkXu4001qsAQAWL16MK6+8EqeccgruvvtuPPXUU3j66aex3377IZVKFXx8sTVcf/31+MIXvoBDDjkEv/nNb/CnP/0JTz/9ND760Y8WvcdQsv9mL7300oLvy/nnnw+g8PtCFEUc6UFETW/atGkAgOXLlxedugUEAeBwNm3aVPTa1KlT865ddNFFuPXWW/Hb3/4W9957LyZPnhzutFUqFovhqquuwg033IAXXnihrPUAKFgTERERjW+Mh0bmnHPOwTnnnIO+vj48+uijuOqqq3DCCSfglVdewc477zzkx5ZaYzweR3t7O2KxGCzLwmc+8xl88YtfLHqPOXPm5D2udNDUcGsAgh58n/3sZ3HNNdfkPe+9997D5MmTCz6+2BpWrlyJBQsW4Mc//nHe9Z6enorWCwz8m7388stx2mmnFX3OHnvsUfF9ieqNiTUianqHHXYYJk+ejBdffLGindLBbr/9dixevDgMIt566y088cQT+OxnP5v3vAMPPBCHHnoorrvuOrzwwgv413/917wjG6Vs3Lix6M5ftmx+cKPfv/71r3juuefyjj/cdtttmDBhAg444ICKvrZEIlHxLiIRERE1D8ZDwysnHmpra8PChQvhui5OOeUU/PWvfx02sXbnnXfie9/7XngUs6enB3fffTc+9KEPwbIstLa24sgjj8Szzz6LfffdN6w2rKXh1gAEibJEIpH3cffccw/Wr1+P973vfWV9nmL3+Mtf/oInn3wSO+20U0Vr3mOPPbD77rvjueeeK0j2ETUTJtaIqOm1t7dj+fLlOOuss7BlyxZ8/OMfx/Tp0/Huu+/iueeew7vvvluwq1ZMZ2cnTj31VHz+859HV1cXrrrqKiSTSVx++eUFz73oootwxhlnQAgRlqoP59hjj8WOO+6IE088EXvuuSe01li7di2+//3vo729HRdddFHe8zs6OnDSSSfh6quvxqxZs7By5Uo88MADuO6669Da2lreNydj3rx5uPPOO/HjH/8YBx54IKSUOOiggyq6BxEREUUX46HhlYqHPv/5z6OlpQWHHXYYZs2ahU2bNmHJkiWYNGkSDj744GHva1kWPvKRj2Dx4sXQWuO6665Dd3d33rTPH/zgBzj88MPxoQ99CF/4whewyy67oKenB6+99hruvvtu/PGPf6zoa6lmDSeccAJWrFiBPffcE/vuuy/WrFmD733ve9hxxx3L/jwnnHACvv3tb+Oqq67CEUccgZdffhnf+ta3MGfOHPi+X/G6//M//xMLFy7Esccei7PPPhs77LADtmzZgpdeegnPPPMMfv3rX1d8T6J6Y2KNiMaET3/605g9ezaWLl2K8847Dz09PZg+fTr2339/nH322WXd45prrsHTTz+Nc845B93d3fjABz6AO+64A7vttlvBc0855RQkEgkceeSR2H333cu6/xVXXIHf/va3uOGGG7Bx40Y4joNZs2bh6KOPxuWXXx42Ic7af//9cc455+Cqq67Cq6++io6ODlx//fW4+OKLy/p8uS666CL89a9/xde+9jV0dXXBGANjTMX3ISIiouhiPDS0UvHQhz70IaxYsQK/+tWvsHXrVkybNg2HH344/uu//gvbb7/9sPe94IILkE6n8aUvfQmdnZ3Ye++9cc899+Cwww4LnzN37lw888wz+Pa3v40rrrgCnZ2dmDx5Mnbfffewz9pIlLOGH/zgB4jFYliyZAl6e3txwAEH4M4778QVV1xR9uf5+te/jv7+fvz85z/H0qVLMXfuXNx0001YtWoVHn744YrXfeSRR+LPf/4zvvvd72LRokXYunUrpk6dirlz5+L000+v+H5EjSAMf7MiIqrY3XffjZNOOgn33HNPTYKhwXbZZRfss88++P3vf1/zexMRERHVwniPh958803MmTMH3/ve93DppZeO2zUQjXesWCMiqsCLL76It956C5dccgn2339/LFy4sNFLIiIiIqorxkNERANkoxdARNRMzj//fJx00knYbrvtcPvtt1c8sYmIiIio2TEeIiIawKOgREREREREREREVWDFGhERERERERERURWYWCMiIiIiIiIiIqoCE2tERERERERERERV4FRQAG1tbUin07AsC9OnT2/0coiIiKgJdHZ2QimFZDKJvr6+Ri+HSmCcR0RERJWqJM7j8AIAlmVBa93oZRAREVETklJCKdXoZVAJjPOIiIioWuXEeaxYw0DAJaXErFmzGr0cIiIiagIbN26E1hqWZTV6KTQExnlERERUqUriPCbWAEyfPh3r16/HrFmz8M477zR6OURERNQEdtxxR6xfv57HCyOOcR4RERFVqpI4j8MLiIiIiIiIiIiIqsDEGhERERERERERURWYWCMiIiIiIiIiIqoCe6wRERFFkDEGvu9z2mSDxWIxDicgIiKimmKcFw21ivOYWCMiIooY13WxceNG9Pf3N3op454QAjvuuCPa29sbvRQiIiIaAxjnRUet4jwm1oiIiCJEa41169bBsix0dHQgHo9DCNHoZY1Lxhi8++67eOedd7D77ruzco2IiIhGhHFedNQyzmNijYiIKEJc14XWGjvttBNaW1sbvZxxb/vtt8ebb74Jz/OYWCMiIqIRYZwXLbWK8zi8gIiIKIKk5Et0FHAXmYiIiGqNcV401CrO498mERERERERERFRFZhYIyIiIiIiIiIiqgITa0RERFSWXXbZBcuWLQsfCyFw1113lf3xZ599Nk455ZSar4ui6dFHH8WJJ56Ijo6Okv9WXnrpJZx00kmYNGkSJkyYgA9+8IN4++23w/c7joMLL7wQ06ZNQ1tbG0466SS88847dfwqiIiIxgfGedVjYo2IiIiIaq6vrw/77bcfbrzxxqLvf/3113H44Ydjzz33xMMPP4znnnsOV155JZLJZPicRYsWYdWqVbjjjjvw+OOPo7e3FyeccAKUUvX6MoiIiIiGxKmgRERE45gxBkop2DZDAqqthQsXYuHChSXf//Wvfx3HHXccli5dGl7bddddwz93dXXh5z//OW699VYcffTRAICVK1dip512woMPPohjjz129BZPREQ0BjDOq4+GVqyNpyMCxphGL4GIiMaABQsW4IILLsAFF1yAyZMnY+rUqbjiiivC15mVK1fioIMOwoQJEzBz5kyceeaZ6OzsDD/+4YcfhhAC9913Hw466CAkEgk89thjeP3113HyySdjxowZaG9vx8EHH4wHH3yworWtX78eZ5xxBrbbbjtMnToVJ598Mt58882qv84LL7wQixYtwnbbbYcZM2bgJz/5Cfr6+nDOOedgwoQJ2G233fC///u/4ccopfC5z30Oc+bMQUtLC/bYYw/84Ac/CN+fTqex995741//9V/Da+vWrcOkSZPw05/+tKp1UnW01rjnnnvw/ve/H8ceeyymT5+OQw45JC8WXLNmDTzPwzHHHBNe6+jowD777IMnnnii5L0dx0F3d3f4Vu8YjDEfERFVi3Fec8Z5DU2sjZcjAlopuF1dMFo3eilERDQG3HLLLbBtG0899RT+4z/+AzfccAN+9rOfAQBc18W3v/1tPPfcc7jrrruwbt06nH322QX3+PKXv4wlS5bgpZdewr777ove3l4cd9xxePDBB/Hss8/i2GOPxYknnpi3mTWU/v5+HHnkkWhvb8ejjz6Kxx9/HO3t7fjoRz8K13Wr/jqnTZuGP//5z7jwwgvxhS98Af/yL/+CQw89FM888wyOPfZYfOYzn0F/fz+AIFmz44474le/+hVefPFFfOMb38DXvvY1/OpXvwIAJJNJ/OIXv8Att9yCu+66C0opfOYzn8GRRx6Jz3/+81WtkarT2dmJ3t5eXHvttfjoRz+K+++/H6eeeipOO+00PPLIIwCATZs2IR6PY7vttsv72BkzZmDTpk0l771kyRJMmjQpfNuwYcOofi25tFLo2fAelOfX7XMSEdHYwjivCeM8ExEAzKpVq/KunXHGGebTn/50yY/Ztm2bicVi5o477givrV+/3kgpzb333lv2595hhx0MALPDDjtUvO5yKNc16c2bjXLdUbk/ERGNHalUyrz44osmlUoVff8RRxxh9tprL6O1Dq995StfMXvttVfR5//5z382AExPT48xxpiHHnrIADB33XXXsGuZO3euWb58efh45513NjfccEP4OPe1++c//7nZY4898tblOI5paWkx9913nzHGmLPOOsucfPLJw37e7Nd5+OGHh4993zdtbW3mM5/5THht48aNBoB58sknS97n/PPPNx/72Mfyri1dutRMmzbNXHjhhWbmzJnm3XffLfnxQ/19jHb8MJYMjvPWr19vAJhPfvKTec878cQTzSc+8QljjDG/+MUvTDweL7jX0Ucfbc4777ySnyudTpuurq7wraOjo25/T77rmW1v/8N4KWfUPxcRETUfxnkDX+dYivMiO7xgrB0RMNqwYo2IiGrigx/8IIQQ4eN/+qd/wquvvgqlFJ599lmcfPLJ2HnnnTFhwgQsWLAAAAp2JA866KC8x319ffjyl7+MuXPnYvLkyWhvb8ff/va3sncy16xZg9deew0TJkxAe3s72tvbMWXKFKTTabz++utVfZ377rtv+GfLsjB16lTMmzcvvDZjxgwAyDsCcdNNN+Gggw7C9ttvj/b2dvz0pz8t+BouueQS7LHHHli+fDluvvlmTJs2rar1UfWmTZsG27Yxd+7cvOt77bVX+Pc1c+ZMuK6LrVu35j2ns7Mz/LsvJpFIYOLEieFb7n8rdWEMj4MSEVHVGOcFminOi2xibawdETBaM7FGRESjKp1O45hjjkF7eztWrlyJp59+GqtWrQKAgjL9tra2vMeXXXYZfvOb3+C73/0uHnvsMaxduxbz5s0ru7xfa40DDzwQa9euzXt75ZVXcOaZZ1b19cRisbzHQoi8a9mgU2deX3/1q1/h4osvxrnnnov7778fa9euxTnnnFPwNXR2duLll1+GZVl49dVXq1objUw8HsfBBx+Ml19+Oe/6K6+8gp133hkAcOCBByIWi+GBBx4I379x40a88MILOPTQQ+u63koYGIB5NSIiqjHGedGN8yI7GiL7zTv55JNx8cUXAwD2339/PPHEE7jppptwxBFHlPxYY8yQu5OXX345Fi9eHD7ea6+9Rj25ZoyG9qPT942IiJrXn/70p4LHu+++O/72t7/hvffew7XXXouddtoJALB69eqy7vnYY4/h7LPPxqmnngoA6O3tragh7QEHHIBf/vKXmD59OiZOnFj2x9XSY489hkMPPRTnn39+eK3YLuq5556LffbZB5///Ofxuc99DkcddVRB5RSNXG9vL1577bXw8bp167B27VpMmTIFs2fPxmWXXYYzzjgDH/7wh3HkkUfi3nvvxd13342HH34YADBp0iR87nOfwyWXXIKpU6diypQpuPTSSzFv3rxwSmgkGQ4wICKi6jHOKy7KcV5kK9bG3BEBAxifjWyJiGjk/v73v2Px4sV4+eWXcfvtt2P58uW46KKLMHv2bMTjcSxfvhxvvPEGfve73+Hb3/52Wfd83/vehzvvvBNr167Fc889hzPPPDPc5CrHpz71KUybNg0nn3wyHnvsMaxbtw6PPPIILrroorpN637f+96H1atX47777sMrr7yCK6+8Ek8//XTec374wx/iySefxH/913/hzDPPxMc//nF86lOfqrrxLpW2evVqzJ8/H/PnzwcALF68GPPnz8c3vvENAMCpp56Km266CUuXLsW8efPws5/9DL/5zW9w+OGHh/e44YYbcMopp+D000/HYYcdhtbWVtx9992wLKshX1M5jDEAE2tERFQlxnnFRTnOi2xibSweETC+4g4mERGN2Gc/+1mkUil84AMfwBe/+EVceOGF+Nd//Vdsv/32WLFiBX79619j7ty5uPbaa/Hv//7vZd3zhhtuwHbbbYdDDz0UJ554Io499lgccMABZa+ptbUVjz76KGbPno3TTjsNe+21F84991ykUqm67Wz+27/9G0477TScccYZOOSQQ7B58+a8Xc2//e1vuOyyy/CjH/0o3On94Q9/iG3btuHKK6+syxrHkwULFsBk+o3lvq1YsSJ8zrnnnotXX30VqVQKa9euxcknn5x3j2QyieXLl2Pz5s3o7+/H3XffHf7dRZbJHAcdfJktQYiIqAyM84qLcpwnTAMzPblHBObPn4/rr78eRx55ZHhEYNWqVTjjjDPwwx/+MDwisGjRIjz88MPhbuYXvvAF/P73v8eKFSvCIwKbN2/GmjVryt7N3HHHHbF+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dzJvvfXWsJRw5cqV2GmnnfDggw/i2GOPHbW1j1QsEYfneUin0jC+gjGmooZ/RERE5ZDxOHY4trHl9jIeH/Y5a9asQWdnJw488MDwmlIKjz76KG688UY4jgPLskZzmVRn1113HWzbxpe+9KWi79+0aRPi8Ti22267vOszZszApk2bSt53yZIl+OY3v1nTtZbD5J0EFflHQ5H/Po2gYq3iyM8ECTz2ciEiIoBxXlREumP+SHcySyXWHMeB4zjh43rtZOaSloRWGum0C6Mzk0Gb+B8SERFFkxCi7IayjXTUUUfh+eefz7t2zjnnYM8998RXvvKVpg62qNCaNWvwgx/8AM8880zFG4vDbUZefvnlWLx4cfh4r732woYNG6peayXryn9c+ihoMNygugEGVfVnIyKiMYlxXjREOrE21nYyB5PCQl9fOtjRVBpo8n9MRERE1ZowYQL22WefvGttbW2YOnVqwXVqfo899hg6Ozsxe/bs8JpSCpdccgmWLVuGN998EzNnzoTruti6dWterNfZ2YlDDz205L0TiQQSOb9k1OtEQG6PtaAfWoknZt5X1cauFDBa86QDERE1lbEe50W2kjy7k7lixYpR2cns6uoK34r1bquHeNxG97auoBEtdx+JiIhonPjMZz6Dv/zlL1i7dm341tHRgcsuuwz33XcfAODAAw9ELBbDAw88EH7cxo0b8cILLwyZWGuYnKOfQoj8nms5ghhVV9UrTQgRVMI14LQFERERFRfZirWxuJM5WDweR6qnD77vI15qchQREdE49fDDDzd6CTQCvb29eO2118LH69atw9q1azFlyhTMnj0bU6dOzXt+LBbDzJkzscceewAAJk2ahM997nO45JJLMHXqVEyZMgWXXnop5s2bF/bWjRKdmygTGGY4gaiuYk1IQPtMrBERUdMbS3FeZCvWxuRO5iDxpA0n7SLd70BzMigRERGNIatXr8b8+fMxf/58AMDixYsxf/58fOMb3yj7HjfccANOOeUUnH766TjssMPQ2tqKu+++O5K9WHT+9IKSwwsABMdES/VgG44xpfu3ERERUd01tGJtvO1kDhaLJ+Bu6UbacaB9JtaIiIho7FiwYEFFVVlvvvlmwbVkMonly5dj+fLlNVzZ6DA5FWoCCPuoFT0ZIarrsSaECOYeVHGMlIiIiEZHQxNrq1evxpFHHhk+zk5w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OOmkkzBp0iRMmDABH/zgB/H222/Xf7FEg5iCHmtlVqyN9BinENBajbBXGxER0egay3Ge3egFUL5EIo5t3b1wUmnoER4NICIi0lpj29buhq5h8nYTIeXwe3l9fX3Yb7/9cM455+BjH/tYwftff/11HH744fjc5z6Hb37zm5g0aRJeeuklJJPJ0Vg2UUUKpoJCBNVqxmTGfxYhRJB80xqijP9Git9CBD3Whvo8REQ0JjHOiwYm1iLGjsfhux6ctAPDyaBERDRC27Z2Y8EBJzd0DQ8/81tMmTp52OctXLgQCxcuLPn+r3/96zjuuOOwdOnS8Nquu+5aiyUSjZwJkmtZQghoBFVrAqUSawgq1kZSbSYkAB/GaAgeRiEiGlcY50UDX30jRloSRhukUw6Mz7J+IiIiINiRveeee/D+978fxx57LKZPn45DDjmk6DECokYodhQ06LE29FHQ4Y6LDifs5cbJoERE1KSaPc5jYi1qBCClRH9/OpgKyma0RERE6OzsRG9vL6699lp89KMfxf33349TTz0Vp512Gh555JFGL49oIMGV89gYM8zsAjFs8q0cwS0YMxIRUXNq9jiPibUIsmM2urf1wGgdJNeIiIjGuezkxJNPPhkXX3wx9t9/f3z1q1/FCSecgJtuuqnBq6NihmpS7HkevvKVr2DevHloa2tDR0cHPvvZz2LDhg1593AcBxdeeCGmTZuGtrY2nHTSSXjnnXfq/JWUr6DyzGDoSrJMYm2kJxSEAGNGIiJqWs0e57HHWgTF4zGkevvhez6MUkAs1uglERFRk5q83UQ8/MxvG76GkZo2bRps28bcuXPzru+11154/PHHR3x/qr2hmhT39/fjmWeewZVXXon99tsPW7duxaJFi3DSSSdh9erV4fMWLVqEu+++G3fccQemTp2KSy65BCeccALWrFkDy7Lq/SUNLUyQZfqplXHMU2SHDdRgMihPORARjT+M86KhoYm1Rx99FN/73vewZs0abNy4EatWrcIpp5wCINjJvOKKK/A///M/eOONNzBp0iQcffTRuPbaa9HR0RHew3EcXHrppbj99tuRSqVw1FFH4Uc/+hF23HHHBn1VIxdPxtHbl0I6lUYrgyQiIhoBKWVZDWWjLh6P4+CDD8bLL7+cd/2VV17Bzjvv3KBV0VCGalI8adIkPPDAA3nXli9fjg984AN4++23MXv2bHR1deHnP/85br31Vhx99NEAgJUrV2KnnXbCgw8+iGOPPXbUv4bKiLwTnUHSzGDos6DZY5wjT6xpFfTmFZwMSkQ0bjDOi4aGHgXN7mTeeOONBe/L3cl85plncOedd+KVV17BSSedlPe8RYsWYdWqVbjjjjvw+OOPo7e3FyeccAKUUvX6MmouHrPhuR7S/WloTgYlIqJxore3F2vXrsXatWsBAOvWrcPatWvx9ttvAwAuu+wy/PKXv8RPf/pTvPbaa7jxxhtx99134/zzz2/gqqlWurq6IITA5MmTAQBr1qyB53k45phjwud0dHRgn332wRNPPFHyPo7joLu7O3yr2yAoMShBls2rDfP5g/zbyDZShZA16dVGREQ0WsZynNfQirXxt5NZHmnbMEoh5TCxRkRE48fq1atx5JFHho8XL14MADjrrLOwYsUKnHrqqbjpppuwZMkSfOlLX8Iee+yB3/zmNzj88MMbtWSqkXQ6ja9+9as488wzMXFicKRk06ZNiMfj2G677fKeO2PGDGzatKnkvZYsWYJvfvObo7reYoJ2aRrZfetgmAEwbMkaalOxBhgYrSEkWygTEVH0jOU4r6l6rFW6k1kqseY4DhzHCR/XbSezTEIKCCHg9DkwSjNIIiKicWHBggXDviafe+65OPfcc+u0IqoHz/PwiU98Alpr/OhHPxr2+cMdd7z88svDYB0I+rMMHoowGgQEtDZ550EMyhhMIMSIBw+I7D0iFtMSERFljeU4r2myNbXeyZw0aVL4Vo9gq1KWZaO7u4+TQYmIiGjM8jwPp59+OtatW4cHHnggjPEAYObMmXBdF1u3bs37mM7OTsyYMaPkPROJBCZOnBi+1a3nmBDhVLPwEjBswZoQAqhBCxMjRKZijoiIiOqpKRJro7GT2dXVFb7lDkOIinjCQl9PL7TvwygGSURERDS2ZJNqr776Kh588EFMnTo17/0HHnggYrFYXmuQjRs34oUXXsChhx5a7+UOSwzusQbAQMAMN/GzSEKuqs8PcDOWiIioASJ/FDR3J/OPf/xjyZ3M3Kq1zs7OIQOuRCKBRCIRPo7i9KR4PAEn5SCddpHUzTuIgYiIiMan3t5evPbaa+HjbJPiKVOmoKOjAx//+MfxzDPP4Pe//z2UUuFpgylTpiAej2PSpEn43Oc+h0suuQRTp07FlClTcOmll2LevHlhb90oESJzFDTP8AMFhBCANiOf6CkEjGJvXiIionqLdMXaWNvJrEQiHoPreEin0tBNPOGUiIiIxqfVq1dj/vz5mD9/PoCgSfH8+fPxjW98A++88w5+97vf4Z133sH++++PWbNmhW+5Ez9vuOEGnHLKKTj99NNx2GGHobW1FXfffTcsy2rUlzWkYhVjZfVYq8FETyEkjC6jpxsRERHVVEMr1sbbTmYlrFgMyvfhptIwnAxKRDTu8JfjaODfQ/WGa1Jczvc2mUxi+fLlWL58eS2XNipENkGWe628DwRqMXhACEArwGhARDPxSEREAcYX0VCrv4eGJtaGGrd69dVX43e/+x0AYP/998/7uIceeggLFiwAEOxk2raN008/HalUCkcddRRWrFgR2Z3McgkpYDSQTrkwvhr58QAiImoKsVgMANDf34+WlpYGr4Zc1wWApo8rqA6EgC7osTZ80C4yH2eMKS8RN8TnhwGMNhCRPpNCRDR+Mc6LllrFeQ1NrI23ncyKCMC2BHp7+4NjBVoDDOqJiMY8y7IwefJkdHZ2AgBaW1u5sdIgWmu8++67aG1thW1Hvi0tNZgAikwFFeVVotXkKKiACTJrI7oPERGNHsZ50VHLOI9RYoTFYjF0dfVAKwWjNQQTa0RE48LMmTMBIAy6qHGklJg9ezaDXhqWEMUngA478TMYJzr89NAyGKAm9yEiotHDOC86ahXnMbEWYfFEDG5/Gp7rIakUkCkbJSKisU0IgVmzZmH69OnwPK/RyxnX4vE4pOS5OiqDAILUVu61YOLnkB+WDeZrUGkmIGC0DyAx4nsREdHoYJwXHbWK85hYi7BEMo5tXb1I9afRPtxuJxERjTmWZbG3F1GTEEJAD0qiCVFeBVlwErQGlWZCwCjGjEREzYBx3tjBLdgIs2Mx+K5Cui8FzcmgRERERJEVVIsVVqyVk1gTAiOfCorsZFINwz5rREREdcPEWoRJy4IxGinXYWKNiIiIKMoEoAcltLKJrnLUqmINxgx7/JSIiIhqh4m1KBOAhEB/bxpG6WA6KBERERFFjhACukhyrKz4TQgYpWqxiGAQAivWiIiI6oaJtYiz4zZ6u3thNBNrRERERJFW9Cjo8B8mhABqEOcJIYLxCaxYIyIiqhsm1iIuHrfR39MP33XZjJaIiIgoogQAA5N3pDPonVZexZqu1QaqASvWiIiI6oiJtYiLJxJw0w5S/Q6MrsERASIiIiKqPSEKp3uWPbxAANrUpM+aqNWxUiIiIioLE2sRF4/bcF0P6XQamkESERERUSQFgwoM8vNqIqggGy65lvnYWkwGDZJ5ujbDEIiIiGhYTKxFnLRtGKXgpNIAJ4MSERERRZIAEDQ4y09oBcm24RNrqFFiTcjMJFIm1oiIiOqCibWIE0JAQCDV70D7iruPRERERFEkBIDCo6BBgmvo+G2g2q02FWu1StIRERHR8JhYizoBWLaNnu6+YCooJ4MSERERRU6Qzxp8FLRoEVupD65RMiy4FwcYEBER1QcTa00gHrfQ19ML5ftBco2IiIiIIkWIzFzQwZk1oLxKNGPKGnRQzjpMje5FREREw2NirQnEEwk4KRdO2uGUJyIiIqJIEjDIP/YpslNBh0msiUwCDjWqMgs+L2NGIiKiemBirQnE4zG4jotUf5oVa0REREQRVPI0Z5m904KPrVGVmRBsH0JERFQnTKw1ATsWg+/7cPpS0KxYIyIiIoqc4Ahm4fACY8zwPdaQOTVaw8Sa1hx6RUREVA9MrDUBIQWEAVJpF9rzGr0cIiIiIipmUHVacMKz/GmfteqLJoQEyjiCSkRERCPHxFozEIBlSfT29MEozeOgRERERBEjsmdB8y8G/19OgquWfdHCQQqNixm150J7bsM+PxERUb0wsdYk4nEbPd190Eo1NLFmyuwTQkRERDSeCCGC0QUmf3gByuydFgwcqN3wAmgTvDWAMRq+k4ZyHMaNREQ05jGx1iRi8RjSqTTctAOjGpdYU+k0lJNu2OcnIiIiiiRRfAOy3B5rqGFiDQCMQMMq1ozvA0rBaMWJ9kRENOYxsdYkEvE4vJSDVL/TsPHpRqmwrJ/HUYmIiIgGCAgYmKI5tHIr1qBrdzJAAA2J14wxUK4LIBjcoH32ByYiorGNibUmYcdj8H2FdH9/w3b+lOcGST2lYJTfkDUQERERRVHYYq0gMVak91qJG5haDhyoZc+2CphMnChsC0JKaM/jhiwREY1pTKw1CSEljNZwHDcor68zozW050JYFiBkkGRjzwwiIiKiQNhPbfB1U16uTAgAumaJNSFkMPSqzvGa9lxAGwghIaQFaG7IEhHR2MbEWpMQQkAKgb6+FLSv6h8k+cFuo5AWhGXB+H7DjqQSERERRY3IVKYVjdHKHV5QyyFRQgBGB291km0bImwrs4RgKqr2eByUiIjGLibWmoUA7JiN3u6+oJy+jiX1xmgo1wl2HoUIqueMgfa4+0hEREQEZAvWiiXVRHnJskzFWy2PggIIjpfWifI8GG2CSrXsMiwLmhuyREQ0hjGx1kTicQv9vf3w3PoOD8hOdhJWTpAkZTDEoEHTpoiIiIgiRQgEA0Crq1gDEAwvqFEiTGSbvtUpVhtoGzLo1wshYYyGbkArEyIionpgYq2JxOMJuGkX6X6nbgMMgslODgARlvMDGOiZ4XP3kYiIiAjITP8syIuV12NNCJEd5Vm79WTXVAfG9wGt8qrVgODrEkJkNmTZn5eIiMYeJtaaSDwRg+u4SKVSdatYM8qH8RWEbeddH+iZ4dZlHURERESRJwoTWaLcqaCofSJMADBq9GPGcCNW5G/EhuuQVmZaKDdkiYho7GFirYlI24ZRGk5fGroOgYkxBtp1AZjiQZJlBUMNGCQRERERBYmswYkxIaDL3BAVQO16rAHBMcw6TOQ0yodRCsKyi74/7M/L46BERDQGMbHWRIQQEBDoS6XqMl3JKAXte0MESVbQT4Mj1ImIiIgAFDkJKiobIFBuEq4cNZ80WsJQG7EDa5HQPo+DEhHR2MPEWjMRQMy2gsmgSo/6cVDteTDGQMjS/0yEtKBdBklEREREpshUTyFE+TGbELWd/C5E0LNtFGNGrfwhN2LDpVgWoFRdKuiIiIjqiYm1JmPHbfT3puB73qgm1oxS0J4LOagB7WDCyvbMYJBEREREAx599FGceOKJ6OjogBACd911V977jTG4+uqr0dHRgZaWFixYsAB//etf857jOA4uvPBCTJs2DW1tbTjppJPwzjvv1PGrqFyxzcZyK9YqSsKVd0PAjO4Ag3I2YoOliPD5REREY0lDE2vjNeAaiUQ8BiedhpNKj2ozWuV5MFoFu4tDyI5yZ5BEREREufr6+rDffvvhxhtvLPr+pUuX4vrrr8eNN96Ip59+GjNnzsRHPvIR9PT0hM9ZtGgRVq1ahTvuuAOPP/44ent7ccIJJ0BFuL9rYYu18ocXoMaJtSCZZWo6aTSX0bqsjdhwPTLTn7dOQ7iIiGhsMcaE7ai070G5LoxufEzQ0MTaeA24RiKWiMNNuXBSzqgFJdkgabikWlY4xIBBEhERRUg2+KLGWLhwIb7zne/gtNNOK3ifMQbLli3D17/+dZx22mnYZ599cMstt6C/vx+33XYbAKCrqws///nP8f3vfx9HH3005s+fj5UrV+L555/Hgw8+WO8vpyxBGqtweIEpM7ElhAB0bXuiGVTW460SYfw3TLVaSEpAa550ICKikozRmX7vPrTnQrkO/HQKXn8vvN4eeL098Pt64ff1QvX3RWIwztDNEEbZwoULsXDhwqLvGxxwAcAtt9yCGTNm4LbbbsN5550XBly33norjj76aADAypUrsdNOO+HBBx/EscceW7evpV7smAWlNFJ9qVELSrTvAVpB2LHyPkBKwPegfR9WPD4qayIiIirGGD2QiDB6IJmmNbRWgAHslhbIcl/TqC7WrVuHTZs24ZhjjgmvJRIJHHHEEXjiiSdw3nnnYc2aNfA8L+85HR0d2GefffDEE0+UjPMcx4HjOOHjuvaBDcaCFlwrO7ElRPDcGq5ZQGRixkTN7gkMTI8XQg45tCBvLULAQEB5LoQdK/vjiIho7AhiNhPEcMYA2gSDe7SC0XrgugGy21UCCNobCBG0HhACQgSvJ1EQ2R5rwwVcAIYNuEpxHAfd3d3hWzM13g/6Vxg4jgszCplZYwyU6wAVBkkQAtpzmup7SURE0RckyrK7ll64a+n394W7ll5fZueyvw9+qh/aSQebRMYAyq9pkoJqY9OmTQCAGTNm5F2fMWNG+L5NmzYhHo9ju+22K/mcYpYsWYJJkyaFbxs2bKjx6odWmFercHgBdG3/zda6b1uG8X0Y5Zd9wiFcjmUFMSyrSYmIxqz8+M3Nj9/68qvOvFQfVDoV9OzUGgICQloQtg0Zi8OKxSFjcUg7BmnZELL8XEW9NLRibShDBVxvvfVW+JxqA65vfvObNV5xvQjY0kJPdx+0r4JmsTX8R2V8D1AVVKtlVyWzQwwUhB3Zf1ZERBQxxXYts0cAgl3LnP5QOrNrGWxbhruVyNm5HEzzl/dIG/x3Vk5cM9xzLr/8cixevDh8vNdee9UtuWZQ7CgoMrkyg+EiNiEEtKntUVCROYpqtB52wEC5jDFQngOg+H93Q65HSmjfg1Y+rAqTckREFA3Z+C2M4TKnB4z2YdSg+M0UqzoTgAheA2TEkmTViHwGZKwFXCMmgFjMQk9PH7RSwW5fjYKSsFqt2iAp00BQMrFGREQZBYFXJmlglA6Cr/DYmwkDL5iBauggcWYFf7abP/CiwMyZMwEEm6SzZs0Kr3d2doabqjNnzoTruti6dWveJmpnZycOPfTQkvdOJBJIJAaOPdZ1V7vIKc4gsZU90jKMzBTPmlasSQGo2lbBGaVg/Mqr1bKEtKBdFzIWj1zVARERBcI2G3ogjstvt5ET42U+RqBI/DYOfs5H9ihobsCVq1TAVeo5xSQSCUycODF8a7a/6FgiBqc/DSdd2wEGRvmZirNqgyQZlm8SEdH4UarJbFju31fkuKabhlEKgAlK+q2Bcn8rHoeMxSBtG8KyIlnyTyMzZ84czJw5Ew888EB4zXVdPPLII2HS7MADD0QsFst7zsaNG/HCCy8MmVhrJAEUy6zBoIIqNG1qPGxADCS2a0R7XrCRXWUFnLAsGK04xICIqIGyfWmDGM4LYjjHgZ8aOK7p9fbA7w+ObA5utyGECOI0OxbEb7HxG79FtrQoN+CaP38+gIGA67rrrgOQH3CdfvrpAAYCrqVLlzZs7aMtEY9jW28/0v0pTFQaqEE/5mwD2uA/kCqDJGnBeF7Qb0NyiAER0Vgx1I5lWU1ms8c1q6iIpubV29uL1157LXy8bt06rF27FlOmTMHs2bOxaNEiXHPNNdh9992x++6745prrkFrayvOPPNMAMCkSZPwuc99DpdccgmmTp2KKVOm4NJLL8W8efPCoVVRVDSBVmYVWlCpWd5zyyWEgAaAGiXrjFbQngspqz8xkT3yqn2fg0WIiEZRXssNPVQMF7xGBDGcyHTckDw1UKaGJtbGa8A1UnY8Bt/xkOpPw2hVk3sGjQU9CKv6fxJCCBjBSU9ERM1mcJ+zIIFWRp+z4H+G7XNG49Pq1atx5JFHho+zbTjOOussrFixAl/+8peRSqVw/vnnY+vWrTjkkENw//33Y8KECeHH3HDDDbBtG6effjpSqRSOOuoorFixIrK9uTKHmvOER0EruUcNq8sAQBhAa1WToyrK82C0goyPbMpoeNIhnqhZ7zciovGo6IT0Ui03DGO40dDQxNp4DLhqQUgJozXS/emgz1oNaDco6ZcjDGyyk56MViNK0hERUe0U7XOmM+X/7HNGo2TBggVDJpSEELj66qtx9dVXl3xOMpnE8uXLsXz58lFYYe0JUaRiLXOt3OSaKNaobaSkqMkUTqM1tOtCjKBaLUtIC8aP9kmHWg58ICKqVrENUKNV+ScHmDgbdQ3NfIzHgKsWhBCQUqCvLxhJO1JGjbykP1yblJkeOz5khBNrQRbfh7Bs/oAhoqaXnzjL2a3MbTCrBxJnAPKCrqDUn0EX0ciJgqSYCAcSlH+PmverFQJaj3yavFF+MD0+NvLjm0IIGAT92mQseom1bL9IK9kS6ZiWiMaG/LYbA3Fc0I8yO4BmYANUZI8PlDEhnUYfXyWakQDiMRu93X2ZEs+R7abVqqQ/XJ6U0J4Lk4hX3a9ttBnfh5/qh0wkYCeSjV4OEdGwRtznTApAsM8Z0WgSAtBFhhegguEFQohMbFe7/06De2YS61X+9x9Oj5e1+xkiLAva94LhWRE6bWK0hu+kYTwvqN5tbWPlGhGNSMHpgWy/s7DtRs70ZlMqjrMYw0UUE2tNyo7bSPWl4DoOEiNIrBmtoT23psFMcBzUg/EVRCx6QYjRGsoJ+tNpJw1t2ZA2/1MgosYavsx/UJ8zkRNwsUcGUTSIEtVmZQ4vyN4DWgfHr2u2LgnAhzEaospOa+H0+FrGjNKCVgpa+ZFq46JcF0YFm87ac6HSKVgtrfzZSkRDGmoTdPDpgeJtNxjHNStmE5pUPB5Hb78Dp99B+wiOC2jfA7SCqOFEpoHSfheyBkcFak25DrTyIWNxGN+DSqe4E0lEo650nzM/U+pf2OessMyffc6IokxAFLQyC46CmgpOggporWGhhgms7ACFEfRu097IpseXIoTIxIzxSPwyqZUP7TqQMqgMkbEYtOsAUsJKJCOxRiJqjCFjOTXMJuig0wOSP0vGFCbWmlQ8FoPn9iCdSgVnrqtgjIF23VHJike1tH9wsAQ7FuxEOg6sJIMlIqreUH3OjFaZHctBO5UYPNKcO5VETU0ABoMza6goqZU9tjnSfmiDBT+WqowZlYL2vFGJ6YS0gqNQSkE0+ASBMQbacWCMhrSDvm9CSMC2g/jRsiAi2A+OiGqn6ITNoarOkI3luAk6njGx1qRkzILRGqm+4EhjNcJJTDWsVssS0gqGGESotD8bLMEAwg7WJISAtGPQngNpM1giotLKGhCQ8xwAJftjAOBOJdEYZXSR4QWooFgse5x0BP3QSty26sSa8tzM9PjRSKzJYOPT9xremsP4fjBMYdCwAiEtGG3gp1KwhWz4OomoerXsWctYjrL4qtCkhBAQRiCVSgWNVSsUNqAdxSbWQkpoNzql/cb3gn5y9uBgScJoBT+dRkxakaqwI6L6KVreHybOFHT2F92hEmdgfwyi8UwIAa0LM2im0h5rIzy2WfK+VSTWwn68o9gyIxh85cEkEg0bfGVM0IM3u57BpG2H/dZEayvEKCQZiWjkBvesLRwSMOi4JrJ7GOx1RtVjYq1pCcRsC709fdB+5ePTwwa09ugFBcKyYXx/1KriKmG0hp9OZ35AFgZLwrKhfQ/KSbM5LdEYVRBohX0xNIwpHGUOFEmcZYMtTtYkoiIEUDSxFgwGLf8oaFgZW9PFCWhVecwY9OPVoxrLCZkZfKUUhN2YxFowsGDomFXYsSBeTKdhtbQ0LAlINJ6V3AhVxeO54kMCeFyTaouJtWYlgsmgvT398D0PCa2BMiutwt5qo9CANm+JmUa52vMhG5xYU64DkxlYUEx4JNR1AcuCnUjWeYVENFIldygz/c2KDQcASpf3M3FGRBUTAjCFLToyP3kquEftK9aEkBUfMR3Nfrz5a8sOvvIaEjMapcIBBUN9ndl4UXkuhxkQjaJhp2sO23pDhj/neFyT6oGJtSaWiMeQTjtIp9Jo1brsI4xGK2jfg7BG/68/GGLgwuhEw6Zuaj8zsMC2hw2WYFnQThrastk/gyhicvua5TWVLVbaX7BDmT8cAGCgRUS1J4RAkYK14Be+SoYXjNZRUARVuuXGZPU8eRD05/UqWl8tZNujGK1hldFrVwgBadnQThpCSljxRB1WSTS25G2G6mzrDVXY5wwIrglReIJA8LgmRQczB00sloije0sKTn9mMmiZMY/2vEwD2joELVICvgft+7Di9R8MYIwJ+mUYU1YvDGFZMJ7K9M9oa1gykGg8yh1bXryZbGHiTGQbYwwu7WeQRUQNUHJAgKg8T1b7vJrIqdwt5/MbaM8NP3bUZWJG4/sQdYwZjfKhPbdgYMFQhJQwRgbxopQNP5lBFDVFj2tqA6P9kqcICmM6yeOa1DSYWGtidsyC8lVFk0GNVsFAgTo1XBVCwAgRTN2Mxer+y672XBjPg4iVH/CE/TNchyX+RDWUP758iClMwEAzWYCJMyJqIgK6WOLKRCCzFi6jvAEG9TzhAGSPgwoo34WoU8w4sAFbfGDBUKRlQ3se/FQKsVbJ4Vc07uTHdUUmpetifWsLTxEwpqOxgIm1JiaEhIFGOpWGVuUl1pTnwWgFWceydSGt4KiWUgUTOUeT0SoIlobplzFYWOLvOpCWBVHGsQCi8S5/Z7IwwCpInJmcxFmxKUzcnSSiJiRE8V5qpophBDUfXoDgZ27Riroi6nrCIUNYVnD8VKu6JPQGNmCri/WEHQy/8tMp2C2tPOlAY8pQfc7y4rpM743CPmfsW0vjBxNrzUwIxKSNnp4+aM8b9ulGa2jXrfuOmpASWvnQvle3vmXBDmTQL6Oa8nwhJYxW8NNpxCyLI9Vp3Cs5galoI1mgaIAFji8norEtOG5ZmLiq5ideuQmwiggBo/wyPrcKjkfWOf4RUga9cX2/oqOZ1Qg3YC2r6tekcPiV50JJCSvZwtc3ahpDDn1Sg1pwZE8SBIFd4YYo/93TOMfEWjMTQCxmo7e3H9offnx6MC5d1aUB7WBCymDnM16fIQa5/TKqDpYsO2ekeitfMGhMGypxlp2qOewEJjaSJSIqfhS0RMKtlGCAQe0Ta8FkUFNGzBj0QWpUzGiyMeMovpYox4VRGrKCdiHFDEyWD6aKcrI8RUXJ2E5pGBMkzwqmpYdDnwa14OBJAqIhMbHW5GJxG06fg3Q6jeQQRy3rNS69FCGtIEhSPoQc3aOVxuiq+2XkCgIlO/i+WRYDJWpqxXclM4mzIsEVUCJxJlnST0RUSjjRs+D6QOFHmTcC1OhUrEGrYDGieDWaMRrKdSBEZa00akVYFowa3Wmk2veD/r/DTIwvl5ASMJnJ8tIacbKOqFxDHdfMP01QIraTIvxZwGnpRNVjYq3JJRIJbOvuQbo3PeROqPG9uo1LLyY7xEB5LoQ9ug1plesGE6Vq8LUKIWEsGQRKll23o6xElRqynL/E9CWgdHDFxBkRUeVKJdaCirXy+uFmnz8aJ0Ez57hgtAlaHxVhfB9QjTnhAATfQ21McBx0FNaQPzG+dqcogv5wGn66H7ZsG/WjrDQ+5PatHdgUVSUGP2kYIXiagKgB+BO/ydkxG76nkEqlgoqTIowxUK6LRleZ1KMhrVEK2nEqHlgwlGDqkwvlpCBkGxvTUqjwl6dsf7HS18KUlhn0nLw/5j82hR8w0MdMZRJnuX0wSpbzy/CXKu5KEhGNjmCfo9hk0PKHEYhMiZsxpqr+bEPdN+/1YpCoxIxSWsFggVFoIaI9r+KJ8eUKjoS6UOkURAtjRhpeRX3OMkc5RabHGQc/EUUHE2tNTlhBDw6nP11yJ3SgnL6xDfjDhrTe6DSkDYLBNIzRsOzaHjcVdizot+Y6sBJJ7vg0obwdvpwG+9n3DTwRAHRhMsxUkCAzgx6XXFSR5wyMyhz6DqbYMU2LO5JERA2UTVwNTqwJIaB1BVM+hcg7vlVLBiUSf0Bmirtf90FXBaQERqGFiNG6qonxlRCx7DCDFKwke/SOd0X7nOlsD1u/+ImCUn3O+G+JKLKYWGtyQkhIIdHX1w9TYjKodt2g3L1UzX8dBck1F8bEa74e4/vQrjcqSTshRFC55jqQllX1WHaqj3D3L3sM0vehVaanTM4xyCBwGfzRougf8y7kPUXkv19k3z/og4tdy76LgRIR0ZgQ/Dg3hfkwgYor1oLftWufWBPITgZNFLxPe+6Ie9TWQtBCJKgukzWMuZTrwCi/pvccTAgBGYsFJyiE5IbsGJefOBs4thn0OVPQWgN6mB62nKxJ1PSYWGt2AojbEr1dxSeDauVD+96oHb2sVHAc1IPxFUSsdkFbuAMpRi8YFFLCaAU/nUbMsiDqPIKeSgv6TgRl81qpzJFjHQQ3CH6JEFICI5gSS0RENDyROcJfWLFWUZIs8/xSlWUjIkTR9iFGKWjPhbAavxELBDGj9j0YpWpSQad9P9ggrdHAgqEIIQGbG7JjhTE67G+WnzirZEAAhz8RjWVVZVtef/113HzzzXj99dfxgx/8ANOnT8e9996LnXbaCXvvvXet10jDsBMxpPrTcB0HCa2BnOBDex6MMZAR6fEghIBBsCNay4lJynWg1eg0uc0lLDs4EppOw2pheX+jmGzDVh0cWdH+QDUaDIIjHlIAIsZeYkREFWKcV72SlWYROgoarDFoep57ekB5HozWox5LlUtIC1opaOXDGmFizRgD7TqZgQX12RgV0oLRBn4qBVtIDsCKsKEmaxYMCMicfOCAACLKVXG25ZFHHsG8efPw1FNP4c4770Rvby8A4C9/+Quuuuqqmi+QhhePx+CmHaRT+ZNBjVbQrgsZscqq3B3IWtAqswMprTrsQApI24Z23eC4BI06Y0xmF92Dn07D6+uB19cDv78Xfn8ftOsBCAJlGYtDxuPBbnQd/j0QEY01jPNGSATVakXzYRVUoAWvX0EvpprLJu1y7m20zlSrRSxmFALadUdcuWd8L/j66pzckrYNGA2VTlU2FZZqKlthZpSC9r1gwISTht/fB6+3J3zz+3vh9/XC7++HdtJBgYLWmZMPFoRlQ8bisGLxIOa0Y5BWJuYcxb59RBR9FSfWvvrVr+I73/kOHnjgAcTjA2XNRx55JJ588smaLo7KE4vF4Hse0n390L4fXg92HlXQADZChLSCnUPlD//kYRhjgh4WBnULBoWQgCWh0qm87zfVhjE6c1zDhZ9K5SXSlJMKjoRAQFg2rHgCMpYNaqL175yIqBkxzhuZbGV+seEF1eSGcjdMayY8ZpqzGev7gPIj1+ZCWFamOr36pJTRGr6TzlQT1T9WEHYMWvlQ6fToHO0lAANDqoJBaS6U68BPp4LkWV8medbXA7+vF16qD34qlZM4w0DiLB6HFc8kzmKxYLPWYuKMiIZW8bbN888/j9tuu63g+vbbb4/NmzfXZFFUGcu2oZRCOuXBTzuwkknAGGg32HmM4otAdgdSxuIjWl/DdiAtO3jRdlIQkuPUqzVQeq9zhgz4OePEAQgZBPpC8FgnEdEoY5w3MtlXqcE91sLhBRX2WTOjsIEnhIAGBvpBGQPlOqM6KbNaQkhoE/QLrvYoZTCwQDXsiGtw2iGYFArJYQbVCgdTZY9l6syRTaXKO64pBSCCxDHjSSKqtYpfoSZPnoyNGzdizpw5edefffZZ7LDDDjVbGJVPCAEBgXTaCcrlfT/TzF1BRKRPxmDCsmGUH4xRr3KNRmv46QbvQPoelOswSCpTdjcRWhcfMpD9u7QsBj1ERA3AOG+Ewt5oRa6jsJJtyFtJCa38gsFUNWEGquGCeEzVfZOyXELKoLIokag43qtnu5ChCCEAy4Z20hBSwooXTmSlwb3Ohp6uaYDMdPecPmecrklEDVLxK+iZZ56Jr3zlK/j1r38d7Hhpjf/7v//DpZdeis9+9rOjsUYajhCISQvdPX0wSkG5btDIPcIvLEIIGG2gveoHDtRjZPpQhBBB5ZrrBEcRaziMYazIGzLg+9AqZ8gAkKlGk4BgIo2IKAoY541McOSzsJeaCErWChNuQ91LChgVTL1GjdtdCCHC45XadQGMQvKuRoSsbqJ8tl2IMQbSbvwRVyEljAlaiQgpIzMkop5YdUZEY1XFibXvfve7OPvss7HDDjvAGIO5c+dCKYUzzzwTV1xxxWiskYYjgFjSRn9vPzQE/N5eyESsYQmncgVDDFwYnaj4KGU9R6YPRUgJoxX8dAoxS0auN0k9BVWSQSJNZ6oRjR4YTx7sJIrM8WQenSUiiiLGeSMjgExBTbGjoJVVrEFKmGwPqFr3kRUifL3WvgdhRbNaDciZKO9XNlHe+D6050FG6GsLWol4QdzYIiM3LKIWssmxolVnKps4G6g6E8GRBVadEVFTq/iVJhaL4Re/+AW+9a1v4dlnn4XWGvPnz8fuu+8+GuujMsXiMaR7U3B9H8ZTiFsSIh7xFyQpAd+D9n1Y8fKTgMYYKCdd15HpQxGWHRwJTadhtbSOm0BgoBpNw6hMb7RsIk1kjnVKCdisRiMiahaM80YoW7FWcFmE+YTyb5WdDFr7AQZCimBYUGbipox4r1ghLWjPh0mosmI/o3UQKwpErg+usIO40U+nYLe01mV9hQndYtWTJu//gj8WXhv0hLzEWV7VmRm4Q7Gqs/ESLxPR+FD1Fs5uu+2G3XbbrZZroRGIx+Po7u1Cqi+FWFwGR+4iTggBIwS050DGYmW/wGrPhfG8yBy9DJrS2uEQhbHYNyNvyIDKSaTlDhmQmYo9i0MGiIiaHeO86kgpoWGCypxcmeEFlU6FFAC0r2DVOrQQIuh36nuQEdikHFZmM9b4CiI+/HqV50Kr6tuNjKZwmIHvQTnpYChDmOca9O/DDFzL+7djAEAXebop6PFXmBwbfJ8in7eYnLXkXjOCVWdERBUn1owx+O///m889NBD6OzsDBpJ5rjzzjtrtjgqnxWzYJRC54Z/YNJuO8B4wTG8qO3SDSZksO5ym+YarYIdyIhNrhJCwkgJlU5DSKvqyVWNkl+2n+l3oXV4tDObWAvL9jlkgIhoTGKcNzJSiGADyuR/34SQRXuvlXHDUZkMCoiBzbEIJp8Gy27GKs+FGGYz1igF7TgQEYsVc2X79CrHgXad/PzW4CWbbMVX3h2K/nGo94nwgRj4v8Ib5zyl+Pcuqt9TIqJGqvi3/4suugg/+clPcOSRR2LGjBn84RoRUki0J5Po3PAudpo9C0kEfSWsRLSrp7ITr8oZox4cAXVgtI7kDmTQN8OFclIQsi0ySc1so9hwpzyv34UubBari5TtCwFICxCsRiMiGssY542MkALaGKhBCcng6KWBGVzJNuz9ZLABWePJoNm+ZVFOPg0WbMb6MFqV7AlnjIFy0zBGw7Ij3mtYyopaoRARUXRVnFhbuXIl7rzzThx33HGjsR6qlhBoaWvBu1u7sHVbD2ZN3w7KdSOfWANyxqjHhx5iYJQP7bnBBM6IBoEiW9rvOrASybqss2DCUqbyLEiYBf0ukJNcA5CfOMOgsn07mt9bIiIafYzzRib7um908cq0SvulCSHDfqa1bnQf9SFXgwkpg+FVvl9yIEEQK0ZrYAEREY19Fb/qTJo0CbvuuutorIVGQgBWTCJhS6z/+yZM3347CMeDblWQEZ84JKQVTL1SPoQsHuQZo6HS6aAcPiKVYMUEpf1WMLHUsmvSB67wmKaB0WrQMc38CUtAsYoziTCJRkREVATjvNoYfIQ2q1TCrSQpYDwNKA1EPJ6rh2Az1g02YwfFM8ZkBhZEPFYkIqKxp+JXnauvvhrf/OY3kUqlRmM9NAIyFkNbWzu2vrsNXT19wdEBz2v0soYlMskf5bkle48o1w0Sb03Quyw7rcpPp4IE2BCyRzKNUsEurOdCuQ78dAp+fx+83p7wze/vhd/XC7+/DzqdDqr8tA5aZEgJYdkQdgxWLA4rFoeMxSHtWJDgkxaEaJ7jHkRE1Bj1jvN838cVV1yBOXPmoKWlBbvuuiu+9a1v5SWmjDG4+uqr0dHRgZaWFixYsAB//etf67K+ahgAumgCTUD5lQ2XGpgMGv2hVPUgLAvIDFEaTHsejN8csSIREY0tFSfW/uVf/gVbt27F9OnTMW/ePBxwwAF5b7U0FoOt0RZPxmBcHxvXdwZNXp3SyaooEZYF4/tFA8dsE9qoDSwYirDsYNBCOg2jVdhHLjdx5vX3wuvrCd+ySTM/1Q/tpKH9bOJMBIkxy4aMx2HF45DxOGQsBmnbEJYV9khplu8PERFFUz3jPAC47rrrcNNNN+HGG2/ESy+9hKVLl+J73/seli9fHj5n6dKluP7663HjjTfi6aefxsyZM/GRj3wEPT09NV9PLQghilasCSmgvWoSZKIppr3XQzbO0YMGOkR1uBUREY0PFW/pnH322VizZg0+/elPj3pT22ywdcstt2DvvffG6tWrcc4552DSpEm46KKLAAwEWytWrMD73/9+fOc738FHPvIRvPzyy5gwYcKorS2qpG2hrSWJ9/6xGX07d2CCRNkTNxsp7Jvh5ffNaKYmtLmy056062aCvxL9zbLJMMGx5ERE1Hj1jPMA4Mknn8TJJ5+M448/HgCwyy674Pbbb8fq1asBBHHAsmXL8PWvfx2nnXYaAOCWW27BjBkzcNttt+G8884ruKfjOHAcJ3xc9w1GbaBNicRaNRM+pYCusNJtLMs7Dpo58hnl4VZERDT2VZxtueeee3Dffffh8MMPH4315BmNYGs8aGlL4N33urB5Sxfak9tDue6wEzejIEiuuTAmDiGCQMn4HrTbnE1ohZRAzM5k0oJfTJg4IyKiKKtnnAcAhx9+OG666Sa88soreP/734/nnnsOjz/+OJYtWwYAWLduHTZt2oRjjjkm/JhEIoEjjjgCTzzxRNFYb8mSJfjmN79Zl/UXJQBdZPqnkBJam4onfAopAT8YRsTeYQh6xub05s2eCIjycCsiIhrbKn513mmnnTBx4sTRWEuBww8/HH/4wx/wyiuvAEAYbGUnVQ0XbJXiOA66u7vDt2Y4KlkJGbORiNnY+PdNcH0F3UTHQaEUTGZX1mgN5TiAaN4mtEJIHtMkIqKmUc84DwC+8pWv4JOf/CT23HNPxGIxzJ8/H4sWLcInP/lJAMCmTZsAADNmzMj7uBkzZoTvG+zyyy9HV1dX+NbR0TG6X8QgQgioIkc3hRAwSsMUSboNeT8pB6Z8U9ibV3tecLLBSQPGNG2sSEREza/iV6Dvf//7+PKXv4w333xzFJaTbzSCLSDYyZw0aVL4tmHDhtH7IhpACIG2thZ0benC1u7ezBHLJhliAED7LgBAuQ608iGasFqNiIioGdUzzgOAX/7yl1i5ciVuu+02PPPMM7jlllvw7//+77jlllvynlc4AbJ01VcikcDEiRPDt3pvbEkh4RetWBOA0SUnhpYkBIw2TKzlEJYVVKo5aRjPh+ARUCIiaqCKMxaf/vSn0d/fj9122w2tra2IxfJfyLZs2VKzxeUGW3vvvTfWrl2LRYsWoaOjA2eddVb4vEqCLSDYyVy8eHH4eK+99hpzyTU7GYfVLbFp/buYNmkCtOfBike/R5mwLGjPg7ZcaNeBlBYrvYiIiOqknnEeAFx22WX46le/ik984hMAgHnz5uGtt97CkiVLcNZZZ2HmzJkAgs3UWbNmhR/X2dlZsLEaFUIK+F5hLzUhJYwGjKrsFEE2DmJibYCQElr5UJ7HgQVERNRwFSfWsj0v6mG0gq1EIoFEIhE+HosvxlIKtLUGQwx6dulALBGHaWmJfJm8kBa0UlCeC2gDEbcavSQiIqJxo55xHgD09/dDDopNLMsKq7rmzJmDmTNn4oEHHsD8+fMBAK7r4pFHHsF1111X17WWSw4xFdRoXV2CTIiwVQYFhJAwWnFgARERNVzFibXcSrHRNhaDrXpKtiTQ/W4fOt/dgskTW4OqtZyEYlQJEUx7kjEGSkRERPVUzzgPAE488UR897vfxezZs7H33nvj2WefxfXXX49zzz0XQLD5uWjRIlxzzTXYfffdsfvuu+Oaa65Ba2srzjzzzLqutVxCCHilpn+K6irPgtgo+m096qkZBnMREdH4UNYrUnd3d9jItru7e8jn1rLh7VgMtupJ2BKtySTe3fgeduiYBiuZbIrEmrRtGMMjoERERPXQqDgPAJYvX44rr7wS559/Pjo7O9HR0YHzzjsP3/jGN8LnfPnLX0YqlcL555+PrVu34pBDDsH999+PCRMm1HQttSKlhPJLJM9M8YmhZdw0rHaL+ukDIiKi8aasxNp2222HjRs3Yvr06Zg8eXLRhEe2r1mxKUjVGovBVj0JIdDalsS7W7qwtasX7W2t0EpBWtE/XsmkGhERUX00Ks4DgAkTJmDZsmVDHkEVQuDqq6/G1VdfXdPPPVqEEMEUz2I9f0V1iTUhBbTPxBoREVEUlZVY++Mf/4gpU6YAAG6++WbstNNOsAYlZ7TWePvtt2u6uLEYbNWbFbMRtyxsfKcTM6dORszzgCZIrBEREVF9NCrOG6ukFFDaQCkN287/PgopoUsdEx2CkBLQBkbpKhq5EBER0Wgq66X5iCOOCP987rnnhruauTZv3oyjjz667r05aGgiM8Rg23td2Nrdi3h7K2QiwYowIiIiAsA4r9aklPC1zvQEHpxYE1Be9VV/RnOAARERUdRUXEtetKwdQG9vL5LJZE0WRbUVb0nA+Bqdm7ZAuy5MjY9xEBER0djAOG/khMhM/zRFJoMKAeNrGGOquTE0J4MSERFFTtnF5IsXLwYQBARXXnklWltbw/cppfDUU09h//33r/kCaeSkJdHWksC7nVvQvW06prS1cZISERERhRjn1Y6UAtoAqkgvNZEdQqA0hF1Zaw4hJYzvl0x+EhERUWOUnV159tlnAQQ7mc8//zzi8Xj4vng8jv322w+XXnpp7VdINdHSmkTP5q14b0sXJk/bDqalhUEZERERAWCcV0sDFWuFVWlCCmhloLWGRIU9b6UMeqxpzX65REREEVJ2Yu2hhx4CAJxzzjn4wQ9+UPNx6zS6ZMxCSyyGf2zcjB12mA67rRVWTtBMRERE4xfjvNqRUkIbXaJiTcC4CkZVfhRUCAlt/GAyKBNrREREkVHxecCbb755NNZBo0wIgda2VmzZ2o0tm7ehbfIkJtaIiIgoD+O8kRNCQGtTomJNwhgDowuTbsPeVwqgyo8lIiKi0VPx8AJqXnYiBktIbNz4Htz+FAMzIiIiohoTQkAAmamgxVUdgxkEx0GJiIgoMphYG0ekFGhvbcGW97rRtbUL2vMavSQiIiKiMcdg6MSarjY5JiW071f3sURERDQqmFgbZxItcWjXwz82bYZy3EYvh4iIiGjMGapiTQhRdWItdzIoERERRQMTa+OMtC20JuLo7NyCnq1d0Eo1eklEREREY4oGoHXx5JcQouqqMyEzE0fZzoOIiCgymFgbh1raW9Df3Y/3OrfwOCgRERFRjQ1ZsSYltFf9UVBjDMDEGhERUWQwsTYOWbaNRMzChg3vIt3bx+MERERERLVkhqhYkwJaqariLyEyk0E5wICIiCgymFgbh4QUaGttQ9e2XmzpfA+GTXCJiIiIakYIAVWi3YaQEkaN7DgnW3kQERFFBxNr41QsGYNQGhve6YTPIQZERERENSOEgOcV37gUUsAYA6OqPDGQGWBARERE0cDE2jglLYn21hZseXcbtm3eyia4RERERDUipYDWpSrWBIzSJXuwDSeoeKvuKCkRERHVHhNr41iyJQEn5eEf73RWPZ2KiIiIiPIJIeCXiK1EZgBBtX3ShJTBZFAeByUiIooEJtbGMRmz0JKIYdOGTvR39zZ6OURERERjgpQSvj904qvq0wJCwGjD0wZEREQRwcTaOCaEQFt7K3q6evHexncZoBERERHVgJQCapiKNF1txZoQyIwdrerjiYiIqLaYWBvn7HgMcSuGd97cADeVbvRyiIiIiJqeEBJK6ZJ90ARE1Ym17B04GZSIiCgamFgb54QUaGtrxZbN27Clc3Ojl0NERETU9GRm8mepqjUhxYj62wop2R+XiIgoIphYIyRaYtCexsa3NzBIIyIiIhohIQSM0TBmiMSaN4KKNSlgfMU2HkRERBHAxBpB2hba21vRuaET3Vu7Gr0cIiIioqYmpYTWBrpE4ktICa1UyaOiwxFSAkYzsUZERBQBTKwRAKC1NYG+njQ63/lH1UEeEREREWUq1rSG1iV6rEkJo0aQGONkUCIioshgYo0AADJmIxmP45233oHTn2r0coiIiIialpQC2gxVsRb0YDOqyoo1IQAAZkQDECrj9fXDT3PQFRER0WBMrBGAIEBrn9CGrvd68N6m9xq9nFFnlILb3Q3luo1eChEREY0xQojMUdBSFWsCRumSibcyPwlMnXrjGmOgXReqPwXDaaRERER5mFijUCwZhwVg/RvvQI3xIQa+48BPpeF190A5TqOXQ0RERGOIlDJIRg3RYy2oWKs+sVbPyaBGKRiloDwPPuMmIiKiPEysUUhKgfYJrXh347vYtmVbo5czaoxS0GkH0rYBCHg9PfDTafaWIyIiopoIpoKWTqxljahHmpQwuj4DDIwKJpBK24ZKpVm1RkRElIOJNcqTbGmBm3Kx8c0NjV7KqFGuC+35ELYNGY8BwoLX0ws/lWJyjYiIiGpCAMMm1vRIKtZEJrFWhySX9oPPIWwbRin4aVatERERZTGxRnlkzEJLMomNb21Ef09fo5dTc0ZrqFQawrbCxr8yZkNYFvzePvj9/UyuERER0YgZGJgSPdYAQECMLLEmBWDqMxlUuy6EDGInYdtQ6TQ0q9aIiIgAMLFGRbRNaEX3lm14r3PsDTFQjhNWq+WStg0Ri8Hv64ff18/x9URERDRiaoh4QkhRkx5pox2zZPurwQp+bRCWBeMrKE4IJSIiAsDEGhURS8QQt2N4+9W34ftjZzeyWLVaLmlZkLE4/L5+eL19TK4RERFR9YwY8iiokALaG2GsIUZ/gIHO9FcTMpNYEwIiFvRaq9fwBCIioihjYo0KCCnQ3t6GLRvfxeZ3Nzd6OTWjHLdotVouYUnIRBwqnYbX08vmvERERFQdYaCHOgoqZZC0GkELCiEFjD+yewwnGwvlbkpK2w42LNlrjYiIiIk1Ki7RloRyFDa+uWFM9BwLqtVSJavVcgkpIeMJqLQDt6eXPUSIiIioCgJqiBhCSAGjRjbVU0gZJL5Gscpeux4gC39lELFY0GuNVWtERDTORT6xtn79enz605/G1KlT0draiv333x9r1qwJ32+MwdVXX42Ojg60tLRgwYIF+Otf/9rAFY8N0pJoa0ti09sb0NPd2+jljFg51Wq5hBSQyQS068Lr7mHQSERENErGaqwnpRiypYaQEsYYGDWCDczsPUYpsWa0hvb98Bho3qe2LBit4afYa42IiMa3SCfWtm7disMOOwyxWAz/+7//ixdffBHf//73MXny5PA5S5cuxfXXX48bb7wRTz/9NGbOnImPfOQj6OnpadzCx4jWCW3o29aLzg2djV7KiFRSrZZLCAGZSEB7XpBc87xRXCUREdH4M5ZjPSEElCq9MSekgNFmyD5s5XyO0ZwMarL91Syr6PtlLAbtOIyRiIhoXCuvfKdBrrvuOuy00064+eabw2u77LJL+GdjDJYtW4avf/3rOO200wAAt9xyC2bMmIHbbrsN5513Xr2XPKZYcRtJ28I7b7yDnXbdCYlEvNFLqkq2Wk0mExV/bJhcc1243T2ITWiHFW/O7wMREVHUjEas5zgOHMfJu0cjSCmhMj3UVH8//J4uCBjEp2wPIFOxpjWMKp4UM1oDxkDI4kmtXNpXsCoPc4a/r1LBGkpsTArLgvY8+Kk0YrZd0QYmERHRWBHpirXf/e53OOigg/Av//IvmD59OubPn4+f/vSn4fvXrVuHTZs24ZhjjgmvJRIJHHHEEXjiiSdK3tdxHHR3d4dvo93w1XvvXew0KYGYaK4pk0IItE1sx7ZNm5t2iEFYrWZVVq2WSwgBK5GAMQZedw8b9RIREdXIaMR6S5YswaRJk8K3DRs2jMrau7Z147abf4Obb7odq+64B7fcuBL9b3XCXb8Zzpv/gJQSluug67k16H3lRfibO+Ft3VwQdw6uNlOuA2dLJ9ytnfD6y6jKkxJmlFpWaM8DhomfZCwG7TqjtgYiIqKoi3Ri7Y033sCPf/xj7L777rjvvvvwb//2b/jSl76E//qv/wIAbNq0CQAwY8aMvI+bMWNG+L5i6hVw9ax7E4/+5Bf49hX/gS98+6d45flXRuXzjKZ4SwuENnjnjXdGdFShUZTrBr1BYiMvzrTicUAIeL098FPpMTHUgYiIqJFGI9a7/PLL0dXVFb51dHSMytq7u3pw7dX/gR/fcDPu/9+H8dDDT+HdR5+H+/omOOv+AQBwtckfLKA1zKBjkyZncqjX243Uprfh93UDxkA7KRg99BAlIYIBBrWOS4wxMJ4/bMWcsCwYDcZGREQ0bkX6KKjWGgcddBCuueYaAMD8+fPx17/+FT/+8Y/x2c9+Nnze4EokM0TJOhAEXIsXLw4f77XXXqOSXPv25T/AvU8+Ez7+/UNPY+7B86DQPGXy0hJoa02i8++d6OrqwXbbTWr0kspmtIbqT0HI6qvVBpOxGLTnw+vthdEadmsLjz0QERFVaTRivUQigURi4FzkaL1Ot7W3FVxzfB/xzKAk6Ss4MQvCtvOquXQ6BZlpKyEgoHMGHNgtrXAgAAwkqFS6H3brhJLrCCaD+kP2QquGUQpaK0g7NuxzZTwG5Tiwkgm2zCAionEn0hVrs2bNwty5c/Ou7bXXXnj77bcBADNnzgSAgh3Lzs7Ogp3NXIlEAhMnTgzfRivg2muf9+c9fn1TJ/6x7u1R+VyjKdneAre3Hxvf2tjopVSkltVquWTMhrBs+H198Pv7uTtLRERUpdGK9eqhvb214Fo6txrNU9AakK35CTjlpMI/C5mfWBOWDbu1Pf/5qd6hY43MEASU6NVWLeMrQJmiE0EHyz5HpR3GRURENO5EOrF22GGH4eWXX8679sorr2DnnXcGAMyZMwczZ87EAw88EL7fdV088sgjOPTQQ+u61mI+segsTGptybv2u3ufhEBzBRxWLIbWRBwb396A/r7U8B8QAUFvtXRNq9VySduCjMXg9/XD6+0btWlcREREY1kzx3rxRBz2oM07JyexJjwNYzRkS34CTqfzE2vKyz/qGWvPPx1glIJ2S/d3DeIcM+yR0Upp3x+2v1ouGQuq1jghlIiIxptIJ9Yuvvhi/OlPf8I111yD1157Dbfddht+8pOf4Itf/CKAIJBYtGgRrrnmGqxatQovvPACzj77bLS2tuLMM89s8OqBlvZWHLfgn/KurXntTThbtjZoRdURAmid0Ibuzm14r7M5hhho14X2vJpXq+USlgUZj0P1p5hcIyIiqkKzx3rtg46Dpv3cijUfWhuI5KDEmpMOYwYhJfSg/mgykYSI5R+nVKneYVYiggmeNWKMCeIoq/xfFcKqtVSKVWtERDSuRDqxdvDBB2PVqlW4/fbbsc8+++Db3/42li1bhk996lPhc7785S9j0aJFOP/883HQQQdh/fr1uP/++zFhQuleFPX0ua/+PyTsgeSOMQb/c+8TQJNVrdnxGGJC4O9vvAPPi/bUJ6M1/FGsVsslpIRMxKHSaXg9vTA1DGqJiIjGumaP9Vrb8k8mOLkxkusHRzQTyfwPMiasQBNSwCidtzknhCioWtNuGkYNEX8NOlI6UkYpGKWGHVxQsIxYDMrxoF23ZmshIiKKukgPLwCAE044ASeccELJ9wshcPXVV+Pqq6+u36IqMH3nHfCh/fbGg2ueC689svYlnHLaPwPJwt4cUSVtibbWJLZsfBdbt2zD9BnTGr2kkrLVajKncfFoCpJrCSgn6CsSa2+DtCP/nxYREVEkNHOs1z5hUMVa7jFI14fSCkYIyEQS2kmH79LpFKxkSzB4wFcwygA5OSy7dQLcbe8BOZVffqqvIOGWJaQEfBUMMCijJ9pwjMrcK1bZBqWQEhACfioNGY9zwBMREY0Lka5YGys+cc5peYGF4/t47KGn0WxVa/HWBIzj4fWX30RfX3+jl1NUtloNUtY1mBNCQCYS0I4Lr6eX/UWIiIjGgbZBAwwcPz+xppWG7ytYgwcYZPqsZSvW9KDBA8GmXcugj+krecRSSAljVM3aUmSr36qJpWQsFmxysmqNiIjGCSbW6mC3+Xthv11m51373yfWwq5xk9nRJm0bE9tasGVDJ1792zo4TvQCprBaLTb8aPhaE0JAJhPQnh8k11wm14iIiMaytrb8xFo65yiodnwYAL7vw2rLT6zpMLEmg35mfuExT2vwyQatoZ0SQ6REMBnU1GgyqPa8io+BhkuRApASfn+K/WeJiGhcYGKtTj50yL55j7f19eMvf36+QaupjpACdjKONmlhwxvr8carb8GvYT+PkWpUtVquoHItDq0U3J4eqAgmH4mIiKg2Bh8Fza1Y044HwMDzfNiDKtaM5w70TBOAcgsTa9KOQdj5G4Uq1Vd0HUHcI6Cc0tNDy2WUgvEVUMHggsFkLAbteYyDiIhoXGBirU4mz5iCOdtvn3ftdw89Dds0106eFYvBti0kjcG6V97CW2++E5nJT42sVsslhICVSMAYA6+nB15/P4caEBERjUEFR0FzW0H4ClAayleQLS3BmPUc2eOg0rLgpYsnoOzBE0U9B9ovXhEvYnYQCxWpfquEViPv1SaEgLAs+H19NUn2ERERRRkTa/UiBD5y+AF5l95+dzP+/uq6Bi2oOkIGFVm2JZHwNV7/25vYsP4fjV5WJKrVBrPi8eAoRG8fnG1d8Pr6oZlgIyKqO2NMZDaBaGwpPAqan/SyFJB2XAghIeL5Q5V0TmJNuV7RGEEmWgCRH66XqlqTlgWjNdQIe5sFm4FmxPGUjMUAIeD19DK5RkREI2KMgVY+VDoFr7cbzrYtSL/7D6Q7N6H3zdfg9fU2dH0cXVhHe+63J6Y+8H/Y3Dvwl373/X/CF96/KxSikQwqh8wcCUXKgU6l8eqLbyAej2P76VMatibtenWdBFouadswlgXjK/i9fVDpNKxkAlYiwcmhREQ1YIyB0QrG86B9H8YP/l/7XvBnz4VRChN3nwu7pXmmcVNzaBt8FHRQcsxSBq4bJJVkIgk1aDIoAEjbgpfyoTwFaeX3NRNCwGppheofiB1Vug92+0QIUbg/LiwLOu3AJJNVV5xp1wNqMFkUyA4y8OD1BOu3IhanDcUoFcSW8XhNJq1S4xmtgzelgqEhngdh24i18bWBqNGMMTCZ+E37Xiauy/8zhtgk1W4aaGuv44rz8Tf7OpIxG0d/YH/88o+Ph9fWvvE2ujvfRdv06Q1cWeWklLATcZiUi/S2Hrz60htIJGKYOGlC3dcSVKulIlWtlksIARGzYWwLRin4vf1QqTSsZBJWkgk2IqKhGKUygVU2aRZspGQTaEb5QwZaWdp1ASbWqMba2vIndzqDBlMJpeA4QRWbTCSR+16VTsMYA2lJGK2hPR9Ixgs+h5Vsz0uswRiodAp2S1vBc4VtQzsOtOdVlcQyWkP7fk0TSTKem1wTsBKFX2PUaH9gEJWMx2C3tgQJtgjGmVTIGAPkJNG0UpnXEAVjNKANYAADAyuZbPRyicaF4PWleMIs2AwdYRuDBk+i5m/0dfbBIw7A7x57CqmcowL/c9+TOP0zJ8E0UdUaEOyw2gkbybSPbZvew6svJzB3n93R0lrfF6ioVqsNJoSAsG3AtqF9Bb+/P6hgSySCBFuDe8ONddlfWpTjBL/I2DakbUFYmTcGy0R1lw2ytOfmBFd+xUmzcmiPTdSp9traBw8vyP/FQPoavufD9xVkYlB8pBWM54ZHRIsNMACC6ncZT0C7A8cpVaq3eGJNCEAIKMetKhFkMv3VZLy2yS8Zj0G5bpBcE+1Bu4yI0l6QBNS+D5lIQPse3K4eWMkE7JYk47WICaqWB6rQgooXP/iz0ZnXEBEki6WAtGJh4nikx6aJKGCMyQy+GbwBmk2g+TB6dFsiMbE2ziQmtOFD+87F/WueC689/peX8bG+Xsi2+ld7jZSMxWAbg5a0waa31iOeiGHPvXZDLF6foCPq1WqlSNsCbAtaKfipFJTjBL3rkkkI226qryXqtO8Hk8nSwQ4+Mr906Ey/FyEFhLQgbBsyZg8k2prs3xRRlIS/6HgDAVb2aKZR2V96FFDHAT5MrNFoaJ8waHjB4B13T8FXGkopwLIBywJyjovqdAoynoC0LfglBhgAgNXSnpdYyx5zlrHCBJW0Y9CuA+MnISpMAmmlADPy/mrFWPH4QHJtQjSTa8px4fX2BsnFRCI4ihuPB73r0mlo14XVkgzitUHHdmn0FRzl9H0Y3w+vwwCQmSSaJSElY2qiWgiOaeYmzfyCBFqtNkLLIWwb0o5B2jFASlgtrYhPmFS3z18ME2sNcNRRH8Qfnn0eSge/UHhK4eE/Po1/PvFIoMmq1oQAZDyOmDZo9RXefvVtJJIJ7Pa+2bDqEHBorzmq1UqRlgVYwRFRlUpDOw5kPBEEbDEGA9Uyxgwk01w3mG5mWWGQnPfcTDCmHRcqHfS+EVIGybVssk3K4O+KyTYax4wxQGYIQJA086F9NwiulDfwC46qf9IsJK0gUW4N/L92PSSnTUN8cuP6gNLY1VowvGBQcsz1oZQPz/MREwIykYTuHxg+oNIp2BMnQ1oWfNeDVhrSKjyGKeNJQFpAzo6/SvVCxgr/XQtLQnsGynUrrq4KN6BGSZSTayqdhtfbB4PCXnBCSljJZHDioK8f2nGD46FF4goaufyjnBpa+dC+Co6KGQ2jM7/AC5mJ2WyImODfBVGVgpM9A5ugeX+uwTHNiggBaccgYrEweZb350FFKMpzYbe0woo3Nh/AxFoDtM/YDgfuNgd/fvX18Np9f3oOxyw8HL4dnQCjXEIAViIOYxy0+AZvvLwOiXgMs3fZYVRf4IzW8Pubr1qtGGFZsLIJtrQD5Th5R0Sb/eurF60UtOsFu8pe8AIgYvaQgbuQQVCW/WkYBHNBM3SdTkOlskcIRJCci8Xyj5CyoTE1sdxkGbTOP1ITBlbB0UyjVfDWqKSZkDkJM7sggQZZ/Ei3r3thJVrYz5JGRfugo6BpN38qKFwFrTR830cMKEisDR5goD0f0ip8zRJCwG5pg9/XHV5T6RTsdl30dUhYNnTahWlpKft1yhgD4/kQcnQ3Rq14PKgMi0hyzRgDP5WC39cfJNCGSEZK24KxJIznw+3ugZVwYLW0NPxraGZ5rztaw/jB0Ij8o5wI4n0pIawYJGMvorINeUwzOxRA1y+uE9IqkjSzwz+LEvFc1DHKbAAhBI496pC8xFpPKo01T/0F+x12IJqtag0IjtPZyQRMfxo65eG1l9chkUxg5qztR+1zhtVqDc5O11KYYNN6IMEWj8PK9PRoxh8yoy2sTnNcaMeF0T6EtDNTvCr/fgkhAEtA5FQMhEFfNpkLA4jgqIGwrcwLQ84RUgZ81EC5SbIwaRYmz8ygY5kKWitAZZJmRtU1uAoJASHtvESZkEFFb3idP/8ogtoGHwV1XGhjIDP/XrXjwQDwfQXYEjKZP+xAO+ng2GFmgIHy/GDyehFWMj+xBphgQmhrYSsRYVvBEAPXg5UsL04ymZ8Dwh79dh5WYiC5JiZMgKxTC5HBjDHw+/rh9/dnjhYN/6uREAIiHoPRNpTrQnkerEQyqGDj8dAhmZwqNKMVtJd7lNMgN77iUU6i8oTHNAdVmQX/fTXimGYmaRazB/6cU3U2Vn9PYmKtQWa+byfsPnMmXt20Kbz2u4eexsGHHQC3CRNrQCa51pqE6U3B6e7Hqy+9jng8hilTJ9f8cwW7i+nM7lVzfr+GEhw5SARBtutCOS6sRAxWMsmpVBlGKSjPC47Q+kGDc2HHIGPJmn9/hAiq1WBZQCb2N9qEAxG0Exz9EVJACCtItsUzOy6WZFKARizoHVOYJAseZ39J0dBKBUcxfQVj/PAX5SDRpjNJs/oFVwFRWFk2uOJsjAZZNPa1DToKaoyB6/tIZqqejONBGBP0WLNl0dYV2knDykysLTXAAECmpUELtJMKr6lUH6yW9oLXmGCIgYTvpCET5cUNxlcw2tStGihIrjnwenoRm9he96EARmt4fX1QqXSweVlhUkxIASuRyLTzSEG7wfFQK5HgzzQgrwote4wzeG1SPMpJVIEgCZ17TNPPO7JpVJ2PacZieQmz3MfjuVc4E2sNIqTERz98MF791d3htY1btuG1F1/F7Ll7NHBlIyOlQKw1DvQ76Hl3K1792xuYu+8emDChcHLVSGjXhXbdMVWtVoyQMgjatIZyfSinGzIeD6dSjbfALdiR8aEcN5ju6atgR7MB34vs0ANgIBAP+7W5HlQ4HCETNMYyJc4W+7XRwBHMvGSZziTJwgrJ4P+hdVBpphVggmNl0PkJsyDxpuq6I5lVUFmWd0TTDqoP+G+dxqj2IvGNk5NYgzEwmaOgSGQ2XOIJmJxBBDqdgtXSGvRZG2KAAQBYLW15iTWjfGjPgRUvnMguYza0G/TGKWeIgfZ91PvUhJVIDCTXJtQvuWaUgtfbB+WkIeMjS4QJy4KUEsZX8Hp6odIO7NbWYINtHPzsyz3KiUwSTXtezkABHuUkKiV7TDOYnJk7RXPgz3U9pmlZRavMguSZ3bTHNOuBibUG2uvAPTHj3kfwj+6Bsv7fPfAULp77fnhNWrUGBGPh7STQmnLw3vpOvJ6MY8+9d0eyzKMIwwmr1cTYrFYrJkiwxWEyx7hctzuYyNrSkqmMGtsBSpCscuFnjrVAmyBRlYxW0+DS/do0dNqB0unMEQf2axtLTPaXhsz/h0kzbcL+MLnHiU0mUTbwC4eBVtmkmgp7/AWPdaaBc3SGAeT2OGOCmMa7wcMLAMDxPKBl4Min5Ws4jgO0BdesZAv8nMSaSqeC/mv2wACDUvGNjCUgLDuvQkGl+oom1oSUgDZQzvBDDLJtFUSRwQmjTcbj0JmBBvVIrmnfh9fbB+24kIlkTWJJIQREzIaxg4Epbnc3rEQiOB7a5P0dB/fgRO7rmcpO6MxWoWWOcorMUU7LHjexOlExRY9p5h3Z9Bt0TDM2MFkzt+KMv4tUrbl/0je7mI1jDpmPWx94JLz04lvr8d6GjZjU0dHAhY2cFbdhtEar62P9uvWIJeJ4/x67IhYb+T+58VKtVkxw7CAeBsBudzbBljkiOoZ+GIbVaa4LlXaCnVDZmOq0auX3awv+7edOuirery3o8cJ+bcUNTmJl/2yKXCv8mPB/wj+b3Osm9/nB44E/m4Gn5O4c5tzbDNwg+LPOfI686jSdmWgWVJiZbNIsZ9Jf3eQNAyisOCs1DICIBsRiNhKJOBxnoNLMQX4S3FIG6ZxKNJlsAbq3hY+zFWi5AwysRPHkkhACVksb/N6uvI83ShU9yihiNpTjwG5JDnnUMZscEVb9fzUQQtQtuaY9L0iqud6obM4JkYnTtA5aVbgurJaW4Psfwdfz4kkzkxlUk6lCyybScl7XAiJvs1DEuNFC40+22iy/yswP/1zfY5oys2mf6W2W7WmWTZ5Z4/eYZj0wsdZgh3x4PlY9+if0OgM7l/fc/yd8+uxToZu4ag1AGFi0+Bpvv/Y2kok45uw2e0Tl3+OxWq0YIQSseDyc4OV290DadjCZKtHcCbbsuGeVdqA8N6hOs+0xM9I+SLZlEhfhSaHgqJDxFPzsL2dSQGb7tWV6v9S7X1tzJLFyPg8Gf57cd+X8IlCqx5jJvBti0Gmogcdi4A85SzKD+phlBgHozJ+VKv05R4sQRadnchgAUe21tbcOmVgTSsPNmRY6eICB8YLjmtIONiWVr0om1oDMEIPebuT+XFHpPthtEwueKywrqJj2PNjDJda0hog15udCmFzLDDSITZxQ80ovlUncGa1HveJdSAmrJQnt+/D7eqGdzPHQMvvd1UKtkmbI9JkN+vbxaD+NH2G1me/nJc5yrzXsmGZun7NMAo2nCBqLibUGk20tOGLfvXHP08+E15584VWc0d0Fa+Lkxi2sBoQA7JYkTF8K8BRef/lNxBNx7DS7+mq88VytVkw4mcrYMJ4Pr7sHKmbDaknCiscrbsTbKNn+AsFkTycoixbNVZ02EkIICDvbry3T8Drbr80r1a/NHvj7bYok1qCEVhVJrPB9AgAk8t8t8h/nBBbVBhkDvc8yAwG0glYqTJaZbJ+zuvc1KzYMYFDF2Tj474YoKlrbWrFl87bwsTPo2LbwFHzfh+/7iMVjQQwjRN7PDuWkYNsTMn/2gLbCo53h/aSElWyBSveH1/xUH6zWCcWHGFgSKpUOmuqX+HmofTXw/AYRQkAmcpJrE9prllxT6TS83j4YBH3d6kXaNoxlZTZBc46HjrAij0kzopEx2fjOy0mchZVnfv2rzYCiVWbZgQA8phl9TKxFwFFHfwD3PfMcfBUENUprPPjHP+Ojp3wEpsmr1oQAYplJoTrl4NWX1iGZTGD76VMrvpcxBn6a1WrF5CXYfB9edy+UbUO2JGAnEpFNsA0kjlxo14HRBsIaO9VpIzH4GGiY5FEaOu1CmfTgj0AzJ7HqbeD76YcJsnCCZkOTZrnDAIpMz7Ss4Gdgk3yficaDtvb8PmvOoAoG4WsopeH7CrFMQ3uZaIHOSYzpdApom1DWAAMAsFra8xJr0AraTcNKtBQ8V9qxYGPS82DF40Xvpz0vM5CnsQaSa05NkmvBSYcU/L7+ICFZ58mjQE6Mpq0g3vFcWMkWWC3JYJhRkTWXTJppHQxuyr4PJtN+k0kzolzBNNqgGji/t5kfJtDqGuOFxzQziTIe0xxzmFiLgMS0yfjA+3bDEy+/El574KnncfzxH4YfK71j2SyEFIi1JYHeFNLdvXj1pTcQi8UwebvCIwtD0a4L7XiQ8foHRc0iaJ4bg7FtGF/B7w3GyFvJJKxkomgA1wg60ztNp7PVaSIoZY5zJ6aUMDDmbtWwgqSZHqgqy02U5Vyr+/FMIDMVrfj0TA4DIGpOrW35ySx3cM9E1w8Sa2rgutVSJLGG/AEGQ5GxOIQdg/EHjpiqVG/RxFp2M1I5TtHEmlEqnLIdBUFyLTHi5JoxBn5/f5BUy/QvbaSg0jABrRT8vv6g911rCwBRddIsmzDj6waNJyazMZrXy8zP6W/me5k4r36EZeVP0Rz0Z8Z3Yx8TaxEghMDCoz6Yl1jrd1z86Ym1OOiIQ1Dv0eejQVoSsbbgWGhX52a89so6zN3n/QXBaCkD1WpMLJQjdzpVXoKtJQErkWhIcBlUp/lQjgPtujBKB/3DWJ1GFSiZNMse0dR+3YOpUMEwgPyKMw4DIBqbBlespQcdHzKOB6V8KH/gZ5MclABT6RSMMXkDDIZjtbTD79kaPtZusFlV7DVexGxox4VuKXy/zvRXkzUYMFUrI02uGa3h9QWxT7ZPaVRIy4JJyuCEQU9v5mpOVZlk0ozGN6NVQXVZUHE2UH1WV5kCgIHjmfbAFE0785i/n4570XkFHeem7dqBuTt04MX1G8Jrdz+8God9+GA4IjrBwEhI20KsJQGTcvGPv29CLBHHXnPfh3gZFWisVqtOXoJNKfi9/fkVbHVIsGnfD4cRaM/LvDjZkCWOo9D4VTpp5udVmzWElJneZUWqzLKP+csP0bjU1jboKKif/3PKOD6MQV7F2uABBtAaxgt6yIYDDIYJ/6xkC/zebfm92tK9kO2TC54rLQvK86Bct+C1P1vBG7WfYWFyLe0MDDQoI0FmlILX1w+VTkHGE5H8hTd7wgANOJpK1Ei5AwEGjmc2biAAgIEeZtlhALbNajOqGBNrEWGkwMIPH4wXb/9teO3drh689PzfsOu+czEWqtYAwIrHYCuNVtfHhjfeQTKRwPvevzOsoSZVGQOVTgebeREMjppB0BzfBmwb2lfw+/uh0kEjYyuZqPlYe2NM2HRfO24wacxiddp4FvaMCRNmftG+Zg2RTZplBwAUTNFk0oyISmstSKzlV1MYzwe0gZ9bsZbpqZPbHDubCAIA5XqwWoZOIgkhYSXboFK94TWV6ofdNqnoz6zshFCTTObFU9r1gIjGV0IIyOSgyrUhYsb/n73/DpflKM+94buqOk1aOe21k7aykIQQEgglBAgEAmww55AMWNiYC15kGxm/B7CxP4RfjAAfc7CNwYYLS/gAxjbJ2NiABEogglAAoZy1tdPKYVKnqu+P6u7pnpmV81rPT9fWzFSHqV49M1191/08jwwC+OUKpOvpMccmPS6C2I4kBQGiSfXm8Ezpr39BAHDeFJqZFdGYQbnNiNWBhLVNxElnn4Ld3+nGocmGrf/fr/8Z3n/WM+BuQCqgtcJw9GysHUg8+fATsGwTxx3YM3elKs9HSG61VYMbAjCEzvFRrSF06+C2DcNxVnxxkWGoz1e9noSxMNOYM1kysT1oiGZB27xmcZjmhpCIZk1FACg8kyCIVaIlFNRvE6YUhBlhDdCutbAym7yW9RrQ0ZUUMLByC6fLELmssAYlId0qhFNoWZcZhq687ftJZUyd4DvY1AJU27DQNuKa9H0tqnk+uEMTeQSx2sS/F5nwzChEc0MKAqC5kqbRIqJthqIsxM6AhLVNhDQEXnre2fjH7/wgaXv40FEcfvIgevft28CerS66UmgOarYKVffx2IOPw7YtDO8ebFlXu9Vq5FZbA7gQQE6HiIa1OqTrgluRwGYuXmCL3WnS9RC6HpQMwbgAtyyq3roN0KJZaz6zjNtsw0Sz5tDM7COJZgRBrActVUE9D+AMkI0bTEMquK6bWa+tsAY9ARa6AWQoIRYoKMANE9y0If3GvoNapb2wFhXBCV1PX6MZi37HJbi5uSfAmsU1q1TM5E0LPQ/BbAUyDElUI4hlkCkIELvLUuGZG1UQIBOe2SSiUSVNYjNBwtom47kXnYWv3fxjTNdqSdt/fO8n+N3f3Ytgm4SDApG4VswBsxV4szU8/IAW13r7ujPrkVtt7WFCQIhIYKu7umpYKkR0rguWCnVi0aBW17PdSgGGAW7SgHarsOlFsyZ3GYlmBEFsRppzrNXrLphtQtW8pE2ECq6XdbIJJ4d0i3TrWuQyBPyqDxmECwprgHatpYU15XuQgQdutIpl3DAgPRcqzGkHW6irUG6FibCMuFYuwyxqcS2s69dKAcKxN7qbBLEp0QUBgozTLA7Z3PiCAM05ziLhjEwVxBaChLVNRpiz8cJnno5v/vTnSdvt9z+GN01Owuzu2cCerT6cM5iFAlS5gtrYFB568DGcYZ2CUkcRAOVWW28SgU1KhG4ksFkWRM5JBDadcDRA6HoIXVeXhRdcL6dztKmI81ygKSQzUwxgnZPDJrRzmaWLAVCSWIIgthAtoaB1D9wyEaaENRZIuJ6vJzQiWgoYQItrIpePQq5CwF54YpHbOZ0jLfWbHtYq4KVWYY0JEeVA1UUM4qJCW4VYXAtdF0AZzDQRVKs63xxNwhI7lHh8ng3P9JO2jS8IYKTCM2PRjCZIie0FCWubDMYYLr30OfjvO+6GG+gcVUopfPf7P8Wv/8+XQW4j1xoAcIPBLOSAag1Th0fxsGPjtGeciFzOaQz8aKC0rjDOIeyoKpmnwzuFbYJbFkLP00mOpQIzDQq32CBaRLMmwWwjRbNMwv+4GEBKPCPRjCCI7Ua+kBXI6vU6mJ0dYrNAIgxDhGEIYehxDeMczLKhvIbbTNZrWlgDEHoB0BrR2QJjTBcxqDbCSsN6VMSgzaQXEwZk3YV0bCg/WJMcRNL3IH0X3LRXPcw0EdfqLuB60Q083dIQ2xcttPtQfkM0a3aerSvpggCGkQrPpIIAxM6FrkKbEKO3C8876UTcfP8DSdv3b78Xr37lJZBOfp4t1w7GgIHeAgp5E+Wqh9Hx6qrlphSmgHJsODUPxx4/DNuycNIpB4AaudU2kqzApl1q4OROW2uUUoCSWbEsI6AFm0A0M9rmNQMj0YwgiJ1Hs2OtVnfBm5xmzAsQhiaCIISVilYUTg5BSlgL6zWY0HlQA3fxoVlGLiusQSktruWLLesyQ0C6LsJ6XedFNVZ3AjOolRHMTjX6VuqCkWvtx0qIq4XqMFYakxBbGxWGibOsnXi27rnN4pBM02xynumwTSoIQBCtkLC2CVEMuPzFz8MtDzyYhAy4vo9bf3QnLrj0Qqh1dq1xzrBvuAP5nB54ObaBnG3g4JFZSLk66pphm5ChhBMEOPjIU+BQ6C/lUerqWJX9E8tHC2ybO6nxVkLFollKOEOT62wjSMIw58hrRqIZQRBEewrFrK3MrXtgzW57P4QfBHA9H/nU6tzJATNTyetsAQMPSspF3cQyYYBbDqRXT9rCWgUiV2j57dZFDLgOFZMKfBWFqaBaRlCeyrbNTgFKwciXVu19gEYxBoLYzOiiAGEmRDMjoK1zmOZcBQHikE0qCEAQy4OEtU1K9/5BPHPvXvziqaeStv+8+U688IXnoc7XLzRSCIZ9w53IOdmPSiFvYf/uTjx1eBphuDrimpW34c1KWH6AJx94HEdzFnbtHsLgYG/LbDBBbEaSYgBNDrP0a6j1dpuxRsL/tnnNSDQjCIJYCc2hoK7nAWZWDFNeAKUUKpUauru7knbRlGdNRWFduoCBROiHMBbpKBO5YkZYU6EP5XtgVmtCf25G+dVWcbI2qM4iKE+3X1ae1uJagSZMie1FUk0zrqKZEsxi8WzVwnwWYp6CAIlwRg5PglgTSFjbpISc4xXPPxe/+GJDWJssV3D33ffh1Gc/E6s5EJoLw+DYv7sDttX+Y5JzDBy3pwtPHZqGH6yOWGAWc5CzFRSEgGICTz51GMdGxjA40EcCG7Gh6BBN1chj1k40W/cKmizrKmspCmAAjJFoRhAEsYYU24xNXGRvpGXdh2UYmJycxu7dQ8nvMrNsgPHMpEtYr0EUipBhiKDuwcg5i+oHt2ywqMp3TFCrwGojrDHO9fXBWJ2QrqAyi6DSXlRrrDMDFYlrdF0itgq6MEBTXjM/XSBg/appMi6SAgANl1kjZJMKAhDExkHC2ibm+LNOwnHf6cMTY2NJ27/f8DM869lnor7GwpplCuzf3QHTnH/AZVsCx+3txFOHZuB6KxcVGAOsYh5h3QPqPjpyFiQ4njp4ZFUFNj3oVFqIoAsQgZRVPxLL0EY8W7cZx5iMUGY0hWeSaEYQBLEZyBdaxySeCpFJoiAlHNtGpVpHve4iF4llOleYA1mrNlaNhDVhGHBna7A7i4tymegiBsWMwCXdKpTsbBtOKqzVSfMQVGYQVGZa2rllQ6byxwFI8sBtdnEtrFcR1ioA5xC5AoS1OHGT2HoopRB6biY0M/N8HQsDMGG0EczMRnEAcpsRxKaFhLVNjCc4XvrcZ+Ef/uuGpO3Jo2N48tEnMHjC8Wv2vo4tsG+4E4aR/fH2/BBHRsrYNVCElRLcTEPguD2deOrwDGr1lV98OGfgeRtSKvg1H4wxdJVyCBhWLLApJRHMTiOsVwAAzLRg5Dv0LO8mHuARK0OHaMoWh1nyeiNCNBlvcZcx0RDOSPQlCGKncc011+BP/uRP8O53vxuf/OQnAejf7w996EP47Gc/i8nJSZx33nn4u7/7O5x++ukb29kUzaGgAOCGTcIaAFMxTHseypVaIqwBOhw0LazFBQwM24RfrcOvebAKixN2RC7f4hwLa5U1C8GcS1QzCh0wCh1tw0PD6qwOCy12brrrnFIKQXlKi2oR0q0hNG0YxQ5ws9X9R2xe5i8IFei8tkrBW6f+zCWYccMEMw0wRsIZQWxVttS395prrgFjDFdddVXSppTC1VdfjeHhYeRyObzgBS/Avffeu3GdXGWec+Ez0VvMVlL6j+t/CoutjXMmnzOwf3erqFZ3AzxxcBqVqo8nDk6j7mYFNCE49u/uRDG/evnfOGew8haEyVGfrkBVPPSUirAtC08dPIJf3vMgHnv0ICrl6sI7AyADH97ESCKqAYDyPfjTY/AmRxG6taRYBLF1iJ1m0vcQ1msIqrPwy1PwpsfhTo6gPnYE7ughuONH4E2Owp+ZQFCeRlgrQ7p1beFfA1FNzzraEE4eIl+CUeqG2dUHq2cQdv8wnP5h2D2DsLr6YJa6YRRKEE4e3LQpcSxBEDuO22+/HZ/97GfxzGc+M9P+8Y9/HJ/4xCfwqU99CrfffjuGhobwkpe8BLOzs3Psaf0RQsBuKvLj+j5YmzxrBueYmcn2nTflWZPReIRxBjDAq9SxWBgX4E0V5MNaZdXHN0op+OXp9qJasTMR8ox8CUapq2WdMKocupnGXSoM4E2OZES1GOm78CZH4U2NQfrrJcMQC6GUggwDhF4dYa2CoDIDf2YS3tQo3PGjcEcPwx07Am9yBP70eGr8V4vGf6v4+WMM3LQgcgWYHV2we/rhDA4jv3s/ivtPROmEU1E67kQU9uxHbnAYTm8/rI4uGPkCuGWRqEYQW5wt41hbaMB13XXX4eSTT8aHP/xhvOQlL8GDDz6IUml1qw9tBF7OwgufeTq+ettPk7Y7H3oCMyOjcPoHVvW9igUTe4Y6wHn2hr5W9/HUoRmEUQXQIJR44unpTKVQQAthe4c7cOhYGTOzWev/SuCGgCk4Qi9AdXwGRs5GX1cHfCkzDraBwd62eU6UUgjrlUzp95Z1Ag/+9DiYYcIodIBbDgkbm4DWmcbULKMMgThEc71JV81sE6pJxQAIgiAWT7lcxpve9CZ87nOfw4c//OGkXSmFT37yk/jABz6A17zmNQCAL3zhCxgcHMSXv/xlvOMd79ioLrdgOzZctyG41OoumG1C+Y1rlPIDOEUbU9Oz8P0ApqmH4c3CGqSEisQbwzLhV1wEng+judLoHBi5Arx6Y9JRyRDSq0PYrc665aCUQlCZScI6M+9d7Gyp/mnkigAYgtnJTLue6FQwSt0bfs0M3Tr8mYkFJ9qkV4fn1cHtnB4vLrKwBLF05s1tGz1fz2qaYLwRkplxmkWPgiINCGInsyWEte0w4Fo+DJe+8Fx8++d3oeY1Bmz/9f2f4nVveCWCVcq11lGysXuw2HJBqFQ9HDw8C9k0oyOlwpOHprFnVwdKhcYsLWMMe4ZKOMoZJqYXP8O6EIwxGLYJZRrw6z7Krg+7kEN/bzc838fBp4+2FdiUlPBnJyHd2qLeRwU+CWzrRDJgagnPbAhmKly/vBYJjLWEZcaiWVJVkz4TBEEQq8aVV16JV7ziFXjxi1+cGec9/vjjOHr0KC677LKkzbZtXHLJJbjtttvmHOe5rgvXbUzwrYcrysk5mJluCE31Wh3cLkKWU1U6vQA5p4iJ6TIqlSq6urSrS1fsMzK5nGS9BmbbEKYB363Dr7qLFtaYYYEZZiapelirrIqwpkMlteunGaPYBSNfbLOVFvsYY1q8ShHWq1BKwezo2ZBrq1IKYXW2rfMOYABnbcUb6dbguTXtSi90gIstcUu1qWitpJ4S0OIJ1HV0NGYKA6TFs+gRnCZNCYKYmy1xFdgOA66VwPs6cOFJJ+GGVIjrTXfcj9f++guBOQYwS6G708FQf6HlYjFTdnHo6Oyc1zSlgIOHZzA8WERXRzb3x9BAEUJwjE4sLkxzsbAoPFQGIdxyFUHdhVXKY6C/G/W6lxXY+jph+pW2jiZmmBBOHmG13HZ5IrAJE0ahBG7n6GK6RJSULTOM2QFUVEBinUkS/7fLb8YFJYYlCIJYR77yla/gzjvvxO23396y7OjRowCAwcHBTPvg4CCefPLJOfd5zTXX4EMf+tDqdnQBcrls7q2664GXsuGhygvBOQeUQrlSS4Q1QLvWwnJDmJP1GoSt9ylMA165Dqcjv/giBrlCxqkvvTpUGOjr3zKZV1QrdUXOtLkRTh4Agz8znmmXbg3+zMS6i2tKhvBnJloKLAA6nYPZ2QsmDB22Wplt62YL61WE9SpErgAj36Fd6wSA9DgwLZhlx4TrSnNBKCGgpAK3bDjd3TT+IwhiRWx6YW27DLhWQqiAl136HNx4//0Io1mzIAxx46134AUvfT7kClxrfd05DPQVWtqnZuo4fKx14NSOw8fKCEOF3u7sTGh/bx5CMBwdbc1VsVLi8FDpB6hNzMCv2bCLOQwM9KBecxFUZyHqgGozQBO5YpIwV+SKelBUnW3rjlKhD39mAkwY2sFGAhsAXQQiI5BthgqaQNOgqUkwoxBNgiCITcXBgwfx7ne/G9/73vfgOHMn52/+3VZKzftb/sd//Md4z3vek7w+7bTTcPjw4ZV3eB5sp0lYq9XB7KzDTHl6nGHZFiYnp7F7eCA5jmZhLXRrEOgCABi2Aa/sLq2IgZ3XRQNS1+KgVoFZ7FzysQHtk/rHGKVuGLnWsWTbfjk5gPXCn24jrk2PazFrHa7T0vfgTY+3FXe47cAs9SRCi5EvQTgFLbBFhReaCWsV7QrMF2HkS22rsG4n2heFyj5f13EgY60V1NMpOuaINgg9j6ptEgSxKmxqYW07DbhWStdxQzh73z78/IknkrZv33onLrv0eagby6tQNNhXaBHDAGB8soZjY0sTw46NVRCGskWk6+nKQQiOw8fmdr4tF8YYhGWCGwYC10el7iPX4WDfcCcKduuARoHB6uzJhEIwxmDkChBOHtKtIqjMJbAFDYEtXwJ38ttWoFFKNcIxM3ktUjktNko0axHOUmGaZNEnCILYUtxxxx0YGRnBOeeck7SFYYhbbrkFn/rUp/Dggw8C0BOpu3btStYZGRlpmVRNY9s2bLsxNlqPa0O6yiegc6zxOYS1nOOgWqmiVqsjn9djEuHk4KfXdV0oKcE41zf9nMGr1BctrDHOtTM/JYSFdV0ddKl/D6UUgtmpTPGnGLPUDbFIUS1G2Dmgqw/+1DjSznXp1eFPjcHs6l2zRO4L5d01ip0QudbUKIxzGIUOiFwRQXVWu/baCWzVshbYcrHAtjUFm/ZjwSbhbD3hvClNh5EZB4IxGgMSBLGhbGphbTsNuFaKB4aXP/85GWFttlrHz+/4Fc4479nAEl1ruwaK6O5sHZyNjFcwNrG4fGTNjE3WEIQSuwayA5LOkg0hGJ5uk6ttNWCcwcxZyNkCe3Z1wDRbRbWZqoenRmbR3Ssx2KbIAWMMwimA23lIt4agMjO3wDY7CVadgch3QGwxga0xw9hONIvyWaxnItgYzltnGlOPc800EgRBEFuXSy+9FPfcc0+m7bd/+7dx6qmn4n3vex+OP/54DA0N4frrr8fZZ58NAPA8DzfffDM+9rGPbUSX56TFsdZOWPMjx5plYmo6QN31EmGNt8l/pnwPsPVYzbANeJX6kooYiFwx6zCTEjLKC7ZYtKg2ibDemtrD7OhZ0r4yfbMcsK4+eNNjGYFK+i68qTFYnX2rLkopJSOBsE2aEs5hdfSCW/NPVjPOYRY7YeSLCCqzbcNiEeVtC2tl7XbLFzddxUcVFwVoUxBgI8I02znNkHad0RiQIIhNzqYW1rbTgGs1OHDmAZw8OIiHjh1L2r75/dvxnOc+CzW2OMs5Y8DuoRI6iq0DhyMjZUyusODA1IyLUCrsHixlqosW8xb27+nIVBddTfp78+jrbg3TVEphqhZiugYIw8LTTx/FyMgY+vt7MTTUN4fAlge3c1pgq85mkv8m+w1DPdCszEAUdIjAZrjot81n0TTjuO4wPrfLjIoBEARB7FhKpRLOOOOMTFuhUEBvb2/SftVVV+EjH/kITjrpJJx00kn4yEc+gnw+j9/8zd/ciC7PidOcY63ugjnNjrVQR1VEr71UFVHGObhlZ/J9SdeFiIQ1YRrwa96SihjoBOxWUmEUiIoYLFIMU0rpAlCrLKol/bNsWF198Kay4pryPS2uda2euCaDAP7MeNsxHTMtWB29S8qPxriAWepqCGxt3HyIqqcGscDWxgm3Vqh0mGYb19lC1U9XlXgcmJk8bbjPKE0HQRDbgU0trG2nAddqUBMcLzn3LDz07e8lbYfHJvHoQ49i+JSTsJBrjTFg73AHivmmZLpK4fCxMqZnW5O3LofZsoeD4Qz2DJcgUgOinGPiuL2dePLQDIJgdS7ohsGxZ6iEfK51kOn7IZ58chKuYrBLOeRyNnI5G7Wai0OHjmF0dBxDQ/3YtasfTtNMc0Zg8+rawdZOYJMhgtkpBJXZaNC0dgLb/CGa6189CUB70SwRzAwqPU4QBEGsiPe+972o1Wp417vehcnJSZx33nn43ve+h1KptNFdy5BrSlnSzrEGAMoPAcOEEAKVajZCgDu5jLCmmpLqC9OAN1tbdBEDADByRfh+oxKn9F3IwNdVDudBKaUT+7epqm529q5KhVEA4KYNq6sf3tRoVlwLPHhTo7C6+lcsroVRcYR2Y6R03t3lwIQBs6MbIl9CUJ1pK0JCSgTlaQTVMoxVmIzVVdVlW8FsI/KbxUIZmgoDJM9pHEgQxA5gUwtri2GrDLhWB4ZzLzgTg7f+FMdmppPWb17/U7zn1JNQn+cayjnDvuGOFgFKSoWnj86iXPHm2HJ5VGo+nnx6BvuGO2AYjQGRbRk4sEeLa56/MvdUqWBheFBXH21mtuLh8LFZ+KFEUPcR1j1YJQdW3kkJbHU88cQhjI1NYvfuQQwM9MAwsl8JxhiEnQO3nHkFNsgQQXkKQXV5AtumDNFMEsE2RLKW4gCbLLRhIWQo4VfrugqUEOCGFga5QbOlBEEQm4Gbbrop85oxhquvvhpXX331hvRnsdjtHGuWoec8U+Mz5QVADrBME7OVaiYvMHdywMxUsm5ztcrlFDHgdg5gPONQCmsV8FLXnNvMJaopBQTSgpAcq5man5sWrO5+eJNjmX6qwI/Etb5lFQNQkWMsrM62LmRM54dboesuhhsGrI4eyHwJQWWmrSCJaDI2rJbnLYilx4RN48CmkM11q6qeLgrQIpwZlN+WIAgiYssJa1t1wLVauHkLLzrzGfjnH/04afvVY09j/PARFHYNt93GEAz7dnfCsbOnOwwlDh6ZRbXWRihaBepugCeensa+3R2wUnnPTFPguL2deOrQDOru0pOfMqYLL/R0tclHohSOjVUwMaVDWjnnsPI2Qi9AfaqKoObDKuV0TracA8exMTtbwUMPPYGRkQns2TOInp5O8KbZ0azA5kYCWxsxMhHYZlICG9+UIZotzrIkt0U0WNpGiWBlKOFV6nCnK/DrHuI7HcY5OOdggoObBgzbgDAFuBBgBtfiWxvhliAIgiDSNDvWavU6GGNgtglVb4yz4gIGpmXAq3vwPB+2rSMJhNM0ronGCIzr5bqIAeCWl1DEgDGIXCEjLoX1CoxiR9vJMS2qjUO6ralB3BpHGITwa5NwugtwOgqrdo3kRiSuTY1mJhJV4MObjJxrSwjVVDKEPz0B6bdGYzBhwOzsXdC1txy4YcLq7IX0PS2wea1/x3RBLJErJGPEDRkTJmGa6fDMVDVNCtMkCIJYFFtOWNvpSAW88IXPxn/ecRdm642L9X9+/2d485tfBb8pHNQ0OPbv7oRlZQcjQSiXLWwtBc8Ptbg23JER9gzBcdyeThw8MoNKdfHCnmUK7NlVahEJAcDzQjx9dLbtMQnLADcFQjdAdWwGZt6GXcrBsEx0dBRRLOYxNTWL++57BP39vRgeHkBnZ7FlP1pgc3QeFD8S2Px2Altk+6/M6NcbFaLZTjjbQTOMzYKaMAXsYg4syv+npISUCiqUCOou/EodCgpMQYttkbgmbAPCNMANLbRxQ4CJnfE3JAiCIBamNceaHhtw20SYEda0aGKZJsrlKlzPS4Q1ZtkA5xlhSXoehNlI4WHYJvxqHYHrw2gTatqOZmENSiGs12A0VfNUSsGfHm8rBgXKQRj4sEsOQk+PpYKah1x3EWZuedXpm+GGGYWFjmWS56swaDjXxMK3LtJ34U2Pt3X6czsHs9S95tU6uWnB6upLJmPbCXwqDBCUp9tsvZod4W0Fs+T5Fq1aShAEsdkgYW0Lwvs6ceHJJ+M7v/xl0vbDux/A61/1AiBl7bctgX27O2AaWVHN98NVCcVcLEEg8eTT09jbFIoah6ceOjqLmfLCoaidJRu7BoqZoggx07MujoyUIecpjMAYg+GYkFLBr3kI6j4Mx4SZt2FYBnp6OuH7AUZHxjE5MY2hoT7sGu5HLtc6K8wYg7AccFMLbGFltu2gaU0EtTYhmpTXLMtCgloM4xyCA2j6juh8dhIylAh9H37d1adSAUwwcK7FNWEKcMuEMHQ4qRbeRMv7EARBENub5lyt9Wjyk9sm0qOt2LHGOYeUEq7rA1H2EsYYuO1A1hp5uqTrQhQaE31xEYP6dAWF/sXlBuPCSFJaxIS1cqay+dyiGgPPdcAdLcOMxnDC0hNNXrWOoO7D6SrA6Vwd9xo3TFjd/fAnRzPOLRUG8CZHYXb3g88hrimlENbKc4pVRrFrTXPhtoNbNkyzT0/GlqfbpxNZAS3VM1NhmjQeJAiCWD9IWNuCeFLhZS84F9+/9174oR50hFLhhpt/jpe+8lKEYMg5BvYNd7TkH3O9EE8dmoa/SsUDFksoFZ48NI29uzpQLDRmXhlj2D1UghitzFmRlDOGoYECujpaBS4pFY6OljE1s/jCC5wzWHkLMggRRBW2hClgODbMnIn+/h7U6x6eeuowxsansHv3AAYGemGarV+XWGATqRDRtgLbEthJIZqrTVtBrdQ+h8l8MMZ07rU2YSex4KbCEJ7nQ83UorohTItuQoCbAoZtaqEt5XKjsFKCIIjtiZNrLV4AAMxpKhjlNVz1DA0BLkY4uYyw1lzAAACsvA13pgYr78AqLi4kVOQKGdFMBT5U4OuqoUrBnx5ryekGxmB29KI6VQckwFOTUIwz2MUcQj9AdXwWfs1FvrsEM79y9xoXRhQWOqYT8cd9lmEUFtrXEsappNQVTNvlNuMCVmcPuLm0vulJNrXia3cyGdttz5+vt922zUJZOkyTqqoTBEFsGkhY26J0HRjAuccdwI8ffSRp+86PfoFXvvQiOB0l7B3uaHF21d0ATx6aRhiuc1hihFLAU4dnsHuohM5SY3DDGMOugSKEYBibyA6IHFtg91AHbKtV4Ki7AZ4+OgvPW57zLhY9lFKQfgi3XIVbZjAsA2beRm9vF+p1Dw8/9CRGRyawe88genu7WvKvJfuzbFhWfxIi2jJABShEc41YLUFtMWiXGweaInCU0iGlMpQI654OK1U6JyDjLMnbJiwThmVQ8QSCWAOUVInwLUMZ3WxXYXUHzV9ZglhVWh1regzQXBk0LayZlg4HTcOdPIDx5LX03EyBAwBROoIAtakyDMfMCF5zwS0H4CITYhnWymBGF/yp8dZJQcZgdfYhDBm8Si1xqzUjTH0982suZo5OINdVhNORX1Sf5oMJI6kWmhbXIMOkWmgsrsnAhz89nl0vPm7ThtnZs6TiB0oq+DUX7mwVSgKlXd2rco3O5Ot1awjrVSgZzlkcgPKbEQRBbB1IWNuiVBXD5Rc+Gz959JGkLlDV9fDjn/0Cr3/DS1pEtWrNx1OHZ+YNlVwvDh2dRRjKluIDA70FGILj6GgFANDT5WCwr71lf2KqhmNjlVWJtNQziQaEZUBKBekHqE3OgnEBwzHRVSqgUq7ivvseRX9/N3bvHkRn59xVZ+PS8TKaDc7kt6AB0qrSKqgZayaoLQRjDCwSa9PEM94qlJB+iLDuoy51XOmcxROikFJucMp/QhAp0gJ2+jHwA0g/gAyidiV1pWUwhLUa8kOrW/maIJppdqz5foAgCFuENZmaDDRNE9W6izAMISKHNG8uYKAUlOeC2dn9mzkL7kwNtekKCr0dC/aPMQYjV2jkfgUQ1quQYdCaK5Yxnc/MsOBOTQNSzSuUMc5gFRztXhubgV91de61vL2i6zETouFcSzu8pEycayoM4M9Otk29IfIlGIWORfdBSQmv6sKdqcKvulBSwnBWJ39cGsYYhJNftYqkBEEQxMZDwtoWZt8Zx+EZw7tx7+FDSds3v387XvjcMzB4wjBENJgrVzwcPDKz7vnz5+PoaAVBKDHQm02c29OVgxAcnDGUilbLdmEocXikjNlF5GRbDpwzPQi2TchQJqGililgGSaOHR7FxPg0hnb1Y3h4APn83CEY3DCBNag4RQAyCPXgdxMIaguhw0oZIDiab0uoeAJBZEmEM5kVzkI/QOiHkH4YfW8kECooRK7Q6HvGOAe3BAxuJKJ0tdYmNIwgVpnm4gWAdq3Z8zjWLNNApVyF63rI57Wgxg0DzDSh/IaQFExPwRoYyuyHMQYzb8GdrsDK24sqICCahDUAc4hq/eCmhaDuwSvXYORax2Nt928a4B0CftXF7LFJOB0FOJ15iDapNBYL46LhXEuLa0qLa0CbwS1jMDt6IOzW6vHtSMYUM1UEdRdMcJh5GzJY/4rtBEEQxNaEhLUtTN0UeMmzz8wIa6NTs/h///f/xQff9T9x4pknoOxJHDo6O89eNo6xiRrCUGGoP+tKS4eJpqnWfBw6Ortu+eG44OB5KwkVDesuchAIaz4ee+gJjBwZw97jdmFwsA+WRQLaerCVBLXFsCrFE0wDXGhnGxMcnGtxgXFG4huxKWl2m8kobDNwg0YIZySuMWgjCuNouDsNDsEN/RmnzzexScjlW0Wc2dkych1NbrLo880Eh2EY8IMArucnwhoAGB3d8MdHkteyVoX0PHArK3AJ00Dg+qhNliEsc8FcYIwLcDvXPg+ZXkHnL4uqkNZnqlBSQSwhrJOxhnutNjELr1yDmbdh5Z1Fh622dotrcW16rEkIbBXVmGHC7OgFNxa+xQn9QLveZ2oIXJ1Gwio0Ch2RsEYQBEEsFhLWtjBSAc963jOw77bb8dREIx/H4dFJ/L9/+X/xx29/NQaOOw5RZvVNyeR0HWEosXuoNO8N0thEFSPj1TmXryXNoaLcD9ABC9XJMn41dj8O9XfhuOP3oH+wr6VYBLE6bDdBbSGWVDxBqsSNyphKcrLEohqPnW8kwBHrROMzqh9lKCGDEDJynSWimlRQ0Y0xA5LPJRcczDRJOCO2FLZtodRRxOxMOWkbHRnHUH9vy7qy7kEUHDDGoBTg1rP5zcyubviTY4BsTCQG05Ow+gdb9mXlbbjlOtyZKnLdxZblzRi5Irx2wlqTqKbdanUYzvImDmP3mvRDuLNV1KcrMCwTZkG76wzHWlJRAMY5rM4+Xbl0jiJRwsnDKC2cDy3wfHjlOrzZGgIvgGGtXV5WgiAIYmdAwtoWJyg5eNNFF+Dvrr8BM6lwl9lqHf+/T/0rrnzDS3HmuWfBU5t3sDBT9hAensHeXa0FF4JA4tCxWVSqq1uefLmkQ0UNx4Jf9zF9bBJ3HhnHwK5+7DthN/oGeqn64yohgzCaTa7uCEFtMcxVPCFGC22RaCEVQt9H4Kq5BbhIYGsrwMUiBwlwRIpMgQCpEpdZ6AUI/SArnEV5PRlDI1STa6cOfZ6I7cbAUF9GWBsZGQc7S4A5JlS9MY4Jp6oQBZ1KQhgClaZwZcYFzK4e+BNjSZusViB9H9w0m9blMGwT9ekKzLwNw55fCGOmBSaMbKJ/xmF192cqbbrlGqSUsJZYSTPzXqmJSaUUQi9AfaqK+mQFwjZg5h1YeRuGYy4qnyjjHGZXrxbXmgpEGaVuCCc/729KUPfgRoJaGIQwbAN2yaHfIYIgCGLFkLC2xfFChWdccArerRj+8dZbcWhqMlkWhBJ//aX/xmtHJ3HZSy+Bzzav2FOp+njy6Wns3d0BIxKlylUvKnSwiZLDpeCCwy7Y6Mtb8Osejh0ewejhUeza3Y89x+1GV18XhGXQgG0ZtAhqFglqi4VxBgaBloRuTbQKcAECT0KF8wtwTDAIQ7QIcPGyOFyPztXWZVEFAuI8Z1GBAAY0PgdcV1eOnxPETmFgqB+PPvRE8npkVEcTmL0d8A41IgvCyTKwu0cvMw2Uy7WWyp9GZw/8yfFMUv5wegq8r7/lfQ3bhDtbQ22yjOJg17y/v4wxGKUu+FORaMeFdqqlRLXA9eHO1GAu06025/vaJgzbTK459eky6lM6jNUqOjBzFgzbmvd3gzEOs7MPwewUwnpFh36WuhOnXTNKKS2ozdbgleuQUsJ0TJj5xeWNIwiCIIjFQMLaNqDiWDjx/JPwLsvCl3/840zONQD4t+/9BIdHJvHmN74Sao6Bx2ag5gZ49MlJdBZt+IHEbGVrVHFjjMHK2di1ewBu3cOhwyMYOTqOXUP9GN47iEJXCUY0Y0sVHucnFtTq01Wd74QEtTVjuQKc9CXCdAiqWoEAR8LLhhBXqpVh2FQgIEToB20LBIABPF0gwMwWCCAIAhgY7Mu8HhnRYprR1ySsTdeSPGuWacLzfPi+DyuVQ40JAVEsIZxNVfGszMLo6gJrUxjJzNtwZ6sQtolcV/uK6jHCcsB7hyCDANxqrdzpztYgw5W51eaD8bTIpt2u1YnZRHwzCw5Mx9JOtjbHwRiD2dENs6N7zvdQUsGvuXBnq/AqLqAAI2fCWkaON4IgCIJYCBLWtgFSKlQcCx1n7sEV1sX4zzvuwi0PPZhZ50d3P4jRyRm8823/E05x4RwcG0UYKkxM1ze6G8vGdizsGh5AtVrDwSMjGJuYQk9nB3J5B/lCDqXuIpxCPgmNIMFIQ4La5mXVBDgADO0FOG4ICMMAN0iAWy1aCgRIneesXYEAfYIYFQggiBUyuCvrJhuNhDWzp6QTCcbmM6UQTldh9BRhmgZmyxXMzlbR29tUnKDUibA8m3GtBTPTMHuyAh6gXfSmY6E2PgMGwFlAXGPCgBCttwGB68OdrcLMrU9RJsY5DMeC4ej8jIEXoDo2rYs72CbsYg6GbULY7UW2ZmQo4Ve1oOZXXS3C5cy2OUsJgiAIYrUgYW0bITpyyJ+5B6+yTPSVSvjmnXdApgZjDz15BB/95Bfwe7/7WvQNDWxgT7c/+XwOjuOgUqni6OQk5FgIxjgMxuDYNjo7Cih0FFHoKKDUVYKds8FNseNuYElQ2z6sVIDzUgKc1t9YWwGOCwFhCB1uuoMFuAULBEipQzaVglJzFQiIwjXp+0YQq8LAUFbwGhubRBiGEKaA6CwgnKoky8LJCoyeIoQQMITA4SMj6OwswkhVs2RCQBSKWlyLt5udhdHRBdam6qWwDCgo7f7iDE5nYcnH4M7WIIMQVn5t3GrzwbgWB03HivI2+iiPTIMLBsO2YJUika3NxGRS5GimCr/mghscVsEmVy1BEASxLpCwts3gjgnn9F24yBLoLRbwf2+7DXW/kTB3ZGIG1/z1/8U7r3g1Tjr1hA3s6faHc4ZSqYBSSQ9sgyCE5/vwXB+HRsYQHj4GAZ3Eu1jKo6u7A8WuIoodBeRLBVjO5g3bXSkkqO1cFi3AReGKSso5HXA6DFU7rVgsrLUIcCy7bIsIcEopLYy1KRAg/RAydp01FwiIikxwzmHYVCCAINaTwaGsYy0MQ0xMTKO/vwdmX0dGWAsmy7Chq3x2dpYwOjqBkdEJDO/KTnwasWstQSGYnYbZ3VptFAAMywQUUBmbARiD05FfdP8Dz4c3W4O5CcYfXHDwnA0zp8cMoeejfLQObggYjgmrmNP9ZIBXrsOdrenxhClgF3Ob/jee2HhUKBHUalCzZTAAVmfHRneJIIgtDAlr2xBmCNinDOF0x8Tv5fL4/K23YLLSGMzVXA9//bl/w5te8xKcf+E5G9jTnYVhCBiGQD7nJG1+EMBzfcxWqxifnIIMJEzDgJOzUewsoLe/B/liHoWOAvLFHPgWn3mVQQi3XIM7UyNBjZgXFuXzwgIVdlsEuGAxAlwkPrUV4BpCHBdrJ8DNVSAgDAItnqULBIQKigFMIdNPXSCA7UhHhlJKF06QIRBGj1JGn4Poeagfmeth6p57YNgmnN6eje46sY0plgrI5R3Uqo2UFiMjY+jv74HRWwIeOZK0q7oPWfPAcxY45ygUcjhyZATdXR3IpcYJzDB0rrWMa21Gu9bmCG+MK4NWxqbBGGCXFieuuTM1hGG46RL7c0OAGwImEIW0e/AqLoQhAM4Qun5U4ZPGE0QWpRSk6yKsuwjr9dRjHdJrGA+k65KwRhDEiiBhbZvCOIN5XC/25kz8gW3juh/eiifHG4lzpVL4v1/7Ho6OTuBVv37plhdstiqmYcA0DBQKuaTN83zUay7GRyZx5OkRXRzBsZAv5NDV24mOrhIKHUXkCw5s29oS564hqFURuD4MEtSIVWL5AlyI0Av06/kEOM6Tm7q5BbhWcWuxBQKUjCqxAq0FAgwOQ2zvAgFKyUgYk4AMG8JYU1ssoqlQt6VzTi0EAyDdENJ11+5ACAL692NwqB9PPHYwaRsdnQAAiFIOMAXgh8myYLICK6dFrEIhj9HRCRw5OorjD+zN7Fd0dGVdaypyrXXNLRQbtgkohcroNAAGu5Sbc10gcquVazDt9cmttly4IZICBKEfQCkFu4PGEzsZpRSk72dEs7DuQtbrCF23kdtwHoJqbe07ShDEtoaEtW0MYwzmUCf6HBPvtEz8y09+irsPPpVZ5/pbfo6RsUlc8eZXwXHWP5/GRsCgUOAKHEBdMXjxHe0mwbJMWJYJdOoiEzKU8FwPtVodBx+ZRSAlDEPALjjIl/Lo7u5AqauEfCEHx7Fh29amGWCSoEZsFpYtwIVaCFNSAioan88hwDEhIEyu8535DUGtbYEAzqJiDVu/QIBSSh9fk/iVFsRiB1lz21IEspUiU2kRCGKtGNw1kBHWRo6NAdC/GaIzj3As5TybLAPD3cnyjs4ijo2Mo7enCx0djUJT3DTBC0XISrmx7UzkWptHeDccC37NQ2V0Wk/SFZ051/XKdYRBCDPX6lZTUsIfH4V06xBOHkZ3N1ibwgfrjTA3vg/E+iGDoEU8ix8h5Yr2HVarq9RLgiB2KnRF2gGIrjxKZ+3DmxwLfXfcjRvuuzez/Bf3PYr/86kv4h1vey16ure3DdqAQr8hYSb3sAqhAmqKoSoZXAWoTSSyATrPiJN34OT1gFhJhdAPUK95KI9OY+KIng03HAO5Yh65goOuni6USvlIaLNhL7Ka1mqRFdQCGJYgQY3YEqxEgFN+gKCqAM7Ao3BTYwsVCNACmYyEsXR4ZcNBlmmTsuEg2wKkw34IYq0YbCpgMDLSiBYQXU3C2nQVSspEHHNsG5XZKg4fGUGhkA3fNDq74KWENSiJcHYaRmf3vP0xcxb8mqudawywCq3iWugFcGeqMOz2twX+xBhkVacUCSuzCGsVmN294IXilvhtI7YOKpQI3Xqb0E0XKgjW5D25aULkc1BK0eeZIIhlQ8LaDoHnLeTP2I2XWwb6ikX8289vR5ia3Tl4eAT/+6+vwzvf9lrs27trA3u6dthMoU9IiKZrpmBAkSkUuYJUQF0BNclQUwxyk4lsgA7zNWwTRdsEUNCJzYMQvhfAL9cxNV3F2KExMCFg2iZyhRycgoPOzhKKhRxsx0YuZ2tX3CrTXlBzaKBCbDsWK8BtBJn8Y1G4KcKwSRhrtGUcZFsRxgAuItcgT57Hj16lho59w8gND210T4kdwGBT8YE4FBQARGdTrjOpEM7UYHQ1qnd2dpUwNjGF3okp9HQ0wje5aYHnC4nABQDBzDREqXPBcHEzZ8OvxuIaa6n46ZZrCP0QTq41XFS6bsYppxu1g41XyjB7+8CMzR0+SmwuFpv3bDVhhoBwnOifnTyCcwjbhk351QiCWCEkrO0gmClgn7YL5zkGugsFfOFHP0TV85LlUzMVfOJTX8Rb3/wqPOvMkzewp6tPgUn0CIWF9B3OgDwD8lxBKQU3crPVJEOwCUU2QFcfhWVAWAYcOJBSQgYhZKBdNN5MFbXpMsaOjIJzAWEbyOVzyOVsdHQUkc/n4DgWcjkH5jLDKkI/hFeuwZ0lQY0gVgstkEXiV5h1i7W2ZcMvtyRRzrqGMMbBuABEXMlVtLSBiwV/ZzxXwuruhlkozLseQawGg7uylUFHR8chpdT5E00BXrQhy418f+FkJSOsGYYB27Jw6PAIis4w7NQkmNHZBS8lrEFKhGUdEroQZt6GV63rsNCBTpg5La6FfgB3ttbWraaUgj853tKevH29Bvfw0zC6eyCKHXTNJxLSec9kk3i22LxnS4aztuKZsB3wOca3Yeo+iCAIYiWQsLbDYJzBOr4fpzom/iCXw+dvvQWjs42wBM8P8LnrvoZXv/JFePELnrsNBkkKnVyhU7RewaWO2JoTxgCHAQ4UuoWCr4Bq5GTbbHnZ0nDOwS0OWHpgY0WJ2mWob7ZVAHgzVbizVYwdm9CFLiwTlm0hn3fQ0VFELmcjl3PgOBYMY+6fCRLUCGJhGq6wVIL+sJ0gpvOTxc/XM//YqpIWwVIOsoYwxgEhWkU0+t0gtgFDTcKa5/mYnp5Fd5d2xIiufJOwVgYOZF1upVIBo6PjODY6gX27B5N2btnguTxkrZEPSrvWOsDYwu5ZK+/Aq2hxrdDfBTNnabea57ctbiBrVSi33mZPKZRCMDGOsFKG2dsPbm6uiqLE2rKWec/awgBh2+COA2HbELmGiMbN9U17QhAEkYaEtR0IYwzm7m4MOyb+wLFx3Q9/iEdHRpLlSgHf+I8fYGRkHG/4ny+FmKOc+2aHQaFXSOTbjDWrEhgPOQSAHFfIMQWbYV5Hm8mATqHQuQXyssXE4Wo8CldTSkGFEiKQkGEIi3FwLgAJyLqHqWoNY6OTAItmzW0T+XwOHR2FyNFmwjQNCMYg6z4JasS2Jw6rhNK51CClrmSZiGKN13Fbi3tsqwpkTeJX8ly0cZVFxRvAtnYhBoJYKV3dnTBNE36qWMbIyHhKWCvAf3oyWSarHqTrg6eqcXLOUSoWcfTYODpLBXR2NcLUjM4ueClhDWGIsFyGUVpcKJtVcOCVtbiW6ynCm6nBaJOHVSmFoMmtxoQBo7tHu9jCbG5F5brwDj8No6sboqNry/8O6PFSqIvW7NDcW0opSM+H9DyErgfp6X+h50FGr1W4Njk2uWU2Oc/0c27ZYPPNihMEQWwQJKztYIzeIrqetR/vsC38209+itsffzyz/Ec//QXGJqbx9rf+BvK5uStJbUZEVKTAanPtnQkZpiQDwBAAmJUMswA4tMCW4woOm9/NttXyssUwxsAMAW4IAKZOvh5KhEEIhAoGY7ANDmGZUJwj8ENMT81gbGwSUErrA36obwIUQ6HooNBRgG1rZ5tpGjANAdM0YRibQ5BVYQjpuVCuC+nWdfLbSARgwtBigBDRa90GsXB4GbG5SfKMJaKXWlAQg1Kty7aqKBbDWCJ+aadYU0hlk4MsbtvyAplCdO62+PkjthyMMfT3d+Pw4caE5ejIOE45+QAAgBdtwOBA0HDzhJMV8KGuzH7yeQflmWk8/uRhnGgYKBZ1fjZuO+BODrJeS9YNpqcgiqVFf2fNgg2v4qI2UUbg+rA7Wt1q4ex0a7L4jk7AycMeziGYnEBYnm3ZLpiaRFipaPeavfWqzSulEFbKCGemoCJxdHLyGIxCPvpXgFHIg1ubpwL7coiFQxmJZGEkmmWer3HBFyZEQzzLpUI4bVuPzQiCIFKoeEyuojG9Uqnx3sZDwtoORxQd5J+5B7/pmOgvlfBfv/xlZvmDDz+Bv/zrf8KVb38t+nrnrzy1WbCiIgVG03hHKWAiZKio9uESEgwVxVAJtdvNjnKt5ZhqKXiQZivmZYthnIFxAW7qAYyKwkb9iqt/vDiDKQRyjg0mGNzZOlw/BDc4JGOYqdUwWS5DSUBFjj/TMCCEgGkKOLYNx7ZahDfDMGAYqy9eKaWgPFcnW47ENBW0Hxgu+BOcEt/aCm/RPzAKYVtN2gpiiWNMtnWMbUtBrJk4Qb9oEsSaBLOWtkWEh20p4tMaiWb6NOvnQRjC8wMEfgDfDxEEAVzfx8zoNOz9u1HcsE4TO43+/t6MsJauDMoYg9FVQJCqDhpMVmA2CWsA0NPdiYnJaTz6xNM46fh9yEfVwUVnV0ZYQxggrJRhFEuL6h9jDFbBhl9zYeZbBSIVhgimprIbmRYeOzKO3p4QA/09WjjLFxFMjLYIcMr34B09BNHRCaOze8HiCpsBFYYIy7MIZqdb3XhhCH9mFv5M45wxITJC22YT25SUkL4/t2jmevq6udZwBmG3Os906CbdhhIE0aAhnMmoUr3+p5BKwMS0OQaMRWNiA4xzcLHxvycb3wNiw+G2CesZw7jcMdBbLOGff/oTBKlBxbGRcXz8k1/AO37nf+KEA3s2sKcLk2M6/LPZbRYqYCzkcNXiBjwKDHUF1EMGQMFiet95rmAuMS+bqxh8BfhRbjY9jNkcA69mGGcQlgERpUjRFUcDuOUaoBSEKVDoLMw5cJRSIQgChGEI3w9Rq80gDMM1Ed6U0n3TQlod0nWhPHfO9ZdMHNbnLzBjy7Q4CUNoYaPFBZd6vUkG3GtBqyAWhU6mBbEmgWxHCGLNtEvQL0TWVZZJ0C92Tv6xlMtM62WpmUmmH/1Ai2a+H8IPAgR+iKrrou568PwQYSARyABSSjDGwDlHdXIWfhjM+bYEsdr09/VkXo+MjGVei+6ssBZOVaCkaglxY4yht7sTY5PTePTxp3HiCXuRc2xw2wGzbSg3lattegqiUFz0bwVjDFa+fTRCMD0JqKzocqQWYGR0Aj3dnY3jyOXAd+1BMD2JcGa6ZT/hzDTCShmiUIQolMCtzZd/TQa+7md5dknXn7ZimyFg5AsZdxu3Vj/vlx7/hC1hmenncqGxyyrDbbvJfUZ5zwiCyKLiSAKlFiecGQKMxREV0Y0kY3rSeBNGVpCwRgAAmODgJw7igpyJ7nwe1/7wVszWGwlry5Ua/vrTX8Zb3vAKPOec0zewp3Oh0MEVutoUKfAVMBrwFbjHtCDmKYZpCRhQS8rLZrLEYgFAi3yx0OZD79ffpHnadMVRMxHaFrO+ZZkAzLbLpVQIQ+0kyQhvkZM3LbwZhnbKJcKb4DAhYSoJFviA722O6odKQYUBEAaLdMHNE34aP1/Hi0UiiEWi1+IEsdZ8Y9teEIthHOAslXCfN8QyxtuIZZSgfz6XWbyIRf8PwxBeEML3I4E+DOG6Pmp1D3XXgx8GCAOpqx8rBgbAiMV404ST0895yiFzcLq8bodKEAAw0N8krI1OZF6L7ib/ZCghZ2sQnfmWfTHG0NvThbHxKTz2xNM48cBefU3s7IY/cjRZTwU+ZLUCUViZN1P6HsLZmUxbVXE8PTLR1gHLOIfZ3QuRL8AfH22djApDLVzNTINZViSyFfW1bgORbh3BzDRkusrqClFBCH9mBv5M4+/HDCMbRprPLyi2KSkhPX9O0Sz01nn8wxiEbYFb+l/rc8p7RhDEEoUzzvR9D4uiMZpEs80onC0ECWtEAmMMak8vznBM/EHOwT/ecguOTDdmIIMwxLVf+haePjyCF7/wPJSKrQPAjUGhVygUeOuNfV0CoyFfVdEqAFtWXrYYwfQ/B1nBLUgJbl5KeNus7rblwDkD59qZ1o608GYoCV6vQgQ12J6As5KcbYyBWRa45YBbVpRbJADCECr5F7SEf6w6UkJJD2qhiWTGsuIbn8MFx9jyBbF4OxLEMoIYOMsuS627FS/ya85cLjM0DaSgB1IKCkGgBTM/0P8CP0St7qLuujqUMwgQBDoMQAvuTDtaDQHHzsEoCIht7gAltjb9/b2Z16MjY40QFwDcMsALNmSl4TgLJitthTVAXzv7ejsxNj6Nx9ghnHBgD0wnB2ZZUJ7X2Mf0JHh+blf5YggmsyKgAvDIyBS6OzswPTO3SM1tB9auPQinp7TjrQ3K8xB4EwgmJ8BzOe1iy+XXLVRUKQVZqyKYmV6w2imzHbBcEcy0kOuwEVZrCCpVBNUKVLD4sYIKAvjTM/Cn24ltBXBDtBQGUP76Omy5aWqhzLYgIsFMP9ftzDDo95YgiIZYhgWEs+gfF0Yynt4OwtlCkLBGtBD0deD45xyPP8g5+MKtP8QDR45kll9/409w4y2341nPPAUXX3A2Tjx+74Z9MTgU+oWE3WZMNhsyTEZFCtaK5eZla4fB9L9cSnBTCgigBTftbNPuNj3k2i4/RgoCgM0ULAOwTQaLmfM6ARfCDSXqEgi5AAwLwrZhRAUVLGFAGAKCc/AmB1Hi3koJbc3CmwpDKBmu7WxxFOaKYBEuuO0OCWIbwxJcZvohesU5QinhBRJBKBFEIZuu76FW9VCvewjCEGEYIAhlFG2mEteZMATyeavFdUYQW4n+JsdareZiZqaMXGr2TXQXMsJaOFkGjuufc5+cc/T2dGJ8fApccBzYP6xda6PHknWU70PWqhD5wrL6HdaqkOmKowCOll04+XzkRp8fnT+uGzxfgD8xNq94JWs1yFpNu6FiF5u9NtXFlZRRQYLpOfOuxvB8AUZHF7htI3B9AAx2TzdYrz6nulKmp0W2ShVBpYKgUl1Sdcx2YtuawbkWyyKXWctzy9wSOfAIglh7smJZO+GMRfOkO1M4WwgS1oi2uMU8hp69F+9wXoiv3nY7fvTIw5nlQRji53fdh5/fdR+GBntx8fln47znnLmu1UPNqPJnuyIFU1K7ytZTfGqXl81mOiebCf24VKc8Yzqo0mRAHo0KdzIR3FLuNgXoYd3m/hGLBUiLKS2mRQ6+5RIqwIty2dVDoBZIeEGIIJQIgzqCcLol1JQzDi44OGMwTQFDGDBS+d2E0KKbfhR61pY32gzO9V9ZybnFt/VywW1WSBDbvLS4zJLGNi4zNM5DdE6gGIJQC2Z+4OtiAUGIet1Dre7C9fzIdRbqPIVK52+MXWeWZcIwHHKdEduWnu5OWJYJL1VV8f77H8GzTz8peW10F+E/3XCHyYoLWXXB83NX0hSCo7e3EyMjEwiDEPv3DsEwzUz4ZTA9qV1gS/xuKaVa3Gp+KDEbMjjz9Kkd3LJgDw1rB1ZlFmGlPPe1UCmE5Vmd40wYWmQrFsHNledjU2GIcHZGFySYbzKMMYhiCaKjE9yYX0BkjEHYunKl3dMdHUJabKskottSxLblwiNXWfsQTSsKtaLfWYIgVkM4awhoNEZvhYQ1Yk5qlo3uZ+7Gm3MW+ksl/Pvdd2VCGWKOHhvHv33zBnzz2zfh3LOfgYvPPxv79+1a0y+bE1X+bBaqZFSkoL7IIgVrRyMvWwPtzLKivGtx/jUT8+dpawdngAUtThWifQP6+NNhpLHgJjdMbNPCmcUaYtp8xR8W3FtKRIsfM2IiA4TJkVsg1DQMQ0ilIEOJWj2EDOuQSupiDanPeHyhiZOgc87ainKmZcIQHIZpQHAOIQxwMxLiOANnDAIAUxJcKTAlocJAD7pTQlxzsugNYT5BLC16kSC2+Vi2y0wPluKZRsYYQhkXB5BJoQDX9VCr1VGvuwiikO3YdcaYvukXkTidzznkOiN2LJxznHrqCfjlLx9I2n75ywcywhov5QDBgbDxu+8+PoLc6Xvn3bcQAv19XRifmIbreThhqAdWSlhTngfv2GFYfYNgxuKH+WF5Fsr3Mm0j9RBOPrfofTSjRZ5eGF09kPUawkpZ5zSbKwVBGCCcmUI4MwVm2RDFIkS+qFMfLAHpe0nhhHnTHQgBo9QJUSrpQjHLZE6xzfUaQlt16WIbEyIRztrmODMtym1GEERCRjhL5ztDNPJjjfEfYxxMcBLOVhES1oh5qXID+VMG8Mrcs3Ggvx+3PPQgfvHUUwjazPz5foAf/+yX+PHPfom9uwdx8QVn49xnnw7HXs0qUApFrtDNVYsYFURFCvxN69jSIlBNAbUmwU270hpimxWFhS4VzhpVSeN9A9n8bb4CfKxFwYRUSCdrPK7kN9lPi2hy5TnnFsrxNhdSatFNPzb+ZUU5GesZSReVit+Tpx71P9PgUSVUE6ZhQlgOBGMwOCCgXXwcKhLiFCBDMCl1GGq7gTkJYtubFbrMGOLBUmOVuLpmEPg635nvo1avo1bLus5kdOOfdp2ZpgnHcRas3ksQO5UzzzglI6z96lcPIQwlDEOLzYwzmENd8A81XGLhZAXBRBlGz/wFCDjn6OvtwvR0Gfc/NYIzBgoQ6Ukh14V75BCs/gFwZ2FhTEmJYCqbF60WhAitpTnV5oIxBpHLQ+TyOjF/taJFtnpt7j55LoIJF8HEOHguD1Eozps/TikF5boIZqZawllb+mNaMDo6wZdQRXWpMMaiypg27HQYqes2wkirVSilmvKaNQQ0vpLcsgRBbDtahLPUuJApNEKjGIsqac4hnHE9GKTx2+pCwhqxIFUIFPb34jmdDk7cN4jxsVn8/Ikn8ONHH8Ho7GzbbQ4eOoYv/9t38PVv/QDPOed0XHzBs7FneGCFPdGCWqlN5U83KlKwcc6sldBwl6UTajFkw0hjt9dywiYXyt8WC26eYovO37aWIZ2eYnBXXfhbPloMA7TktTSklAijwgKJKBeGqPo+lKzrZapJlFMKCgxCaBFMRNVyYlHOMgQsMwpb5RzCMMCFvnCKlIDHGGvkkuPZ5+Qk2iQ0u8yan2PxLrNYNNO1MjmkVPB9H74fwPd9eL52ndXrLmquiyAuFJBynXHBk3xn5DojiOVzxhmnZF5XqzU88eQhnHhCw5Fm7e1FMDIN5TcmS9zHjkF0LRzKyRhDV1cJ1WoNj4yVcXJPITuRJUN4x47A6O6BKHXOu79gegqQ2QmbGe2nX/A4lwrjXIddFktQQaBzn1VmW6uJppBx7jfOIfIFiEIJzLZ10S2lIKsVXZDAc+fcBwBwJ6fDPZ3chtxQarHNgXCcRGwjCIKIaSucpR1n8wpn0ZiQp3KdEesKCWvEoqgoDrOziN6eAgaqPRg+rheXnHYKHj5yDD9+9BHc8/TTkG3s9nXXw6233YVbb7sLB47bjYvPPxvPPuvURSXBTcOgQz9zbX4jKpJhPFzffGrrgYrDSZEV3DiyzrbVyN+GJsEtHUbqRY8cgM2zueOWfWwLhXRuI2KRazmkRbkwquQZhiEqvo9yJWqLLr7x148lHxelxbjo4hqHsWpRTbcZgic55QxDwBC62mLWXZd12nHGdChsHBZLIt3cLMdlBqbDwyKXmR4c6VVY/CSaZVRKadHM0wKZFwloza6zMAgRtnGdGYZBrjOCWCN6e7qwe88QDj19NGn71f0PZ4Q1ZghYBwbgPtQoEqXqPvxDk7D2LE54yedz8DwD947O4pS+Esymn+NgcgLSdWH29rdNUq8CH+HMdKatKvV1ea1hhgGjswuioxPK9xCWyzp8U84RLillko+NGQZ4Lg9Zq+piP/PAC0XtUFslBx5BEMRymFc4i3ObAUkuYhLOthYkrBGLxgfDRMjAbAf5/Tb27uvC4HgPzjhhL0ZGp3H744/jJ48+gslqewv+408cwuNPHMJXv3kDnvfcM3Hx+WdjcKC37bppjKhIQTshZypkmFnnIgUbjYR2c7lt8relnW3Lzd/GUvnb4n2vlFigc6NHTwE76Zwtl5WIckAUdiIVpIocc0rpMBypIGWIehBA1upJbrnEOQd9rWdIqXUMEPGFniGVa047EAzBYQgDwojFOqFzbjW751Luu9hdl3HTbRWBp0U0a3KZJaOkxmMmNHMOl1nz8YehhNfkOvM8H/V6HdV6G9cZFLghyHVGbBmuueYafP3rX8cDDzyAXC6HCy64AB/72MdwyikNx5dSCh/60Ifw2c9+FpOTkzjvvPPwd3/3dzj99NM3sOcL88xnnpoV1u57BK9+5Ysy6xj9HfCPTEHONsIivYNjMPpLi75MWpYJITpw3+gMjut00OlkJy9ltQLP92D2D7YUBfAnJ5G+zisFTIXr+3vBGAOzbPAeG0Z3lI+tPKtdanPkSFNBgHB2nqqajEOUSjBKnUvKNUcQBLFc5hTOWHOOs2bhTDSqavJUyCaxpdjUV5rtPNjayigwVBRDBRyitwNd/SX0VXuw97g+vOgZp+GBI0fwk0cexX1HDrctdlCt1fGDm2/HD26+HaectB8Xn382nnnGyTDa5JKwoyIFzSGGSgHjIUNV0c2iRju+QoWmwg0KBprENqa/+Gv1e90c0ultaPGEnQ1jOpxUYOXfEy2+yUici8Jao+dhEMLzfChVb6wn00UgtD+LRSGusctNC2ysEeYahyIK7aITQiTuqlb3XFPuOtbkrOPLzB2xQAGAdi4zQCeZXozLrOXtItdZEGjxrJ3rLAx0oYBm15khyHVGbH1uvvlmXHnllXjOc56DIAjwgQ98AJdddhnuu+8+FAq6PM/HP/5xfOITn8B1112Hk08+GR/+8Ifxkpe8BA8++CBKpdIGH8HcnHnmqfjv/7opeX3o8AgmJqfR29eYVGSMwT5hELW7n2hsKBW8J0ZhHlh48jFGCI7uni5MyhBePUC/kx3iK9+Hd+QQzL4BiLz+u0q3DlktZ9YrS4ZgA6/ZzfnYwmoZYbkM5dYXtwNhwOjohCiW2jr0CIIglkqjEADaFgYA5hbO9Piwkdssk+uM2FZsamFtOw+2tgshIseY48A64GD3/h4MjvXgWSfux9GRKfz0scfws8cexUy9/YDowYefxIMPP4lSqYALzjsLFz3vLPT2dAEACkyiR7QWKQiVzqfmbXjlz62AzpkWLJC/LRHclvgnbQ7pXEqONmJrwTkDIJaRZa4VGYWwxgUhlNJuOiklQi+Aq/zIYddYTykFBgbFIpEu2le2Yque7YuFtqRKpWjkozOF0HUeonXicFkuWCqXnYDgInLSCQhTzOMyWzgBbBhK+L6XuM78IIxynTW5zoIwSUCbdp3lcjaEyEMssTIeQWwFvvOd72ReX3vttRgYGMAdd9yB5z//+VBK4ZOf/CQ+8IEP4DWveQ0A4Atf+AIGBwfx5S9/Ge94xzs2otuL4oQT9iGfz6FabbjR7r3/UTz/4qxgJooOjMFOBMcaIZnB2Cx4XwFGyVnSe3IuUIPASNCmerpS8EePoWrlYPX2AhPjmW2lAqbl5rl+M85hFDtgFDsgAx+yEolsQWs+NmbZOtxzngIHSyVwfcwcnoCZt1Do61yVfRIEsXlYlGAWRyBo5aw1v1m7EE0qBrYj2dTC2loNtlzXhes2Epy2c1URSyUSVpgB1t+JYn8Jp1V7sP/AAC478wzc+/TT+PEjj+ChY8fabj07W8F3b7gN3/v+bXjGqSfghec+A2ceNwjV1535YfKUrvwZknCzIhaTvy2uVGql8rdRSCexGsRhiSvVieL8colAF8pIoFMIZYjA9xBGr5GExeoPvE5lwaDiwU8Uqsoy+eTicFcWuedEItSJRKxjUXirDm1lnCNIVdis1zy4noegness2ge5zpaOUgoIJZQf6n9B9OgHjefRY0e1jof/+WaUfjuP7gPDG911YgGmp7W41NOjc4w9/vjjOHr0KC677LJkHdu2cckll+C2225rO9bbLOM8IQTOOONk/Oxnv0jafnXfI3j+xc9tWdc+rh/B2CwQNqqu+0+OQ5w+nJpKWDx1xXA04OgzJKymzU2vhtrTT8ERWUfXtGSb1mHODRO8sxuiowvKc6OqonUw04RR6gCznVX5/fSrLqYOjmH64CjKI1OA0teKA88nYY0gtgqrKpjFIZrRI4lmxFxsamGtmdUYbAE6xPRDH/rQ2nd4h6LAUINALZ+HOJDD4P4eDBzowTknH4/Dxybwk8cexc8eewxVz2vdVunZ3HvvfxQAkLNNHNg9gOP3DGLv7gF07RrC0FA/TMqXsSbMlb+NIw6GowsJsc7EoZgq9bIpNFNwQHABGAJJDc1o5lDnLYv21RSambbDKqWyTrpUXrpQSvhBCFVvhMBKKTO5f9Jhou1cZ45jwzDIddYOpRQQyHnFsfRzxI+LRAAIAw9eeZGhZMSGoZTCe97zHlx00UU444wzAABHj+ocZYODg5l1BwcH8eSTT7bdz2Ya55155qkZYe2Bhx5HpVpDIZ/LrMdMA9b+PniPjSRtquYjGJ2FObQ8UScAw7GAo0coFHhWXGwW1XwFzG4it9pcMKZz/XJ7aU6++XDLNUwfHMP0U6OojLXmbRt/+DCOu/h0upkmiA2GBDNiM7Nl1InVGmwBwB//8R/jPe95T/L6tNNOw+HDh9eg10QIhgo3gIFO5AY6cOqBHhw4fhCXHzsTvzh4ED9+9FE8Pjo65/Y118d9jx3CfY8dSto459g12Ie9ewaxZ3gAe3YPYc/uAeRzqzfIItIwyIVX2vSoQEJWXCjX1xdQwcEE1/kOtDIDJliURJQurOtCUgAgLZghm+gVQCKExf9PFwBILU5CM5dRKYlFrjRiZWRFsmBOcSzdhmDxItlK8CskrG12fu/3fg+//OUv8cMf/rBlWfMNj1JqzpugzTTOO+PMk5MqvgDgeT6++a0b8KY3/FrLuuaubgRHpyCrjYlH/+AkeN6C6Mi1rL8YFBjGQ8BVQDdvTa8RowsWtF+olEI4VoY1VkWZjSAvOfI9JQhry9xGtFCfrmD64BimDo6iNlFecN3q2AwK/eRaI4i1gAQzYjuwZa6IqzXYArSrzbYbJbfpy7YeMPhg8It5oJhD375evOj4Xpx3yok4eGwcP3n0Efz8iSdQ91vzZjQjpcShIyM4dGQk097b04U9uwewd/cg9uwexN7dg+jqLNH53YEoKSErHmTFhSy7kBUPqr7wZyuBMUCwVuGNpwQ5oS/oiSA33/KdJtRlCgC0usyAjEzWeMXiuOOsaDaXy4xYW7RINrdzbCNFsuXgpfJcEZuP3//938e3vvUt3HLLLdizZ0/SPjQ0BEBPpu7atStpHxkZaZlYjdlM47xSqYizzz4dd975q6Tt1h/dgfOeexZOPH5fZl3GGKzjB1H/1cFGo1RwHzgG68R+GD2FZfaCoSwZfNW+IFRdArU5omWVlPAeHUM4UYEJYHbmGGYf0Wk97I4c8r0dyPeWkO/tQK67AL5JJyiUUqhNlrUz7eAo6tPtK9g3wwRHz4GhNe4dQWxPSDAjdhJbQlhbzcEWsRlgcA0DGOyGNdCJ08q9OOGEXbj82Fm4+8kn8cuDT+PQ5ATKqfwoi2F8YgrjE1P4xT0PJW3FQg57dg9iz/BgIrgNDvQkOZ6IrY9SCqrqJUJaWHahal4md9wydgoECirQXr0VZ+eJ4hW10NZGsIudciK9PCXYZdbf4MHEIkIzNQ3RLOMyW2RoJrG6ZESyOUSx5rbNLJJl4AzMEGCmaDyaOjSYmQITE5M47blnYvjZpyy8L2LdUUrh93//9/GNb3wDN910Ew4cOJBZfuDAAQwNDeH666/H2WefDQDwPA8333wzPvaxj21El5fM61//SvzqVw/C8xoTPF/+yn/gT977DhhNqS2MrgKM/g4Eo6mQRKXgPTwCHOiDMbD8wlyuYjgScPQJCScaBkkFTM7hVlNBCPehY5Cz7cdj7kwN7kwNk49roY1xBqerkBHb7FIOXGzMmEspher4LKafGsXUwdFFh4NzU6Bzdy+Ku3pQGuxG94FBuoEniBQkmBFEK5taWNsJg62djmIcbikPlPLo29eLFx/ow8Xjp8GtuJip1XF4chKHpiZxeHIKh6YmMV6e367fTLlSwwMPPYEHHnoiaTNNA7t39WPP8CCGd/VjeNcAdu/qR6GwvDALYv1QSkG5QeRCi9xoVU/fGWxmFHR4HFZRqItDVuNcYrxRkSgp583R9Doe2DRtl1oWi12KMR1RGbntFGfgHIlABsYBBl2Jc97QTE6C2Sozp0jWVjDT+coQbJGAbs6yApmRFsmMtsvYAjftfm0Whd29cLqK63QQxFK48sor8eUvfxn//u//jlKplKT56OzsRC6XA2MMV111FT7ykY/gpJNOwkknnYSPfOQjyOfz+M3f/M0N7v3i6O3rxqtffRn+9V+/nbQdPjKKG37wY7zssotb1rdPHIIKJcKmEEXv8TEoP4Qx3LnsG08JhpGQoyB1saKq0hEFLevVfbgPHluS21tJhdpEGbWJMsYfbrQbOQtW3oZVcGAWHFiF6HnUJixj1W6klVSojE5j6uAopp8ahV9rzefbDmEb6NzTh669/SgOdYMLjsD1QQWaiJ0ECWYEsXw2tbC2EwZbRIPQNIBd3TB2dUOEEk7VQ1/ZxRllF7Jch/JC1H0fh1NC2+HJKRydmUYoF3/T6PsBnnjqCJ546kimvbOjGAlt/dgdCW5DA72wLHO1D5VYJNJrEtEqXqZi2pJhAMtZ+nmok9MjlJtfmGtGQfc/bG1ed9qIdXpwNY+gx3mjPb1O8py3tmcERD63mLjFUEplEvK3imNBS9uWFclMo0koE61C2QY5W4iN4zOf+QwA4AUveEGm/dprr8Vb3/pWAMB73/te1Go1vOtd78Lk5CTOO+88fO9730OptHz31npz6aUX4Mc/ugMHDx1N2v7zv2/Cs555KoaG+jPrMsHhnDqM+kOHEY5lxTX/6UkoP4S5v2cFv3kMFcXmvGiEZRfuQ8eApiIhigFWKYegXNfXz0US1DwENQ/V8dm2y7khYBVsmPmU6BY9WnkHZt7Sv/tzIEOJ8rEpTB8cxfTBsUgQWxgjZ6FrTx869/WjONA573sQxFaGBDOCWHs2tbC2UwZbRCtMcIiSA1FqFCRQXgCr7KJY7sOJkdACqRCEIUZmZjLOtsNTU4vK15ZmeqaM6Zky7n/w8UY/GEN/X3cktGmxbXioD/193RROusqoINThnCkhbSmV/9rBciZ4wQYv2voxb7XNd6aUAkIFJWUkWClARo+hhIrENxXKRIhTcfsc6+4YZBQGmjpVG3b0kZMvEfHS4lta3IvEu5b2ZmEw1b4oYY8zKIWsULZApcsVCcXrSSySpcSxdmGXJJIRSyVO6j8fjDFcffXVuPrqq9e+Q2uEEAK/+bqX4+OfvDY55iAIcd0Xv4n/9Ye/01I8hTEG87heMFMgODKdWRYcm4GsujCGOiG686t6UxtOVuE+MtJyHWOmQG0wj+HTjkN/bzfqU2VUx2dRGZ9BbXx20TnL2iGDEPXp6tz7YICZs1PimxbguGlg9sgEZg6NI/SCRb2XVXDQubcPXfv6ke/rIEGA2NKQYEYQm4dNLaztlMEWsTiYZcDoMYAoea9SCqrmQ5Zd7C13Ynd5AKrmJ8smKhUcnprEoclJHJqawuHJSUzXlpa8WimFkdEJjIxO4K5fPpi0m4aBof4e7W4bHsDw7gHs3jWAjlKBLkKLQIUSstokormLGxTPBbONlIhmgRfsRd/YM8YAQ+f/Wg2UUvqmJOWKi0W4jHi3qOWReEcsTOTki5+mm4kUgreKY/OJZKYgJwdBrAL79w3jRc9/Lr5/80+TtieePITv3fAjXP7S57eszxiDtacbzBLwn5zILJOzLrzZET02GizB6C/p7+8K8I/NwH9ivLUfORP2KUN4/PGnUL3vEVz6gvOiPGod6MNuAEDoB6hOzKI6Novq+Ayq47Pwq0vLlTsnCvCrbrS/mQVXb8buyKFrbz869/Uj112kcRqxZVBKi2TtRLPkUxznqiXBjCA2lE0trBHEfDDGwPIWeN5KkvmqUCZizUC5gN7uTpy5Z2+yTblex+GpKRyanMSR6SkcnZ7GsZmZJYWSAoAfBDh4ZAQHj4wAd96btBdsG7t6e7CrvwfDg30YGuxDsZiHnXeQKzhw8g64KXbUBU1JBVVrFBaQFQ+quricJ3NiCvCCBZFyo630hmI1YVFVUQg+d3aWuYoAKAUVTyxG/1cKgFRgSmkhTiooCUBKQCFq1+uoaNZSryNTz1X2ebQs3l/rc5k8J2VqE5MWyRYrlG1xkSwIAtTrLmo1F7W6i1q93nhdi57X3aitjsmJKXzj+h/ij/+/q3DWOWdsdPeJHc6vv+IF+NX9j+DYSEPA+s//vglnnn4y9uxpX33SHOoEMwS8x0Zbfo+VF8A/OAn/6SmIvgKM3iJ4yVlSNWqlFPyDky3OOADgHQ5G8sB3v/IfuPsXD6C7uxPPv/AcmGb2FkKYBkqD3SgNdidtoRfAq9ThVerwq2703IUfty0y/9lycLoL6Nrbj659/XA6l1tNlSDWjoxQphrjLaVUlKcWjRy1zaJZnFKDcRLMCGKTQMIasa1ggkN05iA6dSECpRSUF2qxrVxHR8VGMZfDyUONwWsoJcbKszgyNY2jkdh2ZHoaE+XykvWEiuvikcNH8MjhI3OuYxsGbNOEbZpwLBOOZcG2TDi2Bcex4Ng2HMeGk9OPubythbm8AydnI+c4sB0LtmWBL2HgvB4opaDqfjaks+JFytAyEUw70dIimrXJxclFVc6M+x+9YogKAmSLAGyGqpmJA28u8U2qxjrJczlH+yJEvwWEwW2L4HOKY625yaKQzE32GzAfUkq4rqfFsFpDDKtH4lit7qIei2W1ekYcS4tlvr88d+uxo2OrfEQEsXQsy8Rb3/Ib+PgnPp9EZoShxF/9zbW46IJz8MJLzkNPd2fLdkZfEcwU8B4dbZ8mQSmEo2WEo2WAMz0W6sqBd+bB7bmH+0oqeI+NIhyvtCx70i/j+7f+DPc98FjSNjE5jRtu/Ckuv+zCBY9VWAZyVhG57vaFQ5SU8Kou/EokulUbolsswMklhMvne0vo2tePzr39sEtUkIrYWJbsNouqxzMutNuMp8SyWEAjCGLTQsIasa1hjOkQQdsAeqMQ0thB5QZQXgjDDzDsdWCXPwTlBVF+JAk3CHBsejpxth2dnsaRqSmU3ZWFNrhBADcIgCWGpbbDNo1ImLO0SOfYkUBnw3Ys5CJxzsk7+jFZHgt4FhzbgrUMkS4RLZPCAqtRXIAlYZy8YIEXbTDH3FyDiVjXUSr1slk0AxIxLP5/m8qZm0E0WwyJAw8bXx9NxQ66JTjuGi6/hUW7Fjdfpj29Pzm/m69ZJGsrmBlZN9kmFcmUUvD9IBHA0u6wWpM7rFksSzvLXNddkca+UsqzrcIBQWwEB47bg5e++EJ85/ofJm21movrv38bvn/jj3HO2afjxS88H3uGejPbic4cnGftQThe0XnWKnM4vqRCOFlFOFkFMA6WMyG68lpoKzbcbCoI4T40AjlbTzZVSuGhY0fxg0cfwqNPt58k/MrXvoPLLj0fYoV5FBnnsIs52MX2IphSKut6axLggroPq6hzpnXu7YOVd9ruhyBWm9Vxm7EkXJPcZgSx9SFhjdhxMM7AIgfUXCgp4XghOvwQJ3pR4nFPJxufmZ7F4ZFxHB2bwJHJqUR488OVJdpfDq4fwPUDoLL8pMGAHgBYsWvOTolusTDn2LCEgFCAIQERAiJUMBSDIThMIWBwAUOI6DmHIYReFrUbUbtIhaGxnJm40ETRBsu1Ly6wbuxA0WyrweIEvFyH/m70X7bFzQdsKpEsDMOG26tN6GS9jTsseZ4Sy8KtUmRhHiplEtaIzcMrLn8B7rn3YRw6fCzTLqXC7Xf8Crff8SuccGAPzj7zFJx88nEYHuoHj4qnGP0liL4iZNlFcGwG4URl3pB9VfMR1KZ1qKdgEB058M4cgqMzUHWdm1YqhfsOHcIN992Hpycn5txXLmfjkovOgR8EEMJalb/FXDDGYNgmDNtEvoeKkhErQ6XdY1LqCeIwBDPNOdddjtssHZ7JeEpAIwhiW0PCGkG0gXEO5nDAab3Y9qMf/TgeZ0HndFN+iLAeYGxsAkcOj+LwsTEcHhnDkfEJTMyWN0RwWyoKgOv5cD0f02vs6uCMwTANmIYB0zRgGAKmYURtImprtCfrmAYMYcA00+vr13r9xvZmtH36fUwjWi81U0iiGbFS1srNp5SC63kLCmDt3GHp5Z63tOrIWw3OGXKOA8exkHNsODkHjm0jH4fS5xx4rodTzzoV5114zkZ3lyASTNPAH/7+b+FLX/lP3P3L+9u6OR99/Gk8+vjTAIBiIYeTT9yPk0/ajxMP7EWpVEA+b8M+cQDKCxCMziKcrM7tYosJ0242nQ7jF089he/ffz+OzbTmWIspFnI479wz8Yb/8VIcOG73so+bINaKrHCmoJRMxDENA+OAgnaHccEBywQzBKTvk9uMIIgVQcIaQawAJjiY4OCOiV1du7HrxN14dtM6YShRd13Uqy5qlRrqNRf1ak3fAEc3wfWaG+Ue8vTNtBs9ej5c30fd9+EGwZYQ6RZCKgXP8zf8hp9FAln6H4+f8zZt87VHy3gkuDHGtLOgeZ14Oz7H+y7iPRga/Z7rPQBklyG133h7nlrWZt/6dXq/rX+vhZbxyF220DKeGpjGxwyG1PPmv0Vqn+lji4+v3bEtZtkij3shgiBoyR2WFryak+vPlWdsMZWxtzK2HYlhjhWJY3YkjunHXM5Bzmnkl8znc3ByDnI5G7lcDrmcDcu0wDlP6dwNYTy+MTr42NN43qXnYfcJe+fsC0FsBMViAe/43dfj2Mg4fnDTT/Djn94957WxXKnhzl88gDt/8UCm3bZM5PIO8k703bAt2FzAZgKWZHAMA45pwjGivK6GqV+bJh4ZOYYb778f45W5J9S6Okt48QvPw4XnnYWZ2QryFG5JbBCLEc6SawEYmGBg3NBimB5U6ElSofOX6UI+0XWf3GYEQawQEtYIYo0RgqOQz6GQzwF9XUveXikFhBIqkAg9Xwt01RpqVRduteFUqdc8LeC5Hlw3Eud8H3U/gBs0xLn4MdgGIt1KUHEuDCp5SSyRdqJbLA5KKZedXH+rYAihxS/b0kJXFC7eIorFy/JaIMvnc5FIptt54gaNb4a0qAmAnKDEjmJwoBdvfN0r8OuveCFu/dEduPGWn2F6enZR28Zu8yksbv3F0t/bhcsuPR/PPfcMmEZ0u0B5Cok1RjXlOFUqypfK9LiNRdcKsGiijBta+BIMnHGd3zTtLoscZi2iWfRIbjOCIFYLEtYIYpPDGNMJzg0B7pgwO/IooXtR2yoZi3IhVCATgU4FIULX1+6YqnbNuPUo7Mz14NZduH6AetBwzPlhiEBKBFAImUKgFAIldXsQwPejxyBE4JNwR2xfVJJzZWvBGODYti5qYtsNQSzJpeggl7Mil5iNnJNruMVykVss78CK89GkRTGwSAsjYYwglkuhkMfLLrsYL37R+fjFLx/Evfc9hIceeRJj41Pr1oddQ3142aUX4NnPOm3FxQkIohktmMkW15mKqqkzACp1bWGmdpzp/IIicpoJQHBwIcCY0EJaSiwj0YwgiI2AhDWC2MYwzgCuqw42YwKYK6AjGfCEEoiEOGYIXaFzkUnZpVQIgqAhuvk+/CCE5wcIAh9BEMCLRbhoHT8IEQQhgjAt0oXwgwBBGIt3IXw/0G1BAN9vPPrJa72OlFs/4TpBADofU9oZ1iyK5Rwn5RaLQyUdOHkb+VweuZwDyzHBuUgyCDacYu1DKAmC2BgMw8A5Zz8Dzzr9BDAA41PTeOiRp/Dgw0/gwYefxPRMedXfc//eXXjZSy7Amc84aclVwgkiJl0YQAtnCpBhKlpTZ7VlDNpVZggtkMV5zIQOyeSGASaEDt1MC2U8VTCArlUEQWwiSFgjCKKFOCE7ExxYqOhXqpJmupYmlIJhcJiGhZwTD36iQC8eD5LWtiBAGEZCXJMAlziOlM75ppr+ySgMoaWtuR2N1+32o2T7dikbjqd27zXX+7XsS0Z9SNrQ2oc2y2QqT4lMlYiP97/Qssbz9n+/tv1J/a1U9FlJXsfHIFPL2h2fTC2L/o5A4702Izq5fuQGc6ykym4jbLKRWyyfs6McYrlIHNNhk/l8DsIQSd4YABRCSRA7iN6eLpz/3C6c/9xnAgA8TzvOq7U6qtU6arU6qlG+Rp2/0YvSRHhJPkedx1GnjKjVXEgpwTnDSSfsw0svPR+nnHQcCRXEvLRUypQqCt2UyZggFs7iHGZccDDHicI1OTg3wA0BGIYW1KJ1M04zkGhGEMTWg4Q1giDmJiWaNV4uUEmTRQMqRNb8aHEinK1jElghBIQQsO2F1EFiO9AsXsaim0zlapFSasFQNouXEjpCRTbWbRYWZSSG6j1Hr1lDqIQCFzxxi+XyNizLjsJUgEQWoxBKgiBWgGWZsCwTnR3FZW2vlILvB2CMwTTpVoDQZMI0VSSaxe6zdD7axD3GwU0BCBNcmLqYl4hEM8NI8mg2rnmcBDOCILYtdDUliJ3InIKZblOsWTRrPDZyWayt24wgkBrMJzPl6UX6WTSDjmRdpgCO1EeRQwu6TFcA07CkgBg4A8BTSZHTOVr0usmnmkQxgiC2OIwxWJa50d0g1pHWnGZRyGY0CdXiNmORSGaZOiRTcHBhgInIaRa1JVUzKTSTIIgdDglrBLGdWLFgpl+nRbNG+BkJZ8QiSBSv2MWFNoJYSghLCWLZ/aAhbKU/jEi0r2jwLxoVwsAz22TCJpFqp3xiBEEQxDYhncIhEc9ktihADGMMijNwzsFsS+c2S+U1g9A5z7jIVtEk4YwgCGJ+SFgjiK3AfCGZ0bLGeKe9wyzOWUGCGdGWZbrDkonu9Mcn5eiKGhJ3GBMMgGhyh/GMgEbuMIIgCIJoFc3iVAWQMjKZRRNY0ZguEc1ip1mS24yDmUbiOksqaPLUdZggCIJYNiSsEcRGknHtzCeYNYllABCHZMbVkeIFsXOHxLLtTSZb/9LdYZkceXO5w+KmBd1hbcSwaDfkDiOWTDyBoCtVJHnzAAWlE9wlQnDjphOpn9IoJDh6xgX9FhIEMT9KKchQV0GXoYSUCgyAkVu9HK0qc91G6tqcdps1xDOmUhlt4+spZ+CGABPabYbIccaFARZV0szmNqMwTYIgiPWAhDWCSLOoyoIZFWwJu20k/QfiVBbzCWY8ETYoj9kKSG7IZePlXKGHmGNZ2+YlfwASfSn9Vks+lZl9NYthjbbYHcYgGurYYt1hiVBGghixCBJhq1EtViU3i0BcRU6vGt9A6nUYABUpYLEQFn8OG4+Rk4KxqJgwA7gA50zfVHLtusjcTPLo080ZalzByNkb8qchCGLzoaTU4lkgIcNQ5xljDEIIcFPAdGwYlgHGdWVn6bptxwjZZyxzfWZRs2Ltxows8wDEv3e6GjtLh2IKoYsEpMI0M4UAKEyTIAhiU0DCGrFziG/8ov/mHoKsZHDSflsSzNaAuQSzpBpkyu3HAcR/9zgUMVqUhbU/he3WAxp5u9qtNNepZHOvtPiz3+wIQ9NnCfRZItrTxg0W/y5CQTvC0g6KtBusSQAD4t+26HnTDZ4WvCJhjHMthDEOLiIxjPHICYlku8Y+dJte3siRx/jSbyANx9SiG0EQOw4ZRuJZICHD6MeMMXChK1paxRyEKcBFlF+WxbZYAEJAGIYev0Wk0xPo143nyDzljdcsNY3FMo16iMI5mBGFaUa/i43JLqqkSRAEsRUgYY3YvqSStiqlEtGBMQbGRcO5sxCZ8dJCG8yhytCgaPEsJJgh5e9LC2Zcn9ckZDF2rEQ5RBLRic4FsZWIhTDZeGx1gwHx71ziGFPxNyUbFtm4KYy+M/F3IhJmmQAYN6Iiqg0BjIt0aBGS7xHj0c5i4S1eBwCYnsJgjDVCOtPHlHK2te9/u8fGsSavo/0mYVZNr8NQrsqpIIidhpQKQRDA9wP4QQA/CDe6S3OilB43xC40LaLp3yhhCAjbhO1YEKYBZkRCv5JJ3jIwgBkM3HTATQvCNsEtRzvHYuYbD84zaZZtbl1GwhlBEMTWh4Q1YnuQurmCkpkZQX1zKKL7PQ5QgtaNoV1OJBLMiK2GUm1Fn3SBBykBKJ2jRxvBJJRU0Wv9T8bCsVQpsQyQmaIQKnUfxqCYAgPX75vkuoNOVs0YVHMYJGOppNaICplk8/UwprLmCcGhVAgmAcgADAyKIXV80Vct3k08YZEsYxnxLnZqJC42pIS5xMARhXjG6zD9uw3on4J4nyw6zjjPEGMMnPFk2+R15PbgkRuOM45CMbey804Q2xgpJTw/QBAJaEFKQDNNA6ZpoFQqYGigF8Vifs36EQvrses8kzs0JbhnJk6j31YGFVW2FDBzDoRtwjANcFPo8EooqCCEkiGgAiCMcpU5NrhlQtgOhBkl/OeCxC6CIAhiSZCwRmxN2oZ1cv1oaCu9dlLEFTGJNWPJgllKFNtugllzYuJ0U6aoQDrnSiPvXtKomjZRyf+yz9t2Ye5l8/W3Zas5djOXoyh+nnYKZYQnQH8QZOxSQuYAo7RbDTdT9Dz+6yhAJ3Zuu072b5puj4+TQUFFIk+yj7afLQWlIqEnE/QILVQl7tdYzEHyHNExMvBGkul0XjDGdUS4EGCG0CJQXK2N6/AfznW4OBORSBSFJwkRrxuFKwkOETnKOOdanOKN704sKDGuhac4FLLh3EXqGFoLTiThl4hNaI3vYrz/9HbtHpO/T3Mbsu/dWN7aH7q5JYiVEYYSYRgilNFjKBGGElKGehKAAZwxWKYBwzDQ3dWBfN6BbVmwLFP/M00I0X5SMl21UsXJ92UbB2rqEsbaPEaW2pTQn/oNYI1HIMpDxvRkARcchm2CGzo/mjAMAAoqlFBhABX6UKGCivKUCVMLaNy2ICwrGodQuCVBEASxMkhYIzY/6VlLxCE9c7jRtpoQsxa0CCttFJK0MNF2m9ZdJFskOZnmEMwYwISxcYJZOpF65ARSKadQerAfH1LjMLXYwhLBq0lYiY5XO3ayyzP51pojRFKiBRprZ/4GKhaKFZI+SimjtoabSSkGGZdGjA4LSX9SwmYkICmlWm5QFFTKuMQSeTruk47cS5/h+NhU48aGadEoyZGVdiVFztDUPVJyw8QYiyXwZDvw1LZJP3WbiN1HHRx4cwAAJa5JREFUjINHIk1DPOJRXhwtZsUupVhEip83cn41xKWGQypelhV1kiOP3i85BH03lxGHeJIPJ/W34TypRpmIZ4xlBa4mYa5F5CIIglgkruuhWqvD9xtOUwZAROIT5xyG4HByDkzLhG2ZME0TpmnASl4bbfMRKqUQ+gFCL4CSUl/74ktjNHGQFvfBOITBwYxY3M8K/82/l2nhrJGQv2kigDWtm+6flFBhCBWGCOse4uuKMExw2wQ3TfDYkcbj6xP9zhIEQRCrBwlrxMaT1i0yDpq0Gy1yTySJXeMb6WWEdSoFKLk4Z4+a9+Vi37DpafPrBfYe6RvxpvOOBRMtpFnIST9v3kGbHbbqQIhz062bYJYRyCKBSaLhhJMyEaEyXY8H3nFy9LjvgutcKbzh4olVH558jtLiWFr80Ytk/J4pwU4mApcOR4nblZKQkbgnk/BBLcTFoXpSydTNBXQlMKZvgDhnMKJ+i7jPgM4VIwSM6JGzxjngyc1NLOKkhZqsOJRxBDW3xf1ZZZdS9j3bhP+RqEQQBLFofD9ApVqD5/mwLBOdHUUUi3mYhpFcJwwhIKJHw1h8iKOSEqEXIPQlAAkmBAzbhLCMrDs2Fs7iSQgdv404t2Lahd1+zJN6VKmXLBnQ6Mt+vKC5+zKa8BECwjLBzTyEZYHbNrhh6MlXKl5CEARBrDEkrBFLI+30iZvmfBWHgSEzEGod0rUb5MWDtciNttywTiUTASZKfKTbkwqdC8DmeNniQJpr49gFlG5u98dgKVfQfKJY40X7t2apzVnrSs37yazSNAMci0GM6dxQqXMrm8XQMHWuU9vHjSoVFqKkjCoPylTYSDyebuwg+RPHA2LGtI7KBLjQIhRid1Iyk61nqRmgz3GcWD1yFMnkuKCFLxklO06Fsei3YpCqUTk2iVBhXIf2pfM7Cd0mon4IzrXoZRgQgkMIAWFwCGEkNzU8FcLHGQMXIuOuipcLzrPr0s0BQRDEjsEPAh3SyAAZu5iVnuRxXR+GIVAq5rB/7y6UigXkcvaKJifCIIT0AoSh1I5hU8DuyOlrmCVgWBbYHCGh4ExH2Mt44lLnPAOQmrBC9klzX1ljwq5pg8bqLeMYHhUasHVVTcH1pBpBEARBrCMkrBHtyYRfqlToWMuoBohbGBoOspRAxNCovtlGH0qes5aGJQyMlIKSYTQ5KhsKTxy2JRhYlEsjdi/NOfBaJ8dMIjTFQk9TGCDSzqjoeGKBKw73k3GlwHSIY+Y1MutHB9j0vG3vEmGOxQIhQzJYRpScPYkMhYoqawG6EmDj7DPBkoFyOgxEl7rX4ik3GtUHm2fCkTwicWAByN48zHHOGuazlBOK6fBCbggtggkDwmy4wBjjicjFRSyk8YzwJYTICGPNywmCIAhiKYRhCM/z4XoefC+AVBJChRBcJOHkPBq/GIaF4aF+dHQUUMjnljXpEudGC/0QoR9ASQVuaFea45jR+3Bw0wC3dD4ybhp6Uiveh5RQSgJSRhNQeszFhQAzjGiCtKlvC05ILhFyOhMEQRCbABLWiJYcZpncWW2dY00zies5oEmFcWqnk2z0Ic7pZEYCGo9zsC3d6ZbJcRWH+EkFqVKvm9bRlanCROxK+guWCF4NcQqASuVugk4e3Ij1jPJXxYar2Fqm4oGrDl80IncW4zokME5szhnAuQAYkjBCHgmfSfqSJERPJ1SPxTMwBsF4kjuLJeJY5KYyePSekWAphHZcGVyXsY8SqcdimR5k8+R8cMHbimPzCWXZRe23mXNfBEEQBLEJCYIA5UoVnutDCA7bMlEq5NGxqwjHsWEyCTMqdiKa8jQ2kxQPiB1j6QICMs7jmd4AYIJBGAJ2Ka8LAAgGLgAuDHDThLAtMNMEFyIR4mQQILKdJ2MvbllgwozGBeQYIwiCIHYeJKxtI+IQAU0qV1lzeF5caS8zyEqFz0XiS9wOyaAQpnbS7LZKOa2QfQ2l80vF2yQJ11Makq7AF3vjtCiiIsEsFq1YqBBllEdDGdIuIQih+x+LfixKx57+W8RuO6mgmHZjKQm9z9jNFXUqrljIo5xWcd4QzhquKR6JRaYQ4MKAMCLnk+AwollaHjmbwAGeEiYTVxPTghkXDIjErcSxlQoH1CKh7odIBq0sGbiyWBSLj58j6SvS4Z7NYlbaVcgayxuhGNF+0/vhaUcZT4RBgiAIgiA0UkqEUgEyRBiGcF0PnuvBr1aT67tSCkIIdJQK2L93GIV8Totpph6aK6UQurVo3MKSfKOBHzZEtFBGQxg9oOKpa3S6gABPqgrz5Dqezj7Bo/EJM02IODeZEEk6jdAPk3EE4wLMsLQrjSpqEgRBEAQAEtY2LXpQJiFD2XgutTuq8S/yljEAUFpsiUUqbeyKhCuZrvmHWHzSgymRFVi0JJW8TgS6dM7Y2EWVymsV550yomqAQrDIQcUTJ1UcMhcbsZLwwMg9xZNHHoUTRoM/3kg6D87AmYBKCTpxf9MBjrE41uh8JJpFT1Xk/OKx44ozGIYBHuXE4okLK2pnHMIQjfDATAL8aIAaOc3SIlWmuhWa2lN/0IyQyUCDVIIgCILYYiipMD42ianxSViODcM0IQRDR0cRXZ0lMNfVglmoEPgB8o6FQi6XONLDmgtZcxOxLPRdPV4SOk1BXEGZCw7uCAjTaIhmGfGMRZkZVGNCVaqG0wxAHELJhIBwbB26yeKxkgQCqSdaowlELvSkIQlpBEEQBNEKCWvrSL1Wg+u6CMMQMpQIZahFs1AlubSgAKbtUuAARBSCJ5i261uGAcs0YJgmDMHBeZwnSs9MxsIMT4VpckM7ujhvDMpY7PJCwwDWyGUVObSARBTiQiQuK8YaIhmPXUyxWMezTicWTYUmDigehRRGLi2IOHQxVttYNGiDnhUVAlw0jismnS+rWbTKLm/0Jb0PGhQSBEEQBLGajI1NoKe7E7tOPQE5xwbnAkwpGIaAkgq+lEmetNhRxg0BbojGOCy2kEFBeqZuT1fg5NnxkB5pSS2aBUCIeHSHqAp2NAFqCoDrsE6wlOs8EtNYbHoXZiM/GlXUJAiCIIhFQcLaOsBNA4XOItxqXbuhDA7LsmBYBizLhGUasExdwtwwjKSioGGJaLZTwIiSqyNydDXC/3giSMUhi8w0waFnLtODqkZ+rvQgKpX0tU0YKeZqanJppfuAlOjF2j0nCIIgCILYJnDGkCvkMLS7H8PDQ6gdm4IKA3DDgOGYEJYFZnCE5YJeX3AwU0STlvGkZyNNRDyOCuo17R5rHp81p7pINbFokrMhnM1fUZpxHglpopGXliAIgiCIJUHC2jrQPdiLi37jMgCAYRiw7Cg3RbOwRRAEQRAEQWwpLNvC6WeeDNuxAQD2Pitx+6dRHVpYW+y4z8jlVrejBEEQBEGsCSSsrRMd3Z0b3QWCIAiCIAhiDYhFNQBRCo5WaCKVIAiCILYn5PcmCIIgCIIgCIIgCIIgiGVAwhpBEARBEARBEARBEARBLINtI6x9+tOfxoEDB+A4Ds455xzceuutG90lgiAIgiAIYhWgcR5BEARBEJuVbSGs/cu//AuuuuoqfOADH8Bdd92Fiy++GJdffjmeeuqpje4aQRAEQRAEsQJonEcQBEEQxGZmWwhrn/jEJ/C2t70Nv/u7v4vTTjsNn/zkJ7F371585jOf2eiuEQRBEARBECuAxnkEQRAEQWxmtryw5nke7rjjDlx22WWZ9ssuuwy33XZb221c18XMzEzyTym1Hl0lCIIgCIIglgCN8wiCIAiC2OxseWFtbGwMYRhicHAw0z44OIijR4+23eaaa65BZ2dn8u/w4cPr0VWCIAiCIAhiCdA4jyAIgiCIzc6WF9ZiGGOZ10qplraYP/7jP8b09HTyb3h4eD26SBAEQRAEQSwDGucRBEEQBLFZMTa6Ayulr68PQoiWWcuRkZGW2c0Y27Zh23byeq6BGUEQBEEQBLFx0DiPIAiCIIjNzpZ3rFmWhXPOOQfXX399pv3666/HBRdcsEG9IgiCIAiCIFYKjfMIgiAIgtjsbHnHGgC85z3vwVve8hace+65OP/88/HZz34WTz31FN75zndudNcIgiAIgiCIFUDjPIIgCIIgNjPbQlh7/etfj/Hxcfz5n/85jhw5gjPOOAP/9V//hf3792901wiCIAiCIIgVQOM8giAIgiA2M9tCWAOAd73rXXjXu9610d0gCIIgCIIgVhka5xEEQRAEsVnZ8jnWCIIgCIIgCIIgCIIgCGIjYEoptdGd2Ggsy4Lv++CcY9euXRvdHYIgCIIgtgBHjhyBlBKmacLzvI3uDjEHNM4jCIIgCGKpLGWcR8IaACEEpJQb3Q2CIAiCILYgnHOEYbjR3SDmgMZ5BEEQBEEsl8WM87ZNjrWV4DgO6vU6hBAYGBjY6O6sG0opHD58GMPDw2CMbXR31hU6djr2nXbswM4+fjp2Ova1OPaRkRGEYQjHcVZ938TqsRbjvJ38vdos0DnYWOjvv/HQOdh46BxsLJtpnEeOtR3MzMwMOjs7MT09jY6Ojo3uzrpCx07HvtOOHdjZx0/HTse+046dWFvos7Xx0DnYWOjvv/HQOdh46BxsLJvp70/FCwiCIAiCIAiCIAiCIAhiGZCwRhAEQRAEQRAEQRAEQRDLgIS1HYxt2/jgBz8I27Y3uivrDh07HftOZCcfPx07HTtBrCb02dp46BxsLPT333joHGw8dA42ls3096ccawRBEARBEARBEARBEASxDMixRhAEQRAEQRAEQRAEQRDLgIQ1giAIgiAIgiAIgiAIglgGJKwRBEEQBEEQBEEQBEEQxDIgYY0gCIIgCIIgCIIgCIIglgEJa9uUa665Bs95znNQKpUwMDCAV7/61XjwwQfn3eamm24CY6zl3wMPPLBOvV4drr766pZjGBoamnebm2++Geeccw4cx8Hxxx+Pv//7v1+n3q4uxx13XNtzeOWVV7Zdf6uf81tuuQW/9mu/huHhYTDG8M1vfjOzXCmFq6++GsPDw8jlcnjBC16Ae++9d8H9fu1rX8MznvEM2LaNZzzjGfjGN76xRkewfOY7dt/38b73vQ9nnnkmCoUChoeH8Vu/9Vs4fPjwvPu87rrr2n4e6vX6Gh/N0ljovL/1rW9tOYbnPe95C+53q593AG3PH2MMf/mXfznnPrfKeV/MdW07f+eJzcOnP/1pHDhwAI7j4JxzzsGtt9660V3aMSxnfEusLddccw0YY7jqqqs2uis7ikOHDuHNb34zent7kc/n8axnPQt33HHHRndrRxAEAf70T/8UBw4cQC6Xw/HHH48///M/h5Ryo7u2bVmre77VhIS1bcrNN9+MK6+8Ej/5yU9w/fXXIwgCXHbZZahUKgtu++CDD+LIkSPJv5NOOmkdery6nH766ZljuOeee+Zc9/HHH8fLX/5yXHzxxbjrrrvwJ3/yJ/iDP/gDfO1rX1vHHq8Ot99+e+a4r7/+egDAa1/72nm326rnvFKp4KyzzsKnPvWptss//vGP4xOf+AQ+9alP4fbbb8fQ0BBe8pKXYHZ2ds59/vjHP8brX/96vOUtb8EvfvELvOUtb8HrXvc6/PSnP12rw1gW8x17tVrFnXfeiT/7sz/DnXfeia9//et46KGH8Ou//usL7rejoyPzWThy5Agcx1mLQ1g2C513AHjZy16WOYb/+q//mnef2+G8A2g5d//4j/8Ixhj+x//4H/Pudyuc98Vc17bzd57YHPzLv/wLrrrqKnzgAx/AXXfdhYsvvhiXX345nnrqqY3u2o5gJeNbYvW5/fbb8dnPfhbPfOYzN7orO4rJyUlceOGFME0T//3f/4377rsPf/VXf4Wurq6N7tqO4GMf+xj+/u//Hp/61Kdw//334+Mf/zj+8i//En/7t3+70V3btqzFPd+qo4gdwcjIiAKgbr755jnXufHGGxUANTk5uX4dWwM++MEPqrPOOmvR67/3ve9Vp556aqbtHe94h3re8563yj1bf9797nerE044QUkp2y7fLudcKaUAqG984xvJaymlGhoaUh/96EeTtnq9rjo7O9Xf//3fz7mf173udeplL3tZpu2lL32pesMb3rDqfV4tmo+9HT/72c8UAPXkk0/Ouc61116rOjs7V7dza0y7Y7/iiivUq171qiXtZ7ue91e96lXqRS960bzrbMXzrlTrdW0nfeeJjeO5z32ueuc735lpO/XUU9X73//+DerRzmYx41tibZidnVUnnXSSuv7669Ull1yi3v3ud290l3YM73vf+9RFF1200d3YsbziFa9Qv/M7v5Npe81rXqPe/OY3b1CPdhardc+32pBjbYcwPT0NAOjp6Vlw3bPPPhu7du3CpZdeihtvvHGtu7YmPPzwwxgeHsaBAwfwhje8AY899tic6/74xz/GZZddlml76Utfip///OfwfX+tu7pmeJ6HL37xi/id3/kdMMbmXXc7nPNmHn/8cRw9ejRzbm3bxiWXXILbbrttzu3m+jzMt81WYHp6GoyxBWczy+Uy9u/fjz179uCVr3wl7rrrrvXp4Cpz0003YWBgACeffDLe/va3Y2RkZN71t+N5P3bsGL797W/jbW9724LrbsXz3nxdo+88sdZ4noc77rij5fNy2WWX0edlg1jK+JZYXa688kq84hWvwItf/OKN7sqO41vf+hbOPfdcvPa1r8XAwADOPvtsfO5zn9vobu0YLrroInz/+9/HQw89BAD4xS9+gR/+8Id4+ctfvsE925ksd/y32pCwtgNQSuE973kPLrroIpxxxhlzrrdr1y589rOfxde+9jV8/etfxymnnIJLL70Ut9xyyzr2duWcd955+Kd/+id897vfxec+9zkcPXoUF1xwAcbHx9uuf/ToUQwODmbaBgcHEQQBxsbG1qPLa8I3v/lNTE1N4a1vfeuc62yXc96Oo0ePAkDbcxsvm2u7pW6z2anX63j/+9+P3/zN30RHR8ec65166qm47rrr8K1vfQv//M//DMdxcOGFF+Lhhx9ex96unMsvvxxf+tKX8IMf/AB/9Vd/hdtvvx0vetGL4LrunNtsx/P+hS98AaVSCa95zWvmXW8rnvd21zX6zhNrzdjYGMIwpM/LJmGx41ti9fnKV76CO++8E9dcc81Gd2VH8thjj+Ezn/kMTjrpJHz3u9/FO9/5TvzBH/wB/umf/mmju7YjeN/73oc3vvGNOPXUU2GaJs4++2xcddVVeOMb37jRXduRLHf8t9oY6/ZOxIbxe7/3e/jlL3+JH/7wh/Oud8opp+CUU05JXp9//vk4ePAg/vf//t94/vOfv9bdXDUuv/zy5PmZZ56J888/HyeccAK+8IUv4D3veU/bbZodXdpl2tq+lfj85z+Pyy+/HMPDw3Ous13O+Xy0O7cLndflbLNZ8X0fb3jDGyClxKc//el5133e856XSfJ/4YUX4tnPfjb+9m//Fn/zN3+z1l1dNV7/+tcnz8844wyce+652L9/P7797W/PKzJtp/MOAP/4j/+IN73pTQvmStuK532+69pO/84Taw99XjYHix3fEqvLwYMH8e53vxvf+973Nl0uzp2ClBLnnnsuPvKRjwDQkSf33nsvPvOZz+C3fuu3Nrh3259/+Zd/wRe/+EV8+ctfxumnn467774bV111FYaHh3HFFVdsdPd2LBt9bSbH2jbn93//9/Gtb30LN954I/bs2bPk7Z/3vOdtatfCYigUCjjzzDPnPI6hoaEWNXtkZASGYaC3t3c9urjqPPnkk7jhhhvwu7/7u0vedjuccwBJJdh257Z5RqN5u6Vus1nxfR+ve93r8Pjjj+P666+f163WDs45nvOc52z5z8OuXbuwf//+eY9jO513ALj11lvx4IMPLus3YLOf97mua/SdJ9aavr4+CCHo87IJWOn4llg+d9xxB0ZGRnDOOefAMAwYhoGbb74Zf/M3fwPDMBCG4UZ3cduza9cuPOMZz8i0nXbaaVREZZ34X//rf+H9738/3vCGN+DMM8/EW97yFvzhH/4hOTg3iOWO/1YbEta2KUop/N7v/R6+/vWv4wc/+AEOHDiwrP3cdddd2LVr1yr3bn1xXRf333//nMdx/vnnJ9UzY773ve/h3HPPhWma69HFVefaa6/FwMAAXvGKVyx52+1wzgHgwIEDGBoaypxbz/Nw880344ILLphzu7k+D/NtsxmJRbWHH34YN9xww7JEYqUU7r777i3/eRgfH8fBgwfnPY7tct5jPv/5z+Occ87BWWedteRtN+t5X+i6ttO/88TaY1kWzjnnnJbPy/XXX0+fl3Vitca3xPK59NJLcc899+Duu+9O/p177rl405vehLvvvhtCiI3u4rbnwgsvxIMPPphpe+ihh7B///4N6tHOolqtgvOsjCKEgJRyg3q0s1nu+G/VWbcyCcS68v/8P/+P6uzsVDfddJM6cuRI8q9arSbrvP/971dvectbktf/5//8H/WNb3xDPfTQQ+pXv/qVev/7368AqK997WsbcQjL5o/+6I/UTTfdpB577DH1k5/8RL3yla9UpVJJPfHEE0qp1uN+7LHHVD6fV3/4h3+o7rvvPvX5z39emaapvvrVr27UIayIMAzVvn371Pve976WZdvtnM/Ozqq77rpL3XXXXQqA+sQnPqHuuuuupPLlRz/6UdXZ2am+/vWvq3vuuUe98Y1vVLt27VIzMzPJPt7ylrdkqrn96Ec/UkII9dGPflTdf//96qMf/agyDEP95Cc/Wffjm4/5jt33ffXrv/7ras+ePeruu+/O/Aa4rpvso/nYr776avWd73xHPfroo+quu+5Sv/3bv60Mw1A//elPN+IQ52S+Y5+dnVV/9Ed/pG677Tb1+OOPqxtvvFGdf/75avfu3dv+vMdMT0+rfD6vPvOZz7Tdx1Y974u5rm3n7zyxOfjKV76iTNNUn//859V9992nrrrqKlUoFJIxBrG2LOZ3gFh/qCro+vKzn/1MGYah/uIv/kI9/PDD6ktf+pLK5/Pqi1/84kZ3bUdwxRVXqN27d6v//M//VI8//rj6+te/rvr6+tR73/veje7atmU17vnWGhLWtikA2v679tprk3WuuOIKdckllySvP/axj6kTTjhBOY6juru71UUXXaS+/e1vr3/nV8jrX/96tWvXLmWaphoeHlavec1r1L333pssbz5upZS66aab1Nlnn60sy1LHHXfcnDekW4Hvfve7CoB68MEHW5Ztt3N+4403tv2cX3HFFUopXX75gx/8oBoaGlK2bavnP//56p577sns45JLLknWj/m3f/s3dcoppyjTNNWpp566KYXG+Y798ccfn/M34MYbb0z20XzsV111ldq3b5+yLEv19/eryy67TN12223rf3ALMN+xV6tVddlll6n+/n5lmqbat2+fuuKKK9RTTz2V2cd2PO8x//AP/6ByuZyamppqu4+tet4Xc13bzt95YvPwd3/3d2r//v3Ksiz17Gc/W918880b3aUdw2J+B4j1h4S19ec//uM/1BlnnKFs21annnqq+uxnP7vRXdoxzMzMqHe/+91q3759ynEcdfzxx6sPfOADmclrYnVZjXu+tYYpFWVpJwiCIAiCIAiCIAiCIAhi0VCONYIgCIIgCIIgCIIgCIJYBiSsEQRBEARBEARBEARBEMQyIGGNIAiCIAiCIAiCIAiCIJYBCWsEQRAEQRAEQRAEQRAEsQxIWCMIgiAIgiAIgiAIgiCIZUDCGkEQBEEQBEEQBEEQBEEsAxLWCIIgCIIgCIIgCIIgCGIZkLBGEARBEARBEARBEARBEMuAhDWCIIhF8oIXvABXXXVV8vq4447DJz/5yQ3rD0EQBEEQxGaFxk2rw9VXX41nPetZyeu3vvWtePWrX73o7W+66SYwxjA1NbXqfSMIQmNsdAcIgiC2KrfffjsKhULymjGGb3zjG0sa7BAEQRAEQewEaNxEEMR2hYQ1giCIZdLf37/RXSAIgiAIgtgSbNZxk+/7ME1z3d/X8zxYlrXu70sQxOpDoaAEQewovvrVr+LMM89ELpdDb28vXvziF6NSqSS2+g996EMYGBhAR0cH3vGOd8DzvDn3lQ5pOO644wAAv/EbvwHGWPKaIAiCIAhiq7KZxk1xSOQ//MM/YO/evcjn83jta1/bEuJ47bXX4rTTToPjODj11FPx6U9/Oln2xBNPgDGGf/3Xf8ULXvACOI6DL37xi/O+73XXXYeuri5885vfxMknnwzHcfCSl7wEBw8eTNZ59NFH8apXvQqDg4MoFot4znOegxtuuKHl+D/84Q/jrW99Kzo7O/H2t78dAPC+970PJ598MvL5PI4//nj82Z/9GXzfX/DvEaOUwsc//nEcf/zxyOVyOOuss/DVr3510dsTBLFyyLFGEMSO4ciRI3jjG9+Ij3/84/iN3/gNzM7O4tZbb4VSCgDw/e9/H47j4MYbb8QTTzyB3/7t30ZfXx/+4i/+YsF933777RgYGMC1116Ll73sZRBCrPXhEARBEARBrBmbcdz0yCOP4F//9V/xH//xH5iZmcHb3vY2XHnllfjSl74EAPjc5z6HD37wg/jUpz6Fs88+G3fddRfe/va3o1Ao4Iorrkj28773vQ9/9Vd/hWuvvRa2bS/4vtVqFX/xF3+BL3zhC7AsC+9617vwhje8AT/60Y8AAOVyGS9/+cvx4Q9/GI7j4Atf+AJ+7dd+DQ8++CD27duX7Ocv//Iv8Wd/9mf40z/906StVCrhuuuuw/DwMO655x68/e1vR6lUwnvf+95F/U3+9E//FF//+tfxmc98BieddBJuueUWvPnNb0Z///+/vfsJiXL74zj+GW0yB//DTclKjUk0EytqajISkmYYQyIRiVok2HISLSXIP2kGbZyKjECIGHcTRErlosQWWZbholoYQkSOZIsWiSiaTv5+i3C4drs5zr3+6fp+LZ/zzPmeM4vh8JnnnOcP5eTkBNQHgH+GYA3AivHp0yf5fD4VFBQoKSlJkpSZmelvX716tW7duiWTyaSMjAxduHBBlZWVamhoUEjIrx/wndneEBMTo4SEhIWbBAAAwCJYjuumiYkJtbS0aP369ZKkpqYmHTp0SC6XSwkJCWpoaJDL5VJBQYEkKSUlRX19fWpubp4VrJWVlfnvCcTU1JSuX7+u3bt3S5JaWlqUnp6uly9fymKxKCsrS1lZWf77L168qNbWVt27d09Op9N//cCBA6qoqJjV959DtuTkZJ05c0a3b98OKFgbGxvT5cuX9fjxY1mtVknSpk2b9PTpUzU3NxOsAYuEYA3AipGVlaXc3FxlZmbKbrfLZrOpsLBQsbGx/naTyeS/32q1anR0VIODg/4FJQAAwEqwHNdNGzdu9IdqMzWnp6fV39+v0NBQDQ4OqqSkxL/NUpJ8Pp+io6Nn9bNz58551V21atWsz6SlpSkmJkZv376VxWLR2NiY6uvr9eDBAw0NDcnn82l8fFxer3fOunfu3NHVq1f17t07jY6OyufzKSoqKqBx9fX1aWJiQgcPHpx1fXJyUtu3b5/XHAEEj2ANwIoRGhqqjo4OdXd369GjR2pqalJVVZV6enp++TmDwbBIIwQAAFgefod100wtg8Gg6elpSd+3g848WTbjx62mf3476Xxr/exaZWWlHj58qMbGRpnNZoWHh6uwsPAvZ879WPfFixc6evSo6uvrZbfbFR0dLY/HI5fLFdCYZubc3t6uxMTEWW2BbHEF8O8gWAOwohgMBmVnZys7O1u1tbVKSkpSa2urJOn169caHx9XeHi4pO+LnYiIiFn/jP6K0WjUt2/fFmzsAAAAi2m5rZu8Xq+Ghoa0bt06SdLz588VEhKi1NRUxcfHKzExUe/fv9fx48fn1e9cfD6fent7ZbFYJEn9/f0aHh5WWlqaJKmrq0vFxcU6cuSIpO9nrn348GHOfp89e6akpCRVVVX5rw0MDAQ8ri1btigsLExer5dtn8ASIlgDsGL09PSos7NTNptNa9euVU9Pjz5//qz09HS9efNGk5OTKikpUXV1tQYGBnT+/Hk5nc45zwmZkZycrM7OTmVnZyssLMy/VQIAAOB3sxzXTWvWrNGJEyfU2NiokZERlZaWqqioyH9OW11dnUpLSxUVFSWHw6GvX7+qt7dXX7580enTp4P+LoxGo06dOqVr167JaDTK6XRqz549/qDNbDbr7t27ys/Pl8FgUE1Njf9psl8xm83yer3yeDzatWuX2tvb/cFlICIjI1VRUaHy8nJNT09r3759GhkZUXd3tyIiImadKwdg4QT2qwcA/wFRUVF68uSJ8vLylJqaqurqarlcLjkcDklSbm6uNm/erP3796uoqEj5+fmqq6sLuH+Xy6WOjg5t2LCBcy0AAMBvbTmum8xmswoKCpSXlyebzaatW7fqxo0b/vaTJ0/q5s2bcrvdyszMVE5Ojtxut1JSUuY19x+ZTCadPXtWx44dk9VqVXh4uDwej7/9ypUrio2N1d69e5Wfny+73a4dO3bM2e/hw4dVXl4up9Opbdu2qbu7WzU1NfMaW0NDg2pra3Xp0iWlp6fLbrfr/v37/3jOAAJn+N/M+5IBYAUrLi7W8PCw2tralnooAAAAy9pSrJvq6urU1tamV69eLVpNSXK73SorK9Pw8PCi1gXw++CJNQAAAAAAACAInLEGAAAAAFhSGRkZf3twf3Nz84LVdTgc6urq+mnbuXPn/C9KAIC/w1ZQAAAAAMCSGhgY0NTU1E/b4uPjFRkZuSB1P378qPHx8Z+2xcXFKS4ubkHqAvjvIFgDAAAAAAAAgsAZawAAAAAAAEAQCNYAAAAAAACAIBCsAQAAAAAAAEEgWAMAAAAAAACCQLAGAAAAAAAABIFgDQAAAAAAAAgCwRoAAAAAAAAQhP8DcYJk757KcCQAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "data[\"split_per_parallel\"] = data[\"split\"] / data[\"parallel_max\"]\n", "\n", @@ -6855,47 +1754,18 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 99, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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DxERkSEw+EiIC5USEREZFoOPhG6fuVkIIXE1REREzR+Dj4ScWltCLgMqNFpkF3GcDxERUVNj8JGQSimHu20LAEBKTonE1RARETV/DD4S83RoCQBIZfAhIiJqcgw+EvOyZ48PERGRoTD4SKymx4fBh4iIqOkx+EhMd6srl8GHiIioqTH4SMzLvjr4XM4thVbLR9qJiIiaEoOPxNxtraCUy1BepUVmYZnU5RARETVrDD4SUyrkaG9XPcCZT3YRERE1LQYfI8ABzkRERIbB4GMEPO05lw8REZEhMPgYAS8HzuVDRERkCAw+RkB3q4uPtBMRETUpBh8jUHOr60peKao0WomrISIiar4YfIyAaxsrqJRyVGoErt7gI+1ERERNhcHHCCjkMnjceqSdt7uIiIiaDoOPkeAq7URERE2PwcdIeHEuHyIioibXqOCzdOlSeHl5wdLSEv7+/ti7d+8928fGxsLf3x+Wlpbw9vbG8uXL67SJjIyEr68v1Go1fH19sWnTplr7ly1bhh49eqB169Zo3bo1goKC8Mcff9RqI4TA/Pnz4erqCisrKwwZMgSnTp1qzEc0uJoBzgw+RERETafBwWfDhg2YM2cO3n33XSQlJWHQoEEYNWoU0tLS6m2fkpKC0aNHY9CgQUhKSsK8efMwa9YsREZG6trExcUhNDQUYWFhOHbsGMLCwjBhwgTEx8fr2ri7u2PhwoVISEhAQkIChg0bhrFjx9YKNh9//DE+++wzLF68GIcPH4azszOGDx+OoqKihn5Mg/O8NZcPV2knIiJqQqKB+vXrJ8LDw2tt69Kli3j77bfrbf/WW2+JLl261Nr20ksvif79++t+njBhghg5cmStNiNGjBATJ068Zy22trbi22+/FUIIodVqhbOzs1i4cKFuf1lZmbCxsRHLly//+w8mhHBzcxMAhJub232116fMGzeFx9xtwvud30VFlcbg5yciIjJVDfn+blCPT0VFBRITExESElJre0hICA4cOFDve+Li4uq0HzFiBBISElBZWXnPNnc7pkajwfr161FSUoKgoCAA1T1LWVlZtY6jVqsxePDgux6nvLwchYWFupcQ4h6fvmk5tVbDykIBjVbgSl6pZHUQERE1Zw0KPjk5OdBoNHBycqq13cnJCVlZWfW+Jysrq972VVVVyMnJuWebO4954sQJtGrVCmq1GuHh4di0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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "data.query(\"model == 'EOT20'\").query(\"parallel_max == 2\").query(\"points == 10000\").set_index(\"points_per_split\").time_per_point.plot()" ] }, { "cell_type": "code", - "execution_count": 266, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16 12500.0\n" - ] - } - ], + "outputs": [], "source": [ "\n", "parallel_max = 16\n", @@ -6916,20 +1786,9 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 140, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "def _parallel_splits(\n", " total_points,\n", @@ -6976,100 +1835,43 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'pytest' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[107], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;129m@pytest\u001b[39m\u001b[38;5;241m.\u001b[39mmark\u001b[38;5;241m.\u001b[39mparametrize(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtotal_points, model_count, parallel_max, expected_splits\u001b[39m\u001b[38;5;124m\"\u001b[39m, [\n\u001b[1;32m 2\u001b[0m \u001b[38;5;66;03m# Basic cases\u001b[39;00m\n\u001b[1;32m 3\u001b[0m (\u001b[38;5;241m10000\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m4\u001b[39m), \u001b[38;5;66;03m# Standard case with explicit parallel_max\u001b[39;00m\n\u001b[1;32m 4\u001b[0m (\u001b[38;5;241m5000\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m4\u001b[39m, \u001b[38;5;241m4\u001b[39m), \u001b[38;5;66;03m# Single model case\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# Minimum split size cases\u001b[39;00m\n\u001b[1;32m 7\u001b[0m (\u001b[38;5;241m900\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m4\u001b[39m, \u001b[38;5;241m1\u001b[39m), \u001b[38;5;66;03m# Less than min_points_per_split\u001b[39;00m\n\u001b[1;32m 8\u001b[0m (\u001b[38;5;241m2000\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m1\u001b[39m), \u001b[38;5;66;03m# Just enough for 1 split with 2 models\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# Maximum parallelization cases\u001b[39;00m\n\u001b[1;32m 11\u001b[0m (\u001b[38;5;241m100000\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m4\u001b[39m, \u001b[38;5;241m2\u001b[39m), \u001b[38;5;66;03m# Limited by CPU cores / model_count\u001b[39;00m\n\u001b[1;32m 12\u001b[0m (\u001b[38;5;241m100000\u001b[39m, \u001b[38;5;241m4\u001b[39m, \u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m2\u001b[39m), \u001b[38;5;66;03m# Testing with more models\u001b[39;00m\n\u001b[1;32m 13\u001b[0m \n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# Edge cases\u001b[39;00m\n\u001b[1;32m 15\u001b[0m (\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m), \u001b[38;5;66;03m# Minimum possible values\u001b[39;00m\n\u001b[1;32m 16\u001b[0m (\u001b[38;5;241m999999\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m8\u001b[39m), \u001b[38;5;66;03m# Large number of points\u001b[39;00m\n\u001b[1;32m 17\u001b[0m (\u001b[38;5;241m10000\u001b[39m, \u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m1\u001b[39m), \u001b[38;5;66;03m# Many models relative to cores\u001b[39;00m\n\u001b[1;32m 18\u001b[0m ])\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtest_parallel_splits\u001b[39m(total_points, model_count, parallel_max, expected_splits):\n\u001b[1;32m 20\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;124;03m Test the _parallel_splits function with various parameter combinations.\u001b[39;00m\n\u001b[1;32m 22\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m 23\u001b[0m result \u001b[38;5;241m=\u001b[39m _parallel_splits(\n\u001b[1;32m 24\u001b[0m total_points\u001b[38;5;241m=\u001b[39mtotal_points,\n\u001b[1;32m 25\u001b[0m model_count\u001b[38;5;241m=\u001b[39mmodel_count,\n\u001b[1;32m 26\u001b[0m parallel_max\u001b[38;5;241m=\u001b[39mparallel_max,\n\u001b[1;32m 27\u001b[0m min_points_per_split\u001b[38;5;241m=\u001b[39mmin_points_per_split\n\u001b[1;32m 28\u001b[0m )\n", - "\u001b[0;31mNameError\u001b[0m: name 'pytest' is not defined" - ] - } - ], + "outputs": [], "source": [] }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "(10.6666)" ] }, { "cell_type": "code", - "execution_count": 261, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "posix.cpu_count() takes no keyword arguments", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[261], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcpu_count\u001b[49m\u001b[43m(\u001b[49m\u001b[43maffinity\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mTypeError\u001b[0m: posix.cpu_count() takes no keyword arguments" - ] - } - ], + "outputs": [], "source": [ "os.cpu_count(affinity=True)" ] }, { "cell_type": "code", - "execution_count": 257, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "64" - ] - }, - "execution_count": 257, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "len(os.sched_getaffinity(0))" ] }, { "cell_type": "code", - "execution_count": 253, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "64" - ] - }, - "execution_count": 253, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# os.cpu_count()\n", "\n", @@ -7080,479 +1882,63 @@ }, { "cell_type": "code", - "execution_count": 241, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from concurrent.futures import ProcessPoolExecutor\n", "\n", - "with ProcessPoolExecutor(max_workers=None) as executor:\n", - " executor." - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modelling tides with EOT20 in parallel (models: 1, splits: 10)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 0%| | 0/10 [00:00\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tide_modeltide_height
timexy
2020-01-01 00:00:00.000000000145.907482-29.246355EOT200.276023
2020-01-04 16:43:38.181818181145.907482-29.246355EOT200.328505
2020-01-08 09:27:16.363636363145.907482-29.246355EOT200.246467
2020-01-12 02:10:54.545454545145.907482-29.246355EOT200.146102
2020-01-15 18:54:32.727272727145.907482-29.246355EOT20-0.367979
...............
2020-12-17 05:05:27.272727272149.345285-38.854142GOT5.5-0.498254
2020-12-20 21:49:05.454545456149.345285-38.854142GOT5.5-0.152091
2020-12-24 14:32:43.636363636149.345285-38.854142GOT5.5-0.169135
2020-12-28 07:16:21.818181816149.345285-38.854142GOT5.5-0.055665
2021-01-01 00:00:00.000000000149.345285-38.854142GOT5.50.655934
\n", - "

60000000 rows × 2 columns

\n", - "" - ], - "text/plain": [ - " tide_model tide_height\n", - "time x y \n", - "2020-01-01 00:00:00.000000000 145.907482 -29.246355 EOT20 0.276023\n", - "2020-01-04 16:43:38.181818181 145.907482 -29.246355 EOT20 0.328505\n", - "2020-01-08 09:27:16.363636363 145.907482 -29.246355 EOT20 0.246467\n", - "2020-01-12 02:10:54.545454545 145.907482 -29.246355 EOT20 0.146102\n", - "2020-01-15 18:54:32.727272727 145.907482 -29.246355 EOT20 -0.367979\n", - "... ... ...\n", - "2020-12-17 05:05:27.272727272 149.345285 -38.854142 GOT5.5 -0.498254\n", - "2020-12-20 21:49:05.454545456 149.345285 -38.854142 GOT5.5 -0.152091\n", - "2020-12-24 14:32:43.636363636 149.345285 -38.854142 GOT5.5 -0.169135\n", - "2020-12-28 07:16:21.818181816 149.345285 -38.854142 GOT5.5 -0.055665\n", - "2021-01-01 00:00:00.000000000 149.345285 -38.854142 GOT5.5 0.655934\n", - "\n", - "[60000000 rows x 2 columns]" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "with ProcessPoolExecutor(max_workers=None) as executor:\n", + " executor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "from eo_tides.model import model_tides\n", + "\n", + "n = 10000\n", + "directory = \"/gdata1/data/tide_models_clipped/\"\n", + "directory = \"./tests/data/tide_models/\"\n", + "# models = [\"EOT20\", \"GOT5.5\", \"HAMTIDE11\"]\n", + "models = [\"EOT20\"]\n", + "\n", + "\n", + "start_time = time.time()\n", + "modelled_tides_df_linear = model_tides(\n", + " x = np.random.uniform(112.715430, 154.727149, n),\n", + " y = np.random.uniform(-44.199061, -10.035282, n),\n", + " time = pd.date_range(\"2020\", \"2021\", periods=100),\n", + " model=models,\n", + " method=\"linear\",\n", + " directory=directory,\n", + " parallel=True,\n", + " parallel_splits=\"auto\",\n", + " parallel_max=16,\n", + " crop=False,\n", + ")\n", + "split_time = time.time() - start_time\n", + "print(split_time)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "modelled_tides_df_linear" ] }, { "cell_type": "code", - "execution_count": 206, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
 splitparallel_maxtimepointspoints_per_splitsplit_per_paralleldirectorymodeltime_per_pointmodel_multiple
2751421.66840210000100000.250000/gdata1/data/tide_models_clipped/EOT200.002167False
2762413.8282621000050000.500000/gdata1/data/tide_models_clipped/EOT200.001383False
2773410.8023671000033330.750000/gdata1/data/tide_models_clipped/EOT200.001080False
2784410.1734271000025001.000000/gdata1/data/tide_models_clipped/EOT200.001017False
2795414.8198241000020001.250000/gdata1/data/tide_models_clipped/EOT200.001482False
2806414.6937211000016661.500000/gdata1/data/tide_models_clipped/EOT200.001469False
2818412.8451111000012502.000000/gdata1/data/tide_models_clipped/EOT200.001285False
28210415.7682031000010002.500000/gdata1/data/tide_models_clipped/EOT200.001577False
28312415.130573100008333.000000/gdata1/data/tide_models_clipped/EOT200.001513False
28416417.833459100006254.000000/gdata1/data/tide_models_clipped/EOT200.001783False
28520420.754384100005005.000000/gdata1/data/tide_models_clipped/EOT200.002075False
\n" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 206, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# n = 10000\n", "data.query(\"(points == @n) & (parallel_max == @parallel_max) & (~model_multiple)\").style.background_gradient(cmap=\"YlOrRd\", subset=\"time_per_point\")" @@ -7560,224 +1946,45 @@ }, { "cell_type": "code", - "execution_count": 214, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
model_multipleFalseTrue
0NaN3.243056
1NaN4.219347
2NaN6.260917
3NaN7.849068
4NaN9.473125
.........
34733.650495NaN
34829.807040NaN
34927.244994NaN
35024.177347NaN
35132.104118NaN
\n", - "

352 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - "model_multiple False True \n", - "0 NaN 3.243056\n", - "1 NaN 4.219347\n", - "2 NaN 6.260917\n", - "3 NaN 7.849068\n", - "4 NaN 9.473125\n", - ".. ... ...\n", - "347 33.650495 NaN\n", - "348 29.807040 NaN\n", - "349 27.244994 NaN\n", - "350 24.177347 NaN\n", - "351 32.104118 NaN\n", - "\n", - "[352 rows x 2 columns]" - ] - }, - "execution_count": 214, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data.pivot(columns=\"model_multiple\", values=\"time\")" ] }, { "cell_type": "code", - "execution_count": 221, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 221, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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+vDDD6/bt7S0VDabrcv0+eefD2HFAABgOPNpuNm9e7eee+45vfjii6qoqNDs2bO1ePFi1dbW9rheVVWVHA6Ha5o8efIQVQwAAIY7n4abnJwcrV69Wk899ZSmTZum3Nxcffe739X27dt7XC88PFyRkZGuyc/Pb4gqBgAAw53Pwk1LS4s+/fRTJSUlubUnJSXp6NGjPa579913y263a8GCBSopKRnMMgEAwAjj76sPvnDhgtrb2xUREeHWHhERofr6+m7XsdvteuONNxQfHy+n06lf/OIXWrBggUpLSzVnzpxu13E6nXI6na55y7K8txMAAGDY8Vm4ucpms7nNW5bVpe2qqVOnaurUqa75xMREff3119q6det1w01WVpY2b97svYIBAMCw5rPbUrfccov8/Py6XKVpaGjocjWnJzNnztTZs2evuzwzM1ONjY2uKSoqyuOaAQDA8OezcBMYGKj4+HgVFxe7tRcXF+u+++7r83YqKipkt9uvuzwoKEhhYWGu6XpXhQAAgBl8elsqPT1dK1asUEJCghITE/XGG2+otrZWaWlpkjqvutTV1entt9+WJOXm5mrixImKi4tTS0uLdu3apaKiIhUVFflyNwAAwDDi03CzfPlyffvtt/rJT34ih8OhGTNm6MCBA4qJiZEkORwOt99509LSooyMDNXV1SkkJERxcXHav3+/kpOTfbULAABgmPH5A8VPP/20nn766W6XFRYWus1v2LBBGzZsGIKqAADASOXz1y8AAAB4E+EGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADAK4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFJ+Hm9dff12xsbEKDg5WfHy8Pvzwwx77l5WVKT4+XsHBwbr99tuVl5c3RJUCAICRwKfh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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "data.query(\"(points == @n) & (parallel_max == @parallel_max) & (model_multiple)\").time.plot.hist()" ] }, { "cell_type": "code", - "execution_count": 225, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 225, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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vlxbt251uryQsHbtWu3bt0+lpaVKSEjwt3ON6F1P43ZZMK4RhBsbEhMTFR8fr5KSEn9ba2urysvLddtttzlYWei7/KU9e/asfvOb32jcuHFOlzQi3H///Tp58qSOHz/u3zwej5544gn9+te/drq8kBUREaFbbrmly890z5w5439AL7rX1tamtrY2XXVV4GUiLCzMPyP2WWVZltasWaM9e/bozTffVGJiYsBxrhHd62vcpOBdI7gt1YOmpib98Y9/9O9XV1fr+PHjGjt2rCZMmKDHHntMzz77rKZMmaIpU6bo2Wef1dVXX617773Xwaqd19u4eTwe/du//ZsqKyv1X//1X+ro6PD/n83YsWMVERHhVNkhoa/v3JX/kY8aNUrx8fGaNm3acJcaUvoatyeeeELLly/XnDlzNH/+fB08eFC/+tWvVFZW5lzRIaKvsZs7d66eeOIJRUdHa+LEiSovL9euXbuUm5vrYNXOW716tV555RW9/vrriomJ8f87NmbMGEVHR8vlcnGN6EZf49be3h68a4Tt33AZrrS01JLUZVuxYoVlWZd+6vf0009b8fHxVmRkpDVnzhzr3XffdbboENDbuFVXV3d7TJJVWlrqdOmO6+s7dyV+Cn5Jf8atoKDAmjx5shUVFWXdeOON1t69e50rOIT0NXZer9d64IEHLI/HY0VFRVnTpk2znnvuOauzs9PZwh3W079jhYWF/j5cI7rqa9yCeY1w/f83BAAAMAJrbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAABgFMINAAAwyv8DeYAz1gC13lsAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "data.query(\"(points == @n) & (parallel_max == @parallel_max) & (~model_multiple)\").time.plot.hist()" ] }, { "cell_type": "code", - "execution_count": 119, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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4hQREdGoyuLvnCUmJjY5vnPnzk3+vQh1jz76qDZs2KB3331XycnJAe+fkZGhlStX2rCy4OnatauuvfbaZv+uuu2cS9KRI0e0detWrVu3LuB93XDO24Lw0sHi4uIUFxfX6vGWZSkvL08PPvigIiMjA36/EydO6NixYw0+0DtKoMd+sT179khSs8eRlpamxMREbdmyRYMHD5b0TU+5sLBQixYtatuCDQrk2EtLSzVy5Eilp6crLy9PnToF3u0NpfPenKioKKWnp2vLli26++6765/fsmWLvv/97ze5z7Bhw/TOO+80eG7z5s0aMmRIm/796CiWZenRRx/V+vXrVVBQoLS0tDbNs2fPnpA+x61RU1Oj/fv369Zbb23ydbec84vl5eUpPj5et99+e8D7uuGct0lHl34QmK1bt1qSrH379jX5er9+/ax169ZZlmVZX331lfXzn//c2rlzp3Xo0CFr+/bt1rBhw6yePXtap06dCuay22Xnzp3W888/b+3Zs8f64osvrDVr1lhJSUnWxIkTG4y7+Ngty7IWLlxoxcbGWuvWrbM+/vhj6/7777d8Pp+jjv1Cq2jUqFFWSUmJVV5eXv+4mFvO++rVq63IyEhr+fLl1r59+6zHH3/c6tq1q3X48GHLsiwrOzvb+vGPf1w//osvvrC+853vWLNmzbL27dtnLV++3IqMjGxTS7Uj/du//ZsVGxtrFRQUNDjHX3/9df2YS4/9hRdesNavX299+umn1t69e63s7GxLUki3Bpvy85//3CooKLC++OILa/fu3dYdd9xhxcTEuP6cX3Du3DmrV69e1i9+8YtGr7n1nJtAeHGY+++/3xo+fHizr0uy8vLyLMuyrK+//trKysqyevToYUVGRlq9evWyJk+ebB09ejRIqzXjgw8+sIYOHWrFxsZa0dHRVr9+/ax58+ZZZ86caTDu4mO3rG9ul543b56VmJhoeb1ea8SIEdbHH38c5NW3T15eXrPXxFzMTef9lVdesVJSUqyoqCjrhhtuaHC78OTJk63MzMwG4wsKCqzBgwdbUVFRVmpqqvXaa68FecXt19w5vvjv86XHvmjRIqtPnz5WdHS0dcUVV1i33HKLlZ+fH/zFt9N9991n+Xw+KzIy0kpKSrLuuece65NPPql/3a3n/IJNmzZZkqzi4uJGr7n1nJvgsSzLCnKxBwAAoM24VRoAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADgK4QUAADjK/we3HmcC1KyjMgAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.scatter(modelled_tides_df_spline.droplevel([\"x\", \"y\"]).tide_height, modelled_tides_df_linear.droplevel([\"x\", \"y\"]).tide_height)" ] }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cropping to bounds: [149.722622, 149.722622, -22.132984, -22.132984]\n" - ] - } - ], + "outputs": [], "source": [ "# # Run equivalent pyTMD code to verify same results\n", "# pytmd_tides_spline = tide_elevations(\n", @@ -7813,54 +2020,18 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "masked_array(data=[-1.5019747272607185, -1.094174075181175,\n", - " -0.36239775028562476, ..., -2.975406042155719,\n", - " -2.399842126206709, -1.1423142620897144],\n", - " mask=[False, False, False, ..., False, False, False],\n", - " fill_value=nan)" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pytmd_tides_linear" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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rDsikaiyslJJSUmqqKjQJZdcYvdyHImfgf34GdiPn4H9+Bk0DBerAgAA2xBEAACAbQgihsXGxmrGjBmKjY21eymOxc/AfvwM7MfPwH78DBqGa0QAAIBt6IgAAADbEEQAAIBtCCIAAMA2BBEAAGAbgkgI1NTUqEePHnK5XNq2bZvdy3GM/fv36/7771dGRoZatGihTp06acaMGRe97wGCM2fOHGVkZCguLk5ZWVlat26d3UtyjMLCQvXu3VuJiYlKTU3V8OHDtWfPHruX5WiFhYVyuVyaMGGC3UsJWwSREHjooYfUvn17u5fhOB9//LH8fr+eeeYZ7dy5U7/73e/09NNPa/LkyXYvLWq98sormjBhgqZMmaKtW7eqT58+GjJkiA4cOGD30hxhzZo1GjNmjNavX69Vq1aptrZWOTk5OnHihN1Lc6SNGzdq3rx56t69u91LCWts37XYsmXLNHHiRL322mu66qqrtHXrVvXo0cPuZTnW448/rrlz5+qzzz6zeylRKTs7Wz179tTcuXPrHuvatauGDx+uwsJCG1fmTEeOHFFqaqrWrFmjvn372r0cR6mqqlLPnj01Z84cFRQUqEePHnrqqafsXlZYoiNioS+//FKjRo3SCy+8oPj4eLuXA0kVFRVKTk62exlRyev1avPmzcrJyan3eE5Ojt577z2bVuVsFRUVksS/eRuMGTNGw4YN06233mr3UsJeWN99N5IFAgGNHDlSo0ePVq9evbR//367l+R4xcXFmj17tp588km7lxKVysvL5fP51KZNm3qPt2nTRmVlZTatyrkCgYAmTpyom266SZmZmXYvx1FefvllbdmyRRs3brR7KRGBjkgj5eXlyeVyXfBj06ZNmj17tiorK5Wbm2v3kqNOQ38GZyotLdXgwYN155136oEHHrBp5c7w3dudBwIBx90CPRyMHTtWH330kV566SW7l+IoX3zxhcaPH6+FCxcqLi7O7uVEBK4RaaTy8nKVl5df8Dnp6ekaMWKElixZUu8XsM/nk8fj0d13360FCxZYvdSo1dCfwbe/BEpLS9W/f39lZ2fr+eefl9tN/raC1+tVfHy8/vKXv+iOO+6oe3z8+PHatm2b1qxZY+PqnGXcuHFavHix1q5dq4yMDLuX4yiLFy/WHXfcIY/HU/eYz+eTy+WS2+1WTU1Nva+BIGKZAwcOqLKysu7z0tJSDRo0SK+++qqys7OVlpZm4+qco6SkRP3791dWVpYWLlzILwCLZWdnKysrS3PmzKl7rFu3brr99tu5WDUEAoGAxo0bp0WLFmn16tW64oor7F6S4xw/flyff/55vcfuu+8+XXnllXr44YcZk50D14hYpGPHjvU+T0hIkCR16tSJEBIipaWl6tevnzp27KgnnnhCR44cqfta27ZtbVxZ9Jo4caLuvfde9erVS9dff73mzZunAwcOaPTo0XYvzRHGjBmjF198Ua+//roSExPrrs1JSkpSixYtbF6dMyQmJp4VNlq2bKnWrVsTQs6DIIKotXLlSu3du1d79+49K/zRCLTGXXfdpaNHj2rmzJk6dOiQMjMztXTpUl122WV2L80Rvt023a9fv3qPz58/XyNHjgz9goAGYDQDAABsw1V7AADANgQRAABgG4IIAACwDUEEAADYhiACAABsQxABAAC2IYgAAADbEEQAAIBtCCIAAMA2BBEAAGAbgggAALANQQQAANjm/wPBEtTY+ndR0gAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "plt.scatter(pytmd_tides_spline.data, pytmd_tides_linear.data)" @@ -7919,27 +2090,9 @@ }, { "cell_type": "code", - "execution_count": 145, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Modelling tides with EOT20\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 145, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from eo_tides import model_tides\n", "\n", diff --git a/uv.lock b/uv.lock index caa22de..3aea1b4 100644 --- a/uv.lock +++ b/uv.lock @@ -728,6 +728,7 @@ dependencies = [ { name = "odc-geo" }, { name = "pandas" }, { name = "psutil" }, + { name = "pyogrio" }, { name = "pyproj" }, { name = "pytmd" }, { name = "scikit-learn" }, @@ -778,6 +779,7 @@ requires-dist = [ { name = "pandas", specifier = ">=2.2.0" }, { name = "planetary-computer", marker = "extra == 'notebooks'", specifier = ">=1.0.0" }, { name = "psutil", specifier = ">=5.8.0" }, + { name = "pyogrio", specifier = ">=0.7.0" }, { name = "pyproj", specifier = ">=3.6.1" }, { name = "pystac-client", marker = "extra == 'notebooks'", specifier = ">=0.8.3" }, { name = "pytmd", specifier = "==2.1.8" },