diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml
index e3dd873956..b74cd0a26f 100644
--- a/.github/workflows/merge.yml
+++ b/.github/workflows/merge.yml
@@ -80,7 +80,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- example-name: [00-quickstart.ipynb, 01-multi-time-series-and-covariates.ipynb, 02-data-processing.ipynb, 03-FFT-examples.ipynb, 04-RNN-examples.ipynb, 05-TCN-examples.ipynb, 06-Transformer-examples.ipynb, 07-NBEATS-examples.ipynb, 08-DeepAR-examples.ipynb, 09-DeepTCN-examples.ipynb, 10-Kalman-filter-examples.ipynb, 11-GP-filter-examples.ipynb, 12-Dynamic-Time-Warping-example.ipynb, 13-TFT-examples.ipynb, 15-static-covariates.ipynb, 16-hierarchical-reconciliation.ipynb, 18-TiDE-examples.ipynb, 19-EnsembleModel-examples.ipynb, 20-RegressionModel-examples.ipynb, 21-TSMixer-examples.ipynb, 22-anomaly-detection-examples.ipynb]
+ example-name: [00-quickstart.ipynb, 01-multi-time-series-and-covariates.ipynb, 02-data-processing.ipynb, 03-FFT-examples.ipynb, 04-RNN-examples.ipynb, 05-TCN-examples.ipynb, 06-Transformer-examples.ipynb, 07-NBEATS-examples.ipynb, 08-DeepAR-examples.ipynb, 09-DeepTCN-examples.ipynb, 10-Kalman-filter-examples.ipynb, 11-GP-filter-examples.ipynb, 12-Dynamic-Time-Warping-example.ipynb, 13-TFT-examples.ipynb, 15-static-covariates.ipynb, 16-hierarchical-reconciliation.ipynb, 18-TiDE-examples.ipynb, 19-EnsembleModel-examples.ipynb, 20-RegressionModel-examples.ipynb, 21-TSMixer-examples.ipynb, 22-anomaly-detection-examples.ipynb, 23-Conformal-Prediction-examples.ipynb]
steps:
- name: "Clone repository"
uses: actions/checkout@v4
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad43f4371f..92d7fb06e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,8 +11,26 @@ but cannot always guarantee backwards compatibility. Changes that may **break co
**Improved**
-- Improvements to `ForecastingModel`: Improved `start` handling for historical forecasts, backtest, residuals, and gridsearch. If `start` is not within the trainable / forecastable points, uses the closest valid start point that is a round multiple of `stride` ahead of start. Raises a ValueError, if no valid start point exists. This guarantees that all historical forecasts are `n * stride` points away from start, and will simplify many downstream tasks. [#2560](https://github.com/unit8co/darts/issues/2560) by [Dennis Bader](https://github.com/dennisbader).
-- Added `data_transformers` argument to `historical_forecasts`, `backtest`, `residuals`, and `gridsearch` that allow to automatically apply `DataTransformer` and/or `Pipeline` to the input series without data-leakage (fit on historic window of input series, transform the input series, and inverse transform the forecasts). [#2529](https://github.com/unit8co/darts/pull/2529) by [Antoine Madrona](https://github.com/madtoinou) and [Jan Fidor](https://github.com/JanFidor)
+- 🚀🚀 Introducing Conformal Prediction to Darts: Add calibrated prediction intervals to any pre-trained global forecasting model with our first two conformal prediction models : [#2552](https://github.com/unit8co/darts/pull/2552) by [Dennis Bader](https://github.com/dennisbader).
+ - `ConformalNaiveModel`: It uses past point forecast errors to produce calibrated forecast intervals with a specified coverage probability.
+ - `ConformalQRModel`: It combines quantile regression (or any probabilistic model) with conformal prediction techniques. It adjusts quantile estimates to generate calibrated prediction intervals with a specified coverage probability.
+ - Both models offer the following support:
+ - use any pre-trained global forecasting model as the base forecaster
+ - uni and multivariate forecasts
+ - single and multiple series forecasts
+ - single and multi-horizon forecasts
+ - generate a single or multiple calibrated prediction intervals
+ - direct quantile value predictions (interval bounds) or sampled predictions from these quantile values
+ - covariates based on the underlying forecasting model
+ - Check out this [example notebook](https://unit8co.github.io/darts/examples/23-Conformal-Prediction-examples.html) for more information!
+- Improvements to `ForecastingModel.historical_forecasts()`, `backtest()`, `residuals()`, and `gridsearch()`:
+ - 🚀🚀 Added support for data transformers and pipelines. Use argument `data_transformers` to automatically apply any `DataTransformer` and/or `Pipeline` to the input series without data-leakage (fit on historic window of input series, transform the input series, and inverse transform the forecasts). [#2529](https://github.com/unit8co/darts/pull/2529) by [Antoine Madrona](https://github.com/madtoinou) and [Jan Fidor](https://github.com/JanFidor)
+ - Improved `start` handling. If `start` is not within the trainable / forecastable points, uses the closest valid start point that is a round multiple of `stride` ahead of start. Raises a ValueError, if no valid start point exists. This guarantees that all historical forecasts are `n * stride` points away from start, and will simplify many downstream tasks. [#2560](https://github.com/unit8co/darts/issues/2560) by [Dennis Bader](https://github.com/dennisbader).
+ - Added support for `overlap_end=True` to `residuals()`. This computes historical forecasts and residuals that can extend further than the end of the target series. Guarantees that all returned residual values have the same length per forecast (the last residuals will contain missing values, if the forecasts extended further into the future than the end of the target series). [#2552](https://github.com/unit8co/darts/pull/2552) by [Dennis Bader](https://github.com/dennisbader).
+- Improvements to `metrics`: Added three new quantile interval metrics (plus their aggregated versions) : [#2552](https://github.com/unit8co/darts/pull/2552) by [Dennis Bader](https://github.com/dennisbader).
+ - Interval Winkler Score `iws()`, and Mean Interval Winkler Scores `miws()` (time-aggregated) ([source](https://otexts.com/fpp3/distaccuracy.html))
+ - Interval Coverage `ic()` (binary if observation is within the quantile interval), and Mean Interval Coverage `mic()` (time-aggregated)
+ - Interval Non-Conformity Score for Quantile Regression `incs_qr()`, and Mean ... `mincs_qr()` (time-aggregated) ([source](https://arxiv.org/pdf/1905.03222))
- Added `series_idx` argument to `DataTransformer` that allows users to use only a subset of the transformers when `global_fit=False` and severals series are used. [#2529](https://github.com/unit8co/darts/pull/2529) by [Antoine Madrona](https://github.com/madtoinou)
- Updated the Documentation URL of `Statsforecast` models. [#2610](https://github.com/unit8co/darts/pull/2610) by [He Weilin](https://github.com/cnhwl).
diff --git a/README.md b/README.md
index c87c8c3e35..ee5260bfc0 100644
--- a/README.md
+++ b/README.md
@@ -174,6 +174,9 @@ series.plot()
flavours of probabilistic forecasting (such as estimating parametric distributions or quantiles).
Some anomaly detection scorers are also able to exploit these predictive distributions.
+* **Conformal Prediction Support:** Our conformal prediction models allow to generate probabilistic forecasts with
+ calibrated quantile intervals for any pre-trained global forecasting model.
+
* **Past and Future Covariates support:** Many models in Darts support past-observed and/or future-known
covariate (external data) time series as inputs for producing forecasts.
@@ -221,51 +224,54 @@ on bringing more models and features.
| Model | Sources | Target Series Support:
Sampled/ Distribution Parameters | Training & Forecasting on Multiple Series |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------|-------------------------------------------|
| **Baseline Models** ([LocalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#local-forecasting-models-lfms)) | | | | | |
-| [NaiveMean](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveMean) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [NaiveSeasonal](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveSeasonal) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [NaiveDrift](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveDrift) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [NaiveMovingAverage](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveMovingAverage) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [NaiveMean](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveMean) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [NaiveSeasonal](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveSeasonal) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [NaiveDrift](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveDrift) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [NaiveMovingAverage](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveMovingAverage) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
| **Statistical / Classic Models** ([LocalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#local-forecasting-models-lfms)) | | | | | |
-| [ARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.arima.html#darts.models.forecasting.arima.ARIMA) | | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [VARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.varima.html#darts.models.forecasting.varima.VARIMA) | | 🔴 ✅ | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [AutoARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.auto_arima.html#darts.models.forecasting.auto_arima.AutoARIMA) | | ✅ 🔴 | 🔴 ✅ 🔴 | 🔴 🔴 | 🔴 |
-| [StatsForecastAutoArima](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_arima.html#darts.models.forecasting.sf_auto_arima.StatsForecastAutoARIMA) (faster AutoARIMA) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [ExponentialSmoothing](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.exponential_smoothing.html#darts.models.forecasting.exponential_smoothing.ExponentialSmoothing) | | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
-| [StatsforecastAutoETS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_ets.html#darts.models.forecasting.sf_auto_ets.StatsForecastAutoETS) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [StatsforecastAutoCES](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_ces.html#darts.models.forecasting.sf_auto_ces.StatsForecastAutoCES) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [BATS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tbats_model.html#darts.models.forecasting.tbats_model.BATS) and [TBATS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tbats_model.html#darts.models.forecasting.tbats_model.TBATS) | [TBATS paper](https://robjhyndman.com/papers/ComplexSeasonality.pdf) | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
-| [Theta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.theta.html#darts.models.forecasting.theta.Theta) and [FourTheta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.theta.html#darts.models.forecasting.theta.FourTheta) | [Theta](https://robjhyndman.com/papers/Theta.pdf) & [4 Theta](https://github.com/Mcompetitions/M4-methods/blob/master/4Theta%20method.R) | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [StatsForecastAutoTheta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_theta.html#darts.models.forecasting.sf_auto_theta.StatsForecastAutoTheta) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
-| [Prophet](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.prophet_model.html#darts.models.forecasting.prophet_model.Prophet) | [Prophet repo](https://github.com/facebook/prophet) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [FFT](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.fft.html#darts.models.forecasting.fft.FFT) (Fast Fourier Transform) | | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
-| [KalmanForecaster](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.kalman_forecaster.html#darts.models.forecasting.kalman_forecaster.KalmanForecaster) using the Kalman filter and N4SID for system identification | [N4SID paper](https://people.duke.edu/~hpgavin/SystemID/References/VanOverschee-Automatica-1994.pdf) | ✅ ✅ | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
-| [Croston](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.croston.html#darts.models.forecasting.croston.Croston) method | | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [ARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.arima.html#darts.models.forecasting.arima.ARIMA) | | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [VARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.varima.html#darts.models.forecasting.varima.VARIMA) | | 🔴 ✅ | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [AutoARIMA](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.auto_arima.html#darts.models.forecasting.auto_arima.AutoARIMA) | | ✅ 🔴 | 🔴 ✅ 🔴 | 🔴 🔴 | 🔴 |
+| [StatsForecastAutoArima](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_arima.html#darts.models.forecasting.sf_auto_arima.StatsForecastAutoARIMA) (faster AutoARIMA) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [ExponentialSmoothing](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.exponential_smoothing.html#darts.models.forecasting.exponential_smoothing.ExponentialSmoothing) | | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
+| [StatsforecastAutoETS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_ets.html#darts.models.forecasting.sf_auto_ets.StatsForecastAutoETS) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [StatsforecastAutoCES](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_ces.html#darts.models.forecasting.sf_auto_ces.StatsForecastAutoCES) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [BATS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tbats_model.html#darts.models.forecasting.tbats_model.BATS) and [TBATS](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tbats_model.html#darts.models.forecasting.tbats_model.TBATS) | [TBATS paper](https://robjhyndman.com/papers/ComplexSeasonality.pdf) | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
+| [Theta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.theta.html#darts.models.forecasting.theta.Theta) and [FourTheta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.theta.html#darts.models.forecasting.theta.FourTheta) | [Theta](https://robjhyndman.com/papers/Theta.pdf) & [4 Theta](https://github.com/Mcompetitions/M4-methods/blob/master/4Theta%20method.R) | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [StatsForecastAutoTheta](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.sf_auto_theta.html#darts.models.forecasting.sf_auto_theta.StatsForecastAutoTheta) | [Nixtla's statsforecast](https://github.com/Nixtla/statsforecast) | ✅ 🔴 | 🔴 🔴 🔴 | ✅ 🔴 | 🔴 |
+| [Prophet](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.prophet_model.html#darts.models.forecasting.prophet_model.Prophet) | [Prophet repo](https://github.com/facebook/prophet) | ✅ 🔴 | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [FFT](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.fft.html#darts.models.forecasting.fft.FFT) (Fast Fourier Transform) | | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
+| [KalmanForecaster](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.kalman_forecaster.html#darts.models.forecasting.kalman_forecaster.KalmanForecaster) using the Kalman filter and N4SID for system identification | [N4SID paper](https://people.duke.edu/~hpgavin/SystemID/References/VanOverschee-Automatica-1994.pdf) | ✅ ✅ | 🔴 ✅ 🔴 | ✅ 🔴 | 🔴 |
+| [Croston](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.croston.html#darts.models.forecasting.croston.Croston) method | | ✅ 🔴 | 🔴 🔴 🔴 | 🔴 🔴 | 🔴 |
| **Global Baseline Models** ([GlobalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#global-forecasting-models-gfms)) | | | | | |
-| [GlobalNaiveAggregate](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveAggregate) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
-| [GlobalNaiveDrift](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveDrift) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
-| [GlobalNaiveSeasonal](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveSeasonal) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
+| [GlobalNaiveAggregate](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveAggregate) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
+| [GlobalNaiveDrift](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveDrift) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
+| [GlobalNaiveSeasonal](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.global_baseline_models.html#darts.models.forecasting.global_baseline_models.GlobalNaiveSeasonal) | | ✅ ✅ | 🔴 🔴 🔴 | 🔴 🔴 | ✅ |
| **Regression Models** ([GlobalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#global-forecasting-models-gfms)) | | | | | |
-| [RegressionModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_model.html#darts.models.forecasting.regression_model.RegressionModel): generic wrapper around any sklearn regression model | | ✅ ✅ | ✅ ✅ ✅ | 🔴 🔴 | ✅ |
-| [LinearRegressionModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.linear_regression_model.html#darts.models.forecasting.linear_regression_model.LinearRegressionModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [RandomForest](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.random_forest.html#darts.models.forecasting.random_forest.RandomForest) | | ✅ ✅ | ✅ ✅ ✅ | 🔴 🔴 | ✅ |
-| [LightGBMModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.lgbm.html#darts.models.forecasting.lgbm.LightGBMModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [XGBModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.xgboost.html#darts.models.forecasting.xgboost.XGBModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [CatBoostModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.catboost_model.html#darts.models.forecasting.catboost_model.CatBoostModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [RegressionModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_model.html#darts.models.forecasting.regression_model.RegressionModel): generic wrapper around any sklearn regression model | | ✅ ✅ | ✅ ✅ ✅ | 🔴 🔴 | ✅ |
+| [LinearRegressionModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.linear_regression_model.html#darts.models.forecasting.linear_regression_model.LinearRegressionModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [RandomForest](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.random_forest.html#darts.models.forecasting.random_forest.RandomForest) | | ✅ ✅ | ✅ ✅ ✅ | 🔴 🔴 | ✅ |
+| [LightGBMModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.lgbm.html#darts.models.forecasting.lgbm.LightGBMModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [XGBModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.xgboost.html#darts.models.forecasting.xgboost.XGBModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [CatBoostModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.catboost_model.html#darts.models.forecasting.catboost_model.CatBoostModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
| **PyTorch (Lightning)-based Models** ([GlobalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#global-forecasting-models-gfms)) | | | | | |
-| [RNNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.rnn_model.html#darts.models.forecasting.rnn_model.RNNModel) (incl. LSTM and GRU); equivalent to DeepAR in its probabilistic version | [DeepAR paper](https://arxiv.org/abs/1704.04110) | ✅ ✅ | 🔴 ✅ 🔴 | ✅ ✅ | ✅ |
-| [BlockRNNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.block_rnn_model.html#darts.models.forecasting.block_rnn_model.BlockRNNModel) (incl. LSTM and GRU) | | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
-| [NBEATSModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nbeats.html#darts.models.forecasting.nbeats.NBEATSModel) | [N-BEATS paper](https://arxiv.org/abs/1905.10437) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
-| [NHiTSModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nhits.html#darts.models.forecasting.nhits.NHiTSModel) | [N-HiTS paper](https://arxiv.org/abs/2201.12886) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
-| [TCNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tcn_model.html#darts.models.forecasting.tcn_model.TCNModel) | [TCN paper](https://arxiv.org/abs/1803.01271), [DeepTCN paper](https://arxiv.org/abs/1906.04397), [blog post](https://medium.com/unit8-machine-learning-publication/temporal-convolutional-networks-and-forecasting-5ce1b6e97ce4) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
-| [TransformerModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.transformer_model.html#darts.models.forecasting.transformer_model.TransformerModel) | | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
-| [TFTModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tft_model.html#darts.models.forecasting.tft_model.TFTModel) (Temporal Fusion Transformer) | [TFT paper](https://arxiv.org/pdf/1912.09363.pdf), [PyTorch Forecasting](https://pytorch-forecasting.readthedocs.io/en/latest/models.html) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [DLinearModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.dlinear.html#darts.models.forecasting.dlinear.DLinearModel) | [DLinear paper](https://arxiv.org/pdf/2205.13504.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [NLinearModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nlinear.html#darts.models.forecasting.nlinear.NLinearModel) | [NLinear paper](https://arxiv.org/pdf/2205.13504.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [TiDEModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tide_model.html#darts.models.forecasting.tide_model.TiDEModel) | [TiDE paper](https://arxiv.org/pdf/2304.08424.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [TSMixerModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tsmixer_model.html#darts.models.forecasting.tsmixer_model.TSMixerModel) | [TSMixer paper](https://arxiv.org/pdf/2303.06053.pdf), [PyTorch Implementation](https://github.com/ditschuk/pytorch-tsmixer) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [RNNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.rnn_model.html#darts.models.forecasting.rnn_model.RNNModel) (incl. LSTM and GRU); equivalent to DeepAR in its probabilistic version | [DeepAR paper](https://arxiv.org/abs/1704.04110) | ✅ ✅ | 🔴 ✅ 🔴 | ✅ ✅ | ✅ |
+| [BlockRNNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.block_rnn_model.html#darts.models.forecasting.block_rnn_model.BlockRNNModel) (incl. LSTM and GRU) | | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
+| [NBEATSModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nbeats.html#darts.models.forecasting.nbeats.NBEATSModel) | [N-BEATS paper](https://arxiv.org/abs/1905.10437) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
+| [NHiTSModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nhits.html#darts.models.forecasting.nhits.NHiTSModel) | [N-HiTS paper](https://arxiv.org/abs/2201.12886) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
+| [TCNModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tcn_model.html#darts.models.forecasting.tcn_model.TCNModel) | [TCN paper](https://arxiv.org/abs/1803.01271), [DeepTCN paper](https://arxiv.org/abs/1906.04397), [blog post](https://medium.com/unit8-machine-learning-publication/temporal-convolutional-networks-and-forecasting-5ce1b6e97ce4) | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
+| [TransformerModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.transformer_model.html#darts.models.forecasting.transformer_model.TransformerModel) | | ✅ ✅ | ✅ 🔴 🔴 | ✅ ✅ | ✅ |
+| [TFTModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tft_model.html#darts.models.forecasting.tft_model.TFTModel) (Temporal Fusion Transformer) | [TFT paper](https://arxiv.org/pdf/1912.09363.pdf), [PyTorch Forecasting](https://pytorch-forecasting.readthedocs.io/en/latest/models.html) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [DLinearModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.dlinear.html#darts.models.forecasting.dlinear.DLinearModel) | [DLinear paper](https://arxiv.org/pdf/2205.13504.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [NLinearModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.nlinear.html#darts.models.forecasting.nlinear.NLinearModel) | [NLinear paper](https://arxiv.org/pdf/2205.13504.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [TiDEModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tide_model.html#darts.models.forecasting.tide_model.TiDEModel) | [TiDE paper](https://arxiv.org/pdf/2304.08424.pdf) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [TSMixerModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tsmixer_model.html#darts.models.forecasting.tsmixer_model.TSMixerModel) | [TSMixer paper](https://arxiv.org/pdf/2303.06053.pdf), [PyTorch Implementation](https://github.com/ditschuk/pytorch-tsmixer) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
| **Ensemble Models** ([GlobalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#global-forecasting-models-gfms)): Model support is dependent on ensembled forecasting models and the ensemble model itself | | | | | |
-| [NaiveEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveEnsembleModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
-| [RegressionEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_ensemble_model.html#darts.models.forecasting.regression_ensemble_model.RegressionEnsembleModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [NaiveEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveEnsembleModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [RegressionEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_ensemble_model.html#darts.models.forecasting.regression_ensemble_model.RegressionEnsembleModel) | | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| **Conformal Models** ([GlobalForecastingModel](https://unit8co.github.io/darts/userguide/covariates.html#global-forecasting-models-gfms)): Model support is dependent on the forecasting model used | | | | | |
+| [ConformalNaiveModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.conformal_models.html#darts.models.forecasting.conformal_models.ConformalNaiveModel) | [Conformalized Prediction](https://arxiv.org/pdf/1905.03222) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
+| [ConformalQRModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.conformal_models.html#darts.models.forecasting.conformal_models.ConformalQRModel) | [Conformalized Quantile Regression](https://arxiv.org/pdf/1905.03222) | ✅ ✅ | ✅ ✅ ✅ | ✅ ✅ | ✅ |
## Community & Contact
Anyone is welcome to join our [Gitter room](https://gitter.im/u8darts/darts) to ask questions, make proposals,
diff --git a/darts/ad/anomaly_model/forecasting_am.py b/darts/ad/anomaly_model/forecasting_am.py
index e90d088c7f..88ce67b9ce 100644
--- a/darts/ad/anomaly_model/forecasting_am.py
+++ b/darts/ad/anomaly_model/forecasting_am.py
@@ -120,10 +120,9 @@ def fit(
If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
an error if the value is not in `series`' index. Default: `'value'`
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1 for
- deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
@@ -201,10 +200,9 @@ def score(
If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
an error if the value is not in `series`' index. Default: `'value'`
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1 for
- deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
@@ -289,10 +287,9 @@ def predict_series(
If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
an error if the value is not in `series`' index. Default: `'value'`
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1 for
- deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
@@ -385,10 +382,9 @@ def eval_metric(
If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
an error if the value is not in `series`' index. Default: `'value'`
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1 for
- deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
@@ -491,10 +487,9 @@ def show_anomalies(
If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
an error if the value is not in `series`' index. Default: `'value'`
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1 for
- deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
diff --git a/darts/metrics/__init__.py b/darts/metrics/__init__.py
index 72bc38c89a..d8b15c3c2f 100644
--- a/darts/metrics/__init__.py
+++ b/darts/metrics/__init__.py
@@ -6,52 +6,67 @@
and quantile forecasts. For probabilistic and quantile forecasts, use parameter `q` to define the quantile(s) to
compute the deterministic metrics on:
- - Aggregated over time:
- Absolute metrics:
- - :func:`MERR `: Mean Error
- - :func:`MAE `: Mean Absolute Error
- - :func:`MSE `: Mean Squared Error
- - :func:`RMSE `: Root Mean Squared Error
- - :func:`RMSLE `: Root Mean Squared Log Error
-
- Relative metrics:
- - :func:`MASE `: Mean Absolute Scaled Error
- - :func:`MSSE `: Mean Squared Scaled Error
- - :func:`RMSSE `: Root Mean Squared Scaled Error
- - :func:`MAPE `: Mean Absolute Percentage Error
- - :func:`sMAPE `: symmetric Mean Absolute Percentage Error
- - :func:`OPE `: Overall Percentage Error
- - :func:`MARRE `: Mean Absolute Ranged Relative Error
-
- Other metrics:
- - :func:`R2 `: Coefficient of Determination
- - :func:`CV `: Coefficient of Variation
-
- - Per time step:
- Absolute metrics:
- - :func:`ERR `: Error
- - :func:`AE `: Absolute Error
- - :func:`SE `: Squared Error
- - :func:`SLE `: Squared Log Error
-
- Relative metrics:
- - :func:`ASE `: Absolute Scaled Error
- - :func:`SSE `: Squared Scaled Error
- - :func:`APE `: Absolute Percentage Error
- - :func:`sAPE `: symmetric Absolute Percentage Error
- - :func:`ARRE `: Absolute Ranged Relative Error
-
-For probabilistic forecasts (storchastic predictions with `num_samples >> 1`):
- - Aggregated over time:
+- Aggregated over time:
+ Absolute metrics:
+ - :func:`MERR `: Mean Error
+ - :func:`MAE `: Mean Absolute Error
+ - :func:`MSE `: Mean Squared Error
+ - :func:`RMSE `: Root Mean Squared Error
+ - :func:`RMSLE `: Root Mean Squared Log Error
+
+ Relative metrics:
+ - :func:`MASE `: Mean Absolute Scaled Error
+ - :func:`MSSE `: Mean Squared Scaled Error
+ - :func:`RMSSE `: Root Mean Squared Scaled Error
+ - :func:`MAPE `: Mean Absolute Percentage Error
+ - :func:`sMAPE `: symmetric Mean Absolute Percentage Error
+ - :func:`OPE `: Overall Percentage Error
+ - :func:`MARRE `: Mean Absolute Ranged Relative Error
+
+ Other metrics:
+ - :func:`R2 `: Coefficient of Determination
+ - :func:`CV `: Coefficient of Variation
+
+- Per time step:
+ Absolute metrics:
+ - :func:`ERR `: Error
+ - :func:`AE `: Absolute Error
+ - :func:`SE `: Squared Error
+ - :func:`SLE `: Squared Log Error
+
+ Relative metrics:
+ - :func:`ASE `: Absolute Scaled Error
+ - :func:`SSE `: Squared Scaled Error
+ - :func:`APE `: Absolute Percentage Error
+ - :func:`sAPE `: symmetric Absolute Percentage Error
+ - :func:`ARRE `: Absolute Ranged Relative Error
+
+For probabilistic forecasts (storchastic predictions with `num_samples >> 1`) and quantile forecasts:
+
+- Aggregated over time:
+ Quantile metrics:
- :func:`MQL `: Mean Quantile Loss
- :func:`QR `: Quantile Risk
+
+ Quantile interval metrics:
- :func:`MIW `: Mean Interval Width
- - Per time step:
+ - :func:`MWS `: Mean Interval Winkler Score
+ - :func:`MIC `: Mean Interval Coverage
+ - :func:`MINCS_QR `: Mean Interval Non-Conformity Score for Quantile Regression
+
+- Per time step:
+ Quantile metrics:
- :func:`QL `: Quantile Loss
+
+ Quantile interval metrics:
- :func:`IW `: Interval Width
+ - :func:`WS `: Interval Winkler Score
+ - :func:`IC `: Interval Coverage
+ - :func:`INCS_QR `: Interval Non-Conformity Score for Quantile Regression
For Dynamic Time Warping (DTW) (aggregated over time):
- - :func:`DTW `: Dynamic Time Warping Metric
+
+- :func:`DTW `: Dynamic Time Warping Metric
"""
from darts.metrics.metrics import (
@@ -62,13 +77,19 @@
coefficient_of_variation,
dtw_metric,
err,
+ ic,
+ incs_qr,
iw,
+ iws,
mae,
mape,
marre,
mase,
merr,
+ mic,
+ mincs_qr,
miw,
+ miws,
mql,
mse,
msse,
@@ -86,6 +107,44 @@
sse,
)
+ALL_METRICS = {
+ ae,
+ ape,
+ arre,
+ ase,
+ coefficient_of_variation,
+ dtw_metric,
+ err,
+ iw,
+ iws,
+ mae,
+ mape,
+ marre,
+ mase,
+ merr,
+ miw,
+ miws,
+ mql,
+ mse,
+ msse,
+ ope,
+ ql,
+ qr,
+ r2_score,
+ rmse,
+ rmsle,
+ rmsse,
+ sape,
+ se,
+ sle,
+ smape,
+ sse,
+ ic,
+ mic,
+ incs_qr,
+ mincs_qr,
+}
+
TIME_DEPENDENT_METRICS = {
ae,
ape,
@@ -98,8 +157,23 @@
sle,
sse,
iw,
+ iws,
+ ic,
+ incs_qr,
}
+Q_INTERVAL_METRICS = {
+ iw,
+ iws,
+ miw,
+ miws,
+ ic,
+ mic,
+ incs_qr,
+}
+
+NON_Q_METRICS = {dtw_metric}
+
__all__ = [
"ae",
"ape",
@@ -130,4 +204,10 @@
"sse",
"iw",
"miw",
+ "iws",
+ "miws",
+ "ic",
+ "mic",
+ "incs_qr",
+ "mincs_qr",
]
diff --git a/darts/metrics/metrics.py b/darts/metrics/metrics.py
index eb99ef6ab0..911c3f4f7e 100644
--- a/darts/metrics/metrics.py
+++ b/darts/metrics/metrics.py
@@ -216,6 +216,7 @@ def wrapper_multi_ts_support(*args, **kwargs):
iterable=zip(*input_series),
verbose=verbose,
total=len(actual_series),
+ desc=f"metric `{func.__name__}()`",
)
# `vals` is a list of series metrics of length `len(actual_series)`. Each metric has shape
@@ -657,7 +658,7 @@ def err(
"""Error (ERR).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: y_t - \\hat{y}_t
@@ -702,23 +703,25 @@ def err(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -748,7 +751,7 @@ def merr(
"""Mean Error (MERR).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{1}{T}\\sum_{t=1}^T{(y_t - \\hat{y}_t)}
@@ -788,19 +791,22 @@ def merr(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -831,7 +837,7 @@ def ae(
"""Absolute Error (AE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: |y_t - \\hat{y}_t|
@@ -876,23 +882,25 @@ def ae(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -922,7 +930,7 @@ def mae(
"""Mean Absolute Error (MAE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{1}{T}\\sum_{t=1}^T{|y_t - \\hat{y}_t|}
@@ -962,19 +970,22 @@ def mae(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -1009,7 +1020,7 @@ def ase(
It is the Absolute Error (AE) scaled by the Mean AE (MAE) of the naive m-seasonal forecast.
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: \\frac{AE(y_{t_p+1:t_p+T}, \\hat{y}_{t_p+1:t_p+T})}{E_m},
@@ -1073,23 +1084,25 @@ def ase(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -1126,7 +1139,7 @@ def mase(
It is the Mean Absolute Error (MAE) scaled by the MAE of the naive m-seasonal forecast.
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{MAE(y_{t_p+1:t_p+T}, \\hat{y}_{t_p+1:t_p+T})}{E_m},
@@ -1185,19 +1198,22 @@ def mase(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -1234,7 +1250,7 @@ def se(
"""Squared Error (SE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: (y_t - \\hat{y}_t)^2.
@@ -1279,23 +1295,25 @@ def se(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -1325,7 +1343,7 @@ def mse(
"""Mean Squared Error (MSE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{1}{T}\\sum_{t=1}^T{(y_t - \\hat{y}_t)^2}.
@@ -1365,19 +1383,22 @@ def mse(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -1412,7 +1433,7 @@ def sse(
It is the Squared Error (SE) scaled by the Mean SE (MSE) of the naive m-seasonal forecast.
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: \\frac{SE(y_{t_p+1:t_p+T}, \\hat{y}_{t_p+1:t_p+T})}{E_m},
@@ -1476,23 +1497,25 @@ def sse(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -1529,7 +1552,7 @@ def msse(
It is the Mean Squared Error (MSE) scaled by the MSE of the naive m-seasonal forecast.
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{MSE(y_{t_p+1:t_p+T}, \\hat{y}_{t_p+1:t_p+T})}{E_m},
@@ -1588,19 +1611,22 @@ def msse(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -1636,7 +1662,7 @@ def rmse(
"""Root Mean Squared Error (RMSE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\sqrt{\\frac{1}{T}\\sum_{t=1}^T{(y_t - \\hat{y}_t)^2}}
@@ -1676,19 +1702,22 @@ def rmse(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.sqrt(
@@ -1721,7 +1750,7 @@ def rmsse(
It is the Root Mean Squared Error (RMSE) scaled by the RMSE of the naive m-seasonal forecast.
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\frac{RMSE(y_{t_p+1:t_p+T}, \\hat{y}_{t_p+1:t_p+T})}{E_m},
@@ -1780,19 +1809,22 @@ def rmsse(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -1826,7 +1858,7 @@ def sle(
"""Squared Log Error (SLE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column and time step :math:`t` as:
+ component/column, (optional) quantile, and time step :math:`t` as:
.. math:: \\left(\\log{(y_t + 1)} - \\log{(\\hat{y} + 1)}\\right)^2
@@ -1873,23 +1905,25 @@ def sle(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -1920,7 +1954,7 @@ def rmsle(
"""Root Mean Squared Log Error (RMSLE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: \\sqrt{\\frac{1}{T}\\sum_{t=1}^T{\\left(\\log{(y_t + 1)} - \\log{(\\hat{y}_t + 1)}\\right)^2}}
@@ -1962,19 +1996,22 @@ def rmsle(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.sqrt(
@@ -2060,23 +2097,25 @@ def ape(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2113,7 +2152,7 @@ def mape(
"""Mean Absolute Percentage Error (MAPE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column with:
+ percentage value per component/column and (optional) quantile with:
.. math:: 100 \\cdot \\frac{1}{T} \\sum_{t=1}^{T}{\\left| \\frac{y_t - \\hat{y}_t}{y_t} \\right|}
@@ -2161,19 +2200,22 @@ def mape(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2205,7 +2247,7 @@ def sape(
"""symmetric Absolute Percentage Error (sAPE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column and time step :math:`t` with:
+ percentage value per component/column, (optional) quantile and time step :math:`t` with:
.. math::
200 \\cdot \\frac{\\left| y_t - \\hat{y}_t \\right|}{\\left| y_t \\right| + \\left| \\hat{y}_t \\right|}
@@ -2259,23 +2301,25 @@ def sape(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2312,7 +2356,7 @@ def smape(
"""symmetric Mean Absolute Percentage Error (sMAPE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column with:
+ percentage value per component/column and (optional) quantile with:
.. math::
200 \\cdot \\frac{1}{T}
@@ -2363,19 +2407,22 @@ def smape(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2406,7 +2453,7 @@ def ope(
"""Overall Percentage Error (OPE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column with:
+ percentage value per component/column and (optional) quantile with:
.. math:: 100 \\cdot \\left| \\frac{\\sum_{t=1}^{T}{y_t}
- \\sum_{t=1}^{T}{\\hat{y}_t}}{\\sum_{t=1}^{T}{y_t}} \\right|.
@@ -2452,19 +2499,22 @@ def ope(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2506,7 +2556,7 @@ def arre(
"""Absolute Ranged Relative Error (ARRE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column and time step :math:`t` with:
+ percentage value per component/column, (optional) quantile and time step :math:`t` with:
.. math:: 100 \\cdot \\left| \\frac{y_t - \\hat{y}_t} {\\max_t{y_t} - \\min_t{y_t}} \\right|
@@ -2556,23 +2606,25 @@ def arre(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2612,7 +2664,7 @@ def marre(
"""Mean Absolute Ranged Relative Error (MARRE).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed as a
- percentage value per component/column with:
+ percentage value per component/column and (optional) quantile with:
.. math:: 100 \\cdot \\frac{1}{T} \\sum_{t=1}^{T} {\\left| \\frac{y_t - \\hat{y}_t} {\\max_t{y_t} -
\\min_t{y_t}} \\right|}
@@ -2658,17 +2710,17 @@ def marre(
float
A single metric score for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
- - single multivariate series and at least `component_reduction=None`.
+ - a single multivariate series and at least `component_reduction=None`.
- sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -2698,7 +2750,7 @@ def r2_score(
"""Coefficient of Determination :math:`R^2` (see [1]_ for more details).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as:
+ component/column and (optional) quantile as:
.. math:: 1 - \\frac{\\sum_{t=1}^T{(y_t - \\hat{y}_t)^2}}{\\sum_{t=1}^T{(y_t - \\bar{y})^2}},
@@ -2742,19 +2794,22 @@ def r2_score(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
References
@@ -2790,7 +2845,7 @@ def coefficient_of_variation(
"""Coefficient of Variation (percentage).
For the true series :math:`y` and predicted series :math:`\\hat{y}` of length :math:`T`, it is computed per
- component/column as a percentage value with:
+ component/column and (optional) quantile as a percentage value with:
.. math:: 100 \\cdot \\text{RMSE}(y_t, \\hat{y}_t) / \\bar{y},
@@ -2833,19 +2888,22 @@ def coefficient_of_variation(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2921,19 +2979,22 @@ def dtw_metric(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
@@ -2967,7 +3028,7 @@ def qr(
sample values summed up along the time axis (QL computes the quantile and loss per time step).
For the true series :math:`y` and predicted stochastic/probabilistic series (containing N samples) :math:`\\hat{y}`
- of of shape :math:`T \\times N`, it is computed per column/component as:
+ of of shape :math:`T \\times N`, it is computed per column/component and quantile as:
.. math:: 2 \\frac{QL(Z, \\hat{Z}_q)}{Z},
@@ -3007,19 +3068,22 @@ def qr(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
if not pred_series.is_stochastic:
@@ -3075,7 +3139,7 @@ def ql(
QL computes the quantile of all sample values and the loss per time step.
For the true series :math:`y` and predicted stochastic/probabilistic series (containing N samples) :math:`\\hat{y}`
- of of shape :math:`T \\times N`, it is computed per column/component and time step :math:`t` as:
+ of of shape :math:`T \\times N`, it is computed per column/component, quantile and time step :math:`t` as:
.. math:: 2 \\max((q - 1) (y_t - \\hat{y}_{t,q}), q (y_t - \\hat{y}_{t,q})),
@@ -3120,23 +3184,25 @@ def ql(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n quantiles) without time
+ and component reductions, and shape (n time steps, n quantiles) without time but component reduction and
+ `len(q) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
y_true, y_pred = _get_values_or_raise(
@@ -3175,7 +3241,7 @@ def mql(
time axis.
For the true series :math:`y` and predicted stochastic/probabilistic series (containing N samples) :math:`\\hat{y}`
- of of shape :math:`T \\times N`, it is computed per column/component as:
+ of of shape :math:`T \\times N`, it is computed per column/component and quantile as:
.. math:: 2 \\frac{1}{T}\\sum_{t=1}^T{\\max((q - 1) (y_t - \\hat{y}_{t,q}), q (y_t - \\hat{y}_{t,q}))},
@@ -3215,19 +3281,22 @@ def mql(
Returns
-------
float
- A single metric score for:
+ A single metric score (when `len(q) <= 1`) for:
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n quantiles,) without component reduction,
+ and shape (n quantiles,) with component reduction and `len(q) > 1`.
+ For:
+
+ - the same input arguments that result in the `float` return case from above but with `len(q) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -3257,18 +3326,19 @@ def iw(
n_jobs: int = 1,
verbose: bool = False,
) -> METRIC_OUTPUT_TYPE:
- """Interval Width (IL).
+ """Interval Width (IW).
- IL gives the width of predicted quantile intervals.
+ IL gives the width / length of predicted quantile intervals.
For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
- it is computed per component/column, quantile interval, and time step
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step
:math:`t` as:
- .. math:: \\hat{y}_{t,qh} - \\hat{y}_{t,ql}
+ .. math:: U_t - L_t,
- where :math:`\\hat{y}_{t,qh}` are the upper bound quantile values (of all predicted quantiles or samples) at time
- :math:`t`, and :math:`\\hat{y}_{t,ql}` are the lower bound quantile values.
+ where :math:`U_t` are the predicted upper bound quantile values :math:`\\hat{y}_{q_h,t}` (of all predicted
+ quantiles or samples) at time :math:`t`, and :math:`L_t` are the predicted lower bound quantile values
+ :math:`\\hat{y}_{q_l,t}`.
Parameters
----------
@@ -3280,7 +3350,7 @@ def iw(
For time series that are overlapping in time without having the same time index, setting `True`
will consider the values only over their common time interval (intersection in time).
q_interval
- The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence tuples
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
(multiple intervals) with elements (low quantile, high quantile).
q
Quantiles `q` not supported by this metric; use `q_interval` instead.
@@ -3310,23 +3380,25 @@ def iw(
Returns
-------
float
- A single metric score for:
+ A single metric score for (with `len(q_interval) <= 1`):
- - single univariate series.
- - single multivariate series with `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
- a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
`time_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n time steps, n components) without time
- and component reductions. For:
+ A numpy array of metric scores. The array has shape (n time steps, n components * n q intervals) without time
+ and component reductions, and shape (n time steps, n q intervals) without time but component reduction and
+ `len(q_interval) > 1`. For:
- - single multivariate series and at least `component_reduction=None`.
- - single uni/multivariate series and at least `time_reduction=None`.
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
- a sequence of uni/multivariate series including `series_reduction` and at least one of
`component_reduction=None` or `time_reduction=None`.
- List[float]
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
y_true, y_pred = _get_values_or_raise(
@@ -3355,18 +3427,19 @@ def miw(
n_jobs: int = 1,
verbose: bool = False,
) -> METRIC_OUTPUT_TYPE:
- """Mean Interval Width (IL).
+ """Mean Interval Width (MIW).
- IL gives the width of predicted quantile intervals aggregated over time.
+ MIW gives the time-aggregated width / length of predicted quantile intervals.
For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
- it is computed per component/column, quantile interval, and time step
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step
:math:`t` as:
- .. math:: \\frac{1}{T}\\sum_{t=1}^T{\\hat{y}_{t,qh} - \\hat{y}_{t,ql}}
+ .. math:: \\frac{1}{T}\\sum_{t=1}^T{U_t - L_t},
- where :math:`\\hat{y}_{t,qh}` are the upper bound quantile values (of all predicted quantiles or samples) at time
- :math:`t`, and :math:`\\hat{y}_{t,ql}` are the lower bound quantile values.
+ where :math:`U_t` are the predicted upper bound quantile values :math:`\\hat{y}_{q_h,t}` (of all predicted
+ quantiles or samples) at time :math:`t`, and :math:`L_t` are the predicted lower bound quantile values
+ :math:`\\hat{y}_{q_l,t}`.
Parameters
----------
@@ -3378,7 +3451,7 @@ def miw(
For time series that are overlapping in time without having the same time index, setting `True`
will consider the values only over their common time interval (intersection in time).
q_interval
- The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence tuples
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
(multiple intervals) with elements (low quantile, high quantile).
q
Quantiles `q` not supported by this metric; use `q_interval` instead.
@@ -3403,19 +3476,22 @@ def miw(
Returns
-------
float
- A single metric score for:
+ A single metric score for (with `len(q_interval) <= 1`):
- - single univariate series.
- - single multivariate series with `component_reduction`.
- - sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
np.ndarray
- A numpy array of metric scores. The array has shape (n components,) without component reduction. For:
-
- - single multivariate series and at least `component_reduction=None`.
- - sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
- List[float]
+ A numpy array of metric scores. The array has shape (n components * n q intervals,) without component reduction,
+ and shape (n q intervals,) with component reduction and `len(q_interval) > 1`.
+ For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
Same as for type `float` but for a sequence of series.
- List[np.ndarray]
+ list[np.ndarray]
Same as for type `np.ndarray` but for a sequence of series.
"""
return np.nanmean(
@@ -3428,3 +3504,633 @@ def miw(
),
axis=TIME_AX,
)
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def iws(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ time_reduction: Optional[Callable[..., np.ndarray]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Interval Winkler Score (IWS) [1]_.
+
+ IWS gives the length / width of the quantile intervals plus a penalty if the observation is outside the interval.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math::
+ \\begin{equation}
+ \\begin{cases}
+ (U_t - L_t) + \\frac{1}{q_l} (L_t - y_t) & \\text{if } y_t < L_t \\\\
+ (U_t - L_t) & \\text{if } L_t \\leq y_t \\leq U_t \\\\
+ (U_t - L_t) + \\frac{1}{1 - q_h} (y_t - U_t) & \\text{if } y_t > U_t
+ \\end{cases}
+ \\end{equation}
+
+ where :math:`U_t` are the predicted upper bound quantile values :math:`\\hat{y}_{q_h,t}` (of all predicted
+ quantiles or samples) at time :math:`t`, and :math:`L_t` are the predicted lower bound quantile values
+ :math:`\\hat{y}_{q_l,t}`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ time_reduction
+ Optionally, a function to aggregate the metrics over the time axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(c,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ time axis. If `None`, will return a metric per time step.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
+ `time_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n time steps, n components * n q intervals) without time
+ and component reductions, and shape (n time steps, n q intervals) without time but component reduction and
+ `len(q_interval) > 1`. For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and at least one of
+ `component_reduction=None` or `time_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+
+ References
+ ----------
+ .. [1] https://otexts.com/fpp3/distaccuracy.html
+ """
+ y_true, y_pred = _get_values_or_raise(
+ actual_series,
+ pred_series,
+ intersect,
+ remove_nan_union=True,
+ q=q,
+ )
+ y_pred_lo, y_pred_hi = _get_quantile_intervals(y_pred, q=q, q_interval=q_interval)
+ interval_width = y_pred_hi - y_pred_lo
+
+ # `c_alpha = 2 / alpha` corresponds to:
+ # - `1 / (1 - q_hi)` for the high quantile
+ # - `1 / q_lo` for the low quantile
+ c_alpha_hi = 1 / (1 - q_interval[:, 1])
+ c_alpha_lo = 1 / q_interval[:, 0]
+
+ score = np.where(
+ y_true < y_pred_lo,
+ interval_width + c_alpha_lo * (y_pred_lo - y_true),
+ np.where(
+ y_true > y_pred_hi,
+ interval_width + c_alpha_hi * (y_true - y_pred_hi),
+ interval_width,
+ ),
+ )
+ return score
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def miws(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Mean Interval Winkler Score (IWS) [1]_.
+
+ MIWS gives the time-aggregated length / width of the quantile intervals plus a penalty if the observation is
+ outside the interval.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math:: \\frac{1}{T}\\sum_{t=1}^T{W_t(y_t, \\hat{y}_{t}, q_h, q_l)},
+
+ where :math:`W` is the Winkler Score :func:`~darts.metrics.metrics.iws`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n components * n q intervals,) without component reduction,
+ and shape (n q intervals,) with component reduction and `len(q_interval) > 1`.
+ For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+
+ References
+ ----------
+ .. [1] https://otexts.com/fpp3/distaccuracy.html
+ """
+ return np.nanmean(
+ _get_wrapped_metric(iws, n_wrappers=3)(
+ actual_series,
+ pred_series,
+ intersect,
+ q=q,
+ q_interval=q_interval,
+ ),
+ axis=TIME_AX,
+ )
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def ic(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ time_reduction: Optional[Callable[..., np.ndarray]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Interval Coverage (IC).
+
+ IC gives a binary outcome with `1` if the observation is within the interval, and `0` otherwise.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math::
+ \\begin{equation}
+ \\begin{cases}
+ 1 & \\text{if } L_t < y_t < U_t \\\\
+ 0 & \\text{otherwise}
+ \\end{cases}
+ \\end{equation}
+
+ where :math:`U_t` are the predicted upper bound quantile values :math:`\\hat{y}_{q_h,t}` (of all predicted
+ quantiles or samples) at time :math:`t`, and :math:`L_t` are the predicted lower bound quantile values
+ :math:`\\hat{y}_{q_l,t}`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ time_reduction
+ Optionally, a function to aggregate the metrics over the time axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(c,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ time axis. If `None`, will return a metric per time step.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
+ `time_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n time steps, n components * n q intervals) without time
+ and component reductions, and shape (n time steps, n q intervals) without time but component reduction and
+ `len(q_interval) > 1`. For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and at least one of
+ `component_reduction=None` or `time_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+ """
+ y_true, y_pred = _get_values_or_raise(
+ actual_series,
+ pred_series,
+ intersect,
+ remove_nan_union=True,
+ q=q,
+ )
+ y_pred_lo, y_pred_hi = _get_quantile_intervals(y_pred, q=q, q_interval=q_interval)
+ return np.where((y_pred_lo <= y_true) & (y_true <= y_pred_hi), 1.0, 0.0)
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def mic(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Mean Interval Coverage (MIC).
+
+ MIC gives the time-aggregated Interval Coverage :func:`~darts.metrics.metrics.ic` - the ratio of observations
+ being within the interval.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math:: \\frac{1}{T}\\sum_{t=1}^T{C(y_t, \\hat{y}_{t}, q_h, q_l)},
+
+ where :math:`C` is the Interval Coverage :func:`~darts.metrics.metrics.ic`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n components * n q intervals,) without component reduction,
+ and shape (n q intervals,) with component reduction and `len(q_interval) > 1`.
+ For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+ """
+ return np.nanmean(
+ _get_wrapped_metric(ic, n_wrappers=3)(
+ actual_series,
+ pred_series,
+ intersect,
+ q=q,
+ q_interval=q_interval,
+ ),
+ axis=TIME_AX,
+ )
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def incs_qr(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ symmetric: bool = True,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ time_reduction: Optional[Callable[..., np.ndarray]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Interval Non-Conformity Score for Quantile Regression (INCS_QR).
+
+ INCS_QR gives the absolute error to the closest predicted quantile interval bound when the observation is outside
+ the interval. Otherwise, it gives the negative absolute error to the closer bound.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math:: \\max(L_t - y_t, y_t - U_t)
+
+ where :math:`U_t` are the predicted upper bound quantile values :math:`\\hat{y}_{q_h,t}` (of all predicted
+ quantiles or samples) at time :math:`t`, and :math:`L_t` are the predicted lower bound quantile values
+ :math:`\\hat{y}_{q_l,t}`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ symmetric
+ Whether to return symmetric non-conformity scores. If `False`, returns asymmetric scores (individual scores
+ for lower- and upper quantile interval bounds; returned in the component axis).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ time_reduction
+ Optionally, a function to aggregate the metrics over the time axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(c,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ time axis. If `None`, will return a metric per time step.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction`, `component_reduction` and
+ `time_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n time steps, n components * n q intervals) without time
+ and component reductions, and shape (n time steps, n q intervals) without time but component reduction and
+ `len(q_interval) > 1`. For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a single uni/multivariate series and at least `time_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and at least one of
+ `component_reduction=None` or `time_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+ """
+ y_true, y_pred = _get_values_or_raise(
+ actual_series,
+ pred_series,
+ intersect,
+ remove_nan_union=True,
+ q=q,
+ )
+ y_pred_lo, y_pred_hi = _get_quantile_intervals(y_pred, q=q, q_interval=q_interval)
+ if symmetric:
+ return np.maximum(y_pred_lo - y_true, y_true - y_pred_hi)
+ else:
+ return np.concatenate([y_pred_lo - y_true, y_true - y_pred_hi], axis=SMPL_AX)
+
+
+@interval_support
+@multi_ts_support
+@multivariate_support
+def mincs_qr(
+ actual_series: Union[TimeSeries, Sequence[TimeSeries]],
+ pred_series: Union[TimeSeries, Sequence[TimeSeries]],
+ intersect: bool = True,
+ *,
+ q_interval: Union[tuple[float, float], Sequence[tuple[float, float]]] = None,
+ symmetric: bool = True,
+ q: Optional[Union[float, list[float], tuple[np.ndarray, pd.Index]]] = None,
+ component_reduction: Optional[Callable[[np.ndarray], float]] = np.nanmean,
+ series_reduction: Optional[Callable[[np.ndarray], Union[float, np.ndarray]]] = None,
+ n_jobs: int = 1,
+ verbose: bool = False,
+) -> METRIC_OUTPUT_TYPE:
+ """Mean Interval Non-Conformity Score for Quantile Regression (MINCS_QR).
+
+ MINCS_QR gives the time-aggregated INCS_QR :func:`~darts.metrics.metrics.incs_qr`.
+
+ For the true series :math:`y` and predicted stochastic or quantile series :math:`\\hat{y}` of length :math:`T`,
+ it is computed per component/column, quantile interval :math:`(q_l,q_h)`, and time step :math:`t` as:
+
+ .. math:: \\frac{1}{T}\\sum_{t=1}^T{INCS_QR(y_t, \\hat{y}_{t}, q_h, q_l)},
+
+ where :math:`INCS_QR` is the Interval Non-Conformity Score for Quantile Regression
+ :func:`~darts.metrics.metrics.incs_qr`.
+
+ Parameters
+ ----------
+ actual_series
+ The (sequence of) actual series.
+ pred_series
+ The (sequence of) predicted series.
+ intersect
+ For time series that are overlapping in time without having the same time index, setting `True`
+ will consider the values only over their common time interval (intersection in time).
+ q_interval
+ The quantile interval(s) to compute the metric on. Must be a tuple (single interval) or sequence of tuples
+ (multiple intervals) with elements (low quantile, high quantile).
+ symmetric
+ Whether to return symmetric non-conformity scores. If `False`, returns asymmetric scores (individual scores
+ for lower- and upper quantile interval bounds; returned in the component axis).
+ q
+ Quantiles `q` not supported by this metric; use `q_interval` instead.
+ component_reduction
+ Optionally, a function to aggregate the metrics over the component/column axis. It must reduce a `np.ndarray`
+ of shape `(t, c)` to a `np.ndarray` of shape `(t,)`. The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `1` corresponding to the
+ component axis. If `None`, will return a metric per component.
+ series_reduction
+ Optionally, a function to aggregate the metrics over multiple series. It must reduce a `np.ndarray`
+ of shape `(s, t, c)` to a `np.ndarray` of shape `(t, c)` The function takes as input a ``np.ndarray`` and a
+ parameter named `axis`, and returns the reduced array. The `axis` receives value `0` corresponding to the
+ series axis. For example with `np.nanmean`, will return the average over all series metrics. If `None`, will
+ return a metric per component.
+ n_jobs
+ The number of jobs to run in parallel. Parallel jobs are created only when a ``Sequence[TimeSeries]`` is
+ passed as input, parallelising operations regarding different ``TimeSeries``. Defaults to `1`
+ (sequential). Setting the parameter to `-1` means using all the available processors.
+ verbose
+ Optionally, whether to print operations progress
+
+ Returns
+ -------
+ float
+ A single metric score for (with `len(q_interval) <= 1`):
+
+ - a single univariate series.
+ - a single multivariate series with `component_reduction`.
+ - a sequence (list) of uni/multivariate series with `series_reduction` and `component_reduction`.
+ np.ndarray
+ A numpy array of metric scores. The array has shape (n components * n q intervals,) without component reduction,
+ and shape (n q intervals,) with component reduction and `len(q_interval) > 1`.
+ For:
+
+ - the input from the `float` return case above but with `len(q_interval) > 1`.
+ - a single multivariate series and at least `component_reduction=None`.
+ - a sequence of uni/multivariate series including `series_reduction` and `component_reduction=None`.
+ list[float]
+ Same as for type `float` but for a sequence of series.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series.
+ """
+ return np.nanmean(
+ _get_wrapped_metric(incs_qr, n_wrappers=3)(
+ actual_series,
+ pred_series,
+ intersect,
+ q=q,
+ q_interval=q_interval,
+ symmetric=symmetric,
+ ),
+ axis=TIME_AX,
+ )
diff --git a/darts/models/__init__.py b/darts/models/__init__.py
index 17640b195d..1ea802be3a 100644
--- a/darts/models/__init__.py
+++ b/darts/models/__init__.py
@@ -20,10 +20,16 @@
from darts.models.forecasting.auto_arima import AutoARIMA
from darts.models.forecasting.baselines import (
NaiveDrift,
+ NaiveEnsembleModel,
NaiveMean,
NaiveMovingAverage,
NaiveSeasonal,
)
+from darts.models.forecasting.conformal_models import (
+ ConformalNaiveModel,
+ ConformalQRModel,
+)
+from darts.models.forecasting.ensemble_model import EnsembleModel
from darts.models.forecasting.exponential_smoothing import ExponentialSmoothing
from darts.models.forecasting.fft import FFT
from darts.models.forecasting.kalman_forecaster import KalmanForecaster
@@ -108,15 +114,10 @@
except ImportError:
XGBModel = NotImportedModule(module_name="XGBoost")
+# Filtering
from darts.models.filtering.gaussian_process_filter import GaussianProcessFilter
from darts.models.filtering.kalman_filter import KalmanFilter
-
-# Filtering
from darts.models.filtering.moving_average_filter import MovingAverageFilter
-from darts.models.forecasting.baselines import NaiveEnsembleModel
-
-# Ensembling
-from darts.models.forecasting.ensemble_model import EnsembleModel
__all__ = [
"LightGBMModel",
@@ -140,7 +141,7 @@
"VARIMA",
"BlockRNNModel",
"DLinearModel",
- "GlobalNaiveDrift",
+ "GlobalNaiveAggregate",
"GlobalNaiveDrift",
"GlobalNaiveSeasonal",
"NBEATSModel",
@@ -165,4 +166,6 @@
"MovingAverageFilter",
"NaiveEnsembleModel",
"EnsembleModel",
+ "ConformalNaiveModel",
+ "ConformalQRModel",
]
diff --git a/darts/models/forecasting/__init__.py b/darts/models/forecasting/__init__.py
index 37a50aa4bc..b3559f9b62 100644
--- a/darts/models/forecasting/__init__.py
+++ b/darts/models/forecasting/__init__.py
@@ -50,4 +50,7 @@
Ensemble Models (`GlobalForecastingModel `_)
- :class:`~darts.models.forecasting.baselines.NaiveEnsembleModel`
- :class:`~darts.models.forecasting.regression_ensemble_model.RegressionEnsembleModel`
+Conformal Models (`GlobalForecastingModel `_)
+ - :class:`~darts.models.forecasting.conformal_models.ConformalNaiveModel`
+ - :class:`~darts.models.forecasting.conformal_models.ConformalQRModel`
"""
diff --git a/darts/models/forecasting/conformal_models.py b/darts/models/forecasting/conformal_models.py
new file mode 100644
index 0000000000..a6bc1ba409
--- /dev/null
+++ b/darts/models/forecasting/conformal_models.py
@@ -0,0 +1,1862 @@
+"""
+Conformal Models
+---------------
+
+A collection of conformal prediction models for pre-trained global forecasting models.
+"""
+
+import copy
+import math
+import os
+from abc import ABC, abstractmethod
+from collections.abc import Sequence
+from typing import Any, BinaryIO, Callable, Optional, Union
+
+try:
+ from typing import Literal
+except ImportError:
+ from typing_extensions import Literal
+
+import numpy as np
+import pandas as pd
+
+from darts import TimeSeries, metrics
+from darts.dataprocessing.pipeline import Pipeline
+from darts.dataprocessing.transformers import BaseDataTransformer
+from darts.logging import get_logger, raise_log
+from darts.metrics.metrics import METRIC_TYPE
+from darts.models.forecasting.forecasting_model import GlobalForecastingModel
+from darts.models.utils import TORCH_AVAILABLE
+from darts.utils import _build_tqdm_iterator, _with_sanity_checks
+from darts.utils.historical_forecasts.utils import (
+ _adjust_historical_forecasts_time_index,
+)
+from darts.utils.timeseries_generation import _build_forecast_series
+from darts.utils.ts_utils import (
+ SeriesType,
+ get_series_seq_type,
+ series2seq,
+)
+from darts.utils.utils import (
+ _check_quantiles,
+ generate_index,
+ likelihood_component_names,
+ n_steps_between,
+ quantile_names,
+ random_method,
+ sample_from_quantiles,
+)
+
+if TORCH_AVAILABLE:
+ from darts.models.forecasting.torch_forecasting_model import TorchForecastingModel
+else:
+ TorchForecastingModel = None
+
+logger = get_logger(__name__)
+
+
+class ConformalModel(GlobalForecastingModel, ABC):
+ @random_method
+ def __init__(
+ self,
+ model: GlobalForecastingModel,
+ quantiles: list[float],
+ symmetric: bool = True,
+ cal_length: Optional[int] = None,
+ cal_stride: int = 1,
+ cal_num_samples: int = 500,
+ random_state: Optional[int] = None,
+ ):
+ """Base Conformal Prediction Model.
+
+ Base class for any conformal prediction model. A conformal model calibrates the predictions from any
+ pre-trained global forecasting model. It does not have to be trained, and can generate calibrated forecasts
+ directly using the underlying trained forecasting model. Since it is a probabilistic model, you can generate
+ forecasts in two ways (when calling `predict()`, `historical_forecasts()`, ...):
+
+ - Predict the calibrated quantile intervals directly: Pass parameters `predict_likelihood_parameters=True`, and
+ `num_samples=1` to the forecast method.
+ - Predict stochastic samples from the calibrated quantile intervals: Pass parameters
+ `predict_likelihood_parameters=False`, and `num_samples>>1` to the forecast method.
+
+ Conformal models can be applied to any of Darts' global forecasting model, as long as the model has been
+ fitted before. In general the workflow of the models to produce one calibrated forecast/prediction is as
+ follows:
+
+ - Extract a calibration set: The calibration set for each conformal forecast is automatically extracted from
+ the most recent past of your input series relative to the forecast start point. The number of calibration
+ examples (forecast errors / non-conformity scores) to consider can be defined at model creation with
+ parameter `cal_length`. Note that when using `cal_stride>1`, a longer history is required since the
+ calibration examples are generated with stridden historical forecasts.
+ - Generate historical forecasts on the calibration set (using the forecasting model) with a stride `cal_stride`.
+ - Compute the errors/non-conformity scores (specific to each conformal model) on these historical forecasts
+ - Compute the quantile values from the errors / non-conformity scores (using our desired quantiles set at model
+ creation with parameter `quantiles`).
+ - Compute the conformal prediction: Using these quantile values, add calibrated intervals to (or adjust the
+ existing intervals of) the forecasting model's predictions.
+
+ Some notes:
+
+ - When computing `historical_forecasts()`, `backtest()`, `residuals()`, ... the above is applied for each
+ forecast (the forecasting model's historical forecasts are only generated once for efficiency).
+ - For multi-horizon forecasts, the above is applied for each step in the horizon separately.
+
+ Parameters
+ ----------
+ model
+ A pre-trained global forecasting model. See the list of models
+ `here `_.
+ quantiles
+ A list of quantiles centered around the median `q=0.5` to use. For example quantiles
+ [0.1, 0.2, 0.5, 0.8 0.9] correspond to two intervals with (0.9 - 0.1) = 80%, and (0.8 - 0.2) 60% coverage
+ around the median (model forecast).
+ symmetric
+ Whether to use symmetric non-conformity scores. If `False`, uses asymmetric scores (individual scores
+ for lower- and upper quantile interval bounds).
+ cal_length
+ The number of past forecast errors / non-conformity scores to use as calibration for each conformal
+ forecast (and each step in the horizon). If `None`, considers all scores.
+ cal_stride
+ The stride to apply when computing the historical forecasts and non-conformity scores on the calibration
+ set. The actual conformal forecasts can have a different stride given with parameter `stride` in downstream
+ tasks (e.g. historical forecasts, backtest, ...)
+ cal_num_samples
+ The number of samples to generate for each calibration forecast (if `model` is a probabilistic forecasting
+ model). The non-conformity scores are computed on the quantile values of these forecasts (using quantiles
+ `quantiles`). Uses `1` for deterministic models. The actual conformal forecasts can have a different number
+ of samples given with parameter `num_samples` in downstream tasks (e.g. predict, historical forecasts, ...).
+ random_state
+ Control the randomness of probabilistic conformal forecasts (sample generation) across different runs.
+ """
+ if not isinstance(model, GlobalForecastingModel) or not model._fit_called:
+ raise_log(
+ ValueError("`model` must be a pre-trained `GlobalForecastingModel`."),
+ logger=logger,
+ )
+ _check_quantiles(quantiles)
+
+ if cal_length is not None and cal_length < 1:
+ raise_log(
+ ValueError("`cal_length` must be `>=1` or `None`."), logger=logger
+ )
+ if cal_stride < 1:
+ raise_log(ValueError("`cal_stride` must be `>=1`."), logger=logger)
+ if cal_num_samples < 1:
+ raise_log(ValueError("`cal_num_samples` must be `>=1`."), logger=logger)
+
+ super().__init__(add_encoders=None)
+
+ # quantiles and interval setup
+ self.quantiles = np.array(quantiles)
+ self.idx_median = quantiles.index(0.5)
+ self.q_interval = [
+ (q_l, q_h)
+ for q_l, q_h in zip(
+ quantiles[: self.idx_median], quantiles[self.idx_median + 1 :][::-1]
+ )
+ ]
+ self.interval_range = np.array([
+ q_high - q_low for q_low, q_high in self.q_interval
+ ])
+
+ if symmetric:
+ # symmetric considers both tails together
+ self.interval_range_sym = copy.deepcopy(self.interval_range)
+ else:
+ # asymmetric considers tails separately
+ self.interval_range_sym = 1 - (1 - self.interval_range) / 2
+ self.symmetric = symmetric
+
+ # model setup
+ self.model = model
+ self.cal_length = cal_length
+ self.cal_stride = cal_stride
+ self.cal_num_samples = (
+ cal_num_samples if model.supports_probabilistic_prediction else 1
+ )
+ self._likelihood = "quantile"
+ self._fit_called = True
+
+ def fit(
+ self,
+ series: Union[TimeSeries, Sequence[TimeSeries]],
+ past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ **kwargs,
+ ) -> "ConformalModel":
+ """Fit/train the underlying forecasting model on (potentially multiple) series.
+
+ Optionally, one or multiple past and/or future covariates series can be provided as well, depending on the
+ forecasting model used. The number of covariates series must match the number of target series.
+
+ Notes
+ -----
+ Conformal Models do not require calling `fit()`, since they use pre-trained global forecasting models.
+ You can call `predict()` directly. Also, make sure that the input series used in `predict()` corresponds to
+ a calibration set, and not the same as used during training with `fit()`.
+
+ Parameters
+ ----------
+ series
+ One or several target time series. The model will be trained to forecast these time series.
+ The series may or may not be multivariate, but if multiple series are provided
+ they must have the same number of components.
+ past_covariates
+ One or several past-observed covariate time series. These time series will not be forecast, but can
+ be used by some models as an input. The covariate(s) may or may not be multivariate, but if multiple
+ covariates are provided they must have the same number of components. If `past_covariates` is provided,
+ it must contain the same number of series as `series`.
+ future_covariates
+ One or several future-known covariate time series. These time series will not be forecast, but can
+ be used by some models as an input. The covariate(s) may or may not be multivariate, but if multiple
+ covariates are provided they must have the same number of components. If `future_covariates` is provided,
+ it must contain the same number of series as `series`.
+ **kwargs
+ Optional keyword arguments that will passed to the underlying forecasting model's `fit()` method.
+
+ Returns
+ -------
+ self
+ Fitted model.
+ """
+ # does not have to be trained, but we allow it for unified API
+ self.model.fit(
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ **kwargs,
+ )
+ return self
+
+ def predict(
+ self,
+ n: int,
+ series: Union[TimeSeries, Sequence[TimeSeries]] = None,
+ past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ num_samples: int = 1,
+ verbose: bool = False,
+ predict_likelihood_parameters: bool = False,
+ show_warnings: bool = True,
+ **kwargs,
+ ) -> Union[TimeSeries, Sequence[TimeSeries]]:
+ """Forecasts calibrated quantile intervals (or samples from calibrated intervals) for `n` time steps after the
+ end of the `series`.
+
+ It is important that the input series for prediction correspond to a calibration set - a set different to the
+ series that the underlying forecasting `model` was trained on.
+
+ Since it is a probabilistic model, you can generate forecasts in two ways:
+
+ - Predict the calibrated quantile intervals directly: Pass parameters `predict_likelihood_parameters=True`, and
+ `num_samples=1` to the forecast method.
+ - Predict stochastic samples from the calibrated quantile intervals: Pass parameters
+ `predict_likelihood_parameters=False`, and `num_samples>>1` to the forecast method.
+
+ Under the hood, the simplified workflow to produce one calibrated forecast/prediction for every step in the
+ horizon `n` is as follows (note: `cal_length` and `cal_stride` can be set at model creation):
+
+ - Extract a calibration set: The calibration set for each conformal forecast is automatically extracted from
+ the most recent past of your input series relative to the forecast start point. The number of calibration
+ examples (forecast errors / non-conformity scores) to consider can be defined at model creation
+ with parameter `cal_length`. Note that when using `cal_stride>1`, a longer history is required since
+ the calibration examples are generated with stridden historical forecasts.
+ - Generate historical forecasts on the calibration set (using the forecasting model) with a stride `cal_stride`.
+ - Compute the errors/non-conformity scores (specific to each conformal model) on these historical forecasts
+ - Compute the quantile values from the errors / non-conformity scores (using our desired quantiles set at model
+ creation with parameter `quantiles`).
+ - Compute the conformal prediction: Using these quantile values, add calibrated intervals to (or adjust the
+ existing intervals of) the forecasting model's predictions.
+
+ Parameters
+ ----------
+ n
+ Forecast horizon - the number of time steps after the end of the series for which to produce predictions.
+ series
+ A series or sequence of series, representing the history of the target series whose future is to be
+ predicted. Will use the past of this series for calibration. The series should not have any overlap with
+ the series used to train the forecasting model.
+ past_covariates
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ future_covariates
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ num_samples
+ Number of times a prediction is sampled from the calibrated quantile predictions using linear
+ interpolation in-between the quantiles. For larger values, the sample distribution approximates the
+ calibrated quantile predictions.
+ verbose
+ Whether to print the progress.
+ predict_likelihood_parameters
+ If set to `True`, generates the quantile predictions directly. Only supported with `num_samples = 1`.
+ show_warnings
+ Whether to show warnings related auto-regression and past covariates usage.
+ **kwargs
+ Optional keyword arguments that will passed to the underlying forecasting model's `predict()` and
+ `historical_forecasts()` methods.
+
+ Returns
+ -------
+ Union[TimeSeries, Sequence[TimeSeries]]
+ If `series` is not specified, this function returns a single time series containing the `n`
+ next points after then end of the training series.
+ If `series` is given and is a simple ``TimeSeries``, this function returns the `n` next points
+ after the end of `series`.
+ If `series` is given and is a sequence of several time series, this function returns
+ a sequence where each element contains the corresponding `n` points forecasts.
+ """
+ if series is None:
+ # then there must be a single TS, and that was saved in super().fit as self.training_series
+ if self.model.training_series is None:
+ raise_log(
+ ValueError(
+ "Input `series` must be provided. This is the result either from fitting on multiple series, "
+ "or from not having fit the model yet."
+ ),
+ logger,
+ )
+ series = self.model.training_series
+
+ called_with_single_series = get_series_seq_type(series) == SeriesType.SINGLE
+
+ # guarantee that all inputs are either list of TimeSeries or None
+ series = series2seq(series)
+ if past_covariates is None and self.model.past_covariate_series is not None:
+ past_covariates = [self.model.past_covariate_series] * len(series)
+ if future_covariates is None and self.model.future_covariate_series is not None:
+ future_covariates = [self.model.future_covariate_series] * len(series)
+ past_covariates = series2seq(past_covariates)
+ future_covariates = series2seq(future_covariates)
+
+ super().predict(
+ n,
+ series,
+ past_covariates,
+ future_covariates,
+ num_samples,
+ verbose,
+ predict_likelihood_parameters,
+ show_warnings,
+ )
+
+ # call predict to verify that all series have required input times
+ _ = self.model.predict(
+ n=n,
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ num_samples=self.cal_num_samples,
+ verbose=verbose,
+ predict_likelihood_parameters=False,
+ show_warnings=show_warnings,
+ **kwargs,
+ )
+
+ # generate only the required forecasts for calibration (including the last forecast which is the output of
+ # `predict()`)
+ cal_start, cal_start_format = _get_calibration_hfc_start(
+ series=series,
+ horizon=n,
+ output_chunk_shift=self.output_chunk_shift,
+ cal_length=self.cal_length,
+ cal_stride=self.cal_stride,
+ start="end",
+ start_format="position",
+ )
+
+ cal_hfcs = self.model.historical_forecasts(
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ forecast_horizon=n,
+ num_samples=self.cal_num_samples,
+ start=cal_start,
+ start_format=cal_start_format,
+ stride=self.cal_stride,
+ retrain=False,
+ overlap_end=True,
+ last_points_only=False,
+ verbose=verbose,
+ show_warnings=False,
+ predict_likelihood_parameters=False,
+ predict_kwargs=kwargs,
+ )
+ cal_preds = self._calibrate_forecasts(
+ series=series,
+ forecasts=cal_hfcs,
+ num_samples=num_samples,
+ start="end", # uses last hist fc (output of `predict()`)
+ start_format="position",
+ forecast_horizon=n,
+ stride=self.cal_stride,
+ overlap_end=True,
+ last_points_only=False,
+ verbose=verbose,
+ show_warnings=show_warnings,
+ predict_likelihood_parameters=predict_likelihood_parameters,
+ )
+ # convert historical forecasts output to simple forecast / prediction
+ if called_with_single_series:
+ return cal_preds[0][0]
+ else:
+ return [cp[0] for cp in cal_preds]
+
+ @_with_sanity_checks("_historical_forecasts_sanity_checks")
+ def historical_forecasts(
+ self,
+ series: Union[TimeSeries, Sequence[TimeSeries]],
+ past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ forecast_horizon: int = 1,
+ num_samples: int = 1,
+ train_length: Optional[int] = None,
+ start: Optional[Union[pd.Timestamp, int]] = None,
+ start_format: Literal["position", "value"] = "value",
+ stride: int = 1,
+ retrain: Union[bool, int, Callable[..., bool]] = True,
+ overlap_end: bool = False,
+ last_points_only: bool = True,
+ verbose: bool = False,
+ show_warnings: bool = True,
+ predict_likelihood_parameters: bool = False,
+ enable_optimization: bool = True,
+ data_transformers: Optional[
+ dict[str, Union[BaseDataTransformer, Pipeline]]
+ ] = None,
+ fit_kwargs: Optional[dict[str, Any]] = None,
+ predict_kwargs: Optional[dict[str, Any]] = None,
+ sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
+ ) -> Union[TimeSeries, list[TimeSeries], list[list[TimeSeries]]]:
+ """Generates calibrated historical forecasts by simulating predictions at various points in time throughout the
+ history of the provided (potentially multiple) `series`. This process involves retrospectively applying the
+ model to different time steps, as if the forecasts were made in real-time at those specific moments. This
+ allows for an evaluation of the model's performance over the entire duration of the series, providing insights
+ into its predictive accuracy and robustness across different historical periods.
+
+ Currently, conformal models only support the pre-trained historical forecasts mode (`retrain=False`).
+ Parameters `retrain` and `train_length` are ignored.
+
+ **Pre-trained Mode:** First, all historical forecasts are generated using the underlying pre-trained global
+ forecasting model (see :meth:`ForecastingModel.historical_forecasts()
+ ` for more info). Then it
+ repeatedly builds a calibration set by either expanding from the beginning of the historical forecasts or by
+ using a fixed-length moving window with length `cal_length` (the start point can also be configured with
+ `start` and `start_format`).
+ The next forecast of length `forecast_horizon` is then calibrated on this calibration set. Subsequently, the
+ end of the calibration set is moved forward by `stride` time steps, and the process is repeated.
+
+ By default, with `last_points_only=True`, this method returns a single time series (or a sequence of time
+ series when `series` is also a sequence of series) composed of the last point from each calibrated historical
+ forecast. This time series will thus have a frequency of `series.freq * stride`.
+ If `last_points_only=False`, it will instead return a list (or a sequence of lists) with all calibrated
+ historical forecasts of length `forecast_horizon` and frequency `series.freq`.
+
+ Parameters
+ ----------
+ series
+ A (sequence of) target time series used to successively compute the historical forecasts. Will use the past
+ of this series for calibration. The series should not have any overlap with the series used to train the
+ forecasting model.
+ past_covariates
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ future_covariates
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ forecast_horizon
+ The forecast horizon for the predictions.
+ num_samples
+ Number of times a prediction is sampled from the calibrated quantile predictions using linear
+ interpolation in-between the quantiles. For larger values, the sample distribution approximates the
+ calibrated quantile predictions.
+ train_length
+ Currently ignored by conformal models.
+ start
+ Optionally, the first point in time at which a prediction is computed. This parameter supports:
+ ``int``, ``pandas.Timestamp``, and ``None``.
+ If an ``int``, it is either the index position of the first prediction point for `series` with a
+ `pd.DatetimeIndex`, or the index value for `series` with a `pd.RangeIndex`. The latter can be changed to
+ the index position with `start_format="position"`.
+ If a ``pandas.Timestamp``, it is the time stamp of the first prediction point.
+ If ``None``, the first prediction point will automatically be set to:
+
+ - the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
+ predictable point is earlier than the first trainable point.
+ - the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
+ - the first trainable point (given `train_length`) otherwise
+
+ Note: If the model uses a shifted output (`output_chunk_shift > 0`), then the first predicted point is also
+ shifted by `output_chunk_shift` points into the future.
+ Note: Raises a ValueError if `start` yields a time outside the time index of `series`.
+ Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
+ (default behavior with ``None``) and start at the first trainable/predictable point.
+ start_format
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
+ stride
+ The number of time steps between two consecutive predictions. Must be a round-multiple of `cal_stride`
+ (set at model creation) and `>=cal_stride`.
+ retrain
+ Currently ignored by conformal models.
+ overlap_end
+ Whether the returned forecasts can go beyond the series' end or not.
+ last_points_only
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
+ Otherwise, returns a list of historical ``TimeSeries`` forecasts.
+ verbose
+ Whether to print the progress.
+ show_warnings
+ Whether to show warnings related to historical forecasts optimization, or parameters `start` and
+ `train_length`.
+ predict_likelihood_parameters
+ If set to `True`, generates the quantile predictions directly. Only supported with `num_samples = 1`.
+ enable_optimization
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
+ Default: ``True``.
+ data_transformers
+ Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
+ (possibles keys; "series", "past_covariates", "future_covariates"). If provided, all input series must be
+ in the un-transformed space. For fittable transformer / pipeline:
+
+ - if `retrain=True`, the data transformer re-fit on the training data at each historical forecast step
+ (currently ignored by conformal models).
+ - if `retrain=False`, the data transformer transforms the series once before all the forecasts.
+
+ The fitted transformer is used to transform the input during both training and prediction.
+ If the transformation is invertible, the forecasts will be inverse-transformed.
+ fit_kwargs
+ Currently ignored by conformal models.
+ predict_kwargs
+ Optionally, some additional arguments passed to the model `predict()` method.
+ sample_weight
+ Currently ignored by conformal models.
+
+ Returns
+ -------
+ TimeSeries
+ A single historical forecast for a single `series` and `last_points_only=True`: it contains only the
+ predictions at step `forecast_horizon` from all historical forecasts.
+ list[TimeSeries]
+ A list of historical forecasts for:
+
+ - a sequence (list) of `series` and `last_points_only=True`: for each series, it contains only the
+ predictions at step `forecast_horizon` from all historical forecasts.
+ - a single `series` and `last_points_only=False`: for each historical forecast, it contains the entire
+ horizon `forecast_horizon`.
+ list[list[TimeSeries]]
+ A list of lists of historical forecasts for a sequence of `series` and `last_points_only=False`. For each
+ series, and historical forecast, it contains the entire horizon `forecast_horizon`. The outer list
+ is over the series provided in the input sequence, and the inner lists contain the historical forecasts for
+ each series.
+ """
+ called_with_single_series = get_series_seq_type(series) == SeriesType.SINGLE
+ series = series2seq(series)
+ past_covariates = series2seq(past_covariates)
+ future_covariates = series2seq(future_covariates)
+
+ # generate only the required forecasts (if `start` is given, we have to start earlier to satisfy the
+ # calibration set requirements)
+ cal_start, cal_start_format = _get_calibration_hfc_start(
+ series=series,
+ horizon=forecast_horizon,
+ output_chunk_shift=self.output_chunk_shift,
+ cal_length=self.cal_length,
+ cal_stride=self.cal_stride,
+ start=start,
+ start_format=start_format,
+ )
+ hfcs = self.model.historical_forecasts(
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ forecast_horizon=forecast_horizon,
+ num_samples=self.cal_num_samples,
+ start=cal_start,
+ start_format=cal_start_format,
+ stride=self.cal_stride,
+ retrain=False,
+ overlap_end=overlap_end,
+ last_points_only=last_points_only,
+ verbose=verbose,
+ show_warnings=False,
+ predict_likelihood_parameters=False,
+ enable_optimization=enable_optimization,
+ data_transformers=data_transformers,
+ fit_kwargs=fit_kwargs,
+ predict_kwargs=predict_kwargs,
+ )
+ calibrated_forecasts = self._calibrate_forecasts(
+ series=series,
+ forecasts=hfcs,
+ num_samples=num_samples,
+ start=start,
+ start_format=start_format,
+ forecast_horizon=forecast_horizon,
+ stride=stride,
+ overlap_end=overlap_end,
+ last_points_only=last_points_only,
+ verbose=verbose,
+ show_warnings=show_warnings,
+ predict_likelihood_parameters=predict_likelihood_parameters,
+ )
+ return (
+ calibrated_forecasts[0]
+ if called_with_single_series
+ else calibrated_forecasts
+ )
+
+ def backtest(
+ self,
+ series: Union[TimeSeries, Sequence[TimeSeries]],
+ past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ historical_forecasts: Optional[
+ Union[TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]]
+ ] = None,
+ forecast_horizon: int = 1,
+ num_samples: int = 1,
+ train_length: Optional[int] = None,
+ start: Optional[Union[pd.Timestamp, int]] = None,
+ start_format: Literal["position", "value"] = "value",
+ stride: int = 1,
+ retrain: Union[bool, int, Callable[..., bool]] = True,
+ overlap_end: bool = False,
+ last_points_only: bool = False,
+ metric: Union[METRIC_TYPE, list[METRIC_TYPE]] = metrics.mape,
+ reduction: Union[Callable[..., float], None] = np.mean,
+ verbose: bool = False,
+ show_warnings: bool = True,
+ predict_likelihood_parameters: bool = False,
+ enable_optimization: bool = True,
+ data_transformers: Optional[
+ dict[str, Union[BaseDataTransformer, Pipeline]]
+ ] = None,
+ metric_kwargs: Optional[Union[dict[str, Any], list[dict[str, Any]]]] = None,
+ fit_kwargs: Optional[dict[str, Any]] = None,
+ predict_kwargs: Optional[dict[str, Any]] = None,
+ sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
+ ) -> Union[float, np.ndarray, list[float], list[np.ndarray]]:
+ """Compute error values that the model produced for historical forecasts on (potentially multiple) `series`.
+
+ If `historical_forecasts` are provided, the metric(s) (given by the `metric` function) is evaluated directly on
+ all forecasts and actual values. The same `series` and `last_points_only` value must be passed that were used
+ to generate the historical forecasts. Finally, the method returns an optional `reduction` (the mean by default)
+ of all these metric scores.
+
+ If `historical_forecasts` is ``None``, it first generates the historical forecasts with the parameters given
+ below (see :meth:`ConformalModel.historical_forecasts()
+ ` for more info) and then
+ evaluates as described above.
+
+ The metric(s) can be further customized `metric_kwargs` (e.g. control the aggregation over components, time
+ steps, multiple series, other required arguments such as `q` for quantile metrics, ...).
+
+ Notes
+ -----
+ Darts has several metrics to evaluate probabilistic forecasts. For conformal models, we recommend using
+ quantile interval metrics (see `here `_).
+ You can specify which intervals to evaluate by setting `metric_kwargs={'q_interval': my_intervals}`. To check
+ all intervals used by your conformal model `my_model`, you can set ``{'q_interval': my_model.q_interval}``.
+
+ Parameters
+ ----------
+ series
+ A (sequence of) target time series used to successively compute the historical forecasts. Will use the past
+ of this series for calibration. The series should not have any overlap with the series used to train the
+ forecasting model.
+ past_covariates
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ future_covariates
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ historical_forecasts
+ Optionally, the (or a sequence of / a sequence of sequences of) historical forecasts time series to be
+ evaluated. Corresponds to the output of :meth:`historical_forecasts()
+ `. The same `series` and
+ `last_points_only` values must be passed that were used to generate the historical forecasts. If provided,
+ will skip historical forecasting and ignore all parameters except `series`, `last_points_only`, `metric`,
+ and `reduction`.
+ forecast_horizon
+ The forecast horizon for the predictions.
+ num_samples
+ Number of times a prediction is sampled from the calibrated quantile predictions using linear
+ interpolation in-between the quantiles. For larger values, the sample distribution approximates the
+ calibrated quantile predictions.
+ train_length
+ Currently ignored by conformal models.
+ start
+ Optionally, the first point in time at which a prediction is computed. This parameter supports:
+ ``int``, ``pandas.Timestamp``, and ``None``.
+ If an ``int``, it is either the index position of the first prediction point for `series` with a
+ `pd.DatetimeIndex`, or the index value for `series` with a `pd.RangeIndex`. The latter can be changed to
+ the index position with `start_format="position"`.
+ If a ``pandas.Timestamp``, it is the time stamp of the first prediction point.
+ If ``None``, the first prediction point will automatically be set to:
+
+ - the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
+ predictable point is earlier than the first trainable point.
+ - the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
+ - the first trainable point (given `train_length`) otherwise
+
+ Note: If the model uses a shifted output (`output_chunk_shift > 0`), then the first predicted point is also
+ shifted by `output_chunk_shift` points into the future.
+ Note: Raises a ValueError if `start` yields a time outside the time index of `series`.
+ Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
+ (default behavior with ``None``) and start at the first trainable/predictable point.
+ start_format
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
+ stride
+ The number of time steps between two consecutive predictions.
+ retrain
+ Currently ignored by conformal models.
+ overlap_end
+ Whether the returned forecasts can go beyond the series' end or not.
+ last_points_only
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
+ Otherwise, returns a list of historical ``TimeSeries`` forecasts.
+ metric
+ A metric function or a list of metric functions. Each metric must either be a Darts metric (see `here
+ `_), or a custom metric that has an
+ identical signature as Darts' metrics, uses decorators :func:`~darts.metrics.metrics.multi_ts_support` and
+ :func:`~darts.metrics.metrics.multi_ts_support`, and returns the metric score.
+ reduction
+ A function used to combine the individual error scores obtained when `last_points_only` is set to `False`.
+ When providing several metric functions, the function will receive the argument `axis = 1` to obtain single
+ value for each metric function.
+ If explicitly set to `None`, the method will return a list of the individual error scores instead.
+ Set to ``np.mean`` by default.
+ verbose
+ Whether to print the progress.
+ show_warnings
+ Whether to show warnings related to historical forecasts optimization, or parameters `start` and
+ `train_length`.
+ predict_likelihood_parameters
+ If set to `True`, generates the quantile predictions directly. Only supported with `num_samples = 1`.
+ enable_optimization
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
+ Default: ``True``.
+ data_transformers
+ Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
+ (possibles keys; "series", "past_covariates", "future_covariates"). If provided, all input series must be
+ in the un-transformed space. For fittable transformer / pipeline:
+
+ - if `retrain=True`, the data transformer re-fit on the training data at each historical forecast step
+ (currently ignored by conformal models).
+ - if `retrain=False`, the data transformer transforms the series once before all the forecasts.
+
+ The fitted transformer is used to transform the input during both training and prediction.
+ If the transformation is invertible, the forecasts will be inverse-transformed.
+ Only effective when `historical_forecasts=None`.
+ metric_kwargs
+ Additional arguments passed to `metric()`, such as `'n_jobs'` for parallelization, `'component_reduction'`
+ for reducing the component wise metrics, seasonality `'m'` for scaled metrics, etc. Will pass arguments to
+ each metric separately and only if they are present in the corresponding metric signature. Parameter
+ `'insample'` for scaled metrics (e.g. mase`, `rmsse`, ...) is ignored, as it is handled internally.
+ fit_kwargs
+ Currently ignored by conformal models.
+ predict_kwargs
+ Optionally, some additional arguments passed to the model `predict()` method.
+ sample_weight
+ Currently ignored by conformal models.
+
+ Returns
+ -------
+ float
+ A single backtest score for single uni/multivariate series, a single `metric` function and:
+
+ - `historical_forecasts` generated with `last_points_only=True`
+ - `historical_forecasts` generated with `last_points_only=False` and using a backtest `reduction`
+ np.ndarray
+ An numpy array of backtest scores. For single series and one of:
+
+ - a single `metric` function, `historical_forecasts` generated with `last_points_only=False`
+ and backtest `reduction=None`. The output has shape (n forecasts, *).
+ - multiple `metric` functions and `historical_forecasts` generated with `last_points_only=False`.
+ The output has shape (*, n metrics) when using a backtest `reduction`, and (n forecasts, *, n metrics)
+ when `reduction=None`
+ - multiple uni/multivariate series including `series_reduction` and at least one of
+ `component_reduction=None` or `time_reduction=None` for "per time step metrics"
+ list[float]
+ Same as for type `float` but for a sequence of series. The returned metric list has length
+ `len(series)` with the `float` metric for each input `series`.
+ list[np.ndarray]
+ Same as for type `np.ndarray` but for a sequence of series. The returned metric list has length
+ `len(series)` with the `np.ndarray` metrics for each input `series`.
+ """
+ return super().backtest(
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ historical_forecasts=historical_forecasts,
+ forecast_horizon=forecast_horizon,
+ num_samples=num_samples,
+ train_length=train_length,
+ start=start,
+ start_format=start_format,
+ stride=stride,
+ retrain=retrain,
+ overlap_end=overlap_end,
+ last_points_only=last_points_only,
+ metric=metric,
+ reduction=reduction,
+ verbose=verbose,
+ show_warnings=show_warnings,
+ predict_likelihood_parameters=predict_likelihood_parameters,
+ enable_optimization=enable_optimization,
+ data_transformers=data_transformers,
+ metric_kwargs=metric_kwargs,
+ fit_kwargs=fit_kwargs,
+ predict_kwargs=predict_kwargs,
+ sample_weight=sample_weight,
+ )
+
+ def residuals(
+ self,
+ series: Union[TimeSeries, Sequence[TimeSeries]],
+ past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ historical_forecasts: Optional[
+ Union[TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]]
+ ] = None,
+ forecast_horizon: int = 1,
+ num_samples: int = 1,
+ train_length: Optional[int] = None,
+ start: Optional[Union[pd.Timestamp, int]] = None,
+ start_format: Literal["position", "value"] = "value",
+ stride: int = 1,
+ retrain: Union[bool, int, Callable[..., bool]] = True,
+ overlap_end: bool = False,
+ last_points_only: bool = True,
+ metric: METRIC_TYPE = metrics.err,
+ verbose: bool = False,
+ show_warnings: bool = True,
+ predict_likelihood_parameters: bool = False,
+ enable_optimization: bool = True,
+ data_transformers: Optional[
+ dict[str, Union[BaseDataTransformer, Pipeline]]
+ ] = None,
+ metric_kwargs: Optional[dict[str, Any]] = None,
+ fit_kwargs: Optional[dict[str, Any]] = None,
+ predict_kwargs: Optional[dict[str, Any]] = None,
+ sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
+ values_only: bool = False,
+ ) -> Union[TimeSeries, list[TimeSeries], list[list[TimeSeries]]]:
+ """Compute the residuals that the model produced for historical forecasts on (potentially multiple) `series`.
+
+ This function computes the difference (or one of Darts' "per time step" metrics) between the actual
+ observations from `series` and the fitted values obtained by training the model on `series` (or using a
+ pre-trained model with `retrain=False`). Not all models support fitted values, so we use historical forecasts
+ as an approximation for them.
+
+ In sequence this method performs:
+
+ - use pre-computed `historical_forecasts` or compute historical forecasts for each series (see
+ :meth:`~darts.models.forecasting.conformal_models.ConformalModel.historical_forecasts` for more details).
+ How the historical forecasts are generated can be configured with parameters `num_samples`, `train_length`,
+ `start`, `start_format`, `forecast_horizon`, `stride`, `retrain`, `last_points_only`, `fit_kwargs`, and
+ `predict_kwargs`.
+ - compute a backtest using a "per time step" `metric` between the historical forecasts and `series` per
+ component/column and time step (see
+ :meth:`~darts.models.forecasting.conformal_models.ConformalModel.backtest` for more details). By default,
+ uses the residuals :func:`~darts.metrics.metrics.err` (error) as a `metric`.
+ - create and return `TimeSeries` (or simply a np.ndarray with `values_only=True`) with the time index from
+ historical forecasts, and values from the metrics per component and time step.
+
+ This method works for single or multiple univariate or multivariate series.
+ It uses the median prediction (when dealing with stochastic forecasts).
+
+ Notes
+ -----
+ Darts has several metrics to evaluate probabilistic forecasts. For conformal models, we recommend using
+ "per time step" quantile interval metrics (see `here
+ `_). You can specify which intervals to
+ evaluate by setting `metric_kwargs={'q_interval': my_intervals}`. To check all intervals used by your conformal
+ model `my_model`, you can set ``{'q_interval': my_model.q_interval}``.
+
+ Parameters
+ ----------
+ series
+ A (sequence of) target time series used to successively compute the historical forecasts. Will use the past
+ of this series for calibration. The series should not have any overlap with the series used to train the
+ forecasting model.
+ past_covariates
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ future_covariates
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ Their dimension must match that of the past covariates used for training. Will use this series for
+ calibration.
+ historical_forecasts
+ Optionally, the (or a sequence of / a sequence of sequences of) historical forecasts time series to be
+ evaluated. Corresponds to the output of :meth:`historical_forecasts()
+ `. The same `series` and
+ `last_points_only` values must be passed that were used to generate the historical forecasts. If provided,
+ will skip historical forecasting and ignore all parameters except `series`, `last_points_only`, `metric`,
+ and `reduction`.
+ forecast_horizon
+ The forecast horizon for the predictions.
+ num_samples
+ Number of times a prediction is sampled from the calibrated quantile predictions using linear
+ interpolation in-between the quantiles. For larger values, the sample distribution approximates the
+ calibrated quantile predictions.
+ train_length
+ Currently ignored by conformal models.
+ start
+ Optionally, the first point in time at which a prediction is computed. This parameter supports:
+ ``int``, ``pandas.Timestamp``, and ``None``.
+ If an ``int``, it is either the index position of the first prediction point for `series` with a
+ `pd.DatetimeIndex`, or the index value for `series` with a `pd.RangeIndex`. The latter can be changed to
+ the index position with `start_format="position"`.
+ If a ``pandas.Timestamp``, it is the time stamp of the first prediction point.
+ If ``None``, the first prediction point will automatically be set to:
+
+ - the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
+ predictable point is earlier than the first trainable point.
+ - the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
+ - the first trainable point (given `train_length`) otherwise
+
+ Note: If the model uses a shifted output (`output_chunk_shift > 0`), then the first predicted point is also
+ shifted by `output_chunk_shift` points into the future.
+ Note: Raises a ValueError if `start` yields a time outside the time index of `series`.
+ Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
+ (default behavior with ``None``) and start at the first trainable/predictable point.
+ start_format
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
+ stride
+ The number of time steps between two consecutive predictions.
+ retrain
+ Currently ignored by conformal models.
+ overlap_end
+ Whether the returned forecasts can go beyond the series' end or not.
+ last_points_only
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
+ Otherwise, returns a list of historical ``TimeSeries`` forecasts.
+ metric
+ Either one of Darts' "per time step" metrics (see `here
+ `_), or a custom metric that has an
+ identical signature as Darts' "per time step" metrics, uses decorators
+ :func:`~darts.metrics.metrics.multi_ts_support` and :func:`~darts.metrics.metrics.multi_ts_support`,
+ and returns one value per time step.
+ verbose
+ Whether to print the progress.
+ show_warnings
+ Whether to show warnings related to historical forecasts optimization, or parameters `start` and
+ `train_length`.
+ predict_likelihood_parameters
+ If set to `True`, generates the quantile predictions directly. Only supported with `num_samples = 1`.
+ enable_optimization
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
+ Default: ``True``.
+ data_transformers
+ Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
+ (possibles keys; "series", "past_covariates", "future_covariates"). If provided, all input series must be
+ in the un-transformed space. For fittable transformer / pipeline:
+
+ - if `retrain=True`, the data transformer re-fit on the training data at each historical forecast step
+ (currently ignored by conformal models).
+ - if `retrain=False`, the data transformer transforms the series once before all the forecasts.
+
+ The fitted transformer is used to transform the input during both training and prediction.
+ If the transformation is invertible, the forecasts will be inverse-transformed.
+ Only effective when `historical_forecasts=None`.
+ metric_kwargs
+ Additional arguments passed to `metric()`, such as `'n_jobs'` for parallelization, `'m'` for scaled
+ metrics, etc. Will pass arguments only if they are present in the corresponding metric signature. Ignores
+ reduction arguments `"series_reduction", "component_reduction", "time_reduction"`, and parameter
+ `'insample'` for scaled metrics (e.g. mase`, `rmsse`, ...), as they are handled internally.
+ fit_kwargs
+ Currently ignored by conformal models.
+ predict_kwargs
+ Optionally, some additional arguments passed to the model `predict()` method.
+ sample_weight
+ Currently ignored by conformal models.
+ values_only
+ Whether to return the residuals as `np.ndarray`. If `False`, returns residuals as `TimeSeries`.
+
+ Returns
+ -------
+ TimeSeries
+ Residual `TimeSeries` for a single `series` and `historical_forecasts` generated with
+ `last_points_only=True`.
+ list[TimeSeries]
+ A list of residual `TimeSeries` for a sequence (list) of `series` with `last_points_only=True`.
+ The residual list has length `len(series)`.
+ list[list[TimeSeries]]
+ A list of lists of residual `TimeSeries` for a sequence of `series` with `last_points_only=False`.
+ The outer residual list has length `len(series)`. The inner lists consist of the residuals from
+ all possible series-specific historical forecasts.
+ """
+ return super().residuals(
+ series=series,
+ past_covariates=past_covariates,
+ future_covariates=future_covariates,
+ historical_forecasts=historical_forecasts,
+ forecast_horizon=forecast_horizon,
+ num_samples=num_samples,
+ train_length=train_length,
+ start=start,
+ start_format=start_format,
+ stride=stride,
+ retrain=retrain,
+ overlap_end=overlap_end,
+ last_points_only=last_points_only,
+ metric=metric,
+ verbose=verbose,
+ show_warnings=show_warnings,
+ predict_likelihood_parameters=predict_likelihood_parameters,
+ enable_optimization=enable_optimization,
+ data_transformers=data_transformers,
+ metric_kwargs=metric_kwargs,
+ fit_kwargs=fit_kwargs,
+ predict_kwargs=predict_kwargs,
+ sample_weight=sample_weight,
+ values_only=values_only,
+ )
+
+ @random_method
+ def _calibrate_forecasts(
+ self,
+ series: Sequence[TimeSeries],
+ forecasts: Union[Sequence[Sequence[TimeSeries]], Sequence[TimeSeries]],
+ num_samples: int = 1,
+ start: Optional[Union[pd.Timestamp, int, str]] = None,
+ start_format: Literal["position", "value"] = "value",
+ forecast_horizon: int = 1,
+ stride: int = 1,
+ overlap_end: bool = False,
+ last_points_only: bool = True,
+ verbose: bool = False,
+ show_warnings: bool = True,
+ predict_likelihood_parameters: bool = False,
+ ) -> Union[TimeSeries, list[TimeSeries], list[list[TimeSeries]]]:
+ """Generate calibrated historical forecasts.
+
+ In general the workflow of the models to produce one calibrated forecast/prediction per step in the horizon
+ is as follows:
+
+ - Generate historical forecasts for `series` with stride `cal_stride` (using the forecasting model)
+ - Extract a calibration set: The forecasts from the most recent past to use as calibration for one conformal
+ prediction. The number of examples to use can be defined at model creation with parameter `cal_length`. It
+ automatically extracts the calibration set from the most recent past of your input series (`series`,
+ `past_covariates`, ...).
+ - Compute the errors/non-conformity scores (specific to each conformal model) on these historical forecasts
+ - Compute the quantile values from the errors / non-conformity scores (using our desired quantiles set at model
+ creation with parameter `quantiles`).
+ - Compute the conformal prediction: Using these quantile values, add calibrated intervals to (or adjust the
+ existing intervals of) the forecasting model's predictions.
+ """
+ cal_stride = self.cal_stride
+ cal_length = self.cal_length
+ metric, metric_kwargs = self._residuals_metric
+ residuals = self.model.residuals(
+ series=series,
+ historical_forecasts=forecasts,
+ overlap_end=overlap_end,
+ last_points_only=last_points_only,
+ verbose=verbose,
+ show_warnings=show_warnings,
+ values_only=True,
+ metric=metric,
+ metric_kwargs=metric_kwargs,
+ )
+
+ outer_iterator = enumerate(zip(series, forecasts, residuals))
+ if len(series) > 1:
+ # Use tqdm on the outer loop only if there's more than one series to iterate over
+ # (otherwise use tqdm on the inner loop).
+ outer_iterator = _build_tqdm_iterator(
+ outer_iterator,
+ verbose,
+ total=len(series),
+ desc="conformal forecasts",
+ )
+
+ cp_hfcs = []
+ for series_idx, (series_, s_hfcs, res) in outer_iterator:
+ cp_preds = []
+
+ # no historical forecasts were generated
+ if not s_hfcs:
+ cp_hfcs.append(cp_preds)
+ continue
+
+ last_hfc = s_hfcs if last_points_only else s_hfcs[-1]
+
+ # compute the minimum required number of useful calibration residuals
+ # at least one or `cal_length` examples
+ min_n_cal = cal_length or 1
+ # `last_points_only=False` requires additional examples to use most recent information
+ # from all steps in the horizon
+ if not last_points_only:
+ min_n_cal += math.ceil(forecast_horizon / cal_stride) - 1
+
+ # determine first forecast index for conformal prediction
+ # we need at least one residual per point in the horizon prior to the first conformal forecast
+ horizon_ocs = forecast_horizon + self.output_chunk_shift
+ first_idx_train = math.ceil(horizon_ocs / cal_stride)
+
+ # plus some additional examples based on `cal_length`
+ if cal_length is not None:
+ first_idx_train += cal_length - 1
+
+ # check if later we need to drop some residuals without useful information (unknown residuals)
+ if overlap_end:
+ delta_end = n_steps_between(
+ end=last_hfc.end_time(),
+ start=series_.end_time(),
+ freq=series_.freq,
+ )
+ else:
+ delta_end = 0
+
+ # ignore residuals without useful information
+ if last_points_only and delta_end > 0:
+ # useful residual information only up until the forecast *ending* at the last time step in `series`
+ ignore_n_residuals = delta_end
+ elif not last_points_only and delta_end >= forecast_horizon:
+ # useful residual information only up until the forecast *starting* at the last time step in `series`
+ ignore_n_residuals = delta_end - forecast_horizon + 1
+ else:
+ # ignore at least one forecast residuals from the end, since we can only use prior residuals
+ ignore_n_residuals = self.output_chunk_shift + 1
+ # with last points only, ignore the last `horizon` residuals to avoid look-ahead bias
+ if last_points_only:
+ ignore_n_residuals += forecast_horizon - 1
+
+ # get the last index respecting `cal_stride`
+ last_res_idx = -math.ceil(ignore_n_residuals / cal_stride)
+ # get only useful residuals
+ res = res[:last_res_idx]
+
+ if first_idx_train >= len(s_hfcs) or len(res) < min_n_cal:
+ raise_log(
+ ValueError(
+ "Could not build the minimum required calibration input with the provided "
+ f"`series` and `*_covariates` at series index: {series_idx}. "
+ f"Expected to generate at least `{min_n_cal}` calibration forecasts with known residuals "
+ f"before the first conformal forecast, but could only generate `{len(res)}`."
+ ),
+ logger=logger,
+ )
+
+ # adjust first index based on `start`
+ first_idx_start = 0
+ if start == "end":
+ # called from `predict()`; start at the last forecast
+ first_idx_start = len(s_hfcs) - 1
+ elif start is not None:
+ # called from `historical_forecasts()`: use user-defined start
+ # the conformal forecastable index ranges from the start of the first valid historical
+ # forecast until the start of the last historical forecast
+ historical_forecasts_time_index = (
+ s_hfcs[first_idx_train].start_time(),
+ s_hfcs[-1].start_time(),
+ )
+ # adjust forecast start points in case of output shift or `last_points_only=True`
+ adjust_idx = (
+ self.output_chunk_shift
+ + int(last_points_only) * (forecast_horizon - 1)
+ ) * series_.freq
+ historical_forecasts_time_index = (
+ historical_forecasts_time_index[0] - adjust_idx,
+ historical_forecasts_time_index[1] - adjust_idx,
+ )
+
+ # adjust forecastable times based on user start, assuming hfcs were generated with `stride=1`
+ first_start_time, _ = _adjust_historical_forecasts_time_index(
+ series=series_,
+ series_idx=series_idx,
+ start=start,
+ start_format=start_format,
+ stride=stride,
+ historical_forecasts_time_index=historical_forecasts_time_index,
+ show_warnings=show_warnings,
+ )
+ # find position relative to start
+ first_idx_start = n_steps_between(
+ first_start_time + adjust_idx,
+ s_hfcs[0].start_time(),
+ freq=series_.freq,
+ )
+ # adjust by stride
+ first_idx_start = math.ceil(first_idx_start / cal_stride)
+
+ # get final first index
+ first_fc_idx = max([first_idx_train, first_idx_start])
+ # bring `res` from shape (forecasting steps, n components, n past residuals) into
+ # shape (forecasting steps, n components, n past residuals)
+ if last_points_only:
+ # -> (1, n components, n samples * n past residuals)
+ res = res.transpose(2, 1, 0)
+ else:
+ # rearrange the residuals to avoid look-ahead bias and to have the same number of examples per
+ # point in the horizon. We want the most recent residuals in the past for each step in the horizon.
+ res = np.array(res)
+
+ # go through each step in the horizon, use all useful information from the end (most recent values),
+ # and skip information at beginning (most distant past);
+ # -> (forecast horizon, n components, n past residuals)
+ res_ = []
+ for idx_horizon in range(forecast_horizon):
+ n = idx_horizon + 1
+ # ignore residuals at beginning
+ idx_fc_start = math.floor((forecast_horizon - n) / cal_stride)
+ # keep as many residuals as possible from end
+ idx_fc_end = -(
+ math.ceil(forecast_horizon / cal_stride) - (idx_fc_start + 1)
+ )
+ res_.append(res[idx_fc_start : idx_fc_end or None, idx_horizon])
+ res = np.concatenate(res_, axis=2).T
+
+ # get the last conformal forecast index (exclusive) based on the residual examples
+ last_fc_idx = res.shape[2] + math.ceil(horizon_ocs / cal_stride)
+
+ # forecasts are stridden, so stride must be relative
+ rel_stride = math.ceil(stride / cal_stride)
+
+ def conformal_predict(idx_, pred_vals_):
+ # get the last residual index for calibration, `cal_end` is exclusive
+ # to avoid look-ahead bias, use only residuals from before the conformal forecast start point;
+ # for `last_points_only=True`, the last residual historically available at the forecasting
+ # point is `horizon_ocs - 1` steps before. The same applies to `last_points_only=False` thanks to
+ # the residual rearrangement
+ cal_end = (
+ first_fc_idx
+ + idx_ * rel_stride
+ - (math.ceil(horizon_ocs / cal_stride) - 1)
+ )
+ # optionally, use only `cal_length` residuals
+ cal_start = cal_end - cal_length if cal_length is not None else None
+
+ # calibrate and apply interval to the forecasts
+ q_hat_ = self._calibrate_interval(res[:, :, cal_start:cal_end])
+ vals = self._apply_interval(pred_vals_, q_hat_)
+
+ # optionally, generate samples from the intervals
+ if not predict_likelihood_parameters:
+ vals = sample_from_quantiles(
+ vals, self.quantiles, num_samples=num_samples
+ )
+ return vals
+
+ # historical conformal prediction
+ # for each forecast, compute calibrated quantile intervals based on past residuals
+ if last_points_only:
+ inner_iterator = enumerate(
+ s_hfcs.all_values(copy=False)[first_fc_idx:last_fc_idx:rel_stride]
+ )
+ else:
+ inner_iterator = enumerate(s_hfcs[first_fc_idx:last_fc_idx:rel_stride])
+
+ comp_names_out = (
+ self._cp_component_names(series_)
+ if predict_likelihood_parameters
+ else None
+ )
+ if len(series) == 1:
+ # only use progress bar if there's no outer loop
+ inner_iterator = _build_tqdm_iterator(
+ inner_iterator,
+ verbose,
+ total=(last_fc_idx - 1 - first_fc_idx) // rel_stride + 1,
+ desc="conformal forecasts",
+ )
+
+ if last_points_only:
+ for idx, pred_vals in inner_iterator:
+ pred_vals = np.expand_dims(pred_vals, 0)
+ cp_pred = conformal_predict(idx, pred_vals)
+ cp_preds.append(cp_pred)
+ cp_preds = _build_forecast_series(
+ points_preds=np.concatenate(cp_preds, axis=0),
+ input_series=series_,
+ custom_columns=comp_names_out,
+ time_index=generate_index(
+ start=s_hfcs._time_index[first_fc_idx],
+ length=len(cp_preds),
+ freq=series_.freq * stride,
+ name=series_._time_index.name,
+ ),
+ with_static_covs=not predict_likelihood_parameters,
+ with_hierarchy=False,
+ )
+ else:
+ for idx, pred in inner_iterator:
+ pred_vals = pred.all_values(copy=False)
+ cp_pred = conformal_predict(idx, pred_vals)
+ cp_pred = _build_forecast_series(
+ points_preds=cp_pred,
+ input_series=series_,
+ custom_columns=comp_names_out,
+ time_index=pred._time_index,
+ with_static_covs=not predict_likelihood_parameters,
+ with_hierarchy=False,
+ )
+ cp_preds.append(cp_pred)
+ cp_hfcs.append(cp_preds)
+ return cp_hfcs
+
+ def save(
+ self, path: Optional[Union[str, os.PathLike, BinaryIO]] = None, **pkl_kwargs
+ ) -> None:
+ """
+ Saves the conformal model under a given path or file handle.
+
+ Additionally, two files are stored if `self.model` is a `TorchForecastingModel`.
+
+ Example for saving and loading a :class:`ConformalNaiveModel`:
+
+ .. highlight:: python
+ .. code-block:: python
+
+ from darts.datasets import AirPassengersDataset
+ from darts.models import ConformalNaiveModel, LinearRegressionModel
+
+ series = AirPassengersDataset().load()
+ forecasting_model = LinearRegressionModel(lags=4).fit(series)
+
+ model = ConformalNaiveModel(
+ model=forecasting_model,
+ quantiles=[0.1, 0.5, 0.9],
+ )
+
+ model.save("my_model.pkl")
+ model_loaded = ConformalNaiveModel.load("my_model.pkl")
+ ..
+
+ Parameters
+ ----------
+ path
+ Path or file handle under which to save the ensemble model at its current state. If no path is specified,
+ the ensemble model is automatically saved under ``"{ConformalNaiveModel}_{YYYY-mm-dd_HH_MM_SS}.pkl"``.
+ If the forecasting model is a `TorchForecastingModel`, two files (model object and checkpoint) are saved
+ under ``"{path}.{ModelClass}.pt"`` and ``"{path}.{ModelClass}.ckpt"``.
+ pkl_kwargs
+ Keyword arguments passed to `pickle.dump()`
+ """
+
+ if path is None:
+ # default path
+ path = self._default_save_path() + ".pkl"
+
+ super().save(path, **pkl_kwargs)
+
+ if TORCH_AVAILABLE and issubclass(type(self.model), TorchForecastingModel):
+ path_tfm = f"{path}.{type(self.model).__name__}.pt"
+ self.model.save(path=path_tfm)
+
+ @staticmethod
+ def load(path: Union[str, os.PathLike, BinaryIO]) -> "ConformalModel":
+ model: ConformalModel = GlobalForecastingModel.load(path)
+
+ if TORCH_AVAILABLE and issubclass(type(model.model), TorchForecastingModel):
+ path_tfm = f"{path}.{type(model.model).__name__}.pt"
+ model.model = TorchForecastingModel.load(path_tfm)
+ return model
+
+ @abstractmethod
+ def _calibrate_interval(
+ self, residuals: np.ndarray
+ ) -> tuple[np.ndarray, np.ndarray]:
+ """Computes the lower and upper calibrated forecast intervals based on residuals.
+
+ Parameters
+ ----------
+ residuals
+ The residuals are expected to have shape (horizon, n components, n historical forecasts * n samples)
+ """
+
+ @abstractmethod
+ def _apply_interval(self, pred: np.ndarray, q_hat: tuple[np.ndarray, np.ndarray]):
+ """Applies the calibrated interval to the predicted quantiles. Returns an array with `len(quantiles)`
+ conformalized quantile predictions (lower quantiles, model forecast, upper quantiles) per component.
+
+ E.g. output is `(target1_q1, target1_pred, target1_q2, target2_q1, ...)`
+ """
+
+ @property
+ @abstractmethod
+ def _residuals_metric(self) -> tuple[METRIC_TYPE, Optional[dict]]:
+ """Gives the "per time step" metric and optional metric kwargs used to compute residuals /
+ non-conformity scores."""
+
+ def _cp_component_names(self, input_series) -> list[str]:
+ """Gives the component names for generated forecasts."""
+ return likelihood_component_names(
+ input_series.components, quantile_names(self.quantiles)
+ )
+
+ def _historical_forecasts_sanity_checks(self, *args: Any, **kwargs: Any) -> None:
+ super()._historical_forecasts_sanity_checks(*args, **kwargs, is_conformal=True)
+
+ @property
+ def output_chunk_length(self) -> Optional[int]:
+ # conformal models can predict any horizon if the calibration set is large enough
+ return None
+
+ @property
+ def output_chunk_shift(self) -> int:
+ return self.model.output_chunk_shift
+
+ @property
+ def _model_encoder_settings(self):
+ raise NotImplementedError(f"not supported by `{self.__class__.__name__}`.")
+
+ @property
+ def extreme_lags(
+ self,
+ ) -> tuple[
+ Optional[int],
+ Optional[int],
+ Optional[int],
+ Optional[int],
+ Optional[int],
+ Optional[int],
+ int,
+ Optional[int],
+ ]:
+ raise NotImplementedError(f"not supported by `{self.__class__.__name__}`.")
+
+ @property
+ def min_train_series_length(self) -> int:
+ raise NotImplementedError(f"not supported by `{self.__class__.__name__}`.")
+
+ @property
+ def min_train_samples(self) -> int:
+ raise NotImplementedError(f"not supported by `{self.__class__.__name__}`.")
+
+ @property
+ def supports_multivariate(self) -> bool:
+ return self.model.supports_multivariate
+
+ @property
+ def supports_past_covariates(self) -> bool:
+ return self.model.supports_past_covariates
+
+ @property
+ def supports_future_covariates(self) -> bool:
+ return self.model.supports_future_covariates
+
+ @property
+ def supports_static_covariates(self) -> bool:
+ return self.model.supports_static_covariates
+
+ @property
+ def supports_sample_weight(self) -> bool:
+ return self.model.supports_sample_weight
+
+ @property
+ def supports_likelihood_parameter_prediction(self) -> bool:
+ return True
+
+ @property
+ def supports_probabilistic_prediction(self) -> bool:
+ return True
+
+ @property
+ def uses_past_covariates(self) -> bool:
+ return self.model.uses_past_covariates
+
+ @property
+ def uses_future_covariates(self) -> bool:
+ return self.model.uses_future_covariates
+
+ @property
+ def uses_static_covariates(self) -> bool:
+ return self.model.uses_static_covariates
+
+ @property
+ def considers_static_covariates(self) -> bool:
+ return self.model.considers_static_covariates
+
+ @property
+ def likelihood(self) -> str:
+ return self._likelihood
+
+
+class ConformalNaiveModel(ConformalModel):
+ def __init__(
+ self,
+ model: GlobalForecastingModel,
+ quantiles: list[float],
+ symmetric: bool = True,
+ cal_length: Optional[int] = None,
+ cal_stride: int = 1,
+ cal_num_samples: int = 500,
+ random_state: Optional[int] = None,
+ ):
+ """Naive Conformal Prediction Model.
+
+ A probabilistic model that adds calibrated intervals around the median forecast from a pre-trained
+ global forecasting model. It does not have to be trained and can generated calibrated forecasts
+ directly using the underlying trained forecasting model. It supports two symmetry modes:
+
+ - `symmetric=True`:
+ - The lower and upper interval bounds are calibrated with the same magnitude.
+ - Non-conformity scores: uses metric `ae()` (see absolute error :func:`~darts.metrics.metrics.ae`) to
+ compute the non-conformity scores on the calibration set.
+ - `symmetric=False`
+ - The lower and upper interval bounds are calibrated separately.
+ - Non-conformity scores: uses metric `err()` (see error :func:`~darts.metrics.metrics.err`) to compute the
+ non-conformity scores on the calibration set for the upper bounds, an `-err()` for the lower bounds.
+
+ Since it is a probabilistic model, you can generate forecasts in two ways (when calling `predict()`,
+ `historical_forecasts()`, ...):
+
+ - Predict the calibrated quantile intervals directly: Pass parameters `predict_likelihood_parameters=True`, and
+ `num_samples=1` to the forecast method.
+ - Predict stochastic samples from the calibrated quantile intervals: Pass parameters
+ `predict_likelihood_parameters=False`, and `num_samples>>1` to the forecast method.
+
+ Conformal models can be applied to any of Darts' global forecasting model, as long as the model has been
+ fitted before. In general the workflow of the models to produce one calibrated forecast/prediction is as
+ follows:
+
+ - Extract a calibration set: The calibration set for each conformal forecast is automatically extracted from
+ the most recent past of your input series relative to the forecast start point. The number of calibration
+ examples (forecast errors / non-conformity scores) to consider can be defined at model creation
+ with parameter `cal_length`. Note that when using `cal_stride>1`, a longer history is required since
+ the calibration examples are generated with stridden historical forecasts.
+ - Generate historical forecasts on the calibration set (using the forecasting model) with a stride `cal_stride`.
+ - Compute the errors/non-conformity scores (as defined above) on these historical forecasts
+ - Compute the quantile values from the errors / non-conformity scores (using our desired quantiles set at model
+ creation with parameter `quantiles`).
+ - Compute the conformal prediction: Using these quantile values, add calibrated intervals to the forecasting
+ model's predictions.
+
+ Some notes:
+
+ - When computing `historical_forecasts()`, `backtest()`, `residuals()`, ... the above is applied for each
+ forecast (the forecasting model's historical forecasts are only generated once for efficiency).
+ - For multi-horizon forecasts, the above is applied for each step in the horizon separately.
+
+ Parameters
+ ----------
+ model
+ A pre-trained global forecasting model. See the list of models
+ `here `_.
+ quantiles
+ A list of quantiles centered around the median `q=0.5` to use. For example quantiles
+ [0.1, 0.2, 0.5, 0.8 0.9] correspond to two intervals with (0.9 - 0.1) = 80%, and (0.8 - 0.2) 60% coverage
+ around the median (model forecast).
+ symmetric
+ Whether to use symmetric non-conformity scores. If `True`, uses metric `ae()` (see
+ :func:`~darts.metrics.metrics.ae`) to compute the non-conformity scores. If `False`, uses metric `-err()`
+ (see :func:`~darts.metrics.metrics.err`) for the lower, and `err()` for the upper quantile interval bound.
+ cal_length
+ The number of past forecast errors / non-conformity scores to use as calibration for each conformal
+ forecast (and each step in the horizon). If `None`, considers all scores.
+ cal_stride
+ The stride to apply when computing the historical forecasts and non-conformity scores on the calibration
+ set. The actual conformal forecasts can have a different stride given with parameter `stride` in downstream
+ tasks (e.g. historical forecasts, backtest, ...)
+ cal_num_samples
+ The number of samples to generate for each calibration forecast (if `model` is a probabilistic forecasting
+ model). The non-conformity scores are computed on the quantile values of these forecasts (using quantiles
+ `quantiles`). Uses `1` for deterministic models. The actual conformal forecasts can have a different number
+ of samples given with parameter `num_samples` in downstream tasks (e.g. predict, historical forecasts, ...).
+ random_state
+ Control the randomness of probabilistic conformal forecasts (sample generation) across different runs.
+ """
+ super().__init__(
+ model=model,
+ quantiles=quantiles,
+ symmetric=symmetric,
+ cal_length=cal_length,
+ cal_num_samples=cal_num_samples,
+ random_state=random_state,
+ cal_stride=cal_stride,
+ )
+
+ def _calibrate_interval(
+ self, residuals: np.ndarray
+ ) -> tuple[np.ndarray, np.ndarray]:
+ def q_hat_from_residuals(residuals_):
+ # compute quantiles of shape (forecast horizon, n components, n quantile intervals)
+ return np.quantile(
+ residuals_,
+ q=self.interval_range_sym,
+ method="higher",
+ axis=2,
+ ).transpose((1, 2, 0))
+
+ # residuals shape (horizon, n components, n past forecasts)
+ if self.symmetric:
+ # symmetric (from metric `ae()`)
+ q_hat = q_hat_from_residuals(residuals)
+ return -q_hat, q_hat[:, :, ::-1]
+ else:
+ # asymmetric (from metric `err()`)
+ q_hat = q_hat_from_residuals(
+ np.concatenate([-residuals, residuals], axis=1)
+ )
+ n_comps = residuals.shape[1]
+ return -q_hat[:, :n_comps, :], q_hat[:, n_comps:, ::-1]
+
+ def _apply_interval(self, pred: np.ndarray, q_hat: tuple[np.ndarray, np.ndarray]):
+ # convert stochastic predictions to median
+ if pred.shape[2] != 1:
+ pred = np.expand_dims(np.quantile(pred, 0.5, axis=2), -1)
+ # shape (forecast horizon, n components, n quantiles)
+ pred = np.concatenate([pred + q_hat[0], pred, pred + q_hat[1]], axis=2)
+ # -> (forecast horizon, n components * n quantiles)
+ return pred.reshape(len(pred), -1)
+
+ @property
+ def _residuals_metric(self) -> tuple[METRIC_TYPE, Optional[dict]]:
+ return (metrics.ae if self.symmetric else metrics.err), None
+
+
+class ConformalQRModel(ConformalModel):
+ def __init__(
+ self,
+ model: GlobalForecastingModel,
+ quantiles: list[float],
+ symmetric: bool = True,
+ cal_length: Optional[int] = None,
+ cal_stride: int = 1,
+ cal_num_samples: int = 500,
+ random_state: Optional[int] = None,
+ ):
+ """Conformalized Quantile Regression Model.
+
+ A probabilistic model that calibrates the quantile predictions from a pre-trained probabilistic global
+ forecasting model. It does not have to be trained and can generated calibrated forecasts
+ directly using the underlying trained forecasting model. It supports two symmetry modes:
+
+ - `symmetric=True`:
+ - The lower and upper quantile predictions are calibrated with the same magnitude.
+ - Non-conformity scores: uses metric `incs_qr(symmetric=True)` (see Non-Conformity Score for Quantile
+ Regression :func:`~darts.metrics.metrics.incs_qr`) to compute the non-conformity scores on the calibration
+ set.
+ - `symmetric=False`
+ - The lower and upper quantile predictions are calibrated separately.
+ - Non-conformity scores: uses metric `incs_qr(symmetric=False)` (see Non-Conformity Score for Quantile
+ Regression :func:`~darts.metrics.metrics.incs_qr`) to compute the non-conformity scores for the upper and
+ lower bound separately.
+
+ Since it is a probabilistic model, you can generate forecasts in two ways (when calling `predict()`,
+ `historical_forecasts()`, ...):
+
+ - Predict the calibrated quantile intervals directly: Pass parameters `predict_likelihood_parameters=True`, and
+ `num_samples=1` to the forecast method.
+ - Predict stochastic samples from the calibrated quantile intervals: Pass parameters
+ `predict_likelihood_parameters=False`, and `num_samples>>1` to the forecast method.
+
+ Conformal models can be applied to any of Darts' global forecasting model, as long as the model has been
+ fitted before. In general the workflow of the models to produce one calibrated forecast/prediction is as
+ follows:
+
+ - Extract a calibration set: The calibration set for each conformal forecast is automatically extracted from
+ the most recent past of your input series relative to the forecast start point. The number of calibration
+ examples (forecast errors / non-conformity scores) to consider can be defined at model creation with
+ parameter `cal_length`. Note that when using `cal_stride>1`, a longer history is required since the
+ calibration examples are generated with stridden historical forecasts.
+ - Generate historical forecasts (quantile predictions) on the calibration set (using the forecasting model)
+ with a stride `cal_stride`.
+ - Compute the errors/non-conformity scores (as defined above) on these historical quantile predictions
+ - Compute the quantile values from the errors / non-conformity scores (using our desired quantiles set at model
+ creation with parameter `quantiles`).
+ - Compute the conformal prediction: Using these quantile values, calibrate the predicted quantiles from the
+ forecasting model's predictions.
+
+ Some notes:
+
+ - When computing `historical_forecasts()`, `backtest()`, `residuals()`, ... the above is applied for each
+ forecast (the forecasting model's historical forecasts are only generated once for efficiency).
+ - For multi-horizon forecasts, the above is applied for each step in the horizon separately.
+
+ Parameters
+ ----------
+ model
+ A pre-trained global forecasting model. See the list of models
+ `here `_.
+ quantiles
+ A list of quantiles centered around the median `q=0.5` to use. For example quantiles
+ [0.1, 0.2, 0.5, 0.8 0.9] correspond to two intervals with (0.9 - 0.1) = 80%, and (0.8 - 0.2) 60% coverage
+ around the median (model forecast).
+ symmetric
+ Whether to use symmetric non-conformity scores. If `True`, uses symmetric metric
+ `incs_qr(..., symmetric=True)` (see :func:`~darts.metrics.metrics.incs_qr`) to compute the non-conformity
+ scores. If `False`, uses asymmetric metric `incs_qr(..., symmetric=False)` with individual scores for the
+ lower- and upper quantile interval bounds.
+ cal_length
+ The number of past forecast errors / non-conformity scores to use as calibration for each conformal
+ forecast (and each step in the horizon). If `None`, considers all scores.
+ cal_stride
+ The stride to apply when computing the historical forecasts and non-conformity scores on the calibration
+ set. The actual conformal forecasts can have a different stride given with parameter `stride` in downstream
+ tasks (e.g. historical forecasts, backtest, ...)
+ cal_num_samples
+ The number of samples to generate for each calibration forecast (if `model` is a probabilistic forecasting
+ model). The non-conformity scores are computed on the quantile values of these forecasts (using quantiles
+ `quantiles`). Uses `1` for deterministic models. The actual conformal forecasts can have a different number
+ of samples given with parameter `num_samples` in downstream tasks (e.g. predict, historical forecasts, ...).
+ random_state
+ Control the randomness of probabilistic conformal forecasts (sample generation) across different runs.
+ """
+ if not model.supports_probabilistic_prediction:
+ raise_log(
+ ValueError(
+ "`model` must support probabilistic forecasting. Consider using a `likelihood` at "
+ "forecasting model creation, or use another conformal model."
+ ),
+ logger=logger,
+ )
+ super().__init__(
+ model=model,
+ quantiles=quantiles,
+ symmetric=symmetric,
+ cal_length=cal_length,
+ cal_num_samples=cal_num_samples,
+ random_state=random_state,
+ cal_stride=cal_stride,
+ )
+
+ def _calibrate_interval(
+ self, residuals: np.ndarray
+ ) -> tuple[np.ndarray, np.ndarray]:
+ n_comps = residuals.shape[1] // (
+ len(self.interval_range) * (1 + int(not self.symmetric))
+ )
+ n_intervals = len(self.interval_range)
+
+ def q_hat_from_residuals(residuals_):
+ # TODO: is there a more efficient way?
+ # compute quantiles with shape (horizon, n components, n quantile intervals)
+ # over all past residuals
+ q_hat_tmp = np.quantile(
+ residuals_, q=self.interval_range_sym, method="higher", axis=2
+ ).transpose((1, 2, 0))
+ q_hat_ = np.empty((len(residuals_), n_comps, n_intervals))
+ for i in range(n_intervals):
+ for c in range(n_comps):
+ q_hat_[:, c, i] = q_hat_tmp[:, i + c * n_intervals, i]
+ return q_hat_
+
+ if self.symmetric:
+ # symmetric has one nc-score per interval (from metric `incs_qr(symmetric=True)`)
+ # residuals shape (horizon, n components * n intervals, n past forecasts)
+ q_hat = q_hat_from_residuals(residuals)
+ return -q_hat, q_hat[:, :, ::-1]
+ else:
+ # asymmetric has two nc-score per interval (for lower and upper quantiles, from metric
+ # `incs_qr(symmetric=False)`)
+ # lower and upper residuals are concatenated along axis=1;
+ # residuals shape (horizon, n components * n intervals * 2, n past forecasts)
+ half_idx = residuals.shape[1] // 2
+ q_hat_lo = q_hat_from_residuals(residuals[:, :half_idx])
+ q_hat_hi = q_hat_from_residuals(residuals[:, half_idx:])
+ return -q_hat_lo, q_hat_hi[:, :, ::-1]
+
+ def _apply_interval(self, pred: np.ndarray, q_hat: tuple[np.ndarray, np.ndarray]):
+ # get quantile predictions with shape (n times, n components, n quantiles)
+ pred = np.quantile(pred, self.quantiles, axis=2).transpose((1, 2, 0))
+ # shape (forecast horizon, n components, n quantiles)
+ pred = np.concatenate(
+ [
+ pred[:, :, : self.idx_median] + q_hat[0], # lower quantiles
+ pred[:, :, self.idx_median : self.idx_median + 1], # model forecast
+ pred[:, :, self.idx_median + 1 :] + q_hat[1], # upper quantiles
+ ],
+ axis=2,
+ )
+ # -> (forecast horizon, n components * n quantiles)
+ return pred.reshape(len(pred), -1)
+
+ @property
+ def _residuals_metric(self) -> tuple[METRIC_TYPE, Optional[dict]]:
+ return metrics.incs_qr, {
+ "q_interval": self.q_interval,
+ "symmetric": self.symmetric,
+ }
+
+
+def _get_calibration_hfc_start(
+ series: Sequence[TimeSeries],
+ horizon: int,
+ output_chunk_shift: int,
+ cal_length: Optional[int],
+ cal_stride: int,
+ start: Optional[Union[pd.Timestamp, int, Literal["end"]]],
+ start_format: Literal["position", "value"],
+) -> tuple[Optional[Union[int, pd.Timestamp]], Literal["position", "value"]]:
+ """Find the calibration start point (CSP) (for historical forecasts on calibration set).
+
+ - If `start=None`, the CSP is also `None` (all possible hfcs).
+ - If `start="end"` (when calling `predict()`), returns the CSP as a positional index relative to the end of the
+ series (<0).
+ - Otherwise (when calling `historical_forecasts()`), the CSP is the start value (`start_format="value"`) or start
+ position (`start_format="position"`) adjusted by the positions computed for the case above.
+
+ If this function is called from `historical_forecasts`, the sanity checks guarantee the following:
+
+ - `start` cannot be a `float`
+ - when `start_format='value'`, all `series` have the same frequency
+ """
+ if start is None:
+ return start, start_format
+
+ cal_start_format: Literal["position", "value"]
+ horizon_ocs = horizon + output_chunk_shift
+ if cal_length is not None:
+ # we only need `cal_length` forecasts with stride `cal_stride` before the `predict()` start point;
+ # the last valid calibration forecast must start at least `horizon_ocs` before `predict()` start
+ add_steps = math.ceil(horizon_ocs / cal_stride) - 1
+ start_idx_rel = -cal_stride * (cal_length + add_steps)
+ cal_start_format = "position"
+ elif cal_stride > 1:
+ # we need all forecasts with stride `cal_stride` before the `predict()` start point
+ max_len_series = max(len(series_) for series_ in series)
+ start_idx_rel = -cal_stride * math.ceil(max_len_series / cal_stride)
+ cal_start_format = "position"
+ else:
+ # we need all possible forecasts with `cal_stride=1`
+ start_idx_rel, cal_start_format = None, "value"
+
+ if start == "end":
+ # `predict()` is relative to the end
+ return start_idx_rel, cal_start_format
+
+ # `historical_forecasts()` is relative to `start`
+ start_is_position = isinstance(start, (int, np.int64)) and (
+ start_format == "position" or series[0]._has_datetime_index
+ )
+ cal_start_format = start_format
+ if start_idx_rel is None:
+ cal_start = start_idx_rel
+ elif start_is_position:
+ cal_start = start + start_idx_rel
+ # if start switches sign, it would be relative to the end;
+ # correct it to be positive (relative to beginning)
+ if cal_start < 0 <= start:
+ cal_start += math.ceil(abs(cal_start) / cal_stride) * cal_stride
+ else:
+ cal_start = start + start_idx_rel * series[0].freq
+ return cal_start, cal_start_format
diff --git a/darts/models/forecasting/ensemble_model.py b/darts/models/forecasting/ensemble_model.py
index c585efd6c3..72187f8334 100644
--- a/darts/models/forecasting/ensemble_model.py
+++ b/darts/models/forecasting/ensemble_model.py
@@ -239,9 +239,10 @@ def _stack_ts_multiseq(self, predictions_list):
# stacks multiple sequences of timeseries elementwise
return [self._stack_ts_seq(ts_list) for ts_list in zip(*predictions_list)]
+ @property
def _model_encoder_settings(self):
raise NotImplementedError(
- "Encoders are not supported by EnsembleModels. Instead add encoder to the underlying `forecasting_models`."
+ "Encoders are not supported by EnsembleModels. Instead add encoders to the underlying `forecasting_models`."
)
def _make_multiple_predictions(
@@ -436,15 +437,6 @@ def save(
@staticmethod
def load(path: Union[str, os.PathLike, BinaryIO]) -> "EnsembleModel":
- """
- Loads the ensemble model from a given path or file handle.
-
- Parameters
- ----------
- path
- Path or file handle from which to load the ensemble model.
- """
-
model: EnsembleModel = GlobalForecastingModel.load(path)
for i, m in enumerate(model.forecasting_models):
diff --git a/darts/models/forecasting/forecasting_model.py b/darts/models/forecasting/forecasting_model.py
index d28b179701..459f705575 100644
--- a/darts/models/forecasting/forecasting_model.py
+++ b/darts/models/forecasting/forecasting_model.py
@@ -42,10 +42,12 @@
_apply_data_transformers,
_apply_inverse_data_transformers,
_convert_data_transformers,
+ _extend_series_for_overlap_end,
_get_historical_forecast_predict_index,
_get_historical_forecast_train_index,
_historical_forecasts_general_checks,
_historical_forecasts_sanitize_kwargs,
+ _process_historical_forecast_for_backtest,
_reconciliate_historical_time_indices,
)
from darts.utils.timeseries_generation import (
@@ -332,8 +334,7 @@ def predict(
n
Forecast horizon - the number of time steps after the end of the series for which to produce predictions.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
Optionally, set the prediction verbosity. Not effective for all models.
show_warnings
@@ -353,8 +354,12 @@ def predict(
),
logger,
)
-
- if self.output_chunk_shift and n > self.output_chunk_length:
+ is_autoregression = (
+ False
+ if self.output_chunk_length is None
+ else (n > self.output_chunk_length)
+ )
+ if self.output_chunk_shift and is_autoregression:
raise_log(
ValueError(
"Cannot perform auto-regression `(n > output_chunk_length)` with a model that uses a "
@@ -607,7 +612,10 @@ def _historical_forecasts_sanity_checks(self, *args: Any, **kwargs: Any) -> None
"""
# parse args and kwargs
series = args[0]
- _historical_forecasts_general_checks(self, series, kwargs)
+ is_conformal = kwargs.get("is_conformal", False)
+ _historical_forecasts_general_checks(
+ self, series, kwargs, is_conformal=is_conformal
+ )
def _get_last_prediction_time(
self,
@@ -638,11 +646,11 @@ def historical_forecasts(
series: Union[TimeSeries, Sequence[TimeSeries]],
past_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
future_covariates: Optional[Union[TimeSeries, Sequence[TimeSeries]]] = None,
+ forecast_horizon: int = 1,
num_samples: int = 1,
train_length: Optional[int] = None,
start: Optional[Union[pd.Timestamp, float, int]] = None,
start_format: Literal["position", "value"] = "value",
- forecast_horizon: int = 1,
stride: int = 1,
retrain: Union[bool, int, Callable[..., bool]] = True,
overlap_end: bool = False,
@@ -658,42 +666,61 @@ def historical_forecasts(
predict_kwargs: Optional[dict[str, Any]] = None,
sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
) -> Union[TimeSeries, list[TimeSeries], list[list[TimeSeries]]]:
- """Compute the historical forecasts that would have been obtained by this model on
- (potentially multiple) `series`.
-
- This method repeatedly builds a training set: either expanding from the beginning of `series` or moving with
- a fixed length `train_length`. It trains the model on the training set, emits a forecast of length equal to
- forecast_horizon, and then moves the end of the training set forward by `stride` time steps.
-
- By default, this method will return one (or a sequence of) single time series made up of
- the last point of each historical forecast.
- This time series will thus have a frequency of ``series.freq * stride``.
- If `last_points_only` is set to `False`, it will instead return one (or a sequence of) list of the
- historical forecasts series.
-
- By default, this method always re-trains the models on the entire available history, corresponding to an
- expanding window strategy. If `retrain` is set to `False`, the model must have been fit before. This is not
- supported by all models.
+ """Generates historical forecasts by simulating predictions at various points in time throughout the history of
+ the provided (potentially multiple) `series`. This process involves retrospectively applying the model to
+ different time steps, as if the forecasts were made in real-time at those specific moments. This allows for an
+ evaluation of the model's performance over the entire duration of the series, providing insights into its
+ predictive accuracy and robustness across different historical periods.
+
+ There are two main modes for this method:
+
+ - Re-training Mode (Default, `retrain=True`): The model is re-trained at each step of the simulation, and
+ generates a forecast using the updated model. In case of multiple series, the model is re-trained on each
+ series independently (global training is not yet supported).
+ - Pre-trained Mode (`retrain=False`): The forecasts are generated at each step of the simulation without
+ re-training. It is only supported for pre-trained global forecasting models. This mode is significantly
+ faster as it skips the re-training step.
+
+ By choosing the appropriate mode, you can balance between computational efficiency and the need for up-to-date
+ model training.
+
+ **Re-training Mode:** This mode repeatedly builds a training set by either expanding from the beginning of
+ the `series` or by using a fixed-length `train_length` (the start point can also be configured with `start`
+ and `start_format`). The model is then trained on this training set, and a forecast of length `forecast_horizon`
+ is generated. Subsequently, the end of the training set is moved forward by `stride` time steps, and the process
+ is repeated.
+
+ **Pre-trained Mode:** This mode is only supported for pre-trained global forecasting models. It uses the same
+ simulation steps as in the *Re-training Mode* (ignoring `train_length`), but generates the forecasts directly
+ without re-training.
+
+ By default, with `last_points_only=True`, this method returns a single time series (or a sequence of time
+ series) composed of the last point from each historical forecast. This time series will thus have a frequency of
+ `series.freq * stride`.
+ If `last_points_only=False`, it will instead return a list (or a sequence of lists) of the full historical
+ forecast series each with frequency `series.freq`.
Parameters
----------
series
- The (or a sequence of) target time series used to successively train and compute the historical forecasts.
+ A (sequence of) target time series used to successively train (if `retrain` is not ``False``) and compute
+ the historical forecasts.
past_covariates
- Optionally, one (or a sequence of) past-observed covariate series. This applies only if the model
- supports past covariates.
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ This applies only if the model supports past covariates.
future_covariates
- Optionally, one (or a sequence of) of future-known covariate series. This applies only if the model
- supports future covariates.
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ This applies only if the model supports future covariates.
+ forecast_horizon
+ The forecast horizon for the predictions.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Use values `>1` only for probabilistic
+ Number of times a prediction is sampled from a probabilistic model. Use values ``>1`` only for probabilistic
models.
train_length
- Number of time steps in our training set (size of backtesting window to train on). Only effective when
- `retrain` is not ``False``. Default is set to `train_length=None` where it takes all available time steps
- up until prediction time, otherwise the moving window strategy is used. If larger than the number of time
- steps available, all steps up until prediction time are used, as in default case. Needs to be at least
- `min_train_series_length`.
+ Optionally, use a fixed length / number of time steps for every constructed training set (rolling window
+ mode). Only effective when `retrain` is not ``False``. The default is ``None``, where it uses all time
+ steps up until the prediction time (expanding window mode). If larger than the number of available time
+ steps, uses the expanding mode. Needs to be at least `min_train_series_length`.
start
Optionally, the first point in time at which a prediction is computed. This parameter supports:
``float``, ``int``, ``pandas.Timestamp``, and ``None``.
@@ -707,7 +734,7 @@ def historical_forecasts(
- the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
predictable point is earlier than the first trainable point.
- the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
- or `retrain` is a Callable and the first trainable point is earlier than the first predictable point.
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
- the first trainable point (given `train_length`) otherwise
Note: If `start` is not within the trainable / forecastable points, uses the closest valid start point that
@@ -717,21 +744,18 @@ def historical_forecasts(
Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
(default behavior with ``None``) and start at the first trainable/predictable point.
start_format
- Defines the `start` format. Only effective when `start` is an integer and `series` is indexed with a
- `pd.RangeIndex`.
- If set to 'position', `start` corresponds to the index position of the first predicted point and can range
- from `(-len(series), len(series) - 1)`.
- If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
- an error if the value is not in `series`' index. Default: ``'value'``
- forecast_horizon
- The forecast horizon for the predictions.
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
stride
The number of time steps between two consecutive predictions.
retrain
Whether and/or on which condition to retrain the model before predicting.
- This parameter supports 3 different datatypes: ``bool``, (positive) ``int``, and
- ``Callable`` (returning a ``bool``).
- In the case of ``bool``: retrain the model at each step (`True`), or never retrains the model (`False`).
+ This parameter supports 3 different types: ``bool``, (positive) ``int``, and ``Callable`` (returning a
+ ``bool``).
+ In the case of ``bool``: retrain the model at each step (`True`), or never retrain the model (`False`).
In the case of ``int``: the model is retrained every `retrain` iterations.
In the case of ``Callable``: the model is retrained whenever callable returns `True`.
The callable must have the following positional arguments:
@@ -740,31 +764,31 @@ def historical_forecasts(
- `pred_time` (pd.Timestamp or int): timestamp of forecast time (end of the training series)
- `train_series` (TimeSeries): train series up to `pred_time`
- `past_covariates` (TimeSeries): past_covariates series up to `pred_time`
- - `future_covariates` (TimeSeries): future_covariates series up
- to `min(pred_time + series.freq * forecast_horizon, series.end_time())`
+ - `future_covariates` (TimeSeries): future_covariates series up to `min(pred_time + series.freq *
+ forecast_horizon, series.end_time())`
Note: if any optional `*_covariates` are not passed to `historical_forecast`, ``None`` will be passed
to the corresponding retrain function argument.
- Note: some models do require being retrained every time and do not support anything other
- than `retrain=True`.
+ Note: some models require being retrained every time and do not support anything other than
+ `retrain=True`.
Note: also controls the retraining of the `data_transformers`.
overlap_end
Whether the returned forecasts can go beyond the series' end or not.
last_points_only
- Whether to retain only the last point of each historical forecast.
- If set to `True`, the method returns a single ``TimeSeries`` containing the successive point forecasts.
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
Otherwise, returns a list of historical ``TimeSeries`` forecasts.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
Whether to show warnings related to historical forecasts optimization, or parameters `start` and
`train_length`.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
- Default: ``False``
+ Default: ``False``.
enable_optimization
- Whether to use the optimized version of historical_forecasts when supported and available.
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
Default: ``True``.
data_transformers
Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
@@ -777,9 +801,9 @@ def historical_forecasts(
The fitted transformer is used to transform the input during both training and prediction.
If the transformation is invertible, the forecasts will be inverse-transformed.
fit_kwargs
- Additional arguments passed to the model `fit()` method.
+ Optionally, some additional arguments passed to the model `fit()` method.
predict_kwargs
- Additional arguments passed to the model `predict()` method.
+ Optionally, some additional arguments passed to the model `predict()` method.
sample_weight
Optionally, some sample weights to apply to the target `series` labels for training. Only effective when
`retrain` is not ``False``. They are applied per observation, per label (each step in
@@ -978,7 +1002,9 @@ def retrain_func(
# (otherwise use tqdm on the inner loop).
outer_iterator = series
else:
- outer_iterator = _build_tqdm_iterator(series, verbose)
+ outer_iterator = _build_tqdm_iterator(
+ series, verbose, total=len(series), desc="historical forecasts"
+ )
# deactivate the warning after displaying it once if show_warnings is True
show_predict_warnings = show_warnings
@@ -1074,7 +1100,10 @@ def retrain_func(
if len(series) == 1:
# Only use tqdm if there's no outer loop
iterator = _build_tqdm_iterator(
- historical_forecasts_time_index[::stride], verbose
+ historical_forecasts_time_index[::stride],
+ verbose,
+ total=(len(historical_forecasts_time_index) - 1) // stride + 1,
+ desc="historical forecasts",
)
else:
iterator = historical_forecasts_time_index[::stride]
@@ -1246,11 +1275,11 @@ def backtest(
historical_forecasts: Optional[
Union[TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]]
] = None,
+ forecast_horizon: int = 1,
num_samples: int = 1,
train_length: Optional[int] = None,
start: Optional[Union[pd.Timestamp, float, int]] = None,
start_format: Literal["position", "value"] = "value",
- forecast_horizon: int = 1,
stride: int = 1,
retrain: Union[bool, int, Callable[..., bool]] = True,
overlap_end: bool = False,
@@ -1269,51 +1298,49 @@ def backtest(
predict_kwargs: Optional[dict[str, Any]] = None,
sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
) -> Union[float, np.ndarray, list[float], list[np.ndarray]]:
- """Compute error values that the model would have produced when
- used on (potentially multiple) `series`.
+ """Compute error values that the model produced for historical forecasts on (potentially multiple) `series`.
- If `historical_forecasts` are provided, the metric (given by the `metric` function) is evaluated directly on
- the forecast and the actual values. The same `series` must be passed that was used to generate the historical
- forecasts. Otherwise, it repeatedly builds a training set: either expanding from the
- beginning of `series` or moving with a fixed length `train_length`. It trains the current model on the
- training set, emits a forecast of length equal to `forecast_horizon`, and then moves the end of the training
- set forward by `stride` time steps. The metric is then evaluated on the forecast and the actual values.
- Finally, the method returns a `reduction` (the mean by default) of all these metric scores.
+ If `historical_forecasts` are provided, the metric(s) (given by the `metric` function) is evaluated directly on
+ all forecasts and actual values. The same `series` and `last_points_only` value must be passed that were used
+ to generate the historical forecasts. Finally, the method returns an optional `reduction` (the mean by default)
+ of all these metric scores.
- By default, this method uses each historical forecast (whole) to compute error scores.
- If `last_points_only` is set to `True`, it will use only the last point of each historical
- forecast. In this case, no reduction is used.
+ If `historical_forecasts` is ``None``, it first generates the historical forecasts with the parameters given
+ below (see :meth:`ForecastingModel.historical_forecasts()
+ ` for more info) and then
+ evaluates as described above.
- By default, this method always re-trains the models on the entire available history, corresponding to an
- expanding window strategy. If `retrain` is set to `False` (useful for models for which training might be
- time-consuming, such as deep learning models), the trained model will be used directly to emit the forecasts.
+ The metric(s) can be further customized `metric_kwargs` (e.g. control the aggregation over components, time
+ steps, multiple series, other required arguments such as `q` for quantile metrics, ...).
Parameters
----------
series
- The (or a sequence of) target time series used to successively train and evaluate the historical forecasts.
+ A (sequence of) target time series used to successively train (if `retrain` is not ``False``) and compute
+ the historical forecasts.
past_covariates
- Optionally, one (or a sequence of) past-observed covariate series. This applies only if the model
- supports past covariates.
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ This applies only if the model supports past covariates.
future_covariates
- Optionally, one (or a sequence of) future-known covariate series. This applies only if the model
- supports future covariates.
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ This applies only if the model supports future covariates.
historical_forecasts
Optionally, the (or a sequence of / a sequence of sequences of) historical forecasts time series to be
evaluated. Corresponds to the output of :meth:`historical_forecasts()
`. The same `series` and
- `last_points_only` values must be passed that were used to generate the historical forecasts.
- If provided, will skip historical forecasting and ignore all parameters except `series`,
- `last_points_only`, `metric`, and `reduction`.
+ `last_points_only` values must be passed that were used to generate the historical forecasts. If provided,
+ will skip historical forecasting and ignore all parameters except `series`, `last_points_only`, `metric`,
+ and `reduction`.
+ forecast_horizon
+ The forecast horizon for the predictions.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Use values `>1` only for probabilistic
+ Number of times a prediction is sampled from a probabilistic model. Use values ``>1`` only for probabilistic
models.
train_length
- Number of time steps in our training set (size of backtesting window to train on). Only effective when
- `retrain` is not ``False``. Default is set to `train_length=None` where it takes all available time steps
- up until prediction time, otherwise the moving window strategy is used. If larger than the number of time
- steps available, all steps up until prediction time are used, as in default case. Needs to be at least
- `min_train_series_length`.
+ Optionally, use a fixed length / number of time steps for every constructed training set (rolling window
+ mode). Only effective when `retrain` is not ``False``. The default is ``None``, where it uses all time
+ steps up until the prediction time (expanding window mode). If larger than the number of available time
+ steps, uses the expanding mode. Needs to be at least `min_train_series_length`.
start
Optionally, the first point in time at which a prediction is computed. This parameter supports:
``float``, ``int``, ``pandas.Timestamp``, and ``None``.
@@ -1327,7 +1354,7 @@ def backtest(
- the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
predictable point is earlier than the first trainable point.
- the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
- or `retrain` is a Callable and the first trainable point is earlier than the first predictable point.
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
- the first trainable point (given `train_length`) otherwise
Note: If `start` is not within the trainable / forecastable points, uses the closest valid start point that
@@ -1337,41 +1364,40 @@ def backtest(
Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
(default behavior with ``None``) and start at the first trainable/predictable point.
start_format
- Defines the `start` format. Only effective when `start` is an integer and `series` is indexed with a
- `pd.RangeIndex`.
- If set to 'position', `start` corresponds to the index position of the first predicted point and can range
- from `(-len(series), len(series) - 1)`.
- If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
- an error if the value is not in `series`' index. Default: ``'value'``
- forecast_horizon
- The forecast horizon for the point predictions.
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
stride
The number of time steps between two consecutive predictions.
retrain
Whether and/or on which condition to retrain the model before predicting.
- This parameter supports 3 different datatypes: ``bool``, (positive) ``int``, and
- ``Callable`` (returning a ``bool``).
- In the case of ``bool``: retrain the model at each step (`True`), or never retrains the model (`False`).
+ This parameter supports 3 different types: ``bool``, (positive) ``int``, and ``Callable`` (returning a
+ ``bool``).
+ In the case of ``bool``: retrain the model at each step (`True`), or never retrain the model (`False`).
In the case of ``int``: the model is retrained every `retrain` iterations.
In the case of ``Callable``: the model is retrained whenever callable returns `True`.
The callable must have the following positional arguments:
- - `counter` (int): current `retrain` iteration
- - `pred_time` (pd.Timestamp or int): timestamp of forecast time (end of the training series)
- - `train_series` (TimeSeries): train series up to `pred_time`
- - `past_covariates` (TimeSeries): past_covariates series up to `pred_time`
- - `future_covariates` (TimeSeries): future_covariates series up
- to `min(pred_time + series.freq * forecast_horizon, series.end_time())`
+ - `counter` (int): current `retrain` iteration
+ - `pred_time` (pd.Timestamp or int): timestamp of forecast time (end of the training series)
+ - `train_series` (TimeSeries): train series up to `pred_time`
+ - `past_covariates` (TimeSeries): past_covariates series up to `pred_time`
+ - `future_covariates` (TimeSeries): future_covariates series up to `min(pred_time + series.freq *
+ forecast_horizon, series.end_time())`
Note: if any optional `*_covariates` are not passed to `historical_forecast`, ``None`` will be passed
to the corresponding retrain function argument.
- Note: some models do require being retrained every time and do not support anything other
- than `retrain=True`.
+ Note: some models require being retrained every time and do not support anything other than
+ `retrain=True`.
Note: also controls the retraining of the `data_transformers`.
overlap_end
Whether the returned forecasts can go beyond the series' end or not.
last_points_only
- Whether to use the whole historical forecasts or only the last point of each forecast to compute the error.
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
+ Otherwise, returns a list of historical ``TimeSeries`` forecasts.
metric
A metric function or a list of metric functions. Each metric must either be a Darts metric (see `here
`_), or a custom metric that has an
@@ -1384,15 +1410,16 @@ def backtest(
If explicitly set to `None`, the method will return a list of the individual error scores instead.
Set to ``np.mean`` by default.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
- Whether to show warnings related to parameters `start`, and `train_length`.
+ Whether to show warnings related to historical forecasts optimization, or parameters `start` and
+ `train_length`.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
- supported for probabilistic models with `likelihood="quantile"`, `num_samples = 1` and
- `n<=output_chunk_length`. Default: ``False``.
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
+ supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
+ Default: ``False``.
enable_optimization
- Whether to use the optimized version of historical_forecasts when supported and available.
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
Default: ``True``.
data_transformers
Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
@@ -1411,9 +1438,9 @@ def backtest(
each metric separately and only if they are present in the corresponding metric signature. Parameter
`'insample'` for scaled metrics (e.g. mase`, `rmsse`, ...) is ignored, as it is handled internally.
fit_kwargs
- Additional arguments passed to the model `fit()` method.
+ Optionally, some additional arguments passed to the model `fit()` method.
predict_kwargs
- Additional arguments passed to the model `predict()` method.
+ Optionally, some additional arguments passed to the model `predict()` method.
sample_weight
Optionally, some sample weights to apply to the target `series` labels for training. Only effective when
`retrain` is not ``False``. They are applied per observation, per label (each step in
@@ -1494,58 +1521,13 @@ def backtest(
# remember input series type
series_seq_type = get_series_seq_type(series)
- series = series2seq(series)
-
- # check that `historical_forecasts` have correct type
- expected_seq_type = None
- forecast_seq_type = get_series_seq_type(historical_forecasts)
- if last_points_only and not series_seq_type == forecast_seq_type:
- # lpo=True -> fc sequence type must be the same
- expected_seq_type = series_seq_type
- elif not last_points_only and forecast_seq_type != series_seq_type + 1:
- # lpo=False -> fc sequence type must be one order higher
- expected_seq_type = series_seq_type + 1
-
- if expected_seq_type is not None:
- raise_log(
- ValueError(
- f"Expected `historical_forecasts` of type {expected_seq_type} "
- f"with `last_points_only={last_points_only}` and `series` of type "
- f"{series_seq_type}. However, received `historical_forecasts` of type "
- f"{forecast_seq_type}. Make sure to pass the same `last_points_only` "
- f"value that was used to generate the historical forecasts."
- ),
- logger=logger,
- )
-
- # we must wrap each fc in a list if `last_points_only=True`
- nested = last_points_only and forecast_seq_type == SeriesType.SEQ
- historical_forecasts = series2seq(
- historical_forecasts, seq_type_out=SeriesType.SEQ_SEQ, nested=nested
+ # validate historical forecasts and convert to multiple series with multiple forecasts case
+ series, historical_forecasts = _process_historical_forecast_for_backtest(
+ series=series,
+ historical_forecasts=historical_forecasts,
+ last_points_only=last_points_only,
)
- # check that the number of series-specific forecasts corresponds to the
- # number of series in `series`
- if len(series) != len(historical_forecasts):
- error_msg = (
- f"Mismatch between the number of series-specific `historical_forecasts` "
- f"(n={len(historical_forecasts)}) and the number of `TimeSeries` in `series` "
- f"(n={len(series)}). For `last_points_only={last_points_only}`, expected "
- )
- expected_seq_type = (
- series_seq_type if last_points_only else series_seq_type + 1
- )
- if expected_seq_type == SeriesType.SINGLE:
- error_msg += (
- f"a single `historical_forecasts` of type {expected_seq_type}."
- )
- else:
- error_msg += f"`historical_forecasts` of type {expected_seq_type} with length n={len(series)}."
- raise_log(
- ValueError(error_msg),
- logger=logger,
- )
-
# we have multiple forecasts per series: rearrange forecasts to call each metric only once;
# flatten historical forecasts, get matching target series index, remember cumulative target lengths
# for later reshaping back to original
@@ -1754,7 +1736,7 @@ def gridsearch(
A reduction function (mapping array to float) describing how to aggregate the errors obtained
on the different validation series when backtesting. By default it'll compute the mean of errors.
verbose
- Whether to print progress.
+ Whether to print the progress.
n_jobs
The number of jobs to run in parallel. Parallel jobs are created only when there are two or more parameters
combinations to evaluate. Each job will instantiate, train, and evaluate a different instance of the model.
@@ -1861,7 +1843,10 @@ def gridsearch(
# iterate through all combinations of the provided parameters and choose the best one
iterator = _build_tqdm_iterator(
- zip(params_cross_product), verbose, total=len(params_cross_product)
+ zip(params_cross_product),
+ verbose,
+ total=len(params_cross_product),
+ desc="gridsearch",
)
def _evaluate_combination(param_combination) -> float:
@@ -1994,13 +1979,14 @@ def residuals(
historical_forecasts: Optional[
Union[TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]]
] = None,
+ forecast_horizon: int = 1,
num_samples: int = 1,
train_length: Optional[int] = None,
start: Optional[Union[pd.Timestamp, float, int]] = None,
start_format: Literal["position", "value"] = "value",
- forecast_horizon: int = 1,
stride: int = 1,
retrain: Union[bool, int, Callable[..., bool]] = True,
+ overlap_end: bool = False,
last_points_only: bool = True,
metric: METRIC_TYPE = metrics.err,
verbose: bool = False,
@@ -2013,10 +1999,10 @@ def residuals(
metric_kwargs: Optional[dict[str, Any]] = None,
fit_kwargs: Optional[dict[str, Any]] = None,
predict_kwargs: Optional[dict[str, Any]] = None,
- values_only: bool = False,
sample_weight: Optional[Union[TimeSeries, Sequence[TimeSeries], str]] = None,
+ values_only: bool = False,
) -> Union[TimeSeries, list[TimeSeries], list[list[TimeSeries]]]:
- """Compute the residuals produced by this model on a (or sequence of) `TimeSeries`.
+ """Compute the residuals that the model produced for historical forecasts on (potentially multiple) `series`.
This function computes the difference (or one of Darts' "per time step" metrics) between the actual
observations from `series` and the fitted values obtained by training the model on `series` (or using a
@@ -2025,7 +2011,7 @@ def residuals(
In sequence this method performs:
- - compute historical forecasts for each series or use pre-computed `historical_forecasts` (see
+ - use pre-computed `historical_forecasts` or compute historical forecasts for each series (see
:meth:`~darts.models.forecasting.forecasting_model.ForecastingModel.historical_forecasts` for more details).
How the historical forecasts are generated can be configured with parameters `num_samples`, `train_length`,
`start`, `start_format`, `forecast_horizon`, `stride`, `retrain`, `last_points_only`, `fit_kwargs`, and
@@ -2033,7 +2019,7 @@ def residuals(
- compute a backtest using a "per time step" `metric` between the historical forecasts and `series` per
component/column and time step (see
:meth:`~darts.models.forecasting.forecasting_model.ForecastingModel.backtest` for more details). By default,
- uses the residuals :func:`~darts.metrics.metrics.err` as a `metric`.
+ uses the residuals :func:`~darts.metrics.metrics.err` (error) as a `metric`.
- create and return `TimeSeries` (or simply a np.ndarray with `values_only=True`) with the time index from
historical forecasts, and values from the metrics per component and time step.
@@ -2043,13 +2029,14 @@ def residuals(
Parameters
----------
series
- The univariate TimeSeries instance which the residuals will be computed for.
+ A (sequence of) target time series used to successively train (if `retrain` is not ``False``) and compute
+ the historical forecasts.
past_covariates
- One or several past-observed covariate time series.
+ Optionally, a (sequence of) past-observed covariate time series for every input time series in `series`.
+ This applies only if the model supports past covariates.
future_covariates
- One or several future-known covariate time series.
- forecast_horizon
- The forecasting horizon used to predict each fitted value.
+ Optionally, a (sequence of) future-known covariate time series for every input time series in `series`.
+ This applies only if the model supports future covariates.
historical_forecasts
Optionally, the (or a sequence of / a sequence of sequences of) historical forecasts time series to be
evaluated. Corresponds to the output of :meth:`historical_forecasts()
@@ -2057,15 +2044,16 @@ def residuals(
`last_points_only` values must be passed that were used to generate the historical forecasts. If provided,
will skip historical forecasting and ignore all parameters except `series`, `last_points_only`, `metric`,
and `reduction`.
+ forecast_horizon
+ The forecast horizon for the predictions.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Use values `>1` only for probabilistic
+ Number of times a prediction is sampled from a probabilistic model. Use values ``>1`` only for probabilistic
models.
train_length
- Number of time steps in our training set (size of backtesting window to train on). Only effective when
- `retrain` is not ``False``. Default is set to `train_length=None` where it takes all available time steps
- up until prediction time, otherwise the moving window strategy is used. If larger than the number of time
- steps available, all steps up until prediction time are used, as in default case. Needs to be at least
- `min_train_series_length`.
+ Optionally, use a fixed length / number of time steps for every constructed training set (rolling window
+ mode). Only effective when `retrain` is not ``False``. The default is ``None``, where it uses all time
+ steps up until the prediction time (expanding window mode). If larger than the number of available time
+ steps, uses the expanding mode. Needs to be at least `min_train_series_length`.
start
Optionally, the first point in time at which a prediction is computed. This parameter supports:
``float``, ``int``, ``pandas.Timestamp``, and ``None``.
@@ -2079,7 +2067,7 @@ def residuals(
- the first predictable point if `retrain` is ``False``, or `retrain` is a Callable and the first
predictable point is earlier than the first trainable point.
- the first trainable point if `retrain` is ``True`` or ``int`` (given `train_length`),
- or `retrain` is a Callable and the first trainable point is earlier than the first predictable point.
+ or `retrain` is a ``Callable`` and the first trainable point is earlier than the first predictable point.
- the first trainable point (given `train_length`) otherwise
Note: If `start` is not within the trainable / forecastable points, uses the closest valid start point that
@@ -2089,39 +2077,40 @@ def residuals(
Note: If `start` is outside the possible historical forecasting times, will ignore the parameter
(default behavior with ``None``) and start at the first trainable/predictable point.
start_format
- Defines the `start` format. Only effective when `start` is an integer and `series` is indexed with a
- `pd.RangeIndex`.
- If set to 'position', `start` corresponds to the index position of the first predicted point and can range
- from `(-len(series), len(series) - 1)`.
- If set to 'value', `start` corresponds to the index value/label of the first predicted point. Will raise
- an error if the value is not in `series`' index. Default: ``'value'``
- forecast_horizon
- The forecast horizon for the point predictions.
+ Defines the `start` format.
+ If set to ``'position'``, `start` corresponds to the index position of the first predicted point and can
+ range from `(-len(series), len(series) - 1)`.
+ If set to ``'value'``, `start` corresponds to the index value/label of the first predicted point. Will raise
+ an error if the value is not in `series`' index. Default: ``'value'``.
stride
The number of time steps between two consecutive predictions.
retrain
Whether and/or on which condition to retrain the model before predicting.
- This parameter supports 3 different datatypes: ``bool``, (positive) ``int``, and
- ``Callable`` (returning a ``bool``).
- In the case of ``bool``: retrain the model at each step (`True`), or never retrains the model (`False`).
+ This parameter supports 3 different types: ``bool``, (positive) ``int``, and ``Callable`` (returning a
+ ``bool``).
+ In the case of ``bool``: retrain the model at each step (`True`), or never retrain the model (`False`).
In the case of ``int``: the model is retrained every `retrain` iterations.
In the case of ``Callable``: the model is retrained whenever callable returns `True`.
The callable must have the following positional arguments:
- - `counter` (int): current `retrain` iteration
- - `pred_time` (pd.Timestamp or int): timestamp of forecast time (end of the training series)
- - `train_series` (TimeSeries): train series up to `pred_time`
- - `past_covariates` (TimeSeries): past_covariates series up to `pred_time`
- - `future_covariates` (TimeSeries): future_covariates series up
- to `min(pred_time + series.freq * forecast_horizon, series.end_time())`
+ - `counter` (int): current `retrain` iteration
+ - `pred_time` (pd.Timestamp or int): timestamp of forecast time (end of the training series)
+ - `train_series` (TimeSeries): train series up to `pred_time`
+ - `past_covariates` (TimeSeries): past_covariates series up to `pred_time`
+ - `future_covariates` (TimeSeries): future_covariates series up to `min(pred_time + series.freq *
+ forecast_horizon, series.end_time())`
Note: if any optional `*_covariates` are not passed to `historical_forecast`, ``None`` will be passed
to the corresponding retrain function argument.
- Note: some models do require being retrained every time and do not support anything other
- than `retrain=True`.
+ Note: some models require being retrained every time and do not support anything other than
+ `retrain=True`.
Note: also controls the retraining of the `data_transformers`.
+ overlap_end
+ Whether the returned forecasts can go beyond the series' end or not.
last_points_only
- Whether to use the whole historical forecasts or only the last point of each forecast to compute the error.
+ Whether to return only the last point of each historical forecast. If set to ``True``, the method returns a
+ single ``TimeSeries`` (for each time series in `series`) containing the successive point forecasts.
+ Otherwise, returns a list of historical ``TimeSeries`` forecasts.
metric
Either one of Darts' "per time step" metrics (see `here
`_), or a custom metric that has an
@@ -2129,15 +2118,16 @@ def residuals(
:func:`~darts.metrics.metrics.multi_ts_support` and :func:`~darts.metrics.metrics.multi_ts_support`,
and returns one value per time step.
verbose
- Whether to print progress.
+ Whether to print the progress.
show_warnings
- Whether to show warnings related to parameters `start`, and `train_length`.
+ Whether to show warnings related to historical forecasts optimization, or parameters `start` and
+ `train_length`.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
- supported for probabilistic models with `likelihood="quantile"`, `num_samples = 1` and
- `n<=output_chunk_length`. Default: ``False``.
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
+ supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
+ Default: ``False``.
enable_optimization
- Whether to use the optimized version of historical_forecasts when supported and available.
+ Whether to use the optimized version of `historical_forecasts` when supported and available.
Default: ``True``.
data_transformers
Optionally, a dictionary of `BaseDataTransformer` or `Pipeline` to apply to the corresponding series
@@ -2156,11 +2146,9 @@ def residuals(
reduction arguments `"series_reduction", "component_reduction", "time_reduction"`, and parameter
`'insample'` for scaled metrics (e.g. mase`, `rmsse`, ...), as they are handled internally.
fit_kwargs
- Additional arguments passed to the model `fit()` method.
+ Optionally, some additional arguments passed to the model `fit()` method.
predict_kwargs
- Additional arguments passed to the model `predict()` method.
- values_only
- Whether to return the residuals as `np.ndarray`. If `False`, returns residuals as `TimeSeries`.
+ Optionally, some additional arguments passed to the model `predict()` method.
sample_weight
Optionally, some sample weights to apply to the target `series` labels for training. Only effective when
`retrain` is not ``False``. They are applied per observation, per label (each step in
@@ -2171,6 +2159,8 @@ def residuals(
If a string, then the weights are generated using built-in weighting functions. The available options are
`"linear"` or `"exponential"` decay - the further in the past, the lower the weight. The weights are
computed per time `series`.
+ values_only
+ Whether to return the residuals as `np.ndarray`. If `False`, returns residuals as `TimeSeries`.
Returns
-------
@@ -2210,35 +2200,35 @@ def residuals(
data_transformers=data_transformers,
fit_kwargs=fit_kwargs,
predict_kwargs=predict_kwargs,
- overlap_end=False,
+ overlap_end=overlap_end,
sample_weight=sample_weight,
)
- residuals = self.backtest(
+ # remember input series type
+ series_seq_type = get_series_seq_type(series)
+ # validate historical forecasts and convert to multiple series with multiple forecasts case
+ series, historical_forecasts = _process_historical_forecast_for_backtest(
series=series,
historical_forecasts=historical_forecasts,
last_points_only=last_points_only,
+ )
+
+ # optionally, add nans to end of series to get residuals of same shape for each forecast
+ if overlap_end:
+ series = _extend_series_for_overlap_end(
+ series=series, historical_forecasts=historical_forecasts
+ )
+
+ residuals = self.backtest(
+ series=series,
+ historical_forecasts=historical_forecasts,
+ last_points_only=False,
metric=metric,
reduction=None,
data_transformers=data_transformers,
metric_kwargs=metric_kwargs,
)
- # remember input series type
- series_seq_type = get_series_seq_type(series)
-
- # convert forecasts and residuals to list of lists of series/arrays
- forecast_seq_type = get_series_seq_type(historical_forecasts)
- historical_forecasts = series2seq(
- historical_forecasts,
- seq_type_out=SeriesType.SEQ_SEQ,
- nested=last_points_only and forecast_seq_type == SeriesType.SEQ,
- )
- if series_seq_type == SeriesType.SINGLE:
- residuals = [residuals]
- if last_points_only:
- residuals = [[res] for res in residuals]
-
# sanity check residual output
q, q_interval = metric_kwargs.get("q"), metric_kwargs.get("q_interval")
try:
@@ -2801,6 +2791,7 @@ def _optimized_historical_forecasts(
show_warnings: bool = True,
predict_likelihood_parameters: bool = False,
data_transformers: Optional[dict[str, BaseDataTransformer]] = None,
+ **kwargs,
) -> Union[TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]]:
logger.warning(
"`optimized historical forecasts is not available for this model, use `historical_forecasts` instead."
@@ -3005,12 +2996,11 @@ def predict(
One future-known covariate time series for every input time series in `series`. They must match the
past covariates that have been used with the :func:`fit()` function for training in terms of dimension.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
- Optionally, whether to print progress.
+ Whether to print the progress.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
Default: ``False``
show_warnings
@@ -3217,8 +3207,7 @@ def predict(
the covariate time series that has been used with the :func:`fit()` method for training, and it must
contain at least the next `n` time steps/indices after the end of the training target series.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
Optionally, set the prediction verbosity. Not effective for all models.
show_warnings
@@ -3392,8 +3381,7 @@ def predict(
training target series. If `series` is set, it must contain at least the time steps/indices corresponding
to the new target series (historic future covariates), plus the next `n` time steps/indices after the end.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
verbose
Optionally, set the prediction verbosity. Not effective for all models.
show_warnings
diff --git a/darts/models/forecasting/regression_model.py b/darts/models/forecasting/regression_model.py
index 5302dc0ab1..b5c76a0f0e 100644
--- a/darts/models/forecasting/regression_model.py
+++ b/darts/models/forecasting/regression_model.py
@@ -988,9 +988,9 @@ def predict(
Number of times a prediction is sampled from a probabilistic model. Should be set to 1
for deterministic models.
verbose
- Optionally, whether to print progress.
+ Whether to print the progress.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
Default: ``False``
**kwargs : dict, optional
diff --git a/darts/models/forecasting/torch_forecasting_model.py b/darts/models/forecasting/torch_forecasting_model.py
index f73052dc5c..89ca19401f 100644
--- a/darts/models/forecasting/torch_forecasting_model.py
+++ b/darts/models/forecasting/torch_forecasting_model.py
@@ -14,9 +14,6 @@
as well as past and future values of some future covariates.
* SplitCovariatesTorchModel(TorchForecastingModel) for torch models consuming past-observed as well as future
values of some future covariates.
-
- * TorchParametricProbabilisticForecastingModel(TorchForecastingModel) is the super-class of all probabilistic torch
- forecasting models.
"""
import copy
@@ -706,7 +703,7 @@ def fit(
Optionally, a custom PyTorch-Lightning Trainer object to perform training. Using a custom ``trainer`` will
override Darts' default trainer.
verbose
- Optionally, whether to print the progress. Ignored if there is a `ProgressBar` callback in
+ Whether to print the progress. Ignored if there is a `ProgressBar` callback in
`pl_trainer_kwargs`.
epochs
If specified, will train the model for ``epochs`` (additional) epochs, irrespective of what ``n_epochs``
@@ -932,7 +929,7 @@ def fit_from_dataset(
Optionally, a custom PyTorch-Lightning Trainer object to perform prediction. Using a custom `trainer` will
override Darts' default trainer.
verbose
- Optionally, whether to print the progress. Ignored if there is a `ProgressBar` callback in
+ Whether to print the progress. Ignored if there is a `ProgressBar` callback in
`pl_trainer_kwargs`.
epochs
If specified, will train the model for ``epochs`` (additional) epochs, irrespective of what ``n_epochs``
@@ -1237,7 +1234,7 @@ def lr_find(
Optionally, a custom PyTorch-Lightning Trainer object to perform training. Using a custom ``trainer`` will
override Darts' default trainer.
verbose
- Optionally, whether to print the progress. Ignored if there is a `ProgressBar` callback in
+ Whether to print the progress. Ignored if there is a `ProgressBar` callback in
`pl_trainer_kwargs`.
epochs
If specified, will train the model for ``epochs`` (additional) epochs, irrespective of what ``n_epochs``
@@ -1366,7 +1363,7 @@ def predict(
batch_size
Size of batches during prediction. Defaults to the models' training ``batch_size`` value.
verbose
- Optionally, whether to print the progress. Ignored if there is a `ProgressBar` callback in
+ Whether to print the progress. Ignored if there is a `ProgressBar` callback in
`pl_trainer_kwargs`.
n_jobs
The number of jobs to run in parallel. ``-1`` means using all processors. Defaults to ``1``.
@@ -1376,8 +1373,7 @@ def predict(
(and optionally future covariates) back into the model. If this parameter is not provided,
it will be set ``output_chunk_length`` by default.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
dataloader_kwargs
Optionally, a dictionary of keyword arguments used to create the PyTorch `DataLoader` instance for the
inference/prediction dataset. For more information on `DataLoader`, check out `this link
@@ -1388,7 +1384,7 @@ def predict(
Optionally, enable monte carlo dropout for predictions using neural network based models.
This allows bayesian approximation by specifying an implicit prior over learned models.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
Default: ``False``.
show_warnings
@@ -1514,7 +1510,7 @@ def predict_from_dataset(
batch_size
Size of batches during prediction. Defaults to the models ``batch_size`` value.
verbose
- Optionally, whether to print the progress. Ignored if there is a `ProgressBar` callback in
+ Whether to print the progress. Ignored if there is a `ProgressBar` callback in
`pl_trainer_kwargs`.
n_jobs
The number of jobs to run in parallel. ``-1`` means using all processors. Defaults to ``1``.
@@ -1524,8 +1520,7 @@ def predict_from_dataset(
(and optionally future covariates) back into the model. If this parameter is not provided,
it will be set ``output_chunk_length`` by default.
num_samples
- Number of times a prediction is sampled from a probabilistic model. Should be left set to 1
- for deterministic models.
+ Number of times a prediction is sampled from a probabilistic model. Must be `1` for deterministic models.
dataloader_kwargs
Optionally, a dictionary of keyword arguments used to create the PyTorch `DataLoader` instance for the
inference/prediction dataset. For more information on `DataLoader`, check out `this link
@@ -1536,7 +1531,7 @@ def predict_from_dataset(
Optionally, enable monte carlo dropout for predictions using neural network based models.
This allows bayesian approximation by specifying an implicit prior over learned models.
predict_likelihood_parameters
- If set to `True`, the model predict the parameters of its Likelihood parameters instead of the target. Only
+ If set to `True`, the model predicts the parameters of its `likelihood` instead of the target. Only
supported for probabilistic models with a likelihood, `num_samples = 1` and `n<=output_chunk_length`.
Default: ``False``
diff --git a/darts/tests/conftest.py b/darts/tests/conftest.py
index b0b97a0131..90bf29e20b 100644
--- a/darts/tests/conftest.py
+++ b/darts/tests/conftest.py
@@ -1,4 +1,5 @@
import logging
+import os
import shutil
import tempfile
@@ -40,15 +41,31 @@ def tear_down_tests():
@pytest.fixture(scope="module")
def tmpdir_module():
- """Sets up a temporary directory that will be deleted after the test module (script) finished."""
+ """Sets up and moves into a temporary directory that will be deleted after the test module (script) finished."""
temp_work_dir = tempfile.mkdtemp(prefix="darts")
+ # remember origin
+ cwd = os.getcwd()
+ # move to temp dir
+ os.chdir(temp_work_dir)
+ # go into test with temp dir as input
yield temp_work_dir
+ # move back to origin
shutil.rmtree(temp_work_dir)
+ # remove temp dir
+ os.chdir(cwd)
@pytest.fixture(scope="function")
def tmpdir_fn():
- """Sets up a temporary directory that will be deleted after the test function finished."""
+ """Sets up and moves into a temporary directory that will be deleted after the test function finished."""
temp_work_dir = tempfile.mkdtemp(prefix="darts")
+ # remember origin
+ cwd = os.getcwd()
+ # move to temp dir
+ os.chdir(temp_work_dir)
+ # go into test with temp dir as input
yield temp_work_dir
+ # move back to origin
+ os.chdir(cwd)
+ # remove temp dir
shutil.rmtree(temp_work_dir)
diff --git a/darts/tests/metrics/test_metrics.py b/darts/tests/metrics/test_metrics.py
index f3e2b88229..ba58b6fe3f 100644
--- a/darts/tests/metrics/test_metrics.py
+++ b/darts/tests/metrics/test_metrics.py
@@ -79,6 +79,53 @@ def metric_iw(y_true, y_pred, q_interval=None, **kwargs):
return res.reshape(len(y_pred), -1)
+def metric_iws(y_true, y_pred, q_interval=None, **kwargs):
+ # this tests assumes `y_pred` are stochastic values
+ if isinstance(q_interval, tuple):
+ q_interval = [q_interval]
+ q_interval = np.array(q_interval)
+ q_lo = q_interval[:, 0]
+ q_hi = q_interval[:, 1]
+ y_pred_lo = np.quantile(y_pred, q_lo, axis=2).transpose(1, 2, 0)
+ y_pred_hi = np.quantile(y_pred, q_hi, axis=2).transpose(1, 2, 0)
+ interval_width = y_pred_hi - y_pred_lo
+ res = np.where(
+ y_true < y_pred_lo,
+ interval_width + 1 / q_lo * (y_pred_lo - y_true),
+ interval_width,
+ )
+ res = np.where(
+ y_true > y_pred_hi, interval_width + 1 / (1 - q_hi) * (y_true - y_pred_hi), res
+ )
+ return res.reshape(len(y_pred), -1)
+
+
+def metric_ic(y_true, y_pred, q_interval=None, **kwargs):
+ # this tests assumes `y_pred` are stochastic values
+ if isinstance(q_interval, tuple):
+ q_interval = [q_interval]
+ q_interval = np.array(q_interval)
+ q_lo = q_interval[:, 0]
+ q_hi = q_interval[:, 1]
+ y_pred_lo = np.quantile(y_pred, q_lo, axis=2).transpose(1, 2, 0)
+ y_pred_hi = np.quantile(y_pred, q_hi, axis=2).transpose(1, 2, 0)
+ res = np.where((y_pred_lo <= y_true) & (y_true <= y_pred_hi), 1, 0)
+ return res.reshape(len(y_pred), -1)
+
+
+def metric_incs_qr(y_true, y_pred, q_interval=None, **kwargs):
+ # this tests assumes `y_pred` are stochastic values
+ if isinstance(q_interval, tuple):
+ q_interval = [q_interval]
+ q_interval = np.array(q_interval)
+ q_lo = q_interval[:, 0]
+ q_hi = q_interval[:, 1]
+ y_pred_lo = np.quantile(y_pred, q_lo, axis=2).transpose(1, 2, 0)
+ y_pred_hi = np.quantile(y_pred, q_hi, axis=2).transpose(1, 2, 0)
+ res = np.maximum(y_pred_lo - y_true, y_true - y_pred_hi)
+ return res.reshape(len(y_pred), -1)
+
+
class TestMetrics:
np.random.seed(42)
pd_train = pd.Series(
@@ -1853,6 +1900,9 @@ def test_wrong_error_scale(self):
[
# only time dependent quantile interval metrics
(metrics.iw, metric_iw),
+ (metrics.iws, metric_iws),
+ (metrics.ic, metric_ic),
+ (metrics.incs_qr, metric_incs_qr),
],
)
def test_metric_quantile_interval_accuracy(self, config):
@@ -1899,6 +1949,12 @@ def check_ref(**test_kwargs):
# time dependent but with time reduction
metrics.iw,
metrics.miw,
+ metrics.iws,
+ metrics.miws,
+ metrics.ic,
+ metrics.mic,
+ metrics.incs_qr,
+ metrics.mincs_qr,
],
[True, False], # univariate series
[True, False], # single series
diff --git a/darts/tests/models/forecasting/test_conformal_model.py b/darts/tests/models/forecasting/test_conformal_model.py
new file mode 100644
index 0000000000..2797d35231
--- /dev/null
+++ b/darts/tests/models/forecasting/test_conformal_model.py
@@ -0,0 +1,1660 @@
+import copy
+import itertools
+import math
+import os
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from darts import TimeSeries, concatenate
+from darts.datasets import AirPassengersDataset
+from darts.metrics import ae, err, ic, incs_qr, mic
+from darts.models import (
+ ConformalNaiveModel,
+ ConformalQRModel,
+ LinearRegressionModel,
+ NaiveSeasonal,
+ NLinearModel,
+)
+from darts.models.forecasting.conformal_models import _get_calibration_hfc_start
+from darts.models.forecasting.forecasting_model import ForecastingModel
+from darts.tests.conftest import TORCH_AVAILABLE, tfm_kwargs
+from darts.utils import n_steps_between
+from darts.utils import timeseries_generation as tg
+from darts.utils.timeseries_generation import linear_timeseries
+from darts.utils.utils import (
+ likelihood_component_names,
+ quantile_interval_names,
+ quantile_names,
+)
+
+IN_LEN = 3
+OUT_LEN = 3
+regr_kwargs = {"lags": IN_LEN, "output_chunk_length": OUT_LEN}
+tfm_kwargs = copy.deepcopy(tfm_kwargs)
+tfm_kwargs["pl_trainer_kwargs"]["fast_dev_run"] = True
+torch_kwargs = dict(
+ {"input_chunk_length": IN_LEN, "output_chunk_length": OUT_LEN, "random_state": 0},
+ **tfm_kwargs,
+)
+pred_lklp = {"num_samples": 1, "predict_likelihood_parameters": True}
+q = [0.1, 0.5, 0.9]
+
+
+def train_model(
+ *args, model_type="regression", model_params=None, quantiles=None, **kwargs
+):
+ model_params = model_params or {}
+ if model_type == "regression":
+ return LinearRegressionModel(
+ **regr_kwargs,
+ **model_params,
+ random_state=42,
+ ).fit(*args, **kwargs)
+ elif model_type in ["regression_prob", "regression_qr"]:
+ return LinearRegressionModel(
+ likelihood="quantile",
+ quantiles=quantiles,
+ **regr_kwargs,
+ **model_params,
+ random_state=42,
+ ).fit(*args, **kwargs)
+ else:
+ return NLinearModel(**torch_kwargs, **model_params).fit(*args, **kwargs)
+
+
+# pre-trained global model for conformal models
+models_cls_kwargs_errs = [
+ (
+ ConformalNaiveModel,
+ {"quantiles": q},
+ "regression",
+ ),
+]
+
+if TORCH_AVAILABLE:
+ models_cls_kwargs_errs.append((
+ ConformalNaiveModel,
+ {"quantiles": q},
+ "torch",
+ ))
+
+
+class TestConformalModel:
+ """
+ Tests all general model behavior for Naive Conformal Model with symmetric non-conformity score.
+ Additionally, checks correctness of predictions for:
+ - ConformalNaiveModel with symmetric & asymmetric non-conformity scores
+ - ConformalQRModel with symmetric & asymmetric non-conformity scores
+ """
+
+ np.random.seed(42)
+
+ # forecasting horizon used in runnability tests
+ horizon = OUT_LEN + 1
+
+ # some arbitrary static covariates
+ static_covariates = pd.DataFrame([[0.0, 1.0]], columns=["st1", "st2"])
+
+ # real timeseries for functionality tests
+ ts_length = 13 + horizon
+ ts_passengers = (
+ AirPassengersDataset()
+ .load()[:ts_length]
+ .with_static_covariates(static_covariates)
+ )
+ ts_pass_train, ts_pass_val = (
+ ts_passengers[:-horizon],
+ ts_passengers[-horizon:],
+ )
+
+ # an additional noisy series
+ ts_pass_train_1 = ts_pass_train + 0.01 * tg.gaussian_timeseries(
+ length=len(ts_pass_train),
+ freq=ts_pass_train.freq_str,
+ start=ts_pass_train.start_time(),
+ )
+
+ # an additional time series serving as covariates
+ year_series = tg.datetime_attribute_timeseries(ts_passengers, attribute="year")
+ month_series = tg.datetime_attribute_timeseries(ts_passengers, attribute="month")
+ time_covariates = year_series.stack(month_series)
+ time_covariates_train = time_covariates[:-horizon]
+
+ # various ts with different static covariates representations
+ ts_w_static_cov = tg.linear_timeseries(length=ts_length).with_static_covariates(
+ pd.Series([1, 2])
+ )
+ ts_shared_static_cov = ts_w_static_cov.stack(tg.sine_timeseries(length=ts_length))
+ ts_comps_static_cov = ts_shared_static_cov.with_static_covariates(
+ pd.DataFrame([[0, 1], [2, 3]], columns=["st1", "st2"])
+ )
+
+ def test_model_construction_naive(self):
+ local_model = NaiveSeasonal(K=5)
+ global_model = LinearRegressionModel(**regr_kwargs)
+ series = self.ts_pass_train
+
+ model_err_msg = "`model` must be a pre-trained `GlobalForecastingModel`."
+ # un-trained local model
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=local_model, quantiles=q)
+ assert str(exc.value) == model_err_msg
+
+ # pre-trained local model
+ local_model.fit(series)
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=local_model, quantiles=q)
+ assert str(exc.value) == model_err_msg
+
+ # un-trained global model
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=q)
+ assert str(exc.value) == model_err_msg
+
+ # pre-trained local model should work
+ global_model.fit(series)
+ model = ConformalNaiveModel(model=global_model, quantiles=q)
+ assert model.likelihood == "quantile"
+
+ # non-centered quantiles
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=[0.2, 0.5, 0.6])
+ assert str(exc.value) == (
+ "quantiles lower than `q=0.5` need to share same difference to `0.5` as quantiles higher than `q=0.5`"
+ )
+
+ # quantiles missing median
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=[0.1, 0.9])
+ assert str(exc.value) == "median quantile `q=0.5` must be in `quantiles`"
+
+ # too low and high quantiles
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=[-0.1, 0.5, 1.1])
+ assert str(exc.value) == "All provided quantiles must be between 0 and 1."
+
+ # `cal_length` must be `>=1` or `None`
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=q, cal_length=0)
+ assert str(exc.value) == "`cal_length` must be `>=1` or `None`."
+
+ # `cal_stride` must be `>=1`
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=q, cal_stride=0)
+ assert str(exc.value) == "`cal_stride` must be `>=1`."
+
+ # `num_samples` must be `>=1`
+ with pytest.raises(ValueError) as exc:
+ ConformalNaiveModel(model=global_model, quantiles=q, cal_num_samples=0)
+ assert str(exc.value) == "`cal_num_samples` must be `>=1`."
+
+ def test_model_hfc_stride_checks(self):
+ series = self.ts_pass_train
+ model = LinearRegressionModel(**regr_kwargs).fit(series)
+ cp_model = ConformalNaiveModel(model=model, quantiles=q, cal_stride=2)
+
+ expected_error_start = (
+ "The provided `stride` parameter must be a round-multiple of "
+ "`cal_stride=2` and `>=cal_stride`."
+ )
+ # `stride` must be >= `cal_stride`
+ with pytest.raises(ValueError) as exc:
+ cp_model.historical_forecasts(series=series, stride=1)
+ assert str(exc.value).startswith(expected_error_start)
+
+ # `stride` must be a round multiple of `cal_stride`
+ with pytest.raises(ValueError) as exc:
+ cp_model.historical_forecasts(series=series, stride=3)
+ assert str(exc.value).startswith(expected_error_start)
+
+ # valid stride
+ _ = cp_model.historical_forecasts(series=series, stride=4)
+
+ def test_model_construction_cqr(self):
+ model_det = train_model(self.ts_pass_train, model_type="regression")
+ model_prob_q = train_model(
+ self.ts_pass_train, model_type="regression_prob", quantiles=q
+ )
+ model_prob_poisson = train_model(
+ self.ts_pass_train,
+ model_type="regression",
+ model_params={"likelihood": "poisson"},
+ )
+
+ # deterministic global model
+ with pytest.raises(ValueError) as exc:
+ ConformalQRModel(model=model_det, quantiles=q)
+ assert str(exc.value).startswith(
+ "`model` must support probabilistic forecasting."
+ )
+ # probabilistic model works
+ _ = ConformalQRModel(model=model_prob_q, quantiles=q)
+ # works also with different likelihood
+ _ = ConformalQRModel(model=model_prob_poisson, quantiles=q)
+
+ def test_unsupported_properties(self):
+ """Tests only here for coverage, maybe at some point we support these properties."""
+ model = ConformalNaiveModel(train_model(self.ts_pass_train), quantiles=q)
+ unsupported_properties = [
+ "_model_encoder_settings",
+ "extreme_lags",
+ "min_train_series_length",
+ "min_train_samples",
+ ]
+ for prop in unsupported_properties:
+ with pytest.raises(NotImplementedError):
+ getattr(model, prop)
+
+ @pytest.mark.parametrize("config", models_cls_kwargs_errs)
+ def test_save_model_parameters(self, config):
+ # model creation parameters were saved before. check if re-created model has same params as original
+ model_cls, kwargs, model_type = config
+ model = model_cls(
+ model=train_model(
+ self.ts_pass_train, model_type=model_type, quantiles=kwargs["quantiles"]
+ ),
+ **kwargs,
+ )
+ model_fresh = model.untrained_model()
+ assert model._model_params.keys() == model_fresh._model_params.keys()
+ for param, val in model._model_params.items():
+ if isinstance(val, ForecastingModel):
+ # Conformal Models require a forecasting model as input, which has no equality
+ continue
+ assert val == model_fresh._model_params[param]
+
+ @pytest.mark.parametrize(
+ "config", itertools.product(models_cls_kwargs_errs, [{}, pred_lklp])
+ )
+ def test_save_load_model(self, tmpdir_fn, config):
+ # check if save and load methods work and if loaded model creates same forecasts as original model
+ (model_cls, kwargs, model_type), pred_kwargs = config
+ model = model_cls(
+ train_model(
+ self.ts_pass_train, model_type=model_type, quantiles=kwargs["quantiles"]
+ ),
+ **kwargs,
+ )
+
+ # check if save and load methods work and
+ # if loaded conformal model creates same forecasts as original ensemble models
+ expected_suffixes = [
+ ".pkl",
+ ".pkl.NLinearModel.pt",
+ ".pkl.NLinearModel.pt.ckpt",
+ ]
+
+ # test save
+ model.save()
+ model.save(os.path.join(tmpdir_fn, f"{model_cls.__name__}.pkl"))
+
+ model_prediction = model.predict(5, **pred_kwargs)
+
+ assert os.path.exists(tmpdir_fn)
+ files = os.listdir(tmpdir_fn)
+ if model_type == "torch":
+ # 1 from conformal model, 2 from torch, * 2 as `save()` was called twice
+ assert len(files) == 6
+ for f in files:
+ assert f.startswith(model_cls.__name__)
+ suffix_counts = {
+ suffix: sum(1 for p in os.listdir(tmpdir_fn) if p.endswith(suffix))
+ for suffix in expected_suffixes
+ }
+ assert all(count == 2 for count in suffix_counts.values())
+ else:
+ assert len(files) == 2
+ for f in files:
+ assert f.startswith(model_cls.__name__) and f.endswith(".pkl")
+
+ # test load
+ pkl_files = []
+ for filename in os.listdir(tmpdir_fn):
+ if filename.endswith(".pkl"):
+ pkl_files.append(os.path.join(tmpdir_fn, filename))
+ for p in pkl_files:
+ loaded_model = model_cls.load(p)
+ assert model_prediction == loaded_model.predict(5, **pred_kwargs)
+
+ def test_fit(self):
+ model = ConformalNaiveModel(train_model(self.ts_pass_train), quantiles=q)
+ assert model.model._fit_called
+
+ # check kwargs will be passed to `model.model.fit()`
+ assert model.supports_sample_weight
+ model.model._fit_called = False
+ model.fit(self.ts_pass_train, sample_weight="linear")
+ assert model.model._fit_called
+
+ @pytest.mark.parametrize("config", models_cls_kwargs_errs)
+ def test_single_ts(self, config):
+ model_cls, kwargs, model_type = config
+ model = model_cls(
+ train_model(
+ self.ts_pass_train, model_type=model_type, quantiles=kwargs["quantiles"]
+ ),
+ **kwargs,
+ )
+ pred = model.predict(n=self.horizon, **pred_lklp)
+ assert pred.n_components == self.ts_pass_train.n_components * len(
+ kwargs["quantiles"]
+ )
+ assert not np.isnan(pred.all_values()).any().any()
+
+ pred_fc = model.model.predict(n=self.horizon)
+ assert pred_fc.time_index.equals(pred.time_index)
+ # the center forecasts must be equal to the forecasting model forecast
+ fc_columns = likelihood_component_names(
+ self.ts_pass_val.columns, quantile_names([0.5])
+ )
+ np.testing.assert_array_almost_equal(
+ pred[fc_columns].all_values(), pred_fc.all_values()
+ )
+ assert pred.static_covariates is None
+
+ # using a different `n`, gives different results, since we can generate more residuals for the horizon
+ pred1 = model.predict(n=self.horizon - 1, **pred_lklp)
+ assert not pred1 == pred[: len(pred1)]
+
+ # wrong dimension
+ with pytest.raises(ValueError):
+ model.predict(
+ n=self.horizon,
+ series=self.ts_pass_train.stack(self.ts_pass_train),
+ **pred_lklp,
+ )
+
+ @pytest.mark.parametrize("config", models_cls_kwargs_errs)
+ def test_multi_ts(self, config):
+ model_cls, kwargs, model_type = config
+ model = model_cls(
+ train_model(
+ [self.ts_pass_train, self.ts_pass_train_1],
+ model_type=model_type,
+ quantiles=kwargs["quantiles"],
+ ),
+ **kwargs,
+ )
+ with pytest.raises(ValueError):
+ # when model is fit from >1 series, one must provide a series in argument
+ model.predict(n=1)
+
+ pred = model.predict(n=self.horizon, series=self.ts_pass_train, **pred_lklp)
+ assert pred.n_components == self.ts_pass_train.n_components * len(
+ kwargs["quantiles"]
+ )
+ assert not np.isnan(pred.all_values()).any().any()
+
+ # the center forecasts must be equal to the forecasting model forecast
+ fc_columns = likelihood_component_names(
+ self.ts_pass_val.columns, quantile_names([0.5])
+ )
+ pred_fc = model.model.predict(n=self.horizon, series=self.ts_pass_train)
+ assert pred_fc.time_index.equals(pred.time_index)
+ np.testing.assert_array_almost_equal(
+ pred[fc_columns].all_values(), pred_fc.all_values()
+ )
+
+ # check prediction for several time series
+ pred_list = model.predict(
+ n=self.horizon,
+ series=[self.ts_pass_train, self.ts_pass_train_1],
+ **pred_lklp,
+ )
+ pred_fc_list = model.model.predict(
+ n=self.horizon,
+ series=[self.ts_pass_train, self.ts_pass_train_1],
+ )
+ assert len(pred_list) == 2, (
+ f"Model {model_cls} did not return a list of prediction"
+ )
+ for pred, pred_fc in zip(pred_list, pred_fc_list):
+ assert pred.n_components == self.ts_pass_train.n_components * len(
+ kwargs["quantiles"]
+ )
+ assert pred_fc.time_index.equals(pred.time_index)
+ assert not np.isnan(pred.all_values()).any().any()
+ np.testing.assert_array_almost_equal(
+ pred_fc.all_values(),
+ pred[fc_columns].all_values(),
+ )
+
+ # wrong dimension
+ with pytest.raises(ValueError):
+ model.predict(
+ n=self.horizon,
+ series=[
+ self.ts_pass_train,
+ self.ts_pass_train.stack(self.ts_pass_train),
+ ],
+ **pred_lklp,
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [(ConformalNaiveModel, {"quantiles": [0.1, 0.5, 0.9]}, "regression")],
+ [
+ {"lags_past_covariates": IN_LEN},
+ {"lags_future_covariates": (IN_LEN, OUT_LEN)},
+ {},
+ ],
+ ),
+ )
+ def test_covariates(self, config):
+ (model_cls, kwargs, model_type), covs_kwargs = config
+ model_fc = LinearRegressionModel(**regr_kwargs, **covs_kwargs)
+ # Here we rely on the fact that all non-Dual models currently are Past models
+ if model_fc.supports_future_covariates:
+ cov_name = "future_covariates"
+ is_past = False
+ elif model_fc.supports_past_covariates:
+ cov_name = "past_covariates"
+ is_past = True
+ else:
+ cov_name = None
+ is_past = None
+
+ covariates = [self.time_covariates_train, self.time_covariates_train]
+ if cov_name is not None:
+ cov_kwargs = {cov_name: covariates}
+ cov_kwargs_train = {cov_name: self.time_covariates_train}
+ cov_kwargs_notrain = {cov_name: self.time_covariates}
+ else:
+ cov_kwargs = {}
+ cov_kwargs_train = {}
+ cov_kwargs_notrain = {}
+
+ model_fc.fit(series=[self.ts_pass_train, self.ts_pass_train_1], **cov_kwargs)
+
+ model = model_cls(model=model_fc, **kwargs)
+ if cov_name == "future_covariates":
+ assert model.supports_future_covariates
+ assert not model.supports_past_covariates
+ assert model.uses_future_covariates
+ assert not model.uses_past_covariates
+ elif cov_name == "past_covariates":
+ assert not model.supports_future_covariates
+ assert model.supports_past_covariates
+ assert not model.uses_future_covariates
+ assert model.uses_past_covariates
+ else:
+ assert not model.supports_future_covariates
+ assert not model.supports_past_covariates
+ assert not model.uses_future_covariates
+ assert not model.uses_past_covariates
+
+ with pytest.raises(ValueError):
+ # when model is fit from >1 series, one must provide a series in argument
+ model.predict(n=1)
+
+ if cov_name is not None:
+ with pytest.raises(ValueError):
+ # when model is fit using multiple covariates, covariates are required at prediction time
+ model.predict(n=1, series=self.ts_pass_train)
+
+ with pytest.raises(ValueError):
+ # when model is fit using covariates, n cannot be greater than output_chunk_length...
+ # (for short covariates)
+ # past covariates model can predict up until output_chunk_length
+ # with train future covariates we cannot predict at all after end of series
+ model.predict(
+ n=OUT_LEN + 1 if is_past else 1,
+ series=self.ts_pass_train,
+ **cov_kwargs_train,
+ )
+ else:
+ # model does not support covariates
+ with pytest.raises(ValueError):
+ model.predict(
+ n=1,
+ series=self.ts_pass_train,
+ past_covariates=self.time_covariates,
+ )
+ with pytest.raises(ValueError):
+ model.predict(
+ n=1,
+ series=self.ts_pass_train,
+ future_covariates=self.time_covariates,
+ )
+
+ # ... unless future covariates are provided
+ _ = model.predict(
+ n=self.horizon, series=self.ts_pass_train, **cov_kwargs_notrain
+ )
+
+ pred = model.predict(
+ n=self.horizon, series=self.ts_pass_train, **cov_kwargs_notrain, **pred_lklp
+ )
+ pred_fc = model_fc.predict(
+ n=self.horizon,
+ series=self.ts_pass_train,
+ **cov_kwargs_notrain,
+ )
+ fc_columns = likelihood_component_names(
+ self.ts_pass_val.columns, quantile_names([0.5])
+ )
+ np.testing.assert_array_almost_equal(
+ pred[fc_columns].all_values(),
+ pred_fc.all_values(),
+ )
+
+ if cov_name is None:
+ return
+
+ # when model is fit using 1 training and 1 covariate series, time series args are optional
+ model_fc = LinearRegressionModel(**regr_kwargs, **covs_kwargs)
+ model_fc.fit(series=self.ts_pass_train, **cov_kwargs_train)
+ model = model_cls(model_fc, **kwargs)
+
+ if is_past:
+ # can only predict up until ocl
+ with pytest.raises(ValueError):
+ _ = model.predict(n=OUT_LEN + 1, **pred_lklp)
+ # wrong covariates dimension
+ with pytest.raises(ValueError):
+ covs = cov_kwargs_train[cov_name]
+ covs = {cov_name: covs.stack(covs)}
+ _ = model.predict(n=OUT_LEN, **covs, **pred_lklp)
+ # with past covariates from train we can predict up until output_chunk_length
+ pred1 = model.predict(n=OUT_LEN, **pred_lklp)
+ pred2 = model.predict(n=OUT_LEN, series=self.ts_pass_train, **pred_lklp)
+ pred3 = model.predict(n=OUT_LEN, **cov_kwargs_train, **pred_lklp)
+ pred4 = model.predict(
+ n=OUT_LEN, **cov_kwargs_train, series=self.ts_pass_train, **pred_lklp
+ )
+ else:
+ # with future covariates we need additional time steps to predict
+ with pytest.raises(ValueError):
+ _ = model.predict(n=1, **pred_lklp)
+ with pytest.raises(ValueError):
+ _ = model.predict(n=1, series=self.ts_pass_train, **pred_lklp)
+ with pytest.raises(ValueError):
+ _ = model.predict(n=1, **cov_kwargs_train, **pred_lklp)
+ with pytest.raises(ValueError):
+ _ = model.predict(
+ n=1, **cov_kwargs_train, series=self.ts_pass_train, **pred_lklp
+ )
+ # wrong covariates dimension
+ with pytest.raises(ValueError):
+ covs = cov_kwargs_notrain[cov_name]
+ covs = {cov_name: covs.stack(covs)}
+ _ = model.predict(n=OUT_LEN, **covs, **pred_lklp)
+ pred1 = model.predict(n=OUT_LEN, **cov_kwargs_notrain, **pred_lklp)
+ pred2 = model.predict(
+ n=OUT_LEN, series=self.ts_pass_train, **cov_kwargs_notrain, **pred_lklp
+ )
+ pred3 = model.predict(n=OUT_LEN, **cov_kwargs_notrain, **pred_lklp)
+ pred4 = model.predict(
+ n=OUT_LEN, **cov_kwargs_notrain, series=self.ts_pass_train, **pred_lklp
+ )
+
+ assert pred1 == pred2
+ assert pred1 == pred3
+ assert pred1 == pred4
+
+ @pytest.mark.parametrize(
+ "config,ts",
+ itertools.product(
+ models_cls_kwargs_errs,
+ [ts_w_static_cov, ts_shared_static_cov, ts_comps_static_cov],
+ ),
+ )
+ def test_use_static_covariates(self, config, ts):
+ """
+ Check that both static covariates representations are supported (component-specific and shared)
+ for both uni- and multivariate series when fitting the model.
+ Also check that the static covariates are present in the forecasted series
+ """
+ model_cls, kwargs, model_type = config
+ model = model_cls(
+ train_model(ts, model_type=model_type, quantiles=kwargs["quantiles"]),
+ **kwargs,
+ )
+ assert model.considers_static_covariates
+ assert model.supports_static_covariates
+ assert model.uses_static_covariates
+ pred = model.predict(OUT_LEN)
+ assert pred.static_covariates.equals(ts.static_covariates)
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [True, False], # univariate series
+ [True, False], # single series
+ [True, False], # use covariates
+ [True, False], # datetime index
+ [1, 3, 5], # different horizons
+ ),
+ )
+ def test_predict(self, config):
+ (is_univar, is_single, use_covs, is_datetime, horizon) = config
+ series = self.ts_pass_train
+ if not is_univar:
+ series = series.stack(series)
+ if not is_datetime:
+ series = TimeSeries.from_values(series.all_values(), columns=series.columns)
+ if use_covs:
+ pc, fc = series, series
+ fc = fc.append_values(fc.values()[: max(horizon, OUT_LEN)])
+ if horizon > OUT_LEN:
+ pc = pc.append_values(pc.values()[: horizon - OUT_LEN])
+ model_kwargs = {
+ "lags_past_covariates": IN_LEN,
+ "lags_future_covariates": (IN_LEN, OUT_LEN),
+ }
+ else:
+ pc, fc = None, None
+ model_kwargs = {}
+ if not is_single:
+ series = [
+ series,
+ series.with_columns_renamed(
+ col_names=series.columns.tolist(),
+ col_names_new=(series.columns + "_s2").tolist(),
+ ),
+ ]
+ if use_covs:
+ pc = [pc] * 2
+ fc = [fc] * 2
+
+ # testing lags_past_covariates None but past_covariates during prediction
+ model_instance = LinearRegressionModel(
+ lags=IN_LEN, output_chunk_length=OUT_LEN, **model_kwargs
+ )
+ model_instance.fit(series=series, past_covariates=pc, future_covariates=fc)
+ model = ConformalNaiveModel(model_instance, quantiles=q)
+
+ preds = model.predict(
+ n=horizon,
+ series=series,
+ past_covariates=pc,
+ future_covariates=fc,
+ **pred_lklp,
+ )
+
+ if is_single:
+ series = [series]
+ preds = [preds]
+
+ for s_, preds_ in zip(series, preds):
+ cols_expected = likelihood_component_names(s_.columns, quantile_names(q))
+ assert preds_.columns.tolist() == cols_expected
+ assert len(preds_) == horizon
+ assert preds_.start_time() == s_.end_time() + s_.freq
+ assert preds_.freq == s_.freq
+
+ def test_output_chunk_shift(self):
+ model_params = {"output_chunk_shift": 1}
+ model = ConformalNaiveModel(
+ train_model(self.ts_pass_train, model_params=model_params, quantiles=q),
+ quantiles=q,
+ )
+ pred = model.predict(n=1, **pred_lklp)
+ pred_fc = model.model.predict(n=1)
+
+ assert pred_fc.time_index.equals(pred.time_index)
+ # the center forecasts must be equal to the forecasting model forecast
+ fc_columns = likelihood_component_names(
+ self.ts_pass_train.columns, quantile_names([0.5])
+ )
+
+ np.testing.assert_array_almost_equal(
+ pred[fc_columns].all_values(), pred_fc.all_values()
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [1, 3, 5], # horizon
+ [True, False], # univariate series
+ [True, False], # single series
+ [q, [0.2, 0.3, 0.5, 0.7, 0.8]],
+ [
+ (ConformalNaiveModel, "regression"),
+ (ConformalNaiveModel, "regression_prob"),
+ (ConformalQRModel, "regression_qr"),
+ ], # model type
+ [True, False], # symmetric non-conformity score
+ [None, 1], # train length
+ ),
+ )
+ def test_conformal_model_predict_accuracy(self, config):
+ """Verifies that naive conformal model computes the correct intervals for:
+ - different horizons (smaller, equal, larger than ocl)
+ - uni/multivariate series
+ - single/multi series
+ - single/multi quantile intervals
+ - deterministic/probabilistic forecasting model
+ - naive conformal and conformalized quantile regression
+ - symmetric/asymmetric non-conformity scores
+
+ The naive approach computes it as follows:
+
+ - pred_upper = pred + q_interval(absolute error, past)
+ - pred_middle = pred
+ - pred_lower = pred - q_interval(absolute error, past)
+
+ Where q_interval(absolute error) is the `q_hi - q_hi` quantile value of all historic absolute errors
+ between `pred`, and the target series.
+ """
+ (
+ n,
+ is_univar,
+ is_single,
+ quantiles,
+ (model_cls, model_type),
+ symmetric,
+ cal_length,
+ ) = config
+ idx_med = quantiles.index(0.5)
+ q_intervals = [
+ (q_hi, q_lo)
+ for q_hi, q_lo in zip(quantiles[:idx_med], quantiles[idx_med + 1 :][::-1])
+ ]
+ series = self.helper_prepare_series(is_univar, is_single)
+ pred_kwargs = (
+ {"num_samples": 1000}
+ if model_type in ["regression_prob", "regression_qr"]
+ else {}
+ )
+
+ model_fc = train_model(series, model_type=model_type, quantiles=q)
+ model = model_cls(
+ model=model_fc,
+ quantiles=quantiles,
+ symmetric=symmetric,
+ cal_length=cal_length,
+ )
+ pred_fc_list = model.model.predict(n, series=series, **pred_kwargs)
+ pred_cal_list = model.predict(n, series=series, **pred_lklp)
+
+ if issubclass(model_cls, ConformalNaiveModel):
+ metric = ae if symmetric else err
+ metric_kwargs = {}
+ else:
+ metric = incs_qr
+ metric_kwargs = {"q_interval": q_intervals, "symmetric": symmetric}
+ # compute the expected intervals
+ residuals_list = model.model.residuals(
+ series,
+ retrain=False,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ stride=1,
+ values_only=True,
+ metric=metric,
+ metric_kwargs=metric_kwargs,
+ **pred_kwargs,
+ )
+ if is_single:
+ pred_fc_list = [pred_fc_list]
+ pred_cal_list = [pred_cal_list]
+ residuals_list = [residuals_list]
+
+ for pred_fc, pred_cal, residuals in zip(
+ pred_fc_list, pred_cal_list, residuals_list
+ ):
+ residuals = np.concatenate(residuals[:-1], axis=2)
+
+ pred_vals = pred_fc.all_values()
+ pred_vals_expected = self.helper_compute_pred_cal(
+ residuals,
+ pred_vals,
+ n,
+ quantiles,
+ model_type,
+ symmetric,
+ cal_length=cal_length,
+ )
+ self.helper_compare_preds(pred_cal, pred_vals_expected, model_type)
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [1, 3, 5], # horizon
+ [True, False], # univariate series
+ [True, False], # single series,
+ [0, 1], # output chunk shift
+ [None, 1], # train length
+ [False, True], # use covariates
+ [q, [0.2, 0.3, 0.5, 0.7, 0.8]], # quantiles
+ ),
+ )
+ def test_naive_conformal_model_historical_forecasts(self, config):
+ """Checks correctness of naive conformal model historical forecasts for:
+ - different horizons (smaller, equal and larger the OCL)
+ - uni and multivariate series
+ - single and multiple series
+ - with and without output shift
+ - with and without training length
+ - with and without covariates
+ """
+ n, is_univar, is_single, ocs, cal_length, use_covs, quantiles = config
+ if ocs and n > OUT_LEN:
+ # auto-regression not allowed with ocs
+ return
+
+ series = self.helper_prepare_series(is_univar, is_single)
+ model_params = {"output_chunk_shift": ocs}
+
+ # for covariates, we check that shorter & longer covariates in the calibration set give expected results
+ covs_kwargs = {}
+ if use_covs:
+ model_params["lags_past_covariates"] = regr_kwargs["lags"]
+ past_covs = series
+ if n > OUT_LEN:
+ append_vals = [[[1.0]] * (1 if is_univar else 2)] * (n - OUT_LEN)
+ if is_single:
+ past_covs = past_covs.append_values(append_vals)
+ else:
+ past_covs = [pc.append_values(append_vals) for pc in past_covs]
+ covs_kwargs["past_covariates"] = past_covs
+
+ # forecasts from forecasting model
+ model_fc = train_model(series, model_params=model_params, **covs_kwargs)
+ hfc_fc_list = model_fc.historical_forecasts(
+ series,
+ retrain=False,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ stride=1,
+ **covs_kwargs,
+ )
+ # residuals to compute the conformal intervals
+ residuals_list = model_fc.residuals(
+ series,
+ historical_forecasts=hfc_fc_list,
+ overlap_end=True,
+ last_points_only=False,
+ values_only=True,
+ metric=ae, # absolute error
+ **covs_kwargs,
+ )
+
+ # conformal forecasts
+ model = ConformalNaiveModel(
+ model=model_fc, quantiles=quantiles, cal_length=cal_length
+ )
+ hfc_conf_list = model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ stride=1,
+ **covs_kwargs,
+ **pred_lklp,
+ )
+
+ if is_single:
+ hfc_conf_list = [hfc_conf_list]
+ residuals_list = [residuals_list]
+ hfc_fc_list = [hfc_fc_list]
+
+ # validate computed conformal intervals; conformal models start later since they need past residuals as input
+ first_fc_idx = len(hfc_fc_list[0]) - len(hfc_conf_list[0])
+ for hfc_fc, hfc_conf, hfc_residuals in zip(
+ hfc_fc_list, hfc_conf_list, residuals_list
+ ):
+ for idx, (pred_fc, pred_cal) in enumerate(
+ zip(hfc_fc[first_fc_idx:], hfc_conf)
+ ):
+ # need to ignore additional `ocs` (output shift) residuals
+ residuals = np.concatenate(
+ hfc_residuals[: first_fc_idx - ocs + idx], axis=2
+ )
+
+ pred_vals = pred_fc.all_values()
+ pred_vals_expected = self.helper_compute_pred_cal(
+ residuals,
+ pred_vals,
+ n,
+ quantiles,
+ cal_length=cal_length,
+ model_type="regression",
+ symmetric=True,
+ )
+ np.testing.assert_array_almost_equal(
+ pred_cal.all_values(), pred_vals_expected
+ )
+
+ # checking that last points only is equal to the last forecasted point
+ hfc_lpo_list = model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=True,
+ stride=1,
+ **covs_kwargs,
+ **pred_lklp,
+ )
+ if is_single:
+ hfc_lpo_list = [hfc_lpo_list]
+
+ for hfc_lpo, hfc_conf in zip(hfc_lpo_list, hfc_conf_list):
+ hfc_conf_lpo = concatenate([hfc[-1:] for hfc in hfc_conf], axis=0)
+ assert hfc_lpo == hfc_conf_lpo
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [1, 3, 5], # horizon
+ [0, 1], # output chunk shift
+ [None, 1], # cal length,
+ [1, 2], # cal stride
+ [False, True], # use start
+ ),
+ )
+ def test_stridden_conformal_model(self, config):
+ """Checks correctness of naive conformal model historical forecasts for:
+ - different horizons (smaller, equal and larger the OCL)
+ - uni and multivariate series
+ - single and multiple series
+ - with and without output shift
+ - with and without training length
+ - with and without covariates
+ """
+ is_univar, is_single = True, False
+ n, ocs, cal_length, cal_stride, use_start = config
+ if ocs and n > OUT_LEN:
+ # auto-regression not allowed with ocs
+ return
+
+ series = self.helper_prepare_series(is_univar, is_single)
+ # shift second series ahead to cover the non overlapping multi series case
+ series = [series[0], series[1].shift(120)]
+ model_params = {"output_chunk_shift": ocs}
+
+ # forecasts from forecasting model
+ model_fc = train_model(series, model_params=model_params)
+ hfc_fc_list = model_fc.historical_forecasts(
+ series,
+ retrain=False,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ stride=cal_stride,
+ )
+ # residuals to compute the conformal intervals
+ residuals_list = model_fc.residuals(
+ series,
+ historical_forecasts=hfc_fc_list,
+ overlap_end=True,
+ last_points_only=False,
+ values_only=True,
+ metric=ae, # absolute error
+ )
+
+ # conformal forecasts
+ model = ConformalNaiveModel(
+ model=model_fc,
+ quantiles=q,
+ cal_length=cal_length,
+ cal_stride=cal_stride,
+ )
+ # the expected positional index of the first conformal forecast
+ # index = (skip n + ocs points (relative to cal_stride) to avoid look-ahead bias) + (number of cal examples)
+ first_fc_idx = math.ceil((n + ocs) / cal_stride) + (
+ cal_length - 1 if cal_length else 0
+ )
+ first_start = n_steps_between(
+ hfc_fc_list[0][first_fc_idx].start_time() - ocs * series[0].freq,
+ series[0].start_time(),
+ freq=series[0].freq,
+ )
+
+ hfc_conf_list = model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ start=first_start if use_start else None,
+ start_format="position" if use_start else "value",
+ stride=cal_stride,
+ **pred_lklp,
+ )
+
+ # also, skip some residuals from output chunk shift
+ ignore_ocs = math.ceil(ocs / cal_stride) if ocs >= cal_stride else 0
+ for hfc_fc, hfc_conf, hfc_residuals in zip(
+ hfc_fc_list, hfc_conf_list, residuals_list
+ ):
+ for idx, (pred_fc, pred_cal) in enumerate(
+ zip(hfc_fc[first_fc_idx:], hfc_conf)
+ ):
+ residuals = np.concatenate(
+ hfc_residuals[: first_fc_idx - ignore_ocs + idx], axis=2
+ )
+ pred_vals = pred_fc.all_values()
+ pred_vals_expected = self.helper_compute_pred_cal(
+ residuals,
+ pred_vals,
+ n,
+ q,
+ cal_length=cal_length,
+ model_type="regression",
+ symmetric=True,
+ cal_stride=cal_stride,
+ )
+ assert pred_fc.time_index.equals(pred_cal.time_index)
+ np.testing.assert_array_almost_equal(
+ pred_cal.all_values(), pred_vals_expected
+ )
+
+ # check that with a round-multiple of `cal_stride` we get identical forecasts
+ assert model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ start=first_start if use_start else None,
+ start_format="position" if use_start else "value",
+ stride=2 * cal_stride,
+ **pred_lklp,
+ ) == [hfc[::2] for hfc in hfc_conf_list]
+
+ # checking that last points only is equal to the last forecasted point
+ hfc_lpo_list = model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=True,
+ stride=cal_stride,
+ **pred_lklp,
+ )
+ for hfc_lpo, hfc_conf in zip(hfc_lpo_list, hfc_conf_list):
+ hfc_conf_lpo = concatenate(
+ [hfc[-1::cal_stride] for hfc in hfc_conf], axis=0
+ )
+ assert hfc_lpo == hfc_conf_lpo
+
+ # checking that predict gives the same results as last historical forecast
+ preds = model.predict(
+ series=series,
+ n=n,
+ **pred_lklp,
+ )
+ hfcs_conf_end = model.historical_forecasts(
+ series=series,
+ forecast_horizon=n,
+ overlap_end=True,
+ last_points_only=False,
+ start=-cal_stride,
+ start_format="position",
+ stride=cal_stride,
+ **pred_lklp,
+ )
+ hfcs_conf_end = [hfc[-1] for hfc in hfcs_conf_end]
+ for pred, last_hfc in zip(preds, hfcs_conf_end):
+ assert pred == last_hfc
+
+ def test_probabilistic_historical_forecast(self):
+ """Checks correctness of naive conformal historical forecast from probabilistic fc model compared to
+ deterministic one,
+ """
+ series = self.helper_prepare_series(False, False)
+ # forecasts from forecasting model
+ model_det = ConformalNaiveModel(
+ train_model(series, model_type="regression", quantiles=q),
+ quantiles=q,
+ )
+ model_prob = ConformalNaiveModel(
+ train_model(series, model_type="regression_prob", quantiles=q),
+ quantiles=q,
+ )
+ hfcs_det = model_det.historical_forecasts(
+ series,
+ forecast_horizon=2,
+ last_points_only=True,
+ stride=1,
+ **pred_lklp,
+ )
+ hfcs_prob = model_prob.historical_forecasts(
+ series,
+ forecast_horizon=2,
+ last_points_only=True,
+ stride=1,
+ **pred_lklp,
+ )
+ assert isinstance(hfcs_det, list) and len(hfcs_det) == 2
+ assert isinstance(hfcs_prob, list) and len(hfcs_prob) == 2
+ for hfc_det, hfc_prob in zip(hfcs_det, hfcs_prob):
+ assert hfc_det.columns.equals(hfc_prob.columns)
+ assert hfc_det.time_index.equals(hfc_prob.time_index)
+ self.helper_compare_preds(
+ hfc_prob, hfc_det.all_values(), model_type="regression_prob"
+ )
+
+ def helper_prepare_series(self, is_univar, is_single):
+ series = self.ts_pass_train
+ if not is_univar:
+ series = series.stack(series + 3.0)
+ if not is_single:
+ series = [series, series + 5]
+ return series
+
+ @staticmethod
+ def helper_compare_preds(cp_pred, pred_expected, model_type, tol_rel=0.1):
+ if isinstance(cp_pred, TimeSeries):
+ cp_pred = cp_pred.all_values(copy=False)
+ if model_type == "regression":
+ # deterministic fc model should give almost identical results
+ np.testing.assert_array_almost_equal(cp_pred, pred_expected)
+ else:
+ # probabilistic fc models have some randomness
+ diffs_rel = np.abs((cp_pred - pred_expected) / pred_expected)
+ assert (diffs_rel < tol_rel).all().all()
+
+ @staticmethod
+ def helper_compute_pred_cal(
+ residuals,
+ pred_vals,
+ horizon,
+ quantiles,
+ model_type,
+ symmetric,
+ cal_length=None,
+ cal_stride=1,
+ ):
+ """Generates expected prediction results for naive conformal model from:
+
+ - residuals and predictions from deterministic/probabilistic model
+ - any forecast horizon
+ - any quantile intervals
+ - symmetric/ asymmetric non-conformity scores
+ - any train length
+ """
+ cal_length = cal_length or 0
+ n_comps = pred_vals.shape[1]
+ half_idx = len(quantiles) // 2
+
+ # get alphas from quantiles (alpha = q_hi - q_lo) per interval
+ alphas = np.array(quantiles[half_idx + 1 :][::-1]) - np.array(
+ quantiles[:half_idx]
+ )
+ if not symmetric:
+ # asymmetric non-conformity scores look only on one tail -> alpha/2
+ alphas = 1 - (1 - alphas) / 2
+ if model_type == "regression_prob":
+ # naive conformal model converts probabilistic forecasts to median (deterministic)
+ pred_vals = np.expand_dims(np.quantile(pred_vals, 0.5, axis=2), -1)
+ elif model_type == "regression_qr":
+ # conformalized quantile regression consumes quantile forecasts
+ pred_vals = np.quantile(pred_vals, quantiles, axis=2).transpose(1, 2, 0)
+
+ is_naive = model_type in ["regression", "regression_prob"]
+ pred_expected = []
+ for alpha_idx, alpha in enumerate(alphas):
+ q_hats = []
+ # compute the quantile `alpha` of all past residuals (absolute "per time step" errors between historical
+ # forecasts and the target series)
+ for idx_horizon in range(horizon):
+ n = idx_horizon + 1
+ # ignore residuals at beginning
+ idx_fc_start = math.floor((horizon - n) / cal_stride)
+ # keep as many residuals as possible from end
+ idx_fc_end = -(math.ceil(horizon / cal_stride) - (idx_fc_start + 1))
+ res_n = residuals[idx_horizon, :, idx_fc_start : idx_fc_end or None]
+ if cal_length is not None:
+ res_n = res_n[:, -cal_length:]
+ if is_naive and symmetric:
+ # identical correction for upper and lower bounds
+ # metric is `ae()`
+ q_hat_n = np.quantile(res_n, q=alpha, method="higher", axis=1)
+ q_hats.append((-q_hat_n, q_hat_n))
+ elif is_naive:
+ # correction separately for upper and lower bounds
+ # metric is `err()`
+ q_hat_hi = np.quantile(res_n, q=alpha, method="higher", axis=1)
+ q_hat_lo = np.quantile(-res_n, q=alpha, method="higher", axis=1)
+ q_hats.append((-q_hat_lo, q_hat_hi))
+ elif symmetric: # CQR symmetric
+ # identical correction for upper and lower bounds
+ # metric is `incs_qr(symmetric=True)`
+ q_hat_n = np.quantile(res_n, q=alpha, method="higher", axis=1)
+ q_hats.append((-q_hat_n, q_hat_n))
+ else: # CQR asymmetric
+ # correction separately for upper and lower bounds
+ # metric is `incs_qr(symmetric=False)`
+ half_idx = len(res_n) // 2
+
+ # residuals have shape (n components * n intervals * 2)
+ # the factor 2 comes from the metric being computed for lower, and upper bounds separately
+ # (comp_1_qlow_1, comp_1_qlow_2, ... comp_n_qlow_m, comp_1_qhigh_1, ...)
+ q_hat_lo = np.quantile(
+ res_n[:half_idx], q=alpha, method="higher", axis=1
+ )
+ q_hat_hi = np.quantile(
+ res_n[half_idx:], q=alpha, method="higher", axis=1
+ )
+ q_hats.append((
+ -q_hat_lo[alpha_idx :: len(alphas)],
+ q_hat_hi[alpha_idx :: len(alphas)],
+ ))
+ # bring to shape (horizon, n components, 2)
+ q_hats = np.array(q_hats).transpose((0, 2, 1))
+ # the prediction interval is given by pred +/- q_hat
+ pred_vals_expected = []
+ for col_idx in range(n_comps):
+ q_col = q_hats[:, col_idx]
+ pred_col = pred_vals[:, col_idx]
+ if is_naive:
+ # conformal model corrects deterministic predictions
+ idx_q_lo = slice(0, None)
+ idx_q_med = slice(0, None)
+ idx_q_hi = slice(0, None)
+ else:
+ # conformal model corrects quantile predictions
+ idx_q_lo = slice(alpha_idx, alpha_idx + 1)
+ idx_q_med = slice(len(alphas), len(alphas) + 1)
+ idx_q_hi = slice(
+ pred_col.shape[1] - (alpha_idx + 1),
+ pred_col.shape[1] - alpha_idx,
+ )
+ # correct lower and upper bounds
+ pred_col_expected = np.concatenate(
+ [
+ pred_col[:, idx_q_lo] + q_col[:, :1], # lower quantile
+ pred_col[:, idx_q_med], # median forecast
+ pred_col[:, idx_q_hi] + q_col[:, 1:],
+ ], # upper quantile
+ axis=1,
+ )
+ pred_col_expected = np.expand_dims(pred_col_expected, 1)
+ pred_vals_expected.append(pred_col_expected)
+ pred_vals_expected = np.concatenate(pred_vals_expected, axis=1)
+ pred_expected.append(pred_vals_expected)
+
+ # reorder to have columns going from lowest quantiles to highest per component
+ pred_expected_reshaped = []
+ for comp_idx in range(n_comps):
+ for q_idx in [0, 1, 2]:
+ for pred_idx in range(len(pred_expected)):
+ # upper quantiles will have reversed order
+ if q_idx == 2:
+ pred_idx = len(pred_expected) - 1 - pred_idx
+ pred_ = pred_expected[pred_idx][:, comp_idx, q_idx]
+ pred_ = pred_.reshape(-1, 1, 1)
+
+ # q_hat_idx = q_idx + comp_idx * 3 + alpha_idx * 3 * n_comps
+ pred_expected_reshaped.append(pred_)
+ # only add median quantile once
+ if q_idx == 1:
+ break
+ return np.concatenate(pred_expected_reshaped, axis=1)
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [1, 3, 5], # horizon
+ [0, 1], # output chunk shift
+ [False, True], # use covariates
+ ),
+ )
+ def test_too_short_input_predict(self, config):
+ """Checks conformal model predict with minimum required input and too short input."""
+ n, ocs, use_covs = config
+ if ocs and n > OUT_LEN:
+ return
+ icl = IN_LEN
+ min_len = icl + ocs + n
+ series = tg.linear_timeseries(length=min_len)
+ series_train = [tg.linear_timeseries(length=IN_LEN + OUT_LEN + ocs)] * 2
+
+ model_params = {"output_chunk_shift": ocs}
+ covs_kwargs = {}
+ covs_kwargs_train = {}
+ covs_kwargs_too_short = {}
+ if use_covs:
+ model_params["lags_past_covariates"] = regr_kwargs["lags"]
+ covs_kwargs_train["past_covariates"] = series_train
+ # use shorter covariates, to test whether residuals are still properly extracted
+ past_covs = series
+ # for auto-regression, we require longer past covariates
+ if n > OUT_LEN:
+ past_covs = past_covs.append_values([1.0] * (n - OUT_LEN))
+ covs_kwargs["past_covariates"] = past_covs
+ covs_kwargs_too_short["past_covariates"] = past_covs[:-1]
+
+ model = ConformalNaiveModel(
+ train_model(
+ series=series_train,
+ model_params=model_params,
+ **covs_kwargs_train,
+ ),
+ quantiles=q,
+ )
+
+ # prediction works with long enough input
+ preds1 = model.predict(n=n, series=series, **covs_kwargs)
+ assert not np.isnan(preds1.all_values()).any().any()
+
+ # series too short: without covariates, make `series` shorter. Otherwise, use the shorter covariates
+ series_ = series[:-1] if not use_covs else series
+ with pytest.raises(ValueError) as exc:
+ _ = model.predict(n=n, series=series_, **covs_kwargs_too_short)
+ if not use_covs:
+ assert str(exc.value).startswith(
+ "Could not build the minimum required calibration input with the provided `series`"
+ )
+ else:
+ # if `past_covariates` are too short, then it raises error from the forecasting_model.predict()
+ assert str(exc.value).startswith(
+ "The `past_covariates` at list/sequence index 0 are not long enough."
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [False, True], # last points only
+ [False, True], # overlap end
+ [None, 2], # train length
+ [0, 1], # output chunk shift
+ [1, 3, 5], # horizon
+ [True, False], # use covs
+ ),
+ )
+ def test_too_short_input_hfc(self, config):
+ """Checks conformal model historical forecasts with minimum required input and too short input."""
+ (
+ last_points_only,
+ overlap_end,
+ cal_length,
+ ocs,
+ n,
+ use_covs,
+ ) = config
+ if ocs and n > OUT_LEN:
+ return
+
+ icl = IN_LEN
+ ocl = OUT_LEN
+ horizon_ocs = n + ocs
+ add_cal_length = cal_length - 1 if cal_length is not None else 0
+ # min length to generate 1 conformal forecast
+ min_len_val_series = (
+ icl + horizon_ocs * (1 + int(not overlap_end)) + add_cal_length
+ )
+
+ series_train = [tg.linear_timeseries(length=icl + ocl + ocs)] * 2
+ series = tg.linear_timeseries(length=min_len_val_series)
+
+ model_params = {"output_chunk_shift": ocs}
+ covs_kwargs_train = {}
+ covs_kwargs = {}
+ covs_kwargs_short = {}
+ if use_covs:
+ model_params["lags_past_covariates"] = regr_kwargs["lags"]
+ covs_kwargs_train["past_covariates"] = series_train
+
+ # `- horizon_ocs` to generate forecasts extending up until end of target series
+ if not overlap_end:
+ past_covs = series[:-horizon_ocs]
+ else:
+ past_covs = series
+
+ # for auto-regression, we require longer past covariates
+ if n > OUT_LEN:
+ past_covs = past_covs.append_values([1.0] * (n - OUT_LEN))
+
+ # covariates lengths to generate exactly one forecast
+ covs_kwargs["past_covariates"] = past_covs
+
+ # use too short covariates to check that errors are raised
+ covs_kwargs_short["past_covariates"] = covs_kwargs["past_covariates"][:-1]
+
+ model = ConformalNaiveModel(
+ train_model(
+ series=series_train,
+ model_params=model_params,
+ **covs_kwargs_train,
+ ),
+ quantiles=q,
+ cal_length=cal_length,
+ )
+
+ hfc_kwargs = {
+ "last_points_only": last_points_only,
+ "overlap_end": overlap_end,
+ "forecast_horizon": n,
+ }
+ # prediction works with long enough input
+ hfcs = model.historical_forecasts(
+ series=series,
+ **covs_kwargs,
+ **hfc_kwargs,
+ )
+ if last_points_only:
+ hfcs = [hfcs]
+
+ assert len(hfcs) == 1
+ for hfc in hfcs:
+ assert not np.isnan(hfc.all_values()).any().any()
+
+ # input too short: without covariates, make `series` shorter. Otherwise, use the shorter covariates
+ series_ = series[:-1] if not use_covs else series
+ with pytest.raises(ValueError) as exc:
+ _ = model.historical_forecasts(
+ series=series_,
+ **covs_kwargs_short,
+ **hfc_kwargs,
+ )
+ assert str(exc.value).startswith(
+ "Could not build the minimum required calibration input with the provided `series` and `*_covariates`"
+ )
+
+ @pytest.mark.parametrize("quantiles", [[0.1, 0.5, 0.9], [0.1, 0.3, 0.5, 0.7, 0.9]])
+ def test_backtest_and_residuals(self, quantiles):
+ """Residuals and backtest are already tested for quantile, and interval metrics based on stochastic or quantile
+ forecasts. So, a simple check that they give expected results should be enough.
+ """
+ n_q = len(quantiles)
+ half_idx = n_q // 2
+ q_interval = [
+ (q_lo, q_hi)
+ for q_lo, q_hi in zip(quantiles[:half_idx], quantiles[half_idx + 1 :][::-1])
+ ]
+ lpo = False
+
+ # series long enough for 2 hfcs
+ series = self.helper_prepare_series(True, True).append_values([0.1])
+ # conformal model
+ model = ConformalNaiveModel(model=train_model(series), quantiles=quantiles)
+
+ hfc = model.historical_forecasts(
+ series=series, forecast_horizon=5, last_points_only=lpo, **pred_lklp
+ )
+ bt = model.backtest(
+ series=series,
+ historical_forecasts=hfc,
+ last_points_only=lpo,
+ metric=mic,
+ metric_kwargs={"q_interval": model.q_interval},
+ )
+ # default backtest is equal to backtest with metric kwargs
+ np.testing.assert_array_almost_equal(
+ bt,
+ model.backtest(
+ series=series,
+ historical_forecasts=hfc,
+ last_points_only=lpo,
+ metric=mic,
+ metric_kwargs={"q_interval": q_interval},
+ ),
+ )
+ np.testing.assert_array_almost_equal(
+ mic(
+ [series] * len(hfc),
+ hfc,
+ q_interval=q_interval,
+ series_reduction=np.mean,
+ ),
+ bt,
+ )
+
+ residuals = model.residuals(
+ series=series,
+ historical_forecasts=hfc,
+ last_points_only=lpo,
+ metric=ic,
+ metric_kwargs={"q_interval": q_interval},
+ )
+ # default residuals is equal to residuals with metric kwargs
+ assert residuals == model.residuals(
+ series=series,
+ historical_forecasts=hfc,
+ last_points_only=lpo,
+ metric=ic,
+ metric_kwargs={"q_interval": q_interval},
+ )
+ expected_vals = ic([series] * len(hfc), hfc, q_interval=q_interval)
+ expected_residuals = []
+ for vals, hfc_ in zip(expected_vals, hfc):
+ expected_residuals.append(
+ TimeSeries.from_times_and_values(
+ times=hfc_.time_index,
+ values=vals,
+ columns=likelihood_component_names(
+ series.components, quantile_interval_names(q_interval)
+ ),
+ )
+ )
+ assert residuals == expected_residuals
+
+ def test_predict_probabilistic_equals_quantile(self):
+ """Tests that sampled quantiles predictions have approx. the same quantiles as direct quantile predictions."""
+ quantiles = [0.1, 0.3, 0.5, 0.7, 0.9]
+
+ # multiple multivariate series
+ series = self.helper_prepare_series(False, False)
+
+ # conformal model
+ model = ConformalNaiveModel(model=train_model(series), quantiles=quantiles)
+ # direct quantile predictions
+ pred_quantiles = model.predict(n=3, series=series, **pred_lklp)
+ # sampled predictions
+ pred_samples = model.predict(n=3, series=series, num_samples=500)
+ for pred_q, pred_s in zip(pred_quantiles, pred_samples):
+ assert pred_q.n_samples == 1
+ assert pred_q.n_components == series[0].n_components * len(quantiles)
+ assert pred_s.n_samples == 500
+ assert pred_s.n_components == series[0].n_components
+
+ vals_q = pred_q.all_values()
+ vals_s = pred_s.all_values()
+ vals_s_q = np.quantile(vals_s, quantiles, axis=2).transpose((1, 2, 0))
+ vals_s_q = vals_s_q.reshape(vals_q.shape)
+ self.helper_compare_preds(
+ vals_s_q,
+ vals_q,
+ model_type="regression_prob",
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ [
+ # (cal_length, cal_stride, (start_expected, start_format_expected))
+ (None, 1, (None, "value")),
+ (None, 2, (-4, "position")),
+ (None, 3, (-6, "position")),
+ (None, 4, (-4, "position")),
+ (1, 1, (-3, "position")),
+ (1, 2, (-4, "position")),
+ (1, 3, (-3, "position")),
+ (1, 4, (-4, "position")),
+ ],
+ )
+ def test_calibration_hfc_start_predict(self, config):
+ """Test calibration historical forecast start point when calling `predict()` ("end" position)."""
+ cal_length, cal_stride, start_expected = config
+ series = linear_timeseries(length=4)
+ horizon = 2
+ output_chunk_shift = 1
+ assert (
+ _get_calibration_hfc_start(
+ series=[series],
+ horizon=horizon,
+ output_chunk_shift=output_chunk_shift,
+ cal_length=cal_length,
+ cal_stride=cal_stride,
+ start="end",
+ start_format="position",
+ )
+ == start_expected
+ )
+
+ @pytest.mark.parametrize(
+ "config",
+ [
+ # (cal_length, cal_stride, start, start_expected)
+ (None, 1, None, None),
+ (None, 1, 1, None),
+ (1, 1, -1, -4),
+ (1, 1, 0, 0),
+ (1, 2, 0, 0),
+ (1, 3, 0, 0),
+ (1, 1, 1, 0),
+ (1, 2, 1, 1),
+ (1, 3, 1, 1),
+ (1, 1, -1, -4),
+ (1, 2, -1, -5),
+ (1, 3, -1, -4),
+ ],
+ )
+ def test_calibration_hfc_start_position_hist_fc(self, config):
+ """Test calibration historical forecast start point when calling `historical_forecasts()`
+ with start format "position"."""
+ cal_length, cal_stride, start, start_expected = config
+ series = linear_timeseries(length=4)
+ horizon = 2
+ output_chunk_shift = 1
+ assert _get_calibration_hfc_start(
+ series=[series],
+ horizon=horizon,
+ output_chunk_shift=output_chunk_shift,
+ cal_length=cal_length,
+ cal_stride=cal_stride,
+ start=start,
+ start_format="position",
+ ) == (start_expected, "position")
+
+ @pytest.mark.parametrize(
+ "config",
+ [
+ # (cal_length, cal_stride, start, start_expected)
+ (None, 1, None, None),
+ (None, 1, "2020-01-11", None),
+ (1, 1, "2020-01-09", "2020-01-06"), # start before series start
+ (1, 1, "2020-01-10", "2020-01-07"),
+ (1, 2, "2020-01-10", "2020-01-06"),
+ (1, 3, "2020-01-10", "2020-01-07"),
+ (2, 1, "2020-01-09", "2020-01-05"),
+ (2, 1, "2020-01-10", "2020-01-06"),
+ (2, 2, "2020-01-10", "2020-01-04"),
+ (2, 3, "2020-01-10", "2020-01-04"),
+ ],
+ )
+ def test_calibration_hfc_start_value_hist_fc(self, config):
+ """Test calibration historical forecast start point when calling `historical_forecasts()`
+ with start format "value"."""
+ cal_length, cal_stride, start, start_expected = config
+ if start is not None:
+ start = pd.Timestamp(start)
+ if start_expected is not None:
+ start_expected = pd.Timestamp(start_expected)
+ series = linear_timeseries(length=4, start=pd.Timestamp("2020-01-10"), freq="d")
+ horizon = 2
+ output_chunk_shift = 1
+ assert _get_calibration_hfc_start(
+ series=[series],
+ horizon=horizon,
+ output_chunk_shift=output_chunk_shift,
+ cal_length=cal_length,
+ cal_stride=cal_stride,
+ start=start,
+ start_format="value",
+ ) == (start_expected, "value")
diff --git a/darts/tests/models/forecasting/test_ensemble_models.py b/darts/tests/models/forecasting/test_ensemble_models.py
index 7fa663ddce..92fb932a5e 100644
--- a/darts/tests/models/forecasting/test_ensemble_models.py
+++ b/darts/tests/models/forecasting/test_ensemble_models.py
@@ -766,14 +766,10 @@ def get_global_ensemble_model(output_chunk_length=5):
)
@pytest.mark.parametrize("model_cls", [NaiveEnsembleModel, RegressionEnsembleModel])
- def test_save_load_ensemble_models(self, tmpdir_module, model_cls):
+ def test_save_load_ensemble_models(self, tmpdir_fn, model_cls):
# check if save and load methods work and
# if loaded ensemble model creates same forecasts as original ensemble models
- cwd = os.getcwd()
- os.chdir(tmpdir_module)
- os.mkdir(model_cls.__name__)
- full_model_path_str = os.path.join(tmpdir_module, model_cls.__name__)
- os.chdir(full_model_path_str)
+ full_model_path_str = os.getcwd()
kwargs = {}
expected_suffixes = [".pkl", ".pkl.RNNModel_2.pt", ".pkl.RNNModel_2.pt.ckpt"]
@@ -827,5 +823,3 @@ def test_save_load_ensemble_models(self, tmpdir_module, model_cls):
for p in pkl_files:
loaded_model = model_cls.load(p)
assert model_prediction == loaded_model.predict(5)
-
- os.chdir(cwd)
diff --git a/darts/tests/models/forecasting/test_global_forecasting_models.py b/darts/tests/models/forecasting/test_global_forecasting_models.py
index f8eea72615..22343b3cf7 100644
--- a/darts/tests/models/forecasting/test_global_forecasting_models.py
+++ b/darts/tests/models/forecasting/test_global_forecasting_models.py
@@ -276,12 +276,10 @@ def test_save_model_parameters(self, config):
),
],
)
- def test_save_load_model(self, tmpdir_module, model):
+ def test_save_load_model(self, tmpdir_fn, model):
# check if save and load methods work and if loaded model creates same forecasts as original model
- cwd = os.getcwd()
- os.chdir(tmpdir_module)
model_path_str = type(model).__name__
- full_model_path_str = os.path.join(tmpdir_module, model_path_str)
+ full_model_path_str = os.path.join(tmpdir_fn, model_path_str)
model.fit(self.ts_pass_train)
model_prediction = model.predict(self.forecasting_horizon)
@@ -293,9 +291,7 @@ def test_save_load_model(self, tmpdir_module, model):
assert os.path.exists(full_model_path_str)
assert (
len([
- p
- for p in os.listdir(tmpdir_module)
- if p.startswith(type(model).__name__)
+ p for p in os.listdir(tmpdir_fn) if p.startswith(type(model).__name__)
])
== 4
)
@@ -305,8 +301,6 @@ def test_save_load_model(self, tmpdir_module, model):
assert model_prediction == loaded_model.predict(self.forecasting_horizon)
- os.chdir(cwd)
-
@pytest.mark.parametrize("config", models_cls_kwargs_errs)
def test_single_ts(self, config):
model_cls, kwargs, err = config
diff --git a/darts/tests/models/forecasting/test_local_forecasting_models.py b/darts/tests/models/forecasting/test_local_forecasting_models.py
index b9d0bf5084..e1e7361a60 100644
--- a/darts/tests/models/forecasting/test_local_forecasting_models.py
+++ b/darts/tests/models/forecasting/test_local_forecasting_models.py
@@ -142,8 +142,6 @@ def test_save_model_parameters(self):
@pytest.mark.parametrize("model", [ARIMA(1, 1, 1), LinearRegressionModel(lags=12)])
def test_save_load_model(self, tmpdir_module, model):
# check if save and load methods work and if loaded model creates same forecasts as original model
- cwd = os.getcwd()
- os.chdir(tmpdir_module)
model_path_str = type(model).__name__
model_path_pathlike = pathlib.Path(model_path_str + "_pathlike")
model_path_binary = model_path_str + "_binary"
@@ -186,8 +184,6 @@ def test_save_load_model(self, tmpdir_module, model):
for loaded_model in loaded_models:
assert model_prediction == loaded_model.predict(self.forecasting_horizon)
- os.chdir(cwd)
-
def test_save_load_model_invalid_path(self):
# check if save and load methods raise an error when given an invalid path
model = ARIMA(1, 1, 1)
diff --git a/darts/tests/models/forecasting/test_probabilistic_models.py b/darts/tests/models/forecasting/test_probabilistic_models.py
index 141fd43dcd..fd63793463 100644
--- a/darts/tests/models/forecasting/test_probabilistic_models.py
+++ b/darts/tests/models/forecasting/test_probabilistic_models.py
@@ -12,6 +12,7 @@
BATS,
TBATS,
CatBoostModel,
+ ConformalNaiveModel,
ExponentialSmoothing,
LightGBMModel,
LinearRegressionModel,
@@ -61,13 +62,16 @@
lgbm_available = not isinstance(LightGBMModel, NotImportedModule)
cb_available = not isinstance(CatBoostModel, NotImportedModule)
+# conformal models require a fitted base model
+# in tests below, the model is re-trained for new input series.
+# using a fake trained model should allow the same API with conformal models
+conformal_forecaster = LinearRegressionModel(lags=10, output_chunk_length=5)
+conformal_forecaster._fit_called = True
+
# model_cls, model_kwargs, err_univariate, err_multivariate
models_cls_kwargs_errs = [
(ExponentialSmoothing, {}, 0.3, None),
(ARIMA, {"p": 1, "d": 0, "q": 1, "random_state": 42}, 0.03, None),
-]
-
-models_cls_kwargs_errs += [
(
BATS,
{
@@ -92,6 +96,17 @@
0.04,
0.04,
),
+ (
+ ConformalNaiveModel,
+ {
+ "model": conformal_forecaster,
+ "cal_length": 1,
+ "random_state": 42,
+ "quantiles": [0.1, 0.5, 0.9],
+ },
+ 0.04,
+ 0.04,
+ ),
]
xgb_test_params = {
@@ -137,7 +152,7 @@
**tfm_kwargs,
},
0.06,
- 0.05,
+ 0.06,
),
(
BlockRNNModel,
@@ -285,7 +300,7 @@ def test_probabilistic_forecast_accuracy_multivariate(self, config):
def helper_test_probabilistic_forecast_accuracy(self, model, err, ts, noisy_ts):
model.fit(noisy_ts[:100])
- pred = model.predict(n=100, num_samples=100)
+ pred = model.predict(n=50, num_samples=100)
# test accuracy of the median prediction compared to the noiseless ts
mae_err_median = mae(ts[100:], pred)
diff --git a/darts/tests/models/forecasting/test_regression_models.py b/darts/tests/models/forecasting/test_regression_models.py
index 220c8d2c24..9aed20f431 100644
--- a/darts/tests/models/forecasting/test_regression_models.py
+++ b/darts/tests/models/forecasting/test_regression_models.py
@@ -1005,33 +1005,31 @@ def test_models_runnability(self, config):
model, mode = config
train_y, test_y = self.sine_univariate1.split_before(0.7)
# testing past covariates
+ model_instance = model(lags=4, lags_past_covariates=None, multi_models=mode)
with pytest.raises(ValueError):
# testing lags_past_covariates None but past_covariates during training
- model_instance = model(lags=4, lags_past_covariates=None, multi_models=mode)
model_instance.fit(
series=self.sine_univariate1,
past_covariates=self.sine_multivariate1,
)
+ model_instance = model(lags=4, lags_past_covariates=3, multi_models=mode)
with pytest.raises(ValueError):
# testing lags_past_covariates but no past_covariates during fit
- model_instance = model(lags=4, lags_past_covariates=3, multi_models=mode)
model_instance.fit(series=self.sine_univariate1)
# testing future_covariates
+ model_instance = model(lags=4, lags_future_covariates=None, multi_models=mode)
with pytest.raises(ValueError):
# testing lags_future_covariates None but future_covariates during training
- model_instance = model(
- lags=4, lags_future_covariates=None, multi_models=mode
- )
model_instance.fit(
series=self.sine_univariate1,
future_covariates=self.sine_multivariate1,
)
+ model_instance = model(lags=4, lags_future_covariates=(0, 3), multi_models=mode)
with pytest.raises(ValueError):
# testing lags_covariate but no covariate during fit
- model_instance = model(lags=4, lags_future_covariates=3, multi_models=mode)
model_instance.fit(series=self.sine_univariate1)
# testing input_dim
diff --git a/darts/tests/utils/historical_forecasts/test_historical_forecasts.py b/darts/tests/utils/historical_forecasts/test_historical_forecasts.py
index 66dc2f8542..1f739f9599 100644
--- a/darts/tests/utils/historical_forecasts/test_historical_forecasts.py
+++ b/darts/tests/utils/historical_forecasts/test_historical_forecasts.py
@@ -1,5 +1,6 @@
import itertools
import logging
+import math
from copy import deepcopy
from itertools import product
from typing import Optional
@@ -22,6 +23,7 @@
ARIMA,
AutoARIMA,
CatBoostModel,
+ ConformalNaiveModel,
LightGBMModel,
LinearRegressionModel,
NaiveDrift,
@@ -35,6 +37,7 @@
from darts.utils import n_steps_between
from darts.utils import timeseries_generation as tg
from darts.utils.ts_utils import SeriesType, get_series_seq_type
+from darts.utils.utils import likelihood_component_names, quantile_names
if TORCH_AVAILABLE:
import torch
@@ -1600,13 +1603,13 @@ def f_encoder(idx):
assert ohfc[0].start_time() == first_ts_expected
# check hist fc end
assert ohfc[-1].end_time() == last_ts_expected
- for hfc, ohfc in zip(hfc, ohfc):
- assert hfc.columns.equals(series.columns)
- assert ohfc.columns.equals(series.columns)
- assert len(ohfc) == n_pred_points_expected
- assert (hfc.time_index == ohfc.time_index).all()
+ for hfc_, ohfc_ in zip(hfc, ohfc):
+ assert hfc_.columns.equals(series.columns)
+ assert ohfc_.columns.equals(series.columns)
+ assert len(ohfc_) == n_pred_points_expected
+ assert (hfc_.time_index == ohfc_.time_index).all()
np.testing.assert_array_almost_equal(
- hfc.all_values(), ohfc.all_values()
+ hfc_.all_values(), ohfc_.all_values()
)
def test_hist_fc_end_exact_with_covs(self):
@@ -3287,3 +3290,453 @@ def test_historical_forecast_additional_sanity_checks(self):
assert str(err.value).startswith(
"Since `start_format='position'`, `start` must be an integer, received"
)
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [False, True], # use covariates
+ [True, False], # last points only
+ [True, False], # overlap end
+ [1, 3], # stride
+ [
+ 3, # horizon < ocl
+ 5, # horizon == ocl
+ 7, # horizon > ocl -> autoregression
+ ],
+ [False, True], # use integer indexed series
+ [False, True], # use multi-series
+ [0, 1], # output chunk shift
+ ),
+ )
+ def test_conformal_historical_forecasts(self, config):
+ """Tests historical forecasts output naive conformal model with last points only, covariates, stride,
+ different horizons and overlap end.
+ Tests that the returned dimensions, lengths and start / end times are correct.
+ """
+ (
+ use_covs,
+ last_points_only,
+ overlap_end,
+ stride,
+ horizon,
+ use_int_idx,
+ use_multi_series,
+ ocs,
+ ) = config
+ q = [0.1, 0.5, 0.9]
+ pred_lklp = {"num_samples": 1, "predict_likelihood_parameters": True}
+ # compute minimum series length to generate n forecasts
+ icl = 3
+ ocl = 5
+ horizon_ocs = horizon + ocs
+ min_len_val_series = icl + horizon_ocs + int(not overlap_end) * horizon_ocs
+ n_forecasts = 3
+ # get train and val series of that length
+ series = self.ts_pass_val[: min_len_val_series + n_forecasts - 1]
+ if use_int_idx:
+ series = TimeSeries.from_values(
+ values=series.all_values(),
+ columns=series.columns,
+ )
+ # check that too short input raises error
+ series_too_short = series[:-n_forecasts]
+
+ # optionally, generate covariates
+ if use_covs:
+ pc = tg.gaussian_timeseries(
+ start=series.start_time(),
+ end=series.end_time() + max(0, horizon - ocl) * series.freq,
+ freq=series.freq,
+ )
+ fc = tg.gaussian_timeseries(
+ start=series.start_time(),
+ end=series.end_time() + (max(ocl, horizon) + ocs) * series.freq,
+ freq=series.freq,
+ )
+ else:
+ pc, fc = None, None
+
+ # first train the ForecastingModel
+ model_kwargs = (
+ {}
+ if not use_covs
+ else {"lags_past_covariates": icl, "lags_future_covariates": (icl, ocl)}
+ )
+ forecasting_model = LinearRegressionModel(
+ lags=icl, output_chunk_length=ocl, output_chunk_shift=ocs, **model_kwargs
+ )
+ forecasting_model.fit(series, past_covariates=pc, future_covariates=fc)
+
+ # add an offset and rename columns in second series to make sure that conformal hist fc works as expected
+ if use_multi_series:
+ series = [
+ series,
+ (series + 10).shift(1).with_columns_renamed(series.columns, "test_col"),
+ ]
+ pc = [pc, pc.shift(1)] if pc is not None else None
+ fc = [fc, fc.shift(1)] if fc is not None else None
+
+ # conformal model
+ model = ConformalNaiveModel(forecasting_model, quantiles=q)
+
+ hfc_kwargs = dict(
+ {
+ "retrain": False,
+ "last_points_only": last_points_only,
+ "overlap_end": overlap_end,
+ "stride": stride,
+ "forecast_horizon": horizon,
+ },
+ **pred_lklp,
+ )
+ # cannot perform auto regression with output chunk shift
+ if ocs and horizon > ocl:
+ with pytest.raises(ValueError) as exc:
+ _ = model.historical_forecasts(
+ series=series,
+ past_covariates=pc,
+ future_covariates=fc,
+ **hfc_kwargs,
+ )
+ assert str(exc.value).startswith("Cannot perform auto-regression")
+ return
+
+ # compute conformal historical forecasts
+ hist_fct = model.historical_forecasts(
+ series=series, past_covariates=pc, future_covariates=fc, **hfc_kwargs
+ )
+ # raises error with too short target series
+ with pytest.raises(ValueError) as exc:
+ _ = model.historical_forecasts(
+ series=series_too_short,
+ past_covariates=pc,
+ future_covariates=fc,
+ **hfc_kwargs,
+ )
+ assert str(exc.value).startswith(
+ "Could not build the minimum required calibration input with the provided `series`"
+ )
+
+ if not isinstance(series, list):
+ series = [series]
+ hist_fct = [hist_fct]
+
+ for (
+ series_,
+ hfc,
+ ) in zip(series, hist_fct):
+ if not isinstance(hfc, list):
+ hfc = [hfc]
+
+ n_preds_with_overlap = (
+ len(series_)
+ - icl # input for first prediction
+ - horizon_ocs # skip first forecasts to avoid look-ahead bias
+ + 1 # minimum one forecast
+ )
+ if not last_points_only:
+ # last points only = False gives a list of forecasts per input series
+ # where each forecast contains the predictions over the entire horizon
+ n_pred_series_expected = n_preds_with_overlap
+ n_pred_points_expected = horizon
+ first_ts_expected = series_.time_index[icl] + series_.freq * (
+ horizon_ocs + ocs
+ )
+ last_ts_expected = series_.end_time() + series_.freq * horizon_ocs
+ # no overlapping means less predictions
+ if not overlap_end:
+ n_pred_series_expected -= horizon_ocs
+ else:
+ # last points only = True gives one contiguous time series per input series
+ # with only predictions from the last point in the horizon
+ n_pred_series_expected = 1
+ n_pred_points_expected = n_preds_with_overlap
+ first_ts_expected = series_.time_index[icl] + series_.freq * (
+ horizon_ocs + ocs + horizon - 1
+ )
+ last_ts_expected = series_.end_time() + series_.freq * horizon_ocs
+ # no overlapping means less predictions
+ if not overlap_end:
+ n_pred_points_expected -= horizon_ocs
+
+ # no overlapping means less predictions
+ if not overlap_end:
+ last_ts_expected -= series_.freq * horizon_ocs
+
+ # adapt based on stride
+ if stride > 1:
+ if not last_points_only:
+ n_pred_series_expected = n_pred_series_expected // stride + int(
+ n_pred_series_expected % stride
+ )
+ else:
+ n_pred_points_expected = n_pred_points_expected // stride + int(
+ n_pred_points_expected % stride
+ )
+ first_ts_expected = hfc[0].start_time()
+ last_ts_expected = hfc[-1].end_time()
+
+ cols_excpected = likelihood_component_names(
+ series_.columns, quantile_names(q)
+ )
+ # check length match between optimized and default hist fc
+ assert len(hfc) == n_pred_series_expected
+ # check hist fc start
+ assert hfc[0].start_time() == first_ts_expected
+ # check hist fc end
+ assert hfc[-1].end_time() == last_ts_expected
+ for hfc_ in hfc:
+ assert hfc_.columns.tolist() == cols_excpected
+ assert len(hfc_) == n_pred_points_expected
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [False, True], # last points only
+ [None, 1, 2], # cal length
+ [False, True], # use start
+ ["value", "position"], # start format
+ [False, True], # use integer indexed series
+ [False, True], # use multi-series
+ [0, 1], # output chunk shift
+ ),
+ )
+ def test_conformal_historical_start_cal_length(self, config):
+ """Tests naive conformal model historical forecasts without `cal_stride`."""
+ (
+ last_points_only,
+ cal_length,
+ use_start,
+ start_format,
+ use_int_idx,
+ use_multi_series,
+ ocs,
+ ) = config
+ q = [0.1, 0.5, 0.9]
+ pred_lklp = {"num_samples": 1, "predict_likelihood_parameters": True}
+ # compute minimum series length to generate n forecasts
+ icl = 3
+ ocl = 5
+ horizon = 5
+ horizon_ocs = horizon + ocs
+ add_cal_length = cal_length - 1 if cal_length is not None else 0
+ add_start = 2 * int(use_start)
+ min_len_val_series = icl + 2 * horizon_ocs + add_cal_length + add_start
+ n_forecasts = 3
+ # get train and val series of that length
+ series = self.ts_pass_val[: min_len_val_series + n_forecasts - 1]
+
+ if use_int_idx:
+ series = TimeSeries.from_values(
+ values=series.all_values(),
+ columns=series.columns,
+ )
+
+ # first train the ForecastingModel
+ forecasting_model = LinearRegressionModel(
+ lags=icl,
+ output_chunk_length=ocl,
+ output_chunk_shift=ocs,
+ )
+ forecasting_model.fit(series)
+
+ # optionally compute the start as a positional index
+ start_position = icl + horizon_ocs + add_cal_length + add_start
+ start = None
+ if use_start:
+ if start_format == "value":
+ start = series.time_index[start_position]
+ else:
+ start = start_position
+
+ # add an offset and rename columns in second series to make sure that conformal hist fc works as expected
+ if use_multi_series:
+ series = [
+ series,
+ (series + 10).shift(1).with_columns_renamed(series.columns, "test_col"),
+ ]
+
+ # compute conformal historical forecasts (skips some of the first forecasts to get minimum required cal set)
+ model = ConformalNaiveModel(
+ forecasting_model, quantiles=q, cal_length=cal_length
+ )
+ hist_fct = model.historical_forecasts(
+ series=series,
+ retrain=False,
+ start=start,
+ start_format=start_format,
+ last_points_only=last_points_only,
+ forecast_horizon=horizon,
+ overlap_end=False,
+ **pred_lklp,
+ )
+
+ if not isinstance(series, list):
+ series = [series]
+ hist_fct = [hist_fct]
+
+ for idx, (
+ series_,
+ hfc,
+ ) in enumerate(zip(series, hist_fct)):
+ if not isinstance(hfc, list):
+ hfc = [hfc]
+
+ # multi series: second series is shifted by one time step (+/- idx);
+ # start_format = "value" requires a shift
+ add_start_series_2 = idx * int(use_start) * int(start_format == "value")
+
+ n_preds_without_overlap = (
+ len(series_)
+ - icl # input for first prediction
+ - horizon_ocs # skip first forecasts to avoid look-ahead bias
+ - horizon_ocs # cannot compute with `overlap_end=False`
+ + 1 # minimum one forecast
+ - add_cal_length # skip based on train length
+ - add_start # skip based on start
+ + add_start_series_2 # skip based on start if second series
+ )
+ if not last_points_only:
+ n_pred_series_expected = n_preds_without_overlap
+ n_pred_points_expected = horizon
+ # seconds series is shifted by one time step (- idx)
+ first_ts_expected = series_.time_index[
+ start_position - add_start_series_2 + ocs
+ ]
+ last_ts_expected = series_.end_time()
+ else:
+ n_pred_series_expected = 1
+ n_pred_points_expected = n_preds_without_overlap
+ # seconds series is shifted by one time step (- idx)
+ first_ts_expected = (
+ series_.time_index[start_position - add_start_series_2]
+ + (horizon_ocs - 1) * series_.freq
+ )
+ last_ts_expected = series_.end_time()
+
+ cols_excpected = likelihood_component_names(
+ series_.columns, quantile_names(q)
+ )
+ # check historical forecasts dimensions
+ assert len(hfc) == n_pred_series_expected
+ # check hist fc start
+ assert hfc[0].start_time() == first_ts_expected
+ # check hist fc end
+ assert hfc[-1].end_time() == last_ts_expected
+ for hfc_ in hfc:
+ assert hfc_.columns.tolist() == cols_excpected
+ assert len(hfc_) == n_pred_points_expected
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [False, True], # last points only
+ [None, 2], # cal length
+ ["value", "position"], # start format
+ [2, 4], # stride
+ [1, 2], # cal stride
+ [0, 1], # output chunk shift
+ ),
+ )
+ def test_conformal_historical_forecast_start_stride(self, caplog, config):
+ """Tests naive conformal model with `start` being the first forecastable index is identical to a start
+ before forecastable index (including stride, cal stride).
+ """
+ (
+ last_points_only,
+ cal_length,
+ start_format,
+ stride,
+ cal_stride,
+ ocs,
+ ) = config
+ q = [0.1, 0.5, 0.9]
+ pred_lklp = {"num_samples": 1, "predict_likelihood_parameters": True}
+ # compute minimum series length to generate n forecasts
+ icl = 3
+ ocl = 5
+ horizon = 2
+
+ # the position of the first conformal forecast start point without look-ahead bias; assuming min cal_length=1
+ horizon_ocs = math.ceil((horizon + ocs) / cal_stride) * cal_stride
+ # adjust by the number of calibration examples
+ add_cal_length = cal_stride * (cal_length - 1) if cal_length is not None else 0
+ # the minimum series length is the sum of the above, plus the length of one forecast (horizon + ocs)
+ min_len_val_series = icl + horizon_ocs + add_cal_length + horizon + ocs
+ n_forecasts = 3
+ # to get `n_forecasts` with `stride`, we need more points
+ n_forecasts_stride = stride * n_forecasts - int(1 % stride > 0)
+ # get train and val series of that length
+ series = tg.linear_timeseries(
+ length=min_len_val_series + n_forecasts_stride - 1
+ )
+
+ # first train the ForecastingModel
+ forecasting_model = LinearRegressionModel(
+ lags=icl,
+ output_chunk_length=ocl,
+ output_chunk_shift=ocs,
+ )
+ forecasting_model.fit(series)
+
+ # optionally compute the start as a positional index
+ start_position = icl + horizon_ocs + add_cal_length
+ if start_format == "value":
+ start = series.time_index[start_position]
+ start_too_early = series.time_index[start_position - 1]
+ start_too_early_stride = series.time_index[start_position - stride]
+ else:
+ start = start_position
+ start_too_early = start_position - 1
+ start_too_early_stride = start_position - stride
+ start_first_fc = series.time_index[start_position] + series.freq * (
+ horizon + ocs - 1 if last_points_only else ocs
+ )
+ too_early_warn_exp = "is before the first predictable/trainable historical"
+
+ hfc_params = {
+ "series": series,
+ "retrain": False,
+ "start_format": start_format,
+ "stride": stride,
+ "last_points_only": last_points_only,
+ "forecast_horizon": horizon,
+ }
+ # compute regular historical forecasts
+ hist_fct_all = forecasting_model.historical_forecasts(start=start, **hfc_params)
+ assert len(hist_fct_all) == n_forecasts
+ assert hist_fct_all[0].start_time() == start_first_fc
+ assert (
+ hist_fct_all[1].start_time() - stride * series.freq
+ == hist_fct_all[0].start_time()
+ )
+
+ # compute conformal historical forecasts (starting at first possible conformal forecast)
+ model = ConformalNaiveModel(
+ forecasting_model, quantiles=q, cal_length=cal_length, cal_stride=cal_stride
+ )
+ with caplog.at_level(logging.WARNING):
+ hist_fct = model.historical_forecasts(
+ start=start, **hfc_params, **pred_lklp
+ )
+ assert too_early_warn_exp not in caplog.text
+ caplog.clear()
+ assert len(hist_fct) == len(hist_fct_all)
+ assert hist_fct_all[0].start_time() == hist_fct[0].start_time()
+ assert (
+ hist_fct[1].start_time() - stride * series.freq == hist_fct[0].start_time()
+ )
+
+ # start one earlier gives warning
+ with caplog.at_level(logging.WARNING):
+ _ = model.historical_forecasts(
+ start=start_too_early, **hfc_params, **pred_lklp
+ )
+ assert too_early_warn_exp in caplog.text
+ caplog.clear()
+
+ # starting stride before first valid start, gives identical results
+ hist_fct_too_early = model.historical_forecasts(
+ start=start_too_early_stride, **hfc_params, **pred_lklp
+ )
+ assert hist_fct_too_early == hist_fct
diff --git a/darts/tests/utils/historical_forecasts/test_utils.py b/darts/tests/utils/historical_forecasts/test_utils.py
index fdb14ed1a5..7554d807e7 100644
--- a/darts/tests/utils/historical_forecasts/test_utils.py
+++ b/darts/tests/utils/historical_forecasts/test_utils.py
@@ -102,10 +102,12 @@ def test_historical_forecasts_check_start(self):
(True, 0.9, "position"),
(True, 0, "position"),
(True, 0, "value"),
+ (True, -1, "position"),
(False, pd.Timestamp("2000-01-01"), "value"),
(False, 0.9, "value"),
(False, 0.9, "position"),
(False, 0, "position"),
+ (False, -1, "position"),
],
)
def test_historical_forecasts_check_start_invalid(self, config):
diff --git a/darts/tests/utils/test_utils.py b/darts/tests/utils/test_utils.py
index d629851cea..003d2253aa 100644
--- a/darts/tests/utils/test_utils.py
+++ b/darts/tests/utils/test_utils.py
@@ -1,3 +1,5 @@
+import itertools
+
import numpy as np
import pandas as pd
import pytest
@@ -15,6 +17,7 @@
n_steps_between,
quantile_interval_names,
quantile_names,
+ sample_from_quantiles,
)
@@ -631,3 +634,94 @@ def test_quantile_interval_names(self, config):
q, names_expected = config
names = quantile_interval_names(q, "a")
assert names == names_expected
+
+ @pytest.mark.parametrize("ndim", [2, 3])
+ def test_generate_samples_shape(self, ndim):
+ """Checks that the output shape of generated samples from quantiles and quantile predictions
+ is as expected."""
+ n_time_steps = 10
+ n_columns = 5
+ n_quantiles = 20
+ num_samples = 50
+
+ q = np.linspace(0, 1, n_quantiles)
+ q_pred = np.random.rand(n_time_steps, n_columns, n_quantiles)
+ if ndim == 2:
+ q_pred = q_pred.reshape((n_time_steps, n_columns * n_quantiles))
+ y_pred = sample_from_quantiles(q_pred, q, num_samples)
+ assert y_pred.shape == (n_time_steps, n_columns, num_samples)
+
+ @pytest.mark.parametrize(
+ "config",
+ itertools.product(
+ [1, 2], # n times
+ [2, 3], # ndim
+ [1, 2], # n components
+ ),
+ )
+ def test_generate_samples_output(self, config):
+ """Tests sample generation from quantiles and quantile predictions for:
+
+ - single/multiple time steps
+ - from 2 or 3 dimensions
+ - uni/multivariate
+ """
+ np.random.seed(42)
+ n_times, ndim, n_comps = config
+ num_samples = 100000
+
+ q = np.array([0.2, 0.5, 0.75])
+ q_pred = np.array([[[1.0, 2.0, 3.0]]])
+ if n_times == 2:
+ q_pred = np.concatenate([q_pred, np.array([[[5.0, 7.0, 9.0]]])], axis=0)
+ if n_comps == 2:
+ q_pred = np.concatenate([q_pred, q_pred + 1.0], axis=1)
+ if ndim == 2:
+ q_pred = q_pred.reshape((len(q_pred), -1))
+ y_pred = sample_from_quantiles(q_pred, q, num_samples)
+
+ q_pred = q_pred.reshape((q_pred.shape[0], n_comps, len(q)))
+ for i in range(n_comps):
+ # edges must be identical to min/max predicted quantiles
+ assert y_pred[:, i].min() == q_pred[:, i].min()
+ assert y_pred[:, i].max() == q_pred[:, i].max()
+
+ # check that sampled quantiles values equal to the predicted quantiles
+ assert np.quantile(y_pred[:, i], q[0], axis=1) == pytest.approx(
+ q_pred[:, i, 0], abs=0.02
+ )
+ assert np.quantile(y_pred[:, i], q[1], axis=1) == pytest.approx(
+ q_pred[:, i, 1], abs=0.02
+ )
+ assert np.quantile(y_pred[:, i], q[2], axis=1) == pytest.approx(
+ q_pred[:, i, 2], abs=0.02
+ )
+
+ # for each component and quantile, check that the expected ratio of sampled values is approximately
+ # equal to the quantile
+ assert (y_pred[:, i] == q_pred[:, i, 0:1]).mean(axis=1) == pytest.approx(
+ 0.2, abs=0.02
+ )
+ assert (
+ (q_pred[:, i, 0:1] < y_pred[:, i]) & (y_pred[:, i] <= q_pred[:, i, 1:2])
+ ).mean(axis=1) == pytest.approx(0.3, abs=0.02)
+ assert (
+ (q_pred[:, i, 1:2] < y_pred[:, i]) & (y_pred[:, i] < q_pred[:, i, 2:3])
+ ).mean(axis=1) == pytest.approx(0.25, abs=0.02)
+ assert (y_pred[:, i] == q_pred[:, i, 2:3]).mean(axis=1) == pytest.approx(
+ 0.25, abs=0.02
+ )
+
+ # between the quantiles, the values must be linearly interpolated
+ # check that number of unique values is approximately equal to the difference between two adjacent quantiles
+ mask1 = (q_pred[:, i, 0:1] < y_pred[:, i]) & (
+ y_pred[:, i] < q_pred[:, i, 1:2]
+ )
+ share_unique1 = len(np.unique(y_pred[:, i][mask1])) / num_samples
+ assert share_unique1 == pytest.approx(n_times * (q[1] - q[0]), abs=0.05)
+
+ mask2 = (q_pred[:, i, 1:2] < y_pred[:, i]) & (
+ y_pred[:, i] < q_pred[:, i, 2:3]
+ )
+ share_unique2 = len(np.unique(y_pred[:, i][mask2])) / num_samples
+ assert share_unique2 == pytest.approx(n_times * (q[2] - q[1]), abs=0.05)
diff --git a/darts/utils/historical_forecasts/optimized_historical_forecasts_regression.py b/darts/utils/historical_forecasts/optimized_historical_forecasts_regression.py
index a9a3218856..934294d926 100644
--- a/darts/utils/historical_forecasts/optimized_historical_forecasts_regression.py
+++ b/darts/utils/historical_forecasts/optimized_historical_forecasts_regression.py
@@ -41,7 +41,9 @@ def _optimized_historical_forecasts_last_points_only(
The data_transformers are applied in historical_forecasts (input and predictions)
"""
forecasts_list = []
- iterator = _build_tqdm_iterator(series, verbose)
+ iterator = _build_tqdm_iterator(
+ series, verbose, total=len(series), desc="historical forecasts"
+ )
for idx, series_ in enumerate(iterator):
past_covariates_ = past_covariates[idx] if past_covariates is not None else None
future_covariates_ = (
@@ -204,7 +206,9 @@ def _optimized_historical_forecasts_all_points(
Rely on _check_optimizable_historical_forecasts() to check that the assumptions are verified.
"""
forecasts_list = []
- iterator = _build_tqdm_iterator(series, verbose)
+ iterator = _build_tqdm_iterator(
+ series, verbose, total=len(series), desc="historical forecasts"
+ )
for idx, series_ in enumerate(iterator):
past_covariates_ = past_covariates[idx] if past_covariates is not None else None
future_covariates_ = (
diff --git a/darts/utils/historical_forecasts/utils.py b/darts/utils/historical_forecasts/utils.py
index 86a4ef64b9..c8502cd7c4 100644
--- a/darts/utils/historical_forecasts/utils.py
+++ b/darts/utils/historical_forecasts/utils.py
@@ -14,9 +14,8 @@
)
from darts.logging import get_logger, raise_log
from darts.timeseries import TimeSeries
-from darts.utils import n_steps_between
from darts.utils.ts_utils import SeriesType, get_series_seq_type, series2seq
-from darts.utils.utils import generate_index
+from darts.utils.utils import generate_index, n_steps_between
logger = get_logger(__name__)
@@ -28,7 +27,9 @@
]
-def _historical_forecasts_general_checks(model, series, kwargs):
+def _historical_forecasts_general_checks(
+ model, series, kwargs, is_conformal: bool = False
+):
"""
Performs checks common to ForecastingModel and RegressionModel backtest() methods
@@ -38,9 +39,6 @@ def _historical_forecasts_general_checks(model, series, kwargs):
The forecasting model.
series
Either series when called from ForecastingModel, or target_series if called from RegressionModel
- signature_params
- A dictionary of the signature parameters of the calling method, to get the default values
- Typically would be signature(self.backtest).parameters
kwargs
Params specified by the caller of backtest(), they take precedence over the arguments' default values
"""
@@ -61,6 +59,18 @@ def _historical_forecasts_general_checks(model, series, kwargs):
logger,
)
+ # check stride for ConformalModel
+ if is_conformal and (
+ n.stride < model.cal_stride or n.stride % model.cal_stride > 0
+ ):
+ raise_log(
+ ValueError(
+ f"The provided `stride` parameter must be a round-multiple of `cal_stride={model.cal_stride}` "
+ f"and `>=cal_stride`. Received `stride={n.stride}`"
+ ),
+ logger,
+ )
+
series = series2seq(series)
if n.start is not None:
@@ -86,13 +96,23 @@ def _historical_forecasts_general_checks(model, series, kwargs):
),
logger,
)
- if isinstance(n.start, float) and not 0.0 <= n.start <= 1.0:
- raise_log(
- ValueError("if `start` is a float, must be between 0.0 and 1.0."),
- logger,
- )
+ if isinstance(n.start, float):
+ if is_conformal:
+ raise_log(
+ ValueError(
+ "`start` of type float is not supported for `ConformalModel`."
+ ),
+ logger,
+ )
+ if not 0.0 <= n.start <= 1.0:
+ raise_log(
+ ValueError("if `start` is a float, must be between 0.0 and 1.0."),
+ logger,
+ )
+ series_freq = None
for idx, series_ in enumerate(series):
+ start_is_value = False
# check specifically for int and Timestamp as error by `get_timestamp_at_point` is too generic
if isinstance(n.start, pd.Timestamp):
if not series_._has_datetime_index:
@@ -110,6 +130,7 @@ def _historical_forecasts_general_checks(model, series, kwargs):
),
logger,
)
+ start_is_value = True
elif isinstance(n.start, (int, np.int64)):
if n.start_format == "position" or series_.has_datetime_index:
if n.start >= len(series_):
@@ -120,13 +141,32 @@ def _historical_forecasts_general_checks(model, series, kwargs):
),
logger,
)
- elif n.start > series_.time_index[-1]: # format "value" and range index
+ else:
+ if (
+ n.start > series_.time_index[-1]
+ ): # format "value" and range index
+ raise_log(
+ ValueError(
+ f"`start` time `{n.start}` is larger than the last index `{series_.time_index[-1]}` "
+ f"for series at index: {idx}."
+ ),
+ logger,
+ )
+ start_is_value = True
+
+ # `ConformalModel` with `start_format='value'` requires all series to have the same frequency
+ if is_conformal and start_is_value:
+ if series_freq is None:
+ series_freq = series_.freq
+
+ if series_freq != series_.freq:
raise_log(
ValueError(
- f"`start` time `{n.start}` is larger than the last index `{series_.time_index[-1]}` "
- f"for series at index: {idx}."
+ f"Found mismatching `series` time index frequencies `{series_freq}` and `{series_.freq}`. "
+ f"`start_format='value'` with `ConformalModel` is only supported if all series in "
+ f"`series` have the same frequency."
),
- logger,
+ logger=logger,
)
# find valid start position relative to the series start time, otherwise raise an error
@@ -498,8 +538,12 @@ def _check_start(
if isinstance(start, float):
# fraction of series
start = series.get_index_at_point(start)
- else:
+ elif start >= 0:
+ # start >= 0 is relative to the start
start = series.start_time() + start * series.freq
+ else:
+ # start < 0 is relative to the end
+ start = series.end_time() + (start + 1) * series.freq
else:
start_format_msg = "time "
ref_msg = "" if not is_historical_forecast else "historical forecastable "
@@ -570,7 +614,7 @@ def _get_historical_forecastable_time_index(
Returns
-------
- Union[pd.DatetimeIndex, pd.RangeIndex, Tuple[int, int], Tuple[pd.Timestamp, pd.Timestamp], None]
+ Union[pd.DatetimeIndex, pd.RangeIndex, tuple[int, int], tuple[pd.Timestamp, pd.Timestamp], None]
The longest time_index that can be used for historical forecasting, either as a range or a tuple.
Examples
@@ -1230,3 +1274,93 @@ def _apply_inverse_data_transformers(
return forecasts[0] if called_with_single_series else forecasts
else:
return forecasts
+
+
+def _process_historical_forecast_for_backtest(
+ series: Union[TimeSeries, Sequence[TimeSeries]],
+ historical_forecasts: Union[
+ TimeSeries, Sequence[TimeSeries], Sequence[Sequence[TimeSeries]]
+ ],
+ last_points_only: bool,
+):
+ """Checks that the `historical_forecasts` have the correct format based on the input `series` and
+ `last_points_only`. If all checks have passed, it converts `series` and `historical_forecasts` format into a
+ multiple series case with `last_points_only=False`.
+ """
+ # remember input series type
+ series_seq_type = get_series_seq_type(series)
+ series = series2seq(series)
+
+ # check that `historical_forecasts` have correct type
+ expected_seq_type = None
+ forecast_seq_type = get_series_seq_type(historical_forecasts)
+ if last_points_only and not series_seq_type == forecast_seq_type:
+ # lpo=True -> fc sequence type must be the same
+ expected_seq_type = series_seq_type
+ elif not last_points_only and forecast_seq_type != series_seq_type + 1:
+ # lpo=False -> fc sequence type must be one order higher
+ expected_seq_type = series_seq_type + 1
+
+ if expected_seq_type is not None:
+ raise_log(
+ ValueError(
+ f"Expected `historical_forecasts` of type {expected_seq_type} "
+ f"with `last_points_only={last_points_only}` and `series` of type "
+ f"{series_seq_type}. However, received `historical_forecasts` of type "
+ f"{forecast_seq_type}. Make sure to pass the same `last_points_only` "
+ f"value that was used to generate the historical forecasts."
+ ),
+ logger=logger,
+ )
+
+ # we must wrap each fc in a list if `last_points_only=True`
+ nested = last_points_only and forecast_seq_type == SeriesType.SEQ
+ historical_forecasts = series2seq(
+ historical_forecasts, seq_type_out=SeriesType.SEQ_SEQ, nested=nested
+ )
+
+ # check that the number of series-specific forecasts corresponds to the
+ # number of series in `series`
+ if len(series) != len(historical_forecasts):
+ error_msg = (
+ f"Mismatch between the number of series-specific `historical_forecasts` "
+ f"(n={len(historical_forecasts)}) and the number of `TimeSeries` in `series` "
+ f"(n={len(series)}). For `last_points_only={last_points_only}`, expected "
+ )
+ expected_seq_type = series_seq_type if last_points_only else series_seq_type + 1
+ if expected_seq_type == SeriesType.SINGLE:
+ error_msg += f"a single `historical_forecasts` of type {expected_seq_type}."
+ else:
+ error_msg += f"`historical_forecasts` of type {expected_seq_type} with length n={len(series)}."
+ raise_log(
+ ValueError(error_msg),
+ logger=logger,
+ )
+ return series, historical_forecasts
+
+
+def _extend_series_for_overlap_end(
+ series: Sequence[TimeSeries],
+ historical_forecasts: Sequence[Sequence[TimeSeries]],
+):
+ """Extends each target `series` to the end of the last historical forecast for that series.
+ Fills the values all missing dates with `np.nan`.
+
+ Assumes the input meets the multiple `series` case with `last_points_only=False` (e.g. the output of
+ `darts.utils.historical_forecasts.utils_process_historical_forecast_for_backtest()`).
+ """
+ series_extended = []
+ append_vals = [np.nan] * series[0].n_components
+ for series_, hfcs_ in zip(series, historical_forecasts):
+ # find number of missing target time steps based on the last forecast
+ missing_steps = n_steps_between(
+ hfcs_[-1].end_time(), series[0].end_time(), freq=series[0].freq
+ )
+ # extend the target if it is too short
+ if missing_steps > 0:
+ series_extended.append(
+ series_.append_values(np.array([append_vals] * missing_steps))
+ )
+ else:
+ series_extended.append(series_)
+ return series_extended
diff --git a/darts/utils/timeseries_generation.py b/darts/utils/timeseries_generation.py
index bb9a6d8a1e..1094303736 100644
--- a/darts/utils/timeseries_generation.py
+++ b/darts/utils/timeseries_generation.py
@@ -746,6 +746,7 @@ def _build_forecast_series(
with_static_covs: bool = True,
with_hierarchy: bool = True,
pred_start: Optional[Union[pd.Timestamp, int]] = None,
+ time_index: Union[pd.DatetimeIndex, pd.RangeIndex] = None,
) -> TimeSeries:
"""
Builds a forecast time series starting after the end of an input time series, with the
@@ -764,24 +765,26 @@ def _build_forecast_series(
with_hierarchy
If set to `False`, do not copy the input_series `hierarchy` attribute
pred_start
- Optionally, give a custom prediction start point.
+ Optionally, give a custom prediction start point. Only effective if `time_index` is `None`.
+ time_index
+ Optionally, the index to use for the forecast time series.
Returns
-------
TimeSeries
New TimeSeries instance starting after the input series
"""
- time_index_length = (
- len(points_preds)
- if isinstance(points_preds, np.ndarray)
- else len(points_preds[0])
- )
-
- time_index = _generate_new_dates(
- time_index_length,
- input_series=input_series,
- start=pred_start,
- )
+ if time_index is None:
+ time_index_length = (
+ len(points_preds)
+ if isinstance(points_preds, np.ndarray)
+ else len(points_preds[0])
+ )
+ time_index = _generate_new_dates(
+ time_index_length,
+ input_series=input_series,
+ start=pred_start,
+ )
values = (
points_preds
if isinstance(points_preds, np.ndarray)
diff --git a/darts/utils/torch.py b/darts/utils/torch.py
index 710e0809b8..81edf78d01 100644
--- a/darts/utils/torch.py
+++ b/darts/utils/torch.py
@@ -4,24 +4,21 @@
"""
from functools import wraps
-from inspect import signature
-from typing import Any, Callable, TypeVar
+from typing import Callable, TypeVar
+import numpy as np
import torch.nn as nn
import torch.nn.functional as F
-from numpy.random import randint
from sklearn.utils import check_random_state
from torch import Tensor
from torch.random import fork_rng, manual_seed
-from darts.logging import get_logger, raise_if_not
+from darts.logging import get_logger, raise_log
+from darts.utils.utils import MAX_NUMPY_SEED_VALUE, MAX_TORCH_SEED_VALUE, _is_method
T = TypeVar("T")
logger = get_logger(__name__)
-MAX_TORCH_SEED_VALUE = (1 << 31) - 1 # to accommodate 32-bit architectures
-MAX_NUMPY_SEED_VALUE = (1 << 31) - 1
-
class MonteCarloDropout(nn.Dropout):
"""
@@ -53,26 +50,6 @@ def mc_dropout_enabled(self) -> bool:
return self._mc_dropout_enabled or self.training
-def _is_method(func: Callable[..., Any]) -> bool:
- """Check if the specified function is a method.
-
- Parameters
- ----------
- func
- the function to inspect.
-
- Returns
- -------
- bool
- true if `func` is a method, false otherwise.
- """
- spec = signature(func)
- if len(spec.parameters) > 0:
- if list(spec.parameters.keys())[0] == "self":
- return True
- return False
-
-
def random_method(decorated: Callable[..., T]) -> Callable[..., T]:
"""Decorator usable on any method within a class that will provide an isolated torch random context.
@@ -82,22 +59,22 @@ def random_method(decorated: Callable[..., T]) -> Callable[..., T]:
----------
decorated
A method to be run in an isolated torch random context.
-
"""
# check that @random_method has been applied to a method.
- raise_if_not(
- _is_method(decorated), "@random_method can only be used on methods.", logger
- )
+ if not _is_method(decorated):
+ raise_log(ValueError("@random_method can only be used on methods."), logger)
@wraps(decorated)
def decorator(self, *args, **kwargs) -> T:
if "random_state" in kwargs.keys():
+ # get random state for first time from model constructor
self._random_instance = check_random_state(kwargs["random_state"])
elif not hasattr(self, "_random_instance"):
+ # get random state for first time from other method
self._random_instance = check_random_state(
- randint(0, high=MAX_NUMPY_SEED_VALUE)
+ np.random.randint(0, high=MAX_NUMPY_SEED_VALUE)
)
-
+ # handle the randomness
with fork_rng():
manual_seed(self._random_instance.randint(0, high=MAX_TORCH_SEED_VALUE))
return decorated(self, *args, **kwargs)
diff --git a/darts/utils/utils.py b/darts/utils/utils.py
index f05699d44c..1ce2955a6a 100644
--- a/darts/utils/utils.py
+++ b/darts/utils/utils.py
@@ -7,12 +7,13 @@
from enum import Enum
from functools import wraps
from inspect import Parameter, getcallargs, signature
-from typing import Callable, Optional, TypeVar, Union
+from typing import Any, Callable, Optional, TypeVar, Union
import numpy as np
import pandas as pd
from joblib import Parallel, delayed
from pandas._libs.tslibs.offsets import BusinessMixin
+from sklearn.utils import check_random_state
from tqdm import tqdm
from tqdm.notebook import tqdm as tqdm_notebook
@@ -25,6 +26,9 @@
logger = get_logger(__name__)
+MAX_TORCH_SEED_VALUE = (1 << 31) - 1 # to accommodate 32-bit architectures
+MAX_NUMPY_SEED_VALUE = (1 << 31) - 1
+
# Enums
class SeasonalityMode(Enum):
@@ -265,6 +269,23 @@ def _parallel_apply(
return returned_data
+def _is_method(func: Callable[..., Any]) -> bool:
+ """Check if the specified function is a method.
+
+ Parameters
+ ----------
+ func
+ the function to inspect.
+
+ Returns
+ -------
+ bool
+ true if `func` is a method, false otherwise.
+ """
+ spec = signature(func)
+ return len(spec.parameters) > 0 and list(spec.parameters.keys())[0] == "self"
+
+
def _check_quantiles(quantiles):
raise_if_not(
all([0 < q < 1 for q in quantiles]),
@@ -587,3 +608,114 @@ def expand_arr(arr: np.ndarray, ndim: int):
if len(shape) != ndim:
arr = arr.reshape(shape + tuple(1 for _ in range(ndim - len(shape))))
return arr
+
+
+def sample_from_quantiles(
+ vals: np.ndarray,
+ quantiles: np.ndarray,
+ num_samples: int,
+):
+ """Generates `num_samples` samples from quantile predictions using linear interpolation. The generated samples
+ should have quantile values close to the quantile predictions. For the lowest and highest quantiles, the lowest
+ and highest quantile predictions are repeated.
+
+ Parameters
+ ----------
+ vals
+ A numpy array of quantile predictions/values. Either an array with two dimensions
+ (n times, n components * n quantiles), or with three dimensions (n times, n components, n quantiles).
+ In the two-dimensional case, the order is first by ascending column, then by ascending quantile value
+ `(comp_0_q_0, comp_0_q_1, ... comp_n_q_m)`
+ quantiles
+ A numpy array of quantiles.
+ num_samples
+ The number of samples to generate.
+ """
+ if not 2 <= vals.ndim <= 3:
+ raise_log(
+ ValueError(
+ "`vals` must have either two dimensions with `(n times, n components * n quantiles)` or three "
+ "dimensions with shape `(n times, n components, n quantiles)`"
+ )
+ )
+ n_time_steps = len(vals)
+ n_quantiles = len(quantiles)
+ if vals.ndim == 2:
+ if vals.shape[1] % n_quantiles > 0:
+ raise_log(
+ ValueError(
+ "`vals` with two dimension must have shape `(n times, n components * n quantiles)`."
+ )
+ )
+ vals = vals.reshape((n_time_steps, -1, n_quantiles))
+ elif vals.ndim == 3 and vals.shape[2] != n_quantiles:
+ raise_log(
+ ValueError(
+ "`vals` with three dimension must have shape `(n times, n components, n quantiles)`."
+ )
+ )
+ n_columns = vals.shape[1]
+
+ # Generate uniform random samples
+ random_samples = np.random.uniform(0, 1, (n_time_steps, n_columns, num_samples))
+ # Find the indices of the quantiles just below and above the random samples
+ lower_indices = np.searchsorted(quantiles, random_samples, side="right") - 1
+ upper_indices = lower_indices + 1
+
+ # Handle edge cases
+ lower_indices = np.clip(lower_indices, 0, n_quantiles - 1)
+ upper_indices = np.clip(upper_indices, 0, n_quantiles - 1)
+
+ # Gather the corresponding quantile values and vals values
+ q_lower = quantiles[lower_indices]
+ q_upper = quantiles[upper_indices]
+ z_lower = np.take_along_axis(vals, lower_indices, axis=2)
+ z_upper = np.take_along_axis(vals, upper_indices, axis=2)
+
+ y = z_lower
+ # Linear interpolation
+ mask = q_lower != q_upper
+ y[mask] = z_lower[mask] + (z_upper[mask] - z_lower[mask]) * (
+ random_samples[mask] - q_lower[mask]
+ ) / (q_upper[mask] - q_lower[mask])
+ return y
+
+
+def random_method(decorated: Callable[..., T]) -> Callable[..., T]:
+ """Decorator usable on any method within a class that will provide a random context.
+
+ The decorator will store a `_random_instance` property on the object in order to persist successive calls to the
+ RNG.
+
+ This is the equivalent to `darts.utils.torch.random_method` but for non-torch models.
+
+ Parameters
+ ----------
+ decorated
+ A method to be run in an isolated torch random context.
+ """
+ # check that @random_method has been applied to a method.
+ if not _is_method(decorated):
+ raise_log(ValueError("@random_method can only be used on methods."), logger)
+
+ @wraps(decorated)
+ def decorator(self, *args, **kwargs):
+ if "random_state" in kwargs.keys():
+ # get random state for first time from model constructor
+ self._random_instance = check_random_state(
+ kwargs["random_state"]
+ ).get_state()
+ elif not hasattr(self, "_random_instance"):
+ # get random state for first time from other method
+ self._random_instance = check_random_state(
+ np.random.randint(0, high=MAX_NUMPY_SEED_VALUE)
+ ).get_state()
+
+ # handle the randomness
+ np.random.set_state(self._random_instance)
+ result = decorated(self, *args, **kwargs)
+ # update the random state after the function call
+ self._random_instance = np.random.get_state()
+ return result
+
+ return decorator
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 21a00c2efe..eb798536ba 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -49,10 +49,10 @@
"inherited-members": None,
"show-inheritance": None,
"ignore-module-all": True,
- "exclude-members": "ForecastingModel,LocalForecastingModel,FutureCovariatesLocalForecastingModel,"
+ "exclude-members": "LocalForecastingModel,FutureCovariatesLocalForecastingModel,"
+ "TransferableFutureCovariatesLocalForecastingModel,GlobalForecastingModel,TorchForecastingModel,"
+ "PastCovariatesTorchModel,FutureCovariatesTorchModel,DualCovariatesTorchModel,MixedCovariatesTorchModel,"
- + "SplitCovariatesTorchModel,TorchParametricProbabilisticForecastingModel,"
+ + "SplitCovariatesTorchModel,"
+ "min_train_series_length,"
+ "untrained_model,first_prediction_index,future_covariate_series,past_covariate_series,"
+ "initialize_encoders,register_datapipe_as_function,register_function,functions,"
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
index fe68dd1e1a..4efe4c1b53 100644
--- a/docs/source/examples.rst
+++ b/docs/source/examples.rst
@@ -86,6 +86,15 @@ Regression models example notebook:
examples/20-RegressionModel-examples.ipynb
+Conformal Prediction
+=================
+
+Conformal prediction example notebook:
+
+.. toctree::
+ :maxdepth: 1
+
+ examples/23-Conformal-Prediction-examples.ipynb
Fast Fourier Transform
======================
diff --git a/docs/userguide/covariates.md b/docs/userguide/covariates.md
index 97f82c6d92..8df7dc94eb 100644
--- a/docs/userguide/covariates.md
+++ b/docs/userguide/covariates.md
@@ -154,6 +154,7 @@ GFMs are models that can be trained on multiple target (and covariate) time seri
| [TiDEModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tide_model.html#darts.models.forecasting.tide_model.TiDEModel) | ✅ | ✅ | ✅ |
| [TSMixerModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.tsmixer_model.html#darts.models.forecasting.tsmixer_model.TSMixerModel) | ✅ | ✅ | ✅ |
| Ensemble Models (f) | ✅ | ✅ | ✅ |
+| Conformal Prediction Models (g) | ✅ | ✅ | ✅ |
**Table 1: Darts' forecasting models and their covariate support**
@@ -170,6 +171,8 @@ GFMs are models that can be trained on multiple target (and covariate) time seri
(f) Ensemble Model including [RegressionEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.regression_ensemble_model.html#darts.models.forecasting.regression_ensemble_model.RegressionEnsembleModel), and [NaiveEnsembleModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.baselines.html#darts.models.forecasting.baselines.NaiveEnsembleModel). The covariate support is given by the covariate support of the ensembled forecasting models.
+(g) Conformal Prediction Model including [ConformalNaiveModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.conformal_models.html#darts.models.forecasting.conformal_models.ConformalNaiveModel), and [ConformalQRModel](https://unit8co.github.io/darts/generated_api/darts.models.forecasting.conformal_models.html#darts.models.forecasting.conformal_models.ConformalQRModel). The covariate support is given by the covariate support of the underlying forecasting model.
+
----
## Quick guide on how to use past and/or future covariates with Darts' forecasting models
diff --git a/examples/23-Conformal-Prediction-examples.ipynb b/examples/23-Conformal-Prediction-examples.ipynb
new file mode 100644
index 0000000000..09277e879c
--- /dev/null
+++ b/examples/23-Conformal-Prediction-examples.ipynb
@@ -0,0 +1,1577 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "45bd6e88-1be9-4de1-9933-143eda71d501",
+ "metadata": {},
+ "source": [
+ "# Conformal Prediction Models\n",
+ "\n",
+ "The following is a demonstration of the conformal prediction models in Darts.\n",
+ "\n",
+ "TLDR;\n",
+ "\n",
+ "- Conformal prediction in Darts constructs valid prediction intervals without distributional assumptions.\n",
+ "- We use Split Conformal Prediction (SCP) due to its simplicity and efficiency.\n",
+ "- You can apply conformal prediction to any pre-trained global forecasting model.\n",
+ "- To improve your experience, our conformal models automatically extract the relevant calibration data from your input series required to generate the interval.\n",
+ "- We offer useful features to configure the extraction and make your conformal models more adaptive and efficient (`cal_length`, `cal_stride`).\n",
+ "- Conformal prediction supports all use cases (uni- and multivariate, single and multiple series, and single and multi-horizon forecasts, providing direct quantile value predictions or sampled predictions).\n",
+ "- We'll demonstrate how to use and evaluate conformal prediction on four examples using real-world data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3ef9bc25-7b86-4de5-80e9-6eff27025b44",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# fix python path if working locally\n",
+ "from utils import fix_pythonpath_if_working_locally\n",
+ "\n",
+ "fix_pythonpath_if_working_locally()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "9d9d76e9-5753-4762-a1cb-c8c61d0313d2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2\n",
+ "%matplotlib inline\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "\n",
+ "from darts import concatenate, metrics\n",
+ "from darts.datasets import ElectricityConsumptionZurichDataset\n",
+ "from darts.models import ConformalNaiveModel, ConformalQRModel, LinearRegressionModel"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6ec264e9-af99-4d88-9fcc-1e71db03b294",
+ "metadata": {},
+ "source": [
+ "## Conformal Prediction for Time Series Forecasting\n",
+ "\n",
+ "*Conformal prediction is a technique for constructing prediction intervals that try to achieve valid coverage in finite samples, without making distributional assumptions.* [(source)](https://arxiv.org/pdf/1905.03222)\n",
+ "\n",
+ "In other words: If we want a prediction interval that includes 80% of all actual values over some period of time, then a conformal model attempts to generate such intervals that actually have 80% of points inside.\n",
+ "\n",
+ "There are different techniques to perform conformal prediction. In Darts, we currently use **Split Conformal Prediction [(SCP, Lei\n",
+ "et al., 2018)](https://www.stat.cmu.edu/~ryantibs/papers/conformal.pdf)** (with some nice adaptions) due to its simplicity and efficiency. \n",
+ "\n",
+ "### Split Conformal Prediction\n",
+ "SCP adds calibrated prediction intervals with a specified confidence level to a base model's forecasts. It involves splitting the data into a training (+ optional validation) set and a calibration (+ test) set. The model is trained on the training set, and the calibration set is used to compute the prediction intervals to ensure they contain the true values with the desired probability.\n",
+ "\n",
+ "#### Advantages\n",
+ "\n",
+ "- **Valid Coverage**: Provides valid prediction intervals that are guaranteed to contain the true value with a specified confidence level on finite samples.\n",
+ "- **Model-agnostic**: Can be applied to any predictive model:\n",
+ " - Either adds calibrated prediction intervals to point forecasting models\n",
+ " - Or calibrates the predicted intervals in case of probabilistic forecasting models\n",
+ "- **Distribution-free**: No distributional assumptions about the data except that the errors on the calibration set are exchangeable (e.g. we don't need to assume that our data is normally distributed and then fit a model with a `GaussianLikelihood`).\n",
+ "- **Efficient**: Split Conformal Prediction is efficient since it does not require model re-training.\n",
+ "- **Interpretable**: The method is interpretable due to its simplicity.\n",
+ "- **Useful Applications**: It's used to provide more reliable and informative predictions to help decision-making in several industries. See this [article on conformal prediction](https://medium.com/@data-overload/conformal-prediction-a-critic-to-predictive-models-27501dcc76d4)\n",
+ "\n",
+ "#### Disadvantages\n",
+ "\n",
+ "- **Requires a Calibration Set**: Conformal prediction requires another data / hold-out set that is used solely to compute the calibrated prediction intervals. This can be inefficient for small datasets.\n",
+ "- **Exchangeability of Calibration Data** (a): The accuracy of the prediction intervals depends on the representativeness of the calibration data (or rather the forecast errors produced on the calibration set). The coverage is not guaranteed anymore if there is a **distribution shift** in forecast errors (e.g. series with a trend but forecasting model is not able to predict the trend).\n",
+ "- **Conservativeness** (a): May produce wider intervals than necessary, leading to conservative predictions.\n",
+ "\n",
+ "(a) Darts conformal models have some parameters to control the extraction of the calibration set for more adaptiveness (see more infos [here](#Darts-features-to-make-your-Conformal-Models-more-adaptive))."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d5dc6eb5-2eeb-4495-9074-1a44ac9154ab",
+ "metadata": {},
+ "source": [
+ "## Darts Conformal Models\n",
+ "\n",
+ "Darts' conformal models add calibrated prediction intervals to the forecasts of any **pre-trained global forecasting model**. \n",
+ "There is no need to train the conformal models themselves (e.g. no `fit()` required) and you can directly call `predict()` or `historical_forecasts()`. Behind the hood, Darts will automatically extract the calibration set from the past of your input series and use it to generate the calibrated prediction intervals (see [here](#Workflow-behind-the-hood) for more detail).\n",
+ "\n",
+ "> **Important**: The `series` passed to the forecast methods **should not have any overlap** with the series used to **train** the forecasting model, since this will lead to overly optimistic prediction intervals.\n",
+ "\n",
+ "### Model support\n",
+ "\n",
+ "All conformal models in Darts support:\n",
+ "\n",
+ "- any **pre-trained global forecasting model** as the base forecaster (you can find a list [here](https://unit8co.github.io/darts/#forecasting-models))\n",
+ "- **uni-** and **multivariate** forecasts (single / multi-columns)\n",
+ "- **single** and **multiple series** forecasts\n",
+ "- **single** and **multi-horizon** forecasts\n",
+ "- generate a **single** or **multiple calibrated prediction intervals**\n",
+ "- **direct quantile value** predictions (interval bounds) or **sampled predictions** from these quantile values\n",
+ "- **any covariates** based on the underlying forecasting model\n",
+ "\n",
+ "### Direct Interval Predictions or Sampled Predictions\n",
+ "Conformal models are probabilistic, so you can forecast in two ways (when calling `predict()`, `historical_forecasts()`, ...):\n",
+ "\n",
+ "- Forecast the calibrated quantile interval bounds directly (example [here](https://unit8co.github.io/darts/quickstart/00-quickstart.html#Direct-Parameter-Predicitons)).\n",
+ " - `predict(..., predict_likelihood_parameters=True)`\n",
+ "- Generate stochastic forecasts by sampling from these calibrated quantile intervals (examples [here](https://unit8co.github.io/darts/quickstart/00-quickstart.html#Probabilistic-Sample-Predictions)):\n",
+ " - `predict(..., num_samples=1000)`\n",
+ "\n",
+ "### Workflow behind the hood\n",
+ "\n",
+ "> Note: `cal_length` and `cal_stride` will be further explained [below](#Darts-features-to-make-your-Conformal-Models-more-adaptive).\n",
+ "\n",
+ "In general, the workflow of the models to produce one calibrated forecast/prediction is as follows (using `predict()`):\n",
+ "\n",
+ "- **Extract a calibration set**: The calibration set for each conformal forecast is automatically extracted from\n",
+ " the most recent past of your input series relative to the forecast start point. The number of calibration examples\n",
+ " (forecast errors / non-conformity scores) to consider can be defined at model creation\n",
+ " with parameter `cal_length`. Note that when using `cal_stride>1`, a longer history is required since\n",
+ " the calibration examples are generated with stridden historical forecasts.\n",
+ "- Generate **historical forecasts** on the calibration set (using the forecasting model) with a stride `cal_stride`.\n",
+ "- Compute the **errors/non-conformity scores** (specific to each conformal model) on these historical forecasts\n",
+ "- Compute the **quantile values** from the errors / non-conformity scores (using our desired quantiles set at model\n",
+ " creation with parameter `quantiles`).\n",
+ "- Compute the conformal prediction: Using these quantile values, add **calibrated intervals** to (or adjust the\n",
+ " existing intervals of) the forecasting model's predictions.\n",
+ "\n",
+ "For **multi-horizon forecasts**, the above is applied for each step in the horizon separately.\n",
+ "\n",
+ "When computing `historical_forecasts()`, `backtest()`, `residuals()`, ... the above is applied for each forecast (the forecasting model's historical forecasts are only generated once for efficiency).\n",
+ "\n",
+ "### Available Conformal Models\n",
+ "\n",
+ "At the time of writing (Darts version 0.32.0), we have two conformal models:\n",
+ "\n",
+ "#### `ConformalNaiveModel`\n",
+ "\n",
+ "Adds calibrated intervals around the median forecast of **any pre-trained global forecasting model**. It supports two symmetry modes:\n",
+ "\n",
+ "- `symmetric=True`:\n",
+ " - The lower and upper interval bounds are calibrated with the same magnitude.\n",
+ " - Non-conformity scores: uses the [absolute error](https://unit8co.github.io/darts/generated_api/darts.metrics.metrics.html#darts.metrics.metrics.ae) `ae()` to compute the non-conformity scores on the calibration set.\n",
+ "- `symmetric=False`\n",
+ " - The lower and upper interval bounds are calibrated separately.\n",
+ " - Non-conformity scores: uses the [error](https://unit8co.github.io/darts/generated_api/darts.metrics.metrics.html#darts.metrics.metrics.err) `err()` to compute the\n",
+ " non-conformity scores on the calibration set for the upper bounds, and `-err()` for the lower bounds.\n",
+ "\n",
+ "#### `ConformalQRModel` (Conformalized Quantile Regression Model)\n",
+ "\n",
+ "Calibrates the quantile predictions of a **pre-trained probabilistic global forecasting model**. It supports two symmetry modes:\n",
+ "\n",
+ "- `symmetric=True`:\n",
+ " - The lower and upper quantile predictions are calibrated with the same magnitude.\n",
+ " - Non-conformity scores: uses the [Non-Conformity Score for Quantile Regression](https://unit8co.github.io/darts/generated_api/darts.metrics.metrics.html#darts.metrics.metrics.incs_qr) `incs_qr(symmetric=True)` on the calibration set.\n",
+ "- `symmetric=False`\n",
+ " - The lower and upper quantile predictions are calibrated separately.\n",
+ " - Non-conformity scores: uses the [Asymmetric Non-Conformity Score for Quantile Regression](https://unit8co.github.io/darts/generated_api/darts.metrics.metrics.html#darts.metrics.metrics.incs_qr) `incs_qr(symmetric=False)` for the upper and lower bound on the calibration set.\n",
+ "\n",
+ "### Darts features to make your Conformal Models more adaptive\n",
+ "\n",
+ "As mentioned in [Split Conformal Prediction - Disadvantages](#Disadvantages), the calibration set has a large impact on the effectiveness of our conformal prediction technique.\n",
+ "\n",
+ "We implemented some cool features to make our automatic extraction of the calibration set even more powerful for you.\n",
+ "\n",
+ "All our conformal models have the following two parameters at model creation:\n",
+ "\n",
+ "- `cal_length`: The number of non-conformity scores (NCS) in the most recent past to use as calibration for each conformal forecast (and each step in the horizon).\n",
+ " - If `None` acts as an expanding window mode\n",
+ " - If `>=1` uses a moving fixed-length window mode\n",
+ " - Benefits:\n",
+ " - Using `cal_length` makes your model react more quickly to distribution shifts in NCS.\n",
+ " - Using `cal_length` reduces the computational cost to perform the calibration.\n",
+ " - Caution: Use large enough values to have enough example for calibration.\n",
+ "- `cal_stride`: (default=1) The stride (number of time steps between two consecutive forecasts) to apply when computing the historical forecasts and non-conformity scores on the calibration set.\n",
+ " - This is useful if we want to run our models on a scheduled basis (e.g. once every 24 hours) and are only interested in the NCS that were produced on this schedule.\n",
+ " - Caution: `cal_stride>1` requires a longer `series` history (roughly `cal_length * stride` points)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "eacf6328-6b51-43e9-8b44-214f5df15684",
+ "metadata": {},
+ "source": [
+ "## Examples\n",
+ "\n",
+ "We will show four examples:\n",
+ "\n",
+ "1) How to perform conformal prediction and compare different models based on the quantified uncertainty. For simplicity, we will use a single step horizon `n=1`.\n",
+ "2) How to perform multistep horizon conformal forecasts\n",
+ "3) How to perform multistep horizon conformal forecasts on a scheduled basis\n",
+ "4) An example of conformalized quantile regression.\n",
+ "\n",
+ "### Input Dataset\n",
+ "For both examples, we use the Electricity Consumption Dataset from households in Zurich, Switzerland.\n",
+ "\n",
+ "The dataset has a quarter-hourly frequency (15 Min time intervals), but we resample it to hourly frequency to keep things simple.\n",
+ "\n",
+ "To keep it simple, we will not use any covariates and only concentrate on the electricity consumption as the target we want to predict. The conformal model's covariate support and API is identical to the base-forecaster.\n",
+ "\n",
+ "**Target series** (the series we want to forecast):\n",
+ "- **Value_NE5**: Electricity consumption by households on grid level 5 (in kWh)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "90b31843-8f60-4dd8-b6e4-87206d67e585",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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tM58aOC2225DtWrVsHz5chBCXO7Pm9+L5t5778Wvv/4qO6RaUfnjxo1DSEgIRowYgX///RdPP/10hfsMDg7GSy+9hPT0dLz++utOP3P16lUhRNenTx8UFhbiu+++E33ms88+E973BmfXNQA0atQIR44cEX325MmTHoelK+KXX34RXBbANtx8w4YNaNKkieD2ybke+PPyxRdfiF7/5ptvYDQavTpvZ86cQWxsrFNHm0dOu2SxWPDwww+D4zhs3rwZb7zxBt5//31s3LhRtE9XDpY7OI5DSEiISBRlZ2fj+++/F33u3nvvBQAsW7bM7f48qUNlhzlGDEn07dsXISEhePjhh/Hiiy+iuLgYy5Ytw40bNyTvY9SoUViyZAlGjhyJuXPnIikpCZs3b8bPP/8MwNZj5/noo49w77334p577sHo0aNRr1495Obm4sSJE/jrr7/w1VdfAQBat24NAPj4448RFRWFsLAwNG7c2GmPND8/H7169cIjjzyCFi1aICoqCvv378eWLVuEHmBkZCTef/99jBo1Crm5uRgyZAhq1aqFa9eu4fDhw7h27VqFDY0zGjVqhNdeew3/93//hzNnzqBfv36IiYnBlStX8Oeff8JgMGDOnDk4cuQInn76aQwdOhRNmzZFSEgIduzYgSNHjmD69Oluy7jzzjtBCMG+fftw9913O7x/4cIF7N271+H1uLg4l3PG3H777XjiiScwZswYHDhwAD169IDBYMDly5fx22+/oU2bNnjqqacQGRmJxYsXY9y4cbjrrrswfvx41K5dGxkZGTh8+DA++OADABCE1MKFC3HvvfdCr9ejbdu2ssXma6+9hs2bN6NHjx6YMWMG2rRpg7y8PGzZsgXPP/88WrRo4fR7fPnvvvsuRo0aheDgYDRv3lx4oFWvXh2PPfYYli1bhoSEBAwcOFBSfV544QWcOHECr776Kv7880888sgjaNCgAfLz87Fr1y58/PHHmDNnDm6//XY89thj+PDDDzFq1CicO3cObdq0wW+//Yb58+cjJSUFd911l6xzIeW6BoBHH30UI0eOxMSJEzF48GCcP38eb775pkNoSilq1qyJ3r17Y+bMmTAYDFi6dCnS09NFHSE592/fvn1xzz334KWXXkJBQQFuv/12HDlyBK+++iqSk5M9ClXx7N27Fz179qzQ7ZPaLr366qvYvXs3tm7divj4eEydOhVpaWl4/PHHkZycjMaNGwOwXY8bN27EsmXL0LFjR+h0OpedJJ4BAwZg48aNmDhxIoYMGYLMzEy8/vrrqFOnDk6dOiV8rnv37nj00Ucxd+5cXLlyBQMGDEBoaCgOHTqEiIgIPPPMM0Id1q9fjw0bNiAxMRFhYWGyc6EqHdrlfTP8GWej0lJTU4X5MOrVq0deeOEFsnnzZodRJfw8Rs64cOECefDBB0lkZCSJiooigwcPJps2bSIAhLk1eA4fPkyGDRtGatWqRYKDg0l8fDzp3bu3w+ifd955hzRu3Jjo9Xq38xgVFxeTJ598krRt21aYZ6d58+bk1VdfdZi/Ji0tjfTv35/UqFGDBAcHk3r16pH+/fsLQ40JKR95du3aNYeyXM1j9N1335FevXqR6OhoEhoaShISEsiQIUOEaQCuXLlCRo8eTVq0aEEMBgOJjIwkbdu2JUuWLCFlZWVOj4vHYrGQRo0aCcPjeSoalTZixAjhs65mvl61ahXp2rUrMRgMJDw8nDRp0oQ89thj5MCBA6LPbdq0ifTs2ZMYDAYSERFBWrVqRRYuXCi8X1JSQsaNG0fi4uIIx3FO5zFyBpzMY5SZmUnGjh1L4uPjhTlthg0bRq5cuSI6bvvr4eWXXyZ169YlOp3O6YionTt3EgBkwYIFTuviju+//57079+fxMXFkaCgIBITE0N69epFli9fTkpKSoTP5eTkkCeffJLUqVOHBAUFkYSEBPLyyy+7nMfIHnqEmdTr2mq1kjfffJMkJiaSsLAw0qlTJ7Jjxw6Xo9Loa52Q8nmH6FnVCXF+H/D1Xrp0KWnSpAkJDg4mLVq0IGvXrnU4Flf3r6t5jF566SWSkJAgzF311FNPuZzHyB77YyXENo0EAPLNN984fN4ZFbVLW7duJTqdzuF6zcnJIQ0bNiSdO3cWroXc3FwyZMgQUr16deF+IKTiuccWLFhAGjVqREJDQ0nLli3JihUrnLY5FouFLFmyhLRu3ZqEhISQatWqkW7duonmwTp37hy5++67SVRUFJvH6D84Qtz43gyGD5g/fz5eeeUVXLhwQZPZoisTixcvxrx585CVlYXw8HCtqxOQTJ06FcuWLUNmZqZHuTAMW7hn0qRJglPoz8ycOROfffYZTp8+jaAgFkRhsFAaw8fwDWWLFi1QWlqKHTt24L333sPIkSOZKFIA/mH04YcfYtq0aVpXJ6DYu3cvTp48iaVLl2LChAlMFFUB8vLy8OGHH+L9999nooghwK4Ehk+JiIjAkiVLcO7cOZSUlKBhw4Z46aWX8Morr2hdtUpBWFgYPv/8cxw6dEjrqgQc3bp1Q0REBAYMGIC5c+dqXR2GDzh79ixefvllPPLII1pXheFHsFAag8FgMBgMxn+w4foMBoPBYDAY/8GEEYPBYDAYDMZ/MGHEYDAYDAaD8R9MGDEYDAaDwWD8BxNGfoLVasXZs2clr6Re2ajqxw+wcwCwc1DVjx9g56CqHz+g/TlgwojBYDAYDAbjP5gwYjAYDAaDwfgPJowYDAaDwWAw/oMJIwaDwWAwGIz/YMKIwWAwGAwG4z+YMGIwGAwGg8H4DyaMGAwGg8FgMP6DCSMGg8FgMBiM/2DCiMFgMBgMBuM/mDBiMBgMBoPB+A8mjBgMBoPBYDD+gwkjBoPBYDAYjP9gwojhNXfeeScmT56sdTUYDAaDwfAaJoyqOAMHDsRdd93l9L09e/aA4zj89ddfPq6Ve2bPng2O4/Dkk0+KXv/777/BcRzOnTsHADh37hw4jnP6b+/evQCAnTt3On0/PT3d14fFYDAYDD8gSMvC582bh127dqG4uBjx8fF4+umn0b17d8yfPx+bN28WPmc2m3HbbbdhyZIlAIBOnTohLCwMHMcBAMaMGYOxY8cCAIqLizFv3jykpaUhKioKzzzzDPr16yfsKzU1FcuWLYPRaETv3r0xY8YMBAcH+/Co/YvHH38cDz74IM6fP4+EhATRe6tWrUL79u3RoUMHjWrnmrCwMKxcuRLPP/88mjVr5vaz27dvxy233CJ6LTY2VvT3v//+i+joaOHvuLg45SrLYDAYlZy9e/fi2rVr6N+/P3S6wPZcNK39iBEjkJqairS0NMyaNQszZ85EQUEBZsyYgd27dwv/kpKS0LNnT9F3v/vuO+F9XhQBwEcffYT8/Hxs2rQJ8+fPx4IFC3D+/HkAQEZGBpYsWYK33noLP/30Ey5duoSVK1f69Jj9jQEDBqBWrVpYs2aN6PWioiJs2LAB999/Px5++GHUr18fERERaNOmDdatW+d2nxzH4bvvvhO9Vr16dVEZWVlZGD58OGJiYhAbG4v7778fFy9elFzv5s2bo1evXnjllVcq/GxsbCzi4+NF/+zFcK1atUTv6/V6yXVhMBiMqsyZM2dwxx134L777sOkSZNACNG6Sl6hqWPUqFEjYZvjOJjNZly/fl3Ucz979izOnj3rMtxjz6ZNm7B48WJERkaiXbt26NGjB7Zu3Yrx48djy5Yt6Nu3L1q1agUAGDduHObOnesQkuExm80wm82i14KCghASEiLzSCvGarWK/vcVOp0Ojz76KNasWYNXXnlFcOE2bNgAs9mMsWPHYv369XjhhRcQHR2NTZs24dFHH0WjRo3QtWtXYT+EEFHdrVarw7HwrxUVFaFXr1644447sHPnTgQFBWHu3LkYPXo0jh49irCwMLd15m+6+fPno2vXrti3bx86d+4sOod0+c7qQtcJAJKTk1FcXIxWrVphxowZ6NWrl5zTqAhaXQP+RFU/B1X9+AF2DgLx+Pfs2QOLxQIAWL58OVq1aoVJkyZ5vD+1zoFUJ0tTYQQACxYsQGpqKkpKStCzZ08kJiaK3t+8eTPuuOMOREZGil4fOXIkOI5D165dMXnyZFSvXh0FBQXIyclBUlKS8LlmzZrh2LFjAGyqtlu3bsJ7TZs2RVZWFoqLi50+jFevXo0VK1aIXhs6dCiGDRsm+fjuu+8+XL9+XfLnlaBmzZr44YcfJH/+nnvuwVtvvYUNGzYI52f58uW4++67UVZWhiFDhgifHThwIL799lusWrUK8fHxAGzhy4KCAsGZA4Br166J/rZarcjJycH58+fx5ZdfwmKxiITY7Nmz0b59e3z99dfo3r272/rm5eXBbDYjNjYWKSkpmDJlCtauXYvLly8DsLlRHMchKysLAHD77bc73BCHDx+GXq8HIQTz589H69atYTab8e2336Jv375Yt24dunTpIvkcKklmZqYm5foTVf0cVPXjB9g5CKTjP378uOjvd999FwMGDPB6v0qfg8aNG0v6nObCaPr06XjhhRdw4MABZGRkOLz/888/O4x4WrFiBdq0aYObN29i4cKFeO211/D222+jqKgIer1eJHIMBgOKiooAACaTCQaDQXiPF1smk8mpMBozZgxGjBghek2uY3Tjxg1kZ2dL/rwS6PV6h3whdyQkJOC2227Dpk2b8NBDD+H06dPYv38/tmzZgvr162PhwoX48ssvkZWVhZKSEpSUlKBmzZpCGWFhYYiOjhaVGRcXJ/pbp9MhNjYWCQkJOH/+PM6fP4+2bduK6lFSUoKCgoIK6169enWEhIQgISEBb7/9Nm655Rb8+++/qFOnDgCgXr16SEhIEJyl9evXo2XLlqJ98AI8ISFB5A498MADyMvLwxdffIGhQ4dKPodKYLVakZmZiQYNGgR8jN5Tqvo5qOrHD7BzEIjHX1JSIvo7Oztb1jPIHq3PgebCCLA9yLt27Yp169YhMTFRcC0OHz6MgoIC3H777aLPJycnAwBiYmIwbdo09O/fH6WlpYiIiIDFYhE5QEajEREREQCA8PBwGI1GYT+FhYXC684ICQnxOmzGuypSsFgsiuS2xMfHy76YHn/8cTz99NNYunQpPv30UyQkJKBv375YtGgR3nnnHbzzzjto06YNDAYDJk+ejNLSUlEZHMcJf/Mju+j3+c/rdDoQQtCxY0esXbtWeN9qtSIrKwvt27evsO68y6TT6dC0aVOMHz8eM2bMEPLF+HL4/SQkJFSYoE3TrVs3fPHFF5o1SnTdqypV/RxU9eMH2DkIpOPn3Xoeo9EIo9GIqKgor/ar1TnwC2HEY7VaRQm4W7ZsQZ8+fdyKE/6kEUIQHR2N2NhYZGRkoHXr1gCAkydPCu5AYmKiyJU6deoU6tWrV2FOizccOHBA0uesVqswMkyLC2HYsGF47rnn8L///Q+ffvopxo8fD47jsHv3bgwaNAgjR44U6nnq1CkHB4YmLi5OdKOcOnVKcO0AoEOHDtiwYQNq1aol5JNZrVYEBwejWrVqsus+a9YsNGnSBOvXr5f9XWccOnRIcJ8YDAaD4R57YQQAly5dQvPmzTWojfdoJkeLioqwefNmFBUVoaysDL/88gsOHjwouEFlZWXYtm2baKg9AJw+fRonT56ExWJBQUEBFi9ejK5duwriKSUlBZ988gmMRiOOHj2KXbt2oW/fvgCAfv36Yfv27UhPT0dhYSFWrVqFe++917cH7qdERkZi+PDhmDFjBi5duoTRo0cDAJKSkrBt2zb88ccfOHHiBCZMmFBhaLB379744IMP8Ndff+HAgQN48sknRaPARowYgZo1a2LQoEHYvXs3zp49i7S0NLz22muyRqbx1K5dG88//zzee+89p+/n5OQgOztb9K+4uBgA8M477+C7777DqVOncOzYMbz88sv45ptv8PTTT8uuB4PBYFRFnAkjZ68FCpoJI47j8P333yMlJQV9+vTB6tWrMXfuXCFxeu/evQgNDXWYQyc3NxfTp09Hz549MXToUOh0OsyePVt4f8KECYiMjES/fv0wffp0TJ8+XRj9lpSUhMmTJ2PKlClISUlB7dq1RUP9qzqPP/44bty4gbvuugsNGzYEAMycORMdOnTAPffcgzvvvBPx8fG4//773e5n8eLFaNCgAXr06IFHHnkE06ZNE8KZABAREYFdu3ahYcOGePDBB9GyZUuMGzcOxcXFohGJcnjhhRccEvR57rrrLtSpU0f0j59OwGw2Y9q0aWjbti26d++O3377DT/99BMefPBBj+rBYDAYVY1Lly5Jei1Q4EigTzhQSdA6lKY1Vf34AXYOAHYOqvrxA+wcBNrxFxUViQY18bz11luYOnWqR/vU+hz4/1lnMBgMBoPhl9AhM3qwUSA7RkwYMfyOyMhIl/92796tdfUYDAaD8R+0MOrYsaPT1wMNvxqVxmAAtsVgXVGvXj3fVYTBYDAYbqGdoY4dO+Knn34CwIQRg6Eo9MzlDAaDwfBfaAGUlJSEqKgo3Lx5k4XSGAwGg8FgVD1oYcSP+rV/PdBgwojBYDAYDIZH0AKobt26qFu3LgDg5s2bwuoSgQYTRgwGg8FgMDyCDpnRjhEQuK4RE0YMBoPBYDA8ghc/oaGhqF69uuAYAYE7ZJ8JIwaD4TFlZWVaV4HBYGgIL4zq1KkDjuOYY8RgMKomhBAMHToUUVFRWLdundbVYTAYGlBSUoLc3FwAEJwi2jFiwojBYFQZ0tLS8PXXX6O4uNjjaf8ZDEZgYz8ijf4fYKE0BoNRhfjwww+F7cuXL8NoNGpYG21ZvHgx7r77bvzzzz9aV4XB8CkVCSPmGDEYjCrBpUuX8O2334peO3DggEa10ZbMzExMmzYN27Ztw4gRI7SuDqMKYTabceedd6Jp06Y4c+aMJnVwJoxY8jWDwahybN68GRaLRfTanj17NKqNtvz777/C9pEjRzSsCUMLCCGYM2cOHnnkEZ///rt27UJaWhoyMjKwbNkyn5bNYz+HEQBERUXBYDA4vB9IMGHEYDBkkZOT4/DaypUrA3YyN284e/as6G+z2axRTRha8Oeff2L27NlYt24d2rdvj/Xr1/us7Ly8PGFbK1FuP4cRDy+SmGPEYDCqBAUFBQ6vZWRkoFatWppZ+lpx6tQp0d8ZGRma1IMQokm5VZ0///xT2CaE4JlnnoHVavVJ2XRHRCth5CyURm8XFBQEZP4hE0YMBkMWtDBq0KCBsG0ymfDDDz9oUSUQQnD9+nWfl2svhE6cOOHT8gsKCjBx4kRERUVhypQpPi2bARw6dEj09/Xr1/H333/7pGxacGRnZ+Pq1as+KZfGlTAK9CH7TBgxGAxZ0MLo448/RqNGjYS/nYXZ1IYQgrvvvhu1atXCihUrfFq2lsKotLQUt956K5YtWwaj0Yh33nkH58+f91n5DDgVQb/88otPyrYPXR89etQn5dLwobLg4GDExsYKrwf6yDQmjBgMhixoYdS2bVt8+eWXwt85OTn4888/cePGDVXrcPPmTRw6dAiEEGRlZWH79u0ghOCJJ55QtVwaq9WqqTA6duyYQ3n/+9//fFZ+VcdsNuPYsWMAAJ2u/FG6fft2n5RvH6I6fPiwT8ql4UVPfHy86BwwYcRgMKoUtDCKjo4W9RSXLVuGrl27olOnTqolIlssFnTs2BEdOnTAokWLcOXKFVXKqYjLly/DZDKJXvOlMLpw4YLDa2vXrmX5Rj4iPT1duMaHDRuGevXqAQB2796NkpIS1cu3F0a+zjMihAgOca1atUTvBfqQfSaMGIwAw2g04tNPP0V6erom5fPCiOM4GAwG1KhRw+EzZ86cwb59+1QpPysrS0h6fumll3Dx4kXR+74aGeYs0To9Pd1hKgO1yMzMdHjt2LFjmoRUqiJ0GC05ORl9+vQBYMu1++uvv1Qv3z6U5mthZDKZhETzqKgo0Xu8SAS0CfF5CxNGDEaAMXPmTIwePRq9evVycCx8AS+MoqOjwXEcqlWrBr1e7/A5Zw9uJSgqKhL9/dlnn/mkXHuczXRtMpl8NjKNdoweeOABYfv777/3SflVHVqItG/fHrfccovwt71YVwN7x+jYsWM+XdT55s2bwra9MOrcubMwl9E333yD4uJin9VLCZgwYjACjCVLlgCwjUTZsWOHz8unhRFgc45iYmIcPkdPfqgk9sJo48aNor/PnTunSrk0FosFH3zwgfD3gAEDhG37kUpqQQujSZMmCds//fSTT8qv6tCjIBs2bOjz8JG9Y2Q2m/H+++9j2bJlPhEidPmRkZGi9wwGAx588EEAQH5+PjZt2qR6fZSECSMGI4CZP38+Jk2apJoIcYa9MAIgyjPiUSvfxl4Y2eOLkVlffvmlEMrs3r07JkyYILynhTC67bbb0Lp1awC2uXWuXbvmkzpUZfLz84Xt6OhokTDKyspSvXxn8wM9//zzmDhxIj755BPVy3fnGAHAo48+Kmx//vnnqtdHSZgwYjACjNDQUGH7jz/+wNKlS9GjRw+fhHAsFovQINPCyFmekVo5UBUJI184RvSDZ/bs2UhOThb+9pUw4kOGcXFxCA8PR//+/QHYkmK3bNnikzpUZewHIdB5NVo4RjTz58/3afn2jhEA9O7dG3FxcQBsy5cEEkwYMRgBhrOw1dWrV3HfffepnvhL9xIrcoxOnjypSn38QRjxQ5AjIyPRq1cv1K1bV3gI8NMIqElZWZngSjRs2BAABGEEAGvWrGGj01SGF0Y6nQ4Gg8HnoTR3M0rbjxJTg4ocI71eL+Rd5ebmipYw8XeYMGIwAgxnS3IAttDV8ePHfVZ2RY5RSUmJw1piSuAPwojvLUdFRYHjOHAcJ7hG169fVz2UcunSJWFEEC+MunXrhsTERADAjh07cNddd+Gzzz5jAkkl7AchREVFCc6JLx2jmjVrOrwXFBTks/IB544RADRp0kTYPn36tOp1UgomjBiMAKKsrMytMFB7CL8rYeTMMVKrPv4gjPjeMv1A8GU4jR55xy/LEhQUJAqh7NixA6NGjdIkQb8qwOcY0feBLxdP5R0jZ6KEnlTx+vXr+OyzzxSf76sixwhgwojBYPgAujECgJEjR2L16tXC30wY2RJf1ZzLiBAi9Ja1EkZ04jXvGAG2iQa7du0q+qxW811VdpwNQuDzjG7evCncq7/99hs++OADxRdT5fdnMBjw/PPPi967cuWK4CiOGTMGo0aNwtChQxUtnzlGDAbDL6CFybBhw/D555+jc+fOwmtaCSNnoTRAndXmKxJGVqtV1VF6ZrNZmC+G7ilr7RgBtqkTvv/+e3Tq1El4TYv16yo7paWlwhxizhwjwOYaXb9+HXfffTeeeeYZvPnmm4qVb7VaRY7Riy++iLFjxwrvWywW5OTkgBCCH3/8EYBtRm4lYY4Rg8HwC5wJk6SkJGGCRbWXpJDrGGkhjADni3sqBf1AoHvKSUlJwt9qCyN6LTr7HJPatWvjvffeE/5mwkh56PugWrVqwra9MNq1a5cgoF577TXFyqcndjUYDKhduzZWrlwpEkfZ2dnIzs4WfY93kZSAOUYMBsMvcNZLCw0NFZJu//33X0UbP3vs527h0coxCg4OFrYTEhKEbTWFEf1AoHvKOp0O7dq1A2CbSyk3N1e1OtBhGX6GYRpaqDJhpDyuOgj2wkita8CVKImPjxe2L1++7HD/SelUSEWKY1S9enWhbWDCiMFgqIKrBrlFixYAbA2fmssRSHWMOnbsCMCWC6P0gpp047569WoEBwcjLCwM69evF173lTCy7ynT4TQ168CEkba4ug/ouYxGjhzp4BIpJZRc/f60MMrOzhbWFORxN/eRXKQ4RkC5a3Tx4kWfLK6rBJoKo3nz5uGee+5Bz549MXz4cCEGmpqaiq5du6J79+7CP9oSPHbsGB5++GHcfvvteOKJJ0QZ+MXFxZg5cyZ69OiB/v37O0x0lpqaipSUFPTs2RNz5sxBaWmpbw6WwVCAioQRoG6ekdQco6ZNmwKwJSorPWSfFkadOnVCVlYWMjMzceutt6JOnToAbKJErWHqrkJpgO/yjOgHo7OHUvXq1cFxHAAmjNRASigNcFy3T6lQNy1KaGHEX/+ATRjZO0ZKCiMpjhFQLozUaAvUQlNhNGLECKSmpiItLQ2zZs3CzJkzhQuuS5cu2L17t/CPV8JmsxkvvvgiHnroIezYsQOtW7fGrFmzhH1+9NFHwtos8+fPx4IFC4QlAjIyMrBkyRK89dZb+Omnn3Dp0iWsXLnS9wfOYHiIK2HSsmVLYVvNuWukOkZJSUnCttLhNFoYRUREIC4uTsizad++PQBbz3zHjh24//77sXTpUkXLdxVKo8sHoOoK6xU5Rnq9XpgIlAkj5XEVUu7UqROaNWvm8ntKCSNXwph2jF566SW88cYbou9p6RgBwJkzZxQrX000FUaNGjVCSEgIANtoCrPZLFqYzxkHDx5EeHg4Bg0ahNDQUIwfPx7Hjx8XXKNNmzbhiSeeQGRkJNq1a4cePXpg69atAIAtW7agb9++aNWqFSIjIzFu3Dhs3rxZ3YNkMBTElTDp16+f0DitXbsWq1at8mn5kZGRwszLixcv9qkwoqGFyV133YXvv/8ezz77bIXtihzcOUatW7dGeHg4AGD79u149tln8eSTT4qSZZWgImEElItVJoyUx9V9EBoaiqNHjzoMn+dRagJWV44RLYwq+p63uLsPaAIxAVv96TErYMGCBUhNTUVJSQl69uyJxMREHDt2DIcPH0afPn1Qo0YNDB8+HEOGDAFgU5x0oxseHo769evjzJkzMBgMyMnJEb3frFkzHDt2TPhut27dhPeaNm2KrKwsFBcXIywszKFuZrPZYT6UoKAgQcwpCZ8wq2birD9T1Y8fkHYO6J5qZGSk8NnatWvjo48+wogRIwAAs2bNwsiRI0XJyUrgqnwA+P7773HlyhXEx8fj999/F17PyMiQ/LtKOQe0MAoLCxN91n4OH8A2dPnMmTMuE8TlQj8UDQaDqPygoCB0794dW7duxdWrV/H+++8DsC3yOnLkyAr3LfU+4IURx3EIDQ11+vnY2FicOnUK+fn5MJvNPpkNWQkCoS2gl7ewvw+CgoLQr18/vP322w7fO378eIXHJeX4aVFCX4MVLQVSUFCg2HnlRVZYWBh0Op3L/TZu3FjYltoWqHUN6HTSvCDN75Tp06fjhRdewIEDB4SeZYcOHbB+/XrEx8fj+PHjmDZtGmJjY9GrVy+YTCaHHpLBYIDJZEJRURH0er1I5BgMBqEhtf8ur3JNJpNTYbR69WqsWLFC9NrQoUMxbNgwZQ7eCfYx6apGVT9+wP05oBOri4qKRCvJd+vWDX379sW2bduEMPG9996raN2uXr0qbOfn5ztdyf78+fOihW6PHj0qe8V7d+eAHqp+5coVIZcGAG655RZ06dIFf/75p+g7hw4dEtYy8xZ6csWSkhKHY+vYsaPgUvNs3LgR3bt3l1xGRfcBfw7Cw8NF9aHhnSsAOHz4sNOlI/wZf24L6HNuNpsdrgFXAkXOveDu+Ol9OLsGXXH27FnZ96Ir+GvQYDC43SfdFvzzzz+yylf6GqBFmjs0F0aALR7etWtXrFu3DomJiSJXp3Xr1njooYfw66+/olevXggPD3eYQdRoNCI8PBwRERGwWCwiB8hoNAp2u/13ecVLNyA0Y8aMEXrgPGo6RpmZmWjQoIFkVVuZqOrHD0g7B7QIaNasmWiIOgBMnToV27ZtAwBMmjQJ48ePx1tvveXW6pYDnbvUvHlzl/dCw4YNYTAYYDQacfnyZYd6ukLKOeAnV4yIiECjRo0c3l+3bh2Sk5NFzo7ZbJZch4qgjzkhIcFhv0OHDnXI7ahWrZqk8qXeB7yTHRkZ6XK/9evXF7YjIiIUO361CYS2gK5XkyZNJJ/bK1euoGHDhqL72B4px0935OvXry8q/6677sL27dtdfk+p66C4uBiALZTobp8NGjRAWFgYiouLJbcFWl8DfiGMeKxWq9OhxvRFlJiYiG+//Vb422Qy4eLFi0hMTER0dDRiY2ORkZGB1q1bA7Ct8M3P8ZKYmCjKdzh16hTq1avn1C0CbA2gGiLIHTqdzm8bA19Q1Y8fcH8OaAu9WrVqDp/r27cvkpKShOt8xYoVaNGihcucB7nQozhDQ0PdNvCNGzcW9RDl/K7uzgHvAEdERDj9TGJiIvbt24cZM2YIbUVWVpZi1xXduYqOjnbYLz+XEc3FixcVO366DgaDweXnaIfoxo0bAXdf+XNbQN+H1atXl1xPi8WCsrIykYviCnfHT+es2V+D33zzDbZt24Y+ffrg888/x8svvyxcL0VFRYqdU/4cREVFud2nTqdDYmIijh8/LiRfS62DVteAZlddUVERNm/ejKKiIpSVleGXX37BwYMHkZycjD/++EOw6dLT07FhwwbBhu7YsSNMJhNSU1NhNpuxcuVKtGrVShimmJKSgk8++QRGoxFHjx7Frl270LdvXwC2BNXt27cjPT0dhYWFWLVqleKhBgZDTVwlffLodDrMmzdP9No///yjWPm8MAoKCnIrioBy29psNiu6qCYtjFzRokULkWuj5NxO7kalAbbfYOLEiaLXlA4JuFtAlIfNZaQerobr03z55ZcAbJOQ3nLLLcLrSiRAu0q+BmztwuDBg1G9enU888wzWLt2raJlA7Z2gJ+TSIobzSdgl5SU+GSBXW/RTBjxa/qkpKSgT58+WL16NebOnYukpCTs27cPw4YNQ/fu3TFjxgw89thjgrgJCQnBm2++ibVr16JXr144fPiwaBKtCRMmIDIyEv369cP06dMxffp0wW5PSkrC5MmTMWXKFKSkpKB27dqiKdQZDH+HbpBdzR0ybNgwURxfySGyvDCSktRNx/OVrIMUYQSIJ9tTUhhJGY2zaNEirF+/XgjTZ2ZmKjaFgtVqFRwDVyPSACaM1MTVcH2aIUOG4JdffsFff/2FVq1aCa8rsZhsRfNY0dDvKyWMKuoc2BNoI9M0C6WFh4dj+fLlTt+bMmUKpkyZ4vK7t9xyi2iWW5qwsDDMnTvX5XcHDhyIgQMHyqssg+En8MIoIiLC7Sijhg0bombNmrh+/bpmwogPYQO2pM8ePXooUgepwigyMhLVq1dHXl6eao6Rq4dSREQEhg8fjtWrV+Pnn39GcXExcnJyFEmApkflMWGkDRU5t4Ct89+7d28AyosTd46RPWoLIzmOEWATRj179lSkHmrhnwFcBoPhFL5BdtUY0/COjZJT8XvqGCk1421paako+boi+ATkixcvKubYyOktN2zYUNhWKpwm9aHIhJF68PehXq+XdB3Sv5MSjpG7ubzsUUMYSZ31mifQHCMmjBiMAEKOMOIdG0KIYkN0tRZGch4IQLkwKikpUUwcSJ3YDrCNyOFxNaxeLlImdwSYMFIT+j6sKNcOUF6c0PPrVZTI7Q+OEX0f0Et4+StMGDEYAQIhRHgoyxFGgHI5PoEqjADl8oz4h4Jer6/woUQ/EJRyjJgw0h4+x0iKWwIo7xjRo0MruhfpOmrlGNEh5EC4FpkwYjACBJPJBIvFAkBaY2Sf46MEcoRRZGSk0CBWRmEUFRVVoVugpTCiZ/pWalV3hg1+Dh8p1yCgrmNU0b1Il00LGm+Q6xjR16KSy/OoBRNGDEaAwDfGgOtJSWm0doyActcoKytLkTwnb4SRUsKEf7jIDSGoIYzc1SE8PFz4neglLBjewwsTqfeBlo5RSEiI8BmlHCM5oTy+DrzLzRwjBoOhGHRjJGXiUX8SRoQQRRwbucKIXppBqQaZdowqgp4yQKncCqmOEcdxiImJASBeRoXhPfx9IHUCYPp3UkKc0MJISh14Aa3kPEY8UtuCQFrUmAkjBiNAkCuM6tevLwzpV1oYSV2Q1H72ZW+RK4yqV68ubCvhmhBChIeLFMcoIiJCCLfRdfcGOUO1mTBSHqvVKoS0pYoC+lrxtWNEl6+UMOJHhgLS2wJeGOXm5vr1AsEAE0YMRsAgtzEMCgoShIkSvTRCiGzHiH8wA5VDGBUVFQnD/qUII47jhCWH6GUcvEGqYwSUn/+bN2+KHmYMz/HELVHTMdJCGHlyDvi2yGq1+n1olwkjBiNAkOsYAeXCQImGiO8lA9IbQ1qYVAZhJHfGX6A8H4zOEfMGOcKIPn56tmaG58gNYwHqOkZ6vV5y+YWFhYrM5+WNYwT4fwI2E0YMRoDgjTC6efOmSNh4gie9RNoxUsqx4dFaGFUkSnh4YaSlYwSwcJpS+INjRCd/S5lHiRfxhBBFrkNaGMl1jAD/zzNiwojBCBC8EUaAeBkDT/BWGGnhGEVGRgqrcyshjOiRdVJG4wDwi1AawISRUsgZKs+jlmPkiWOlxJB9ui1gjhGDwdAMT4SJko6J1uUDYnEhZcoCjuOEOighDDw5B2o6RhXlOTFhpDyehNLUyjHyRJgpUb4njlEgTTjKhBGDESB46xhpIYyUfjB7cg74OighzLwVRkrkd3gyKg1gcxkphSfXgFqOkVbCyBPHiIXSGAyG4ngiCqpVqyZsa+0YaSWM6AR0b4WJN8KIHtXnDZ4mXzPHSBk8CaWFhYUJuUCVzTFioTQGg6EZge4YaeXY8OfAarV6/VDwRhgByoTTWI6RtngSSuM4ThAnSjhGcmfepjtISrg13gzXV6oOasKEEYMRIHjr2Hg7XNuT8unVx7V2jABtxCGffA1oK4xYKE0ZPLkGgPLfSgvHSOmlaZhjxGAw/IJAFAU6nU7orWrtGClRB0/cArUcI47jKkxAZ46R8ngqjJR0jOSOSmvYsKGwff78ecXKB1jyNYPB0JBAFEZ0HaqqY6SWMKKXG3EFyzFSHk+uQUBbxyghIUHYvnDhgtfle+IYhYeHC1NsMMeIwWAoQiCKAkA8KkyL5GetzwEtjJSY/ZqfS4kO0bmCOUbK461jZDabvU7ClyuM6tevL2xr5RgBgbOQLBNGDEaAEIij0oByYVJWVuZ1GCEQhZHSOUb8dSDlGoiKilJ0gkuG9zlGgHfhNIvFIizCKucajI+PB6CdYwSUz8CtRDhRTZgwYjAChEAUBYCyrkUgumZKh9J4x0jKzNs6nU7RUCbD81CaUnMZeXof8nlGly9fFh2DJ3gywSNQLg7pxZj9ESaMGIwAwVtRoMWoNPs6aD2XUmUQRnIcI0DZHC+GMo6RN3lGnpbP5xkRQnDx4kWPy7evgxzHiM8xslqtXoszNWHCiMEIEDwRRmFhYcJnmWNUNYURnePFh2AYnuNtjhGgnGMkx7FScmSap44Rvb4hve6hv8GEEYMRIHgiCui1wrwVBZ42hloLEyVHZvlD8rWnwkiJCS4Z3o9KA7R1jADv84y8dYwAJowYDIYCeNogKjWPEHOMtE++tlqtgkCVkmMEsJFpSuNPjpEnOUaAso6Rp8LInxOwmTBiMAIET3uqvDDIz8/3KpTiD8JI62VJtA6leSsMmTDynkDNMaKFkbezX3taB+YYMRgMRfFWGBFCcPPmTY/L99axArxPAPfkHERERECv1ytefqAII+YYKYun9yEtCry5Djy5BgGxQPamHQCUcYyYMGIwGF7jrTACvBMGSvSUvW0M+TpwHCeInYqgl87wNscnEB0jtl6asmjtlniafK3UPEr2dWCOEYPB0AwlHBtvHoz+JIzklA+U5/l4K0y0Tr7m5zACWI6RVmgtCrSeYBJgjhGDwfATAnViOSUTLuWOyOLhxYkWwkjJ5GuWY6Q9SoTStBBGtED3VpSw4foMBsMvUGKYsNbCSCvHSEth5E+hNCaMvEfr+8DT8nU6nVAHJUNp/JIzUmDCiMFgKEqgCiMlQ2n+5BhJrYNawsiTUBrLMfIerR0bT8sHyu9FpUJpwcHB4DhO8veYMGIwGIri6WgUpUJZ/hBK89YxMpvNsFgsXpcvpw5KCiM6x4g5RtoQqKPSAOWEEX8fyMkvAgJHGMk7KoWZN28edu3aheLiYsTHx+Ppp59G9+7dkZqainXr1uHixYuIiYnBo48+iiFDhgjf69SpE8LCwgSlOmbMGIwdOxaALblx3rx5SEtLQ1RUFJ555hn069dP+G5qaiqWLVsGo9GI3r17Y8aMGbIvLgZDC5QYjaJFT1XJxtBTx4jO8ykpKRHVSQ7e5hh5m3zNQmnao/V94Gk7ACjvGDFhpAIjRozACy+8gJCQEBw7dgyTJk3CDz/8ALPZjJdffhktW7bE+fPn8dRTTyExMREdOnQQvvvdd9+hZs2aDvv86KOPkJ+fj02bNuH06dN47rnn0LJlSyQkJCAjIwNLlizBBx98gIYNG2Lq1KlYuXIlnnzySV8eNoPhEYEaStPpdAgLC0NxcbHmOUaArbfuS2GkdY4RPSqRCSPv8Sdh5KljxK9uLycM5qwOcssPFGGkaSitUaNGws3NcRzMZjOuX7+OwYMHo02bNggKCkKTJk3QpUsXHD9+XNI+N23ahCeeeAKRkZFo164devToga1btwIAtmzZgr59+6JVq1aIjIzEuHHjsHnzZtWOj8FQEk8tdK2FEQDFkz49zTECvBMn/jQqTWqOUVBQEKKiogCwHCMlUCKkrZUw4utACPHqWmSOkcosWLAAqampKCkpQc+ePZGYmCh632Kx4NixY0hJSRG9PnLkSHAch65du2Ly5MmoXr06CgoKkJOTg6SkJOFzzZo1w7FjxwAAZ86cQbdu3YT3mjZtiqysLBQXF4saLx6z2Sy6CQDbhSC3UZYCv1RDVV39uqofP1DxOeCvRZ1OB47jJJ8r+touLCz0+BzT94Jer5e1H4PBgNzcXBQVFbn9ntRzEBwcLKt8+hwYjUafnwPeMTOZTF4dP/0wk3MOYmJicPPmTdy4ccPv7zF/bwvoayAoKMij+9DdfVDR8dN5ZnLKB8TC5ObNm06fe1KgHSM55dMdFHf3oVrXgNQRdJKE0YoVK2RXYPz48ZI+N336dLzwwgs4cOAAMjIyHN5ftmwZ4uLiRIJmxYoVaNOmDW7evImFCxfitddew9tvv42ioiLo9XrRj20wGARlajKZRL1nfn4Xk8nk9AJZvXq1w7EPHToUw4YNk3RsnuDtGjaBTlU/fsD1OeDdluDgYFmLQNLT/2dnZ3u8gGRubq6wff36dVn74Xu2hYWFkr7n7BwQQoSeqtVqlVU+nXB9+vRpjzs3BQUFwnZ2drZoPhd3hIaGori4GAUFBR4fPwBkZWUJ20ajUfI54Nu9Gzdu4Ny5cx6HUHyJv7YFtOt29epVyeKCEAKdTger1YobN25U+Nu5Ov7s7GxhW+r1xEP/7idPnvTYtaHFmZzy6VCulDZE6WugcePGkj4nSRh9/PHHsm8kqcIIsPW8unbtinXr1iExMVEQQV9//TV27NiBVatWicpPTk4GYOsFTZs2Df3790dpaSkiIiJgsVhEDpDRaBRUcnh4uMjK5xfyo1UszZgxYzBixAjRa2o6RpmZmWjQoIGseSEqC1X9+AHp5yA0NBQJCQmS90svA6LX62V9l4Z+ADRs2FDWfvg8F5PJ5PZ77s4B3VOPioqSVT6dj1ijRg2PzwEdOkhMTBQlNrsjIiIC+fn5sFgsHh8/IM4Xql27tuTjqFWrFk6cOAGz2YxatWp5nGPlC/y9LaDDV40aNUKDBg0kfzciIgKFhYVur4OKjp8PiwJAfHy8rGs5Li5O2K5evbrH9wHv5ISHh8vaB33dEUI8PgdqIzmUFhERgebNm1f4ufT0dI9jl1arFRcvXgQAbN26VXBs6Jlb7eFPGiEE0dHRiI2NRUZGBlq3bg3Apor58FxiYqLIlTp16hTq1avnUvGHhISoIoLcodPp/LIx8BVV/fgB1+eAHpEl5xzRDWlRUZHH55d2R0JDQ2Xth3csysrKYLFYKsyNcHYOaNcnODjY44nlSkpKfH4O6HmUpHzH1TVAlx8WFia5fFrAFRQUiGZD91f8tS3w9DcAyoWRlPvQ1fHT94Hc+5D+3aVei86gc4zULF+ra0CyMEpMTMRHH31U4efGjBkj5PS4o6ioCGlpaejZsydCQkKQlpaGgwcP4tlnn8XevXuxaNEiLF26FHXr1hV97/Tp07BYLGjSpAmMRiMWL16Mrl27CgImJSUFn3zyCebNm4czZ85g165dWLNmDQCgX79+mDBhAh544AHUr18fq1atwr333iv1FDAYmkLn18jBn5I++TrQzodUPB2VB2ibfE2Xr8U8RoDjkH37dpUhHSXuA61HpQHeDYSgJ3iUg5LLkqiJJGE0YMAA1K9fX9IOb7/9djRq1KjCz3Ech++//x4LFy4EIQQNGjTA3LlzkZSUhEWLFqGgoECYmwgA7r33XsyYMQO5ubl44403cPXqVRgMBnTp0gWzZ88WPjdhwgTMnTsX/fr1Q3R0NKZPny7UJykpCZMnT8aUKVOEeYzoMhgMf8bTEVn+MCrNvg6eCCNvyldKGHk6IokWRt4Mk/ZUHLK5jJSDCSPPJ3hUcuoONZF0VK+++qrkHY4bN07S58LDw7F8+XKn77lzpjp37oyNGze6fD8sLAxz5851+f7AgQMxcOBASXVkMPwJTyc39AdhpIRr5U+OkVyLny/farWitLTU4xC9p+eATkdgQ/a9w5vrkBZGngpkfxBGnjpGgO0cVAphZA+fGJWbmwtCiOg9ehJGBoOhHJ4KI71ej9DQUJSUlPiFMPK0Dko5Rt7MPu3pxHb2s18rIYykzmMEMMdISZS4D7wRyEosCQJ4fh9aLBbhuS/XMQJs54CfusNfkX1U//zzD/7v//4Ply9fdniP4zjs27dPkYoxGAwxnuYYAbbGqKSkxC8sfE/r4M1SCEpNsqjUjL/R0dEele9pjhFdHj19A0M+nrqGgON14IkwUmJJEL58T6CTzz0VRt6U7wtkp3svWLAAly5dAiHE6T8Gg6E8hBCPHSNAmTWS/CmUplWOkafCiBYm9FxIcvE0jKPksiRVHW/uQyXuA61Dad6UDwSGMJIt986dO4egoCA899xzSExMhF6vV6NeDAaDgh6iG4jCSOsGWWlhJPc3oHN8vAllMWGkPZ6KY6ByCCOlHCOz2YyysjKP9qE2smuUmJgIk8mEhx56SI36MBgMJ3iT8Akos1aZPzlGWidfyz1+pZKfPc0xYsJIObwRRkoMVw/kXD/7OphMJtE8a/6C7FDa1KlTkZ2dja+++kqYOZrBYKiLt8KInmCRbtjkoGRuhTflA4GXfE0nP3sjjDzNMWLCSDmqeihNKccI8N9wmqSj6tKli8NrixYtwqJFi0SvseRrBkMdvMmvARwbRHezybvCm56yEg2yN+JQ6+RrNRwjJoy0QetQmtaj0pR0jPxVGEnq9rlKtGbJ1wyGb/BmJAqgbIMYiLkV/hRKYzlGgY0/3QdazGnGHKP/kDPBI4PBUB6lcoyAwBVGLMeI5Rj5AyyUVi6MKqtjJHlJEAaDoR1K5RgB3jfInvQStbbwK4swYjlG2qN1B0FrYUSX761j5M1gEDWRfFT9+/dHhw4d0K5dOyQnJ6NJkyZq1ovBYFAonWPkCYH8QFAi+Zqe8Ver5GsWStOeQL4PgoODERwcjNLSUr9wjLwZCKEmkoXR1atX8fPPP+Pnn38GAERFRaF9+/ZITk5G+/bt0bJlSzanEYOhEoGeY6SEY6V18rU3DyQWSqscEEIEYeBtKE2L6xCw3Yt5eXmaOUZKDYRQE8lH9eCDD+LQoUM4d+4cCCEoKCjA7t27sXv3bgC2m7RNmzZYunSpapVlMKoqSuYYedtT9baXqEUoLTg4GDqdDlarVZMHUnR0NDiOAyFEk+TroKAgBAUFoayszG8fRoGAP4zIUiKs7o0w8jb52n7dQH9E8lG9/PLLAID8/HwcOnRI+Pfvv//CarWiuLgYBw4cUK2iDEZVRskco0ANpXlzDjiOQ3h4OIxGoybCSKfTITo6Gvn5+YrkGHEcJ9uhDwsLQ2FhIRNGXuAPwkgJxwjQbrh+pRJGPNWqVcOdd96Jli1bomXLlvj999+xbds20ZIFDAZDWQI9x0jpRWQ9nXXYG2Hk7W9QvXp1r4URPSKK4zhZ3w0PD2fCyEv8ybkFtFmrjDlGFOfOnRNcor///hvZ2dkAbDHXkJAQtG3bFh06dFCtogxGVSbQHaPQ0FAhlKTFBI9AeZ6Np42xtw+kmJgYnD9/Hnl5eSCEyBY2QPk5kJNfxMMfPxNGnuNPjpFer/foGuKFSWlpKaxWq+xZ7JljRDF06FDhR4iIiMCtt96KDh06oH379mjdurVfLgTHYFQWvE2+9rZBtlqtsFqtADxrDDmOQ0REBIxGo6aOEaBd0iufgG02m1FcXCxKiJaKN3PoMGHkPUoKIy06KIBYmJSUlMi+Dplj5ISYmBgMGjQIHTt2RLt27UQHyWAw1EFrx8jbBwLgfSjLW3HIt1VaCyPANvu1J8KIzzFiwkgb/Gk+MSWEkScC3dvh+oEwQlLWqLS///4bZ8+exZo1a7BmzRrodDo0b95ccI6Sk5MRHR2tZn0ZjCqJ1jlGSgkjwPPG0NtzwJdfUlLidQjBk4ei/ZD9unXryt6HEo5RaWkpLBYLm17FA7y9DyIjI4VtTxdh9+YaALx3bJQcrh/wjhE/Kq2goEDIM/r777+Rnp6OEydOYO3atWwRWQZDJbR2jLztJQLah7LsJ3mkwxq+KF+JuYyUyDECbL8B/ZBmSEOJa5DPtfNUGCntGMnF27agUgkjnujoaPTs2RPNmjVDUlIS9uzZg+3bt7NRaQyGimid9OlvjpE3jgmgjTBSYvZrJRwjgAkjT/H2GtTpdDAYDCgsLAxYYcQcI4pz587hr7/+EkamXb16VXiPnyafwWCog7cJj0qG0jwdaEGHsjwZlaWkY+SJOFM6x8gTlMgxAvw3t8PfUaKDoLUw8nZ5HJZ8TUGPSqOFUK1atYRlQdhwfQZDHWhHVgthpEQozdukT297694uRaC1MLJYLMJ1wISRNighjCIjI3HlypVK4RixUBpsgqhBgwZITk4W/tWrV0+tujEYjP+ghYknSbPeDhP2tpcIOD6Y5QqjQHeMoqKihG1PHop0+UrkGDHk420CPlCegO1t8rU/5Bh50hYEwnUo+ajeeOMNJCcnIzY21uVn8vLyRL0iBoOhDLRj5Ikw0ul0CAsLQ3FxsUc5RmoII7komWOkhTDydqi21sfPUCakzAujkpISlJaWyr6W+HuROUbqIXm86l133YXY2Fi88cYbTt/Pzs7G448/rljFGAxGOUoIE2/WSPIHYaT0qDRfl+9tOJPPLwKUST5nyEeJkDKd9O7Nvejpfai1Y1SphBHPxo0bsXDhQtFr586dw+OPP47MzEzFKsZgMMrx1jECKpcwCkTHyNuRgcwx0h5vQ9qAd3MZWa1WIcdXCWGkxX0QFBQkzCFWaYRRWFgYvvnmGyxatAgA8M8//2DcuHG4evUq6tSpo3gFGQyG9sLI2+RvwPueorcTPGr9QPDWMaKPn+UYaYMS94E3wsgf7kNvO0kcxwl18FdhJPuoPvzwQzz77LP46quvcO3aNezbtw9FRUVo2rQp3nvvPTXqyGBUeZRwbOhVteUOl/c3xygQk6+9TYBXMpTGhJFnKO0Yyb0OlLgPtZ7gka9DUVGR3woj2Y5R27Zt8dFHH6FatWrYuXMnioqK0LlzZ3zyySeoWbOmGnVkMKo8SjpGFotF5D5IwR+EkdahJCWXZfE2lFZZ16jyd7R2jPxBGCk5p5m/CiNJR7VixQqH1zp16oTt27cjIiICrVu3xtq1awEA48ePV7aGDAZDkQbZPpQjJxzjD8Koqidf078Bc4y0QQnHiL4OAlEYKTmnmb9eh5LO7Mcff+zUduc4DiaTCWvWrBFeY8KIwVAepRvkoqIi1KhRw6Py/cEx8uQcaC3MgoODodfrYbFYNJkygQkj7/Enx8jTdsAfHKNKkWMUHx8ve/p+BoOhHEqE0rzJcfEHYUTP3+JJe6T1qDiO42AwGFBQUOC1Y+TJNeBt8jlD+1Fp/uYYVWlhlJqaqkrh8+bNw65du1BcXIz4+Hg8/fTT6N69OwBgzZo1+OKLL2C1WjFo0CA8++yzQmN47NgxzJ07FxcuXMAtt9yCOXPmCCPiiouLMW/ePKSlpSEqKgrPPPMM+vXrJzqWZcuWwWg0onfv3pgxY4bHdiCD4SuUnMcICOykTyUmttPCMQJs4lQJYcQcI21Q4j4I9FFpStwHfB0sFgvKyso8Pha1kJR8XVhYKPkEFhcXS/6xR4wYgdTUVKSlpWHWrFmYOXMmCgoK8Ntvv+Hrr7/GmjVr8OWXX+K3337DDz/8AMBmp7/44ot46KGHsGPHDrRu3RqzZs0S9vnRRx8hPz8fmzZtwvz587FgwQKcP38eAJCRkYElS5bgrbfewk8//YRLly5h5cqVkurKYGiJksnXQGA7Rv6Q4+StOPUklObtQ5EJI+9R4j5kjpH/T/IoSRj16tULEydOlLTDp556Cn369JH02UaNGgmWNMdxMJvNuH79OjZt2oQhQ4agfv36qFmzJkaOHInNmzcDAA4ePIjw8HAMGjQIoaGhGD9+PI4fP47Lly8DADZt2oQnnngCkZGRaNeuHXr06IGtW7cCALZs2YK+ffuiVatWiIyMxLhx44T9Mhj+jNLCSO6DubIJI62STrWcZJMJI+/R2jHyB1GihGPk77OwSz6zZrMZ2dnZkj7Hz8wphQULFiA1NRUlJSXo2bMnEhMTcfbsWaSkpAifadasGT788EMAwJkzZ5CUlCS8Fx4ejvr16+PMmTMwGAzIyckRvd+sWTMcO3ZM+G63bt2E95o2bYqsrCwUFxeLLhb6WOyHNQcFBXm8eKA7rFar6P+qRlU/fsD9OaAbI51O59F5ohujmzdvytqHfeKzJ+XTo+CKioqc7sPdOaCFkVrlu4P+DTw9B3yeV3FxMcrKyoQZgHncHT/9G3hyDXh7/L7Cn9sCWph4eh/SuX7O7kOp14Cn1yD9/DKZTF7dB56eA/paNBqNDgNB1LoG7O83V0gWRidPnsR9993ncYVcMX36dLzwwgs4cOAAMjIyANhuWlpVGwwGoYdrMplEPV/+fZPJhKKiIuj1epHIcfddvgyTyeRUGK1evdphqoKhQ4di2LBh3hyyW6r6sipV/fgB5+egoKBA2L5y5Yro/pAK3TO7cOGCEGKWAt0pKigokPVdnvz8fGH7ypUrbvfh7Bzw9ec4zqPyc3Nzhe2cnBzZ+8jJyfHq+4C4YU5PT3doy3icHT/vigM2p0GL+vsSf2wLrl27Jmzn5uZ6dA7pezk7O9vlPpwd/4ULF4Rtk8nkUfnXr18Xtm/cuCF7H/R9fPXqVY+MAtoBP336tEsBpPQ10LhxY0mfkyyM5LhAckeM6PV6dO3aFevWrUNiYiIiIiJEFqPRaBRUdnh4uIMNbTQaER4ejoiICFgsFpED5O67fBl0T5pmzJgxGDFihOg1NR2jzMxMNGjQQLKqrUxU9eMH3J8DWrg3bNgQCQkJsvffoEED0f7k7KN69erCdq1atTwqn34wBwcHO92HlOsgNDTUo/LpXirHcbL3Qff069Wr51Ed6J5xbGwsateuLXrf3fHT361Zs6bs8mkx7cnx+wp/bguio6OF7Tp16nh0Du2PyX4f7o7/xo0bwnb16tU9Kj8mJkbY9uQ6oJ9/CQkJqF+/vuw6xMbGirblnANfIEkY8YnPamO1WnHx4kU0btwYGRkZuOOOOwDY3KrExEQAQGJiIr799lvhOyaTCRcvXkRiYiKio6MRGxuLjIwMtG7d2ul3eVcKAE6dOoV69eo5dYsA2wWghghyh06n87vGwJdU9eMHnJ8DuocVHBzs0TmKiooStouLi2Xtg+7ReVo+7Y6UlJS43Yezc0CH0rwtX+7xA+LfIDQ01KM60OLEXR2cHb+3vwF9/CaTye/vM39sC5S4D2lxZTQaZV0DtEHhi/vQGUrcB7QZYTabZZ0DXyCpxDp16sj+VxFFRUXYvHkzioqKUFZWhl9++QUHDx5EcnIyUlJS8M033yArKwvXr1/H2rVrce+99wIAOnbsCJPJhNTUVJjNZqxcuRKtWrUSykxJScEnn3wCo9GIo0ePYteuXejbty8AoF+/fti+fTvS09NRWFiIVatWCftlMPwZNo+R9snXSo5KA3z/G4SHhwtuviej4hjKz0CvRfK1t6vbKznBo6d1UBvNJg/gOA7ff/89Fi5cCEIIGjRogLlz5yIpKQlJSUk4deoUHnvsMVitVtx///1CflNISAjefPNNvP7661iwYAFatWqF1157TdjvhAkTMHfuXPTr1w/R0dGYPn06GjVqBABISkrC5MmTMWXKFGEeo7Fjx2px+AyGLNRYEkQO/iCM+AbZ0/L5HrbVavVKmHlTB6XEqSfimOM4REREwGg0ejQqjqHMBI8hISEIDg5GaWmpJvchv7q9p4u4KrkkCMCEkYjw8HAsX77c5ftjxozBmDFjnL53yy23YP369U7fCwsLw9y5c13ud+DAgRg4cKC8yjIYGqP0kiCBKIy8dYw4jhPyDL0VRt4O1we0mTLBYDAwYeQFSnRQAFtI9caNG5osCQJ4t7q9kovIAv4pjPwrgMtgMJyidChNi4eytzNPeyuM6DpoNcGjN46Rkq4hE0aeoZQw4XPNtAilAd4tyeEPbYHaMGHEYAQAlWFJEDpZVG5jSAjxekkQoLynqlUozR8cI4AJI09RSph4KoyUcqy8EUZVIceICSMGIwCoDEuC8KEsQH5jSI/I8uaB4Gn5gDKhNC1zjIDya8CTif0YytyHgFgYyZkKx58cI29GjPm7MPLozP7555/Yv38/cnJyRD8qx3GidcsYDIYyKJ18rYVbAcDjHB8lywe0XysN0Eac2g/ZdzXBJMM5SgsT3gmVKrT9QRjx94E3zm2lE0YrV67ERx995PA6IYQJIwZDJZRwC+jGSIuHMuC5MFG6/OLiYqHN8mUdvBGnSohje8eKCSN5KBXKokWF2WzWTBiVlpbCYrHIalOUzPUDKokw+uabb0AIQVBQEGrUqOGVnchgMKShhIWv0+kQERGBoqIizYSRp8nPSgsjwNYgu5r1vqI6aB1K08KxYiiXfE1PHGw2myULVCVHpfEUFxfLEshK5vrx5fsbsu8uo9GImJgYfPnll6JlAhgMhnrQwsibmWD5tQOrqmNkPxpGjjBSOpSmZfI1wISRJyjlGNkLI6mocR/IFUbezidmX36lGJXWvXt3BAUFiZYXYDAY6sI3iHq9XvZahDR8g1RSUuJR+YAywqikpERW8q9ajpEcAn2CR4AJI29RyzGSitKj0gDP7wOWY0TRokUL/PLLLxg/fjzuvvtuh1W+BwwYoFjlGAyGDb5B9DZ0zS+kqrUw4usg1bFRo3wtXCtvhInWs58zKq9jJAelHaNKIYzeffddcByHf/75B//884/oPY7jmDBiMFRAiYRHwL+EkZxQlhJhLGfly4GvgzfDlFkoLbBRwzGir2055TPHSD08OrOu5l2QMx8Dg8GQTmV0jOQIE63Lp+vgTfks+TqwYY6RMo4Rffxy2yJfIPvI9u/fr0Y9GAyGG/gG2VvHiG+QSktLYbVaJTsfaiU/S0Xr8uk6eNNTVsoxYjlG2qCUY2Q/XN/X5SvhGHlzH/IdNEDe8fsKj4+spKQEZ86cAQAkJiaKDpTBYCgLnXztDfYNEt1ASinf2zoo4RhpNUxYiZ5yaGgoOI4DIYQ5RgEIc4yUmeCRbocqhWMEAKtWrcLq1auFAwoNDcXjjz+O0aNHK1k3BoPxH0qH0gBbg+SJMFKqQZbTIFaWUBrHcQgNDUVxcbHsBwJLvtYeNipNmfvA30NpsjMIf/jhByxbtkyYOZYQguLiYixduhQ//vijGnVkMKo8SoXSPO2pad1T9Sdh5E1PGdA2z8ubUB5DuetQa8fIU+eUECK0RUo5RpUilPbll18CAO68807cc889AICff/4ZO3fuxPr169moNAZDBdQIpWkhjLQuX4lRaf4wMpDlGGmDUovIBuqoNDWEoT86RrKP7OzZs6hbty4WLVokvHbXXXfhvvvuw9mzZxWtHIPBsKFWKE0qlaVBViL52h+EEQulaUNlcYyUuA+9cYx0Oh2CgoJQVlbml8JIdihNr9ejpKREdIL4g2PrpjEY6qD0QxlgjlGghdJYjpH2qLWIrFS0HpWm1HxiQPl9UClCac2aNcORI0fwxBNPoFevXuA4Djt27MCNGzfQtm1bNerIYFR51HCMArWnqtWSIP4USmPCSBvo38CbNQurumME2O4Do9Hol46R7DP76KOPYtq0aaKZrwkh4DgOjz32mOIVZDAYys9jBASWY+QPM1+zUBpDjfswkEalKekY8efAH4WRbMnbs2dPzJkzB7Vr1xZGpcXHx2POnDno0aOHGnVkMKo8Widfa90gV8ZQmsViEZ1XqeUDLPlaK5S6DyuDY8RCaXakpKQgJSUFN27cAADExMQoWikGgyGmsiRf0+UHqjBSMs/LbDb7dCFdvV6P0NBQlJSUMGHkAVo7RloLI9ox0irXzhdIOrPZ2dkIDg5GbGwssrOznb7PEx8fr1ztGAwGAP+ax8ib3AqtJ3j0dFSaxWIR1oJU+jeQKoyUcu0MBgMTRh6ihmNUFYfrA/4dSpN0ZAMHDkSbNm2watUqDBw4EBzHOf0cx3HYt2+fohVkMKo6VqtVeChr7RgFBQW5vP/llq9F0qenyddKJ53yaCEOIyIikJuby4SRB/iTY6T1qDSl7oNKE0rjG2kGg6E+Sk0qBygjjLxBa8dIibXa/MG18+Y64POMmDCSj1KOkRLD9QPdMbLPtfOn6X4kHdny5cuFm2n58uWqVojBYIjxp4eyksIokHKM1Ji/BdBGHNLCiB9RzJCG1o6RPw2CUNo5jYiI8Gp/SiLpzHbs2FHY5jgOBoMBzZs3F33GbDbDarUqWzsGg1GpHCOtRYESjpFWoTQlc4z4/ZWWlooe0gz3VPVRaWoM1wf8TxjJzqKcMGECFi5c6PT1nj17KlIpBoNRTmUSRlo7RsHBwYJDEqihNI7jvEqAZ0P2PUep+yBQhZFaHQR/yzPy/O6yw2QysdwjBkMF1BgJAnjWIGstCrytA8dxgmuk9VIIgGfnwFtxTPfMi4qKvNpXVUOpaTP8SRgFWkjZF0g+sieffFLYPnPmjOhvk8mE06dPIyoqStnaMRgM5hhBWXEYHh6OoqKigAulKfUb0OFEf3sg+TtqOEaeDtf3pi0ICgqCXq+HxWLRzDHydBZ+XyD51z148CA4jgPHcTAajTh48KDDZ7p06aJo5RgMhnK5JYD2D2WtlwQByoVBoIXSlEr89VScMrRPvlbyOgwLC4PRaPQL59TfQmmSj2zAgAEAgB9//BExMTG4/fbbhffCwsKQkJCAQYMGKV9DBqOKo1QvEdBeGPmLYwQEXghB69+Aof1wfSU7SZ4II3/oIPgCyUf26quvAgAOHDiAFi1aCH8zGAx1qUyhNK1zjIByYVBVQ2lMGHlOZXKMvM21Y6E0itTUVADA+fPnkZGRAQBo0qQJGjVqJGs/ZrMZb7zxBvbt2wej0YjmzZvjxRdfRFJSEubPn4/NmzeLPnvbbbdhyZIlAIBOnTohLCxMGF0yZswYjB07FoDtR543bx7S0tIQFRWFZ555Bv369RPVf9myZTAajejduzdmzJjh9Q/MYKiJP/TSlHooBwUFQafTwWq1apbbQD8QpM7j40+/gbfimAkjz6ksw/WB8uvAHxyjgA2l8RQWFuK1117Dzp07Ra/37NkTs2bNkpyAbbFYUK9ePaxevRo1a9bEunXrMHXqVHz//feYMWMGZsyYIXx2xIgRDlMBfPfdd6hZs6bDfj/66CPk5+dj06ZNOH36NJ577jm0bNkSCQkJyMjIwJIlS/DBBx+gYcOGmDp1KlauXClKJGcw/I3K5BhxHIfQ0FCYTCbNQ2mA7RzQQsEVLJTGoJfmqQyOkSfCSI0lQQD/c4xkD9efP38+fv31VxBCRP/S0tLwxhtvSN5PeHg4xo0bh9q1a0Ov12P48OG4dOkS8vLyRJ87e/Yszp49i7vuukvSfjdt2oQnnngCkZGRaNeuHXr06IGtW7cCALZs2YK+ffuiVatWiIyMxLhx40TOFIPhj1QmYQSUN8hahdI8meTRH0JpLPlaW5S8D5UQRt7MZQVo7xhVqlDa7t27wXEcRo0ahXvuuQcA8PPPP2PNmjXYvXu3xxU5cuQIatSogerVq4te37x5M+644w5ERkaKXh85ciQ4jkPXrl0xefJkVK9eHQUFBcjJyUFSUpLwuWbNmuHYsWMAbNMMdOvWTXivadOmyMrKQnFxsdNeo9lsdrhog4KCVJkplp81vKrOHl7Vjx9wfQ7oa1Cv13t1juiHenFxsaR9EUJED2VvfyNeGDgr39U5oHuqfCjOU+h73Wg0olq1ahV+x1e/gbv7gBan3pRPC7OioiK/u+f8tS2wdw29qR8trEpLS31+DQDl94HFYoHZbJYkdJS8D+jnqJz7wBukiknZwigiIgLx8fGYNGmS8FpSUhJ+/fVXFBYWyt0dAFt4bv78+Zg4caLDez///DMmT54sem3FihVo06YNbt68iYULF+K1117D22+/jaKiIuj1elHDZzAYhEnMTCaTaNZXXmyZTCanwmj16tVYsWKF6LWhQ4di2LBhHh2nFDIzM1XbdyBQ1Y8fcDwHFy9eFLaLiopw/vx5j/edm5srbOfl5UnaF91LLCsr86p8oLyn6e5Y7M/BjRs3hO1r1655VQe6sc3IyJA0jwz9GxiNRq/KLygoELazs7Od7svZfcA/lKxWq1fl0+10VlaW17+nWvhbW0DPEm42mxW5D8rKynDz5k3J1wDvcOr1eq/LpydkPnnypOjZ6IorV64I2/n5+V7VgT6frq5Dpa+Bxo0bS/qcbGH0wAMPYMOGDbhx4wZiYmIAADk5Obh+/ToeffRRubtDSUkJpk6dijvuuMNhuP/hw4dRUFAgmhoAAJKTkwEAMTExmDZtGvr374/S0lJEREQIE1bxQsdoNAozvYaHh4t+DL6BoK11mjFjxmDEiBGi19R0jDIzM9GgQQOvLdJApKofP+D6HFy7dk3YjomJQUJCgsdl1KhRQ9jW6/WS9kVb7ZGRkV6VD5QvSVFaWuqwL1fngL5HGzRo4FUdYmNjRdtS9nXixAlhu2bNml6VX79+fWE7IiJCtC939wEv6MLDw70qv27dusK2Er+n0vhrW5Cfny9sK3HegoODUVZWBo7jJF8D/N/BwcFel09HZ2rVquU0Z9ce2l2Nj4/3qg61a9cWtqOioiSfA18gWxhdvnwZZrMZQ4YMQceOHcFxHA4cOABCCC5evIg5c+YAsCVZzpo1y+2+ysrKMGPGDMTFxTm4QoAtJ6hPnz5uhQh/0gghiI6ORmxsLDIyMtC6dWsANiWcmJgIAEhMTBRG0gHAqVOnUK9ePZfJlyEhIT5fYFGn0/lVY+BrqvrxA47ngHY4+FFdnkILDLPZLGlfSpYPiHOMXO3L/hzQ+R0hISFe1YFeEsNdHWjocxAcHKz6b+DsPqDDmb4+fi3wt7ZA6fsgJCQEJpNJ1jVAh9K8Ld+TtoB2j729D+nyy8rKJJ8DXyC7xE2bNqG0tBQFBQXYuXMnfv31VxQUFKCoqAg//fQTfvrpJ/z444/48ccfK9zXvHnzUFJSgtmzZzsMmS0rK8O2bdtEQ+0B4PTp0zh58iQsFgsKCgqwePFidO3aVRAwKSkp+OSTT2A0GnH06FHs2rULffv2BQD069cP27dvR3p6OgoLC7Fq1Srce++9ck8Bg+FTlEz6pPNbpCY8KplwCYiFkdT1FbVOvmaj0hhK3wf8M0uLNQsBz64DfxiE4Atkn93k5GRJ835UxOXLl5GamorQ0FD06tVLeP29995DcnIy9u7di9DQUHTo0EH0vdzcXLzxxhu4evUqDAYDunTpgtmzZwvvT5gwAXPnzkW/fv0QHR2N6dOnC3MsJSUlYfLkyZgyZYowjxE//xGD4a8oOdstP1y+pKREM2FkP38J/bcr1FgSBNBmVJqno3GYMNIWJTsogHfCSInyPbkOlLwPK9WotI8//liRguvUqYMDBw64fP+OO+7ATz/95PB6586dsXHjRpffCwsLw9y5c12+P3DgQAwcOFBeZRkMDVFySRAAmgsj+wZZijDS2jHSeoJHeg4dNsGjNjDHSPv7wFf4TwCXwWA4RemeKt8g+YNjpEUdtO4pe3L8Sq+RxcOEkXSU/A2AcmEkZVSkfR20EkZqTfAY8DNfd+nSxeV7HMdh3759XlWIwWCIUUuY+ItjJLcOSi0JAmg/waPUB4LWwpChvHNb1R2jShVKk5osyWAwlEGt3Iaq6hgFYiiNCSPtUdox4gV2oAojlnxN8eqrr4r+LiwsxK+//oq///4bTz31lGIVYzAYNpRukAPdMaqKo9KUdCuYMPIMtRyjsrIyWK1WWcPlK0PydaUKpQ0YMMDhtaFDh+Lhhx/GyZMnFakUg8EoR43ka4A5RoD2oTTmGAUOauUYATbBIWcQgj90UCqzY6RI8jXHceA4Dr///rsSu2MwGBRqJV/br9HkCqWFmdaOkdbls+TrwEQtxwiQn2vmD8nXLMeI4sknnxT9bbVakZWVhWvXriEuLk6xijEYDBtqhdIAW4PsauZ3HjUdo6oYStPr9dDr9bBYLMwxCiDUdIykCiOtR6VpPQjBV8g+uwcPHgTHcU6TsIcMGaJIpRgMRjlqhdIAbYQRXZ4WOTZah9IA229QVFSkyfHzy0lYrVYmjGSgpmMkZcg+PZeVEveh1h0Efw6lyT6y/v37O8x8XaNGDXTu3Bm33nqrYhVjMBg21AqlAdIaJH9yjPR6vdcz72s9Kg3wThgpMft5WFgYioqKmDCSgVoTPALSHBN/GwSh1QzwvkD22aWX32AwGOqjdfKzPzhGfE+1MvSUAfkJ8EqHcZgwko/SHRRaWMgVRmxUmrrIPrLCwkIUFhaievXqCAsLwy+//IJDhw6hadOmGDRokBp1ZDCqNMwxUjbplBZGWvSUAe1HBvIPRSaMpMMcI+0HIfgK2aPS5s6di/vuuw/nzp3Drl27MH36dHz55ZeYN28ePv30UzXqyAhQvvjiCzRr1gzLli3TuioBjZpJn4HiGKk1GkfLUBpQeYTR33//jfPnzyuyL39F6+RrNVxDHi2WBNHr9cLcTQEvjE6cOIGoqCi0aNECO3bsAMdx6NSpEwghThd9ZVRNioqK8Oijj+LUqVOYNGmS1tUJaNRMvtZaGMntqSrh1gRiKE2tMIoSwuinn35CcnIymjdvjqysLK/3569oPVzfn+5DperA3wf+FkqTLYyuX7+O2rVrAwAyMjLQvHlzLF26FAkJCcjOzla8gozA5KuvvhK2CSGiG4ohD6VDaXIbRDWnC9DCMQoJCRESuLUclQZUDsdo4MCBAGzHsmHDBq/3569o7RipKYwC5T7wFbKFUUhICAoLC1FSUoILFy6gcePGAGwnydvRIozAhxCC3bt3Y/To0aLXb9y4oU2FKgFKN8iRkZHCdmFhYYWf96eeqhLlcxwnuEZah9KsVqukToNaYZTS0lLRvuVCCBFN3eJvPX8l0Xq4vtLXoMFgELaLiookfUdp51Tuuo2+QrYwaty4MbKzs9G3b18UFxejdevWAICrV68KThKj6rJu3Tr06NHD4fXr169rUJvKgdINcnR0tLBdUFAgq/zKIIyAcnEoRRgC6oXSAO3Dmd48lM6ePSv6uzJHDfzJMVKiHZDbQbKvA3OMKMaOHYugoCCYTCbUq1cPKSkp+Oeff1BQUCCIJEbVZcuWLU5fz8nJ8XFNKg9Kh9K0FkYRERHCttFolPQdtYTRzZs3ZZUPKPtAAOQLI62Gajtj165dor8zMzM93pe/o/Rv4M1wfaVGZ/JRHk86CFIWva0If80xkn1277jjDmzatAnZ2dlITExESEgIGjdujG+//RbVqlVTo46MAIJeSHjw4MH45ptvADBh5A1KN4j0faqFMKItfK2EUVRUFADPesqVzTFiwkgaWjtGSpev0+lgMBhQWFgou4OgVOoMfx/427QRHp3d6tWro3r16sLfBoNB1Ngxqg5WqxW7du3CxYsXUadOHaSnpwMAGjZsiL59+wrCiIXSPEdNxyg/P7/Czyv9UKYtfK2FUUlJCUpLSyt0gbQOpfnDUG1n/Pnnn6K/K7MwUjPHSAtxDNjuRX5uQikoOdEqUH4fFhUVoaysTLH9eovsWphMJqxZswb79+936gJ8//33ilSM4f+kpaVh4sSJOH78uMN7zZs3R2xsrPC3Lx2jPXv24MKFCxg6dKgidq/WKP1Q1DqURneitG6QAVs4rUaNGm4/r3QoTa5r5q+O0ZUrVxz+NpvNood+ZUHp+5AOKUtJflZLGAHynVOlyo+JiRG28/PzRc8MLZF9dPPnz8fPP/8MAA4LybJRaVUHQggeeeQRXLp0yen7zZs3R82aNYW/fSWMTp8+jV69eqGkpAR//vknFi9e7JNy1aSyJV/7QyiNdq3kCqPKEM5UQhhZrVbk5uaKXiOE4NKlS2jUqJE31fNL1Ex+1kIcA/JDynwHRYnOAQBR5CkvLy9whdHvv/8OAGjRogUSEhL8xvpi+JaTJ0+6FEWAo2Pkq1Da5s2bBVv67bffxqBBg5yOkgsklA6l+cNDmeM4EEIkPRCsViusVqti5QOOjlFFKB1K80ac+kvydV5envC70GRmZlZ6YaSFc6r0NQCUizOz2SzJ6VO6g2IvjPwF2UcXEhKCunXr4rPPPlOjPowA4bfffhO233jjDZw5cwYrVqwQXmvWrJkmoTT7ZNCpU6di//79PilbLdQMpUnJMaJFgRINMsdxiIyMxM2bNyUJI6WPHxALI7kPJSV6y3KFkT/mGLnq7FTWPCOlOyhazydmXwej0VihMFLaMaJDaf40153sBIwHHngAeXl5LJm2ikMLozvuuAN333236H21c4xmz56NuLg4jBkzBmfOnAFQPrkkzV9//eV3Ix7konRPkRYFct0KpRpEvrcsN4SgVPlyHSOlH0pahzOVEEb0PV2nTh1h+//+7//w/PPPY9WqVZ5X0A/RehCCGh0ET8UZc4zsyMrKQklJCYYMGYLOnTuLTizHcZg1a5aiFWT4J7wACQ0NRefOnR1u7AYNGkCn0wmjHpQURoQQLFy4EMXFxVizZg0+//xz9O7dGyaTyWGCOavVimPHjqFjx46Kle9rlO6pBgcHIyIiAkVFRZIeykouHMnDCyOtesqBHErzF2FEd47bt2+Py5cvAwDOnTuHJUuWALBNCNyrVy8vauo/KC1MvAmlqZVrJ7UOauUY+QuyHaPNmzfDYrHAaDQiLS0NP/30E3766Sf8+OOP+PHHH9WoI8PPuHz5Mk6fPg0A6Ny5M0JDQ1GjRg0MHjwYADBkyBBhNBjvGinpMBYWFooac4vFgm3btolcLDqZ9siRI4qVrQVqNIj8g1mLhzLguWOk9QNBp9MpMtKxMuQY0ff0nXfeKXrI8WzatMmjffsjlTH5Wq5jpPToUPqa8adQmuyjS05OZqPPqjh///23sN2tWzdhe+3atXjxxReRnJwsvBYbG4vz588jNzcXhBBFrh36BmrYsCHy8/MdcmWefvppvPbaawACXxgp7RgBtgdzdna27BwjpXqKfINcUlICi8Xi9rj8wTFSOoRQ2Ryjxo0b4/fff8cvv/wCo9GIl19+GQCwc+dO4TMffPABUlNTsXDhQrRv396jMrWksq1Z6E0d1Mgx8ifHSPbZ/fjjj9WoByOAoMNV9OiT0NBQdOnSRfRZfsi+xWJBfn6+016lXOghwvfccw/ef/99ZGVlYdu2bVi6dCmSk5MxceJEJozcQDtGFQlWNR0jwNZbpoWCL8r3NPlaK2Hkj8nXdHi8Zs2aaNWqFVq1agUA+N///oejR4/iwIEDmD9/Pm699VY888wzAGxzHdGdq0BBacfIm7mslGoH5N4HajpGAS2MeA4ePIgTJ04AAFq1aoUOHTooVimGf0NP6lbRwsH2Q/aVEEa0Y1SjRg2EhoYiMTEREyZMwIQJE4T34uPjkZ2djcOHDyvmVmmBGsKAH7LPD5mne47uylc6xwjQXhjJyTFS6vi1dozoyQWlzmFjD+0Y0XOWAbbQ2tGjRwHYkrFpDh8+7FF5WqO0OA0NDYVer4fFYpElSpQqH9DeMao0obSSkhJMmzYN+/btE73etWtXLF68uFLOeMoQ46kwysnJQVJSktfl0zcQbcXa07ZtW2RnZyMnJwfZ2dmikTOBhJqOEWB7MLsTRmo0yHIST/0px8gfQmlKXANK9NRpYWQ/Md+dd96J999/36P9+itK/wYcx8FgMKCgoEC2MFLqOStHGFksFmFSZzVmvvYnx0h2FuEnn3yCvXv3ghAi+rdv3z6sXLlSjToy/Aw6lBYfH+/2s3FxccK2/fIBnkKH0twJo3bt2gnbBw8eVKRsLVBjmK6cuYx84Ri5Qw1hpnWOEV2+FuvVKTF/TEXCyJ3YDkTUHC4vJZSmZq4fULEwUqN8erLZgBZG27Ztg06nw/PPP4+tW7di69atmDJlCgAIS4UwKjdyHKP69esL2xcvXlSkfPtQmis6d+4sbNsvdhlIqJFbIGf2a7UtfDnCSKt5jJQOpen1ekEcapFjpERPnc8xioqKEi2KC9juy59//hn33nuvx3X0N9SceVquY6SGMKroPlCj/KCgIKEO/hRKky2Mrly5goSEBDz88MOIiYlBTEwMHnnkETRq1EgxR4Dh3/C/c3h4eIW9QjWEkVTHqGvXrsK2feg3kPBFKM0d/uQYqSGMtEi+BrSdMkGJ3A7eMXK1vtVtt92GtWvXOn3PZDJ5VKaWqOEYyZm2ojI6RkB5Gx7QjlFERASuXLmCa9euCa9dvXoVV65cETV2FWE2mzFnzhykpKSgZ8+eeOKJJ5CRkQEASE1NRdeuXdG9e3fhHx2+OXbsGB5++GHcfvvteOKJJ4SJxQDbCIuZM2eiR48e6N+/P7Zs2SIqNzU1VShzzpw5oh+bIQ1eGMXHx1eY0NygQQNhW6mlAqQ6Rg0aNBBCfX/++afTdZ0CAbVDaVo4RnJyjLTuKQOVTxhVq1ZNuHc9eSBZLBahg2KfeE0TExMjSvTm8aeHoFTUdIxKS0thNpvdfrayCiNepPvTNSFbGHXo0AFFRUUYMmQIJk+ejClTpmDo0KEwmUyi+WsqwmKxoF69eli9ejV27NiBHj16YOrUqcL7Xbp0we7du4V//APObDbjxRdfxEMPPYQdO3agdevWotm2P/roI+Tn52PTpk2YP38+FixYgPPnzwMAMjIysGTJErz11lv46aefcOnSJZYXJZPS0lLBQq8ojAaoH0pz5xhxHCdMH5CXl4dTp04pUr6vUaNBDtQcIyUtfH7IuhahNMBxygR3KH0N6HQ6oXxPHCN6AVl3wgiwOcv2+FPYRCpazyNECyctnFO1hVFxcbHfLN8kWxg9+eSTwnICf/zxB37//XcUFRUhPDwcTz31lOT9hIeHY9y4cahduzb0ej2GDx+OS5cuVagaDx48iPDwcAwaNAihoaEYP348jh8/LrhGmzZtwhNPPIHIyEi0a9cOPXr0wNatWwEAW7ZsQd++fdGqVStERkZi3Lhx2Lx5s9xTUKW5evWqsC1FGEVFRQn5LEo5RlJDaUDlCKepEUqr6jlGQPlDQWvHiJ8ywR1q/Ab8veOJSHE3VN+ekSNHOrwWiMJIjfvQ0w6CFqPS1A6lAf7jGsm+w5o0aYJPP/0Ua9aswfHjxwHY5jEaPXq0aLI/uRw5cgQ1atQQ1OPhw4fRp08f1KhRA8OHD8eQIUMAAGfOnBEN+Q4PD0f9+vVx5swZGAwGhyHhzZo1w7Fjx4Tv0jM1N23aFFlZWSguLhZNeMZjNpsd7M2goCBVpiTge1/+Hu6hw5a1atWSVN/69esjPz8fFy9ehMVicRp+k3P8fKOq1+sRGRnp9jt0Avb+/fudNtL+gqtzQPdUOY5T5BqhG8T8/Hy3+6QbRL1er0j5tItQWFjocOx0GSUlJcJ2UFCQYvdIVFQUrl27hps3b1a4T1oYKVk+T15eHiIiIlxeA3Q7pFQd6BCGq/vSFYcOHRK269ev77Y+M2fOxKFDh7Br1y7htZycHJff8de2kP4NdDqdIvWjhVFBQQGsVquka0Cp+5AOc1Z0H6h1H9KdtNzcXNFzRelrQOpyPh51PRo1aoTZs2d78lWnFBYWYv78+Zg4cSIAW7hu/fr1iI+Px/HjxzFt2jTExsaiV69eMJlMDrlMBoMBJpMJRUVF0Ov1IpFjMBhQVFQEAA7f5R8OJpPJqTBavXo1VqxYIXpt6NChGDZsmDIH7gSlXBW1oGeRDgsLE8KU7uB7lCUlJTh06JDLZE1A2vHzrlV0dDQuXLjg9rN0DtJff/0lqb5aY38O6J7cpUuXFOmt8fcEAFy4cMHteaEdlcuXL4u+6yl07zgrK8uhfPocZGVlib6n1G/Ij6S6efNmhfvkxaHValWsfNp1SE9PFwlQ+2uAdkmvX7+uSB14cVpaWor09HSnuUCuoNfFbNGiRYX1WbNmDT799FPMmTMHgC2toaLv+FtbSLsZ165dc/rMkAv94M/IyBD9BvbHT7t0N27cUOQaoMvPzc11u0/6vZKSEtXuA7rTpPQ10LhxY0mfkyyMDh48iB9//BG33XYb+vbtK3pv27Zt+OOPPzBgwADZq5iXlJRg6tSpuOOOOzBo0CAAQL169YT3W7dujYceegi//vorevXqhfDwcAfL0Wg0Ijw8HBEREbBYLCIHyGg0Cheb/Xf5B46zGDgAjBkzBiNGjBC9pqZjlJmZKaxK76/QuRDNmzdHQkJChd9JSkpCWlqa8Lez78g5fv5BXbNmzQrLT0hIQM2aNXH9+nWcPXtWUn21wtU5oEMnTZo0UWQGb9qFys/Pd3te6PITExMVmZ+GbqCCgoKE8p2dA9pqj4uLU+w35EWz2WxG3bp1XQpOq9UqXPcGg0Gx8ukJRyMjI5GQkODyGqAfwg0bNlSkDnQoPDo6WtTuVgQ/L5her8cDDzwg6ZpITEwUtvV6vctj8Ne2kG73GzVqJMqf9BT6GoiKinJ7DdCiqV69eopdhwaDAUajEWaz2e0+7XM7lSq/YcOGwnZoaKjbc+ArJAuj9evXIy0tDaNGjXJ4r1mzZpgxYwYKCwtlCaOysjLMmDEDcXFxmDx5ssvP0Q+CxMREfPvtt8LfJpMJFy9eRGJiIqKjoxEbG4uMjAy0bt0aAHDy5EnhhkxMTBRGvgHAqVOnUK9ePZfKPyQkxOczeSu1erda0KMR4+PjJdWVvvAvXbqETp06ufxsRcfPr7kG2G5OKeW3atUKu3btwuXLl5Gfn19hXpLW2J8D3knQ6/WK5TY0btwYQUFBKCsrw+nTp92eR1pEhYSEKL66fFFRkcM+6XNA53YoVT4gDmUZjUaXIxztk26VKp8OIRQWFor2a38N0HUIDQ1VpA708ebn54tGkLojOzsb6enpAGyhanfLudDQTnF+fn6Fx+BvbaEavwF9DdrfB764BgCbKDcajQ7XoD1q3Yd0e1xQUOD2HPgKySWeOHECsbGxTvOIEhISEBcXJ+QcSWXevHkoKSnB7NmzReLnjz/+ENRpeno6NmzYgO7duwMAOnbsCJPJhNTUVJjNZqxcuRKtWrUSlHdKSgo++eQTGI1GHD16FLt27RIcrn79+mH79u1IT09HYWEhVq1aVakmIPMFciZ35KF7Vt5ao/n5+ULvXarA4Re2BCCs7xdIqJH4S7s0GRkZbkdFVcZRaYD0SR7VKt/TKRPUWKdKTtIr7f7eeeedkr+nxGzbWkLn+CjVYZZzH6gxKg0ovw+0HpUGBGDydW5urtseRVRUlKyH3uXLl5GamorQ0FD06tVLeP29997Dvn378Oqrr6K4uBhxcXF47LHHBHETEhKCN998E6+//joWLFiAVq1aCauoA8CECRMwd+5c9OvXD9HR0Zg+fbog5pKSkoQpBoxGI3r37o2xY8dKrjMDOHfunLBdt25dSd+hrxtvh+xLncOIhhZGx48fx2233eZVHXyNGkPFAdv9cPr0aRQWFuLatWuoVauW2/IB6cmLFRFIwkiNYdqA9sLIU6FCJ17zHVY1y/MX/GkeISUjGVJn3/aFMPKX60LyXW4wGHDx4kUUFBQ4WKf5+fnIzMyUNcFjnTp1cODAAafvJScnC8uMOOOWW27B+vXrnb4XFhaGuXPnuvzuwIEDMXDgQMn1ZIj5559/ANjysqSOQqSFES2sPEHOUH0ee2EUaKjhGAG2fCWejIwMl8KILl+J/CbAP4SR1HWaKqsw8vSBRNdVqmsMMGHkDH+YtoK/DktKSmAymVzm3Fal4fqSu38tW7ZEaWkpXnnlFdHD6caNG5g5cyZKS0vRsmVLVSrJ8A+Kiopw+vRpADZxKtU9aNy4sfBA9XaSRU8cI/q6DMRQmpqOEQ//uzqDFwZKlq/1zNeA9AZZa2EGqBNG8fSBRD/A5XSG/dEZkIMa14E/3Af0Qt90Dqmvyg/oUNr999+PPXv2YO/evRg4cCAaNmwIjuNw/vx5lJaWguM4PPDAA2rWlaExJ06cEHJR+OR2KfAjDc6dO4dTp06BEOKx80DnN0gdFVKnTh1Uq1YN+fn5wpxWgYSvHCNX8A2ikuWHhIQIyd9a9ZSlNshqOUb0xIjuHkiAOmEUTx0c+veSM0IxLCwMYWFhKC4uDkhhxItTvV6vaOIzj1bCiHaKr127Jhos44vy/VEYSf51e/fujQEDBoAQArPZjNOnTyMjIwNmsxmEEAwYMECUK8SofPBhNECeMAJsIxcBmw1f0UPAFVarFZ9//jkAW+N0//33S/oex3FCfTMzM/3m5pOKGo4NIHaM3AkjNcrnOE7yApq+cIzcPajVEkZSe+qAfyVf0w9wOY4R4J8LhkpFDefWH0LK9HVIr2zgq/L9McQqS/a++uqrmDFjBlq2bInQ0FCEhISgZcuW+L//+z/RemWMyok3wqhp06bC9smTJz0qPy0tTUjwv+eee2TlN7Rt21bYpiepDATUcGwA8VxC7kJpapXPh0Kzs7PdjorTuqeqdQhDrToo4Rh5Koz85QEoBzWEkdZrpQHah9IiIyMFB85fBLPslu6BBx5gIbMqihKOEWDLM7rjjjtkl//VV18J24899pis77Zr107YPnLkCHr06CG7fK1QyzEKDw9HvXr1kJWVhTNnzvi8/KZNm+Ls2bPIz8+XPCquMjlGkZGRCA0NRUlJiSxhpFQdvHWMgoODZYf1+HNuNBpRUlIizD4eCKgtjLRYKw3QXhjpdDpUq1YNN27c8Bth5D+zZzH8Hj4/p1q1apKH6vPQjpGnCdiXLl0StuUKG1oYHT582KPytUItxwYoz9O6fv26qOHzRfm0WP73339dfk5rx0gtYcRxnPBQkiqMlBwZ6K1j5MkM6PRIVnrYfyDA/wZKihJ6ZCK95Ie78gH1coy0CKUB/uckMmHEkERZWZkwB1HTpk1lN870Q9DTUBq9RpecdZ0Am8PF1znQQmlqOTaAbfZywLbUi6uHs1rlN2/eXNh2d01oPX+Kmg8EXhhdv35dUjhRyfLDwsKEhzw/m7wUeMdIbhgNEE8I+csvv8j+vpbwoSylr0FeFFTUYdQ6pKvmfUAvaOzuPvAVTBgxJHHjxg3hgnUV8nBHQkKC0Nv21DEymUzCtlxhFBkZKYzCOnr0qGh6e39HTceIF0aAbdJVX5YvVSxrPVxfLccIKH8olZWVua2DGg9loHySS3cTXNrjjWPUu3dvYXvHjh2yv68laohTjuOE++DChQuiNs5V+UrXwZ+EkcViqTCk6AuYMGJIIicnR9imhxlLJSgoSFizzl2irzt4x0iv13t0Y/IJ2CaTyeM6+Bqr1SqsgK2mYwTYkqCdoZZjpHUoLTw8XNifFjlGgPyHktbCiBAiPLg8cYwaN24sLEXz+++/o7i4WPY+tEKt34C+D6RMm8FxnGJrJgLiNey0DqUB/hFOY8KokpOZmYnXX3/d6/ARHf/2RBgB5Q9ho9HotmfkCv47ct0iHnoG7EARRmo+lAFpwkgtx6hhw4ZC8q0WjhHHcZKGj/silAZIE0ZKL2otVxiVlJQIbqsnjhHHcejTp4+wrz/++EP2PrRCrd9AqnOqlmsYFBQkjBDV2jEC/GNkGhNGlRhCCAYPHoxZs2ZJnvPHFbQwonsYcqBnqvakV8A7Rq6mrK8I+9W9AwE1FnCl0dIx0ul0QlJ+RkaG6FhpfNEgV3XHqLi42OX5p/FmqD5Pt27dhO309HSP9qEFagkTuSFlpYUZUJ4ewYSRDUWE0dChQ9GlSxd07dpVid0xFGLnzp3Yv38/AODs2bNeWZRKOEa0MKFDc1Lx1jGSswSDv6DGMG2aioSRxWIRcsvUKJ9PwC4tLXW5jp4vLPyCggKXeWdVQRgB0lwjeq4dTxwjQNwOVLRGnL9ACFF12goeKcJIjQ4Sfx0WFha6dPN9FUrzh7ZZEWFECBH+MfyDvXv34t577xW9dvbsWY/3p4Qwoh0jer09qXjrGNG9EuYY2ahIGKldPp93BkAY9WiPr3qqrq4JfwqlKV0+PVxcijBSwjGiOyiBIozUvA/8SRgBrq9DX92H/pBjpEj3Z9iwYX6h8hg2fvjhBwwaNMjh9bNnz6JDhw4e7VNrx4gQwhwjFRwbevZwZ8JI7fL9qUHOy8tzujCxrxwjKYmvajpGUkSKEo4RLcbUFEYWi0WxJGW1JlcEbOexbt26uHTpkt8II2frpVWlUJpiwojhP7iaH8RVqEIKWjtGpaWlQqiDOUbKER4eLiywq4VjRF9Lria403o0DAullaOEY6S2MLJYLEhJScHevXuxceNG9OnTRxhN56mYU2s5Dp5mzZrh0qVLuH79usvrUE1hJGWSRxZKYwQ0/HpiADB//nxh259CaXIdI2/mMOLxt16JFNR2bACgTp06ACoOpVUFx8jX5Us5fjXzW7zJMfJXYfTrr79i69atKCgowOjRo5GZmYkOHTqgevXq2LBhg0f7VPMaAByXTHKGWsnfgPYdlIAMpXXp0kXSzjiOw759+7yqEMN7Lly4AMA26mfkyJGYMWMGAO+EES1knIUbpECH0uQ6RvSs1546RoEYSlNbmAC2PKP09HQUFhaisLBQ1KtW+4GgdYOstWNUvXp1BAUFoaysTBNh6I1j5K+hNPoZdPHiRXTr1g1ZWVkAgEWLFmH48OGy9+lLYXTy5EmnC2SrOSqNvg+0yLXzN2EkyTGik6sr+sfQHl4Y1a1bF/Xr10dYWBgAZRyjmJgYjx8O3oTSvFkOhIcWRoESSlO7QQbECdhXrlwRvcccI3XPAcdxQofBlYuqZn6LFqG08PBwIfdHDWH022+/if7mRREAHDx4ULTmolT8wTFSM5SmtXNKd5orWjPOF0i6y1999VW168HwkIKCAqSlpaF3794wGAwwmUzCA6Zhw4bgOA6NGjVCeno6zp07B0KIR4tQ8herp2E0wLvkazqU5qljFBQUBIPBAKPRyBwjCvtlQfilUwD1Q3n+5Bhp8UAAbOfgypUrmhy/FsP1OY5DdHQ0bty4obgwunTpkoMwsufHH3/EE088IWu/aopTQNpcRr4SRhXlOKlRh5o1a0Kn08FqtTp0zrRAUks3YMAAtevB8ABCCO677z6kpaWhXbt2WL58OX7//Xfh/QYNGgCwTcOfnp4Ok8mEK1euiB6EUigtLRUeGp5O7gho7xgBtgbAaDQyx4iCbhTtH1RqJ19HR0cjODgYpaWlFS5iq0Yd6GvS1WrvaotT/p4ymUxO55BR8xrQYrg+X67Swujll1/GggULnL4XFxcnXF8//PCDbGGkdvJ148aNodfrYbFYnDpG9HxildEx0uv1qFmzJq5eveoXwkhy8nVaWhr+/vtv4e/CwkLROjfbt2/H+vXrFa0cwz3bt29HWloaAODw4cPo1q0bpk2bJrzPD7ls1KiR8JonI9NoEeONYxQeHi6E9bRIvgbKw2nMMSqHfsDRAhRQ3zHiOE64pipyTHQ6HXQ6ZceLdO3aVXCNNmzY4HStKl8JI8D5feErx8hXw/WBckGmpDD6/PPPXb735ptvom7dugBso3btr/OKULuDEhISgsaNGwOwOUb2aSlql+8PzimfV3XlyhXN03IktzLTpk3De++9J/zdq1cvTJw4Ufh77dq1ePvtt5WtHcMt9IgzZ/DCiJ5Ez5OV7ZUYkcbDPwS0SL4GyntGRqNRdKP7K75wjGihab+ytdqOEVCeZ3Tt2jWnDaKaIYTIyEhMmTIFgK1X7sxx8GUCupbCyNeOEWDr8ChxH5aWlopyiUJDQ0X1e+CBB4TIR3FxMbZv3y57/zxq3Qf8RI9Go9FhyLzajpXWjhFQLozMZrPmjj4brh+gHDt2DDt37hT+djaRGS+M6MVTjx8/LrssJYURH7rIycmR1StQyjFyFzbyR3ztGNkLI19MF8BfU2azWeRI2NdBrfKfffZZ4Rw4e2D60jFy5pqp+VDUIscIkB/Cqwg6obpevXo4duwYfvjhB/Ts2RNr1qxBtWrVMHDgQOEzqampsvavdo4RIM4zsh8oo7YoMRgMwjNEa2EEuJ/s1BcwYRSg8GugAcDChQuRlZWFyZMniz7D5xh5K4xod8ebHCP6+yUlJS7X5HGGUo5RoA3Z90VP1V0ozZeOEeB8ZJqajhFguybq1asHwPk1UVVCaVo4RoAyHRR+JC5gW7uzSZMm6N27N3bu3IlRo0YBAPr06SO0HampqbBarZL3r7ZjAwBJSUnCNj0XHaC+MOM4Tug0+oMw0jrPiAmjAOXo0aPCdvv27VG7dm088MADos/wjlHDhg0Fl+XYsWOyy6IbLrpB8wRPE7DVcIy0tmul4AvHyF0ozZeOEeDcMVFbGAHinBdf53cEaihNKcdIaWHkbDkLwNahuuuuuwDYHrwHDhyQvH9fdFDoPB9396HagzCYMJIpjP79918MGjRIWIeL/vvff/9VpYIM59DCqG3btgCAbt26iT7DixCdTie4RmfOnJHl1ADqCSM5CdjMMWKOkZrCiL8u+KUjaHzpGDnrLKjpFtC/va9mvgbUFUa8U+6M/v37C9u7d++WvH9f34f2bbSvhZG7XD+16hCwobTS0lJcunRJiOeazWbh70BIZK1MHDlyBICtt8lfUMHBwVi8eDHCw8Mxc+ZM0XxFvDAihMgWsXSDSfcwPcHT2a+ZY1T5c4wA7R0jwPG60DrHSM0Hkk6nE+5pOY6RTqcTRph6grvz7Ql06MmVYwQAt956q7D9559/St6/L3KMtBZGvGNltVqdXgtqjg4F/MsxknyXJycnezQxIEN56Lke2rZtK/pdnn/+eTz33HMOydh0ntGxY8fQvn17yeUp6RjRD0Fna3O5IpAdo/z8fGzfvh133323bGFZlUalAf4hjAoKCoScI7p8QP1JLn0dSgNsnZ2bN2/KGq5vMBi8eh5oEUoDgFtuuQXh4eEwmUyiPM2K8EWOEX0f2ju3vijffmSafVuv9n1IL2QbMMLo448/VrMeDBk4C6PROBuhdssttwjbchOwlXSM6DmV5CxRooZjpKYwIoTg6NGjqFGjBgYMGIDDhw+jXbt22LNnjyxhV9nnMQLEwkDrUBrg3jFSow5aJl8DkOUY8Z/xJr8IUE8YBQcHix6w9gQFBaFDhw74/fffcfbsWVy/fl3SSNuqFEoDbG2jvcBU+z70J8eIJV8HILQwatOmjaTvtGzZUth2NeW8K5R0jPhJzAB5wkjpeYwAdUNpn332Gdq1a4cGDRrg8OHDAGyTcNITcEqhKjhGderUEbadrWOlhWNEo7Y4rV69uuC+OBNGarsFvDAqLCx0O4UGIUQQrt5O26GUMDp58iRatmwptIkNGjSoMMxDL4ou1TXyJ2GkViivok6jLx2jgMoxYvgH9AzkUoURHRqQE8IClHWMPBVGSs98DajrGH355ZdOX1+6dCnS09Ml70frHCNflE8ny9oPUwZ87xjZP6jVds30er1ofi97fOUYWa1WdOvWDZcvX3b6uYKCApSUlACA09Xf5aCUMFq+fLnofpJSr86dOwvbnggjX+QYuXNufeUY2aP2fRgcHCzcB8wxYsjm4MGDAGyNtFRhFBYWJjT+ci86JR2jmJgYYR9nzpyR/D2lHCN6SKzc2belQghxaHDpOu/atUvyvnzh2NB106JBjoyMFH4Xe2FECIHFYlG1fEB68rVadeDDaVoKIwDYt28f1q1b5/RzdC/eX4SRfSeDngvIFbRj9Ouvv0oqx9fOrT+E0uzxRQeFXhZES5gwCjCMRqOQI9SmTRtZI0P4i85Tx0in03nl1gC2icT4JUouXLggeui4QynHqKKh4Upw4cIFYd/169fHr7/+KppRed++fZL35YscH47jhHOqhWMElCfMXrx4URBCgG8eCIC2oTSgXBjl5+c7jPBV+xw0adJE9LeraTToh5W7PB4pKCWM6KRrjuPw8MMPV/idxMREQUClpaWJlhJxhS+Sn7XOMapovTRfCqOioiKHtsiXMGEUYPz999/CjK0dO3aU9V3+ort586asRRT5hisqKkqRkYl8OM1iseDixYuSvqOkY8Qnp6sVx6bdotGjR+POO+9EcnKy8FCVI4x84VYA5Y2yFo4RUC6MSktLRSPTfFW+1ORrtYUR4PhQUjuM8/LLL+POO+8U/nb1QKKFkT84RoQQIRyfmJiIq1ev4t57763wexzHYeTIkcI+XDlkNL64DoODg4V92wsjLUal2eMLYfTss8/i448/xrfffqtqR6wiNBNGZrMZc+bMQUpKCnr27IknnnhCWNk6NTUVjzzyCHr06IFBgwbh66+/Fn23U6dOuOOOO9C9e3d0794dq1atEt4rLi7GzJkz0aNHD/Tv3x9btmwRfTc1NVUoc86cOQE3/xIfRgNs50EO8fHxwrYcq5J3jLzNL+LxJM+Ibii8EUY6nU5wjXwhjPh8hvDwcGEE4fHjxyU/DHzhGAHlwkgrx4jOM6JzXPzBMfJFHaQKIzXKj4uLw7vvviv87UoY0feLt46RErl+V69eFYR88+bNZSWEjxgxQtj+4osvKvy8L3KMgHI3XOscoxs3bji87wth9MADD2D8+PG47777EBoaqlo5FaGZMLJYLKhXrx5Wr16NHTt2oEePHpg6dSoAm2h6+eWXsWPHDrz99tv4+OOP8ddff4m+/91332H37t3YvXs3xo4dK7z+0UcfIT8/H5s2bcL8+fOxYMECnD9/HgCQkZGBJUuW4K233sJPP/2ES5cuYeXKlb47aAWgFz+UK4w8HQ7JPyi8zS/i8UQY8Q1FUFCQ1zcm36hfvXpV1kK2UnEmjIDy3AZCiEjgusNXjpGrUJqvHSNAPDJNC8dIi1AaXb79Qrq+HhHlC8coMjJSuOakusb20DmKfHheKklJScK9efjwYafzZ9H46jrkf4fi4mKX5VfWUWn+hGZeVXh4OMaNGyf8PXz4cLz77rvIy8vD4MGDhdebNGmCLl264Pjx4+jQoUOF+920aRMWL16MyMhItGvXDj169MDWrVsxfvx4bNmyBX379hUmOxw3bhzmzp2LJ5980um+zGazyMIEbA2jGhcmHx5ztbBhSUkJ+vfvLyQLBgcHo1WrVrIWQqQbs8uXL0v6rsViERrKqKgoWeW5gp7L6PTp07BarRUeP+8YRUREeF0H3jEym83Iy8sTPZTkQAjBsmXLsGnTJpjNZsyaNQt5eXnYuXMnAFt+Ue3atYX6du7cGcuXLwcA/PHHH+jZs6dof87OAX396XQ6Rc6/M+hQmsViEUKmdIOsZvn169cXti9duiSUw4+CAmz3nlrl0/Py5OXlicrxxTmg3djCwkKX14Ber1elfDpX0Wg0Oi2Dzk2sWbOm1/VISEjAiRMncOHCBdE1V1FbwMNHGABbZ0tufTp27Ch0Yv7991/RckX20NehWr8BIL4P6TJ8cR/QHd/c3FyHMmhhpNbx80i9BuQidcZu7YJ4dhw5cgQ1atQQqVbA9mA+duwYUlJSRK+PHDkSHMeha9eumDx5MqpXr46CggLk5OSIRiY0a9ZMWDj1zJkzovXEmjZtiqysLBQXFztNYl69ejVWrFghem3o0KEYNmyYt4frEmfDlQFg27ZtohEUnTt3lp1ETfd2jx8/Lmn2a7r3HBwcLLhv3kBbpEeOHBHt09Xx8/UICQnxug507/jQoUMiB0sO+/fvxzPPPCP8nZ6eLlpnaOTIkaK60uV8/vnnePjhh53mbNHngE6Ezc3NVeT8O4NvMAghOHnypHA/0OGTGzduqFY+3Qu9dOmScA7oxNjS0lLVyqev86tXr4rKoaeruHz5sipJobQrZTQaRdcAfZ/n5+ercg7oY8zJyXFaxrlz54RtJX6LWrVq4cSJEyguLsbBgwdFAyMA120Bz6FDh4TtyMhI2fWhQ2979uxB3bp1XX6WdpTUvA/pHCNX10BBQYEq5dMC/OLFi6Iy7Duvah2/PRVdA3KR2tb7hTAqLCzE/PnzMXHiRIf3li1bhri4OJGgWbFiBdq0aYObN29i4cKFeO211/D222+jqKgIer1eJHIMBoMQhjGZTKKHIt9LNJlMToXRmDFjRLFoQF3HKDMz0+UEZfSF2KFDB3zzzTey4/z0JI9lZWVISEio8Du0zR0XFyfpOxVRp04dBAUFoaysDOfOnUNCQkKFx8/3VqKioryuA31zBAcHe7y/H3/8UfQ3/RB/8MEHMXfuXJHwSUhIQLdu3bBnzx78+++/uHbtmijU5uwc0CPw6tWrp8j5dwbdW65Zs6aQ80I7GXXr1lWtfPo8Xbp0STgHtFtTrVo11cqnR8KZzWZRObRoS0xM9GrxVFfQOVZGo1F0DdC/QZ06dVQ5B/TxW61Wp2XQIb4OHTp4nQPSvHlzpKWlOZRZUVvAQ0+30aVLF9nnhR62f+PGDbffp+/DBg0aqHYd8saA2WxGnTp1hGcN7ebUrl1btfJjYmJw48YN5OXlicqgHavIyEjVyueReg2ohebCqKSkBFOnTsUdd9yBQYMGid77+uuvsWPHDqxatUrUcCYnJwOw/YjTpk1D//79UVpaioiICFgsFpEDZDQahYs6PDxc1Nvjb3RXybwhISGqJto5w9UCfXSO1caNG0WJ1FKhe0RXrlyRdMHRjWG1atUUuUjDwsKE2WrT09NRWloqPHxcHT8vbsPDw72uAx1SvH79usf7o4cK2/PUU085XZpl3Lhx2LNnDwBg5cqV6Nq1q8Nn6HNAP7BCQkJUayToUJLJZBLKoZ0MNcuvX7++EKa6fPmycA58dfw6nQ6RkZEoLCxEQUGBqBxfnAP7HCP6GqDLDw0NVaV8nU6H0NBQlJSUwGg0Oi2DzzGqVq2aVwMgeOiQemZmpmiBV75O7o6Vzk9s0qSJ7PPSokULYfvUqVNuv++L3wAQu9n0c8xX5deuXRs3btxweD7Q92FwcLDPxIpaC9ZWWK7PS6QoKyvDjBkzEBcXh8mTJ4ve27p1K1avXo0PPvjAIbxGQ4cAoqOjERsbK4o9nzx5UkjMS0xMFL136tQp1KtXz6tVon0BnawbGxvrdpFEd3iSfK3krNc0/AitsrKyCmeCJoSIcoy8Ramp593Zybx4t2fYsGGCCFm9erXDoAJ7fJX06WpZEF8lfwcFBQlLg9BhA18dP1AuTrQYlUY7Au6Sr7UYEcXD3yveJl7z0K6DJ6EZPrQXGxvr0cCQRo0aCZ2XU6dOuf2sL4bLA66T4H11H/C/rdFo1KR8f0FTYTRv3jyUlJRg9uzZIkdo7969WLRoEd555x2HuO/p06dx8uRJWCwWFBQUYPHixejatavQYKSkpOCTTz6B0WjE0aNHsWvXLvTt2xcA0K9fP2zfvh3p6ekoLCzEqlWrJM17oTUXL14UJgzs2LGjx3MJeSKM6IeEGsIIsOUZuYNOBHQnkqWitjBKSEgQDb+miYyMxJQpUwDYRMewYcOwceNGl6PjfDVc3tVyBL6aLgAoFyauyle7QeYfrq7mMeI4TrXeK31vaTUy0NWUDYDNveDbAm+H6vN4I4wIIYKAppc7kkNwcLDQaT516pTbEaq+/g0A18JITXHs6hnBhJGPuHz5MlJTU3Ho0CH06tVLmJPo0KFDWL16NQoKCjB27Fjh9fnz5wOwPSSnT5+Onj17YujQodDpdJg9e7aw3wkTJiAyMhL9+vXD9OnTMX36dMGyTUpKwuTJkzFlyhSkpKSgdu3aoqH+/go9tFvupI40oaGhgrCQmrhNO0ZKDdcH5AkjOmSlRGxbbWFU0ejJV155RfjM6dOnMXjwYLz33ntOP6t1g+wrx4iuQ1FRkfCQ0sIxKiwsFIUO+HOgpjD0d2Gk5HIgPN4Io7y8PMHF8aY+TZs2BWA75oceekiUYE7ja9cO0KaDwISRDc1yjOrUqYMDBw44fe+jjz5y+b3OnTtj48aNLt8PCwvD3LlzXb4/cOBADBw4UHpF/QBaGEmZssAdtWvXRl5eHrKzs0EIqdB9UjuUBkBYGdsVdKPpL8KouLhYaDhuvfVW7N27V3ivot8oJCQEX375JVJSUnDy5EkAtnw6eoQbj68cI1ehNF86RvyDmRCC4uJiGAwGTRwjwHbd850IX8zfYj9cn0YLYWTfNig5uSMPPQhDrjBSak6lZs2aYdOmTQBsCz+XlpY6fb5o3UFhwsi3sCVB/ICsrCxcunTJpZVLx79pQeEJvLAwGo1uk4d5lFxAlqZOnTpCuOnw4cNuP0s3mp7mV9EoIYzoc0cnkQK2xrYimjRpgvT0dOGc/vnnnw7LAADaNMh0T1ULxwgofyhoJYzo694XjhFdtr1j4+v8FovF4rAiAN1BUiKcDdjmA+JH42kljOgEbMC2qKyzdriq5RgB2uX6+QNMGPkBb7zxBho0aIB27drhgQcecJh1lF4iwdN4Og897cHu3bsr/LxajhHHccJEm9nZ2Q69ZBqlQ2kGg0FwSDwVRvYu1pw5cwDYztFdd90laR8cx2Ho0KEAbA0v7TrxaJFj5CqUprZj5My10iKUBvheGPmDY+TKNQSUW6vQHv5+zs/Pd7l4rTPoh7YnI3R5hg0bJhoZmpeX5zQRW4vfgD7nvhJmrpaNYsKI4XNOnDgBwNYg/vDDDw6LGvKNQFRUlNdzqHTv3l3Y/u233yr8vFqOESCeu8XdCtdKh9KActdIztIo7ur04osv4tNPP8WuXbvczqBrDz379a5duxze17pB9mWD6My10soxohOwfRFKMxgMQuhK61Aa4F4YKTEylIeeZNbZ9e8KpRyjmJgY7N27V5R+4WyRZ1/lGPmTY8SEEUNTevXqJZoygF4DCCh3jPjhzN5w6623CkNUtXSMAPEyEFKEEcdxou94Ax+Sy8nJqXCdJHd1AmzCKCwsDI899pik2cRpaGHET3ZHU5UcI61DaVo6RhzHCdM4aJ187awOagkj2l3dtm2b5O8puW4bAJFrVJEwqiqhNCaMGJryyiuv4O+//xb+pmebNhqNgjhRQhgZDAYhOfj48eMYNWqUW1GipmNEixx3C0nyIqRu3bqK3ZR0gnRFcwnZU1paiu3btwt/e+NiNWzYUPi+s4VltQ6jaOUYaZ1jRDtGvhBGdPnuhJGv3Ar7uYzUEkY9e/YUfldPhZE3oTQeegZ6fxFGrpxbNa8BOv+SCSOG5tC5Q7RQofOLlBBGgDic9tlnnwn5Mc5Qq0EEXB8zjclkEuZwUnIaeloYSV3pnueFF14Q8oEaNGggKdnaHXxIsbCw0GHRYq3nMWKOke9WFecdWX/PMVKyHYiMjBTyHjMyMkSzWbuDzjFSwjGqVq2akIj9999/O6xu76scH61D2mFhYcJ9QAsjXx2/v8CEkZ8QEREhXJC0e0ILIyV6RgDw6KOPiv52N/M03UAoPUO4lFCa0onXPPR8UHIco88++wzvvvsuAFsDsX79eq8bCnqUjxazLgPaW/iu6lBVRqUB5cKIHy7Po/U1AKjbQeIn4AWADRs2SPoO/9DW6XSixWC9gR8MUlZW5hBe538DvV7v8QS7UvCH+5AXmswxYvgFvPDJysoSGka6Z6SUY9S+fXvRRU8vxmgPvXig0sKIdoxchdKUHqrP07x5c6GBl+oYnT17Fk888YTw94cffojbbrvN67rExMQI2/bCSAvHiHYsqtKoNK1DabwwIoRo8lDUShgNHjxYEBsLFy502x7x8O1XXFyc0zUJPYHOoaRzK4Hy30DttTNd/Qa+dGx4YXTz5k1hChEmjBiawQsjs9ks9FjUCKUBtlgy79i4a4jUdIzi4+OFRs2VY0QLOG+nKqDR6/VCovTZs2clNcabN28WhOK4ceMwfvx4Reoi1TFS88FMh5GcjcgCKv+oNK1DafYTTPJoMYeOr3KMAKBly5YYNWoUANtw+TfffNPlZ69cuYKHH34YmZmZAJSbhRuQNmWCFveAfX3oBZ/VIC4uTtjmn0NMGDE0gw6V8UJBLWEEQBhWnpub63JySV4I6HQ6xR/Mer1eOCZ3OUY83k5VYA+dZ/T1119X+Hl6fpMRI0YoVg8pjpHaq0y7EkZa5Rj503B9XztGgHNhBlROxwgAXn/9dcE12rlzp8vPLV68GOvXrxf+VlIY0YLD3jHixana16CrPC96bjv6XlUDOjTJzy3FhBFDM+ibnA8tqZFjxMPPPF1SUuJyRW3eMVLaLeLhXaArV644JB4DYmGkdB3uu+8+Yfv5558XludwRUZGhrDNr7GkBLRjZL+AqS97qrx75w+OEf9Q8OXM284cI6vVKixg7EthRD+YfeUauku+pu9DNYRR/fr1XSaf09hPMaJkmyAllKbFPQCUCyODwaB6HWhhxBwjhubQjhDvoKiRY8RDT0ToKpTEC6PQ0FBFy+ahE7CdzUJNh/KUnHEXsCV98osIG41GIanaFbxjFB4eruhvIcUxUvuhzHGc09XlaWGiVC6HK/wx+dqXwqwiYRQUFKRJ4i+gvmMElDs27oSRfcehU6dOipXvbzlG9Hngj1tttwhwLozo31+tZ4E/wYSRH+HOMQoJCZE1o7IUpAgjPpSmlmNECyNaBPKo6RgBEE1V4G4+p7KyMmHizaSkJEXDWv7gGAHljS5t2/ONc1hYmKoPZcD5g1nt39++fP535X8HX4YSXeUYafFQdpdjpHQHhaciYUQIEQ3nHz16NCZNmqR4+c7q4MspG/gy6CVS+HtSqXXq3OFMGNHnXclBMP4KE0Z+hLsco/j4eMUfTHIcI7VDaYDz5TnUdIwA94t30mRmZgqNY1JSkqJ18AfHCChvdPPz84WcM34OKaVWVHeHs1AO/XBQumNgD+2aOXOMtM4x0iqMA/iHY5SdnS20BykpKVi9erWQDqAE7hwjX+UYcRznsFxRaWmp8HtoJYxOnz4tvNakSRPV66A1TBj5EbQw4h2jGzduAICiDQAPvU9XCzjyjpFa9in9sLMXBYDYMVBDGLl7GNDQiddK5hcB7kel8Q9mXzpGpaWlKC4uhtVq9akwcvZb0NelGveAPfbhRF+G8ioKpWmV+AuUCyO9Xq9aPXhhVFpa6jTfkF4qKTExUfHy/SHHCCi/165duwar1SpykX0hjOj7jBdGfH4lx3Fo3Lix6nXQGiaM/Ihq1aoJDfO///6L0tJS4cGo9IgswD8cIzpmbt8Y0eWrVQe9Xi+IPn8URnR+idrYj0zLzc0VEo/pIbxq4SyU42thxJ8DrR0j2jXhr0u1Qlg8UhyjiIgI1UKqdCjL2WAQOpyjxsPZ1fm3WCxCB03tofJAuTAqKyvDjRs3RKFtrR2j+vXrqx7S9geYMPIjOI5DmzZtANhmfKZzbtRoFCsSRlarVei5qeUY0aEsZxa62o4RUP5AcCeM6BFpaobS7HOMtHCM+HrwbhHge8fIXhgFBQUpvlafM/gyTCaTqGPC18EXZQPlwsxisfjMtZOSY6RWGA0Qiw5n96LawsjVcH26s+KL5Gf7hVzpNkGL5OsbN24Iz4eqEEYDmDDyO3hhBIgXM1SjQapIGNF2tlaOkS+Sb6UIo3///VfYVtoxioyMFJJ+/ckxokcJ+kIYhYSECCPf7ENpNWrUUD35G3AUJ1pNMMk/DHNycgTXTsk5e5wh1TFSi4ocI61Cab4WJvbCyNeOEZ0Afv369SqXXwQwYeR30MKIX6gUUKdBqijHSO0wFiAvlKalY3T06FEAtoapbt26ipav0+mEBk/L5Gv6t8jLyxMJI1+E0jiOc/gt+OvSF2E0wHEuI186Rs6EET0gQW1hRN9f/iiMtAql0cLIF64l3Qm5evWqz4URx3GCa2QvjJR2y/0VJoz8DH9yjOh10vwhlOYLx8jZDOC5ublCMnzbtm1VcS5cCSNfJn3aTxvga8cIKL/OjUYjzGazcE34ShjZz35dlYSRTqcTzj99LxJCfC6MnLUFvDCqUaOGKgLFVSjN144Rfa9p4RgB5eG0nJwc5hgxtKd169bCttqOEZ3b4kwYVTXHyGq1isQgz5EjR4Tttm3bqlIH/rcoKCgQiTOtHCMtcowAsUj1deI14OgY0eFkXwojXiD7UhgBcJiuALB1kPhrUkvHiE8EVnqiW57Q0FDhN/anUJqvywfKhVFxcbGo/WPCiKEJ1apVQ6NGjQCIR8So0SCFh4cLYkMrxygiIkLIK3GXYxQUFKTag8ld0ikAHD58WNhWSxjxPUGLxSL0lgkhsFgsALRJvtbCMeJ/i6KiIk2EkX2OET3pp9rhxLCwMOF35l0CXwsj/jqkXQq1lwPhcZd8XVZWJtybaoWzOI5zuiyJ1snXWjpGAPDHH38I20wYMTSDDqfxqNUg8Q8crXKM6En13DlGag4RrWguI7rH1K5dO1XqQLt3/NxVvgzjAO6FkS9yjIDy36K4uFjkWGnhGOXn5/s0v4LjONEkm4DvhRF//Ddv3hREuS8mdwTcO0a0UKFzgZSG3zcLpZULo8zMTABA3bp1feZYaQ0TRn6Is965Wg0Sn2eUm5vrkF/jC2EElDc27nKM1JzDRaow4jgOt9xyiyp1oBs8viH09cKN/iCM6Oucb5AB7RwjNadpcAb/G2gtjIByceCL5UAA98KIdm3UTIDm66ClMKpZs6aQx6hF8jVfB3tatWrlk7L9ASaM/BBnPSK1hVFJSYnIMudf41Fz4UC6l2qPLxwjdzP+WiwW/PPPPwBsw/TVmGgTEDd4/uAY5eXlCY5NVFSU6pML8tDn98KFC8K2VsnXvk48pSeYJIRoFkoDygW6Fo6R/X1Itw2+cIyMRqMwTYKvR6UFBQUJ7bI/OEY8TBgxNMXZja/Wg8ndyDRfOUZ8Y2M2mx2Sn7V2jPLy8oTzoMbcKTx0KM3fHCNfuUWA+MGrhTCyF4e8YxQeHq5a0q+z8i0WC4xGoyCM9Hq96mvF0eUD5YLAH0JpvnKM6LaXbwu0SH7mr/fz588LHSVflt+yZUtJr1VWmDDyQ3zpGLmby8jXjhHgOPMzL4y0yjGi/1ZzOQB7pwIQCyNfLiIL2K4FXij7KvEa0N4xolcO//bbbwXHKDExUZiEU03o6yAvL08QRrVr1/ZJ+YHgGPkilEaXqaUwAoDffvsNgK0N9tVyHN27d3f4rZljxNAULUJpgHaOkSthRAgRxJlWjpGvhJGz3A5f9ZJ5wsPDBQHGhw8B7YTR+fPnhW1fCaOkpCT07NkTAHDy5ElBnPpqYjtamAwfPhyXLl0C4JswGhAYjpEvQmmA8/vQV8KoV69eDq/5KowG2Nr73r17i15jjhFDU6qaMHLmltiX7w/CSK38IsD5A0mLGW/5etBlOxslqRbx8fHCdnp6urDtK2EEAM8//7zDa74apkxfB/Qw6aoujHzlGDmb/drXOUYA8Pjjj+OHH35wGKHmS1JSUkR/+zKkrjVMGPkh/iKMtAil0b0zXwkzfxBGzsShFkmX9j3iqKgoPPfccz4pGwBGjhzp9OHji/wangEDBqBZs2ai13zlGLlyJHz1QPbXUJqWjhF/P4aFhSEkJES1smk4jkP//v2x5P/bu/OoKOv9geNvZB0GUCRjExXXUm8umVIipEAhhnpyyUpNzSVpw4v9NDpdd01v5bF7SzkueK+n3TYxxHLJNK2u5lYdQ5S8gKLiAs6ww/z+gHmaR0Hpd5jnmZ/zeZ3TaXxm+S7MPPOZz3d5Vq5UjvXv31+Tsq3i4+OV22FhYZqWrTcJjByQo8wx0nsozXaVnDNljKxfAnoERvfee6/q3y+99JKmvxRDQ0NZtGiR6lhwcLBmX0hQd2mM9957T3Xs+kDJXhoLjCIiIjQvX+uMke1r65UxutkcIz328Hn88ceZPHkyXl5ezJw5U9Oyw8PDmTt3Lp06dWLt2rWalq03+8/oFH+as2WMmjKUdrtnjBxhKA0gPT2de++9l4yMDMLDw5k9e7Ym5dpKTEzE1dWVLVu2UFFRoWnGyuree+/lwIEDzJw5k44dO/Lggw9qUm5DX/orVqxgxowZmpSvZ2Dk6uqKt7c3paWlDpExun4oTY/AyMXFhQ0bNrB+/Xq7XKPxVpYtW8ayZcs0L1dvEhg5IEcJjPTIGNn+MnSmjJGjDKUZjUbmzJnDnDlzNCmvMTNnzuTZZ5/VtQ4REREcPnxY0zKv/zvHxMTw0ksv6VK+9f2n1SVBoC5jU1pa6hBzjK5du0Ztba0SlOm567MeQZEz020orbKykgULFpCQkEB0dDTTp09X7TK7ceNGYmNjGTJkCKtWrVLtyvzLL7/w+OOPM3DgQKZPn865c+eU+8rLy3n11VeJiopi2LBhZGVlqcrNyMhQylywYIFqSbSjcLZ9jJoylKZVxuj6E7IeGSPrl4AegZHQ1/VfvuHh4bqVr3XGCP4YytJrVZrt56yoqAiz2ax89zjL5TCEjoFRTU0NoaGhpKens2vXLqKiokhJSQHq9m3YvHkzGzdu5KOPPmLfvn1s2bIFqAuo/ud//odx48axa9cuevbsyd/+9jflddPS0iguLiYzM5OlS5fy2muvKct+c3JyWLlyJa+//jpffvklZ8+eZf369do3/hb0yhjptY+RrEqr28DR2kY9M0ZCX9d/+VovKK2VhjJGhYWFyjF7bllh+/o3G0qzZ8YoJCREuX327Fld9jAS+tNtKM1gMDB16lTl34899hirVq3i6tWrZGZmMnr0aNq2bQvUrVTZtm0bI0aM4NChQxgMBkaMGAHAtGnTiI2N5dy5cwQHB5OZmckbb7yBj48PvXr1Iioqiq+++opp06aRlZVFXFycslHV1KlTWbx4Mc8880yDdaysrKSyslJ1zM3NzS4TQa3bz9fW1t4QBLi4uODu7q48pjl5enpiMBgoKyvj8uXLqjJsMzYeHh52KR/UgWBxcbFSju3J0cvLy27l2/a3yWRSlWN7/TaDwWC3OkDdCb+srEzpA9sdb/38/OxatqOw/Rw4o+t/FLVr107TvjAajbi4uGCxWCguLqampoYdO3YAde//u+++2671sQZGFRUVVFZWKuda26E0Hx8fu9XBdnfzgoIC1WfQ19dXk7+Fs38GwH590NRNUh1mjtGxY8do3bo1rVq1Ijc3V7WHQteuXXn77bcBOH36tGrprMFgoG3btpw+fRqj0cilS5dU93ft2pVffvlFee7999+v3NelSxcKCgooLy9vcKgmPT39htn4Y8aMYezYsc3T6AZYL5xpNBqVwMBgMKh2AW5uLVu2pKysjIsXL6o21SsqKlJuX758WXVfc7INPgoLC5VybC8iWl5ebrfybU9+RUVFqnJsh2mvXbtmtzrAH1nBq1evcubMGU3LdjS2f3tncn2mxGAwaP53NxqNmEwmioqK2LlzJwUFBUDdcnF776Xj6uqq3P7tt9+U7JD1XOTm5kZhYaHd5txUVVUpgWFubi6//fabcp+Li4umfwtn/QzYau4+aOrQtEMERiaTiaVLl5KUlATUjS/bpmyNRqMy5lxWVnbDkIbRaKSsrIzS0lJcXV1VQc7Nnmsto6ysrMHAaPLkyTz55JOqY/bMGOXl5REWFkaLFi3w8/NTTpJGo5H27ds3e5lWbdq0obCwkOLiYlU5ttfnCg8Pt1sdbK8TZjablXJs3wPBwcF2K9928zyLxaIqx/YXRqdOnez6dwgICCA3NxeTyURYWJgqW9mzZ09NLguit+s/B87m+o0cIyIiVMM7WmjdujUmkwmz2azaAX348OF2ff+D+uKlLVu2VC7RYh3W9/Pzs/vw4p133sn58+e5dOmS6nshLCzM7u0H+QyA/n2g+5m2oqKClJQUIiMjleExb29vVRbBbDYrv6YNBkOD80AMBgPe3t7U1NSoMkA3e661jMbmr3h4eGi6fwrUfRG3aNECX19fJWPg7e1t1zeHdZ5ReXk55eXlSn/ZzjGyZx1atWqFr68v165do6CgQCnHNjAwGAx2K9/62rW1tZjNZlU5tpNAfX197fp3sM5hsFgslJaWKnM8fHx8NH8f6s36OXA21/9ACwkJ0bwfrO/D4uJivvrqK+V4fHy83etiO8eppKREKc86x8jen0Go20vr/PnznDt3jr179yrHw8PDNf1bOOtnwJZefaBrr1dXV5OamkqbNm1ITk5WjoeHh6tWqGVnZytXNu/YsaPqvrKyMvLz8+nYsSN+fn4EBAQ0+bknT54kNDRUswvz/Rm2cw3sOfEY1Js82q5M02ryNfyxs2peXp6yCkSr5fouLi5KJlGvydegnlRaUlKiBEYy8dq5WN8HPj4+unwpWAOj8vJydu7cCdQFC1pcK8s2Y2Q7lG+dY6TFDuDWDF1NTQ1paWlA3Rf0sGHD7F62cAy6BkZLliyhoqKC+fPnq8aMExIS+OSTTygoKKCoqIh3332XoUOHAnUbr5WVlZGRkUFlZSXr16+ne/fuyqS5hIQE1q1bh9ls5vjx43z77bfExcUBdb94duzYwYkTJzCZTGzYsEF5XUdjGxjZew+Lxpbsa7VcH+pOvNYyravjtFquDzhEYHT9UmnrihgJjJzLv/71L5KSklTZCi3Zvt+qq6sBGDhwoCZ76TS0E391dbVyLrDnUn0r67kI/lghGhkZ6VTXCnN2ug2lnTt3joyMDDw9PVVXEn7rrbeIjIzk5MmTTJw4kdraWkaOHMnw4cOBuuGtFStWsGjRIl577TW6d+/OwoULlefPmDGDxYsXEx8fj5+fH3PnzlXGpDt37kxycjKzZs3CbDYzZMgQpkyZomm7m8o2EKipqbFrWY0FRnpkjADy8/O54447NFuuD44RGNn+Gi4qKlKG8SQwci69evVi+PDhug2jNLQsXavrdDUUGGm1uaNVQ3O6Ro4cafdyhePQLTAKDg7m4MGDjd4/efJkJk+e3OB9PXr04IMPPmjwPi8vLxYvXtzo6yYmJpKYmPjnKqsD29UZWgZGtnsZ2QYmWgZGeXl59O7dW7OhNLh1YOTh4aGajG4Ptl9ItqsQJTASWrrrrrtuOHbfffdpUnZDw/pabe5oZZsxspLAyLk498wuB2a7AsmazrYX23H9ixcvKretgZG7u7sqULMH25NRfn6+qnyw/1Ca9YRr3T/FynZloL3ZBka2y4JlYzmhpTFjxqj+3aJFC/r27atJ2bbnIkfJGA0YMEDzHciFviQwclBaZoysG2mCOlNhHUqzd7YIbswYgXaTr6Hx4UQtAyPbX8OSMRJ66datmypr5Onpafcdr61sM0bWydda7XptdX3G6PHHH7d7mcKxSGDkoLQMjGz3Bfn999+V29aMjRar9myDMz0yRg3NbQDHyBhJYCS0ZrsoRathNGj4c2i7Ok2Lz8L1GSN7bugrHJMERg5Ky8DIuokaqAMjyRhJYCSc05w5c7jzzjtxdXVl/vz5mpXb0Ofw5MmTyjHr1iv2FBAQoJwThw0bprpMiHAOum/wKBqmZWBkMBgICgpSXY4DtM0Y+fr64uPjg8lkajBjpOVeTtZfqpWVlcr8Li0CI9thAttLEUhgJLQWGBjI6dOnuXbtGkFBQZqV6+7ujp+fHyUlJcrn0DYw6tKli93r4OLiQmZmJllZWUyYMMHu5QnHI4GRg7JdAaXF/iEdOnSgsLCQs2fPUlFRgaenp6aBEdSlsLOzs8nPz8disahWiOkRGGm5VB8an2StxcZ6QlzPaDRq8r6/3h133EFJSYkyhKZ1YAR1K5979OihSVnC8chQmoN69dVXlX1MNm3aZPfybK8BZJ34q+VQGqD8Mi0vL6eoqEg5Mbq4uNg9a+IIgVF4eLiqHgDTp0/ngQcesHvZQjgK62fgypUr1NTUkJ2drRy3HWoTwl4kY+SgOnbsyE8//cTVq1eJioqye3nXT8Bu27atpsNIgGosPz8/XwmMWrdubfftAhqa26B1YOTl5cXnn3/Ol19+yb59+xg1ahQvvviiJhlDIRyF9bNosVg4d+6cMrSuVbZICAmMHFivXr00K8s2MDpz5oxq346GNjyzB9vAKC8vTwmMbPc2sRdHyBhBXV8vWbLE6S8eKZyX7Wfxxx9/VG5LYCS0ImdfAdyYMbL+SgP1Unp7sp3keerUKWVjNy2uUdRQYGQymZRjesy1EMIZ2f4QOnDggHJbAiOhFQmMBKCeY6RXYGSbMTpy5IhyW4uMkSMMpQkh1D9SXn/9deW2BEZCKxIYCUAdGJ0+fdrpAiNvb29l9V1DQ2la7fwrhLO7fgGCVdeuXTWuiXBWEhgJoC4wsAZA1iXzVnoMpR07dky5rUVgBH+ckPWcYySEs2to5VlMTAy9e/fWvjLCKUlgJBTdunUD6gKDo0ePKse1Cox8fHwa3MtHj8DIYrGodsCWC7kKoY3o6GglQ/vUU09x7Ngxvv76a1mQIDQjq9KEomvXruzcuROAffv2AXU7cGu5821YWBjFxcWqY1oFRtZfqpWVlZSWllJQUKDcd/31k4QQ9hEUFMQ333zDnXfeqbpUkBBakRBcKKwZI1vBwcF230PIVkPZKa0zRlCXNbINjLTaskAIUfcjRT5zQi8SGAlFQ5MbtRpGu1l5EhgJIYTQigRGQuEIgVFDqXOth9IALl68qARG/v7+eHt7a1IHIYQQ+pI5RkLRoUMH3N3dqaqqUo5pHRjZ7rhtpVVgZLuR5IQJE7hw4QIg2SIhhHAmkjESCldXVzp37qw6pvXkx9jYWNW1wdzc3PDz89Ok7MTERCVrZA2KQAIjIYRwJhIYCZU+ffoot0NCQnj00Uc1LT8wMFB1Nfnq6mrNLqLapUsXjh8/fsM+KhIYCSGE85DASKgsXryYqVOn8uabb5Kdna26hppWRowYoXmZViEhIURERKiOSWAkhBDOQwIjoRIeHs7atWuZNWuWbrs9Dx8+XLlte6kSrfTv31/1bwmMhBDCeUhgJBxOt27dmDVrFm3btuXtt9/WvHwJjIQQwnlJYCQc0ptvvkleXh7Dhg3TvOz77rtP9W8JjIQQwnlIYCTEda7fHkACIyGEcB4SGAnRgJdffhmA3r17q/Y3EkIIcXuTwEiIBixatIgffviBffv2abZdgBBCCP3JztdCNMDV1fWGSdhCCCFuf5IxEkIIIYSoJ4GREEIIIUQ9CYyEEEIIIepJYCSEEEIIUU/XyddpaWns2LGD33//ncWLF/Pwww8DsHTpUrZt26Y8rrKykgceeICVK1cC0K9fP7y8vJTVQpMnT2bKlCkAlJeXs2TJEvbs2YOvry/PP/888fHxymtlZGSwevVqzGYzQ4YMITU1FXd3d62aLIQQQggHpmtgFBYWRkpKCmvWrFEdT01NJTU1Vfn3k08+SXR0tOoxn3/++Q0b8UFdsFVcXExmZianTp3ixRdf5O6776Z9+/bk5OSwcuVK/vnPf9KuXTtSUlJYv349zzzzjH0aKIQQQoj/V3QdSktISCAiIgIPD49GH5Obm0tubi6xsbFNes3MzEymT5+Oj48PvXr1Iioqiq+++gqArKws4uLi6N69Oz4+PkydOlWVmRJCCCGEc3P4fYy2bdtGZGQkPj4+quPjx4/HxcWFAQMGkJycTKtWrSgpKeHSpUt07txZeVzXrl355ZdfADh9+jT333+/cl+XLl0oKCigvLwcLy+vG8qurKyksrJSdczNze2mgdz/VW1trer/zsbZ2w/SByB94OztB+kDZ28/2K8PWrRoWi7I4QOj7du3k5ycrDq2du1a/vKXv3Dt2jWWL1/OwoULefPNNyktLcXV1VUV5BiNRkpLSwEoKyvDaDQq91mDrbKysgYDo/T0dNauXas6NmbMGMaOHdtczbtBXl6e3V77/wNnbz9IH4D0gbO3H6QPnL390Px9EB4e3qTHOXRgdPToUUpKShg4cKDqeJ8+fQDw9/dn9uzZDBs2jKqqKry9vampqVFlgMxmM97e3gAYDAbMZrPyOiaTSTnekMmTJ/Pkk0+qjtkzY5SXl0dYWFiTo9rbibO3H6QPQPrA2dsP0gfO3n7Qvw8cOjDKysoiJibmpoGItdMsFgt+fn4EBASQk5NDz549AcjOzqZjx44AdOzYkZycHOW5J0+eJDQ0tMFsEYCHh4ddgqCbadGihdN+GEDaD9IHIH3g7O0H6QNnbz/o1we69np1dTUVFRVYLBbltnVMsbq6mq+//lq11B7g1KlTZGdnU1NTQ0lJCW+88QYDBgxQApiEhATWrVuH2Wzm+PHjfPvtt8TFxQEQHx/Pjh07OHHiBCaTiQ0bNjB06FBtGy2EEEIIh6Vrxmjx4sVs3boVgMOHDzNv3jzWrFlDv379+P777/H09KRv376q51y+fJlly5Zx4cIFjEYj/fv3Z/78+cr9M2bMYPHixcTHx+Pn58fcuXPp0KEDAJ07dyY5OZlZs2Yp+xhZ9z8SQgghhHCxWCwWvSsh6sZUz5w5Q/v27Z0yfers7QfpA5A+cPb2g/SBs7cf9O8DCYyEEEIIIeo5ZzgqhBBCCNEACYyEEEIIIepJYCSEEEIIUU8CIyGEEEKIehIYCSGEEELUk8BICCGEEKKeBEZCCCGEEPUkMBJCCCGEqCeBkRBCCCFEPQmMhBBCCCHqSWCkocTERI4fP653NRzClStXePHFFxk4cCCPPvooP/74IwDffPMNo0aNIjo6mocffpg333yTmpoanWvb/Bprf0ZGBgMGDGDQoEHKf4WFhTrX1j4a64OlS5eq2j9gwABmzZqlc23to7E+KC8vZ8mSJcTFxfHQQw+xadMmnWtqH2lpaYwZM4b77ruP7du3K8d/+uknpk2bRmRkJM8//7yONbSvxtrvLOdBaLwP9DwXSmAkdLF8+XLatGnDzp07eeGFF5g7dy4lJSV0796ddevWsWfPHj7++GNycnL47LPP9K5us2us/QD9+/dn7969yn9BQUE619Y+GuuD1NRUVfs7d+5MdHS03tW1i8b6YP369Zw9e5bPPvuMf//733z66accOHBA7+o2u7CwMFJSUujRo4fquJeXF6NGjWLSpEn6VEwjjbXfWc6D0HgfgH7nQgmMdHDs2DEmTpxIdHQ0jzzyCB988IFyX1paGn/729+YM2cOUVFRTJo0iXPnzulY2+ZXWlrKnj17eOaZZ/Dy8uLBBx+kU6dOfPvtt9x55534+/urHl9QUKBTTe3jZu13Fk3tg9zcXHJzc4mNjdWppvZzsz44cOAATzzxBD4+PgQFBTF8+HC+/PJLvavc7BISEoiIiMDDw0N1vHv37sTHxxMYGKhTzbTRWPud4Txo1Vgf6EkCIx24ubmRmprK7t27WbFiBatXr+bEiRPK/bt372bcuHHs2rWLdu3asXbtWh1r2/z++9//4uPjwx133KEc69KlC6dPnwbgyJEjREdHM2TIEHJychgxYoReVbWLW7X/6NGjxMTEMGbMGDZv3qxXNe3qVn1gtW3bNiIjI/Hx8dG6inZ3qz6wWCzKcYvFckPfiNvb7X4ebAq9zoVumpUkFN27d1fdHjhwIEePHuWuu+4CICIigj59+gDw0EMPkZaWpks97aWsrAyj0ag6ZjQaMZlMAPTu3Zs9e/ZQUFDA1q1b8fX11aOadnOz9vft25cPPviAoKAgfv31V2bPnk1AQACDBw/Wqbb2cav3gNX27dtJTk7WsGbauVkfRERE8P7779OrVy+uXbvG1q1bdaql0Mvtfh68FT3PhZIx0sGpU6dISkoiNjaW6Ohodu/eTXFxsXK/bQrVy8uL0tJSPappNwaDAbPZrDpmNpsxGAyqY6GhoXTq1Ik33nhDy+rZ3c3aHxoaSkhICC1atKBnz56MGzeO3bt361RT+2nKe+Do0aOUlJQwcOBArauniZv1wdNPP01ISAijR4/mhRdeICYmhjZt2uhUU6Gn2/U8eCt6ngslMNLBihUr6N27N1u3bmXPnj0MHjxYlTa/3bVr1w6TyURRUZFy7OTJk3Ts2PGGx1osFvLz87Wsnt39mfa7uLhoWTXNNKUPsrKyiImJcai5B83pZn1gMBh45ZVX2L59O5s3b8bFxUWVaRbO5XY8D/5ZWp4LJTDSQWlpKT4+Pnh6enL48GG+++47vaukKW9vb6KiokhLS6O8vJw9e/Zw6tQpoqKi2LFjh7IkMy8vj40bN9KvXz+da9y8btb+/fv3c+XKFQBOnDjBhx9+yKBBg3SucfO7WR8AVFdX8/XXXxMfH69zTe3nZn1w/vx5ioqKqKmp4fvvvycjI4MnnnhC7yo3u+rqaioqKrBYLMrt2tpaamtrqaiooLq6WnX7dtNY+53hPGjVWB/oeS50sThTqkJniYmJLFu2jNLSUpYsWcKVK1cYMGAAXl5etG3blhkzZpCWlsalS5dITU0F4ODBgyxbtoxPPvlE59o3rytXrjBv3jwOHTpEYGAgc+bMYcCAAWzYsIHNmzdTUlJCy5YtiY2NJSkpCU9PT72r3Kwaa//KlSvJzMykvLycNm3aMHbsWMaNG6d3de2isT4A2LdvH8uWLSMjI4MWLW7f32+N9cHBgweZN28eV69epUOHDsyePVuZd3g7mT9//g3zp9asWQPAM888ozr+yCOPMH/+fK2qponG2n/s2DGnOA9C432wd+9e3c6FEhhpKCYmhvT0dNq1a6d3VYQQQgjRgNv3p5iDOXjwIADBwcE610QIIYQQjZHl+hpYsmQJ33//Pa+88gru7u56V0cIIYQQjZChNCGEEEKIejKUJoQQQghRTwIjIYQQQoh6EhgJIYQQQtSTwEgIIYQQop4ERkII3R08eJB+/frRr18/zp49q3d1hBD1KisrWbBgAQkJCURHRzN9+nRycnKU+zdu3EhsbCxDhgxh1apVyuWtqqureemllxg6dCj9+vVTXfoG6jZ2vP/++xk0aBCDBg1i7NixN61HWloaS5cubf4GNkCW6wsh7CoxMZFz587d9DGDBg2iZ8+eAA5zbbSDBw8quy9v2bKFkJAQnWskhPZqamoIDQ0lPT2dO+64g/fff5+UlBS++OIL9u3bx+bNm9m4cSNeXl7MnDmTDh06MGLECAD69u3LxIkTmTx5coOvPWPGDCZNmqRha5pGAiMhhF1169aNgIAAAC5cuMCFCxcA6Nq1qxIERUdHM3LkSL2qKIRohMFgYOrUqcq/H3vsMVatWsXVq1fJzMxk9OjRtG3bFoDx48ezbds2RowYgZubG48//rhd6lRbW8ucOXM4cuQINTU13HfffaSmptKyZUvOnj3L6NGjeemll5TLy7zwwgsMGzasya8vgZEQwq5ef/115XZaWhpr165VjluzMNahNPgjO2O9hlJwcDAzZsxg9erVmEwmhg8fzrPPPsvbb7/Nli1b8PX1ZdKkSYwePVop5+LFi7zzzjscOHCAq1evEhgYSGJiIpMmTcLNre60d/z4cd555x2ys7MpLS3F39+fbt26kZKSwpdffqnUE2D48OHAH9fr2rRpE9u2baOwsBCz2Yyfnx+9e/fmueeeo3379gBkZGSwYMECAF577TU2bNjAmTNnuPfee1mwYAHffPMN69ato7y8nLi4OGbPnq3UzdoXycnJ/Prrr+zduxcvLy9GjRrFjBkzNL3SuBC2jh07RuvWrWnVqhW5ubkkJCQo93Xt2pW33367ya+1adMmNm3aRPv27Xnuuefo27dvk587ePBgFi5cSE1NDS+//DLr1q0jJSUFgKqqKs6cOcPWrVs5dOgQc+bMISYmBi8vrya9tswxEkI4tKKiIl577TXc3d0xm828//77TJgwgS1btuDj40NhYSErVqwgNzcXgKtXrzJp0iQyMjIoKysjPDycwsJC1qxZw5IlS4C6X5zJycn85z//wc3NjfDwcKqqqti7dy+FhYUEBgYSHh6u1KFr16707NlT+WV86NAh8vLyCAgIoEOHDpSUlLB7926SkpKoqKi4oQ3z5s2jsrKSyspK9u/fz/Tp01m+fDmenp4UFxezefNmvvjiixue984773D48GF8fX25cuUK69at48MPP7RHNwtxSyaTiaVLl5KUlARAaWkpPj4+yv1Go5HS0tImvda4ceP47LPPyMrKYsyYMcyaNYvCwsImPbdFixYkJCRgMBjw8fHhiSee4MiRI8r9FouFqVOn4u7uTkREBB4eHuTn5ze5nZIxEkI4tKqqKlavXs0999xDYmIi58+fJy8vj08//RR/f39iY2OpqKjg0KFDhIeH89FHH3H+/HkCAgL44IMP8Pf355tvvmH27Nls3bqVKVOm4OvrS3FxMQDp6elK5urUqVP4+/vTr18/2rZtq8wxss1uATz//PO0b99eyfD88MMPPPvss5w/f56jR4/Sv39/VRumTJnC008/zauvvsq2bdvIzc1l0aJFDB06lKlTp3LkyBEOHjzIqFGjVM/r0aMHq1evBmDmzJkcPnyY9PR0za4yLoRVRUUFKSkpREZGKnOIvL29MZlMymPMZjPe3t5Ner277rpLuT106FAyMzP54YcfGDFiBGPHjlXmJX788ccEBQWpnltdXc2qVavYvXs3165dw2Kx0KpVK+V+Dw8PVcDm5eVFWVlZk9sqgZEQwqFZh6kAgoKCOH/+PJ06dVICFX9/fwoLC7l8+TIAv/zyCwCXLl0iLi5O9VoWi4Wff/6ZoUOHcs8993Ds2DFGjx5NWFgYnTp1IjIykvj4+FvWqbCwkKVLl5KTk0NpaSm2V1a6ePHiDY+PiooC1BeRHjRoEAChoaEcOXJEqb+tmJgYJfiKiYnh8OHDXLp0iStXruDv73/LegrRHKqrq0lNTaVNmzYkJycrx8PDw8nJySEyMhKA7OxsOnbs+H8qw3Z4+KOPPrrpY7OyspQfCW3atOHAgQPNumJNAiMhhEMzGo3KbVdX1xuOWU+o1uDE+n+j0agaDrOyzjN45513yMrK4ujRo+Tm5rJz506++uorioqKmDhxYqP1yc/PZ/bs2VRVVWE0Grn77ruprq4mOzsbqBuma6wN1voDyi/a6+svhKNZsmQJFRUVLF++XBXAJCQksHz5cuLi4vD09OTdd9/lySefVO6vrKxU3tdVVVVUVFTg6ekJwM6dO3nggQdwd3dn165dHD16lLlz5zapPmazGQ8PD3x9fbl69SqbNm1qxtZKYCSEuM306NGD/fv34+rqytKlS5XMktlsZvfu3QwePBiLxcKxY8dITExUVsMtXLiQLVu2cPjwYSZOnKiaqGmbhv/tt9+oqqoC4B//+Af33HMP27dv55VXXmn2tuzcuVOZVL5r1y4AAgICJFskNHPu3DkyMjLw9PRk8ODByvG33nqLyMhITp48ycSJE6mtrWXkyJHKQgWAUaNGKUNiiYmJQN1CC4D33nuPhQsX4uLiQvv27fn73/9+yy0xrEHZsGHD+O6774iLiyMwMJCRI0c269w7CYyEELeVsWPH8sUXX3DhwgVGjRpFeHg4ZrOZ8+fPU11dzSOPPEJNTQ1JSUkYjUYCAwNxcXFRJm937twZgLZt2+Lm5kZ1dTVJSUkEBwczfvx4OnfujKurKzU1NTz//PMEBQVx6dIlu7TlxIkTJCYm4uLiomxz8NRTT9mlLCEaEhwcrAQzDZk8eXKj+xRlZGQ0+rz169f/qXqUlZXh5+cH1GVb33rrLdX948ePByAkJIT9+/c3uR4NkVVpQojbir+/P+np6SQmJtKyZUtOnTpFRUUFffr04a9//StQN6Q1atQoQkJCuHDhAvn5+QQHBzNhwgSmTZsGQKtWrZg9ezaBgYFcvnyZn3/+mUuXLtGhQwdeffVVQkNDqa6uplWrVspqt+aWlJREv379MJlMtGzZkilTpsjEa+F0TCYTBw4cUE3YticXiwxsCyGEQ7HuYzRv3jxlCEIIZ3T48GFSUlJ48MEHSU1NVRYj2JMMpQkhhBDCIfXp00eZX6cVGUoTQgghhKgnQ2lCCCGEEPUkYySEEEIIUU8CIyGEEEKIehIYCSGEEELUk8BICCGEEKKeBEZCCCGEEPUkMBJCCCGEqCeBkRBCCCFEPQmMhBBCCCHqSWAkhBBCCFHvfwFFAt3ctAXalwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "series = ElectricityConsumptionZurichDataset().load().astype(np.float32)\n",
+ "\n",
+ "# extract target and resample to hourly frequency\n",
+ "series = series[\"Value_NE5\"].resample(freq=\"h\")\n",
+ "\n",
+ "# plot 2 weeks of hourly consumption\n",
+ "ax = series[: 2 * 7 * 24].plot()\n",
+ "ax.set_ylabel(\"El. Consuption [kWh]\")\n",
+ "ax.set_title(\"Target series (Electricity Consumption) extract\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab445a33-9a50-4695-8de4-09bcc007f787",
+ "metadata": {},
+ "source": [
+ "Extract a train, calibration and test set. Note that `cal` does not overlap with the training set `train`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "29a5b91e-543f-46e0-8dbd-12da2f09522f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkYAAAHECAYAAADcTeUiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACCq0lEQVR4nO3dd1hT99sG8PuwNwoiKFCGiIpW664/91YUV3HV1lVHa5dW29rhrLO1Wttqi7vDUWv1rbj3qq0DN07cMmQpSggz5/0DiAQCJJBxAvfnurxMznxOckiefKcgiqIIIiIiIoKZsQMgIiIikgomRkRERER5mBgRERER5WFiRERERJSHiRERERFRHiZGRERERHmYGBERERHlYWJERERElIeJEREREVEeJkZEpLF169ZBEATlPxsbG3h4eKBjx46YP38+4uPjy3zsq1evYubMmbh3757uAi6HkydPYubMmXj69KnBz33v3j0IgoB169Ypl+W/9gVfnw0bNuC7774zeHxEFRkTIyLS2tq1a/Hvv/9i//79WLZsGV555RUsXLgQ9erVw4EDB8p0zKtXr2LWrFmSSoxmzZpllMRInV69euHff/9FjRo1lMuYGBHpnoWxAyAi09OgQQM0a9ZM+fy1117DpEmT0KZNGwwYMAC3bt2Cu7u7ESOseNzc3ODm5mbsMIgqPJYYEZFOvPTSS/j222/x/PlzhIWFKZefPXsWQ4YMga+vL2xtbeHr64uhQ4fi/v37ym3WrVuHgQMHAgA6duyorKrLr0rav38/+vbtCy8vL9jY2CAgIADjx49HYmKiSgwJCQkYN24cvL29YW1tDTc3N7Ru3bpIKdaBAwfQuXNnODk5wc7ODq1bt8bBgweV62fOnImPP/4YAODn56eM58iRI8Ve/507dzBkyBDUrFkT1tbWcHd3R+fOnXHhwgXlNr6+vujduze2bduGhg0bwsbGBv7+/vj+++9LfX0LV6V16NABO3fuxP3791WqN/P99NNPaNSoERwcHODo6Ii6devi888/L/U8RJUdS4yISGeCg4Nhbm6OY8eOKZfdu3cPderUwZAhQ+Di4oLY2Fj89NNPaN68Oa5evYpq1aqhV69emDdvHj7//HMsW7YMTZo0AQDUqlULAHD79m20atUKY8aMgbOzM+7du4fFixejTZs2uHz5MiwtLQEAb775Js6dO4e5c+ciMDAQT58+xblz55CUlKSM5/fff8fw4cPRt29f/PLLL7C0tERYWBi6d++OvXv3onPnzhgzZgySk5Pxww8/YOvWrcrqq6CgoBKvPScnB19//TVeeuklJCYm4uTJk0Wq4i5cuICJEydi5syZ8PDwwPr16/Hhhx8iMzMTU6ZM0fi1Xr58OcaNG4fbt29j27ZtKus2bdqECRMm4P3338eiRYtgZmaGqKgoXL16VePjE1VaIhGRhtauXSsCEM+cOVPsNu7u7mK9evWKXZ+dnS2mpqaK9vb24tKlS5XL//zzTxGAePjw4RJjUCgUYlZWlnj//n0RgPj3338r1zk4OIgTJ04sdl+ZTCa6uLiIISEhKstzcnLERo0aiS1atFAu++abb0QA4t27d0uMRxRFMTExUQQgfvfddyVu5+PjIwqCIF64cEFledeuXUUnJydRJpOJoiiKd+/eFQGIa9euVW6T/9oXjKdXr16ij49PkfO89957YpUqVUqNm4iKYlUaEemUKIoqz1NTU/Hpp58iICAAFhYWsLCwgIODA2QyGa5du6bRMePj4/H222/D29sbFhYWsLS0hI+PDwCoHKNFixZYt24d5syZg//++w9ZWVkqxzl58iSSk5MxYsQIZGdnK/8pFAr06NEDZ86cgUwm0/qaXVxcUKtWLXzzzTdYvHgxzp8/D4VCoXbb+vXro1GjRirLXn/9dTx79gznzp3T+tzqtGjRAk+fPsXQoUPx999/F6lyJKLiMTEiIp2RyWRISkpCzZo1lctef/11/PjjjxgzZgz27t2L06dP48yZM3Bzc4NcLi/1mAqFAt26dcPWrVvxySef4ODBgzh9+jT+++8/AFA5xh9//IERI0Zg1apVaNWqFVxcXDB8+HDExcUBAB4/fgwACA0NhaWlpcq/hQsXQhRFJCcna33dgiDg4MGD6N69O77++ms0adIEbm5u+OCDD/D8+XOVbT08PIrsn7+sYJVfebz55ptYs2YN7t+/j9deew3Vq1dHy5YtsX//fp0cn6giYxsjItKZnTt3IicnBx06dAAApKSkYMeOHZgxYwamTp2q3C4jI0PjBOTKlSu4ePEi1q1bhxEjRiiXR0VFFdm2WrVq+O677/Ddd9/hwYMH2L59O6ZOnYr4+Hjs2bMH1apVAwD88MMPePXVV9Wer6y96Xx8fLB69WoAwM2bN7F582bMnDkTmZmZ+Pnnn5Xb5SdpBeUvc3V1LdO51Rk1ahRGjRoFmUyGY8eOYcaMGejduzdu3rypLG0joqKYGBGRTjx48ABTpkyBs7Mzxo8fDyC3JEUURVhbW6tsu2rVKuTk5Kgsy9+mcClSfk+rwsco2PNNnZdeegnvvfceDh48iH/++QcA0Lp1a1SpUgVXr17Fe++9V+L+xcWjicDAQHz55Zf466+/ilSPRUZG4uLFiyrVaRs2bICjo6Oy0bmmrK2tS43P3t4ePXv2RGZmJvr164fIyEgmRkQlYGJERFq7cuWKsn1OfHw8jh8/jrVr18Lc3Bzbtm1Tjrfj5OSEdu3a4ZtvvkG1atXg6+uLo0ePYvXq1ahSpYrKMRs0aAAAWLFiBRwdHWFjYwM/Pz/UrVsXtWrVwtSpUyGKIlxcXBAeHl6kWiglJQUdO3bE66+/jrp168LR0RFnzpzBnj17MGDAAACAg4MDfvjhB4wYMQLJyckIDQ1F9erVkZCQgIsXLyIhIQE//fQTAODll18GACxduhQjRoyApaUl6tSpA0dHxyKvx6VLl/Dee+9h4MCBqF27NqysrHDo0CFcunRJpaQMAGrWrIk+ffpg5syZqFGjBn7//Xfs378fCxcuhJ2dnVbvw8svv4ytW7fip59+QtOmTWFmZoZmzZph7NixsLW1RevWrVGjRg3ExcVh/vz5cHZ2RvPmzbU6B1GlY9y230RkSvJ7RuX/s7KyEqtXry62b99enDdvnhgfH19kn0ePHomvvfaaWLVqVdHR0VHs0aOHeOXKFdHHx0ccMWKEyrbfffed6OfnJ5qbm6v0yrp69arYtWtX0dHRUaxatao4cOBA8cGDByIAccaMGaIoimJ6err49ttviw0bNhSdnJxEW1tbsU6dOuKMGTOUvb3yHT16VOzVq5fo4uIiWlpaip6enmKvXr3EP//8U2W7zz77TKxZs6ZoZmZWYo+5x48fiyNHjhTr1q0r2tvbiw4ODmLDhg3FJUuWiNnZ2crtfHx8xF69eolbtmwR69evL1pZWYm+vr7i4sWLVY6naa+05ORkMTQ0VKxSpYooCIKY/5H+yy+/iB07dhTd3d1FKysrsWbNmuKgQYPES5cuqY2fiF4QRLFQFxIiItILX19fNGjQADt27DB2KERUDPZKIyIiIsrDxIiIiIgoD6vSiIiIiPKwxIiIiIgoDxMjIiIiojxMjIiIiIjyMDEiIiIiysPESCIUCgXu3r1b7IzcpqAiXEO+inItvA5p4XVIC69DeqRwLUyMiIiIiPIwMSIiIiLKw8SIiIiIKA8TIyIiIqI8TIyIiIiI8jAxIiIiIsrDxIiIiIgoDxMjIiIiojxMjIiIiIjyMDEiIiIiysPEiIiIiCgPEyMiIiKiPEyMiIiIyOh8fX2xdOlSY4cBC2MHQERERKapQ4cOeOWVV/Ddd9+V+1hnzpyBra0tEhISyh9YObDEiExSdnY2tm3bhvPnzxs7FCIiKoYoisjOztZoWzc3N9jZ2ek5otIxMSKT9PPPP2PAgAFo0qQJYmJijB0OEVGlM3LkSBw9ehRLly6FIAgQBAHr1q2DIAjYu3cvmjVrBmtraxw/fhy3b99G37594e7uDgcHBzRv3hwHDhxQOV7hqjRBELBq1Sr0798fdnZ2qF27NrZv367362JiRCbp/fffVz7euHGjESMhIqqcli5dilatWmHs2LGIjY1FbGwsvL29AQCffPIJ5s+fj2vXrqFhw4ZITU1FcHAwDhw4gPPnz6N79+4ICQnBgwcPSjzHrFmzMGjQIFy6dAnBwcEYNmwYkpOT9XpdbGNEREQkMc2aNUNcXJzG2+fk5MDc3Lzc5/Xw8MDZs2c12tbZ2RlWVlaws7ODh4cHAOD69esAgNmzZ6Nr167KbV1dXdGoUSPl8zlz5mDbtm3Yvn073nvvvWLPMXLkSAwdOhQAMG/ePPzwww84ffo0evToofW1aYqJEZk8URSNHQIRkU7FxcUhOjra2GGUWbNmzVSey2QyzJo1Czt27EBMTAyys7Mhl8tLLTFq2LCh8rG9vT0cHR0RHx+vl5jzMTEiIiKSmPwSGE3pssRIF+zt7VWef/zxx9i7dy8WLVqEgIAA2NraIjQ0FJmZmSUex9LSUuW5IAhQKBQ6ibE4TIyIiIgkRtPqLABQKBS4f/8+fHx8YGZm2KbDVlZWyMnJKXW748ePY+TIkejfvz8AIDU1Fffu3dNzdGXDxtdERERUJr6+vjh16hTu3buHxMTEYktzAgICsHXrVly4cAEXL17E66+/rveSn7JiYkQmj22MiIiMY8qUKTA3N0dQUBDc3NyKbTO0ZMkSVK1aFf/73/8QEhKC7t27o0mTJgaOVjOsSiMiIqIyCQwMxL///quybOTIkUW28/X1xaFDh1SWvfvuuyrP7927p6wWBNT/6H369Gn5AtYAS4yIiIiI8jAxIiIiIsrDxIiIiIgoDxMjMnlsfE1ERLrCxIiIiIgoDxMjIiIiojxMjIiIiIjyMDEik6dtGyO2SSIiouIwMaJK5cqVK/D19UXXrl01mt+HiIgqFyZGVKn07t0bDx48wIEDB/DHH38YOxwiokrN19cX3333nbHDUCGJxOjSpUto3rw51q1bp1y2bt06dOnSBZ06dcLSpUtVqj8iIyMxdOhQtG7dGuPGjUNsbKxyXXp6OqZNm4Z27dqhV69e2LNnj8q5wsPDERwcjPbt22PWrFnIysrS+/WRbpWnpCd/qHkAiI6O1kU4RERUgRg9MVIoFFi8eDGCgoKUy06cOIEtW7Zg3bp12Lx5M06cOIHt27cDADIzM/HJJ59gyJAhOHToEBo0aIDp06cr9w0LC0NKSgp27dqFefPmYcGCBcovw6ioKCxZsgSLFi3Czp07ERMTg9WrVxv2gqlcTpw4AXd3d50c68iRIzo5DhERVRxGT4y2bt2KBg0awM/PT7ls165dCA0NhZeXF6pVq4Y33ngDu3fvBgBERETA1tYWffv2hbW1NcaOHYurV68qS4127dqFcePGwcHBAY0aNUK7du2wb98+AMCePXvQtWtXBAUFwcHBAWPGjFEel0xD27ZtkZSUpLKsrI2pd+3aBZlMpouwiIgqnbCwMHh6ekKhUKgs79OnD0aMGIHbt2+jb9++cHd3h4ODA5o3b44DBw4YKVrNWRjz5CkpKdi4cSPWrl2LxYsXK5ffvXsXwcHByueBgYFYtmwZAODOnTsICAhQrrO1tYWXlxfu3LkDe3t7JCUlqawPDAxEZGSkct9WrVop19WuXRvR0dFIT0+HjY1NkfgyMzORmZmpsszCwgJWVlblvPKi8m+swjeYKTHWNYiiWOZzPnr0CLVr1y6yvCK8HwCvQ2p4HdLC6yif1157DR988AEOHjyIzp07AwCePHmCvXv34u+//8azZ8/Qo0cPzJ49GzY2Nvj1118REhKCa9eu4aWXXlIep+BnuD6vxcxMs7IgoyZGy5Ytw9ChQ+Hk5KSyPC0tDQ4ODsrn9vb2SEtLAwDI5XLY29urbG9vbw+5XI60tDSYm5urJDkl7Zt/DrlcrjYxWrt2LVauXKmybODAgRg0aFBZLlcjDx8+1NuxDcXQ13D06FGsX78e7dq1w8cff6zVvtHR0SUmuhXh/QB4HVLD65AWKV5HnxkeSEwx12IPTwCKvH9lV805B9tnxWm8fbt27bBy5UplgcTGjRvh7OyMgIAAmJubo0ePHsptx4wZgz///BO//PILhg8fDgDIzs5GcnKySvtPQD/vScGaqZIYLTG6fv06IiMj8emnnxZZZ2dnh9TUVOVzmUwGOzs7ALklRIWrP2QyGWxtbWFnZ4ecnByVEqCS9s0/h62trdoYR40ahWHDhqks02eJ0cOHD+Ht7a1xVis1xrqGvXv3AshtlD958mSNb34A8PT0hI+PT5HlFeH9AHgdUsPrkBYpX8eTVCDuieHPa25uofYzsThvvfUW3n77bfzyyy+wtrbG3r178frrr8Pf3x8ymQyzZ89WtunNzs6GXC5Hamqq8hwWFhZwcXFRPpfCe2K0xOjcuXN48OCBssosNTUV5ubmePToEfz8/BAVFYU2bdoAAG7evAl/f38AgL+/P7Zt26Y8jlwux6NHj+Dv7w8nJye4uroiKioKDRo0ULtvVFSUct9bt27B09NTbWkRAFhZWeklCSqJmZmZ5P5AtWXMa0hKSkKtWrU03r60WCvC+wHwOqSG1yEtUrwOD1cFIGi4sQjk5GTD3NxC832KO6+L5lVOANC3b1+MGzcOu3fvRvPmzXH8+HEsXrwYZmZm+PTTT7F3714sWrQIAQEBsLW1RWhoKLKyslTOIQhCkXMa8z0xWmI0YMAAdOvWTfn822+/hbe3N958801cvHgRCxcuRNeuXWFtbY3169crS26aNm0KuVyO8PBwdO/eHatXr0ZQUBBq1KgBAAgODsaqVaswd+5c3LlzB8eOHVMOA9CjRw+MHz8e/fv3h5eXF9asWYOePXsa/NpJf0y9rQAREQCcXal5UqBQKHD/fjR8fHwMnkzY2tpiwIABWL9+PaKiohAYGIimTZsCAI4fP46RI0eif//+AHILQO7du2fQ+MrCaImRjY2NSkmNtbU17Ozs4OjoiDZt2uDWrVsYPnw4FAoF+vXrhz59+gDILcX5+uuv8dVXX2HBggUICgrC7NmzlccZP3485syZgx49esDJyQlTp06Fr68vACAgIAATJ07EpEmTIJPJ0KlTJ4wePdqg1036xcSIiMiwhg0bhpCQEERGRuKNN95QLg8ICMDWrVsREhICQRAwbdo0k/iMNmrj64Jmzpyp8nzUqFEYNWqU2m3r16+PTZs2qV1nY2ODOXPmFHuekJAQhISElDlOkjZT+KMjIqpIOnXqBBcXF9y4cQOvv/66cvmSJUswevRo/O9//0O1atXw6aef4tmzZ0aMVDOSSYyIdIGJERGRYZmbmyMmJqbIcl9fXxw6dEhl2bvvvqvyXIpVa9JqbUZERERkREyMqEIRhHJ2ySAiokqNiRERERFRHiZGlcivv/6KRo0aYfPmzcYORdIuXbqEL7/8Enfu3DF2KEREZGBsfF2JjBgxAgAwePBgvU5rYkpOnDhRZK60Ro0aAQCWL1+O5ORkY4RFRERGwhIjE/fs2TP8+OOPePLECGPHS5BMJkNISAh69+6N58+fl7p9SeNYpaSk6DI0yVAoRCgUorHDICKSJCZGJiwnJwfOzs54//334eLiwq7qAL766ivs2LEDO3fuxPTp040djuQ8ThYROExE3TdEJKUwOSIiKoyJkQn7999/VZ5fu3bNSJFIx8mTJ5WPT5w4YcRIpGniDyJuRwO3HgG9PhUx5xcR92KZIBHpUnpsOnLScowdBpUREyMTlpOj+z+8n376CdOnT0daWprOj03Gd/Phi8enrgLTVovoPImJEemPKIoQxcpzjyUdT8LhRsdwuOkxZMuyjR0OlQETIxNWeMye8n74HDhwABMmTMBXX32Fr776qlzHImlSN8zTnaID1hIpLVwvovFbChw5r/3nS0Z8Bo63/gf/dP4P2c8rR5Jwqt9ZiDkiMuMz8eCXR8YOh8qAiZEJ02Qww7i4OERERGiUNP3999/Kx4sWLSpXbFJw8+ZNY4dABMB0S01S00RMDRNx4RbQ8UPt44/89BpSb8jw7OIz3FwYpYcIpU12M9XYIehdhw4dMHHiRJ0db9SoURg/frzOjlcWTIxMWGklRs+fP0edOnXQrFkzbNmyxZChSYIpTFZoaBwYXJUheuc9fS6iwYjcBu+PJT76Q/wTEZ+FKRD+T+7rIs8s3/Hitj9WPk44kFi+g5mg+H0Jxg6ByoCJkQkrrcRo7dq1yuSA4xYRADAvemHbMRHVQkS8/51+e3NODRNx9V5u+66JP+j1VOU2cp6IBeuBPp+JeJys26RRdkum9T6iKCJ+fwLiDySYZImbS2sXY4egVyNHjsTRo0exdOlSCIIAQRBw7949XL16FcHBwXBwcIC7uzvefPNNJCa+SIy3bNmCl19+Gba2tnB1dUWXLl0gk8kwc+ZM/Prrr9i/fz/Mzc0hCAKOHDli8OtiYmTCSkuMytM4Ozu7crQHoMprwJcinjwHftwKpKTq70s3bPuLx5sP6+00OrH71IvHV+8ZLQylpKPJODvkHM4OPofkExIvbgOgyFRNsp0bOhkpEsNYunQpWrVqhbFjxyI2NhaxsbGwtLRE+/bt8corr+Ds2bPYs2cPHj9+rPxxHhsbi6FDh2L06NG4du0ajhw5ggEDBkAURUyZMgUDBw5E+/btER0djdjYWPzvf/8z+HVx5GsTVp4JU48fP462bdvqMJqyu3PnDpYsWYJevXqhR48exg6nQmNVmnq3HgHN6ho7CmnZf1bE7/uMG8ONOS/aCd6cH4VWbV2NGE3p7oXd19mxTnT6F5nxGRptKyL3h/Ad8/vlLhW2qm6NNodaabSts7MzrKysYGdnBw8PDwDA9OnT0aRJE8ybN0+53Zo1a+Dt7Y2bN28iNTUV2dnZGDBgAHx8fAAAL7/8snJbW1tbWFlZwcPDA2Zmxim7YWJkwsqTGG3btk0yiVHPnj1x8+ZN/Pjjj0hPT4e1tbXa7cpblK6P4Q2oYhi/SETEKmaNBc3/vXz7izpovyWYvXhPxBzpV6UlHkvS2bEy4zOQHqtZYpQvG8Yv6Y+IiMDhw4fh4OBQZN3t27fRrVs3dO7cGS+//DK6d++Obt26ITQ0FFWrVjVCtOoxMTIRmZmZWLFiBVxdXTF06FC12xROHEpKnIyViatTsPdYSkoKqlevrna78o7s/dFHH5Vrf6q4oitfu2C9i9kSW/6DFPwIk35eBLHwb69y5NpW1dX/QFR7XuT+8DM3N9dJiVF5KBQKhISEYOHChUXW1ahRA+bm5ti/fz9OnjyJffv24YcffsAXX3yBU6dOwc/Pr1zn1hUmRibip59+UnaJ9PT0RLt27cpVYiRV+mxg+f333+vt2KaiAt4yOsHZdHRHkanA5YmRiP6DA2SVJ5nTtDoLyE1G7t+/Dx8fH4P/6LWyslIpjW/SpAn++usv+Pr6wsJCfYohCAJat26N1q1bY/r06fDx8cG2bdvw0UcfFTmeMUin2IBKVHDer3Xr1gEo3wCPUk2qTLHniSEdPHgQv/76K7Kyssq0vz7e9or6nomiiBwTqL6Rmnth9ytvUlRB/xZK4uvri1OnTuHevXtITEzEu+++i+TkZAwdOhSnT5/GnTt3sG/fPowePRo5OTk4deoU5s2bh7Nnz+LBgwfYunUrEhISUK9ePeXxrl+/jhs3biAxMbHMn3XlwcTIRBRMZPK/iIpLbu7fv49PP/0Ux48fL/Z4Uv0yKykuqSZzhnLt2jV06dIFI0aMwMKFC9GrVy/06dMHcrncaDG9860Cbn1E7DgpzftJU4Vvu+dpIuoPF+E3WMT9ONO+NkNL+keHvcf40kvelClTYG5ujqCgILi5uSEzMxP//PMPcnJy0L17dzRo0AAffvghnJ2dYWZmBicnJxw7dgzBwcEIDAzEl19+iW+//RY9e/YEAIwZMwb+/v5o0aIF3Nzc8M8//xj8mliVZiJSUlKUj0tLjIKDg3H16lWdnDczMxNWVlY6OZYmSkqMypPMGbtoVhfySwoBYNq0acrHs2fPxvz58zU6hi5Ty8fJIn7OGyw9ZKoI8Zjq0eUZIqwtATMz6Se0he+sOb+IuJbXweithSIOLJH+NUhGZf4BUwmvPTAwsMiE5gCwdetWtdvXq1cPe/bsKfZ4bm5u+PXXX41SLZiPJUYmqLTESJOkKC4urtRtBg8ejKpVq2Lbtm3aBShBZR35OyNDu14h+lTc+334cPkHx4l/on3SmZZeKI5zIjp8oMBve0VcuCWiZv/cUpf0DOn/7C+cc98r8OchhfF8TIUoikjQ5WjPppZnSLQknrTDxMgEFVdycuTIEbz77rsaHWP9+vWlzm+zefNmpKWlYcCAAdqGWGb6quIrOOpqSRYvXqzyfOPGjfoIR2NZWVnYvHkzIiIiik2M0tPT1S7Xhntf7V/3wuF0miji6AVg+FwRfT8X8TQVuP4A+OlvtbtLWiX84a8TCfv1170vO036pb5ZKcbvLk/lx8RIwsLCwpQjihYkiiKeP39e5Ity4sSJWL58ucbHX7p0qU7i1NSJEyfwxhtvGKXtkybtk86dO4fJkyerLDN2idGyZcswePBgNGvWrNhSPm0mKH2eprvYSnpJH7yYIqtMpVFSwkIAzaU90F97t9RrqXi8J15vx9eFZxc5P2NFwDZGEnXt2jW8/fbbAIB79+6prPv999/x++/lHH3NCPIHlFy/fr3yi/zy5csGObcmidH58+eLLDN2I/VJkyYpH//5559qt7l06RIaNWqEgwcPws3NrcTjXbmru9g0LVWRYmIR9Ug1qMIxFrw2fYUviiJSUoEqjhWneCrtjvbzoWkjYth5BCd11+s5TElOhgLm1izf0DW+ohJ14cIF5eMDBw4YLxA9S0hQbY+gr8bXmiRG6rYxdmKkqcuXL+PDDz/U2/Gzs0V8t1nEsq0vSqc0/To3wAT2WrvxUPW5Md7mobNEuIaI+PlvCb5AZeRY39HYIUiKPu+r//qcxt6a+xH7f6W3FyXtMDEioyrPWEzlOY86hw4dKrJMSolRabFcvHhRb+deuxuY9KOI974Tsbnoy1QiCb2ExdJXiNnZ6o8szwD+OJQ7sOQ735rAC6Qh63KOmlzR6Kut2uM98Uj+5wkA4Pxb+vu7r6yYGElUZRmzp3B3TGMmRuvXry+yrLzTkBhSeV+75GfF7//9lhfrVu7I7xWp2XFN4SUssSqtDC/rrYciklJEhJ9UXd64du7/FWD0iDLJSMw0dghGI49Ox51l9yC7Xf7qxohhRav9SXeYGEmUIROjzMxMzJkzBz/++KPBzplPn9fp6vpiJu6ynkdKJUZpaSW3nC4pifv7BND4rZIzlEw1A8yu2Smi/nCFStukczeLbldiXNJ5CTWm7m6Z+6uI12crEJtY8gUdOCsicFju4JAxhTpp5Q/pZIIviU4cfvkIUm/ptx2SVEUMO4fr02/gn05Fx/whaWHja4kyZGL0ww8/qAwYaEjqqtJEUVR7/doODe/o+KK9Q1lfz4pSYjTgS032z/3/7HURM9eKGNJZwFsLix7zyfPcEpFJP2r29S6h3LJYpcV44pKIL1flbpT8TMSeRcXfTz0+zt3ueRqw5M9CjbzLF6ZeLdpY9uhi/opF4pEkODUsuY2RIlPE5Q+uoNXulmU+lylSZCnw7PJzAEB2aiUtLjQhLDGq5E6dOqVVF39tPHv2DGPHjlUZsbmwwgnLzz//jBo1aqid8LU8JVoVocSoNOVN4vKvtPk4ETv/Bd6cU/y1d/kodxuN4jKdl7BYETdePN57uuRtC1aTqSuFU+fCrdyqN2P6+KeynT/zSSYujLuERxuicXXq9VK3z0ox/NxX+iaKYoklYTF/xha7jqSHiZFEGarEqE2bNno7V1BQEFatWoVRo0bh3LlzarcpfO6FCxfi8ePHantYqWsDVJKCSY0pJEbfffcdPD09sXbt2jLtX97JFrW51ILjFOnyuBVNcddeeHnjt0TUeUOE3EijhD95XvbzZsRpN9aXqE3+LrG2lrK7achIKHq9lydG4tirJ4rdr7hk8P6aBzjU6Cgern+ksxip/JgYSZShEqPsbP2N1BodHa18XFKpkSGYQmI0adIkxMTEYPTo0WXav7wjYOvrUk0hMSqtVKusf46FD5v/Wqh7TZJSoHWPP00kpYjIKqZ3HACcvJw7fUtZCeZ6/KyS0M2TfOoJjjY7jsOvHCuSHD36PbqYvUoW+fE1pD9Kx+UPInURIukIEyMySBL27Jn6EWFLa1CsK6bWxuj58+cIDQ3Vap/yTpQbrafZHDStcpOyMidGhb7Xz98Chi1wR/Jz9dvrutrxUISIaiEirDqJuHy76MFFUUTrd0Wkl6OzmGBZOb5Gzo24AABQpCsQteiORvskHE6CqBD1Pufb5Q8ikXFXOvM6mrrKcUdTiQyRGP3yyy9ql8+ZM0fjY5Sn9Kas+xqrjdHHH3+Mv/76S6t9ypvEvfq2iB5TdJ8I3qsA48+duqq7++DfazaYop9mfUV0nvQi7oajil7D1qPlP4eZhXafH/kfN6bUfg8AcgrM1abI0OxHSNLRJMTteKz3KsHojTG4P+Zh6RuSRpgYSZQhe6UVnovNkI4dO6bxttp+kOrig1fTZCMhIaHcbXwKCgsL03qf5OTkcp+3tIbFZdX2PQXS0o3zRbjpoIjOExU4FFHSqOrF75+VDazfr9uYjktkTL4NB7R7Tx4+VrN9GT6qHu+Nx8E6h3Fl8lXtdzaSso5tdendK7oPRo2cFNPpQSt1TIwkypCJUWpqqs6OlZycjEGDBuG9997T2THzlec1OXjwYJn20yQx2rt3L2rWrIn69etrlBwlJydDLtffZJtSdOISsGC9cRKjobNEHDqnWnpSWFoJzbNS9DDsTpKR5hrNyXnxGqSmiTis5TiBb87VzXsY8fp5ZCZl4cG6h8iIL6EKSEqNrwvGwhykQmNiJCFZWVlYuXIl/u///s/YoZTZ7Nmz8ddff2HZsmXGDkWlxEjbHm3a6NGjB7Kzs3Hr1q1iJ3rNFxERgZo1a8LX17fYdlcV1dV7hj/n4XPl/yIvz3ez1GqLMgrk7T0/EfGkmLZOxTl6ofwxFH5NcuQmMq6PSomRlqXXWYbJpJJOlL/UmJgYScrGjRvx9ttvo3///jhz5oyxwymTXbt26e3YV65oVyT98OFDnVZvaUImK7l4oX///sjIyEB8fDy+/vprA0UlDYZIEq7dEzFlmQIRN3JPtmaX+pPeidH8mBIqsyi3gu/BiUs6Omg5XyAxp4QbQ81N8zTiKbKeGX4sJKHAt+XjXfHKx9mppffsvb30bqnb6EJKRIpBzlPRMTGSkAULFqh9LDWxsbFYu3YtEhOLdmPSZxVgWRoXf/rpp+U6p64aiMbHxyM5OVmlPdfTp091cmxTYYjEqMV4Ed/+ATQbW/J8bo+TJVaUYyDDvhKLndjWUGSFBkLUalwjACe7ncI/nf7N7e1lQFnPXiRA2Sm5j0WFiH86/1f6vsmGSeTi9yYY5DwVHRMjCSk8oapU1axZE6NHj0avXr2KrJPa5Lf6rEKLjY0tktyoS6SuXr0Kb29veHl56XXcKKD8Xfb1yRBfY6mFmm4VdzeWFouubmND/jkcOS9i179iicn83yeAD77X8TtRzsNlltTGqBhpd+XKKTYMRk0C9/zqc8iipDP3m9SqbvPFbIvFvbD7yMkwjcZZpvFNXEmYQmK0efNm5ePTp08X+aLXNDHKysrSujt6WZS3xKe464mIiMBLL70Eb2/vUo8xatQoZGZmFmlwnZaWhtOnT+t0rKSlS5cWWfYowVxnxy8PfX1o7z0tYuF6ESmpRU9Q3O1YOBZ9JTDaXnNGGQsWzl4X0fFDEb0+FdF9cskn/en/oHZMI2O5MqX4nmliSaVbEsgCtC3t0oX0mBJ6Chj/JSniyZmnuDDmEq5+fh3/9vgPhxodxZ1l94wdVomk/01ciZhCYjR48GCV505OTpgyZYryuaaJ0ffff6/1AIZlUe75w4r58B08eDCys7OL9OhTd/3FVZmtXbsWLVu2xPTp03VWZTd58uSi59nnpJNjl1dxl6hQiJjzi4ipPyuQruWUGNEJInpMETE1TMTkZZonRqXFVvC5IUt91u0u230w97cX++0/C/xzueTjqBvTqMzK+fqk3pBB/lCO9NiiX/jZz/VbwqoVNddp6ALyhEOJONSo+MGnLJ2kNy98zJ8vGvQ9u/Qc6Y/ScX36jRL2MD7pfxNXIlJPjNQlGXK5HN9++y1EMbcIX9PEqGAypU+enp4aJR3FJVDFTVyrrn1VcUp7TebOnYutW7dqfDxTtf0f9cs3HgCmrRaxcAPw9UbtjlmwAfHqnUXXa/PF1XycAtEJudNnbDuuXRzFiU3SbvvCVYH5oh6J6D5ZgWmr1N+npwoVuhzRshu+sR1+5RgOv3IMaQ8KvQBm0qmaF7QcyFIfzgyMKHGogOq9qhsuGE1J6D3UlLS/iUlSIiIiil0XFBSE+vXrS258ntdffx0PHjwodTt1JS0A8Pix+tlSU1LU9/5Ql4Rpkixu2LCh1G3KKiZZGlVpAHAvVs3oy8deLJuxRrd1AcW2MVJzmrPXgR5TcqfPkEtsdoX+X4jYdwaY82tutVlh2iZgupSZpJuGxWK2iGvTrqssk1KTRTGrbINbFhwxWxtlGcZAkOA3uhRjKo0Jhlxx6XKgRX0oqVrq+vXruHFDesWj5ubmGjV4/u6773RyvoKvkSiKOHz4MK5fv17CHrn01Wg9PQPYe9ZeL8cui8uaTTGlM9q+rFfU9KqWQFMWlbhuajDzgyFizknJQcSw8/ino+4mw1Okv/j7Sb2RitSbxTdslsL7UlaiKOLpueK71sf8FYv9/gdx/i3thkiXWucXACwxovLRd4+l8pLkH50Gyhv38+ea93555513lI8PHjyITp06abSfvpLioxKZeiJftpY/grOyRTx5Xvw3YGlvbXHrq1c1zXsZ0P1Es2X1eEkCEvbpZ+ZhURRx7H/F1L1WEJGfXit23YVxl6DIFBH7f3FIj9O8+FKK888V9zcYf0C6QwswMSKNmWJiJIpiudtuFVdtVpqCSVJp9u7dW6ZzlEZqzdZuRwNfrlSoTMpa+LZS5H3zp2eICHxdRI3+Io7rajDCPC/7a76t1G57HXZiLJfUE3ropp53W5zqI/0BbsubhKSUUGJUkKYT1kpWMX9AZwefM3AgmpPYxyaR7pU3oSvrB6AUEknjR6Dq459EzP0NePXt4sfb+Suv083qncC9OCAjE+iuvglYqUmLBH9AlyhSgwGSNSkxMrHLLiL55BNjh1Cq5BPJhsmaTeDNVJQ05UkJf4T3wu6XPPK5kTAxIo1JsZhWE8ZKjKTQy1ACIRSruJKPu3mDgz9Le7GsuPF9TPSW1Eh6hojPwhSYtVb1IqVSYpTzVPclGab0GZOVkl32hsVaXGb+SyJ/KK2OLfluzr+FPR77cffne0XWpcekI+l48fO3Xf38Oh5titZjdGUjvUEPSJJWrFih04EIDam8iVF+26+cnBx8/PHHpc6Hpqvz6oIEQihWcd+BX6wU8cnrgk5KuzKLabYn5dcl35ajwIL1QOFvUU3bGCU/M50kQ5fkj+R4ejYF1bu5wdxOzz0ydXgjZSRkwNrNuuiKvDf8zKDiewUbU9Si3B4V1764AZ/RL8HMKjdbTLuXhqMtT5Q8SCeAeysewHuYl97j1IaEf0+SlIwfP16rNjO6lJmZiZ9//rnM+586dapc5//1118BAKtXr8aSJUuwYsWKErfP/9UrhURS6h1CMrNEXC80moI2DbRL+176rZimW9fuaX4OYxVifLNR/Yk1va0+X1H5EiMxR8SJDv/i/FsXcU3fgwjq+OW9MLbkhnQl9dCTiofrX5T+XP3ieqlJEQBJFvsyMSLJOn36NABg2bJl5UrKCo/WXdiuXbtKXD9r1iwAwO7duzU6X35ClJBg/F4XUq5KEwH8b4JYbLsafZbqvL9U8w9jbXvS6Zum3yP/Ruo3Dn1IPJSE+H1l/7vJeJyBrCe59a4P1mowrkEJ5NFyyO4Un4zoelTu4qqcJJg3FCszKVP5+Pk1zXraGmNaldJI+GOTKruWLVviyZMn+OSTT8p1nNJKbtRNhquL81lYGL+mWsoFRndigIhy/KjPzhaNViW2818R8U/0942Vkiri0m316xRibjXZg8e5549NLBrHySsibKz0Fp5enR1q/N5K8odyHGlyHEebn0DKBfW9x67Puln2E2hz65hQYqTIG5QyOzUb8vsatomS4PUxMSJJO3DggOTHdyosf6RtKSRGUi4xyinll2JJSc/BCBFufUQMnK7dp+qPf4no9lH5f6L2/lREq3dE5dACujbpx+KPm5QC+AwU4TdYhGVHBWoOKLrtnlPA6eKHyaFSXJt+Q1kNdPGdy2q3yUzMVLtcE9F/xJS+UT4tioxuzLyFIy2OI/lk8Q2e9en2d7nFv/H7NS/1S70uvYGNjfqxOXfuXHTv3h3t27fH4MGDcfx47gRF4eHhaNmyJdq2bav8FxcXp9wvMjISQ4cORevWrTFu3DjExsYq16Wnp2PatGlo164devXqhT179qicMzw8HMHBwWjfvj1mzZqFrCzdDGdP+jFo0CBjh6C1gIAA/PLLL3jyxPhdjqXcyLisof15WESXSSKeluHz9P2lIvafLeOJC7kTAzzW0/fP2hJqd+f9LiJVntvWSGrVfAYlAqKeElNFpkLtY1259P4VzTfW4hKzn2Uj7XYa/gvR/zhQokIs9vXXtuNJ4lEjzmmjhlETo2HDhiE8PBxHjx7F9OnTMW3aNDx79gwA0KJFCxw/flz5z8PDA0BuQ9xPPvkEQ4YMwaFDh9CgQQNMnz5decywsDCkpKRg165dmDdvHhYsWID79+8DAKKiorBkyRIsWrQIO3fuRExMDFavXm34C6cKb+TIkUhPLzpbuKFJOC8q0dI/i/82GDRDgmXvBiS1edyM5cHah9jvfwhRiwrUOerohk+PffEip92T4+zrhqveKzxkQXnbGOVkKBA59Rqufnat5PGGtPB4Tzx2u+3Dbrd9atc/u6L5bAEA8OS08X9EFmTUxMjX1xdWVrkV4YIgIDMzs9RZyyMiImBra4u+ffvC2toaY8eOxdWrV5WlRrt27cK4cePg4OCARo0aoV27dti3L/fN27NnD7p27YqgoCA4ODhgzJgxGjeoJTJFUq5KK+lH5cQfRJy8Iv0EKDEFCJmqwKj5CuRIcKC6iuzRhmhkP8/GzflRLxbq6C14dvGZyvP4vYbrSJH8j26ThLvL7uH+yge4t+IB7q0sfULt0qQ9kCNi2PkSt7m9RMtJESX2p2P0RhALFixAeHg4MjIy0L59e/j7+yMyMhIXL15E586d4eLigsGDByM0NBQAcOfOHQQEBCj3t7W1hZeXF+7cuQN7e3skJSWprA8MDERkZKRy31atWinX1a5dG9HR0UhPT4eNjU2R2DIzM5GZqVqPbGFhoUzmdEkKXbsrIl0NGKdQKExm8DnViWwVkGpTwmmrS34996mpDci9Ns2uJz5Z/39TE38QcSivMKFFPRHj+5T/HpH6Z4FCoZBcjPnxKAp1cSotTuV+ZbweUcddqhQKBbJSVZt3iGLZXu+0R2mwqWmDuPAXzVAe73oM37dferHNAzlsPKyVYw9p4uFvJff2K0usCoVY5L3Qxz2m6aC7GiVGK1eu1DqAsWPHarTd1KlT8fHHH+Ps2bOIisrN/Js0aYJNmzbBw8MDV69exZQpU+Dq6oqOHTtCLpfD3l51tnB7e3vI5XKkpaXB3NxcJcmxt7dHWlruELqF93VwcFAuV5cYrV27tsi1Dxw40CTbvVRWycm6aQRy//597N+/XyfH0rf8qmMASIi3AlDDeMGUYMuRkterqzJ6+PAhAB+Njt9wZDb0/dvvUIEalkNnUtGjURI0ja8489clAXAt1zH0qeD9JRX5MWUlZKtdXpAoipBfSoeZvRlsAnIHVMy9r7QXE6NFI2oN3L9/H88TVBvPxUTHwNpGzcCPpXhw8wGss6xVftynp2coX5OnO1IQO/MxrP2t4LfJB4KGg56lPC95jrey3B8pT58W2a+s70lJ/Pz8NNpOo0+NFStWaN2YStPECADMzc3RsmVLbNy4Ef7+/iqlOg0aNMCQIUNw+PBhdOzYEba2tkVGHpbJZLC1tYWdnR1ycnJUSoBkMhns7OwAoMi++TOa29raqo1r1KhRGDZsmMoylhiZlqpVq+rkOD4+PsoEW+p8fF58MSdlVKz7ytvbW+NtHz81bIG4nZ0DfHwcyn2cL9dJNykCcu8vhUKBayhHd3Udy7/n063TEYUX1TjeNb1hZqlaSpB4JAnX37oFAGhz+n9IMkuEt7e3sjThuRa9pGrWrIk70F2i6OPjg4SbCXiEFwlXjRo14ejjoPXrXbNmTTj4OCDaOhbpyP2VYWNlDR8fH2Q/z8a1mbnHy7iTCef4KqjasopGx82qmo1EFP+D00100zpWZydn5XuoUCjw8OFDlffE0DT+5LCzs0OdOnVK3e769euQy8s2p4tCocCjR4+KLC+YlPn7+2Pbtm3K53K5HI8ePYK/vz+cnJzg6uqKqKgoNGjQAABw8+ZN+Pv7K/fNL5UCgFu3bsHT01NtaREAWFlZ6SUJIsPR1R+WKbVFK3jNFnqeEcHQpDD/XHF+3Qu0flmA5BpM6JgU34P8mMwKTV6WnZwNmxqqn+8XxrwYYfpEi5OodzYQZmZmymMk7iu5nWtBQpknS1PPzMwMQqHXV5QrIGZof0+ZCbnXpFKoIQCPd8Tj/KiLqhvnaP6+CuYlb3eqdxl6xIlCkfMXfE8MTePEyN/fH2FhYaVuN2rUKGWbnpKkpaXh6NGjaN++PaysrHD06FFERETggw8+wMmTJ1GvXj1UrVoV169fxx9//IFJkyYBAJo2bQq5XI7w8HB0794dq1evRlBQEGrUyK0uCA4OxqpVqzB37lzcuXMHx44dw7p16wAAPXr0wPjx49G/f394eXlhzZo16Nmzp6YvAZkgURRhZmZW7hK53r176ygiKg+p98gav6hiJ0WmJm5nPFxaVYVTfUflssKVH+k30lVqPwVzI/flLHT6W9/egecgHVWHiyiaFGmptMqjjMdlH99JKjRKjHr37g0vL80meWvdujV8fX1L3U4QBPz9999YuHAhRFGEt7c35syZg4CAAISHh2PGjBlIT0+Hm5sbhg8fjq5duwLILcX5+uuv8dVXX2HBggUICgrC7NmzlccdP3485syZgx49esDJyQlTp05VxhMQEICJEydi0qRJkMlk6NSpE0aPHq3RdRGR8a3YbuwIyJRc/TR3lMvO1zsoJ2gtPH9X9pPcwaDkj+SwcLAAjJ0YFZKwLwGeA8uRGGlyOdp0LNHH4GgS+z2hUWI0Y8YMjQ84ZswYjbaztbUtdmLQSZMmKUuI1Klfvz42bdqkdp2NjQ3mzJlT7L4hISEICQnRKEaqGKQwy70hHThwAF26dDF2GHrxRHqD5JIJiP37MXzH5PbGyk4tOirmk/+e4FSfs7CwN4fvO74Gjk4Dev4I0yYvkkeXramMKSlT68T8xlHJyclFujA3adJEJ4ER6cKnn35q7BAMrmvXriYztIA2vlpfFTZ2xo6CTJIo4uH6R8iRqR8q/Nzwi4CYmzTdXXbPsLEVou53nK5+3BU7jYkWHxcP1xVtB1zRaJ0YXblyBV988YXKNBz5BEHAqVOndBIYEVFBa/c5GTsEkrpiEoiEA4lIOFBMo2oRyEp5MXaQPqYAKbfy5EUFXpOCI3oX9GDtQ9xf+QB1pteGQ2D5e1ZqTWI/5LROjBYsWKDzsRuIiIjKK+2e+iE1ik2K1DF2zbuOq/4LHi4nTX2JWVz4YwBAysVn6HS5vdptUqNkeHbpmdp1FY3WidG9e/dgYWGBDz/8EP7+/jA3r2D9gYmIyCRdfOdyuY8hSnFql3LkStoUxqTHqJ/fMUeeg2OvntBbI2n5I+PPK1mQ1omRv78/5HI5hgwZoo94iIhIwmRyEbbaD8SsV7LbMogiIH+gg4bBxq5JM3aJlRopF57ptedYzJZYvBLWUH8n0JLWoydNnjwZcXFx+PPPP5UjRxORNFWyDnlkAN9slF6JytEWJ3Cs5Ymy7VyOy3l69mnZd9aC0XvWVrLPEY1KjFq0aFFk2TfffINvvvlGZRkbXxMRVWwxScaOQDouf1j6YMa6UJ5epplJOhhwkYlRURWx6y8REWmvwn0diLk/6kWpjTKoI/L75a9e1HSC2YpC5wM8EpHxyeXyYidHJiqPipYYiQpRmg2uy0mRI+LRxuhyHyfhcCLOhEboICLTofGUIERkOhYvXowvvvjC2GFQBVTREqNHkyrm8DPXPruOpBPJ5T5OZUuKAC16pfXq1QtNmjRBo0aN0LhxY9SqVUufcRFROURHl/+XIhEZnrqG1mVpfK2LpKiy0jgxio+Px969e7F3714AgKOjI1555RU0btwYr7zyCurVq8cxjYgkgu0CiSqO20vvGPycOWk52Ot9wODnlQKNE6MBAwbg/PnzuHfvHkRRxLNnz3D8+HEcP34cAGBtbY2XX34Zy5cv11uwRKQZJkakL7yz9CvrWVaRZSnnDT/i9K2vowx+TqnQODH67LPPAAApKSk4f/688t+NGzegUCiQnp6Os2fP6i1QItIcEyPSF95a+pURp34+M0OJ2/EYN2bfhOy2+ulVKgOtR752dnZGhw4dUK9ePdSrVw///PMP9u/fj5wc9XOwEJHh5SdGlauTLRkCE6OK7dyIC0Y5ryJLATNLrcec1guNE6N79+4pS4kuXLiAuLg4ALkfwFZWVmjYsCGaNGmit0CJSHMsMSIyUZX010xGfCZsPW2MHQYALRKjgQMHKlvG29nZ4dVXX0WTJk3wyiuvoEGDBrCw0LrwiYj0hIkREZkW6XxmaZ3NVK1aFX379kXTpk3RqFEj2NhII8MjIiL9Y86tXzYelfQ71diT9xagVa+0Cxcu4O7du1i3bh3WrVsHMzMz1KlTR1ly1LhxYzg5OekzXiLSAEuMiEyTtbuVsUMwClEhnc8srXulPXv2TNnO6MKFC7h+/TquXbuG9evXcxJZIom4deuWsUOgCsrYE71TBSWdvEj7qjQnJye0b98egYGBCAgIwL///osDBw6wVxqRhOSPL0akayyMJH0wyRKje/fu4dy5c8qeafHx8cp1LLYnIiLSgcpaJCehNKJMvdIKJkLVq1dXTgvC7vpE0lJZP2OJyLRIqXxFq6o0URTh7e2Nxo0bK/95enrqKzYiIiKqDEwxMZo/fz4aN24MV1fXYrd5+vQpqlSpoou4iIhIgiT0/UWkFxqPv92lSxe4urpi/vz5atfHxcXhrbfe0llgRERERIam9cQkW7duxcKFC1WW3bt3D2+99RYePnyos8CIiEh62GxNvyptu0AJNTLSOjGysbHBX3/9hW+++QYAcOXKFYwZMwbx8fGoUaOGzgMkorKrtB+ypDfS+fqqeDIeZzDzlACtxzFatmwZPvjgA/z5559ISEjAqVOnkJaWhtq1a+P777/XR4xEVEYS+hFGRKU4GHQENUNZwGBsWpcYNWzYEGFhYXB2dsaRI0eQlpaG5s2bY9WqVahWrZo+YiQiIqoUYrbEGjuESk+jEqOVK1cWWdasWTMcOHAAdnZ2aNCgAdavXw8AGDt2rG4jJCIiyWApJFV0GiVGK1asUA7uWJAgCJDL5Vi3bp1yGRMjIulgGyMiIu1olBh5eHioTYyIiKhy4VcB6YWESiI1SozCw8P1HQcREZkAVqVRRadR4+vU1FSkp6drdMD09HSkpqaWKygiIiIiY9AoMerYsSMmTJig0QHfeecddO7cuVxBEZFusNqDiEyChD6rNB7HKDMzE3FxcRptJ7KslYioQuLHO+mFhO4rjROjmzdvok+fPvqMhYh0jF9ipGu8p6ii0zgx0qYUiD3YiIiIyBRplBht375d33EQERFRJSWlkkiNEiNODktERICkmoIQ6YXWc6URERERVVRMjIiISGNSqvIg0gcmRkRERER5mBgRERER5dG4uz4RmZZ58+ahSs3/AWhn7FCoAtl0EOjUBPA0diBEeiKIZRim+vTp0zhz5gySkpJUxjcSBAHTp0/XaYCVhUKhgLm5ubHDoIrGLghoetnYUVAFtDNyv7FDoAqk7T+t4VjXAQqFAvfv34ePjw/MzIxTqaV1idHq1asRFhZWZLkoikyMiIiIyKRpnRj99ddfEEURFhYWcHFxYSkHERERVRhaJ0YymQxVq1bF5s2bUaVKFT2ERERERGQcWlfgtW3bFhYWFnB0dNRHPERERERGo3WJUd26dXHw4EGMHTsW3bp1g4ODg8r63r176yw4IiIiqhxEhTRGD9W6V1rz5s0hCIL6gwkCTp06pZPAKhv2SiO9YK800hP2SiNdsnC2gIWDBZptbowk6ySj9kor01lFUVT7T6FQ6Do+IiIiquCyU7KRHp2O8yMuGjsU7avSzpw5o484iIiIqJKTRaUZO4Syj3ydkZGBO3fuAAD8/f1hbW2ts6CIiIiIjKFMidGaNWuwdu1aZGRkAACsra3x1ltvYeTIkbqMjYjKTX17QCIiUk/rNkbbt2/HTz/9hPT0dGXbovT0dCxfvhw7duzQ6lhz585F9+7d0b59ewwePBjHjx9Xrlu3bh26dOmCTp06YenSpSpTj0RGRmLo0KFo3bo1xo0bh9jYWOW69PR0TJs2De3atUOvXr2wZ88elXOGh4cjODgY7du3x6xZs5CVlaXtS0BEREQVlNaJ0ebNmwEAHTp0wPz58zF//nx06NABoihi06ZNWh1r2LBhCA8Px9GjRzF9+nRMmzYNz549w4kTJ7BlyxasW7cOmzdvxokTJ7B9+3YAQGZmJj755BMMGTIEhw4dQoMGDVSmIQkLC0NKSgp27dqFefPmYcGCBbh//z4AICoqCkuWLMGiRYuwc+dOxMTEYPXq1dq+BERERFRBaZ0Y3b17FzVr1sQ333yDLl26oEuXLvjmm29Qo0YN3L17V6tj+fr6wsrKCkBuV//MzEwkJiZi165dCA0NhZeXF6pVq4Y33ngDu3fvBgBERETA1tYWffv2hbW1NcaOHYurV68qS4127dqFcePGwcHBAY0aNUK7du2wb98+AMCePXvQtWtXBAUFwcHBAWPGjFEel4iIiEjrNkbm5ubIyMhAdnY2LCxyd8/OzkZGRkaZxuFZsGABwsPDkZGRgfbt28Pf3x93795FcHCwcpvAwEAsW7YMAHDnzh0EBAQo19na2sLLywt37tyBvb09kpKSVNYHBgYiMjJSuW+rVq2U62rXro3o6Gikp6fDxsamSGyZmZnIzMxUWWZhYaFM5nSJQx0QERHl0sd3oqbjImmdGAUGBuLSpUsYN24cOnbsCEEQcOjQITx58gQNGzbUOtCpU6fi448/xtmzZxEVFQUASEtLUxlR297eHmlpuV345HI57O3tVY5hb28PuVyOtLQ0mJubqyQ5Je2bfw65XK42MVq7di1WrlypsmzgwIEYNGiQ1tdJREREmnn48KHOj+nn56fRdlonRm+++SamTJmCK1eu4MqVKwByB3wUBAHDhw/X9nAAckuhWrZsiY0bN8Lf3x92dnZITU1VrpfJZLCzswOQW0Ikk8lU9pfJZLC1tYWdnR1ycnJUSoBK2jf/HLa2tmrjGjVqFIYNG6ayjCVGRERE+uXt7W06I1/n9+Zyd3dX9krz8PDArFmz0K5du3IFo1Ao8OjRI/j5+SlLjwDg5s2b8Pf3B5A7ZlLBdXK5HI8ePYK/vz+cnJzg6uqq8b63bt2Cp6en2tIiALCysoKDg4PKPxsbG5iZmenlHxEREcGo37Fl+jYODg5GeHg49u3bh3379iE8PBw9e/bU6hhpaWnYvXs30tLSkJ2djYMHDyIiIgKNGzdGcHAw/vrrL0RHRyMxMRHr169XHr9p06aQy+UIDw9HZmYmVq9ejaCgINSoUUMZ26pVqyCTyXD58mUcO3YMXbt2BQD06NEDBw4cwPXr15Gamoo1a9ZoHTcRERFVXBpNIhsXFwdLS0u4uroiLi6uxG09PDw0OrFcLsekSZNw/fp1iKIIb29vvPXWW+jYsSOA3PY9v//+OxQKBfr164cPPvhAOXltZGQkvvrqKzx8+BBBQUGYPXu2MjFKT0/HnDlzcPToUTg5OeH9999Hjx49lOcNDw/H8uXLIZPJ0KlTJ3z++ed6qRrTFieRJb2wawA0Nf7cQ1TxcBJZ0pd6ZwONOomsRolR8+bN8fLLL2PNmjVo3ry5MkEpcjBBwKlTp3QeZGXAxIj0gokR6QkTI9IXYydGZZoSRINcioiIiMjkaJQY/fzzz8pu7j///LNeAyIiIiIyFo0So6ZNmyofC4IAe3t71KlTR2WbzMxMdjknIiIik6Z1Bd748eOxcOFCtcvbt2+vk6CIiIiIjEFnLZvkcjnbHhEREZFJ07jx9dtvv618fOfOHZXncrkct2/fhqOjo26jIyIiIjIgjROjiIgICIIAQRAgk8kQERFRZJsWLVroNDgiIiIiQ9I4MerduzcAYMeOHahatSpat26tXGdjYwMfHx/07dtX9xESERERGYjGidGMGTMAAGfPnkXdunWVz4lIytQPxkpEJFVijnHbK2s9wGN4eDgA4P79+8oJWWvVqgVfX1+dBkZERESVj5hlYolRamoqZs+ejSNHjqgsb9++PaZPn84G2ERERFR2xpkJpOynnzdvHg4fPgxRFFX+HT16FPPnz9dHjEREREQGoXWJ0fHjxyEIAkaMGIHu3bsDAPbu3Yt169bh+PHjOg+QiIiIKhEjD4modWJkZ2cHDw8PvPvuu8plAQEBOHz4MFJTU3UaHBEREVUyRk6MtK5K69+/PxITE/HkyRPlsqSkJCQmJmLgwIE6DY6IiIjIkLQuMYqNjUVmZiZCQ0PRtGlTCIKAs2fPQhRFPHr0CLNmzQKQO9ns9OnTdR4wERERkb4IopYTnDVv3hyCIEAURQhC7hgp+Yco+FwQBJw+fVrH4VZcCoUC5ubmxg6DKhq7l4GmF4wdBVVAOyP3GzsEqqDqnAiAXx0/mJkZp3ua1iVGjRs3ViZARCRx/FslItKK1onRihUr9BEHERERkdEZeRglIiIiogJMrbt+ixYtil0nCAJOnTpVroCIiIiIjEXrxEjLttpEREREJkPrxGjGjBkqz1NTU3H48GFcuHAB77zzjs4CIyIiIjI0rROj3r17F1k2cOBADB06FDdv3tRJUERERFRJmdrI1+oIggBBEPDPP//o4nBERERERqF1idHbb7+t8lyhUCA6OhoJCQlwc3PTWWBEREREhqZ1YhQREaEc+bqw0NBQnQRFRERElZOx+3hpnRj16tWryMjXLi4uaN68OV599VWdBUZEusCRr4mItKF1YjRz5kw9hEFERERkfFonRqmpqUhNTUWVKlVgY2ODgwcP4vz586hduzb69u2rjxiJiIiosjByXZrWidGcOXNw6NAh/Prrr4iPj8fUqVOVVWtPnz7FiBEjdB4kERERkSFo3V3/2rVrcHR0RN26dXHo0CEIgoBmzZpBFEXs3LlTHzESERERGYTWiVFiYiLc3d0BAFFRUahTpw6WL18OHx8fxMXF6TxAIiIiIkPROjGysrJCamoqMjIy8ODBA/j5+QEALC0ti/RWIyIiIjIlWidGfn5+iIuLQ9euXZGeno4GDRoAAOLj45UlSURERESmSOvEaPTo0bCwsIBcLoenpyeCg4Nx5coVPHv2TJkkEREREZkirXultWnTBrt27UJcXBz8/f1hZWUFPz8/bNu2Dc7OzvqIkYjKjNXbRGRiTG3kawCoUqUKqlSponxub28Pe3t7XcVEREREZBRaJ0ZyuRzr1q3DmTNnkJSUVGT933//rZPAiIiIiAxN68Ro3rx52Lt3LwAUmUiWvdLKLiEhwdghEBERGZ+pVaX9888/AIC6devCx8cHFhZlqo2jAkRRROfOnY0dBhERUaWndVZjZWWFmjVr4tdff9VHPJVSdnY2IiMjjR0GERFRpad1d/3+/fvj6dOnSExM1Ec8lVJOTo6xQyAiIpIGU6tKi46ORkZGBkJDQ9G8eXM4ODgo1wmCgOnTp+s0wMpAoVAYOwQiIiJCGRKj3bt3QxAEyGQyHD16VLlcFEUmRmXEEiMiIiJp0Doxaty4MXuf6RgTI9If/q0SEWlD68RoxYoV+oijUmNiRERElEs0tTZG+SIiInDt2jUAQFBQEJo0aaKzoCqbwuNBERERkXFonRhlZGRgypQpOHXqlMryli1b4ttvv4WVlZXOgiMiIiIyJK27669atQr//fcfRFFU+Xfq1CmsXr1aHzFWeCwxIiIikgatE6P9+/fDzMwMH330Efbt24d9+/Zh0qRJAKCcKoSIiCouf/lzY4dApDdaJ0aPHz+Gj48Phg4diqpVq6Jq1ap4/fXX4evri8ePH+sjxgqPJUZEZEpGP75p7BCI9EbrxMjOzg6PHz9WmfQ0Pj4ejx8/hr29vU6DIyIi6XHLSjd2CFSRGbmwQOvG102aNMGRI0cQGhqqHNPo3LlzkMvlaNGihT5iJCIiCfHKTDN2CER6o3Vi9Pbbb+P06dNIS0vDyZMnAeRWBdnZ2eGdd97ReYCVAavSiIiIpEHrxKhWrVr45ZdfsG7dOly9ehVA7jhGI0eOhK+vr67jI6Ly4Cj1RERaKdMAj76+vpg5c2a5TpyZmYn58+fj1KlTkMlkqFOnDj755BMEBAQgPDwcc+bMURkT6c8//4SHhwcAIDIyEnPmzMGDBw9Qv359zJo1CzVq1AAApKenY+7cuTh69CgcHR3x/vvvo0ePHsrjhIeH46effoJMJkOnTp3w+eefw9LSslzXQkRERDpi5EoUjRtfR0REYNasWdi/f3+Rdfv378esWbMQERGh8YlzcnLg6emJtWvX4tChQ2jXrh0mT56sXN+iRQscP35c+S8/KcrMzMQnn3yCIUOG4NChQ2jQoIHKxLVhYWFISUnBrl27MG/ePCxYsAD3798HAERFRWHJkiVYtGgRdu7ciZiYGEmMvcSqNCIyJScd3YwdApHeaJwYbdq0CTt37kTt2rWLrAsMDMSOHTuwadMmjU9sa2uLMWPGwN3dHebm5hg8eDBiYmLw9OnTEveLiIiAra0t+vbtC2tra4wdOxZXr15FbGwsAGDXrl0YN24cHBwc0KhRI7Rr1w779u0DAOzZswddu3ZFUFAQHBwcMGbMGOzevVvjmImICEg3K/NsUkSSp/Hdfe3aNbi6uqptR+Tj4wM3Nzdlm6OyuHTpElxcXFClShUAwMWLF9G5c2e4uLhg8ODBCA0NBQDcuXMHAQEByv1sbW3h5eWFO3fuwN7eHklJSSrrAwMDERkZqdy3VatWynW1a9dGdHQ00tPTYWNjUySmzMxMZGZmqiyzsLDQ+bQnnESWiIgojwgoFAqdH9bMTLOyII0To+TkZHh7exe73tHREQ8fPtT0cCpSU1Mxb948TJgwAUDukACbNm2Ch4cHrl69iilTpsDV1RUdO3aEXC4vMl6Svb095HI50tLSYG5urpLk2NvbIy0tt2tp4X0dHByUy9UlRmvXrsXKlStVlg0cOBCDBg0q03UWJz4+XqfHIyIiMmVlzSdK4ufnp9F2GidG9vb2ePToEZ49ewYnJyeVdSkpKXj48GGZBnjMyMjA5MmT0aZNG/Tt2xcA4OnpqVzfoEEDDBkyBIcPH0bHjh1ha2sLmUymcgyZTAZbW1vY2dkhJydHpQRIJpPBzs4OAIrsm5qaqlyuzqhRozBs2DCVZfooMeLEu0RERC94e3trXMKjaxqftV69esjKysKXX36J5ORk5fInT55g2rRpyMrKQr169bQ6eXZ2Nj7//HO4ublh4sSJxW4nFOhy7O/vj6ioKOVzuVyOR48ewd/fH05OTnB1dVVZf/PmTfj7+6vd99atW/D09FRbWgTkJiwODg4q/2xsbGBmZqbTfwK7VBMREeUSofPvWW2SLI237NevH0RRxH///YeQkBAMHToUr7/+Onr37o3//vsPgiCgf//+Wl373LlzkZGRgZkzZ6okBydPnsSTJ08AANevX8cff/yBtm3bAgCaNm0KuVyO8PBwZGZmYvXq1QgKClJ21w8ODsaqVasgk8lw+fJlHDt2DF27dgUA9OjRAwcOHMD169eRmpqKNWvWoGfPnlrFTERERPqjSNd9+yJtCKIWfcVnzZqFHTt25O6Yl8jk7x4SEqLSbb40sbGxCAkJgbW1tUom9/333+PIkSPYtWsX0tPT4ebmhkGDBmHIkCHKbSIjI/HVV1/h4cOHCAoKwuzZs1XGMZozZw6OHj0KJycnteMYLV++XGUcI2NXZUVHR8PLy8uoMVAF5dAUaHza2FFQBTP50RV0Sok1dhhUQVXp74xXV7QwWlWaVokRAGzbtg3btm3D3bt3IYoi/P39MWDAAPTr109PIVZ8TIxIb+r8ClQfVvp2RFr46NEVdGZiRHpi18QW7fa2MVpipPVgFP3799e6yoyIjIRJEekBW0WSPonGrUnTvI0R6Q9HviYiIspj5O9EJkZEREQkHaYyVxoRERFRRcfESAJYlUZERJSLbYyIiREREVE+VqXRtm3bjB0CERGRNBi5sEDr7vrqDBw4EPfv34cgCDh16pQuDlmpfPXVV8YOgYiISBqMXGKkk8RIFEVWB5WDQmHkClUiIiKpqAiJ0aBBg/D06VNdHKpSYlJJRESUy9iNr3WWGFHZscSIiIgoDwd4JCZGRERE0qBRiVGLFi00OhgbX5cNEyMiIqI8ptDGiG1g9IuvLxERUR5TSIxmzJih7zgqNZYYERER5TGFxKh37976jqNSY2JERESUy9h1KBo3vj569CguXLigfJ6amor09HTl8wMHDmDTpk06Da6yYGJERESUx1SmBJkyZQq+//575fOOHTtiwoQJyufr16/H4sWLdRtdJcE2RkRERHlMJTEi/WGJERERUR6OY0RERESUhyVGRERERNKg1ZQgN27cQN++fdU+T0hI0G1kREREVOkYu9mtVolRVlYWYmJilM8zMzNVnguCoLvIiKh8rDyNHQERkfZMJTFq3LgxEx8iU+Iz29gREBGZHI0ToxUrVugzDiLSNVcOzEr6IRj7Jz1VbGx8TUR6YVnN2BEQEZkcJkZEFVX8BmNHQESkPY5jRER6kZNq7AiIiLTHqjQiIiKiXMburs/EiIiIiKSDiREREZkS5+xMY4dApDdMjIgqLHapJv1oIks2dghUkbHEiIiIiCgPe6URERER5WGJEREREVEu9kojIj1hGyMiIm0xMSIiIiLKw8SIqKIydnk0EVFZKIx7eiZGRBUWEyMiMkFsY0RERCaDJZFUwTExIiIizQmCsSOgio7jGBERERFJAxMjogqLVR5ERNpiYkRERESSIbJXGhHpB9uCEBFpi4kRmaT333/f2CFIn/sIY0dARKQ9dtcn0l6nTp2MHYL0mdsbOwIiIu0xMSLSnsAuw0REpAdMjMgkMTEiIiJ9YGJEJsnMjLcuERHpHr9dyCQxMSIiIn3gtwuZJCZGRESkD/x2IZPk5eWF3r17l2nfUaNG6TgaIiLSFYXMuCM8CqLIqZKNjQ2JtSeKIiIiItCsWbMy7VspXvO2OcaOgCqonZH7jR0CVXA9EroarWaAJUZksuzt9TdOj42Njd6OTURE0sXEiEgNCwsLY4dARERGwMSIKpXvvvtOo+02btyo30CIiEiSjJYYZWZmYtasWQgODkb79u0xbtw4REVFKdevW7cOXbp0QadOnbB06VIUbAoVGRmJoUOHonXr1hg3bhxiY2OV69LT0zFt2jS0a9cOvXr1wp49e1TOGx4erjznrFmzkJWVpf+LJYNo164dAKBnz57FblO/fn2NjtW6dWudxERERKbFaIlRTk4OPD09sXbtWhw6dAjt2rXD5MmTAQAnTpzAli1bsG7dOmzevBknTpzA9u3bAeQmVJ988gmGDBmCQ4cOoUGDBpg+fbryuGFhYUhJScGuXbswb948LFiwAPfv3wcAREVFYcmSJVi0aBF27tyJmJgYrF692vAXTzpRuN/ArFmzcO3aNYSHh2u8T3m3IyKiisVoiZGtrS3GjBkDd3d3mJubY/DgwYiJicHTp0+xa9cuhIaGwsvLC9WqVcMbb7yB3bt3AwAiIiJga2uLvn37wtraGmPHjsXVq1eVpUa7du3CuHHj4ODggEaNGqFdu3bYt28fAGDPnj3o2rUrgoKC4ODggDFjxiiPq05mZiZSU1NV/qWnp0OhUOj0H2lP3WsniiICAwNL7HGWk5Oj0WvO94WIyHh0/T2rzWe6ZFqYXrp0CS4uLqhSpQru3r2L4OBg5brAwEAsW7YMAHDnzh0EBAQo19na2sLLywt37tyBvb09kpKSVNYHBgYiMjJSuW+rVq2U62rXro3o6Gikp6er7YW0du1arFy5UmXZwIEDMWjQIN1cNJXZ/fv3VapQAeDx48fK0sHixMfHl7oNAERHR5crPiIiKruHDx/q/Jh+fn4abSeJxCg1NRXz5s3DhAkTAABpaWlwcHBQrre3t0daWhoAQC6XF+mmbW9vD7lcjrS0NJibm6skOSXtm38OuVyuNjEaNWoUhg0bprLMwsICVlZW5blc0gEfHx/l+5rPw8MDPj4+Je5XvXr1Urc5ePAgPD09yx0jERGVjbe3t9HGMTJ6YpSRkYHJkyejTZs26Nu3LwDAzs4Oqampym1kMhns7OwA5JYQyWQylWPIZDLY2trCzs4OOTk5KiVAJe2bfw5bW1u1sVlZWTEJkigzM7MifzTqlmmyX2GdOnVCcnJyuWMkIqKy0eSzWm/nNspZ82RnZ+Pzzz+Hm5sbJk6cqFzu5+en0kPt5s2b8Pf3BwD4+/urrJPL5Xj06BH8/f3h5OQEV1dXjfe9desWPD09OZhfJZLfqNrLy8vIkRARkRQZNTGaO3cuMjIyMHPmTJUGs8HBwfjrr78QHR2NxMRErF+/XtkFu2nTppDL5QgPD0dmZiZWr16NoKAg1KhRQ7nvqlWrIJPJcPnyZRw7dgxdu3YFAPTo0QMHDhzA9evXkZqaijVr1pTYtZukrXByo8k0H/mJ0YgRI/QSExERmTajVaXFxsYiPDwc1tbW6Nixo3L5999/jzZt2uDWrVsYPnw4FAoF+vXrhz59+gDIrd76+uuv8dVXX2HBggUICgrC7NmzlfuPHz8ec+bMQY8ePeDk5ISpU6fC19cXABAQEICJEydi0qRJkMlk6NSpE0aPHm3Q6ybdcXR01Nux2V2fdO3BnwIWbhCxbJuxIyGikhgtMapRowbOnj1b7PpRo0YVOwt6/fr1sWnTJrXrbGxsMGfOnGKPGxISgpCQEO2CJZOgTYkREx8yNG93AU0Ced8RSR2nBCFSQ5Mki0hbw7sbOwIiKg0TI6qUSisxYokS6YOROtkQkRb4Z0omJ78xfVmUlvBUqVKlzMcmIiLdEBXG+3HKxIgqDF20McofGbVCVKVFvWvsCIgqpdYHX0XAFH9jh2HajPgRzMRIAj799FNjh4Dhw4fD3d0dH374obFDMar8hKhCzJWWctTYERBVSg6BDgj8rDYE8wrwA8tIjPnjlImRBBSc/sRYevXqhdjYWHz33XfGDkWvNO2VViESI7aTIjIOodD/ZFKYGJGSqVcfaVOVVtoxXF1ddRKTvq1duxYLFiwwdhhUyQnmAmoOrGHsMKTDtD9KKz0mRhLAHlDaKc/rlZ/4aJogSd3IkSOLr4ot5RqGdgGO/WAa10mG5ewANNBsInL4veuLLlEd4TWEEy8rGfDzw+sNvu66xsTIRDVs2BAA0KhRI/Tu3RsAlKODm6KwsDB069YN77//fpmPYW1tXeo2pSU8Uk2Irly5gmXLlmHZsmU6Od6wrsCG6WZo20jA+68BNlbA4E46OTRVAHHbBFxcq/nfgqWTZZFl9b+uh1qT/OHUyEmXoVEBPmNfQsOlDYwdRoXDxEgCCpde1K1bF/3798cXX3yhsnzWrFno0KEDVq5ciX379mHVqlXYu3cvtm/fjtjY2GIbTr///vvo3Lkz2rZtq1E8f/75J5o3b45JkyaV7YLKYNy4cdi7dy+aNm2q1X6///47BEFA8+bN0aRJk1K3N9WRr+vXr48JEybobDiBRRNefOl9/6EZnu0RsPpTocw/dGvk1TxaGm0sfdIlG2sBZmbl+5Hg89ZLqPNlbdj52uooKtMhGKiNkUR/x5k8JkYS5Onpia1btxaZ2qR169Y4fPgwxowZA3d3d7z11ltwd3eHIAjw8PAoUtqxefNmLFy4EAsWLMCBAwdw7NgxjSZPDQ0NxenTp7F48eJit/n888/Rv3//sl2gDg0bNgwxMTH4999/JVvaI0XVnFWfW1oIsLcVcP13AX/MFPDJ0NKP4esBWJgDr9QGrv2Wm1hF/qL6HswZI+Aldx0GTiYnaG5dWFa1hIVzJcqa8/4MCn8kNfyhARqvbWT4eEgrlehOlS5dlV7Uq1dP+bhjx44YOHBgkW0WL16MzMxMeHh4YMmSJWU+19y5cwEYp+qp8Ovl4eGh8b61atVSe4x8Uk+u9B1foLeAQG/gyt3S78l+bYEv3hRQ1REwNxcwulf+mhf7fjFcwBfDBQjtKkAvv3L4abK07ytdKO5vyqaGDTpdbg+IwF7vAwaOSlocAu1RpVkVnMdF3Ryw4t9WRsESowrEw8MDW7ZswcSJE7F+/Xq127i4uGDDhg1FSoNMrWqprAomj6aoYHXoW2+9VcrWZf/U9K+p2b7Vqggwr8BjtYzsqZvjBBi5fWyjgNz/67xU+rbdmmt5cA0+O8xtzWFuZ17serdubhAsKlDPtmL+JCrJx6zJY2IkQeVJUl577TUsWbIENWpUkA8YPSmu5KW45e+++y78/f3x2Wef6TOsUnl5eWHPnj1YsGABvv32W+XyO3fuqNm6+ISltIKnN7sB3VsAgd6Ao10ZgzUxA9q9eLz4PQH3/xTw/Ye6SfoKvt6t6qUDeJGsGMI/ywScDhMwdZh21/P5m7qNo8G3QWqXew/zRNc7nfDKzw11e0IjUX6O6LsEWuIl3AW9vLQ+vN7wRPMt2rUjNQZWpUnAwIEDMXPmTGOHQSXo1q0bfvzxRwDA/PnzjRpL9+7d0b276jTtfn5+UCgU6Ny5Mw4fPlzuc5ibC9izSIAoimgxXsTZ60W3qWi/fj8MFfCSuwgzAXhvQG67q9Q03V/ksvcScDnaGz1aCnDva5gX0d5WQPN6mlWRDmj34st2+ggBjWsDVhZA38+L2Tf/y1mDS/F6wxMWjhawrm6FU/3OqqyzsK9AX0fFlRjlzf/lUM8BqddSDRiQ8TnUcYD3G17GDkMjFehONF1BQep/RRVmbl58UbSxDB48GH/88YfOjtesWbNSt9FntZ+2JUlSIghCodem/DELggChmG88bd6GxrWB87fKHY5eWVkCS95XLUQv69v+wWvA93+pX1fFQYE3uiGv15dhs8vi3jM7G+DtPoC1FTCm94vl1lYCQjso9y7xoHZ+L4oWHeqqH83fzMIMNV+rxKXZeS+haxsX3SRG0v9YMkmsSpO4lStXAgD8/f017m6vL/7+uZMiFhxpWddJSv369REWFoZ33nlHOT6TlLVu3RoAyjX+kv7ovhqorL6ZIP1PcHXXWdy1jy9hyLB7mwV894HqjlK5+gHtAHW/r2ysgG/fM8O8cWZlbjNm72eHoHl14RHijqa/Ny5npCauuO76Os6DraoUHT+Kyo+JkUTUr19f7fIxY8bgypUruHTpklFKjG7cuIGvv/4acXFxOHfuHE6ePIlPPvlEr+ccN24cli9fjurVq6tdP2TIkFKPsXfvXvTr10/rcxcsGSo4h13NmjWLPc+RI0ewePHiYuMtq/nz56Nq1aoICwvT6XEB7Up7dJEYtSihzfv0kcAnQ3NLbHRhWNfcxs67vhZgbZW77MeJAszMcocXKI/jPwpY+oFQYqLn4yHorISxce2y7zukc+7/n73xYlkVx9whFXYsFDCs64vluvp94zveB03WvQJ7v9Ibplk4vqiwsPEofXBWO3+7IvtJVf77HzC5VqEVef/r6vV+x0c3ByIVTIwkonPnzsrH+aUQ+erXrw97e3udn3PhwoXKxz169FC7TWBgID7++GO4u7vD2dkZrVq1Mkq1krW1Nb788kvMnDkTo0ePLnX7bt26Ydu2bXBxcVG7vrhr+Prrr5WPN2zYgAYNGuCdd94pduBJe3t7tG/fHhYWFspxoho31s2v5alTpyIpKQnjxo0r2wEKXWPDvM/oZnUBCwvN30NdvN2OdsUfZNZoMyx8xww2VuU/DwD8Ps0MtzaaoeerAu5uEnDtNwHvDhBw7w8BD/4sPg73qkWXFb72Ng0FfBAqlHg9uiAeM4N4zAw+mo9EUcSG6QLubBIwb5zqx3ydlwT0aiXA3Mif/i3/bg6HQHt4v+mJKs2qKJfX6Jd70dU6qc5X2Hr/q3g1vDlqTdRwrhIJeGmEftvUaNMuy8LZAm5dqsFzsPofebommHBvVemn3pXE7NmzERkZCUdHR4P1fJo0aRICAwNRt25dODs7l76DEVlZWeGrr77Sej9Nq/oOHz4MURTRpk0b5bIGDRrg4sWLMDNT/QYJDw/H119/XWSk8Tp16mDdunWYM2cOzp8/r1w+Z84cpKWlYc2aNYiLi9Mq/vIloar7fvNObqlJSaU3pR/lBSfd5+o6V6OagBrVch97uxf9ud6/LRCXDPRoKcC3huE/yEP+B4SfBIJfBXb9V/K2Hi7Au/0FODsAj5NFzP2t5O0FQYCfht+BxmhC59zICe3+bVNkecMfGsBzcE24tKqKfb4Hlcstq1jC5X8ueHI2xZBhlotgKZ1++1auVmj+R+4PvOg/YvR2Hvfg6vB56yXYetvgaIsTyuWCCRXDMDGSCEdHR6xcuRI+Pj5Fvoj1xdLSskzVTbrWvLm2A6dozsJCs1u8Q4cOGh+zd+/eWrV/yp/apbixpQzF0gLo2ET7b8CCX5pmZrnHcbYHPh6q22/Tui8Bp6+Vff8qDsAvn2sXU+NAAdNGlDCsQdnDUVFcNeG2uQJuPQLSM4Fd/xX9six4fmsr4Mu8WNMzgFqeQD0foNU7Fat7oLmdOap3czPoOe387eAQaA87H1vcC3ug9/MV7iNR60M/wEzA7cXqht0onZ2/HdLupJW4jcFKcMyAah1ciy43gQ4s+Uwoh6OKplGjRvjhhx+wfft2vZ3j77//Vj4eNmyY8nHBOcd03TaoPKNqBwYGAtC8p2LJVM9X1ny7YNhNA4GYrQLubxbgZK/bD7rfvhTg7pI7dtLjv3Pb8hxcotk5ln8kIGmHgD5tpPPhm5+k1fMB/lfMPJ/m5gLq+mgfs421gFHBAl6tL53rNWXewz3RbH0TONZz1O+J1LxdZpYC6kwLRJ0vyt6grN7cOuUISrfMLIr5oDGhW5WJEZVLcY3GNeHn54f33ntPqyk9tNWqVSv8999/2LBhA3777UXdwwcffAAvLy/Y2NggPDxcb+cv6Pfffy91m/3792PTpk06GYuo8CdRm5fLeJQCh1GIgIuTABtr7T/lWqs5/4R+Lx4Hegt4uCW3TVD1qrlteTo1VT1P57ymXj1aFj2WppOeOhSY09SplDbC5fmRO7yHgNubBJxfXfqErJrUrEhp3Kjfm74YiNH3bV+9nafRzy/DtZ0LXg3XX6kygBe1q/oejzH/PtDxe2lZVRq90wRzAXVmBKpfV85JiQ2JVWlULp988gkOHz6MZ8+e4dy5c1rta6gqw5YtW6JlS9VvUnt7e9y+fRtpaWk6m7E+X3BwMKZPnw4AKu2QWrdujTNnzsDW1hY3b97EgAEDUK1aNRw7dgxLly5Fly5d8NJLL+GllzSYt6EYCkXxc5KVtRt2wb3K8+X85ywBK3cAXZsBt2OAW49ETB6sGpNlKY3CV34MPIwX0LQO4NC9bMHsWSSg8yQRHi4ld7vXBU2nVimOZYFP6PL2qCvMucBQQ4UnFS7NlRrV8dLPXvCu7w1bTxvdBlaA58Ca8BxomMbC5dXop5eRciEFHn2K/6FXpYmaF9qEqpiKY25vjtYHXoW5rTlsvV/88ig4kKWNHu8TXWNiROViY2OjLN2oUqUKUlI0bxhpqMSoOFZWVrCy0lFXqAKaNm2K3377Dbdv38bkyZNV1uUPYFm/fn1cu3YNNWrUgLOzM37++WednFslMdLRB27Bw5QnMapRTcD0kbmPWzUAyvLz3NICaPdK+fo8t35ZQOy23JKj0hIxbf37k26Pt/BtAVuOilAogPXT1B/7/+YKGPO1iKFdgB+KGVRSnRkjBfy2V0RaBvDHTO3iNjMTYN/MDo4+6gdyNDVaDV9hLkDMKbqDfYA9PAeVnMQp2/locL6XRnrDpoY1Um/JELMlVvMAjcQhsOi90Gx9Y0QtugPX9i6wrqb7z1p9YWJEeuHk5IRnz57BxcUFycnJyuW1a9fGrVu3lI8rqjfeeKPUberWravz8+pjVHAp/aDVVSxVHXV7UafDBOQoUOY2P/UKDEfzbv8Xj31rCIjaAMgzgSBf9cfu21ZAnza5bdj6tRHx1a8ixvYuPQ5XZwEPt+Q2/K5WRdvESKvN9crWxxZijoj0R+llP4gWfzfW7tZIj1FzLnUvYTGHdetSDQ/WPQQAvDTKW+02llUtETClFh5tjC49MZLQ32hBdj52aPhDMQ3sJExCtzdVJAMGDEBkZCSioqJUloeFhSEgIACNGzdW9tYqjru7u/Jx/qjbVDKVEiPZJTjZZgEAvijHZKDv9n/xqfthqEQ/gY1g65zcKr3fvhTQvF75GkLbWAu4/ruAX78Q8PU7qsfxqykUmxTly2/Y36mpgMNLzfB6Vw3bW9kJWidFAGDM5iKFk+MOZ9ui47l2MLcre12juQbjAVm6WMLawxqBX6if/demhuZVRdV7uCHwy9rwHf8SAqe+OF7dr140oq4ZWnGnTml9qBX8JvigxV+lTwFlDCwxIp0p3OtKXc8qLy8v3Lx5U+32hX322WfYsGEDnj17ho0bN+ou0Arsvffew7///pv7RMzGpV8sse+feLzZu+w970I7AGFTBGTnAG90K337fd8K+GajiAn9df/tqet2NuXRv52A/u10d411XhJQp+zNywzqg1AjnrzQS17WRr0ttzfH6dfOwtzFHF7DSq4Cs3K1RMdL7SGYC0g4lKiyrnoPN1TrWE2j0buVMQsCAiYV/bHnO+YlWDpbwqamNRyLmW9OFyyrWCDrabbejl8a50ZOcG7khPS4DKPFUBKWGJHOfP7558rHxVUlWVtb505MqkGdiKOjI6KiohAdHY169bQclbCSKjxdind1oEsTebmm2xAEAeP6CJjQX9CoAXfX5gL2LTZDv7a6SRpWfCxAEICOjdLgVkUnh9SYleWLXmz9jTtVoaQM7Vz6NlLm0ccdrq1d0PFyOwT8nx/MbUrPuM1tzGFmWfQrs9n6JvAdoz6jNbN+sb25fennMLMyg/cwT7h1rFbqtuXRYmtz2NS0QfUehh0vqggpdbUsgCVGpDPvv/8+UlJS4O/vrzLFyaZNmzBixAj06tVL6x5XFhYWGg/SSMZv0K4PY0Ny2848f5IAwLBzQwmCgItrgSPncydgpVxGmLaxdJrk4QLQ9kRrONTOHbbdytUKQmrpOxacskQb5jbmeGVlQ8TteIyAKbVK30EN13aqgyWa25sjR5YDay1KqADAokBi5tzICR0vtYMgCNjlurdMcRVkZUINqzXBbxzSGSsrK7z11lvw8VH98ho8eDBCQkJgZ1f6xJJE6rg6A6lPjXNu/5oC/E2jx7hebZ0jYOIPIsb0FqDzgXgMRDATSq6iKlSS7drOBVkp2WjwbVCBTbQrCa05oAZqDih7eyFbTxs0/a0xbn0ThYY/vgwzazPEbX+MmgNeDAtQUkhmVgLEHKDhj6qNoHUx56VlVUvkyLLRZO0rZTuARG8jJkZkEEyKDGfDhg34+eefS23cbupWfCxg3DciLC1ezCRP+lOwTZVCYcRvNA2+0D2H1ET1bm5wqOOA463/0fzQhUrCWm7T88CSGnIPrg734BftBAM+Um2fZGZVfElxx0vtIWaLWjUO11THi+2gSFfAypUlRkQkYUOHDsXQoUMBlDzgo6kbHQy85C7Av4buu9+TaTOzFFCjr35G1HdpVVX5OGCKNHrLOgQ5wLahDeRX0uEQYI/UmzLlOms37arctGFhbwGYwGTS2qp4DRKIqFIwNxfQvYWA2t5MiggImvtiXLCXRqlvy2jpWv6pMywcLdDuZGu8sqohan1UtnZDuiYIAnxWeaPjlfYm1c1fom2vWWJEREQmpJg82HNoTZjZmMHK1QrOjZzUbvPKTw3VLteWQx0HONSR1qjfgpkAazftq7QCJvsj6ts7cKzvgOeRqRrv59bNyD3a9IiJERERmYzimhiZWZiVOq+aYz1pJTP64DXUEzfn5Q6s22Bx0bHkCqs9NQDVOlWDY5Aj9vsdLHX7l5fWR8rFZ6j9sf5Ky2rO0d/E4ppgYkRERCbDzudFRw77Wlp26qgEta42NW3Q5kgryB+mo3r30kt1BDMBLq9WLbK86e+N8WhDNDz6uOPi25eVy73f8IJ36TMeaUi1Ls3SxRL/O9gS8TnxujpBmbCNERERmYzqPd1Q4zUPODZwRNPfG5e6fUBeyYZjA0dYlVLVpIsu7FLg9LIT3IOrv5i0tgzce1ZH098ao2qLKroLrBRB8+rC1svWYOcrDkuMiIjIZAiCgMYrGmm8fe1PasGtkyscgxxLTXzcur0YcTrwi4o7ybU2bL1tYV/LDrLbaTrvhWdVTbXHnIWjNFISaURBRESkB4KZgKotilYVqWNV1Qptjv8PspsylXGDKjPBTECrPS3x7NJzuLTR7HXUlLm1aqVVSeMxGZI0oiAiIpIApyBH1OjnIZkvaSmwcrFCtQ6uMLPQ/WvyysrcnoL2texQrb1rKVsbBkuMiIiIyChqDqiBqs2rwKq6NQRzAaIxR1XPw5SYiIiI4D3SCwBQvYdhxyiy9bYtUq1mTCwxIiIiIjT4Ogjew7zg9LKjsUMxKiZGREREBMFcQJUmzsYOw+ikU3ZFREREZGRMjIiIiIjyMDEiIiIiysPEiIiIiCgPEyMiIiKiPEyMiIiIiPIwMSIiIiLKw8SIiIiIKA8TIyIiIqI8TIyIiIiI8jAxIiIiIsrDxIiIiIgoDxMjIiIiojxMjIiIiIjyCKIoisYOgoiIiEgKWGJERERElIeJEREREVEeJkZEREREeZgYEREREeVhYkRERESUh4kRERERUR4mRkRERER5mBgRERER5WFiRERERJSHiRERERFRHiZGepCZmYlZs2YhODgY7du3x7hx4xAVFaVcv27dOnTp0gWdOnXC0qVLkT8rS3Z2Nj7++GP07NkTzZo1Q2JiospxZ86ciVatWqFt27Zo27YtBg0aZJDrCQkJQfv27ZGenq5clpqaitatW+O1114zSAy6du7cOYwcORLt27dH586dMX78eERHRxs7rBLp674CgO3bt6N///5o06YNQkNDcf/+fYNcU0W7t0zxvgL0d28NGjRI+XnVtm1bNG/eHL///rver4f3lTTo676Kjo7Gu+++iw4dOqBnz55Yu3atbgMXSefS0tLElStXinFxcWJ2drb422+/iX369BFFURSPHz8u9urVS3z48KGYkJAghoaGiv/3f/8niqIoZmVliRs2bBAvXbokNm3aVExISFA57owZM8S1a9ca+nLE3r17i/379xf37t2rXLZ9+3axf//+4oABAwweT3k9f/5c7Nixo3j48GExJydHlMlk4qFDh8TY2Fhjh1Yifd1XR48eFQcOHChGRUWJCoVCfPjwofj06VODXFNFurdM9b4SRf3dWwU9efJEfPXVV8UHDx7o/Xp4X0mDvu6rDz/8UJw7d66YlZUlPnr0SOzevbt46tQpncXNEiM9sLW1xZgxY+Du7g5zc3MMHjwYMTExePr0KXbt2oXQ0FB4eXmhWrVqeOONN7B7924AgIWFBYYOHYqXX37ZyFdQVPfu3ZVxAsDu3bvRvXt35fNVq1ahd+/eaN++PUaNGoVbt24ptxs/frzKsb788kuD/Goszv3792FjY4MOHTrAzMwMdnZ26NixIzw8PJCTk4OwsDD07t0b3bt3x5IlS5CdnQ0ACAsLw5dffomJEyeiffv2mDBhApKSkgwWt77uq1WrVuGjjz5CrVq1IAgCvLy84OzsbLDrqij3lqneV4BhPrMOHDiAunXrwtvbW9+XA4D3VUW+r2JjY9GtWzdYWFjA09MTr7zyCu7cuaOzuJkYGcClS5fg4uKCKlWq4O7duwgICFCuCwwM1OoN/e2339C5c2eMHj0a586d00e4arVs2RI3btxASkoKEhMT8fDhQzRp0kS53s/PD7/99hsOHjyIli1bYsaMGQCAjh074vr160hISAAApKen4/jx4+jWrZvBYi/Mx8cH6enpmDt3Lk6ePInU1FTluvXr1+PixYv4/fffsWXLFly/fh1btmxRrj948CCGDBmCffv2wd3dHQsXLjTGJQDQzX2Vk5ODGzduICoqCsHBwejTpw9WrlypLNI2hIpyb1WU+wrQ7WdWvt27d6NHjx66DLNEvK8q7n01cOBA7N27F5mZmXjw4AEuX76MZs2a6SxOJkZ6lpqainnz5mHChAkAgLS0NDg4OCjX29vbIy0tTaNjDRkyBNu2bcOe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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "train_start = pd.Timestamp(\"2015-01-01\")\n",
+ "cal_start = pd.Timestamp(\"2016-01-01\")\n",
+ "test_start = pd.Timestamp(\"2017-01-01\")\n",
+ "test_end = pd.Timestamp(\"2018-01-01\")\n",
+ "\n",
+ "train = series[train_start : cal_start - series.freq]\n",
+ "cal = series[cal_start : test_start - series.freq]\n",
+ "test = series[test_start:test_end]\n",
+ "\n",
+ "ax = train.plot(label=\"train\")\n",
+ "cal.plot(label=\"val\")\n",
+ "test.plot(label=\"test\")\n",
+ "\n",
+ "ax.set_ylabel(\"El. Consuption [kWh]\")\n",
+ "ax.set_title(\"Dataset splits\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cd792a32-744a-4815-86d9-d3d7b3677859",
+ "metadata": {},
+ "source": [
+ "### Example 1: Compare different models on single step horizon forecasts\n",
+ "\n",
+ "Let's see how we can use conformal prediction in Darts. We'll show how to:\n",
+ "\n",
+ "- use conformal prediction (predict and historical forecasts)\n",
+ "- evaluate the prediction intervals (simple prediction and backtest).\n",
+ "- compare two different base forecasting models using conformal prediction.\n",
+ "\n",
+ "To demonstrate the process, we focus first only on one base forecasting model.\n",
+ "\n",
+ "#### Train the base forecaster\n",
+ "\n",
+ "Let's use a `LinearRegressionModel` as our base forecasting model. We configure it to use the last two hours as lookback to forecast the next hour (single step horizon; multi horizon will be covered in Example 2).\n",
+ "\n",
+ "- train it on the `train` set\n",
+ "- forecast the next hour after the end of the `cal` set"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "8a9952be-a6c4-4da1-aabe-70c8f019b222",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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oN6jR486l1VQO3Fxcfjzzz9FCf+effZZaDQaGUtFEARBOAPkWrIx8fHx1T5z1PgYId26dcO2bdvw3HPPISgoCM8995zcRSIIgiCcABIyNqZZs2a49957cerUKfaZo8bHVKVTp07Yt2+f3MUgCIIgnAhyLdkBPk4GMGcufvDBB2UsDUEQBEE4LiRk7IBQyMTFxVFmW4IgCIKwEyRk7MDAgQPZcgRPPfWUzKUhCIIgCMeFYmTsQEBAAE6cOIFr166hS5cucheHIAiCIBwWEjJ2IiQkBCEhIXIXgyAIgiAcGnItEQRBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWkjIEARBEAShWjQcx3FyF4IgCIIgCMIayCJDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqISFDEARBEIRqcZW7AGrAYDDgww8/xL59+1BSUoK2bdvizTffRJs2bZCWlobZs2fD3d2dHf/TTz+hefPmMpbYttRVfwA4fvw4Pv30U5w/fx6+vr6YPHkyBgwYIHOpbUdd9Z87dy42bNggOrZXr15YsGCBjCW2PXW1gcFgwLx587Bjxw5wHIdevXph2rRp0Ol0chfbZtRV/7KyMnz66afYtm0bNBoNnnrqKTz11FNyF9kuzJkzBzt27EBZWRmaN2+Ol156CX369AEArFixAv/73/9gMpkwbNgwvPLKK9BoNDKX2LbUVv9Dhw7hm2++walTp9ClSxd8+eWXchfVpqSkpGDu3Lno2LGj3EWpGY6ol9LSUm7x4sXc9evXucrKSu6///0vN3ToUI7jOO7333/nXnrpJZlLaF/qqn9eXh6XlJTE7dy5k6uoqOBu3brFXblyReYS25a66l+VJ598kluzZo20BZSAutrgP//5D/fUU09xhYWFXHFxMTdx4kTu66+/lrnEtqWu+v/rX//iJk6cyN25c4fLycnhHnnkEW737t0yl9g+XLhwgSsvL+c4juNOnDjBJSQkcEVFRdzOnTu5wYMHc1euXOHy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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "horizon = 1\n",
+ "\n",
+ "# train the model\n",
+ "model = LinearRegressionModel(lags=2, output_chunk_length=horizon)\n",
+ "model.fit(train)\n",
+ "\n",
+ "# forecast\n",
+ "pred = model.predict(n=horizon, series=cal)\n",
+ "\n",
+ "# plot\n",
+ "ax = series[pred.start_time() - 7 * 24 * series.freq : pred.end_time()].plot(\n",
+ " label=\"actual\"\n",
+ ")\n",
+ "pred.plot(label=\"pred\")\n",
+ "ax.set_title(\"First 1-step point prediction\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f8a80d6b-2818-4079-b39a-1848a2f049c1",
+ "metadata": {},
+ "source": [
+ "Great, we have our single step forecast. But without knowing the actual target value at that time, we wouldn't have any estimate of the uncertainty."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8e5bbfe1-2e10-4675-844d-d965c0371ca3",
+ "metadata": {},
+ "source": [
+ "#### Apply Conformal Prediction\n",
+ "\n",
+ "Now let's apply conformal prediction to quantify the uncertainty. We use the symmetric (default) naive model, including the quantile levels we want to forecast. Also:\n",
+ "\n",
+ "- we don't need to train / fit the conformal model\n",
+ "- we should supply a `series` to `predict()` that does not have an overlap with the series used to train the model. In our case `cal` has no overlap with `train`.\n",
+ "- the API is identical to Darts' forecasting models.\n",
+ "\n",
+ "Let's configure the conformal model:\n",
+ "- add a 90% quantile interval (quantiles 0.05 - 0.95) (`quantiles`).\n",
+ "- consider only the last 4 weeks of non-conformity scores to calibrate the prediction intervals (`cal_length`).\n",
+ "\n",
+ "> Note: you can add any number of intervals, e.g. `[0.10, 0.20, 0.50, 0.80, 0.90]` would add the 80% (0.10 - 0.90) and 60% (0.20 - 0.80) intervals"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "358f91ad-770d-4389-bf95-53004d8ec93f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "d89437eb2ec14fa997bdc230faa8e1e5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "historical forecasts: 0%| | 0/1 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "4450f86af0634a8399b4c67f46a44a6f",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "conformal forecasts: 0%| | 0/1 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHECAYAAAAj78DAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADEOklEQVR4nOydd1wU19rHf8vSFhDpVQURG6LYYqzYFcEWe+K9llivaRo1tmjQqFFTjDHNWCC5aowm0RujMQaNsXes2BArICIowrK03fP+se8cZ6i7y+7s7HK+nw86O/Wcs7NzfvM8z3mOjBBCwGAwGAwGg2GB2Ji7AAwGg8FgMBiGwoQMg8FgMBgMi4UJGQaDwWAwGBYLEzIMBoPBYDAsFiZkGAwGg8FgWCxMyDAYDAaDwbBYmJBhMBgMBoNhsTAhw2AwGAwGw2JhQobBYDAYDIbFwoQMwyKIj4+HTCYr92/WrFm4e/cuZDIZ4uPjjXbNr7/+Wq/z/f777xgzZgyaN28OOzs7yGQyo5WF4/jx44iNjcWzZ8+Mfm6pk52djVGjRsHHxwcymQyDBw82d5H0plu3bujWrZu5i6ETsbGxZe7h4OBgjBs3Tq/z5OfnIzY2FocOHSqzjftd37171/CCMmo8tuYuAIOhD3FxcWjSpIlgXUBAAHx9fXHixAk0aNDAaNf6+uuv4eXlpfODe+fOnTh58iRatWoFBwcHnDt3zmhl4Th+/DgWL16McePGwc3NzejnlzIffvghdu7ciU2bNqFBgwbw8PAwd5FqHDt37oSrq6tex+Tn52Px4sUAUEbExcTE4MSJE/D39zdWERk1ECZkGBZFeHg42rZtW+629u3bV3l8fn4+nJycjF0sAMD69ethY6M1cr755psmETI1mStXrqBBgwYYPXq0Uc5HCEFBQQEUCoVRzicViouLIZPJYGtr/Md7q1atjHo+b29veHt7G/WcjJoHcy0xrILyXEucafz8+fMYNmwY3N3dqcUmJSUFo0aNQkBAABwcHODr64uePXviwoULALQm9KtXr+Kff/6hLqzg4OBKy8CJGEPRaDRYunQpGjduDIVCATc3N7Ro0QJr1qyh9Zk9ezYAoH79+rRcfJP9Tz/9hA4dOsDZ2RkuLi7o27cvEhMTBdcZN24cXFxccPXqVfTs2RPOzs7w9vbGm2++ifz8fJ3Kum/fPvTs2RO1a9eGk5MTmjZtio8++kiwz2+//YYOHTrAyckJtWrVQu/evXHixAnBPtx3dPXqVbz66quoXbs2fH198frrryMnJwfAi+82ISEB165dK1Pv7OxsTJs2DYGBgbC3t0dISAgWLFiAwsJCwbVkMhnefPNNfPvtt2jatCkcHBzw/fffU/fGwYMHMWnSJHh6esLV1RVjxoyBUqnEo0ePMGLECLi5ucHf3x+zZs1CcXGx4NyLFy/Gyy+/DA8PD7i6uqJ169bYuHEjDJ2TNzg4GP3798fOnTvRokULODo6IiQkBF988YVgv0OHDkEmk+G///0vZs6cicDAQDg4OCA5ORkAkJCQgJ49e8LV1RVOTk7o1KkTDhw4UOZ6e/bsQcuWLeHg4ID69evjk08+qbBcpS2Uz549w8yZMxESEgIHBwf4+PggOjoa169fx927d6lQWbx4Mf3uuHNU5FratGkTIiIi4OjoCA8PD7zyyiu4du2aYB/uPk5OTkZ0dDRcXFxQt25dzJw5s8x3z7BumEWGYVGo1WqUlJQI1lX15jlkyBCMGjUKU6dOhVKpBABER0dDrVZj1apVqFevHp48eYLjx4/T2JOdO3di2LBhqF27Nr7++msAgIODg/ErxGPVqlWIjY3F+++/j8jISBQXF+P69eu0TBMnTkR2djbWrl2LX3/9lZrjw8LCAADLly/H+++/j/Hjx+P9999HUVERPv74Y3Tp0gWnT5+m+wHat/bo6GhMmTIFc+fOxfHjx7F06VLcu3cPu3fvrrScGzduxKRJk9C1a1d8++238PHxwc2bN3HlyhW6z9atWzF69Gj06dMHP/74IwoLC7Fq1Sp069YNBw4cQOfOnQXnHDp0KEaOHIkJEybg8uXLmDdvHgBth+bv748TJ05g2rRpyMnJwZYtW2i9CwoK0L17d9y+fRuLFy9GixYtcOTIEXz00Ue4cOEC9uzZI7jOrl27cOTIESxatAh+fn7w8fHBmTNnaPsOGTIE27ZtQ2JiIubPn4+SkhLcuHEDQ4YMweTJk5GQkICVK1ciICAA7777Lj3v3bt3MWXKFNSrVw8AcPLkSbz11ltITU3FokWLdLsBSnHhwgVMnz4dsbGx8PPzw5YtW/DOO++gqKgIs2bNEuw7b948dOjQAd9++y1sbGzg4+ODzZs3Y8yYMRg0aBC+//572NnZYd26dejbty/+/PNP9OzZEwBw4MABDBo0CB06dMC2bdvo7yIjI6PKMubm5qJz5864e/cu5syZg5dffhl5eXk4fPgw0tPT0bFjR+zbtw9RUVGYMGECJk6cCACVWmE++ugjzJ8/H6+++io++ugjZGVlITY2Fh06dMCZM2fQsGFDum9xcTEGDhyICRMmYObMmTh8+DA+/PBD1K5d2+B2Z1gghMGwAOLi4giAcv+Ki4vJnTt3CAASFxdHj/nggw8IALJo0SLBuZ48eUIAkM8//7zSazZr1ox07drVoPK+8cYbRN+fV//+/UnLli0r3efjjz8mAMidO3cE6+/fv09sbW3JW2+9JVifm5tL/Pz8yIgRI+i6sWPHEgBkzZo1gn2XLVtGAJCjR49WeP3c3Fzi6upKOnfuTDQaTbn7qNVqEhAQQJo3b07UarXgWB8fH9KxY0e6jvuOVq1aJTjHtGnTiKOjo+AaXbt2Jc2aNRPs9+233xIAZPv27YL1K1euJADI/v376ToApHbt2iQ7O1uwL3dvlW67wYMHEwDks88+E6xv2bIlad26dbl15+pfXFxMlixZQjw9PcvUQZd7KigoiMhkMnLhwgXB+t69exNXV1eiVCoJIYT8/fffBACJjIwU7KdUKomHhwcZMGBAmbJFRESQdu3a0XUvv/wyCQgIICqViq57/vw58fDwKHMPBwUFkbFjx9LPS5YsIQDIX3/9VWFdMjMzCQDywQcflNnGtT13Pz99+pQoFAoSHR0t2O/+/fvEwcGBvPbaa3Qddx+X/u6jo6NJ48aNKywPw/pgriWGRfHDDz/gzJkzgr+qLDJDhw4VfPbw8ECDBg3w8ccf47PPPkNiYiI0Go0piy2gpKRE8Ef+3/3Qrl07XLx4EdOmTcOff/6J58+f63zOP//8EyUlJRgzZozg3I6OjujatWu5I0ZKx5q89tprAIC///67wuscP34cz58/x7Rp0yoclXXjxg2kpaXh3//+t8Dd5uLigqFDh+LkyZNlXFgDBw4UfG7RogUKCgrw+PHjSut98OBBODs7Y9iwYYL1nOuitBulR48ecHd3L/dc/fv3F3xu2rQpAG1Aaun19+7dK1OOXr16oXbt2pDL5bCzs8OiRYuQlZVVZR0qolmzZoiIiBCse+211/D8+XOcP39esL70PX78+HFkZ2dj7NixgvtBo9EgKioKZ86cgVKphFKpxJkzZzBkyBA4OjrS42vVqoUBAwZUWcY//vgDjRo1Qq9evQyqY2lOnDgBlUpVxn1Vt25d9OjRo8z3KZPJypSzRYsWZb4fhnXDhAzDomjatCnatm0r+KuK0iMiZDIZDhw4gL59+2LVqlVo3bo1vL298fbbbyM3N9dURafY2dkJ/r7//nsAWvfAJ598gpMnT6Jfv37w9PREz549cfbs2SrPybkBXnrppTLn/+mnn/DkyRPB/ra2tvD09BSs8/PzAwBkZWVVeJ3MzEwAQJ06dSrchzu+vJEoAQEB0Gg0ePr0qWB96bJwbjyVSlXhdbhr+fn5lRFVPj4+sLW1LVOXykbHlB4FZW9vX+H6goIC+vn06dPo06cPAG3A97Fjx3DmzBksWLBApzpUBPd9lLeuqnpx98OwYcPK3A8rV64EIQTZ2dl4+vQpNBpNpdeqjMzMzErvBX2p6t4pXW8nJyeBAAO09w7/+2FYPyxGhmH1lGc5CAoKwsaNGwEAN2/exPbt2xEbG4uioiJ8++23Ji0PF5PBUb9+fQBacfHuu+/i3XffxbNnz5CQkID58+ejb9++ePDgQaWjrby8vAAAP//8M4KCgqosQ0lJCbKysgQC4tGjRwDKigo+XGzDw4cPK9yHOz49Pb3MtrS0NNjY2FRoFdEXT09PnDp1CoQQwff8+PFjlJSU0HbhMEVun23btsHOzg6///67oFPdtWtXtc7LfR/lrSv9HZWuF1fvtWvXVjiaz9fXl45wquxaleHt7V3pvaAvVd07pb9PBgNgFhkGA40aNcL777+P5s2bC0z2Dg4OBr9NV0Zpi1J5wsHNzQ3Dhg3DG2+8gezsbDqqoyJLRd++fWFra4vbt2+XOX9FlisuaJZj69atAMrm+uDTsWNH1K5dG99++22FI3IaN26MwMBAbN26VbCPUqnEL7/8QkcyGYOePXsiLy+vjGj44Ycf6HZTww11lsvldJ1KpcJ///vfap336tWruHjxomDd1q1bUatWLbRu3brSYzt16gQ3NzckJSVVeD/Y29vD2dkZ7dq1w6+//iqwYuTm5lYZ9A0A/fr1w82bN3Hw4MEK99HVugYAHTp0gEKhwObNmwXrHz58iIMHD4ryfTIsD2aRYdQ4Ll26hDfffBPDhw9Hw4YNYW9vj4MHD+LSpUuYO3cu3a958+bYtm0bfvrpJ4SEhMDR0RHNmzev8Lz37t2j1pbbt28D0FpIAO2w1arcYAMGDKB5cry9vXHv3j18/vnnCAoKoiM1uOuvWbMGY8eOhZ2dHRo3bozg4GAsWbIECxYsQEpKCqKiouDu7o6MjAycPn0azs7ONCkZoHWPfPrpp8jLy8NLL71ERy3169evzIgiPi4uLvj0008xceJE9OrVC5MmTYKvry+Sk5Nx8eJFfPnll7CxscGqVaswevRo9O/fH1OmTEFhYSE+/vhjPHv2DCtWrKi0HfRhzJgx+OqrrzB27FjcvXsXzZs3x9GjR7F8+XJER0cbLXajMmJiYvDZZ5/htddew+TJk5GVlYVPPvmk2qPcAgICMHDgQMTGxsLf3x+bN2/GX3/9hZUrV1YpBF1cXLB27VqMHTsW2dnZGDZsGHx8fJCZmYmLFy8iMzMT33zzDQBtosGoqCj07t0bM2fOhFqtxsqVK+Hs7Izs7OxKrzN9+nT89NNPGDRoEObOnYt27dpBpVLhn3/+Qf/+/dG9e3fUqlULQUFB+N///oeePXvCw8MDXl5e5aYzcHNzw8KFCzF//nyMGTMGr776KrKysrB48WI4Ojrigw8+MLg9GVaMWUONGQwd4UY3nDlzptztlY1ayszMFOybkZFBxo0bR5o0aUKcnZ2Ji4sLadGiBVm9ejUpKSmh+929e5f06dOH1KpViwAgQUFBOpWxvD/+SI+K+PTTT0nHjh2Jl5cXsbe3J/Xq1SMTJkwgd+/eFew3b948EhAQQGxsbAgA8vfff9Ntu3btIt27dyeurq7EwcGBBAUFkWHDhpGEhAS6z9ixY4mzszO5dOkS6datG1EoFMTDw4P85z//IXl5eVWWkxBC9u7dS7p27UqcnZ2Jk5MTCQsLIytXrhTss2vXLvLyyy8TR0dH4uzsTHr27EmOHTsm2Kei76j0aBZCyh+1RAghWVlZZOrUqcTf35/Y2tqSoKAgMm/ePFJQUCDYDwB54403yhxf0b1VUdm49uOzadMm0rhxY+Lg4EBCQkLIRx99RDZu3FhuHXQdtRQTE0N+/vln0qxZM2Jvb0+Cg4PLjKDiRi3t2LGj3PP8888/JCYmhnh4eBA7OzsSGBhIYmJiyuz/22+/kRYtWtD7bsWKFbT+pctV+l5++vQpeeedd0i9evWInZ0d8fHxITExMeT69et0n4SEBNKqVSvi4OAg+D2U9z0TQsiGDRtoeWrXrk0GDRpErl69KtinvO+BEFJuuRnWjYwQAzM2MRgMi2TcuHH4+eefkZeXZ+6iMCogODgY4eHh+P33381dFAZD8rAYGQaDwWAwGBYLEzIMBoPBYDAsFuZaYjAYDAaDYbEwiwyDwWAwGAyLhQkZBoPBYDAYFgsTMgwGg8FgMCwWJmQYDAaDwWBYLEzIGIhGo8GdO3dEnTVZatT0NmD1r9n1B1gb1PT6A6wNpFB/JmQYDAaDwWBYLEzIMBgMBoPBsFiYkGEwGAwGg2GxMCHDYDAYDAbDYmFChsFgMBgMhsXChAyDwWAwGAyLhQkZBoPBYDAYFgsTMgwGg8FgMCwWJmQYDAaDwWBYLEzIMBgMBoPBsFiYkGEwGAwGg2GxMCHDYDAYDAbDYmFChmFUxo0bh8GDB5u7GAwGg8GoITAhUwOJjY1Fy5YtzV0MBoPBYDCqDRMyDAZDkmRmZiIuLg6pqanmLgqDwZAwTMhYKPv27UPnzp3h5uYGT09P9O/fH7dv36bbHz58iFGjRsHDwwPOzs5o27YtTp06hfj4eCxevBgXL16ETCaDTCZDfHw87t69C5lMhgsXLtBzPHv2DDKZDIcOHQIAqNVqTJgwAfXr14dCoUDTpk0RFxcncs0ZNYVx48bh9ddfx8CBA81dFAaDIWFszV0AhmEolUq8++67aN68OZRKJRYtWoRXXnkFFy5cQH5+Prp27YrAwED89ttv8PPzw/nz56HRaDBy5EhcuXIF+/btQ0JCAgCgdu3ayMjIqPKaGo0GderUwfbt2+Hl5YWjR49iypQpCAsLw6hRo0xdZUYNoqioCAcOHAAAnD9/Hg8fPkSdOnXMXCoGgyFFmJApRdu2bfHo0SOd9lWr1ZDL5Ua5rp+fH86ePavz/kOHDhV83rhxI3x8fJCUlITjx48jMzMTZ86cgYeHBwAgNDSU7uvi4gJbW1v4+fnpVUY7OzssXryYfg4KCsL+/fuxY8cOJmQYRuXq1asoLCykn48dO4aRI0easUQMBkOqMCFTikePHlmET/727dtYuHAhTp48iSdPnkCj0QAA7t+/jwsXLqBVq1ZUxBiTb7/9Fhs2bMC9e/egUqlQVFTEAocZRufcuXOCz0ePHmVChsFglAsTMqXQx0phbIuMPgwYMAB169bF+vXrERAQAI1Gg/DwcBQVFUGhUOh9fRsbbbgUIYSuKy4uFuyzfft2zJgxA59++ik6dOgAZ2dnxMbGIikpSe/rMRiVUZ6QYTAYjPJgQqYUurp3NBoN7t27h6CgICoCxCIrKwvXrl3DunXr0KVLFwDCB32LFi2wYcMGZGdnl2uVsbe3h1qtFqzz9vYGAKSnp6NVq1YAIAj8BYAjR46gY8eOmDZtGoAXbcBgGJvSQubSpUvIyclB7dq1zVQiBoMhVdioJQvE3d0dnp6e+O6775CcnIyDBw/i3XffpdtfffVV+Pn5YfDgwTh27BhSUlLwyy+/4MSJEwCA4OBg3LlzBxcuXMCTJ09QWFgIhUKB9u3bY8WKFUhKSsLhw4fx/vvvC64bGhqKs2fP4s8//8TNmzexaNEiXLp0SdS6M6yfoqKiMveVRqPByZMnzVQiBoMhZZiQsUBsbGywbds2nDt3DuHh4ZgxYwY+/vhjut3e3h779++Hj48PoqOj0bx5c6xYsYK6wYYOHYqoqCh0794d3t7e+PHHHwEAmzZtQnFxMdq2bYt33nkHS5cuFVx36tSpGDJkCEaOHImXX34ZWVlZ+Ne//iVexRk1An6gr6urK13P3EsMBqM8ZIQfFMHQGXO6lqRCTW8DVn/T1H/Dhg2YNGkSAGDGjBlYvXo1AKBbt274+++/jXYdY8DugZpdf4C1gRTqX/NancFgSBp+fMygQYMQFBQEADh16lSZAPSawJMnT/DDDz/gP//5D37//XdzF4fBkBxMyDAYDEnBFzKtWrVC586dAQAqlQqJiYnmKpboPH36FP369YOvry/Gjh2Lb7/9FgMGDMB3331n7qIxGJKCCRkGgyEZiouLaaBvo0aN4Orqik6dOtHtUnMtmZJNmzZh3759NEcUx5QpU/DFF1+YqVQMhvRgw68ZDIZk4Af6tmnTBgDQtWtXun358uUYPHgwGjdubJbyiQlftL3zzjsoKSnBV199RT+npKRg2bJlcHZ2NlcRTc6hQ4fw448/olatWvDx8YG9vT2ePXuGvLw89O3bF7179zZ3ERkSgAkZBoMhGfh5nNq2bQsACAsLw8iRI/HTTz/h+fPnGDx4ME6dOiUY0WRtqNVqHDlyBADg4+NDA549PT2xZMkSAMCaNWvw22+/4bvvvkOvXr3MVlZTkZWVhf79+0OpVJa7/fPPP0diYiKaN28ucskYUoO5lhgMhmTgJ2Fs3bo1Xd6wYQOaNWsGALh+/TrGjRsHax5weeHCBTx//hwAEBkZSWeqX7x4Mb744gs4OjoCAO7cuYOoqCicP3/enMU1CevWratQxABasTdjxgyrvg8YusGEDIPBkAxXrlyhyy1atKDLLi4u2LVrF9zc3AAAO3futOq8Mv/88w9d5rvWAOCtt97CpUuX6Hq1Wo3NmzeLWj5TU1hYiLVr1wLQ5s3auXMntm/fji1btmDPnj2oX78+AODAgQNsJBeDCRkGQ0rk5OQgISGhRg4zJoTg8uXLAICAgIAy02uEhoYKkjRaoxWCozIhAwANGzbEr7/+CplMBsD6gqC3bduGR48eAQBeeeUVDB48GMOHD8drr72G6OhorFq1iu47c+ZMFBUVmauoDAnAhAyDISGGDRuG3r17o0+fPigpKQEAZGRk4O2338b69evNXDrTkp6ejuzsbABAeHh4ufvw3U3Xrl0TpVxio9FoaHyMh4cHdamVxsPDg848f/HiRdp2lg4hBJ999hn9PHPmzDL7DB06lM4zd+vWLRoEzaiZMCHDMDqHDh2CTCbDs2fPzF0Ui0KlUiEhIQGAtg1XrlxJR2esXbsWkydPtuqZxvlupYoCOJs0aUKXr1+/bvIymYPLly/j6dOnALTxMZVlS+3evTsAbefPt+JYMgcPHqRD8Nu3b48OHTqU2Ucmk2H16tXUIvXRRx8hPz9f1HIypAMTMkZArSY4lEjwY4L2f7XaMoPPzp07B5lMVmHsQd++fTFw4ECRS6UbMpkMjo6OZWbjHjx4MMaNG0c/jxs3jgZO8v+ioqLoPt26dSuzfdSoUUYt7/379zFgwAA4OzvDy8sLb7/9Nm7cuCHYJzY2Fn379sXFixfpujfeeANeXl5wdnbGwIED8fDhQ8ExwcHBZco+d+5co5bdVHBuJaBii4y7uzt8fX0BWK9Fpiq3Eh9OyADW417asGEDXeZPhluaNm3aYOTIkQCAzMxMxMXFmbxsDGnChEw1+fUwEDyCoPs7BK8t0f4fPILg138sT8y0adMGERER5T4QHjx4gISEBEyYMMEMJdMNmUyGRYsWVblfVFQU0tPTBX/cxJkckyZNEmxft26d0cqpVqsRExMDpVKJo0ePYtu2bfjll1/KzDZeUlKC48ePC9adPn0a27Ztw9GjR5GXl4f+/ftDrVYL9lmyZImg7KXPK1V0scgAQNOmTQEAjx8/thp3Ch99hEyXLl2oxcZahAw3y7mzszNeeeWVSvfli/SPP/64RsaWMZiQqRb7ziowYhHwMFO4PjUTGLbQtGJGo9Fg5cqVCA0NhYODA+rVq4dly5bh7t27kMlk2LZtGzp27AhHR0c0a9YMhw4d0um8EyZMwPbt28sMe4yPj4e3tzdiYmKwefNmtG3bFrVr10a7du0wevRoPH78uMJzxsbGUl8+x+eff47g4GDBuri4ODRt2hSOjo5o0qQJvv76a53KzPHWW29h8+bNgjf78nBwcICfn5/gz93dXbCPk5OTYHvt2rV1Lsfp06fRqlUrODo6om3btti5cydkMhkdWrx//34kJSVh8+bNaNWqFXr16oVPP/0Uf/75Jz0HN7wWAGxtbakJ3dPTE7169UKrVq1oXTl3FEetWrUEZXdxcdG57OaE+95kMhnCwsIq3M+a3UuEEBw+fBgAULt2bcHIrfKoXbs2TRx45cqVSn+HlkBWVhbu3r0LQDs9ha1t5anOIiIi0K9fPwDAvXv3sG3bNlMXkSFB9BYyy5YtQ9++fdG1a1eMHDmSBqUB2s6uV69e6NGjB9asWSMY33/16lW8+uqr6NSpEyZPnoz09HS6raCgAAsXLkRkZCRiYmKwb98+wTV3796N6OhodO3aFYsXL5aE6largSWbPVCeVOHWTV9rOjfTvHnzsHLlSixcuBBJSUnYunUrNbkDwOzZszFz5kwkJiaiY8eOGDhwILKysqo87+jRo1FcXIwdO3bQdYQQxMfHY+zYsbC1tUVRURE+/PBDJCYmYt26dbh7967AfWMI69evx4IFC7Bs2TJcu3YNy5cvx8KFC/H999/rfI6OHTuif//+mDdvXrXKAgBbtmyBl5cXmjVrhlmzZiE3N1en45RKJfr374/GjRvj3LlziI2NxaxZswT7nDhxAuHh4QgICKDr+vbtS4N7AeDrr7+Gl5cX5HI5vvvuOzrc9OHDh1RkBgQEIDw8vIzVZuXKlfD09ETLli2xbNkyixjRoVarcfXqVQDa0UkKhaLCfTmLDGB97qXLly/jyZMnALTWFrlcXuUxPXr0oMu6vrBIFf48W1xCxKrg/95XrlxZZkoHRg2A6MmdO3dIYWEhIYSQK1eukK5du5KcnBxy5MgREhMTQx48eEAyMzPJsGHDyK5duwghhBQWFpLo6Giya9cuUlBQQNasWUMmTpxIz/n555+Tt956i+Tm5pILFy6Qrl27krt37xJCCLl16xbp3r07uXr1KsnNzSWTJ08m33zzjb7FNjoHzqoJulT99/d5jdGv/fz5c+Lg4EDWr19fZtudO3cIALJixQq6rri4mNSpU4esXLlSp/OPHDmSREZG0s8HDx4kAMj169cF+6nVapKSkkJOnjxJAJDc3FxCCCF///03AUCePn1KCCHkgw8+IBEREYJjV69eTYKCgujnunXrkq1btwr2+fDDD0mHDh10KjMAsnPnTnL16lUil8vJ4cOHCSGEDBo0iIwdO5buN3bsWCKXy4mzs7Pgb8mSJXSf7777jvz111/k8uXL5McffyTBwcGkV69eZa7J1V+tVtN169atIx4eHkSpVNJ133zzDQFAEhMTCSGETJo0ifTu3bvM+WQyGYFWB5O0tDSSnZ1NHj58SAghpFu3bnQbVzdCCOnduzeZPHky/fzZZ5+RQ4cOkYsXL5L169cTLy8vMmHCBJ3aUF/Kq7+h3Lx5k9ZvyJAhle77559/0n1nzZpV7WtXB2O2ASGErFy5ktbtiy++0OmYffv20WOmTp1qlHLoirHrv2zZMlqX//73vzodo9FoSMeOHelxu3fvNkpZdMXYbWBpSKH+eltkgoODYW9vD0BrAi4qKsKTJ0+wd+9eDBs2DHXq1IGXlxf+9a9/4Y8//gCgVdkKhQKDBg2Cg4MDJk2ahKSkJGqV2bt3LyZPngwXFxdEREQgMjIS+/fvBwDs27cPvXv3RlhYGFxcXDBx4kR6XnOSrqNrPr1qI4jeXLt2DYWFhejZs2eF+/Aj/W1tbdG2bVud314nTJiAw4cPIzk5GYB28rpOnTrR+W0SExMxaNAg1K9fH82bN6dvhPfv3zeoPpmZmXjw4AEmTJgAFxcX+rd06VLcvn1br3OFhYVhzJgxmDNnToX7dO/eHRcuXBD8vfHGG3T7pEmT0KtXL4SHh2PUqFH4+eefkZCQoFPekmvXriEiIgJOTk50XUWjLkpD/t+Cybm13N3dERgYCABo0KAB3e/MmTOCY/jnmjFjBrp27YoWLVpg4sSJ+Pbbb7Fx40adrHHmRJdAXw5rtsjwrdH8APTK6NSpE3XBVBQnQwhBYmKi5EcSGmKRkclkmD17Nv28Z88eo5eLIW0MmmtpxYoV2L17NwoLC9G1a1eEhITgzp07iI6Opvs0atSIju1PSUlBaGgo3aZQKFCnTh2kpKTA2dkZWVlZgu2NGjWiZuaUlBRBR9CwYUOkpqaioKBAEEfAUVRUVMaUbmtrS8WXsfBz10AXz5yvO4FGY1z3koODAwBtnExpMyr3ufQ2rpPUxezao0cPBAUFIS4uDrNnz8avv/6KL774AhqNBkqlEn369EHv3r3x/fffo6SkBMXFxYiOjkZBQYHgutyyTCYDIURwbe470mg01KWybt06vPzyy4KyyOVynU3F3PU++OADNGnSBL/++isIIYJrE0Lg5OSEkJCQco8vj5YtW8LOzg43btwQxPrw66nrOo1GA19fX5w6dUqwD+dOAICQkBBabo62bdti48aNALQxONyxjx8/RocOHSose7t27QAAN2/eLNO21aW8uhoKX8g0a9as0nMGBATA2dkZSqUS169fN6srwZhtkJubS0cMhoSEICQkRKfzOjk5oV27djh+/Dhu3LiBtLQ0+Pn5CfZZu3Ytpk+fjrp16+LGjRv0GVJdjFl/4MVcWy4uLggNDdX5vN27d6fPmdK/LVNj7DawNExd/8rSD3AYJGTmzp2L2bNn4+zZs/StPT8/XxBU6OzsTMf1q1SqMjO0Ojs7Q6VSIT8/H3K5XCBKKjuWu4ZKpSpXyMTFxZVJHDZ8+HCMGDHCkKpWSJA74OceiIynchCUfbuWgcDPQ416bqkoNSK42jg4OMDR0RE7duygww85UlNTAWjf7IKCggBoR7+cPn0aY8aMKTM8uSIGDx6MuLg4KBQKyGQytG/fHvfu3aM+/DfeeIPGeOzatQuANqGZu7s7MjIyAGhHOuXk5MDGxgapqak0EBkAjh07hpKSEloePz8/JCYmonPnzmXKomuZMzMz6b7//ve/MWfOHNSrVw92dnZ0vVKphEql0vmcAHDjxg0UFxfDxsam3OMePHhAl319ffHDDz/gxo0b9P7cu3cvgBftExISgitXruDMmTPw8fEBAPzwww/0HP7+/mWu89JLL9HlEydO4N69e3j8+DGuXLmCd999t8L6HDhwAIA2BkWfOusDv/6GcurUKbrs4eFRZVnr16+PK1eu4M6dO7h586bROmZDMUYb8DM6d+zYUS8LZ/PmzWms1G+//Ya+ffvSbSUlJVixYgUt599//y2wahkDY9Q/Ozub1jksLEzvczZq1Ag3btzApUuXcP369UrjrEyBMdrAkjFV/bn4wMowePZruVyOl19+GT/++CNCQkLg5OSEvLw8ul2pVFLzukKhKDMKRqlUQqFQwMnJCWq1WmBhqexY7hoV3aTjx4/H6NGjhZU0gUVGo9Fg0b+e4I213pABgqBf2f//+8V0W4TUDzLqdTnmzJmDVatWwc/PD506dUJmZiauXr1K3U0//vgjXnrpJTRt2hSff/45cnNz8e6778LLy0un80+fPh1r167FZ599hlGjRtEHn5OTE+zt7bFr1y5MmjQJ//zzD7799lsA2g44KCgId+7cAQDUrVsXbm5uGDJkCD744ANs374dQ4cOxZ9//okjR47A1dWViq3Fixdj+vTpqFevHqKiolBYWIizZ8/i2bNnmDFjhk5l9vb2pudbvnw5QkND8fDhQ4wYMYKud3Z2Rl5eXpmOz9bWFl5eXrh9+za2bt2Kfv36wcvLC0lJSZg9ezZatWqFIUOGCIIvNRoNHjx4gLp169K3hjfffBOrV6/GkiVLsGDBAty9exfx8fGC9vnXv/6Fzz77DAsWLMDKlSuRnZ0tyEwaHh4OW1tb9O7dG/Hx8WjXrh2CgoLg6+uLjIwM3L9/H3fu3MGyZcvQvHlzvPbaa5DL5Thx4gROnTqFbt26oXbt2jhz5gw++OADDBgwAB07dtSpDfWhvPobCnfPODg4IDIyssrRKi1atMCVK1eg0WhQWFgIf39/pKamCkY0FRUVYe/evWjXrp0gsNqYGLMN+K7LYcOG0XtWF6KiomiKgNu3bwuO3bNnD033D2itkvqcuzKMWX/+CLSOHTvqXcbOnTvjxo0bUKvVyMzMpJl/TY0x28ASkUT9qxtk89Zbb5Ht27eTefPmkbi4OLp+165dZMqUKYQQQo4fP06GDh1Kt+Xn55OOHTuStLQ0Qgghffr0IZcvX6bbFy5cSL777jtCCCFr164ly5cvp9tOnz5NBg4cWN1iVxsuwGnH32pSZ4gwwLfuUDX55ZDxg3xLX3/p0qUkKCiI2NnZkXr16pHly5fTYN+tW7eSl19+mdjb25OmTZuSAwcO6H2NPn36EADk+PHjgvVbt24lwcHBxMHBgbRu3Zrs2rVLEMxaOtiXEG3Aa926dYmzszMZM2YMWbZsmSDYlxBCtmzZQlq2bEns7e2Ju7s7iYyMJL/++qtOZcX/B/vyWb58OQFQJtgX/x8UyP9r3LgxIYSQ+/fvk8jISOLh4UHs7e1JgwYNyNtvv02ysrLKXLOiILcTJ06QiIgIYm9vT1q2bEl++eUXQfsQQsi9e/dITEwMUSgUxMPDg3Tv3p2W5auvvqLf499//02PeeONN+g+Dg4OpH///uT+/ft0+7lz58jLL79MateuTRwdHUnjxo3JBx98IAg8NibGCvJTqVRELpcTAKRVq1Y6HbN06VLaFl9++SUJCQkhAMjbb79NNBoNKSwsJD169CAAiJeXF7l27Vq1ylgRxmoDjUZDgoODCQBiZ2dHA+d1JSMjg7ZHp06dBNsGDRokuNc3bNhQrbLyMWagJ/873bJli97Hr1+/nh7/8ccfV7s8uiKFYFdzIoX66yVklEol2bt3L1EqlaS4uJgkJCSQjh07klu3bpEjR46Q/v37k4cPH5LMzEwyfPjwMqOWfvvtN1JYWEjWrl1bZtTSO++8Q/Ly8silS5dI165dyZ07dwgh2lFLPXr0INeuXSO5ublk6tSpkhi1xP/ySko05O/zGrL1L+3/JSWmFTGVwXWA/E7TVEjhBjYnutZfl+9kzpw59CH8559/lrvPli1b6D78UVbmwljf/8WLF2m9/v3vf+t0DCcOOVHH76jff/99Mnr0aMG6OnXqCESfsTBWG9y4cYOWtUePHgado0GDBrQ9uJGlaWlpVCRyf4sXL65WWfkY8xnwyiuv0DKWHiGpC5cuXaLHDxs2rNrl0RX2HDR//fVyLclkMvzvf//DypUrQQhB3bp1sXTpUoSGhiI0NBS3bt3CmDFjoNFoMHjwYJrO3t7eHqtWrcKHH36IFStWICwsDEuWLKHnnTJlCpYuXYqoqCi4urpi7ty5NFlaaGgopk+fjhkzZkCpVKJHjx54/fXX9Sm2yZHLZejWytylYFgy/NFZ/BFKfPhxMvv378esWbNEjwMwBZmZLzJK1qlTR6dj+C6kwsJCwTb+DNkcDx8+RJ8+fXDkyBGd3atiYshopdJ07NgRt2/fRmFhIS5cuIB27drh+++/L5P5OS0trVplNRVcoG+tWrXQsGFDvY/nRrbm5eXR7MCMGoLZJJSFIwUVWh5Vvf1PmTKlTA4V7o9zBeqKWG2wbNmyCsscFRVl0mtXVRYnJ6cqy6KLRaZVq1YEAJHL5aSoqKjcfTQaDXF3d6dvnXXr1jXIBG8sjPX9//zzz7RO/PxHlVFYWCiwNMhkMjJhwgSB5cHGxoZs2LCBhIaGmizPirHaICYmhpbx0qVLBp3j66+/pudYvXo1UavV1ErD/xswYEC1ysrHWPXnu8a6du1q8Hn4LtrU1NRqlUlXpNoXiIUU6m9wsC9DmgQHBwuG7ZZmyZIlZTLNcri6upqqWNVi6tSpFY46E9siwS+LRqNBamoqAgMDYWNjU2FZqvpOCCHUIhMUFAQ7O7ty95PJZIiNjcW7774LtVqNBw8eYPTo0cjNzcWUKVOqWTPzkZOTQ5fd3Nx0Osbe3h4NGjTAzZs3AQALFy7E4sWLUadOHSxevBgA8OWXX2LChAno2bMnGjVqhOLiYpw4ccLo5TcGXLCzQqGoMo9ORfADuk+cOIGGDRvS+6p79+44fPgw1Go1HdkoJQzJH1MeL7/8Ms2lc+rUqSrnamJYB0zI1DB8fHzokF9LwcPDAx4eHuYuBgBhWTQaDezs7BAUFFStaP2srCw8f/4cQMVuJY63334bvXr1wuzZs+mw7iVLlmDcuHFmH4JsKPwkbfrMafX222/jnXfewbBhw+hkoR988AE6d+4MBwcHOmolODgY9evXx82bN5GcnFwmiaAU4L5/Nzc3g8sWHh5OXStHjx4tM2v6zZs3kZqaKknXEje/EoBK59mqCn6upJMnT6J58+Y4cOAAhg4dKkmXIsM41LyxYgyGxNAlPoZPWFgY9uzZg0GDBgHQxjxs3brVZOUzNYZYZABt55yXl4dt27bRYfEymQy9evUqM/SWS7ipVCoFQ5GlAtcG+gi50sjlcpoAMS0tDTdu3ACgzfw7ZMgQmiU6IyNDMK+XFHj69Cld9vT0NPg8fCHz/fffIzw8HFOnTkW7du0kn9WYYThMyDAYZkZfIcPBn4Zh1apVFptZlC9k9O3Iy0uKWR78zOFcEk+poFar6aSk1XXvls4XJJPJsGbNGshkMppLhxBCk1ZKBb6QKT0TvT74+/ujbt26ALSCjQsEv3PnDl5//fVKXbwMy4UJGQbDzBgqZDp06EAtD9evX8fu3buNXjYxMNS1pA9SFjL8mdWrW//S83qNHz8ebdq0AQBBUkCpxcnw7wF9rHLl0b59e7psY2NDM8Pv3LkTa9asqda5GdKECRkGw8zw4wPKmwOqMvhWGS4tgqVhqGtJH6QsZLj4GKD6QqZ9+/Y0xqZWrVpYtmwZ3cYXMlKLkzGWRQYA3nrrLbi5uaFVq1Y4duwYtm3bRrfNnj0biYmJ1To/Q3owIcNgmBn+26i+AYnR0dF0lMuJEycwevRoKJVKEEJw6dIlHD58WPLipjquJV2RspAxZv09PDwQGxuL4OBgxMfHCyaP5GJkAOkJGWNaZLp06YInT57g/PnzaN++Pfr374/33nsPgHbeKW7yVYb1wIQMw+gcOnQIMpmMBdfpCP+NvFatWnodK5PJBAngfvzxR7Ru3RqNGjVCREQEunbtivnz5xutrKaAu0/kcjmdY83YBAUF0YBgaxYyALBo0SLcuXMHQ4YMEay3BIuMXC4XTD5sKPw50QCh5fLKlSvVPj9DWjAhYwSImiDraDbSfklH1tFsELW034Ar4ty5c5DJZDh69Gi52/v27UuzNUsNmUwGR0fHMrMmDx48GOPGjaOfx40bB5lMVuaPn021W7duZbaPGjXKqOW9f/8+BgwYAGdnZxw6dIiur+whXlG5Bg0ahF9++YWKIG6YMceKFStw7Ngxo5bfmHAdeXWGHleFvb09nYSQG4ItFfhCxpS5nKQcI8MJGXd3d5PcAx4eHtQ6dfXqVaOfn2FemJCpJo9+z8DfLf/BqUFncGHyJZwadAZ/t/wHj3ZLa1SALrRp0wYRERGIi4srs+3BgwdISEjAhAkTzFAy3ZDJZDSfSGVERUUhPT1d8Pfjjz8K9pk0aZJgOzezsDFQq9WIiYmBUqnE0aNHaQdjZ2dXZT6aiso1ZMgQnDlzhgohmUxGp/kAtAIuPz/faHUwJpxFxlRuJQ4u7f3z58/x5MkTk15LH8RwrQHStshw94CpYqQAoFmzZgCAJ0+e4PHjxya7DkN8mJCpBs8P5uLC65dQkCac66UgvRDnx18wqZjRaDRYuXIlQkND4eDggHr16mHZsmW4e/cuZDIZtm3bho4dO8LR0RHNmjUTvPVXxoQJE7B9+3YolUrB+vj4eHh7eyMmJgabN29G27ZtUbt2bbRr1w6jR4+u9MEQGxuLli1bCtZ9/vnngo4WAOLi4tC0aVM4OjqiSZMm+Prrr3UqM8dbb72FzZs34/Lly5Xu5+DgAD8/P8Ff6QBDJycnwXZ9OpjTp0+jVatWcHR0RNu2bbFz507IZDJcuHABgHaepKSkJGzevBmtWrWiw6aLi4sFbqbyqKxcGo0GeXl5+PLLL5Geno7k5GT68E5OTpaki4kQIrDImBKpxskYM9i3Mtzd3WnSRCkJGY1GQ4VMdQN9K4P7LQDMKmNtMCFjIERNkPFJpnZWjzIbtf8lLbhuMjfTvHnzsHLlSixcuBBJSUnYunUrfH196fbZs2dj5syZSExMRMeOHTFw4EBkZWVVed7Ro0ejuLgYO3bsoOsIIYiPj8fYsWNha2uLoqIifPjhh0hMTMS6detw9+5dgfvGENavX48FCxZg2bJluHbtGpYvX46FCxfi+++/1/kcHTt2RP/+/TFv3rxqlQUAtmzZAi8vLzRr1gyzZs0SDJGtDKVSif79+6Nx48Y4d+4cYmNjy0wJceLECYSHh9M3ZP65+ana9S3XiRMnULt2bbzxxhvw9fWFXC7HL7/8QrevWbNGcvEB+fn5dFJDU1tk+ELm1q1bJr2WPohlkZHJZDTgV0pCJjc3l7r6xLDIAEBSUpLJrsMQHzZFgYFkn3yKkseVZMckQEFqAbJPPIVnZ+Om18/NzcWaNWvw5ZdfYuzYsQC0+Uc6d+5Mh/K++eabGDp0KADgm2++wb59+7Bx40YavV8RHh4eGDx4MOLi4qg4OXToEFJSUuis49z/Go0Gcrkcn3/+Odq3b4+8vDyDA/U+/PBDfPrppzRAsX79+khKSsK6detoHXXho48+QosWLXDkyJEy2V05fv/99zLlnDNnDhYuXAhAK+bq168PPz8/XLlyBfPmzcPFixfx119/VXn9LVu2QK1WY9OmTXByckKzZs3w8OFD/Oc//6H7PHr0iIpOQggVIzKZrNKss1WV69GjR2Wmn2jcuDE8PT2piN27d6/Bc/mYAjFyyHBI1SIjlpABtO6llJQUZGdnQ6VSSWL2dGMOva4M/tQHzCJjXTAhYyCFGYVV76THfvpw7do1FBYWomfPnhXuw0+MZWtri7Zt2+LatWs6nX/ChAno06cPkpOTERoaik2bNqFTp05o3LgxACAxMRGxsbG4cOECsrKy6NvU/fv3DZonJTMzEw8ePMCECRMwadIkur6kpETvB3tYWBjGjBmDOXPm4Pjx4+Xu0717d3zzzTeCdfy5nPhlCA8PR8OGDdG2bVucP38erVu3rvT6165dQ0REhGD0TekkZQBoQGN+fr4gI29lgY66lKu8411cXKiQ+eeff6oUs2IiRg4ZDksQMqaeuJUfJ5Oenq533iJTYMyh15XBXEvWCxMyBuLgq9sEfbrupw+GvkXpOhqgV69eCAoKQnx8PN577z38+uuv+PLLLwFoXSd9+vRBnz598MMPP6C4uBglJSXo168fioqKyj2fjY1NmVEixcXFdJnryNevXy+YKwUoO4xSFxYvXoxGjRph165d5W53dnYWdGpV0bp1a9jZ2eHWrVtVChldRsP4+fnh1KlTAIRuJUKIwD2ob7n8/PzKTT3/7NkzuLq64vnz5zh69CjUarVB7WoKxLTI1K9fHzKZDIQQyQoZMSwyHGlpaZIQMmJZZNzd3eHv74/09HRcvXpVkpOHMgyDxcgYiEd7d9j62AIV/Q5kgGOgIzw6GP+H2bBhQygUChw4cKDCfU6ePEmXS0pKcO7cOTRp0kSn88tkMowfPx7ff/89tm7dChsbG4wYMQKANhX+kydPsGLFCnTp0gUNGjSocgSAt7c3Hj16JOjkucBXAPD19UVgYCBSUlIQGhoq+Ktfv75OZeZTt25dvPnmm5g/fz6Nv6gOV69eRXFxMfz9/avcNywsDBcvXoRKpaLr+N8FoLXQXLlyBenp6QIhY2NjQ9PJG1KuDh06ICcnB6dPn6b7nDp1Cjk5OXQOnufPnwtmRTY3YlpkuKB4QFoWGbGCfQFhUjypDMEWS8gAL6wyWVlZbOSSFcGEjIHI5DL4zvL+/w+lN2r/C1vWBDK58RW/o6Mj5syZg/feew8//PADbt++jZMnTwoyVn711VfYuXMnrl+/jjfeeANPnz6lsS26MH78eKSlpWH+/PkYNWoUna+kXr16sLe3x9q1a5GSkoKEhARBGvTy6NatGzIzM7Fq1Srcvn0bX331Ff744w/BPrGxsfjoo4+wZs0a3Lx5E5cvX0ZcXBw+++wzPVrmBfPmzUNaWhoSEhLKbCssLMSjR48Ef9xw3Nu3b2PJkiU4e/Ys7t69i71792L48OFo1aoVOnXqVOV1X3vtNdjY2GDChAlISkrC3r178cknnwj26dOnD8LCwvDvf/9bIDrCwsKoayE1NRVNmjSh23UpV9OmTREVFYVJkybh5MmTOHnyJCZNmoT+/fsjJiaGXufw4cN6tqbpENMaAbxwLz19+hTZ2dkmv54umNMiIwXEci0BzL1krTAhUw1ce9RCy00t4OgvdB85BjiidVxL+A3Q3U2gLwsXLsTMmTOxaNEiNG3aFCNHjhS8YaxYsQIrV65EREQEjhw5gv/97396pb+vV68eevXqVUYAeXt7Iz4+Hjt27EB4eDi+/fZbrFq1qtJzNW3aFF9//TW++uorRERE4PTp02VG8kycOBEbNmxAfHw8mjdvjq5duyI+Pt4giwygjXmZM2cOCgoKymzbt28f/P39BX+dO3cGoE2cduDAAfTt2xeNGzfG22+/jT59+iAhIUEnd4yLiwt2796NpKQktGrVCgsWLMDKlSsF+8jlcuzZsweOjo6CvDx9+/aly8XFxbhx4wbN/aJrubZs2YLmzZtT91+LFi3w3//+F127dqX7/PPPPzq2oukR07UESDNOhhMydnZ2dHi0qZCikDGHRQZgI5esCsIwCLVaTVJSUoharSaaEg15ciSLpP6cRp4cySKaEo3ZynXnzh0CgCQmJpr8Wvw2qInoWv/KvpPffvuNQDtgnyxdutREJdWW1cPDgwAgHh4eRvnOjPH9r1ixgtb/l19+qXaZquLjjz+m19u8eXO1z2eMNggODiYAiJeXV7XLUxU3btyg9X/ttdeqfT5j1P/999+nZfrzzz+rXabKOHr0KL3W1KlTjXJO9hw0f/2ZRcYIyOQyeHb2QMBQf3h29jCJO4lhnVRnniV9sLGxocPRs7OzJfM2KrZriZ+E8eHDhya/ni5wbSBG/aU4TYG5LDLMtWQ9MCFTw5g6dSpcXFzK/Zs6daq5i1cuy5cvr7DM/fr1M1tZXF1dER4eDldXV4PLwg/2NfXQ28jISLosFfeS2K4lqblWCCFUzIpRf+6+BaRRf0BcIePm5kbvAW7kEsPyYcOvrYzg4OBKf5xLliwpE5/CYeqO1FCmTp1KR02VRuyEXvyyaDQapKamIjAwEDY2NhWWpbLvhC9kTGmRASCIkzl8+DDeeOMNk15PF8QctQRAMPIsPT3d5NerCjEzG3MEBATg+fPnSEtLk8QQZDGDfQGtVSYtLQ3Z2dnIyMigk0kyLBcmZGoYPj4+ZbK/Sh0PDw9Bwjpzwi+LRqOBnZ0dgoKCqpzssSLEci0BQEREBGrVqoXc3FzJjFwS2yLDFzJSsEiImQyPIyAgANevX4dSqURubq7ZX2D4FhkxhExYWBjNhn3jxg0mZKwA5lpiMMyImK4lW1tbtGrVCoB2OoO8vDyTXk8XxI6RcXR0pO4LKVhkxK4/IL1cMpyYdXFxga2t6d+tuVxCgDTqz6g+TMgwGGZETNcSILRIlJcFWGy4jlyhUMDe3l6Ua3IxEpxrxZyImQyPQ2pxQpxFxtTxMRxSE3KM6sOEDINhRsR0LQEQmNErm6BSLLi3cbE6ceCFmCsoKBBYRMyBOSwyUhMy3D3AhAzDUJiQYTDMiJiuJUB6QobryMWIjeCQUkdubiFj7o68oKCAJq0U6x7gCxlzf/8M48CEDINhRvhCxsXFxeTXk9KoHbVaTesvpkWm9AzQ5sQcwb5S6sjFHHrNwf8NmFvIMYwDEzIMo3Po0CHIZDLBiBRG+XCuJYVCIUqgo5QsMuaIDwGkNXLJ3BYZc9df7KHXgDbg29PTEwATMtYCEzJGQK0hOPo4G7/cT8fRx9lQaywzydK5c+cgk8lw9OjRcrf37dsXAwcOFLlUuiGTyeDo6Ih79+4J1g8ePBjjxo2jn8eNGweZTFbmLyoqiu7TrVu3MttHjRpl1PLev38fAwYMEGQXLSoqqvSY27dv45VXXoG3tzdcXV0xYsSIMgG7wcHBZco+d+5cul1KQkbsHDIcUurIzSHm+PeAuetvDosM8MIqlZaWBo1GI9p1GaaBCZlq8nvqY0TsOYKBh85h0skrGHjoHCL2HMHuh+YfEaIvbdq0QUREBOLi4spse/DgARISEgSTHEoNmUyGRYsWVblfVFQU0tPTBX8//vijYJ9JkyYJtq9bt85o5VSr1YiJiYFSqaQBvkVFRZg5c2aFxyiVSvTp0wcymQwHDx7EsWPHUFRUhAEDBpR5EC9ZskRQ9vfff59u41sjzC1kxM4hwyEl95o5LDIODg50AllzWyTMYZEBXgiZ4uJiZGVliXZdhmlgQqYaHMzOw/gTl5GmKhSsT1cVYtzxSyYVMxqNBitXrkRoaCgcHBxQr149LFu2DHfv3oVMJsO2bdvQsWNHODo6olmzZjh06JBO550wYQK2b98OpVIpWB8fHw9vb2/ExMRg8+bNaNu2LWrXro127dph9OjRgpm3SxMbG4uWLVsK1n3++eeCeW8AIC4uDk2bNoWjoyOaNGmCr7/+Wqcyc7z11lvYvHkzLl++XOl+Dg4O8PPzE/yVfht0cnISbNenkzl9+jRatWoFR0dHtG3bFjt37oRMJsOFCxcAAPv370dSUhL++9//0tmt69ati/Xr1wve0PkcO3YMd+/epbODN2/eHHFxcThz5gwOHjwo2LdWrVqCsvNjbzw9Pels2VLqxGuqRcYcMTLAi448PT3drBYJc1lkpBTwzKg+TMgYiJoQfHw/E+U5kbh18xNvmMzNNG/ePKxcuRILFy5EUlIStm7dCl9fX7p99uzZmDlzJhITE9GxY0cMHDhQpzeP0aNHo7i4GDt27KDrCCGIj4/H2LFjYWtri6KiInz44YdITEzEunXrcPfuXYH7xhDWr1+PBQsWYNmyZbh27RqWL1+OhQsX4vvvv9f5HB07dkT//v0xb968apUFALZs2QIvLy80a9YMs2bNEgTlVoZSqUT//v3RuHFjnDt3DrGxsWWmhDhx4gTCw8Ph6emJkpISANoHa2FhIc6dO1fueQsLCyGTyeDg4EDXOTo6wsbGpowrcOXKlfD09ETLli2xbNkygctKLpfTzM7MIiMtMWeOgGdzWyTM7VoCmJCxBtgUBQZyIvMZHherK9xOAKSqCnHiyVN09jFuev3c3FysWbMGX375JcaOHQsAaNCgATp37oy7d+8CAN58800MHToUAPDNN99g37592LhxI957771Kz+3h4YHBgwcjLi6OipNDhw4hJSUFr7/+OgDQ/zUaDeRyOT7//HO0b98eeXl5Bo+8+fDDD/Hpp59iyJAhAID69esjKSkJ69ato3XUhY8++ggtWrTAkSNH6GzPpfn999/LlHPOnDlYuHAhAK2Yq1+/Pvz8/HDlyhXMmzcPFy9epGnNK2PLli1Qq9XYtGkTnJyc0KxZMzx8+BD/+c9/6D6PHj2Cr6+vQBx5eHjA3t6+QnHRvn17ODs7Y86cOVi+fDkIIZgzZw40Go2gM37nnXfQunVruLu74/Tp05g3bx7u3LmDDRs20H38/PyQnp6OjIwMaDQag6dXqC7m6sS57L5Pnz6VlEXGXCO30tLS4O3tLdq1+ZjbtQQwIWMNMCFjIBkFhVXvpMd++nDt2jUUFhaiZ8+eFe7ToUMHumxra4u2bdvi2rVrOp1/woQJ6NOnD5KTkxEaGopNmzahU6dOaNy4MQAgMTERsbGxuHDhArKysmh21Pv37yMsLEzv+mRmZuLBgweYMGECJk2aRNeXlJTo/XAPCwvDmDFjMGfOHBw/frzcfbp3745vvvlGsI4/lxO/DOHh4WjYsCHatm2L8+fPo3Xr1pVe/9q1a4iIiICTkxNdx/8uOGQyWZlkeJVN4Oft7Y0dO3bgP//5D7744gvY2Njg1VdfRevWramrCABmzJhBl1u0aAF3d3cMGzaMWmkArUUiMTERarUaWVlZZuvEzOVaArRt8PTpU6Snp5t14kTuHrCxsRFl+D1HaddKRESEaNfmIwWLjLnFLKP6MCFjIL6ODlXvpMd++mDojM+6Pqx79eqFoKAgxMfH47333sOvv/6KL7/8EsCLoNM+ffrghx9+QHFxMUpKStCvX78KR93Y2NiUSQVfXFxMlzkf/fr16/Hyyy8L9uN30rqyePFiNGrUCLt27Sp3u7OzM0JDQ3U+X+vWrWFnZ4dbt25VKWR0SXnv5+eHU6dOCSwyDg4OKC4uFrgHS9OnTx/cvn0bT548ga2tLdzc3ODn54f69etXeEz79u0BAMnJyVTI8EetpKenS+JtXExrBKDtyJOSkqBSqZCTkyO6kOLgxJyrq6uoYkoqHbm5LDIsRsa6YDEyBtLB2w0+dnJU9OiRAQhUOKCDl/HfMho2bAiFQoEDBw5UuM/JkyfpcklJCc6dO4cmTZrodH6ZTIbx48fj+++/x9atW2FjY4MRI0YAAK5fv44nT55gxYoV6NKlCxo0aFBpoC+gtSY8evRI0Mlzga8A4Ovri8DAQKSkpCA0NFTwV1knXRF169bFm2++ifnz50Otrtj9pytXr15FcXGxILaiIsLCwnDx4kWoVCq6jv9dAFoLzZUrV3Dnzh267smTJ3BwcECbNm2qvIaXlxfc3Nxw8OBBPH78uNIh8YmJiQCEcSFSGYJtTouMVJLi8YWMmEgl4FkKFhkmZCwfJmQMRC6TYXY97ZtsaTHDfV7eqjHkNsZ/y3J0dMScOXPw3nvv4YcffsDt27dx8uRJbNy4ke7z1VdfYefOnbh+/TreeOMNPH36lMa26ML48eORlpaG+fPnY9SoUXB2dgagnTnW3t4ea9euRUpKChISErBs2bJKz9WtWzdkZmZi1apVuH37Nr766iv88ccfgn1iY2Px0UcfYc2aNbh58yYuX76MuLg4fPbZZ3q0zAvmzZuHtLQ0JCQklNlWWFiIR48eCf6ePHkCQJurZcmSJTh79izu3r2LvXv3Yvjw4WjVqhU6depU5XVfe+012NjYYMKECUhKSsLevXvxySefCPbp06cPwsLCsHjxYrru8OHDmDRpEu3QUlNT0aRJE5w+fZruExcXh5MnT+L27dvYvHkzhg8fjhkzZlCX34kTJ7B69WpcuHABd+7cwfbt2zFlyhQMHDhQMOOvFIWM2BYZqSTF49rAHBYpDnN25HyLjJhCxsvLC3Z2dgCYkLEGmJCpBj08XBDXoTn8FUL3UYDCAfEdW2BAnYrdBNVl4cKFmDlzJhYtWoSmTZti5MiRAsvIihUrsHLlSkRERODIkSP43//+R3NH6EK9evXQq1evMgLI29sb8fHx2LFjB8LDw/Htt99i1apVlZ6radOm+Prrr/HVV18hIiICp0+fLjOSZ+LEidiwYQMdXty1a1fEx8cbZJEBtDEvc+bMofO48Nm3bx/8/f0Ff507dwYA2Nvb48CBA+jbty8aN26Mt99+G3369EFCQoJObi4XFxfs3r0bSUlJaNWqFRYsWICVK1cK9pHL5dizZ48gyLZFixYCwVNcXIwbN27Q4dkAcOPGDQwePBhNmzbFkiVLsGDBAsExDg4O+Omnn9CtWzeEhYVh0aJFmDRpUpkcOVLJJWNu1xKHuSwyhYWFKCzUxtCZs/5SsMjY2dkZ7DI3BBsbG/o7YDEyVgDRg8LCQhIbG0v69etHIiMjyaRJk8itW7fotsWLF5OePXuSHj16kPfff5/k5+fTY69cuUJGjRpFOnbsSCZNmkTS0tLoNpVKRd5//33SpUsXEh0dTf744w/BdX/77Td6zdjYWFJUVKRPsU2CWq0mKSkpRK1WkxK1hhzJyCI/30sjRzKySIlaY7Zy3blzhwAgiYmJJr8Wvw1qIrrWv6Lv5LvvviPQDnAjGzZsMGFJhRw5coRed/r06Qafp7rff+/evWk5nj17ZnA5DGH79u302itXrjT4PNVpg8ePH9MyxMTEGFwGQygpKSFyuZwAIK1btzb4PNW9B4KCgggA4uPjY3AZDKVDhw60/QsKCgw+D3sOmr/+ellk1Go1AgMDERcXh4MHDyIyMpJmI/3pp5+QnJyMX375Bb/99huys7MRHx8PQJu19L333sOoUaNw8OBBhIeHCzKwrlu3Djk5Odi7dy+WL1+OFStW0FTzycnJWL16NT755BPs2bMHaWlpAheKFJDbyNDZxwND6/mjs4+HSdxJDOuj9KglsZCKa4mzyMhkMlHrD0jDImFO15pcLqf3gRSCfc0RbC2VgGdG9dFLyCgUCkycOBG+vr6Qy+UYOXIk0tLS8OzZM6Snp6NTp06oXbs2nJ2d0a1bN6SkpADQzuGjUCgwaNAgODg4YNKkSUhKSqIm3b1792Ly5MlwcXFBREQEIiMjsX//fgBaN0Dv3r0RFhYGFxcXTJw4sUx8BUN3pk6dChcXl3L/pk6dau7ilcvy5csrLHO/fv3MVhZXV1eEh4fD1dXVoLLwRy2JGewpFSHDdeS1atUSPZeNFJLimSurLwcn5jIyMgSjCMVCrVbTNhAzPoaDBfxaD9Uafn3p0iV4eHjAzc0N/fv3x5o1a/D06VPY2tri4MGDNM8JNxqFQ6FQoE6dOkhJSYGzszOysrIE2xs1akQn00tJSRHk4WjYsCFSU1NRUFAAR0fHMmUqKioqMwzY1tYW9vb21alqGbghw1KbcKxevXp0pE55ZYuNjcW7775b7rGurq561UesNpg8eTKGDRtW7jaFQiHqd8AvC5eMzt/fHzY2NhWWpaLvhG+RcXZ2Fq0eTk5OcHFxQV5eHh49emTwdav7/XP11/e+Mwb8Ye7VmTiwOm3AH7FjjjbgxBwhBOnp6ahTp47e56hO/UtbpMxVfwB4+PCh2X4Hlo6p66/LS47BQiYvLw/Lly/HtGnTAAB16tRBrVq16MR2L730EgYPHgwAUKlUdNQLh7OzM1QqFfLz8yGXywWixNnZmQY5lj6WSxqlUqnKFTJxcXFYv369YN3w4cPp8GFj8+DBA5Oc15Rw0fqlUalUZWaP1gUx2qCiMpeUlBhUZmOVhT9flL5l4Zuzc3NzRa2Hp6cn8vLykJqaWu3rGvr9c79xOzs70b9DQCsenj9/jgcPHpilDW7fvk2XNRqN6G3AtwKdP3++WqkKDKl/6bQNYtef/3J75cqVMjms9MUS+wJjYqr66zLgwyAhU1hYiJkzZ6Jz584YNGgQAO0oGYVCgUOHDoEQgo8++gifffYZ3nvvPSgUijKTECqVSigUCjg5OUGtVgssLEqlkmZGLX1sXl4eXV8e48ePx+jRo4WVNJFF5sGDB6hbt67ZUrybm5reBtWtP+Hl1WnSpAmCgoKMWbxKqVu3Lu7du4fc3Fz4+PgYNGKkuvXnLKe1atUSte4cderUQVJSEh4/fox69eoZlJCuOm3AfyYFBweL3gbcsH1AWw9Drl+d+vPvf3d3d9Hrz89mrFKpDL4+ew6av/56C5mSkhLMnz8f3t7emD59Ol2fnJyMWbNmUevJwIED8emnnwIAQkJCsHPnTrqvSqXCw4cPERISAldXV3h6eiI5ORnh4eEAgJs3byIkJIQem5ycTI+9desWAgMDy7XGANqHg7FFS2XY2NjUyJuXT01vA0Prz4lyQGtaF7MN+XEymZmZZWYi1wdD6k8IoUPjuckvxYaf3TcvL69aAbeGtAE/RsrNzU30NuDHiKSnp1fr+obUnx8CoFAoRK9/3bp16XJaWlq1r8+eg+arv95XXbZsGQoLCxEbGyt4g2natCn27NmDgoICqFQq/P7772jQoAEAoE2bNlCpVNi9ezeKioqwceNGhIWFUR9ldHQ0NmzYAKVSicuXL+Pw4cPo3bs3ACAqKgoJCQm4fv068vLysGnTJtEDPBkMU2CuUUuA+XPJ8Duxil5KTI25k+LxhYzY3z9g/qR4/BxP/FndxUIKI9cYxkEvIZOeno7du3cjMTER3bt3R5cuXdClSxckJibinXfegUqlQkxMDPr37w+lUkmDSu3t7bFq1Sps2bIF3bt3x8WLF7FkyRJ63ilTpsDFxQVRUVGYO3cu5s6dS98QQ0NDMX36dMyYMQPR0dHw9fXVK0MtgyFVuI7MwcFBVCsiYP6RS/xOzFxCxtxJ8czdBqUtMmLDJQMEzFN/Z2dnaoVjo5YsG71cS/7+/jh79myF2yvL8NqsWTNs27at3G2Ojo5YunRphccOGDAAAwYM0L2gDIYFwAkZc7yNl544UmzM3YkD5rfI8K1SNdEiYW6LDKBtg5ycHLPOt8WoPjXXocdgmBnOtWRuIcMsMubpyPkWCXN05O7u7vS65rBImNsiA7wYhp+fn19mQArDcmBChsEwE5xFxhzJ0MwdIyMFIWPupHh8i4zYrkVAm1GZE3PmtsiY6x7w8fGhyxkZGWYpA6P6MCHDYJiB4uJi+kbKLDLMImMu1woXJ/P06VOoVCpRry0F1xI/MWLpvDYMy4EJGQbDDJh7xAp/JnRzvInyO01mkTGPRQYwb8CzFFxLzCJjHTAhw2CYAf7Qa3O4luzs7ODp6QnAPA9w/tu4Icn4jIFCoaCTFdZUi4w5h2BLwSrHLDLWARMyDIYZMLdFBnjxEM/IyBBkWRUDKXRiwIuOPD09XfQ24AsZKVhkxBZzUnAtMYuMdcCEDINhBqQkZLjMtmIiFSHDuZfy8/MFVjIxMPfwa8C8QkYKriVmkbEOmJBhMMyAuV1LgPAhLvbbqFSEjFRiRMxlkeEnxTOnRUYKMTJMyFguTMgwGGaAn7Oi9MzwYmHOt1EpdGKAeZPiSc0iY84YGSmMWmKuJcuFCRkGwwxIIdDTnPEBUhEyUnCtyGQyyOVyUa/NYU4hJwXXkrOzM5ycnAAwi4wlw4QMg2EGpCBkmGvJvEOwOYuMg4ODYAJeMalVqxaN0aqJriXghaBnFhnLhQkZBsMMMCEjjU5MChYZc33/HFycTFpamqgjt6TgWgJe/A6ysrJQUlJitnIwDIcJGQbDDEghPoIJGfMG+3L3gLkCfTm4NlAqlaKO3JKCawkQulgzMzPNVg6G4TAhw2CYAWaRkYaQkUKMiLktMuaySknlHmBDsC0fJmQYDDMgBSHDgn2F2X1rukUGEFfISOE3ALCkeNYAEzIMhhmQwkPc0dGR5rCpqcOvgRdWGbFjRKRikTFXLhmp3APMImP5MCHDYJgBKSRDA4TTFIiJVDox4IVFIj8/X5Bx2dRw94CULDJi5pKRyj3ALDKWDxMyDIYZkIJFBnghZJ4/fy7oWEyNVDoxwDxxMoQQwfBrcyIF15KdnZ1o1y0Ns8hYPkzIMBhmQGpCBhD3bVSlUtFlc81+zWGOkUvFxcV0WUoWGXO4lhwdHc2WRwdgFhlrgAkZBsMM1HQhU9MtMlIYfs9hrpFb3D1g7vozi4zlw4QMg2EGmJCRjpAxh0VCKt8/d30vLy8A5nEtmfv79/DwoFNEMIuMZcKEDINhBqTSkZnLrM4XMlJyrYjlWuJbZMxdf+BFG6SlpUGj0YhyTb5ryZzY2NjA29sbALPIWCpMyDAYZkAqQsZcZnWpxEcA5nGtSOX75+CETHFxMbKyskS5plRcS8ALQf/48WNRh+AzjAMTMgyGGZBKR2Zu15K538YB80wcKVWLDCBeG0jFtQS8+B0UFRUhJyfHzKVh6AsTMgyGGWBCRjpCxsnJiQ7/FWuuIal8/xxcdmMAouTSIYRI6h5gI5csGyZkGAwzIMUcGjVVyACAs7MzAO3EiWIglYSIHFz9ASAvL8/k1ysuLqYuHCkIOTZyybJhQobBMAP8ZGjmjBFxcXGBk5MTACZkAPGEjJSGXwPa+4BDDCEjlZmvOZhFxrJhQobBMANSmWcHePEQZ0Km5lpkxBYyUhp+DzCLjKXDhAyDYQakJGS4h3h2drYg46yp0Gg01CIhhU4MeNGRM4uMOG3AFzJSqD+zyFg2TMgwGGZAKhMGAsK30czMTJNfT2puBeCFRaakpEQgMkyF1CwyYsfISO0eYBYZy4YJGQbDDEjRIgOI8zYqNbcCIOzIxbBISNkiUxNdS66urnRZzBnQGcaBCRkGwwwwIaPF3BNGcogtZKQ2/Nqcwb5SqL/Y3z/DuDAhw2CYASkJGX58gBiuJam9jQPmtchIwbVkzhgZKdwDTMhYNkzIMBgiQwgRDL82N7Vr16bLYiSEU6lUdFkKnRjALDI13bXEhIxlw4QMgyEyUouP4McHiCFkpNaJAcwiY85gXyn8BmxtbWk5mJCxPJiQYTBERmoP8Vq1atFlMQIdmZCR3j1Q0y0ywIt7QIz6M4wLEzIMhshIrRNjFhnzChkpWGS47M4AEzLMImN5MCHDYIgMEzLS7cSAmjn82sbGRtSOXGq/AYAJGUuGCRkGQ2Sk9hAXO4cGEzLSs8gA4rpWpHwPKJVKOqElwzLQS8gUFRVh8eLFiI6ORteuXTF58mQkJyfT7ZcvX8a4cePQpUsXREdH46+//qLbrl69ildffRWdOnXC5MmTkZ6eTrcVFBRg4cKFiIyMRExMDPbt2ye47u7du+k1Fy9eLEoadQbDVEhNyPBjZJhFpmZaZIAXcTI1Vchw9ddoNILfKEP66CVk1Go1AgMDERcXh4MHDyIyMhIzZ84EADx58gTvvfceJk6ciL///htbt25F06ZNAWh/tO+99x5GjRqFgwcPIjw8HIsWLaLnXbduHXJycrB3714sX74cK1aswL179wAAycnJWL16NT755BPs2bMHaWlp2Lhxo7Hqz2CIjtSEjLOzM52BmwmZmutaEVPISLH+Yo/cYhgPvYSMQqHAxIkT4evrC7lcjpEjRyItLQ3Pnj3Dli1b0L9/f3Tu3Bm2trZwc3NDnTp1AADnzp2DQqHAoEGD4ODggEmTJiEpKYlaZfbu3YvJkyfDxcUFERERiIyMxP79+wEA+/btQ+/evREWFgYXFxdMnDgRf/zxh5GbgcEQD6m9jctkMupeYkKmZg6/Bl4ImcLCQpSUlJj0WuweYBgT2+ocfOnSJXh4eMDNzQ1JSUmIiIjAiBEjkJOTg3bt2mH27NlwdXVFSkoKQkND6XEKhQJ16tRBSkoKnJ2dkZWVJdjeqFEjXL16FQCQkpKCDh060G0NGzZEamoqCgoKyv0BFBUVlZn0zdbW1ugPC41GI/i/JlLT28DQ+vMTwtnZ2Umi/VxdXZGTk4Pc3Fydy2OM+tvb20ui/vypEvLy8kzeBvyOXCr3AL8jz83NFSRKrAhr+g3wR26J8TuwFkxdfxubqu0tBguZvLw8LF++HNOmTQOgTW2+b98+rF27Fj4+Pvjwww/x6aefYvHixVCpVIIfCaD90ahUKuTn50MulwtEibOzM/Lz8wGgzLHcW4NKpSpXyMTFxWH9+vWCdcOHD8eIESMMrWqlPHjwwCTntSRqehvoW//79+/T5YKCAupGNSfcbyknJ0fv8uhbf358XG5uriTqn5OTQ5cfP35s8jZ49uwZXc7MzJSEVYZzLwLA9evX4efnp/Ox+tafPxXGs2fPJHEP8Dvi5OTkMn1WVbDnoGnqX79+/Sr3MUjIFBYWYubMmejcuTMGDRoEQGsi79evH4KCggAAEydOxOTJkwFo33ZKm+qUSiUUCgWcnJygVqsFFhalUknVceljOd9lRZPNjR8/HqNHjxZW0kQWmQcPHqBu3bo6KUZrpKa3gaH1v3z5Ml328fGhvxlz4unpiVu3biE/Px916tSBXC6v8hhD68//7datW1cS9S9dfl3LZGgb8Ns3JCREL9FgKvhzbrm5uenUBobWn/88Dg4OlsQ9wP8OXF1dTX4PWAtSqL/eQqakpATz58+Ht7c3pk+fTtc3aNBAsB9/+FpISAh27txJP6tUKjx8+BAhISFwdXWFp6cnkpOTER4eDgC4efMmQkJC6LH8kVG3bt1CYGBghX5Ve3t7Ud9ubGxsauTNy6emt4G+9eePunN0dJRE2/GHYCuVSri5uel8rL715wd6Ojs7S6L+/JFb+fn5epfJGu6B6rRBde4BhUIhufqrVCqT3wPWhjnrr/dVly1bhsLCQsTGxgpMkf3798fu3bvx8OFDFBQUID4+Hp07dwYAtGnTBiqVCrt370ZRURE2btyIsLAw+Pv7AwCio6OxYcMGKJVKXL58GYcPH0bv3r0BAFFRUUhISMD169eRl5eHTZs2oV+/fsaoO4NhFqQ4YkPMXDIs0FOa94CYM2Dz6y/Fe4CNWrIs9LLIpKenY/fu3XBwcED37t3p+i+++ALt27fHa6+9hgkTJqCkpATt27fH7NmzAWitJKtWrcKHH36IFStWICwsDEuWLKHHT5kyBUuXLkVUVBRcXV0xd+5cBAcHAwBCQ0Mxffp0zJgxA0qlEj169MDrr79uhKozGOZBip2YmLlkpChk7O3tIZfLoVara2xCPDHnW5LiPcBGLVkuegkZf39/nD17tsLto0aNwqhRo8rd1qxZM2zbtq3cbY6Ojli6dGmF5x0wYAAGDBigT1EZDMkiRSEj5jQF/BErUunEZDIZnJ2d8fz5c1HexrmRlTKZDLa21Ro8ajTEtEhI8TfAhIzlUnMdegyGmZDiQ7ymu5YAcefa4e4Be3t7gYvenDCLDBMylgoTMgyGyEhdyNRE1xIgrpDhLDJS+f4BcWNk+PeAVNpAzPozjAsTMgyGyEhRyNT0GBngRUcmpkVGKt8/IK5Fhqu/ra2tTkP9xcASLTKEEOzZswcXL140d1HMChMyDIbISFHIMIvMi46sqKjI5Cn6OYuMVAJ9AXFjZLh7QIrfP2A5o5amT5+O/v37o3379rhx44a5i2M2mJBhMERG6kJGrBgZGxsbyQS6AuK+kdd0i4zUhYwULTKEEBQVFdEcbXFxcfjiiy8AaNtzzZo15iyeWWFChsEQGakLGbEsMo6OjpIJdAXE7cikaJExh2tJKvc/IH0hM3PmTDg4OKB58+Z4//33MXXqVMH2H374QTD1RU2CCRkGQ2SkOPOxOWJkpPQ2DjCLjDmCfaV0D0hZyNy6dQurV68GAFy9ehXLli2jzxEvLy8A2jLHxcWZrYzmhAkZBkNkmEVGep0YIF5HxrkIAOkIWYC5lqQsZL766qty10dGRuLgwYP085dffgm1Wi1WsSQDEzIMhshIXciIFSMjpU4MEK8jKykpoXEOUvn+AfMkxJNS/eVyuWDiYqmQl5dHLS2Ojo44ceIEFi5ciBkzZmDnzp1o3rw5ndInJSUFf/zxhzmLaxakE2nHYNQQpChkmGtJPCEjxekJgBeTV2o0GpMKGbVaTSfNlOI9UFBQIKlRSz/88AP9TY4ePRrt27dH+/btBfu8/fbb+OuvvwBopwzq378/3cZZaKQyzN0UMIsMgyEyUhQyDg4OtFMVS8goFAqTXkdfxBIy/BgpqXz/gHa6BDFy6UhxwkgOMZMi6gIhBGvXrqWf33rrrXL3i46ORkhICADgr7/+wt27dwEA58+fh6enJ5o0aYJr166ZvLzmggkZBkNkpChkgBfuJVO6lkpKSmiOFql2YoB4HbmUvn/gRZyMKS0SUq6/1IRMQkICrl+/DkAbDxMREVHufjY2Npg4cSL9HB8fDwCYN28ecnJykJycjG7duuHKlSsmL7M5YEKGwRAZqT7IOSFjSouMJbyNA+JZZKTkWgJetIEphYxUEyICwuzOXByTOfn111/pckXWGI4xY8bAxkbbpcfFxeHChQvYv38/3f748WN0794dly5dMk1hzQgTMgyGyPA7czs7OzOWRIgYQkbKnRizyAgtMqbqyKU4zxIHdw8QQgTlNBd37tyhy926dat038DAQERFRQEA7t+/j9dee41uc3d3BwA8efIEQ4cOhUajMX5hzQgTMgyGyPBHbEgpIRwX8FtUVCTobI2JSqWiyzVVyEjZIsMJmZKSEkE5jQmzyunOvXv3AGjjyTw9Pavc//XXX6fLXEyMu7s7rly5gpYtWwIAkpOTceLECeMX1owwIcNgiIwUh54C4gzBZhYZy7DIAKZrA0u5B8w9cokQgvv37wMAgoKCdHrpGTBgAE2Qx/Gf//wHAQEBmDFjBl23fft24xbWzDAhw2CIjCUIGVO5lyylE6vpFhnAdB25lIWclCwy2dnZyM/PBwDUq1dPp2Ps7e3xr3/9S/D5zTffBAAMHDiQ3m87duywKvcSEzIMhsgwIaOlpgoZS+nITSVk2D2gG5xbCdBdyADAhAkTaNDvmDFj4O/vDwBwc3ND3759AQDp6ek4duyYEUtrXpiQYTBERqpChp8Uj7mWal5CPEAci4yU7wEx55uqCs6tBGhdS7oSHh6OXbt24cMPP6SzY3OMGDGCLluTe4kJGQZDZLiOTGqdGLPI1OyEeIA4HbmlWKTMLWQMtcgA2liZ999/v0zSyYEDB9I2/+WXX6xmXiYmZBgMkZGqRYYJGWaRqekWGSkF+xpqkakMV1dXOkTbmtxLTMgwGCJCCKHzzDAhI61OzNHRkY4MqakWGRYjIx2LDF/I6GuRqQy+e+nnn3822nnNCRMyDIaISLkTq+kxMjKZTJTMtlJ2rbBRS9IRMpxrSSaTITAw0Gjn7d+/P51A8u+//zbaec0JEzIMhohI+SFe0y0ygDhz7dT04ddSvgekGOwbEBBg1PvE1dUVrVq1AgBcuXIFWVlZRju3uWBChsEQESZkXnRiUpv9GhBHyEj5HmAJ8aRhkSkoKEBGRgYA47qVOCIjI+ny0aNHjX5+sWFChsEQESl3YswiI5w00FTUdIuMlH8DUhEyDx48oMumFjKHDx82+vnFhgkZBkNEpPwQr+kxMsCLjqygoMBkQ1OlfA+wYF9pjFoyxYglPp07d6bLR44cMfr5xYYJGQZDRKTciTGLjLAj49LDG5uabpGR8j0gFYtMdXLI6IKnpyeaNWsGADh//rzJXlzEggkZBkNEpCxk+J0YEzI1MyEcS4gnDSFjqqHXfDj3klqttvjZsJmQYTBERMoPcblcTjsyU72hqVQquiy1+gPiCxlmkZGWmJXKqCVTu5YA64qTYUKGwRARKQsZ4EWcjKksMlLOowOII2Sk3AY1PUbGycmJLluzawkAunTpQpeZkGEwGDojdSHDxckwIVMzXSv29vaws7MDUDNHLdnY2NC0AFKwyNSqVQu1a9c2yTUCAwPRoEEDAMDp06cFAtPSYEKGwRARKbsVgBdCJjc3F4QQo59f6vUX2yIjxTYwtXtRyhYZAKJkd64MjUZDhUxQUBCdNsMUcFaZwsJCnDlzxmTXMTVMyDAYIiLlt1HghZDRaDQmeZBLvROv6RYZAPDw8AAAk2V85ddfykLGXBaZx48f09+JqdxKHC+//DJdvnbtmkmvZUqYkGEwRETqnZiXlxddfvLkidHPz1xL0hdzfn5+AIBnz56ZxN3AP6cU7wExkiJWhhiBvhzBwcHlXtfSYEKGwRARqXfkfCGTmZlp9PMz15L0xSwnZADQNPnGhF9/Lh5HSnD3QH5+vkncq1WRlJREl+vXr2/Sa/EtPvwAY0uDCRkGQ0Sk3ol5e3vTZVMIGalbI5hFBvD396fL6enpRj8/9xuwt7c3afyHoXD3ACFEkC5ALPixKm3atDHptfhChllkGAyGTjAhI+1OnIsPAUzjWgOkfw/wLTKPHj0y+vm5e0CKdQfMnxTv7NmzdNnUQsbFxYXe80zIMBgMnZB6J2ZqIcPV387OTpJv43xrRFpamkmuwRdztra2JrlGdTC1kOHuASne/4B551sqKirCxYsXAQCNGjUy2dBrPpxV5uHDhyabX8zU6CVkioqKsHjxYkRHR6Nr166YPHkykpOTBfuUlJRg5MiRGDp0qGD91atX8eqrr6JTp06YPHmywGRZUFCAhQsXIjIyEjExMdi3b5/g2N27d9NrLl68GMXFxfrWk8GQBJYkZEwZ7CtFawxgercKIOzIpS7mTOlakuL9D5jXInPlyhXaPm3bthXlmpyQKSkpMdk9b2r0EjJqtRqBgYGIi4vDwYMHERkZiZkzZwr22b59uyDNM6B9eL333nsYNWoUDh48iPDwcCxatIhuX7duHXJycrB3714sX74cK1asoIFHycnJWL16NT755BPs2bMHaWlp2Lhxo6H1ZTDMitSFjKmDfaUuZDw9PWkAqqmFjFTbQCyLjFTrb85pCvhupZdeekmUa/JHRlmqe0kvIaNQKDBx4kT4+vpCLpdj5MiRSEtLw7NnzwBo8w7s3LkT48ePFxx37tw5KBQKDBo0CA4ODpg0aRKSkpLog2Lv3r2YPHkyXFxcEBERgcjISOzfvx8AsG/fPvTu3RthYWFwcXHBxIkT8ccffxih6gyG+EhdyIjlWpJi3QFAJpNRi4SpXUtSbQMWI2M+iww/0FdsiwxguSOXquWgvXTpEjw8PODm5gYAWLt2LcaPH18myVFKSgpCQ0PpZ4VCgTp16iAlJQXOzs7IysoSbG/UqBGuXr1Kj+3QoQPd1rBhQ6SmpqKgoKDcZEpFRUUCHzSg9UMbW/1rNBrB/zWRmt4GhtSfn0PDzs5Ocm3n7u5OlzMzMystnyH151tkpFZ3Dn9/f9y/fx+ZmZkoLCysdIiwIW3AF3NSbAMvLy/IZDIQQvDo0SOj3wNSrz8/LqWq3wBg3OcgZ5GxsbFBRESEKO1Tt25dunzv3j29r2nqfsDGpmp7i8FCJi8vD8uXL8e0adMAaEXN/fv38cEHH+DcuXOCfVUqlUDlAlrVq1KpkJ+fD7lcLhAlzs7OyM/PL/dYzuynUqnKFTJxcXFYv369YN3w4cMxYsQIQ6taKQ8ePDDJeS2Jmt4G+tSfny01Oztbkm9Abm5uePbsGdLT03Uqnz7154ScTCaTZN0BYUd27tw5QcxIRRjSBjY2NpJtAw8PD2RlZeHBgwdGvQcIIQKrpBTrz+9XLl68iHbt2ul0XHWfgwUFBbhy5QoAIDQ0FE+ePDHZyDk+/Jf8q1evGvydmKof0CWXjkFCprCwEDNnzkTnzp0xaNAgaDQafPLJJ5gzZ065wWsKhaKMiU6pVEKhUMDJyQlqtVpgYVEqlXQW0tLHclHk3MRepRk/fjxGjx4trKSJLDIPHjxA3bp1dVKM1khNbwND6s9/uw8ODjZ55k5D8PX1xbNnz/Ds2bNKy2dI/blAfRcXF0nWHQCdSA/Qig1TtYGzs7Nk2yAwMBBZWVl48uQJ6tWrV2FQsr71Ly4upknmatWqJcn684c85+bmVllGYz0HT548iZKSEgBAhw4dRGsbft+YnZ2t93Wl0A/oLWRKSkowf/58eHt7Y/r06QC0wuP69et49913AWhvVqVSib59++J///sfQkJCsHPnTnoOlUqFhw8fIiQkBK6urvD09ERycjLCw8MBADdv3kRISAgAICQkRDAy6tatWwgMDKxwjg57e3tRg8hsbGxqZCfOp6a3gT7157s9HR0dJdlu3t7euHHjBp4/f47i4uIqYxkMqb+9vb0k6w4AAQEBdDkjI0OnclpbG/j7++PSpUsoLi5GTk6OIL9Oeehaf66jBrSuJSnWv3Tafl3LWN3n4Pnz5+nySy+9JFrb+Pv7w97eHkVFRXjw4IHB1zVnP6D3VZctW4bCwkLExsZSle7i4oK9e/diy5Yt2LJlC95//30EBARgy5YtcHBwQJs2baBSqbB7924UFRVh48aNCAsLoybb6OhobNiwAUqlEpcvX8bhw4fRu3dvAEBUVBQSEhJw/fp15OXlYdOmTejXr58Rm4DBEA+pB/sCpptviRBCrRFSHbECmHb4Md+1ItXvHxAG/BqzDSzh/vf396f5fcR0fZljxBKgFSBcnIwUXX26oJeQSU9Px+7du5GYmIju3bujS5cu6NKlCy5cuAAvLy/65+rqChsbGxo0Zm9vj1WrVmHLli3o3r07Ll68iCVLltDzTpkyBS4uLoiKisLcuXMxd+5cqopDQ0Mxffp0zJgxA9HR0fD19cXrr79u1EZgMMTCEh7kphq5JPV5pjj4Fhljj1xSq9XUtSJlMWeqkUuWcP/L5XLasYs5HJkbsWRra4sWLVqIdl3gxRDs58+fIycnR+fj1BqCo4+fYl9WLo4+fgq1Rvy5qQA9XUv+/v4C1VgRbdu2xS+//CJY16xZM2zbtq3c/R0dHbF06dIKzzdgwAAMGDBAn6IyGJLEEh7kYggZKXfiprTIWML3DwjbwFRCRsr3QL169XDnzh08ffoUubm5qFWrlkmvRwjBzZs3AQBNmzatMHTCVJSec6l58+ZVHrP7YQbmJd5Amur/v9OUDAQoHPBRq8YYUMfXVEUtF+k5KBkMK8YSOjImZMQRMlJuA1O5lizFKscPeBXD3ZKbm0vjh3x9xRUBgP65ZHY/zMC445deiJj/J11ViHHHL2H3Q+PPml4ZTMgwGCLCf5BXlp/EnJhqmgJLEHGAtv5yuRyA8V1LltKR12TXEiB+ttvs7Gy6XFVgtSnQp75qDcG8xBsoz4nErZufeENUNxMTMgyGiEh9nh3AdNMUWIpFxsbGhnbkzLVUM11LYltkzC1kSruWKuPEk6dlLDF8CIBUVSFOPHlqrOJVCRMyDIaIWMKIlZruWgJedOSPHz826ozAltIGNXnUEiB+2n4pCZmq6ptRULGIMWQ/Y8CEDIMhIjVZyFhKJwa8EDIajQaPHz822nktxSJRq1YtmnTUmBYZS3Gt1TTXEn+agqrq6+uo2/em637GgAkZBkNEarKQsRRrBGC6Idj8ubYqyk4uBfiTZ9bEGJnS8w+ZGv7UJeYQMgqFAj4+PgCqFjIdvNwRoHBARY5xGYBAhQM6eLlXsIfxYUKGwRARSxAyjo6OdE4zYwb7WpKQMdXIJb6QEXuIrb5w7qXs7GyBAKkOlmKR4nfsNcG1BLywQqWlpdHEleUht5Hho1aNAaCMmOE+L2/VGHIb8WIAmZBhMETEEoQM8CLgtyYmxANMJ2RUKhVdlrJFBhDGyWRkGGc4raVYZABhx86/d02BFIQMZ4XSaDRVWiEH1PFFfMcW8FcIv8MAhQPiO7ZgeWQYDGvGUoQM517KysoyWrCrpbyNA+K4lqRukTHFyCVLErOckCGEIDU11aTX4gsZT09Pk16rIvjuNF1msh5QxxcXY7pgV2RrLAvxxa7I1rgQ00V0EQMwIcNgiIZGo7GIuYaAF0KGECJ4yFYH5lqyLCFjipFLlmSREXPkkhQsMnXq1KHLDx8+1OkYuY0MnX3cEeVZC5193EV1J/FhQobBEInSM19LGVME/FrS27gYQsaSXEvGsshYklVOzFwyfCHj7i5ekCwffS0yUoIJGQZDJCzpbdQUQsaSOjEfHx+asNCYriV+jIzUxawpXEuW9BsQcwg2J2ScnZ3N1i5MyDAYjCqxpIc4P7uvsUYuWZJrydbWls55U1NdS/w5f2pyjAwgnkXGXG4lgAkZBoOhA/xOTOoP8ZruWgIgyKOi0WiMck5LFTLGSgpoSWJerBgZfhyaOYWMv78/bGy0koAJGQaDUS78h7jUO7Ga7loCXggZtVpttDawpOHXXB4VwDTDr6V+D7i7u9N8SqZ0LSmVSiryzSlkbG1t6T2va7CvVGBChmE1aDQaTJ48Gb179zb6ZH/GwJLeRk1tkZF6JwYIXQu3bt0yyjktySLj4OCA2rVrA6iZeWRkMhm9B+7du2c0q1xppDBiiYNzL2VkZBgtCaIYMCHDsBr++OMPrF+/HgkJCVi1apW5i1MGS3qIM9cS0KJFC7p88eJFo5zTkoQM8MK9ZCzXkqXdA/Xr1weg/e0ac6oGPlLIIcPBj5Mxde4cY8KEDEPyXL58GatWrRLMR1Ief/31F13+888/y2zXaDSYNm0aunTpguTkZKOXsyosKUaG71YwlpnZktwKgFDIXLp0ySjntKTh18CL++D58+eCshuKJYl5AAgJCaHLt2/fNsk1pGiRASwrToYJGYakKS4uRr9+/TBnzhwMGjQIhJAK9z1w4ABdvnbtWpkf4u7du/HNN9/g6NGjWLFihcnKXBGW9BCvVasWTZB15cqVSttdVyzNtRQeHk6XjSVkLGn4NWD8gF9LE7MNGjSgyykpKSa5hpSEjCFJ8aQAEzIMSXPs2DFq4jx27Bj++eefcvfLyMjAlStXBOv4FhoA+Pbbb+ny33//beSSVo0lBfsCLywSz549M8pDzdLcCq6urtS1cPnyZaPESFiqawkwTpyMpd0DfItMTRAyzCLDYJiA33//XfC5IkvKwYMHy6zbv38/Xb5z547A3ZSSkiL6D9WSLDIAEBERQZeNESNiaW/jwIs2UCqVRunILNW1BBhHyFjab4AJGcuACRmGpNmzZ4/g859//onExMQy+/HdShx//fUXnfBw/fr1ZdwjFVl3TIWlPcSNHSNiaa4lwPhtwFxLlvUb4CxyAIuRkTJMyDAkS0pKCq5fvw5A2PGVHpFECEFCQgIA7cOxX79+ALQPiPPnz6OoqAgbN24sc/5Dhw6ZqOTlY0nBvoBphYwl1B8wfhtYmmvJlBYZSxCzCoWCzoRuKosMfxCDuYWMr68vbG1tATAhw2AYBb41Zu7cuXRI8Pbt2wVvRykpKTTzZqdOnTBo0CC6bf/+/fjf//5H3yb79+9PH6DmtMhYQifWqFEjKjiM0YlbWicGmE7IyGQyi2iDmh4jA7xwL2VkZECpVBr9/FKyyMjlcircWLAvg2EE+PExw4YNw/Tp0wFoh1GvW7eObuO7lXr27Ik+ffrQz+vWrcO0adPo5+nTp+Pll18GACQnJ4v6Y7U0s7qtrS2aNWsGALhx44bALWIIluhaatCgAZycnAAYJ06IEzKOjo50UkopY0rXkp2dXbXPJwamjpORkpABXriXnjx5Uu3fvFgwIcOQJHl5edT1U7duXYSHh2Py5MnU7Pnjjz/SUSSlhUz9+vURGhoKQGse5SY9DA8PR/fu3dGtWze6v5hWGUsTMsALi4RGo0FSUlK1zmWJb+M2NjZo3rw5AG0nlpubW63zcR2DJVjkANO5lhwcHCxCyAHiCRmFQiGJAHB+nIylWGWYkGFIkgMHDtCOLyYmBjKZDF5eXoiKigKg/YEdPnwYz58/p6OTXF1d0aZNGwBAdHQ0PZeNjQ2GDx+OvXv3wsbGBl27dqXbmJCpHGO6VizRtQQI26D0EH994VtkLIFatWrRshrTImNJ37+pc8lIYcJIPpYY8Gtr7gIwGOXBdyvFxMTQ5dGjR9NtW7ZswdGjR/Hs2TMAwJAhQ6jFZsGCBVAqlfD29sbUqVMF8+Z06NABdnZ2KC4uFjXg19KCfQHjChlLdC0BZdugQ4cOBp+Luwek8OatCzKZDD4+Prh//75RY2Qs5f4HxLPISEXI8JPiMSHDYBhIcXExfv31VwCAk5MTevToQbcNHDgQLi4uyMvLw44dO+i083K5HAsWLKD7+fj4YMOGDeWe38nJCe3atcOxY8dw69YtpKamIjAw0IQ10mJpwb6AcecbskTXEiDMp1NdMWdpFhlAGydz//59PHnyBCUlJfRlwRD4riVLwZTTFKhUKnpPSEXIMNcSg2EEEhIS6FvKwIEDabAloBUhr7zyCgAgJycHT58+BQD8+9//pnExusCPkzl27JgRSl01luha8vb2hr+/PwBtJ16dqQq4+tvY2EAulxulfGLAxcgAwMmTJ6t1LkuLkQFeBPwSQqqc76wqLFHI+Pr60meQsS0yUgv0BSzTtcSEDENy/PTTT3R55MiRZbaPHj1a8Fkul+P999/X6xodO3aky8ePH9ezhIZhiUIGeGGVycrKQnp6usHn4SwyluRWAgA3NzfaBufPn8fhw4cNOk9JSQlKSkoAWJaQMWbAryXGyMhkMmqVuXPnjlGmquCQopCpV68eXb527ZoZS6I7TMgwJEVBQQF27twJQBu8ywX38unZs6fg4TpmzBhBQJ4utG/fni6fOHHCwNLqh6ULGaB67iVLjI/gmD17Nl1etmyZQefgf/+WEiMDGHcItqXeA5yQKSoqonO/GQO+hcvT09No560O3t7e9Hl6/Phx5OTkmLlEVcOEDMPsZGZm4s8//0RBQQH27duH58+fAwBeeeWVct9cbW1tMXnyZABaV5O+1hhA+/bTpEkTANq3bDHyJVhisC9gvBgRS3wb5xg1ahTtzPbv348zZ87ofQ5Lm56Aw1gWGUKIRbqWANMF/ErRIiOTyegAi5KSEsGcdVKFCRmGWVGr1ejUqROioqIQERGBTz75hG4rz63EERsbi61bt+LEiROCh4w+cO6lkpISnDt3zqBz6IMlBvsCxhu5ZKmuJUArnufMmUM/G2KVsbTpCTiMld23pKSExlhZ2j1gqiHYUhQygDYDOkfp+e6kCBMyDLNy7do13Lp1CwBw8+ZNGnjr4eGBXr16VXicXC7Hq6++Kuhk9YU/jFaMOBlLdS01btyYZmE1hpCxpLrzGTt2LB3d9r///Q+XL1/W63hLm/mag2+RqY5ryVLvf8B0I5ekKmQiIyPh7OwMAPjjjz+MGhdkCpiQYZiV06dPl7t+2LBhJk9hzg/4FSNOxlIf5Pb29mjatCkA4Pr164J66IMlu5YA7Xc2a9Ys+nnXrl16HV/TLTKWOvweEFpkvv76a4Nci+UhVSHj4OCA3r17A9CK17Nnz5q5RJXDhAzDrPCFzJgxY+Do6AhHR0e88cYbJr92kyZN4ObmBkBrkanO0GJdsFQhA7yIkykpKTF4JIMlu5Y42rVrR5e5of+6YqkxMsYK9rXk+79Ro0bo2bMnAO333rNnT4NHr/GRqpABhIlI+QlKpQgTMgyzwgkZGxsbfPXVV3j8+DHS0tKq5TLSFRsbGzp66fHjx7hz545Jr8ef+bg6ScXMgTHiZCzdtQQALi4udDkvL0+vYy3VIuPh4UETT1bHImOpU1QA2t/szp076fQmubm56NevX7VHcXHzwAHSEzL8aV6kHifDhAzDbKhUKhpnEBYWBhcXF9SqVQvu7u6ilUHMOBnuQW4pMx/zqa6QKSkpoX52S+vE+BhLyFhSjIxcLoe3tzcA4wkZSxSztWrVwt69e2nsXn5+Pv76669qnZMvhPixSFIgICAArVq1AqAd2VleDimiJsg6lo2cfc+RdSwbRG1aq3ZF6CVkioqKsHjxYkRHR6Nr166YPHkykpOTAQC7d+/Ga6+9hsjISAwaNAg///yz4NirV6/i1VdfRadOnTB58mRBoxQUFGDhwoWIjIxETEwM9u3bJzh29+7d9JqLFy9GcXGxofVlSIgLFy7QBGF8k72YiBknY6lDT4Hq55Kx1HmWSlMdIWOpriXgRSf7+PFjg12wlhwjw+Hk5CRIyMmlijAUTsjUrl1bkm3CH71Uehj2o90Z+LvlPzgz+BzS3n+EM4PP4e+W/+DR7urPyaUvegkZtVqNwMBAxMXF4eDBg4iMjMTMmTMBaG/SefPm4eDBg/jss8/w3Xff4fz583Tbe++9h1GjRuHgwYMIDw/HokWL6HnXrVuHnJwc7N27F8uXL8eKFStw7949AEBycjJWr16NTz75BHv27EFaWho2btxorPozzAg/Puall14ySxnatWtHrSNiWWSk+MCqCj8/P9qZGWKRsYZODKiZriXgRZxMUVGRwQnSLN0iw1GrVi26nJubW61zcUJGatYYju7du9Nl/vP60e4MnB9/AQVpwsD/gvRCnB9/QXQxo5eQUSgUmDhxInx9fSGXyzFy5EikpaXh2bNnGDp0KJo3bw5bW1s0aNAA7dq1Q1JSEgDg3LlzUCgUGDRoEBwcHDBp0iQkJSVRq8zevXsxefJkuLi4ICIiApGRkVT97du3D71796auh4kTJ+KPP/4wcjMwzAE/8t9cFhlXV1c0a9YMAHDlyhWDR+TogiULGeCFVebx48d6uxgsOT6Cj0KhoMK3priWAOME/FrLPWAsIVNYWEhFoVSFTJs2bej9zj2viZogaf41oDzD3P+vS1pwXVQ3U7UiDi9dugQPDw868oNDrVbj6tWrNFgoJSVFMKGfQqFAnTp1kJKSAmdnZ2RlZQm2N2rUCFevXqXH8uMYGjZsiNTUVBQUFJT7VlNUVCR4+wO0yayM/cPh/P1SH19vSqrbBpzCd3BwQLNmzczWls2bN8eVK1dQUlKC69evCyYJrAx968+f+dgS75vmzZsjISEBAJCYmEhjBXSpC78Tt7Ozs8j6czg7OyMvLw9KpVKveyA/P58u29vbW1Qb8Dva+/fv0+e1PvXnu9Ysrf58uPwqgNa1ZOhzkP8y4O3tLcn2cHFxQePGjXH9+nVcvHgRBQUFyD2TV8YSI4AABakFeHI8C56dqh/AzAWaV4bBQiYvLw/Lly/HtGnTymz75ptv4O3tTQWISqUSfPmA9mZQqVTIz8+HXC4XiBJnZ2f6oy99LGfaValU5QqZuLg4rF+/XrBu+PDhGDFihIE1rRxLmR3UlBjSBs+ePaOJ8Jo1a4a0tDRjF0tnAgIC6PI///wDV1dXvY7Xtf78UUuc69SS4LfT4cOH0bhxYwC61Z9f35KSEousP4dCoUBeXh6ePXtG665LG/Dv8by8PItqA76Q+fvvv8vMbaZL/R8+fEiXVSqVRdWfD98Kk56ertc9wOfKlSt02cnJSbLt0bRpU1y/fh1FRUX4888/EZQWrNNxqVdSkVeneq43AKhfv36V+xgkZAoLCzFz5kx07twZgwYNEmz7+eefcfDgQWzatImapBQKBZRKpWA/pVIJhUIBJycnqNVqgYVFqVTSadNLH8uZcysyzY4fP77M7Mimssg8ePAAdevW1UkxWiPVaYMbN27Q5c6dOyMoKMjYxdOZzp0749NPPwWgfUvStSz61p+zFNaqVcus9TWUHj160GWu3rrWn/8bdnd3t8j6c9SuXRuZmZkoKCjQqw24ZxoA1K1b16LaoG/fvpg3bx4AbWZbruz6/AZq165Nl319fS2q/hVBCNHrHuDDhV4A2oR7Um2Pbt260Yl8Hz58iI4tOiENj6o8LjA8EJ5B4gwp11vIlJSUYP78+fD29sb06dMF2/bv308tInx3U0hICG0IQKvGHz58iJCQELi6usLT0xPJyckIDw8HoE1Vz6WEDgkJoSOjAODWrVsIDAysMFjO3t5eVP+rjY1NjRUyHIa0AX9uo3bt2pm1DfmupKSkJL3Lokv9+cOPHRwcLPKeadasGeRyOdRqNS5fvkzroGv9OSy1/hycVTgvL0+vNuDHiDg5OVlUG4SHh8PBwQGFhYU4f/58mbLrUn/+aFNLvgf4fVtubq5e9wAffg4ZX19fybYHP37x7NmzmDZ1GhwDHFCQXlh+nIwMcAxwhFdHT8hsxEkzoXfLLVu2DIWFhYiNjRXkwjh58iQ+/vhjfP755wITNKANGFKpVNi9ezeKioqwceNGhIWFwd/fH4A28c6GDRugVCpx+fJlHD58mKZHjoqKQkJCAq5fv468vDxs2rQJ/fr1q06dGRKAn/LaXIG+HPXr16cWPr6515hY6szXfBwcHOiM4UlJSWVi0SrDWkYtAS+ETHnxeJVhyaOW7OzsaHbnW7duGTRyiY1aEiLlHDJ8WrZsSRN4njlzBjK5DGHLtVOWoLRO+f/PYcuaQCYXL1eWXkImPT0du3fvRmJiIrp3744uXbqgS5cuSExMRFxcHJ4/f47XX3+drl++fDkArZVk1apV2LJlC7p3746LFy9iyZIl9LxTpkyBi4sLoqKiMHfuXMydOxfBwcEAgNDQUEyfPh0zZsxAdHQ0fH198frrrxuvBRhmgfMHc6PczImNjQ3CwsIAaM3m/KBEY2GpM1+XhouLKS4uLjdBVkVYy4gVQDgEu7TLvDIsOY8MALRt25Yuc6k19MFaxKytrS39/mqCkHF0dKRW62vXriEvLw9+A3zROq4lHP2F36NjgCNax7WE3wDf8k5lMvRyLfn7+1c4edS6desqPbZZs2bYtm1budscHR2xdOnSCo8dMGAABgwYoHtBGZKHC3z09/eXhEk1PDwc586dAyEE165dQ+vWrY16fmt5G+VnXc7JyRHEPVSGtSTEAwzPJWPJw68BrWWd49y5c4IcI7pgLb8BQGuVKSgoqBFCBtDm+UpMTIRGo8H58+cRGRkJvwG+8I32wZPjWUi9korA8ECtO0lESwyH+XsQRo2juLiY/ohLuyHNBZdLBgAd+m9MrOUhzhcu+rgXrOVtHDCOkLFEi0xpIaMv1mSV49xLNUnIcPDzf8nkMnh28kDtKFd4dvIwi4gBmJBhmIGMjAya5lyKQsYUcTJMyDCLjKW7lsLCwmi5K7LMV4a1/AYA4woZuVwu6vxyhlBayOTn5yMzM9OMJRLChAxDdPj5NKQiZLgRc4BpLDLWEOwLGC5krOltvKa6lvgBv8nJyXoH/FqTVY4TMvoGfPPhT08gBfd6ZTRr1ozeszt27ICzszN8fHywePFiM5dMi7Rbj2GVSFHI1K1blz6cTG2RscS3cQ7+0FN9Jsyzpk6Mn6CzJrmWAKF7Sd+AX2u0yACGWWUIIZKfZ4mPra0tjRvkZyCOjY2l2b7NCRMyDNGRopCRyWTUvXTv3r1qTwZXGmt5iDPXUs2NkQGEI5f0dS9Zk1WOn/3bkGdFTk4O/U1YgpABgHnz5sHT0xOenp4CV/y4cePw9OlTM5aMCRmGGZCikAGEcTL8rJvGoKYLGWvqxKo7/Fomk8HOzs7o5RKD6gT8WstvABBaZPSxTHJYUqAvR0xMDDIzM/HkyRNcunSJ5npLT0/HvHnzaNyjOWBChiE6UhUypoyTsZaHOF/IPHv2TOfjrMm1ZKiQ4Swy/Bm0LQ1+wK++Qsaa7oHqupYsUcgAoPetjY0N4uPj4enpCUCb1b/0HIdiwoQMQ3SkKmT4FplLly4Z9dzW4FYAmGsJqL5ryZK/f1tbWzRs2BCAdhZsfd7CrUXMAzVXyPAJCAjApk2b6Odjx46ZrSxMyDBEJzU1FYD2YSalYYetWrWibxx79+41qqnUWh7izLVU/eHXlixkAMDb2xuAVpzqU39rugeYkNEycOBAvPvuu/joo48QHx9vtnIwIcMQHc4iExAQICkTu5eXFyIjIwFo55O5fPmy0c5tjUKmpo5aqq5FxhKHXvPhhAwAvXKJWMtvAGBChs/HH3+MkSNHmvVZzoQMQ1QKCgqQnZ0NQFpuJY5hw4bR5Z9//tlo57WWh7idnR2cnJwAMNcSUPNcS4BW8HPwZ3CuCmsSs3who889wMEXMr6+4s5LZI0wIcMQFf5Eg1IUMkOGDKFvFjt27DCae8lahAzwwirDXEs1U8jwLTL6CBlr+g0wi4y0YELGylGpVIiOjsZLL72ElJQUcxdHsoG+HAEBAejUqRMA4Pr160Ybhm0twb7ACyHDRi3pLmRKSkpQUlICwPK/f75FxlDXkqWL2eoKmYyMDLrMF4YMw2BCxsrZsmUL/vjjD5w9exZvvPGGuYsjeSEDAMOHD6fLO3bsMMo5reltlBMyeXl5UKvVOh1jTa4lfmZfXYdfW/r0BHz4HW9WVpbOx/F/A5aaR4ejugnxOIuMi4sLddUyDIcJGSvnt99+o8v79u0zezppSxAyQ4YMocvGipOxRiED6G6RsKa3cTs7O1oHXetvTRY5Qy0ynJh1cHCQVJC/IRgrIR5zKxkHJmSsmPz8/DLCZfbs2YK5MsTGEoRMnTp10LFjRwDaxHjGyI9grUJG17dRa3ItAS/cS7oKGUuf+ZpPdWNkLF3IAtVzLRUXF9MBD0zIGAcmZKyYAwcOCB6gAHDhwgVs2bLFTCWyDCEDAKNGjaLLQ4cOxb1796p1PmsSMvyJIw0RMtbQkekrZKzJtVTdGBlLv/+B6o1a4os/JmSMAxMyFkZmZqbOFhW+W2n69Ol0ecGCBQZPPV9dLEXITJ48GV26dAGgDcyLiYnRa5ROaazJtWCIRcaaXEvACyFjSIyMpX//fCFjSIyMNQgZJycn2Nhou099LTJsxJLxYULGQsjJycG//vUv+Pj4oFu3buWKGY1Gg1OnTiE7OxsajQa///47AO0b4PLlyxEVFQUAePDgAU6fPi1q+Tk4IePs7Cx4q5EaDg4O2LlzJ03HfvXqVYwfP97g81mTRYa5loRCRpcXC2sSMnZ2dvQeMDRGxtKRyWT0HmBCxvwwIWMBHD9+HC1btqQuoSNHjuCPP/4os9+qVavQvn17hISEYMWKFXj06BEAoHfv3lAoFIIg1lOnTolT+FJINatveXh6emLv3r3w8PAAAOzcudPg6eqtVcjoGuhora4lQohApFQE38Vr6a4l4IVVpqbGyAAv3Ev6Chm++GNDr40DEzIS5+LFi+jWrRvu3r0rWL927VrBZ0IINmzYAEBrvVmwYAHdNmDAAABA+/bt6bqTJ0+aqMQVk5eXRzu+wMBA0a9vCKGhoXj11Vfp5wsXLhh0HmsVMoa4lix96C2g/wzY1mSRAV50wE+fPkVxcbFOx1iTawkwXMhwgb4A6EsSo3owISNx1q9fTx8UnTt3RlBQEADgzz//xI0bN+h+N2/exO3bt8s9R//+/QEAYWFh9AFsDiEj9ay+FdG6dWu6fP78eYPOYU0dWXVcS/b29pK3xOkCX8jk5+dXub81ff+AME5Gl8SIhBCrFTJ5eXl6ZQDnW3WZkDEOTMhIGEIIdu/eDUD7Frtnzx689dZbdPuXX35Jl7l4GABo06YNXe7UqRP8/PwAAHK5HC+99BIA4OHDh3QWarGwlEDf0vCFzLlz5ww6R023yPCFjDVQ04UM3yXCtzBUBJfVGLD8+5+DS4pHCNHpHuDgt5e7u7vRy1UTYUJGwly6dAn3798HAHTv3h2urq54/fXXaSbI+Ph46qrZs2cPPW7Lli3Ys2cPpk2bho0bNwrOyXcviR0nY6lCplmzZrQDNtQiY02jdgwZfm1t8RH6upasNUYGgE5xY9Z0/3MYOgSbWWSMDxMyEoazxgDAwIEDAWgV/L///W8A2h/Ppk2bkJOTgyNHjgAAGjRogEaNGiE6OhpfffUVGjduLDinOeNkLDVa387ODi1atACgdeEZkpKce5Db2dnRYZuWSnUsMtbyNs4sMvpZZKzJIsnBFzK6DsMHmEXGFFj2E9XK4eeB4eJcAODNN9+ky7GxsVi3bh013fbv37/SGISXX36ZLottkeGPcOG/1VsCnHuJEIKLFy/qfbw1xQdUZ9SStbyN1/RgX75FhgkZwy0yTMgYByZkJEp6ejrOnDkDAIiIiKBBvgAQHh6O0aNHA9COUJozZw7dFhMTU+l5fX19ERwcDAA4c+aMwHdtavidHn/SNUuAH3dkSJwM15FZQydmyIR51uZa4k8cqYtFxtpcS3yLjC6uJWvLIwQYbpHh2svJyclq2sLcMCEjUfjBu9zwaT5ff/01QkJCBOtcXFwQGRlZ5bk5q4xKpcLp06cRGxuLSZMmVStzrS7wz29pQqa6I5esySJja2tLO3LmWmIWGX0tMtYiZqvrWmLxMcbD1twFYJQP363ExcfwcXV1xbZt29CxY0dqVendu7dOHUX79u3x008/AQD69u1LzaKurq749NNPAWizBGdkZMDPz89ow2X5Fhm+e8ISCA8Ph62tLUpKSmq8kAG0359SqWSjlsBiZJhryTDXEnMrGQ9mkZEg/Fmr/fz8BG4NPi+99BJWrFhBP48cOVKn8/MDfvk/wC1btlBRNG3aNAQEBGD06NF65UioDEt2LTk6OiI8PBwAkJSUpNdwS8D6hAwX46SLkNFoNDQXEhMy1iFkWIyMYRYZlUpF7wVmkTEeTMhIkH/++Yfe7DExMZWOcnn33XexdetWxMfHY8SIETqdv1WrVoIOhbO4ZGRk4K+//kJSUhLWrVsHAPjxxx+xevVqQ6sigO9akvI8SxXBuZc0Gg0uXbqk17HWJmQ4i1p+fn6VcVb8zK/WUn99hYy1xci4urrSDM0sRkZ3IWNtgb5qNcGhROC3E044lKj9bA6YkJEg/HmUoqOjK91XJpPh1VdfxdixY3V2ATk4OGDOnDlwdnbG1KlT6RxOAPDf//4Xn3zyiWD/uXPn0sDj6sBZZJycnCwyTb2hcTIajYY+yK3hbRzQb+SStc2zBDCLjEwmo1aZmhojw7cq6ypkrGno9a//EASPIOg5A5j+rTd6zgCCRxD8+o/4YoYJGQmyb98+ANqgyp49e5rkGkuWLMHz58/xzTffYOjQoYKJETdv3izYt7i4GKNGjap2MDDX4VmaW4mD7+LTR8hY49soX8hUlaLeGjuxmh7sC7yIk8nOzq7S/WztriVdY8WsJRner/8QDFtI8LDU5OepmcCwheKLGSZkJMbt27dx69YtAEDHjh1NGhTLuazs7e1pfE1BQQF1BcyaNYuOcEpJSSkzUaW+cELIUoVMkyZN6PK9e/d0Ps4aH+L8+7IqgWuNQq6mu5aAF3EyRUVFVQa7WuM9YIhryRosMmo1wTtfEJQnVbh109cSUd1MTMhIDL5bqV+/fqJdl8sWzGFvb4+ZM2di/fr1dF1iYqLB5yeEUIuMpY1Y4qhduza1KGRkZOh8HBMyzLVkjRYZfsDvkydPKt3XGn8D1Y2RsVSLzJFLKGOJ4UMAPHis3U8smJCRGJxbCQCioqJEu2779u0RGhpKP48dOxZ+fn5o2rQp5HI5AODOnTsGn1+pVFLzs6VaZGQyGXx9fQEIp1uoCv5D3Fo6MX5m5qqEjDW6lhQKBY1Jq+muJQDIzKykZ4N13gM11SKTnmXc/YwBEzISoqCgAAcPHgSgHXYdEREh2rVlMhmd+sDJyQmzZs0CoI3T4bIK37592+Ch2JacDI8PJ2QyMzOhVqt1OobfiVnL22hNt8jIZDJqldHHImNjYwNbW+tI38UsMvrnkbEGi4y/p3H3MwZMyEiII0eOUF96VFSU0RLR6crbb7+N33//HSdPnkSjRo3oei6D8PPnz3UaalkelpwMjw8nZDQaDbKydHvlsMaHuKGjlqyl/sCLaQr0mf2ab8mxdPSxyFjjPWBnZ0frUpMsMl1aAHW8gYruYhmAuj7a/cSCCRkJYa74GA6ZTIaYmBg0b95csJ4/FUJKSopB57bkZHh8OCED6B4nY+1CpiaOWgKgl0WGu//5czRZOnyLTFWinm+1s6Y24KwyNSlGRi6XYc3bWhlTWsxwnz9/Swa5XDzBrpeQKSoqwuLFixEdHY2uXbti8uTJSE5Optvj4+PRq1cv9OjRA2vWrBG4Ia5evYpXX30VnTp1wuTJk5Genk63FRQUYOHChYiMjERMTIwgTgQAdu/eTa+5ePFiQYItayEtLQ0bN24EAMjlcvTu3dvMJXpB/fr16bKhQsbaXEsAEzIcNdG1BOguZAgh9Hnn7+9v8nKJhT4WGf4ov7p165qsTGLDPctqkkUGAIZ0leHnD2UI9Baur+MD/PyhDEO6imt11EvIqNVqBAYGIi4uDgcPHkRkZCRmzpwJADh69Ch+/vlnxMfHY/v27Th69CidL6ioqAjvvfceRo0ahYMHDyI8PByLFi2i5123bh1ycnKwd+9eLF++HCtWrKA3fnJyMlavXo1PPvkEe/bsEXT41sT06dPpW9vYsWMldZMb2yJjya4lHx8fumyIkLGWQE99hAw/x4Y1vY1zQqa4uFgg1kqTlZVFX74CAgJEKZsY8IVMVcHvfCHDxdxZA5xFRt8YGZlMZtHPQUArZu5ul+HAauDzqZk4sBq485P4IgbQU8goFApMnDgRvr6+kMvlGDlyJNLS0vDs2TPs3bsXw4YNQ506deDl5YV//etf1FVy7tw5KBQKDBo0CA4ODpg0aRKSkpLoW8revXsxefJkuLi4ICIiApGRkdi/fz8A7Sie3r17IywsDC4uLpg4caLABWMN7NmzBzt27ACgNdeuWrXKzCUSwlxLL+BbZHQduVTTg3351lc/Pz+TlUls+EOwK+vI0tLS6LI1CRl+XVJTUyvd9/79+wC0Qp4vgCwd7llWVFSkk4uRs8jUrl2bjga1ZORyGbq1AgZ2yEe3VhDVncSnWuHzly5dgoeHB9zc3HDnzh1BOv1GjRrhq6++AqDt/PhDexUKBerUqYOUlBQ4OzsjKytLsL1Ro0a4evUqPbZDhw50W8OGDZGamoqCgoJy326LiorKvB3Z2toa3aSt0WgE/xvK06dPMW3aNPr5008/hbu7e7XPa0yCg4PpckpKSpm661JWfhyFi4uLpOqnD/yHMGeRqaou/GRo9vb2Flt3PnwxmpOTU2md+ELG19fXKuoPCK1Lubm5FcY8PHz4kC77+/tbTf3d3NygUCigUqmQmppaYb0IIdQiU69ePRBCjDYRrbkJDg7GkSNHAADXr18XTGNSHpxFxsPDw2ruA2P1hRVR2VyDHAYLmby8PCxfvpx2wvn5+YI3FGdnZ6pQVSpVGZOys7MzVCoV8vPzIZfLBaKksmO5a6hUqnKFTFxcnCCJGwAMHz5c5wkV9eXBgwcGH3vgwAEsWLCAvtl36tQJnTt31itrrBgQQlCrVi3k5ubi1q1bZcqnSxtwb2SA1tUitTrqCn/INWedqqr+/LdVpVJpsXXno1arIZPJaPxHZXXiMlUDwk7NmuDHCpbm8uXLdNnBwcGq6u/r64u7d+/i/v37Fdbr6dOnNIbEx8fHqurPj3k6evQoPD0rHnOs0WiokHFycrKqdgCq1xdWBj9GsyIMEjKFhYWYOXMmOnfujEGDBgHQfjF886pSqYSTkxMArQWmdDCUUqmEQqGAk5MT1Gq1wMJS2bHcNSpK8z1+/HiMHj1aWEkTWWQePHiAunXr6qQYSzNr1izBrNIeHh6Ii4sTWD+kRGhoKBITE5GamorAwEDY2trq1Qb87aGhoRbrJ+eLau6+rKr+/HwT/v7+Flv30gQEBCA1NRWZmZmV1on/+23VqhXq1KkjRvFMTmBgIF22t7evsA34FuLw8HCr+f4BrUXi7t27yMvLg7u7e7luY36Aa6NGjayq/h07dqTLjx8/rrRufMuln5+f1bRDdftCY6C3kCkpKcH8+fPh7e2N6dOn0/X169dHcnIyOnfuDAC4efMmja0ICQnBzp076b4qlQoPHz5ESEgIXF1d4enpieTkZISHh5d7LP9t59atWwgMDKwwaNLe3l7UkRE2NjZ6f3mXL18WiJh+/frhu+++k/QDvn79+khMTIRarUZqaqpAJevSBvwYGTc3N7Pd8NXFy8sLcrkcarWaWtKqqj9/lJ1CobDYupemXr16SE1NRUZGBoqKiir8TfKDov38/Kym/vy38YyMjArrxXet1alTx2rqD0DwzEpLSxNkfObgv6kHBwdbVf25PgsArl27Vmnd+LFkHh4eVtUOgGF9odGure8By5YtQ2FhIWJjYwWJnaKjo/HLL78gNTUVT548wZYtW2gulDZt2kClUmH37t0oKirCxo0bERYWRh8E0dHR2LBhA5RKJS5fvozDhw/T4cdRUVFISEjA9evXkZeXh02bNpklx4ox+euvv+jy3LlzsWfPHkmLGKD6Ab/WMmrJxsaGjlzSddSSNQb7AsJhtPw4kNJwHbmnp6dVDb/mB7vyxUpprDXYF9DtHrDWEUuAVphxAv7atWuV7mstQ6+liF5CJj09Hbt370ZiYiK6d++OLl26oEuXLkhMTETnzp0xZMgQjBkzBsOHD0enTp0wcOBAAForyapVq7BlyxZ0794dFy9exJIlS+h5p0yZAhcXF0RFRWHu3LmYO3cudbGEhoZi+vTpmDFjBqKjo+Hr64vXX3/deC1gBhISEujyv//9b4vI9GlMIWPJo5aAF0OwHz9+rFPQojXmkQG0FhkOfgwUH0IIHj16BMC6cqgAwvroImT4Itha4LvXKoqR4N8b/HvGGpDL5WjSpAkAbZxUZcPwrSEZnlTRy7Xk7++Ps2fPVrh9/PjxGD9+fLnbmjVrhm3btpW7zdHREUuXLq3wvAMGDMCAAQP0KapkKSoqwuHDhwFo27Np06ZmLpFuVFfI8M2q/JgRS4Qbgl1cXFxlen6gZguZ58+fU4uUNQ29BvQXMr6+vlYzzxIH35JcEy0yANCkSRNcuHABarUat27dQrNmzcrdj1lkTId1OeksgFOnTtHgx549e1qENQYQChlDZsHmOnwXFxeLz5/AzyVT1WR5gHUmxAOEboWKhAxnjQGsT8jw3UR89xEftVpN28Da3EqAfkJGJpNJ3oVuCGFhYXQ5KSmpwv2YRcZ0MCEjMgcOHKDLPXv2NGNJ9CMoKIiKruq4lizdrQToL2SsNUamPItMZmYmZs2aRRM8WmsyPED7Vs19n3zBxoc/S7o1ChldYmS4eyMgIAB2dnailEtM+Fb1yoQMs8iYDiZkRIYfH2NJQsbe3p6+TVXHtVQThUxNci19+OGH+PTTT/Haa68hPT3dqi0yMpmMupcqci3xLTXWFiMECAO4y4uRUalUdHSfNbqVAGaRkQJMyIhIbm4uTp06BUCbT8HSJk/j3EtZWVlVpqXno9Fo6Hw7ljxiiYMJGS3u7u403xMnZI4dOwZAm6YhMTFRIGSssSPn6pSVlSX4njmsecQSIBRz5Vlk+OLG2gJ9ORo0aEAtTZWNXGIWGdPBhIyIHD58GCUlJQAsyxrDYWjALz9RojVYZPgjT2qykJHJZLRzvn//PoqLi+nUIoA2Zbs1W2QAYZ3Kcy/xLTXWKGSAF22Qk5MjmCAUsP5AXwCws7Ojo2xv3LhBn/GlYRYZ08GEjIjw42N69eplxpIYBv9BVFnekNLwrTfWIGRYsO8LuM5ZpVLhxIkTgrpeu3bN6oVMVblkrN0iAwgtbaUnj6wJQgYAnSuwqKiowpc8ZpExHUzIiAg3uZhMJkO3bt3MWxgD4HdEuiaDA6wnGR4HX8hkZWVVuT9/VlxrssgAws559+7dgm3Xrl2z6mBfQNiJlzdyqSYIGf73WjpOxppzyPDhT3pcUZwMZ5Gxs7MrM/cgo3owISMiXNCbj4+PRZoWqzKjV4Q1JcMD/q+9e4+Kqt7/P/4cQBEBBZFQQQU1NfVYpuYFEgg1RVA7kpklmbcKMy01O/Y1L0cJPVlHK82lpadydbNOigpWimmpnVS8lilILQ1U8M6dgf37g9/sZrgJxsxu9rwfa511tnvvwfdnhzOv+Xw++7PLn4BtuoOrNj0ypg8zg8Fg8fRsPahtkGnYsKEuv4Wa/5tw1B4Z82tQsafWUXpk7rzzTnW7uiBj6pHx9va2m2U37IW+Vmf6izMl8qqeR2IPbrdHRm9DSy4uLvj4+JCTk1OrIGN6M9fj7afmH86//PKLxbErV66oaya1aNFCl2/et1pLxrTP2dlZdyHWxLxXqqYg4yg9MubzxMyZ3v/t8UvsX530yNiI0WhUJ8LZ6zdT8yGV2+2R0cPQEvxxLXJycmp8TIHebz+9VS+Dac6MHoeV4Nar+5qCTMuWLXX3kECTmoKMaWjJy8tLF19iqhMUFISbmxsA3377baX3hPz8fLt///8r0+e/rL+gik9/tkfmQeZ258jo5c3MdC0KCwst7sqqyPyNXY/fSGs7XOKIQcZoNKr/TvQ6rATVz5EpLS1V/6zHEG/O1dWVAQMGAOUTniv2ypg/2sd83RlRPyTI2Mi1a9fUbXsNMm5ubmoQqUuPjN6GlsDyFuyaQp3eJzv6+flVGjLq3r17pfP0GmR8fHzU4cKKQ0sXL15Uv5nrOcg0a9ZMXRTPPLib34qsx9/9ioYMGaJuJycnWxw7cOCAut2vXz+b1eQoJMjYiB6CDPzxgeTIdy1B7Xun9B5kXF1dK4WUMWPGVDpPj4vhQfkTrZs3bw5U7pFxhIm+UH4NTE/BNg8yGzZsULfDw8NtXZbNPfjgg+r2jh07LI6ZB5m+ffvarCZHIUHGRvQSZEwf4Ddu3KCgoKBWr9Hz0BI4dpCByu0aPHhwpd9xvfbIwB+9c9nZ2ZSUlKj7HSXIwB/PXLp69Sp5eXkUFxerQaZBgwaMGzdOw+pso2PHjuoQ2p49e9SJ7oqisH//fqD8/c/82UyifkiQsRG9BJnbuXNJj0NLt5rkaeIId22YP2rD2dmZrl27Vnqz1nOQqW4SvCMFGVOPDJT3yiQmJpKdnQ3AQw89pPZa6ZnBYFCHl4qLi9m9ezdQ/mXG9HvRp08f3U761pJcURvRS5C5nTuX9Di0ZP7hXdXD8kzMe2T0OuHRPKB16tSJRo0aOVSQMb+t2jzUpqenq9t6DzKmB8oCrFu3jrVr16p/njRpkhYlacJ8noxpeEmGlaxPgoyN6CXI3M6ieHocWjJ/465NkPH09NRNiKvIPMiYJvo6UpAxn/htCjKKorBlyxagfA5Jjx49NKnNVqKiotTt1157Tf0Qb9u2rV0+V+52PfDAA7i4lC/PZprwKxN9rU+CjI3oMcjUdWjJYDDg4eFhlbpszbxHpuLzZUwURVGDTJs2bXS5IByUzw0w6d27NwCdO3e2OMdRgoxpOOnEiROcOXMGgNDQUItz9CgkJIS33nqr0v6JEyc61FBKkyZN6N+/PwBnzpwhPT1dnR8DcN9992lVmq45zm+YxsyffGrPCyLdzloyph4ZT09P3bypNW7cWF2hs7oemezsbHVBOL3OjwEYNGgQ06dPZ9y4cUyZMgWw7JHx8vLS3cMyzVXVI7Np0yZ136hRo2xekxamTp1qEWacnJx48sknNaxIG+bDS9OmTSM1NRUoD/w+Pj5alaVr+vhUsQOO3CNjCjJ6GVYyMfXK/P7775SVlVU67ggTfaH8A+vf//4377//vtrjFhgYqD4Yz7z3So9qCjIGg4GHHnpIk7q0MHXqVN599106d+5MQkKCxRCso4iNjVW/rCYlJVFcXAzIsJI1SZCxEb0EmduZ7GsaWtJbkDG9SZeUlFQZ6hzh1uvqODs7s3TpUjp37swrr7yidTlWVXFo6aefflIfHBgcHKz7ib4VTZgwgZ9//pnZs2drXYom/P39+fTTT3F2drbYLxN9rUeCjI2YBxl7nvRp/qZteoZQTUpLS9X1FOy53VW51Z1LjnDHUk2mTp3Kzz//TExMjNalWJWPj4/6oXX8+HFWrlypHtN720XVBg4caPF7ANIjY00SZGzEFGTc3NxwdXXVtpg/wdXVVe02rU2PjOlBaaC/Hpm6BBlH65FxJE5OTgQFBQHlvwdr1qxRj/3973/Xqiyhsbi4OF544QUAevbsSbdu3TSuSL8kyNiIKcjY87CSSV0eU2BaFAvse5JzVW51C7YEGcexatWqSo9h6Nu3r+7nB4maLV++nPT0dL7//vtKQ02i/kiQsRE9Bpm8vDx12Kg65rcmm6/+qQe1DTJOTk4ON0/C0URERHDq1Cmef/559QPLdAeXcGzt2rWz6154eyBBxgaMRiO5ubmAPoKM+YTfnJycGs/Vc5Ax/7Zt/rA8E9NdS61atVKfkCz0q0mTJrz++uukpaWxf/9+xo8fr3VJQjgEF60LcATmzxrSQ5AxvwXbfOioKnoOMjX1yBQUFKjXRoaVHEtgYCCBgYFalyGEw5AeGRswXwxPD0FGemTKubq6qgtcVQwy5n92xDuWhBDCViTI2ID5rdd6mPAqPTJ/ME3wzMzMxGg0qvtloq8QQtiGBBkb0MtieCa32yOjxwmvpjaVlZVZPPn46NGj6rYMMwghhPVIkPmTFEW55Tl6CzLmPTK1DTK+vr40bNjQqnVpwfyWW/PhpKSkJHU7LCzMliUJIYRDkSBzG1JSUggLC6Nfv36sW7fulufrLciY98jUNLRk3kuhx2ElqDrI5ObmsmfPHqC8N6ZTp06a1CaEEI5A7lq6DSUlJezduxeA9PT0W56vtyDj6+uLwWBAUZQae2QuXbqkzhvRa5Ax750yBZmdO3dSUlICQGRkJAaDQZPahBDCEUiPzG1o3769uu2IQaZBgwY0b94cqLlHRu8TfcGyR8a0loz5sFJkZKTNaxJCCEciQeY2tGnTRl298+zZs7c8X29BBv74AL906RKlpaVVnuMIQcZ8AvO5c+dQFIXt27cD5bdnh4eHa1WaEEI4BAkyt6FBgwbq2iBnz5695YRfPQYZU69USUlJlcvzg2MEmTvuuEMdOjp37hwnT55Ur0dYWBiNGzfWsjwhhNA9CTK3yfS02xs3bnD58uUaz9VjkLnzzjvV7TNnzlR5TmZmprqt1yDToEEDtXfq119/ZdOmTeoxGVYSQgjrkyBzm+oyT0ZvK/sCdOjQQd1OS0ur8hxH6JGBP565lJ2dzcKFC9X9EmSEEML6JMjcproEGVOPjLu7u24eHlibHhm9L4ZnMnz48Er7OnToYBH2hBBCWEedgsyaNWt4+OGH6d27Nzt27FD3FxcXs2jRIgYOHEhERATz5s2joKBAPX7y5EkeffRRgoODmTJlisUKqIWFhcybN48BAwYwbNgwkpOTLf7OxMREIiMjCQ0NZeHCheptrVpr166dul3bIKOX3hioW5BxdXWlWbNmNqlLC3PmzCElJYWnn34aX19fAP7v//5P46qEEMIx1CnItG7dmpkzZ9K1a1eL/Z988glpaWl8/vnnbNmyhStXrrBhwwagPOS8+OKLjBkzhl27dtGtWzdeeeUV9bVr1qzh+vXrbN++nfj4eBISEvjtt9+A8iGLN954g9dee41t27aRmZnJu++++yebXD/Mg8yt7lzSY5Bp1aqVOpH1VkNL/v7+ul5LxWAwEBYWxurVq8nKyqKkpIQnnnhC67KEEMIh1GlBPNOY/3vvvWexPysri+DgYJo2bQqU363xv//9D4BDhw7h5ubGiBEjAJg8eTIDBw4kKyuLli1bsn37dpYvX46Hhwd33303AwYM4KuvvmLy5MkkJyczaNAgunTpAsCkSZNYvHgxTz/9dLU1FhcXU1xcbNlIF5d6Xx7fNNkXyntkysrKqq0nPz8fKA8y1Z1nj9q3b8/x48c5e/YsxcXFuLj88euUn5+vBjh/f39dtdvE1CbzthkMBgwGgy7bW1FV7Xc0jn4NHL39INfA2u13crp1f0u9rOwbFRXFihUruHr1Ki4uLuzatYuIiAigvLfCfK6Am5sbAQEBnD17Fnd3dy5fvmxxvGPHjpw8eVJ9bb9+/dRjd955J7///juFhYU0atSoylrWr1/P2rVrLfY9/PDDjB49uj6aasHHx4fLly9z+vRptRepIvM7mho2bFjtefbI39+f48ePYzQa2bdvn3pLOkBGRoa63bRpU121u6Lqbj93FI7efpBr4OjtB7kG1mq/eadBdeolyAQEBODp6cngwYMxGAz07t2bkSNHAlBQUIC7u7vF+e7u7hQUFJCfn4+zs7NFKHF3d1d7MCq+1sPDQ91fXZB58skneeyxxyz2WaNHpqysjDZt2nD58mUuXrzIHXfcgZubW6XzzHuHWrZsafFhb++6d++uzmkqKCioNsh07NhRV+02KSsr49y5c7Ru3bpW3xr0xtHbD3INHL39INfgr9D+egkyCQkJuLm5sXv3bhRF4dVXX+X111/nxRdfxM3Njby8PIvz8/LycHNzo3HjxpSWllr0sOTl5alzLyq+Njc3V91fnYYNG9rsKcutW7cmNTUVgN9++00dAjN348YNddvb21tXv+jmPWnp6ekWbTOf0B0QEKCrdlfk5OSk6/bdiqO3H+QaOHr7Qa6Blu2vl781LS2N6Oho3N3d8fDwYPjw4Rw8eBAonxRrPhm0oKCA8+fP065dO5o0aYKPj4/F8dOnT6sTaSu+9syZM/j7+1fbG2Nr5r0M1d25pMfF8ExqunPJUdaQEUIIoa06BRmj0UhRURGKoqjbZWVl3HXXXWzbto3CwkIKCgrYunWrus5Kz549KSgoIDExkeLiYt599126dOmiroYaGRnJunXryMvL4/jx4+zZs4dBgwYBMGTIEL755htOnTpFbm4u7733HkOHDq3nS3D72rRpo25XF2TMF8Pz9va2ek22JEFGCCGE1uoUZBYvXkxwcDCpqanMnz+f4OBgDh8+zPTp0ykoKGDYsGFERUWRl5fHCy+8AJQP9SxbtoyNGzcSHh7O0aNHWbRokfozn3rqKTw8PBgyZAgvvfQSL730EoGBgUD50MWMGTN4/vnniYyMxM/PjwkTJtRf6/+kikGmuLiYlJQUdQgM9N0j06JFC3UOkwQZIYQQWqjTHJkFCxawYMGCKo8tW7as2td17dqVjz/+uMpjjRo1YvHixdW+Njo6mujo6LqUaTPmQ0vHjx8nODiYgwcPEh0dzZYtWwB9BxmDwUDbtm356aefyMjIoKSkhAYNGqAoCsePH1fPMfW+CSGEEPXNcWcm1QNfX1914vG3336rzgvaunWrOqRkfvdO8+bNbV+klZl6z0pLS/n1118BOHDgAKdPnwYgJCQEV1dXjaoTQgihdxJk/gSDwWCxwq+Joih89913AKSkpADlt4D37NnTpvXZginIwB/DS+vWrVP3TZw40dYlCSGEcCASZP6kqoIMlPfQZGZm8ssvvwDQu3dvdR0cPTEfXktLS+PmzZt88sknAHh6ehITE6NVaUIIIRyABJk/6Z577lG3TROcoTzI7N69W/3zAw88YMOqbMe8R2bTpk385z//Udf+efTRRysthiiEEELUp3pZEM+RTZ8+natXr9KxY0eeffZZvvrqK06cOMHhw4fZvHmzel54eLiGVVpP165dad68OTk5Oezdu1cdUgMZVhJCCGF90iPzJ3l7e/Pmm28ybdo0DAYDoaGhQPmyzZ999hlQfgt6//79tSzTaho3bswXX3yBp6cnUD4/CKBbt2707t1by9KEEEI4AAky9SwsLEzdNn2o9+3bt8bHKti74OBgdu7cabHg38SJEzEYDBpWJYQQwhHI0FI9GzBgQKV9ep0fY653797s3r2byZMn4+Pjw+TJk7UuSQghhAOQIFPP7rjjDu666y5+/vlndZ9e58dU1L17d3744QetyxBCCOFAZGjJCkzzZKB85eI+ffpoWI0QQgihXxJkrMA8yAQHB8vKtkIIIYSVSJCxggcffFB9HMG4ceM0rkYIIYTQL5kjYwXe3t6cOHGC33//nR49emhdjhBCCKFbEmSsxM/PDz8/P63LEEIIIXRNhpaEEEIIYbckyAghhBDCbkmQEUIIIYTdkiAjhBBCCLslQUYIIYQQdkuCjBBCCCHslgQZIYQQQtgtCTJCCCGEsFsSZIQQQghhtyTICCGEEMJuSZARQgghhN2SICOEEEIIuyVBRgghhBB2S4KMEEIIIeyWQVEUResihBBCCCFuh/TICCGEEMJuSZARQgghhN2SICOEEEIIuyVBRgghhBB2S4KMEEIIIeyWBBkhhBBC2C0JMkIIIYSwWxJkhBBCCGG3JMgIIYQQwm5JkBFCCCGE3XLRugB7UFxczKuvvsoPP/xAXl4enTp14sUXX6RDhw4kJiayePFiGjZsqJ7/2Wef0aJFCw0rrl81tR/g+PHjLF++nPT0dDw9PXn++ecZNGiQxlXXn5raHx8fT1JSksW5/fv354033tCw4vpX0zUoLi4mISGBPXv2oCgK/fv3Z+7cubi5uWlddr2pqf2FhYUsX76c3bt3YzAYGDduHOPGjdO6ZKtYsmQJe/bsobCwkBYtWvDss89y//33A7BhwwY+/PBDysrKGDFiBM899xwGg0HjiutXde0/fPgwq1ev5ueff6ZHjx68+eabWpdar6Kjo4mPj+dvf/ub1qVUTRG3lJ+fr6xdu1a5cOGCYjQalQ8++EAZPny4oiiKsmXLFuXZZ5/VuELrqqn92dnZypAhQ5S9e/cqJSUlytWrV5Vz585pXHH9qqn9FY0dO1b573//a9sCbaCma/D+++8r48aNU65du6bk5uYqcXFxyqpVqzSuuH7V1P633npLiYuLU27evKlkZWUpI0eOVPbt26dxxdaRkZGhFBUVKYqiKCdOnFBCQ0OV69evK3v37lWGDRumnDt3TsnOzlZiYmKUL7/8UuNq61917T958qSSlJSkrF27VpefB1FRUcqxY8e0LqNaMrRUC25ubkyaNAk/Pz+cnZ155JFHyMzM5Nq1a1qXZhM1tX/jxo1ERUUREhKCi4sLXl5eBAQEaF1yvartf/+MjAwyMjIYOHCgNoVaUU3XICsri+DgYJo2bYq7uzthYWGcPXtW65LrVU3t379/P2PHjsXDw4MWLVowfPhwtm3bpnXJVhEYGKj2PhsMBoqLi8nJyWH79u3ExMQQEBBA8+bNefzxxy16KvWiuvZ36dKFIUOG4Ofnp3GF1nXs2DFiY2MJDQ0lKiqKjz/+WD22Zs0aXnnlFebMmcOAAQMYP348WVlZNqlLgsxtOHbsGM2aNcPLywuAo0ePEhERwcMPP8ymTZu0Lc4GzNv/008/YTAYGD16NA8++CDz5s3jxo0bWpdoVRX/+5skJSUREhKCh4eHNoXZkPk1iIqK4vDhw1y9epWbN2+ya9cu+vTpo3WJVlXxd0BRFPWYoii6C3LmEhISCA4OJjY2ln79+tGuXTsyMjLUoWaAjh076vYaVNV+R+Hi4sLcuXNJSUlh2bJlrF69mlOnTqnHU1JSGDNmDLt27aJNmzasXbvWJnVJkKmj3Nxc4uPjiYuLA+Dee+/l448/5uuvv2b+/PmsW7eOlJQUjau0nortz87OJjk5mX/96198+eWXlJaWsnz5co2rtJ6K7Te3Y8cOhg4dqkFVtlXxGgQEBODp6cngwYOJiIjAycmJkSNHalukFVVsf9++ffnoo4+4efMmmZmZbN26lcLCQo2rtJ6XXnqJPXv28Pbbb3PvvfcCkJ+fbxHg3d3dyc/P16pEq6qq/Y6iS5cudO7cGScnJ7p06UJwcDBHjx5Vj/ft25cePXrg4uLC4MGDOXPmjE3qkiBTB0VFRcycOZOQkBBGjBgBgL+/P61atcLJyYlu3boxZswY3QaZqtrv6upKdHQ0bdu2Vbvfv//+e40rtY6q2m9y9OhRbty4QXBwsEbV2UZV1yAhIQE3Nzd2797Nrl278PLy4vXXX9e4Uuuoqv0TJ06kVatWxMTE8NxzzxEREYGvr6/GlVqXs7Mzffr04ccff2T//v00btyY3Nxc9XheXh6NGzfWsELrqth+R5Genk5cXBwDBw4kNDSUlJQUrl+/rh739vZWtxs1amSzMCtBppaMRiNz587F19eXGTNmVHue3mbpm1TX/vbt21ucZ97Frie3+u+fnJxMRESExd1relPdNUhLSyM6Ohp3d3c8PDwYPnw4Bw8e1K5QK6mu/W5ubrz88svs2LGDTZs2YTAY6NKli3aF2lBZWRnnz58nKCiItLQ0df/p06cdYsjF1H5HsWzZMu655x62bt3Kt99+S3h4+F/iPV+CTC0tWbKEoqIiFixYYBFW9u3bx9WrVwE4deoUn3zyiXo7op5U1/6oqCgSExM5f/48hYWFbNiwgZCQEA0rtY7q2g/lH3Bff/01Q4YM0ag626juGtx1111s27aNwsJCCgoK2Lp1a6WAqwfVtf/ixYvk5ORQWlrKgQMHSExMZOzYsRpWah35+fkkJSWRn5+P0Whk586dHDp0iB49ehAZGcnnn3/O77//Tk5ODhs3btTdMGtN7S8rK6OoqAij0WixrTemIURXV1dSU1P/Mr3vso5MLWRlZZGYmIirqyvh4eHq/pUrV/LDDz8wf/58CgsL8fX1JTY2VldrqEDN7e/bty9jx45l4sSJGI1G+vbty+zZszWstv7V1P4ePXpw4MABXF1ddT1eXtM1mD59OgkJCQwbNgyAu+++m3/84x9alWoVNbW/tLSU+fPnc+3aNQIDA4mPj9fl0JLBYGDz5s0sXboURVFo3bo1ixcvpkOHDnTo0IEzZ84QGxtLWVkZI0eOZPjw4VqXXK9qav/Bgwd5+umn1XODg4OJiopiwYIF2hVczwwGA9OmTWPJkiW888479OnThwEDBmhdFgAG5a/QLySEEEKIv6SIiAjWr19PmzZttC6lSjK0JIQQQogqmea7tWzZUuNKqidDS0IIIYSoZMmSJRw4cICXX36ZBg0aaF1OtWRoSQghhBB2S4aWhBBCCGG3JMgIIYQQwm5JkBFCCCGE3ZIgI4QQQgi7JUFGCFFnBw8epFevXvTq1YvMzEytyxFC/H/FxcUsXLiQyMhIQkNDmTJlisXjIzZs2MDAgQN54IEHWLFihfqIAaPRyOzZsxk6dCi9evUiJyfH4ueOHj2a+++/X/1f7969+fDDD6utY82aNcTHx1unkRXI7ddCCAvR0dFkZWXVeM79999Pt27dAP4yz5cyX111y5YttGrVSuOKhLC90tJS/P39Wb9+Pc2bN+ejjz5i5syZbN68me+++45NmzaxYcMGGjVqxDPPPENgYKD6ANR7772X2NhYnnzyyUo/99NPP1W3r127xtChQwkNDbVZu2oiQUYIYaFTp074+PgAcOnSJS5dugRAx44d1dASGhrKyJEjtSpRCFENNzc3Jk2apP75kUceYcWKFVy7do3t27cTExNDQEAAAI8//jhJSUmMGDECFxcXHn300Vr9Hd988w2dO3emdevWtTq/rKyMOXPmcOTIEUpLS+nduzdz586ladOmZGZmEhMTw+zZs3nnnXcAeO6559RHntSGBBkhhIXXXntN3V6zZg1r165V95t6OUxDS/BH78eCBQvYunUrLVu25KmnnmL16tXk5uYyfPhwpk6dyttvv82WLVvw9PRk/PjxxMTEqH9PdnY2q1atYv/+/Vy7dg0/Pz+io6MZP348Li7lb1PHjx9n1apVnD59mvz8fLy9venUqRMzZ85k27Ztap2A+pwf0/NuPvjgA5KSkrhw4QJ5eXk0adKEe+65h2effZa2bdsCkJiYyMKFCwFISEjgvffe47fffqNnz54sXLiQ3bt3s27dOgoLCxk0aBCzZs1SazNdixkzZvDTTz+xd+9eGjVqxKhRo3jqqacqPWhUCFs5duwYzZo1w8vLi4yMDCIjI9VjHTt25O23367zz0xKSqrzQ3LDw8NZtGgRpaWl/OMf/2DdunXMnDkTgJKSEn777Te2bt3KoUOHmDNnDhERETRq1KhWP1vmyAgh6lVOTg4JCQk0aNCAvLw8PvroI8aNG8eWLVvw8PDgwoULLFu2jIyMDKC8m3r8+PEkJiZSUFBAUFAQFy5c4J133mHJkiVA+Te6GTNm8OOPP+Li4kJQUBAlJSXs3buXCxcu4OfnR1BQkFpDx44d6datm/rN89ChQ5w7dw4fHx8CAwO5ceMGKSkpxMXFUVRUVKkN8+fPp7i4mOLiYvbt28eUKVNYunQprq6uXL9+nU2bNrF58+ZKr1u1ahWpqal4enpy9epV1q1bxyeffGKNyyzELeXm5hIfH09cXBzwx9OrTdzd3cnPz6/Tz8zMzOTkyZN1ejiyk5MTkZGRuLm54eHhwdixYzly5Ih6XFEUJk2aRIMGDejbty8NGzbk/Pnztf750iMjhKhXJSUlrF69mu7duxMdHc3Fixc5d+4cX3zxBd7e3gwcOJCioiIOHTpEUFAQn376KRcvXsTHx4ePP/4Yb29vdu/ezaxZs9i6dSsTJkzA09OT69evA7B+/Xq1Zyg9PR1vb2969epFQECAOkfGvPcIYNq0abRt21btQfnhhx+YOnUqFy9e5OjRo9x3330WbZgwYQITJ05k3rx5JCUlkZGRwT//+U+GDh3KpEmTOHLkCAcPHmTUqFEWr+vatSurV68G4JlnniE1NZX169czZswY61xsIapRVFTEzJkzCQkJUefANG7cmNzcXPWcvLw8GjduXKefm5yczH333UezZs3UfaNHj1bn1X322We0aNHC4jVGo5EVK1aQkpLCzZs3URQFLy8v9XjDhg0tAlajRo0oKCiodU0SZIQQ9co0bAPQokULLl68SPv27dVg4e3tzYULF7hy5QoAJ0+eBODy5cuVvuUpisKJEycYOnQo3bt359ixY8TExNC6dWvat29PSEhIrbq4L1y4QHx8PGlpaeTn52P+ZJbs7OxK5w8YMACwfFDe/fffD4C/vz9HjhxR6zcXERGhhqWIiAhSU1O5fPkyV69exdvb+5Z1ClEfjEYjc+fOxdfXlxkzZqj7g4KCSEtLIyQkBIDTp0/Trl27Ov3s5OTkSpOBzScCV/caU6j39fVl//799XpHkwQZIUS9cnd3V7ednZ0r7TPNFzGFCdP/u7u7WwwPmZjGyVetWkVycjJHjx4lIyODnTt38tVXX5GTk0NsbGy19Zw/f55Zs2ZRUlKCu7s7d911F0ajkdOnTwPlw1bVtcFUP6B+Y6xYvxB/NUuWLKGoqIilS5dazM+KjIxk6dKlDBo0CFdXVzZu3Mhjjz2mHi8uLlZ/r0tKSigqKsLV1VU9/ssvv5CVlUVYWFid6snLy6Nhw4Z4enpy7do1Pvjggz/XwAokyAghNNW1a1f27duHs7Mz8fHxas9NXl4eKSkphIeHoygKx44dIzo6Wr1batGiRWzZsoXU1FRiY2MtJgaad0v/8ssvlJSUAPDmm2/SvXt3duzYwcsvv1zvbdm5c6c6iXnXrl0A+Pj4SG+MsJmsrCwSExNxdXUlPDxc3b9y5UpCQkI4c+YMsbGxlJWVMXLkSHViPMCoUaPUIaLo6GigfGK/SXJyMqGhobi5udWqFlOIGjZsGN9//z2DBg3Cz8+PkSNH1uvcMQkyQghNjR49ms2bN3Pp0iVGjRpFUFAQeXl5XLx4EaPRSFRUFKWlpcTFxeHu7o6fnx8Gg0GdLNyhQwcAAgICcHFxwWg0EhcXR8uWLXn88cfp0KEDzs7OlJaWMm3aNFq0aMHly5et0pZTp04RHR2NwWBQb1t/4oknrPJ3CVGVli1bWoSPip588skq14mB8jv3ajJ9+vRa11FQUECTJk2A8t7MlStXWhx//PHHAWjVqhX79u2rUx0VyV1LQghNeXt7s379eqKjo2natCnp6ekUFRXRo0cPXnjhBaB8iGfUqFG0atWKS5cucf78eVq2bMm4ceOYPHkyAF5eXsyaNQs/Pz+uXLnCiRMnuHz5MoGBgcybNw9/f3+MRiNeXl7q3VD1LS4ujl69epGbm0vTpk2ZMGGCTPQVDic3N5f9+/fTuXNnm/x9BkUGeoUQ4k8xrSMzf/58tUteCEeUmprKzJkzCQsLY+7cuerkd2uSoSUhhBBC1IsePXqo88NsRYaWhBBCCGG3ZGhJCCGEEHZLemSEEEIIYbckyAghhBDCbkmQEUIIIYTdkiAjhBBCCLslQUYIIYQQdkuCjBBCCCHslgQZIYQQQtgtCTJCCCGEsFsSZIQQQghht/4fY5porTK+cPkAAAAASUVORK5CYII=",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "quantiles = [0.05, 0.50, 0.95]\n",
+ "four_weeks = 4 * 7 * 24\n",
+ "pred_kwargs = {\"predict_likelihood_parameters\": True, \"verbose\": True}\n",
+ "\n",
+ "# create conformal model\n",
+ "cp_model = ConformalNaiveModel(model=model, quantiles=quantiles, cal_length=four_weeks)\n",
+ "\n",
+ "# conformal forecast\n",
+ "pred = cp_model.predict(n=horizon, series=cal, **pred_kwargs)\n",
+ "\n",
+ "# plot\n",
+ "ax = series[pred.start_time() - 7 * 24 * series.freq : pred.end_time()].plot(\n",
+ " label=\"actual\"\n",
+ ")\n",
+ "pred.plot(label=\"cp\")\n",
+ "ax.set_title(\"First 1-step conformal prediction\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3897a238-4543-4542-895f-e2e62dda32bc",
+ "metadata": {},
+ "source": [
+ "Great, we can see the added prediction interval (turquoise, dark blue) around the base model's forecast (purple).\n",
+ "It's clear that the predicted interval contains the actual value. Let's look at how to evaluate this forecast."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "80001270-a5af-4514-83ac-5c392b10bf37",
+ "metadata": {},
+ "source": [
+ "#### Evaluate Conformal Prediction\n",
+ "\n",
+ "Darts has dedicated metrics for prediction intervals. You can find them on [our metrics page](https://unit8co.github.io/darts/generated_api/darts.metrics.html) under the *Quantile interval metrics*. You can use them as standalone metrics or for backtesting.\n",
+ "\n",
+ "- `(m)ic`: (Mean) Interval Coverage\n",
+ "- `(m)iw`: (Mean) Interval Width\n",
+ "- `(m)iws`: (Mean) Interval Winkler Score\n",
+ "- `(m)incs_qr`: (Mean) Interval Non-Conformity Score for Quantile Regression\n",
+ "\n",
+ "> Note: for `backtest()` use the (m)ean metrics such as `mic()`, and for `residuals()` the per-time step metrics such as `ic()`.\n",
+ "\n",
+ "Let's check the interval coverage (the ratio of actual values being within each interval) and the interval width:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "9470a0bc-0ac9-407b-9749-0d6ce19e4d7d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Interval
\n",
+ "
Coverage
\n",
+ "
Width
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
0.9
\n",
+ "
1.0
\n",
+ "
3321.12
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Interval Coverage Width\n",
+ "0 0.9 1.0 3321.12"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "q_interval = cp_model.q_interval # [(0.05, 0.95)]\n",
+ "q_range = cp_model.interval_range # [0.9]\n",
+ "\n",
+ "\n",
+ "def compute_metrics(pred_):\n",
+ " mic = metrics.mic(series, pred_, q_interval=q_interval)\n",
+ " miw = metrics.miw(series, pred_, q_interval=q_interval)\n",
+ " return pd.DataFrame({\"Interval\": q_range, \"Coverage\": mic, \"Width\": miw}).round(2)\n",
+ "\n",
+ "\n",
+ "compute_metrics(pred)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bb765655-53f4-41a2-83cd-96c87c88fc26",
+ "metadata": {},
+ "source": [
+ "Okay, we see an interval width of 3.3 MWh, and a coverage of 100%. We would expect a coverage of 90% (on finite samples). But so far we've only looked at 1 example. How does it perform on the entire test set?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "23567754-d132-47d8-aa1c-33a048ff0d28",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "0643a2e4c65b46c4967e73a5286e76cf",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "historical forecasts: 0%| | 0/1 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "66c5a4b34ced44deaa32f461d4d1091e",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "conformal forecasts: 0%| | 0/8761 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# concatenate cal and test set to be able to start forecasting at the `test` start time\n",
+ "cal_test = concatenate([cal, test], axis=0)\n",
+ "\n",
+ "hfcs = cp_model.historical_forecasts(\n",
+ " series=cal_test,\n",
+ " forecast_horizon=horizon,\n",
+ " start=test.start_time(),\n",
+ " last_points_only=True, # returns a single TimeSeries\n",
+ " **pred_kwargs,\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "b05bbd38-3f58-4fc7-ab8b-1024bb597557",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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I0cwc+ZMjBkzBmvXrsVzzz2HnTt3RnTUvvzyS2zduhVPP/00UlNT8fzzz+Oaa67BDz/8gAEDBgAAfvnLX2LHjh145plnMGTIENTV1WHHjh2orq5u8tzWrFmDadOmYcyYMXjnnXeQmJiI1157DTNmzMCCBQtw4403msrfdddduPzyy/H++++jqKgIDz/8MH7xi1/gm2++iXqMxx9/HC6XCx999JFJVNPaKdZz3L9/PyZOnIg+ffrghRdeQG5uLr7++mv8/ve/R1VVFZ588knL4+fl5WHjxo247777UF9fj/nz5wNo3irhzjvvxOWXX47//ve/cLlcsNvtzbbza6+9hnvuuQdHjhzB4sWLm9w/ACxevBjXXXcdMjIydJevxMREMMZw4YUXmjr727ZtQ11dHZKSkrBq1Sr8/Oc/BwCsXLkS48aNQ2ZmJgDF5f2WW27BxRdfjAULFsDn8+H555/HBRdcgFWrVuG8886zrEtrjvntt9/i0ksvxfjx4/H6668jIyMDCxcuxI033gi3263HACsvL8fZZ58NQRDwxBNPYODAgdi4cSNmzZqFY8eOYe7cuZZ1q6urw7XXXosDBw5gzZo1GDduHADgj3/8I/773/9i1qxZOP300+FyubB3795m73uCIAiCOBmoj0p91Hj2UTXuvfdezJs3D7///e/x97//HTU1NXj66acxceJE7Nq1C927d9fLlpeX45ZbbsGDDz6IJ598EosXL8af//xn9OjRA7feeivOOOMMzJ07F3fccQcee+wxXH755QDQrFXmjh07cODAATz22GPo378/UlJSTrrfBkTv4wKKqDh58mQUFxfjL3/5C8aMGYN9+/bhiSeewJ49e7By5UowxrBx40bceOONuPHGG/HUU0/B4XCgsLBQv6Ync66x9B1j6ddefvnlePbZZ/GXv/wFr776qh4KYuDAgU22M0GcknCCICKYO3cuB8A3bdrEA4EAb2xs5F988QXv1q0bT0tL4+Xl5Zxzzm+77TYOgL/77rum7RcsWMAB8I8//ti0fOvWrRwAf+211zjnnB84cIAD4A888ICp3Pz58zkAftttt+nLvv32Ww6Af/vtt/qygQMH8oEDB3KPxxP1XP7xj39wAPzo0aMR6yZPnswnT56s/3799dc5AL5o0SJTub///e8cAF++fLm+DADv3r07b2ho0JeVl5dzQRD4c889py9LTU3l999/f9T6RWPChAk8JyeHNzY26suCwSAfNWoU79WrF5dlmXMeulb33Xefafvnn3+eA+BlZWVNHue3v/0tj/YqjPUcL7nkEt6rVy9eX19v2v53v/sddzgcvKampsk6TJ48mY8cOdLy+E8++aT+WzvXW2+9NaJsLO18+eWX8759+zZZxsjIkSNN94fG22+/zQHw48ePc845nzVrFh82bBi/8sor+R133ME559zv9/OUlBT+l7/8hXPOuSRJvEePHnz06NFckiR9X42NjTwnJ4dPnDixybqczDE553zYsGH89NNP54FAwLS/K664gufl5el1uffee3lqaiovLCw0lZszZw4HwPft28c55/zo0aMcAP/HP/7Bjx49ykeMGMFHjBjBjx07Ztpu1KhR/Oqrr27ynAiCIAiipVAflfqoLTnH1vRRN27cyAHwF154wbS8qKiIJyUl8UceeURfNnnyZA6Ab9682VR2xIgR/JJLLtF/a/fZ3LlzI4735JNPRpxv3759uSiK/IcffjAtj7XfFo1ofdznnnuOC4LAt27dalr+0UcfcQB86dKlpuPU1dVFPUZT52pFLH3HWPu1H374YcQzSRA/RsjlnCCaYMKECbDb7UhLS8MVV1yB3NxcfPXVV6bZSAD42c9+Zvr9xRdfIDMzEzNmzEAwGNT/nXbaacjNzdXdab799lsAiIh1dMMNN8Bma9qA+tChQzhy5Ah+9atfweFwtPJMFb755hukpKTguuuuMy3XrNhWrVplWj5lyhSkpaXpv7t3746cnBzd3QkAzj77bMybNw+zZs3Cpk2bEAgEmq2Hy+XC5s2bcd111yE1NVVfLooifvnLX6K4uBg//PCDaZsrr7zS9HvMmDEAYKrLydDcOXq9XqxatQrXXHMNkpOTTdd7+vTp8Hq92LRpU6vqEE74/QacXDufLBdddBEA6BaTK1aswLRp03DRRRdhxYoVAJSERi6XSy/7ww8/oLS0FL/85S8hCKFPT2pqKn72s59h06ZNcLvdcT1mfn4+Dh48qD9f4demrKxMv4+++OILTJkyBT169DCVu+yyywAo1hhGduzYgQkTJqB79+5Yv349+vbta1p/9tln46uvvsKjjz6K1atXw+PxtKiNCYIgCKIpqI+qQH3UtuujfvHFF2CM4Re/+IVp29zcXIwdOzYixEBubi7OPvvs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EHO9//rXv5wxunLlSvx+f7v8/SwsLOSll15y/l69ejUlJSUHvJ5gMNiSzTpoaan+FIREUVlZySWXXMLSpUtZvXo1K1euZPHixfh8vmQ37aCmurqalStXJrsZBzWt9ft/4403Ul5ezrPPPsttt93GAw884BhhDlZE0PwOfPjhh5x66qlMnjyZefPmcf/99zvzbr31Vq644gp+9rOfMWnSJJYuXcqWLVuS2NrEU11dzYsvvsi5555LWloaU6ZMoWfPnrz00kt06NCB/Pz8sOXb41uwpvpIcIm3n9atW8e6deuYMWNGklqaPJrqo9dff52TTjqJrKwsSktLOeqoo3j88ceT3eSkMHfuXMaOHUtqamrY9AEDBnDEEUfIQ5dFY/0k126XxvpIEFqa9PR0zjrrLEpKSvD5fJxwwgls3ryZiooKnnjiCY4//ng6depEUVERS5Ys4cknnwTA7/dz4oknMnjw4Ga38eyzz9KvXz86d+7c2rvT5pg9e7bTZwBPPvkks2fPdv6+7bbbmDdvHpMnT+b000/nyy+/dObNnz+ff/zjHxx33HEsXLgwoe1uq3zX/nzyySc555xzwtZ1+eWXtzvX8IFy5ZVXcueddzp/r1y5UiJNDpD169c7986appGRkcHUqVMpLS0lFApx6623Mm/ePGbPns1NN93kvLy49dZbufzyy7nwwguZPHky5513Hrt27Ury3rQdTjrpJFasWBHzZc/999/P0UcfzYwZM7jiiiuorKwE4Ac/+AGPPfaYs1x1dTWTJk1qt/3aWr//W7ZsYdasWfj9fsrLyxk6dChr165N5K61OCJofgf8fj+XXXYZq1ev5oYbbuCvf/0ra9asceavXr2axYsX8/zzz9OlSxf+/ve/J7G1iWfDhg1kZWVRVFTkTOvdu7dzsrz//vtMnjyZadOm8dVXX3H00Ucnq6lJo7k++uCDD5g+fToLFy7kwQcfTFYzk05z/WTz5JNPMmHCBLKyshLdxKTTXB/ZIQj254P9R0tIHnLtbh65dgutyYcffkhBQQF5eXmsW7eOXr16OfP69Onzna7vTz75JEcccURLNvOgYcyYMXz++efs3buXnTt3snHjRoYPH+7M7969O3fddRfPPfccY8aMYfny5WHff/HFF7ntttvCjA3tme/an1OnTmXNmjXs2LEDMNPlvPzyy8yaNSsp+yG0H7p27eqkZ3rttdcccQ3gnnvu4YMPPuDuu+/mwQcfZM2aNWG/68899xyLFy/m6aefpqSkhOuvvz4Zu9AmGTNmDMXFxVEuzddff51//OMf/OEPf2DlypXU1NRw0003ATBz5kyeffZZZ9mXXnqJgQMHUlhYmNC2t1Va6vd/4cKFPPXUU9TX17NhwwY++ugjRo4c2VrNTggiaH4HBgwYQL9+/dA0jQEDBjB+/Hg++OADZ/7YsWMZNmwYfr+fWbNmhb3RbQ/U1NSQmZkZNi0zM5OamhoAhg4dyosvvsh///tfFixYQHZ2djKamVSa6qPhw4dz//3388wzz7B8+XJuu+02Vq9enaSWJpfmxpLNU089xZw5cxLZtDZDU300duxY7rvvPvbv38/mzZt57LHHwvJbCcKBINfuppFrt9CaVFZWct1113HeeecBpnvF+xIvMzOT6urqA1rn5s2b+eSTT5g5c2aLtvVgwefzMXnyZJ599lmefvppZsyYgVLKmT99+nTy8/Px+/2Oo9DbxyeddBIFBQUEAoFkNL/N8V37My0tjUmTJvH0008DppDRr18/OnTokKxdEdoJWVlZ/O1vf6O2tparrrqKmTNn8stf/pKqqir++9//ct5555GXl0d2djZLlizh+eefd747fPhwxo4dSyAQ4Nxzz+XFF1+U9BMezj777CiX5tNPP82CBQvo3r076enp/PCHP3TO+2nTpvH222+zf/9+AJ555pl2+9sUSUv+/g8ZMoSPPvqIiRMnctxxx3H00UeHiaMHIyJofge+/vprzjvvPGbMmMHkyZNZvXo1e/fudeZ7w/LS0tIO+AbzYCc9PZ2qqqqwaVVVVaSnp4dNKy8vp2fPnvzud79LZPPaBE31UXl5OR07dkTTNAYNGsTixYvb7UNxPGPpgw8+YN++fYwfPz7RzWsTNNVHZ555Jh07duT444/n/PPPZ/r06RQXFyeppcKhQnu+djeFXLuF1qKuro6LL76YCRMmOM7ojIyMMDdRVVUVGRkZB7TeVatWMXr0aAoKClq0vQcTc+bM4amnnmLVqlVRTtWHH36YRYsWOcXQDMMIu98XwS2a79qfc+fOdYSNWN8VhNaiV69e/OpXv+Kpp57ijjvu4MMPP+SOO+5g69atTvGUKVOmcPnll7Nnzx7ne97zv0OHDhiGQUVFRRL2oG0yduxYioqKwsLId+7cGZZbvKysjJqaGiorK8nLy2PYsGG88MILVFZW8tZbbzFt2rRkNL1N0ZK//6FQiAsuuIBjjjmGV199lUcffZRnn302zBl7MCKC5nfghhtuYOjQoTz22GO8+OKLTJ06NSyss73TpUsXKisrw6pqffnll/To0SNqWcMw+PbbbxPZvDbBgfSR9+12eyOeflq1ahXTp09vt/nsmuqj9PR0fvGLX/DUU0/x4IMPopRiwIABSWytcKjQXq/dB0J7vnYLLUcwGOSyyy6juLiYCy+80JnevXv3sIqnX3zxRcx7iKZYtWpVu41usDnssMPYvn07NTU19O3b15m+efNmbrrpJq6++mpeeOEFVq1ahaZpYff7co5H8137c/To0WzdupXPPvuMt99+m+nTpydrFw4a0tPTw6Ju2muuwZakf//+TJ06la+//poOHTpw22238cILL/DCCy84RRFttm/fHvZZKUVeXl4SWt12WbZsWZhLs6ioiK1btzrzt27dSlpamuM2tMPOX3zxRYYMGdLu+7Olf//37dvHjh07OP744/H7/XTs2JEpU6bwzjvvtEbzE4YImt8B2+YbCAR47733ePXVV5PdpDZFRkYGkyZN4tZbb6W2tpYXX3yRr7/+mkmTJvHss886F7KNGzdy5513HvR5G74LTfXRa6+95rwBXLNmDQ888AATJ05McouTQ1P9BOaF/plnnmnXb/Kb6qNt27axc+dOQqEQb7zxBitXruSkk05KdpOTQjAYpK6uDsMwnM+6rqPrOnV1dQSDwbDP7ZXG+kmu3S6N9ZFcu4XW4Nprr6Wuro4rr7wyTECbO3cu//nPf9i0aRM7d+7knnvuCRMn6+vrqaurA6ChocH5bPP555+zZcsWpkyZkpD9aMvceOON/PrXvw6bVl1djVKK3NxcgsEgt956q5gX4uS79KfP52PWrFlcccUVjBw5kpycnEQ3+6CjT58+vPTSS1RWVvLtt9+GVTkW4uObb77hnnvucfK3rl+/3sndePTRR3PzzTezc+dODMNg8+bNYcLPe++9x5tvvkl9fT1/+9vfmDRpEn6/P1m70iYZN24cBQUFvPjiiwDMmDGDhx56iG+++YaamhpuvvnmsFy5U6dO5b333uPhhx+WcHNa/vc/Pz+fkpISHnnkEXRdZ9u2bbz44ov07NkzsTvWwshZd4Aopfjxj3/Mtddeyy233MKYMWMccUVwufTSS1m+fDnTp0+npKSEX//61+Tk5LBhwwZ+//vfs2/fPnJzc5kxY0ZUZcP2QmN99Oabb7J8+XJqa2spLi7m1FNPbdcX9cb6CeCNN94gEAiEJZ1vjzTWR1988QXLly+noqKCbt26cd1117XbkPNrrrnGCXt57733WL58ObfccgsA5557rrPc+PHjmTdvHldeeWUympl0GusnuXa7NNZHcu0WWpotW7awcuVKAoEAU6dOdab/6U9/YsKECXz55Zeceuqp6LrOMcccw1FHHeUss2DBArZs2QKYFbkB3n77bWf+qlWrmDx5clQ6oPZI7969o6b16tWLY489lsWLFzvVZlNSUpLQuoOP79qfc+bM4b777mPZsmWJaupBi1KKuXPn8sYbb3DkkUfSrVs3Zs+ezccff5zsph1UZGRk8OGHH/LPf/6TqqoqcnNzmT59OkuXLkUpRTAY5Mwzz6SiooLS0lJOO+0057vTpk3jvvvu4yc/+QkDBw7kV7/6VRL3pO2ybNkyzj//fMC8xz7llFM4//zzqaqq4vDDD+eiiy5yls3OzmbEiBG8/vrr/P73v09Wk9sErfX7f/311/O73/2OP//5z6SlpTFr1iyOPfbYBO5Zy6MMed0YN9OnT2fFihV06dIl2U0RBEEQBEEQBEE4JNi5cycLFizgqaeeIi0tLdnNabPI82jyufXWW9m1axeXXXZZspsiCO0eCTmPE1vVLisrS3JLBEEQBEEQBEEQDg10Xeeee+5h5syZImY2gTyPCoIghCMh53Fw7bXX8sYbb/CLX/xCwk0EQRAEQRAEQRBaiFmzZpGTk8PNN9+c7Ka0WeR5VBAEIRoJORcEQRAEQRAEQRAEQRAE4aBBQs4FQRAEQRAEQRAEQRAEQThoEEFTEARBEARBEARBEARBEISDBhE0BUEQBEEQBEEQBEEQBEE4aBBBUxAEQRAEQRAEQRAEQRCEgwapci4IgiAIwiFJfX09v/71r3nzzTepqqqib9++/PSnP6VXr14A3Hnnndx9993ous7RRx/N+eefj1KKYDDIz3/+cz7++GN27NjBqlWrKCoqcta7aNEitmzZ4vxdW1vLBRdcwJIlS2K249Zbb2XXrl1cdtllrbvDgiAIgiAIgtBOEIemIAgHLW+//TYjR45k5MiRbN68OdnNEQShjREKhSgvL2fFihU8//zzTJo0iYsvvhiAV155hQcffJA777yTf/3rX7zyyis8+uijzneHDx/ODTfcEHO9//rXv3j55Zd5+eWXWblyJX6/n8mTJydknwRBEIS2h9yTCoIgJB5xaAqC0CaZP39+mAMqFhMnTmTQoEEApKamJqJZzfL2229z7rnnAvDoo4/SsWPHJLdIENov6enpnHXWWc7fJ5xwAn/84x+pqKjgiSee4Pjjj6dTp04ALFmyhCeffJKjjz4av9/PiSeeGNc2nn32Wfr160fnzp3jWl7XdX72s5/x/vvvEwqFGDVqFJdddhm5ubls3ryZ448/np/85CfccsstAJx//vkceeSRB7jngiAIQksh96SCIAhtExE0BUFok/Tt25fCwkIAtm/fzvbt2wHo06ePc6M4efJkjjnmmGQ1URCEg4wPP/yQgoIC8vLyWLduHXPnznXm9enTh7/85S8HvM4nn3ySI4444oC+M3XqVK6++mpCoRA///nPue222xznaENDA+vXr+exxx7jnXfe4Wc/+xnTp08nLS3tgNsmCIIgfH/knlQQBKFtIoKmIAhtkt/+9rfO51tvvZW///3vznT7DbMd3gPum+crr7ySxx57jLKyMs455xz++te/UllZyVFHHcUPf/hD/vKXv/Doo4+SnZ3N0qVLOf74453t7Nixg5tvvpnXX3+diooKSkpKmD9/PkuXLsXvNy+XH330ETfffDNffPEF1dXV5Ofn07dvXy6++GIef/xxp50ARx11FADz5s3jyiuv5K677uLJJ59k69atVFVVkZOTw9ChQ/nRj35E165dAVi5ciVXXXUVAL/5zW+44447WL9+PSNGjOCqq67ihRde4LbbbqO2tpaZM2dyySWXOG2z++LCCy/k008/5eWXXyYtLY0FCxZwzjnnoJRq+QMlCAcJlZWVXHfddZx33nkAVFdXk5WV5czPzMykurr6gNa5efNmPvnkE2688ca4v6NpWpiQetJJJ3HzzTc7fxuGwVlnnUVKSgpjx44lNTWVb7/91sn7KQiCICQWuSeVe1JBENomImgKgnBIsnPnTn7zm99QVFREVVUV9913H2+88Qbbt28nKyuLrVu3csMNNzBixAi6d+9ORUUFS5cuZdu2bWRmZtK9e3fWrl3LLbfcwqZNm1i+fDm6rnPhhReyd+9eCgsL6d69Ozt27ODll1/m5JNPpqSkhO7du7Nu3TrAfXNvh7S+8847bNy4kdLSUoqLi/nmm29YvXo1n376KQ899BCBQCBsH5YvX05ZWRn19fW89tprnH322WzcuJGOHTuybds2HnzwQXr37s2CBQvCvnfzzTeTm5tLdnY227dv57bbbiMvL4/FixcnpvMFoY1RV1fHxRdfzIQJEzj66KMByMjIoLKy0lmmqqqKjIyMA1rvqlWrGD16NAUFBc40b8Ggf//735SWloZ9JxgM8sc//pHVq1ezf/9+DMMgLy/PmZ+amhomtKalpVFTU3NA7RIEQRDaDnJPKvekgiC0DlIUSBCEQ5KGhgb+7//+j4ceeoiSkhIANm7cyH333ceDDz5IIBBA13XeeecdwCzysW3bNgoLC3nkkUe47777uP766wF47LHH2LhxI/v27WPv3r0ArFixgnvvvZdnnnmGBx54gB49enDMMcfws5/9zGnDb3/7W+68804nh9+Pf/xjVq9ezb///W8eeOAB/vSnPwGwbds2Pvjgg6h9OOOMM3jwwQedcNZ169axfPlyHnroIYYOHQqYjoBIBg4cyMqVK3n00UcZNmyY015BaI8Eg0Euu+wyiouLufDCC53p3bt356uvvnL+/uKLL+jRo8cBrXvVqlXMmTMnbJq3YFCkmGl/57333mPFihW8+OKLXH/99RiGcWA7JQiCIBw0yD2p3JMKgtA6iENTEIRDEjt0BqC0tJRt27bRs2dPJzQoPz+frVu3snv3bgA++eQTAHbt2sXMmTPD1mUYBh9//DFz5szhsMMO48MPP+T444+nc+fO9OzZkwkTJsSVQ2/r1q1cd911fPXVV1RXV4eJGDt27IhaftKkSQCUlZU50yZOnAhAeXk577//vtN+L9OnT3dCfqZPn857773Hrl272LNnD/n5+c22UxAOJa699lrq6uq4/vrrw0Lc5s6dy/XXX8/MmTMJBALcc889nHzyyc78+vp65xxtaGigrq4uzLHy+eefs2XLFqZMmXJA7amqqiI1NZXs7GwqKiq46667vt8OCoIgCG0auSeVe1JBEFoHETQFQTgkyczMdD77fL6oabawYd/A2f/aoT2R2AU5br75ZlatWsUHH3zAunXreO6553j66afZuXMnp556aqPt+fbbb7nkkktoaGggMzOT/v37EwwG+eKLLwCz8nFj+2C3H3BCUSPbLwhCNFu2bGHl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jx7N1KlTqa+v58wzz2TZsmU888wzB9yWrVu3MnPmTP7617+yYMECPvvsM2bNmkWPHj2YPn16s98/7bTTuP3227n99ts555xzDnj7ANdccw1XX301Xbt25aKLLuLUU09t9jvnn38+FRUVfPPNN1RXV3PUUUeFzf/www9Zvny58/fQoUOpq6vjiy++YMiQIVHri2f5559/nsLCQgoLC1m4cCG//OUvSUtL+077fKC8Mu116rfXNb9gC5DaIcCE58c1uYyMz6Zp6fEJTY+/77K+lmTaM2+wrba+1bcDUJKWyvMzxza5jIzPpmnJ8anrOoZhhDnidF1n/fr17N27l9zcXCC518+DFbkfbZ/3o/UNBhu2tf52upRAaopqdjm5njZNe7sf1et1ar5tfXEqvVM6WmrznicZn03T3u5H60M631bXtvp2OmWkkeqT8ekl2eMz2fejbepuY+vWrWzatCnZzXCQEyExbN0Nm3YkbHNxceaZZzJ48GA2btxI586dueOOO5g9ezbjx493lklLS+MXv/gFY8aMQdd1NO3ADM933XUXkyZNYtGiRQAMGjSI008/nXvvvTeu4+7z+bjuuuv4wQ9+wCmnnBJzmZ///Odhb5BGjRrljNFf//rXDBgwgIyMDJ5//nkWLVpEdnY2xx57bKPbDIVCPPDAA7z88svk5eWRl5fHT37yExYvXuwsU1lZGfYmKyUlhYyMDPbv3x9znc0tv3DhQs466yw6duzIp59+ypIlS6isrOSPf/xjc13UItRvr6N2S2IEzXiR8Rmb1hifzY2/A11fS7Ottp4tNTI+2+P4zM7OZvLkySxfvpxbbrmF3bt3O+Ny//795ObmJv36ebAi96Pt8360LSLX09i0x/vRtoiMz9i0x/vRtoiMz9gcavejbUrQLC0tbXPbkhOh9SktSMhmDmhbAwYMYPTo0fzjH//g0ksv5e677+bmm29mx44dXHDBBbz88svs3bsXgPr6eudkPRC++eYbnnjiibCLRSgUYuLEiXGv4+ijj+aGG27gj3/8I+np6VHzf/3rXzdaDGDcONcJOHv2bM455xweeOCBJo/7zp07qa+vp2vXrs4072eArKwsp28AgsEg1dXVZGdnx1xnc8sPHDjQmTdo0CCuu+46zjjjjITdQKZ2CCRkOweyLRmfsWmN8dnc+DvQ9bU0JWmpCdnOgWxLxmdsWmN83nPPPVxwwQX06tWLnJwczjrrLD788EPy8/OB5F8/D1bkfrR93o+mpih6dUrIpuJGrqexaY/3o1qqRmaPzIRsK15kfMamPd6Ppvo0emRnJGRb8SLjMzaH2v1omxI0mwu5SQZyIrQ+zYWAJ4szzzyT3/zmNwwaNAhd15k/fz4/+MEPqK6u5t1336W4uJj333+fYcOGhVmsbbKysqipqcEwDCcnxZYtWxg6dCgAnTt35thjj+X+++//Xu28/vrrmT9/Pj/+8Y+/13riefApKioiJSWF9evXU1JSAsCGDRvCljnssMN4//33nYef999/n0AgQJ8+fWKu80CXP9AHtO9LcyHgyULGZzStMT6ba8f3Xd/3pbkQ8GQh4zOa1hif5eXlYTkL//rXvzJy5EgyM2M/9Cb6+nmwIvejec609nQ/2laR62k07fF+tK0i4zOa9ng/2laR8RnNoXY/KlfiODjzzDO58847eeyxx5wT4ec//7lzIuzbt4+XXnoJoNkTwWbLli3OZ/tEqKiocP7bv38/TzzxxAG18/rrr+eGG25g9+7vl5BSfqBNFi9ezNatW52Qp5SUFKeiaF5eHrt27eKqq65q9Pt9+vQhJSWFe++9l1AoxP333897773nzD/llFN4/vnn+c9//kNDQwMNDQ28//77vPXWWwfUzgkTJjBhwgRuvvnmuL9TUVHBE088QXV1NaFQiOeee45bb72VBQsWNPk9n8/HokWLuOKKK6ioqGDz5s3ceOONYcucfvrp/OlPf+LLL79k7969XHHFFZx00kkxH2ziWf7hhx9m165dAHz++edcdtllzbazPSDjM5rWGJ/Njb8DXV97QcZnNK0xPtesWUNFRQWhUIgXXnjBCde1kevnoYXcj7ZP5HoajdyPth1kfEYj96NtBxmf0Rxy96OG0Cz79+83MjMzjW7duhkXX3yxYRiGsXDhQuPEE0806uvrjZ07dxrHHPP/27ljkDjSMAzAe4KC2dUoy1rZWFnFzhQB2SrggsVBKiuxtrC108Y62AgWdhIhpLAJabazS+E2sm0aK5GIghYivNcJ3u6Jd5jLjD4PTLO7zP8z/7sfPx8z82cqlUrOz8+TJEtLS1ldXU2SXFxcpFqtZm9vL7e3t9nf38/g4GDW19eTJCcnJ2k0Gvny5Utubm5yc3OTTqeT79+/PzivHz9+3BszSRYWFlKv19NsNu8+azab+fjxY99znJ+f5+vXr7m6usrt7W3a7XbGxsby+fPn/3Kpnp3l5eVUKpV0u90kSbfbzezsbKrVaqanp7Ozs/OP654knz59yuTkZF6/fp2VlZUsLCzcrXuSHB0d5f3796nX6xkfH8+7d+/SbrcfnFO/dT8+Ps7AwEDPug8NDaVard47zs7Ocnp6mrdv32ZkZCQjIyN58+ZNdnd3H3VNfv78mQ8fPmR0dDTT09PZ2trK30vJxsZGGo1GarVaFhcXc3l5effd5uZm5ufnH/37xcXF1Ov1vHr1KlNTU1lbW8v19fWj5vrcyWevp87nY/L30PleMvns9dT53N7ezsTERIaHhzMzM5ODg4N751I/nxf70ZdLPe1lP1oc8tnLfrQ45LPXc9qPamg+kj8C9NfpdHoKIBSFfFJk8sm/ZT8K/amnFJl8UmRlzucfSZ9nUgAe6aH3jsDvJp8UmXwCPA31lCKTT4qszPn0choooFarVanVaj1Hq9X65WMfHh72HbtWq1UODw9/+fgUn3xSZPIJ8DTUU4pMPiky+fx/uEOz4FqtVt/Qzc3NVb59+/YbZgQAwEtiPwoAFI2GJgAAAABQGh45BwAAAABKQ0MTAAAAACgNDU0AAAAAoDQ0NAEAAACA0tDQBAAAAABKQ0MTAAAAACgNDU0AAAAAoDQ0NAEAAACA0tDQBAAAAABKQ0MTAAAAACgNDU0AAAAAoDQ0NAEAAACA0vgLDIsByn5Hnl0AAAAASUVORK5CYII=",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "def plot_historical_forecasts(hfcs_):\n",
+ " fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(16, 4.3))\n",
+ " test[: 2 * 7 * 24].plot(ax=ax1)\n",
+ " hfcs_[: 2 * 7 * 24].plot(ax=ax1)\n",
+ " ax1.set_title(\"Predictions on the first two weeks\")\n",
+ " ax1.legend(loc=\"lower center\", bbox_to_anchor=(0.5, -0.25), ncol=4, fontsize=9)\n",
+ "\n",
+ " test.plot(ax=ax2)\n",
+ " hfcs_.plot(ax=ax2, lw=0.2)\n",
+ " ax2.set_title(\"Predictions on the entire test set\")\n",
+ " ax2.legend(loc=\"lower center\", bbox_to_anchor=(0.5, -0.25), ncol=4, fontsize=9)\n",
+ "\n",
+ "\n",
+ "plot_historical_forecasts(hfcs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "10b8f9f4-a1f8-42c5-96dd-294440290fca",
+ "metadata": {},
+ "source": [
+ "Nice, we just performed a one-year simulation of applying conformal prediction in under 1 second! The intervals also seem to be well calibrated.\n",
+ "Let's find out by computing the metrics on all historical forecasts (backtest)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "73bf5226-e09b-447d-991d-f6efd71cbb7d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Interval
\n",
+ "
Coverage
\n",
+ "
Width
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
0.9
\n",
+ "
0.901609
\n",
+ "
2908.944092
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Interval Coverage Width\n",
+ "0 0.9 0.901609 2908.944092"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bt = cp_model.backtest(\n",
+ " cal_test,\n",
+ " historical_forecasts=hfcs,\n",
+ " last_points_only=True,\n",
+ " metric=[metrics.mic, metrics.miw],\n",
+ " metric_kwargs={\"q_interval\": q_interval},\n",
+ ")\n",
+ "bt = pd.DataFrame({\"Interval\": q_range, \"Coverage\": bt[0], \"Width\": bt[1]})\n",
+ "bt"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "36eb467d-adbd-4538-9b11-a2bd4927bd9b",
+ "metadata": {},
+ "source": [
+ "Great! Our interval indeed covers 90% of all actual values. The mean width / uncertainty range is just under 3MWh.\n",
+ "\n",
+ "It would also be interesting to see how the coverage and widths behaved over time.\n",
+ "\n",
+ "The coverage metric `ic()` gives a binary value for each time step (whether the interval contains the actual). To get the coverage ratios over some period of time, we compute the moving average with a window of 4 weeks."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "fc72247b-8e34-4a43-b82d-f9f096c9bd37",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def compute_moving_average_metrics(hfcs_, metric=metrics.ic):\n",
+ " \"\"\"Computes the moving 4-week average of a specific time-dependent metric.\"\"\"\n",
+ " # compute metric on each time step\n",
+ " residuals = cp_model.residuals(\n",
+ " cal_test,\n",
+ " historical_forecasts=hfcs_,\n",
+ " last_points_only=True,\n",
+ " metric=metric,\n",
+ " metric_kwargs={\"q_interval\": q_interval},\n",
+ " )\n",
+ "\n",
+ " # let's apply a moving average to the residuals with a winodow of 4 weeks\n",
+ " windowed_residuals = residuals.window_transform(\n",
+ " transforms={\"function\": \"mean\", \"mode\": \"rolling\", \"window\": four_weeks}\n",
+ " )\n",
+ " return windowed_residuals"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "da696430-0bea-4adf-8bb4-5315e4a18ca1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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X6rsuAkJCXj48CGA7FpnOZuUkGziD36pXTshRF0KlbRTp058svYeLzJq1CiZ963p1zomJkbdIQDIrhYvq99++02JkeRNvBdzZXaQlZ6ezusMEQC6du3K6xE3pwMHDqhsXPPFixdLHUd76tSpsLS0VMgxevXqhUaNGkldFxMTg40bNyrkOES+G9q9e/fC2dmZVyvp7t27GDVqFBo2bJjna0UdZ4lMmTIF8+bNk3j4I968IjIyUuroBISom3gHoY8fP1bZcR8/fszdW4g/4CJ8lSpV4qapdhYhRF0KlbRrc0/x0uRWPT43eZWeN2vWjDf/5cuXggemZNKSLnU9ZPj06VOu67Zv386NR1uuXDmpcauKoaEhN62sseKXL18OfX19ieVz587N97Vz5sxRRkgSclZxNjQ0xLt377BixQqFHUNXVxd3797F7du3pQ6hOG3aNBw6dEhhx9NmsnZk1bZtW4n+BoDs0r7NmzcjODhY5vdk8eLFWLlyJczMzCTWid9sA8DRo0dl2ichqlSxYkXugZO0UU6URfxY9evXV9lxixrxknZK2gkh6lKopF2be4qXRt7q8dJMmDABL168wM2bN7nh3wB+VeG4uDj4+fkhMjKy4MEWwufPn7F7927s2rUL27Ztwx9//CGxjap6RM/p8+fPUpeHhoZi+PDh8PDwQEREBMLCwmBkZKTi6PgaN24MIHvIHWVU0c6tZ21RqY74iBC3b9/GyZMnufmgoCClt92T9mDnw4cPEh31KUqTJk3w7t07qU0o1FnroiAYY7h79y6ePHmi7lA49+/fl3nbnJ3ESdOnTx94eXnlu52NjU2u63R1dfHPP/9w87dv35YtQEJUSCgUcjWi3r9/r7Kaa6Kq8QAl7XmhknZCiCaQKWl3d3fHuHHjZNrhmDFjtLYHUnmrxwNA3759efNr167lSuCtra1565ycnDBnzhx07doV3t7eSktu8pKRkYHmzZtj8ODBGDZsWK7tn3MOt6Yqol6mcxL/0XVwcCh0r+SKULp0aW565syZKjlm7969uYcVfn5+6NKlCxYvXowmTZpIPICT1pu7Il2+fJk3f/78eVhYWCj1mOXLl0flypUlhpaLiYkpUm3br169iiZNmqBu3boSHfipS69evWTa7tatWzLVRAKQb40LV1dX9OnTJ89txJuHBAYGUptUopHEk2bxZFqZRCXt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ihcvft3zdevW5YknnmDNmjXMmTPHZRqGAgICqFevHgBxcXFFcpyyreXtGu9qSTvAK6+8YmxPnz6drKysmx576dIlZs+ezYQJE9i0aVNhhHdblLTbiav8QRURERGR2+Pu7s5zzz3Hnj17ePXVVwkKCqJFixZ89dVX7Nmzh88//5yQkBCX+3yZO649IyODP//80+RoHJ+rJ+1t2rShQ4cOABw8eJDZs2ff8LgjR47QsmVLxo8fz6xZs2jdujUTJkxg165dhRlugShpFxERERFxAHfddRevvfYau3btYvPmzTz22GO4u7vux3WNa8+/rKwsY+b4cuXKUbduXZMjMkfukooAEydO5Pvvv7d6/scff6RFixYcPHjQ2GexWJg1axaNGjVi6NCh/9irw2KxcOLECdsH/i9c96+AnbnaN6EiIiIiIrakGeTzb/fu3Vy+fBnImTXeVXORkJAQpk6dCuQk2I888ghPPfUUn3/+OU888QR9+vTh4sWLQM6cEo8++qjV+Z9//jn33nuv1ZdEFouFQ4cOERERQcuWLenZsydXrlwpvEIBnoX6ai7EVd8oIiIiIiK2EBQUhJ+fH0lJSWpp/xeu3jU+r1dffZVjx44RERFBVlYWn3766XXH9OvXjzlz5nDHHXcwYcIEoqKimDZtGqmpqWzbto02bdpQv359KleuTFxcHOfPn7c6/7PPPmPChAmFVSS1tIuIiIiIiOPx8PCgZcuWAJw6dYq//vrL5Igcl5L2/+fm5sbcuXMZO3bsdc95e3szZ84cIiMjueOOOwBo3LgxL7/8Mhs3biQoKMg4du/evaxYseK6hL1hw4bUr1/frmW4llra7UQt7SIiIiIit+fee+9l1apVQE4X+b59+5ockeOxWCxG0u7n50fTpk3NDcgBuLu78+677zJq1Ch27NjB+vXrKV68OI8//jh16tS54TmNGjVi27ZtzJ07l7lz57Jjxw4yMjIoXbo0rVu35t577yU4OJgqVapQo0aNQi2PknYREREREXFIece1//HHH0rab+Do0aPEx8cDOV9yeHoqxctVu3ZtateuTZ8+ffJ1vKenJyNHjmTkyJGkp6dz/vx5KlasaDTIZmdnc/z4cXuGfOO4Cv0VXYRa2kVEREREbo8mo/t3a9euNbZdvWu8LRUvXpxKlSqZHQagMe12o6RdREREROT2lC1bllq1agGwdetW0tPTTY7I8axZs8bYDgkJMS8QsRsl7SIiIiIi4rBy12u/evUq27ZtMzcYB5SbtHt5edGqVStzgxG7UNJuJ2ppFxERERG5fdeOa5f/d+zYMWOMdZs2bShRooTJEYk9KGkXERERERGHldvSDhrXfq28XeNDQ0NNi0PsS0m7nailXURERETk9jVq1Ahvb29ALe3XUtLuGpS024mSdhERERGR2+fp6ck999wDwPHjx0lISDA5IsdgsVhYvXo1kDOevWXLliZHJPaipF1ERERERByaushf79ixY5w4cQLQePaiTkm7nailXURERETENrRe+/Xydo3v0KGDeYGI3SlpFxERERERh6YZ5K+n8eyuQ0m7nailXURERETENipWrEiNGjUA2LJlCxkZGeYGZDKLxWIk7d7e3saYfymalLSLiIiIiIjDyx3Xnpqays6dO02OxlwHDx7UeHYXoqRdREREREQcXqtWrYztjRs3mhiJ+aKjo43trl27mhiJFAYl7Xai7vEiIiIiIraTN2l39cno8ibtYWFhJkYihUFJu4iIiIiIOLymTZtSrFgxwLVb2s+dO8eqVasAqFq1KkFBQSZHJPampN1O1NIuIiIiImI7Xl5eNGvWDID9+/dz8eJFkyMyR2RkpDER34ABA5R3uAAl7XaiN4+IiIiIiG3l7SK/adMmEyMxz9dff21sP/bYYyZGIoVFSbuIiIiIiDiFvOu1r1+/3sRIzHHs2DFjaECTJk1o1KiRyRFJYVDSbidqaRcRERERsa22bdsa2//73/9MjMQcixYtMrYffvhhEyORwqSkXUREREREnEK1atWoUqUKkDODfGZmpskRFa7vv//e2O7bt6+JkUhhUtJuJ2ppFxERERGxLTc3N6O1PTk5me3bt5scUeE5fvy4MY6/SZMm1K5d2+SIpLAoabcTJe0iIiIiIrbnql3k83aN79evn4mRSGFT0i4iIiIiIk5DSbuSdlejpN1O1NIuIiIiImJ7jRs3xs/PD4Dff/8di8VickT2d/LkSTZs2ADklL9OnTomRySFSUm7iIiIiIg4DU9PT2Ppt/j4eI4fP25yRPb33XffGdtqZXc9StrtRC3tIiIiIiL24Wpd5BcsWGBsDxgwwMRIxAymJu0XL15kzJgxtG3blt69exuzIV6rf//+tG/f3vi55557mD9/PgBbtmzhnnvusXo+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EREpfN7e3qZMSLdhwwbeffddIGeW+C+++AJPT00hJrdPSbuIiIiIiBQpw4cPN7bnzp2LxWKx6+udO3eOhx9+mOzsbACmTJlC3bp17fqa4jqUtIuIiIiISJHSoEED2rRpA8CuXbvYtGmT3V7rypUr9OjRgxMnTgA53eLHjx9vt9cT16OkXUREREREipyhQ4ca23PmzLH59bOysoiOjqZ169Zs3LgRgAoVKvD999+rW7zYlJJ2EREREREpcvr374+/vz8A3333HZcvX7bZtX/99Vfq1q1L9+7d2bt3LwClS5fmt99+484777TZ64iAknYRERERESmCfH19efTRRwFITk5m9uzZt31Ni8XC22+/TVhYGIcPHzb2N2/enN9//51GjRrd9muIXEtJu4iIiIiIFEnjx483uqq/8847xMfH3/K1rl69yoQJE3jxxReNie1CQkL44Ycf2LhxI/Xr17dJzCLXUtJuJ1ryTURERETEXIGBgcZM8snJyTz33HO3dJ1Lly4RFhbGDz/8YOybMmUKq1evpnfv3hrDLnalpF1ERERERIqs1157jbJlywKwcOFCYmJiCnT+lStXCAkJITY2FgAvLy8iIyOZPHmyGuqkUChpFxERERGRIqtMmTK8/fbbxuOnnnqqQJPSvfDCC+zYsQPImWxu9erV9O/f3+ZxityMknY70bduIiIiIiKOYfDgwYSGhgJw7NgxmjZtyuuvv86BAwf+8bzo6Gg+++wzIGdiu4ULF9KyZUt7hytiRUm7iIiIiIgUaW5ubkRERBAQEADkJO6TJk2iadOmbN269Ybn7N69mwEDBhiPZ86cSWBgYKHEK5KXknYRERERESnyatSowTfffIOPj4+xLzU1leHDh5OZmWl17KlTp7j//vu5cuUKAL169WLEiBGFGq9ILiXtIiIiIiLiErp168bhw4eJjY2lYsWKAPz555989NFHxjGnT5+mY8eOHD9+HMhZg33BggW4uyt1EnPoN89ONKZdRERERMTxVKxYkeDgYKvl21555RVOnjzJsWPHuO+++9i/fz+Qs2RcVFQUvr6+ZoUroqRdRERERERcT5s2bYwu70lJSdSvX5+goCD27NkDQNWqVVm5ciV33nmnmWGKKGm3F3WfERERERFxbG+++abRTT45OZmUlBQAateuzapVq6hRo4aJ0YnkUGZpQ/Pnz8fPz49n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d999l9dee401a9YQExODu7u7McMiYPVttTO61bK3bNmSxMRE9u7dy5YtW+jYsaNZRbA5b29vq5l2HX3cki3Vr1+fDh06cPjwYcqXL8/cuXNZs2YNa9asITY2lu+//9449syZM1bbbm5ulCpVyoSobWPYsGFW376XLVuWxMRE4/nExES8vLyMb6dzu8zFxsbSpEkTpyq7reuAK1eucPbsWfr27Yunpyd33nknoaGhbN261R7hSwGovv9/qutV11/LVet7V67rwXXqe2ep65W0/4Np06Zx9epVpkyZYlURde/enR9++IFTp05x7tw5FixYYFUhp6enc/XqVQAyMjKM7Vz79+8nISGB0NDQQimHLc2aNYsZM2ZY7UtJScHNzY077riDzMxMwsPDrSrxouJWyu7h4UGXLl2YNGkSLVq0wN/fv7DDtps6deqwdu1akpKS+Ouvv6xm1Cxqjh07xoIFC4wxi8ePHzfGa/Xq1YuPP/6Yc+fOYbFYiI+Pt/rDHBcXx8aNG0lPT+ezzz4jODgYT0/n7eR07733Urp0aWJjYwHo1KkTP/74I8eOHSM1NZWPP/7Yaixnhw4diIuL46effnK6rnK2rgMCAgKoUKECixcvJjs7m9OnTxMbG8tdd91VuAWT66i+t6a6XnV9Xq5S36uut+Yq9b2z1PXO/dtkRwkJCURFRVGiRAk6dOhg7P/ggw9o164dBw8eZPDgwWRnZ/Pggw/ywAMPGMf06dOHhIQEIGc2VYAtW7YYz8fExBASEoK3t3chlcZ2ateufd2+WrVq8dBDDzFgwABjFsZixYqZEJ193WrZw8LC+Pbbbxk2bFhhhWp3bm5udO/enQ0bNnD//fdTo0YNunbtyq5du8wOzS58fHzYsWMHX331FcnJydxxxx107NiRIUOG4ObmRmZmJk8++SSXLl2iYsWK/Oc//zHOve+++/j222954YUXCAoKMrrdObNhw4YxevRoANq2bctjjz3G6NGjSU5Opk2bNjz33HPGsSVLluTuu+/mjz/+4J133jEr5AKzVx0wc+ZMZs+ezYcffoiXlxddunThoYceKsSSybVU319Pdb01V63rwbXqe9X11yvq9b0z1fVulqL4NamIAzl37hx9+vTh119/xcvLy+xwblvHjh2JiIigWrVqZofi8MLDwzl//jwvvfSS2aGIiIgdFbW6HlTf55fqeikM6h4vYkfZ2dksWLCAzp07F4lKPPcbxEqVKpkciYiIiGMoanU9qL4XcTTqHi9iR126dMHf35+PP/7Y7FBu27Rp09iwYQMvv/xykewSKSIiciuKUl0Pqu9FHJG6x4uIiIiIiIg4KHWPFxEREREREXFQStpFREREREREHJSSdhEREREREREHpaRdRERERERExEEpaRcRERERERFxUEraRYqALVu20KJFC1q0aEF8fLzZ4YiIiIgdqL4XcU1ap13EwfXs2ZOEhIR/PKZ9+/Y0bNgQgOLFixdGWP9qy5YtjBw5EoClS5dy5513mhyRiIiI41J9LyI3o6RdxMHVrVuXMmXKAHDmzBnOnDkDQJ06dYwKOyQkhAcffNCsEEVEROQ2qb4XkZtxs1gsFrODEJH8CQ8PZ86cOYD1t9k3+pZ7ypQpLFu2jEqVKjFixAg++eQTkpKSeOCBB3j66af56KOPWLp0KSVLlmTIkCH07dvXeJ2zZ8/y8ccf88cff3Dp0iUqVKhAz549GTJkCJ6eOd/17dy5k48//pgDBw6QkpJCQEAAdevWZdy4cfz8889GnHn16NGDKVOm8PXXXxMdHU1iYiLJycn4+/vTtGlTnnnmGapXrw5AVFQUU6dOBeDNN9/kiy++4Pjx49x9991MnTqVNWvWMHfuXNLS0ujcuTPjx483YmvRogUAY8eOZc+ePaxbtw4vLy/69OnDiBEjcHNzs8d/j4iIiE2ovld9L5KXxrSLFHHnzp3jzTffpFixYiQnJ/Ptt9/y2GOPsXTpUvz8/EhMTOStt97i6NGjAFy6dIkhQ4YQFRVFamoqNWvWJDExkU8//ZRp06YBkJ2dzdixY9m8eTOenp7UrFmTjIwM1q1bR2JiIhUqVKBmzZpGDHXq1KFhw4ZUqVIFgK1bt3Ly5EnKlClDjRo1uHLlCqtXr2bUqFFcvXr1ujJMnjyZ9PR00tPTWb9+PcOHD2fmzJmUKFGCy5cvs2jRIpYsWXLdeR9//DFxcXGULFmSixcvMnfuXCIjI+1xm0VEREyl+l71vRRdStpFiriMjAz++9//8uOPP1KhQgUATp48ybfffsuiRYsoUaIE2dnZbN26FYCFCxdy+vRpypQpw+LFi/n222+ZOXMmAMuWLePkyZNcuXKFy5cvAxAREcE333zDb7/9RmRkJIGBgTz44IO8+OKLRgxvv/028+bNY+jQoQA8++yzrF69mu+//57IyEg++OADAE6fPs327duvK8MTTzzBokWL6NatGwBHjx5l8uTJ/PjjjzRt2hTIaX24VlBQEFFRUSxdupRmzZoZ8YqIiBQ1qu9V30vRpTHtIkVcblc0gIoVK3L69Gnuuusuo6tdQEAAiYmJXLhwAYDdu3cDcP78eTp37mx1LYvFwq5duwgLC6Nx48bs2LGDvn37UrVqVe666y7atWtnVLT/JDExkenTp3Po0CFSUlLIO0rn7Nmz1x0fHBwMQKVKlYx97du3B6By5cps27bNiD+vjh07Gl3oOnbsSFxcHOfPn+fixYsEBAT8a5wiIiLOQvW96nspupS0ixRxvr6+xraHh8d1+3LHe+VWpLn/+vr6WnV5y+Xl5QXkdEWLiYlh+/btHD16lJUrV7J8+XLOnTvH4MGDbxrPX3/9xfjx48nIyMDX15f69euTmZnJgQMHgJyueDcrQ278AH5+fjeMX0RExBWpvhcpupS0i4iVoKAg1q9fj4eHB9OnTze+oU9OTmb16tV06NABi8XCjh076NmzpzGL7WuvvcbSpUuJi4tj8ODBRmUPkJqaamzv37+fjIwMAD788EMaN27Mr7/+yssvv2zzsqxcudKYcGfVqlUAlClTRt+6i4iIy1N9L+I8lLSLiJX+/fuzZMkSzpw5Q58+fahZsybJycmcPn2azMxMevToQVZWFqNGjcLX15cKFSrg5uZmTGxTq1YtAKpUqYKnpyeZmZmMGjWKSpUqMWjQIGrVqoWHhwdZWVk8++yzVKxYkfPnz9ulLPv27aNnz564ubkZS+f85z//sctriYiIOBPV9yLOQxPRiYiVgIAAIiIi6NmzJ3fccQeHDx/m6tWrNGvWjOeffx7I6bbWp08f7rzzTs6cOcNff/1FpUqVeOyxxxg2bBgApUqVYvz48VSoUIELFy6wa9cuzp8/T40aNXj11VepXLkymZmZlCpVypil1tZGjRpFixYtSEpK4o477uCJJ55gwIABdnktERERZ6L6XsR5aJ12ESlyctdtnTx5Mj179jQ5GhEREbEH1ffiKtTSLiIiIiIiIuKglLSLiIiIiIiIOCh1jxcRERERERFxUGppFxEREREREXFQStpFREREREREHJSSdhEREREREREHpaRdRERERERExEEpaRcRERERERFxUEraRURERERERByUknYRERERERERB6WkXURERERERMRB/R81FQ9YM5Xf0AAAAABJRU5ErkJggg==",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "covs = compute_moving_average_metrics(hfcs, metrics.ic)\n",
+ "widths = compute_moving_average_metrics(hfcs, metrics.iw)\n",
+ "\n",
+ "fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 4.3))\n",
+ "covs.plot(ax=ax1, label=\"coverages\")\n",
+ "ax1.set_ylabel(\"Ratio covered [-]\")\n",
+ "ax1.set_title(\"Moving 4-week average of Interval Coverages\")\n",
+ "\n",
+ "widths.plot(ax=ax2, label=\"widths\")\n",
+ "ax2.set_ylabel(\"Width [kWh]\")\n",
+ "ax2.set_title(\"Moving 4-week average of Interval Widths\");"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "62f26595-5286-4c6b-9191-cf6535971e47",
+ "metadata": {},
+ "source": [
+ "Also here, the coverage looks stable around 90% over the entire year -> the conformal model is valid.\n",
+ "\n",
+ "The interval widths range from 2.5 - 3.5 MWh. The adaptivity/responsiveness of the widths to changes in model performance is mainly controlled by the value of `cal_length`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c4888c37-8cde-4c70-a807-f0f74e3536e3",
+ "metadata": {},
+ "source": [
+ "#### Comparison with another model\n",
+ "\n",
+ "Okay now let's compare the uncertainty of our first model with a more powerful regression model.\n",
+ "\n",
+ "- Use the last week (7*24) of consumption as lookback window\n",
+ "- Also use a cyclic encoding of the hour of the day and day of week as a future covariate\n",
+ "\n",
+ "The process is exactly the same as for the first model, so we won't go into any detail."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "6ca89f61-3da1-4e89-86a0-edee7474ee3f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "6f1d228446304cadacfc27e9ca1be4ef",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "historical forecasts: 0%| | 0/1 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "134beb5cda3e43c09b5488830abc7440",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "conformal forecasts: 0%| | 0/8761 [00:00, ?it/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "