From b5f6f87811d3905be008f3a5c45e02e1ff0ad393 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 2 Oct 2020 13:27:52 +0200
Subject: [PATCH] [contrasting] add general test for
 test_gev_spatio_temporal_polynomial_extremes_mle.py. refactor a bit

---
 .../abstract_extract_eurocode_return_level.py |  4 +-
 .../abstract_result_from_extremes.py          |  4 +-
 .../eurocode_return_level_uncertainties.py    | 10 ++--
 .../result_from_mle_extremes.py               |  2 -
 .../model/result_from_model_fit/utils.py      |  1 -
 .../one_fold_analysis/one_fold_fit.py         | 17 ++++---
 .../main_bayesian_mcmc.py                     |  2 +-
 ...spatio_temporal_polynomial_extremes_mle.py | 46 ++++++-------------
 8 files changed, 34 insertions(+), 52 deletions(-)

diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
index 6ddb75c8..aa9b8afb 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
@@ -69,8 +69,8 @@ class ExtractEurocodeReturnLevelFromCiMethod(AbstractExtractEurocodeReturnLevel)
 class ExtractEurocodeReturnLevelFromMyBayesianExtremes(AbstractExtractEurocodeReturnLevel):
     result_from_fit: ResultFromBayesianExtremes
 
-    def __init__(self, estimator: LinearMarginEstimator, ci_method, temporal_covariate, quantile_level=EUROCODE_QUANTILE):
-        super().__init__(estimator, ci_method, temporal_covariate, quantile_level)
+    def __init__(self, estimator: LinearMarginEstimator, ci_method, coordinate, quantile_level=EUROCODE_QUANTILE):
+        super().__init__(estimator, ci_method, coordinate, quantile_level)
         assert isinstance(self.result_from_fit, ResultFromBayesianExtremes)
 
     @property
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
index 8b62f357..4f5cf39b 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
@@ -61,15 +61,13 @@ class AbstractResultFromExtremes(AbstractResultFromModelFit):
             'type': r.c("return.level")
         }
         if self.param_name_to_dim:
-            print("here")
             if isinstance(transformed_temporal_covariate, (int, float, np.int, np.float, np.int64)):
-                print("here2")
                 d = {GevParams.greek_letter_from_param_name_confidence_interval(param_name) + '1': r.c(transformed_temporal_covariate) for
                      param_name in self.param_name_to_dim.keys()}
             elif isinstance(transformed_temporal_covariate, np.ndarray):
                 d = OrderedDict()
                 linearity_in_shape = GevParams.SHAPE in self.param_name_to_dim
-                nb_calls = 2  # or 4 (1 and 3 did not work for the test)
+                nb_calls = 4  # or 4 (1 and 3 did not work for the test)
                 for param_name in GevParams.PARAM_NAMES:
                     suffix = '0' if param_name in self.param_name_to_dim else ''
                     covariate = np.array([1] * nb_calls)
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
index 3d31dd08..545e9784 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
@@ -1,3 +1,7 @@
+from typing import Union
+
+import numpy as np
+
 from extreme_data.eurocode_data.utils import EUROCODE_QUANTILE
 from extreme_fit.estimator.margin_estimator.utils import fitted_linear_margin_estimator
 from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \
@@ -29,12 +33,12 @@ class EurocodeConfidenceIntervalFromExtremes(object):
     @classmethod
     def from_estimator_extremes(cls, estimator_extremes: LinearMarginEstimator,
                                 ci_method: ConfidenceIntervalMethodFromExtremes,
-                                temporal_covariate: int,
+                                coordinate: Union[int, np.ndarray],
                                 ):
         if ci_method == ConfidenceIntervalMethodFromExtremes.my_bayes:
-            extractor = ExtractEurocodeReturnLevelFromMyBayesianExtremes(estimator_extremes, ci_method, temporal_covariate, cls.quantile_level)
+            extractor = ExtractEurocodeReturnLevelFromMyBayesianExtremes(estimator_extremes, ci_method, coordinate, cls.quantile_level)
         else:
-            extractor = ExtractEurocodeReturnLevelFromCiMethod(estimator_extremes, ci_method, temporal_covariate, cls.quantile_level)
+            extractor = ExtractEurocodeReturnLevelFromCiMethod(estimator_extremes, ci_method, coordinate, cls.quantile_level)
         return cls(extractor.mean_estimate,  extractor.confidence_interval)
 
     @classmethod
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
index 8cf89900..e24978c3 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
@@ -23,7 +23,6 @@ class ResultFromMleExtremes(AbstractResultFromExtremes):
         d = self.get_python_dictionary(values)
         if 'par' in d:
             values = {i: param for i, param in enumerate(np.array(d['par']))}
-            print(values)
         else:
             values = {i: np.array(v)[0] for i, v in enumerate(d.values())}
         return get_margin_coef_ordered_dict(self.param_name_to_dim, values, self.type_for_mle,
@@ -38,7 +37,6 @@ class ResultFromMleExtremes(AbstractResultFromExtremes):
         res = r('ci.fevd.mle_fixed')(self.result_from_fit, **mle_ci_parameters, **common_kwargs)
         if self.is_non_stationary:
             b = np.array(res)
-            print(b)
             a = b[0]
             lower, mean_estimate, upper, _ = a
         else:
diff --git a/extreme_fit/model/result_from_model_fit/utils.py b/extreme_fit/model/result_from_model_fit/utils.py
index dbdf9fe0..8a51ceee 100644
--- a/extreme_fit/model/result_from_model_fit/utils.py
+++ b/extreme_fit/model/result_from_model_fit/utils.py
@@ -41,5 +41,4 @@ def get_margin_coef_ordered_dict(param_name_to_dims, mle_values, type_for_mle="G
                         coef_name = coef_template.format(k + offset)
                         coef_dict[coef_name] = mle_values[i]
                         i += 1
-    print(coef_dict)
     return coef_dict
diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py
index 2fcf945c..c73cc089 100644
--- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py
+++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py
@@ -273,11 +273,10 @@ class OneFoldFit(object):
         has_not_opposite_sign = self.sign_of_change(estimator) * self.sign_of_change(new_estimator) >= 0
         return has_not_opposite_sign
 
-
     def sensitivity_of_fit_test_last_years(self, estimator: LinearMarginEstimator):
         # Build the dataset without the maxima for each altitude
         new_dataset = AbstractDataset.remove_last_maxima(self.dataset.observations,
-                                                        self.dataset.coordinates,
+                                                         self.dataset.coordinates,
                                                          nb_years=10)
         # Fit the new estimator
         model_class = type(estimator.margin_model)
@@ -288,7 +287,7 @@ class OneFoldFit(object):
         # Compare sign of change
         has_not_opposite_sign = self.sign_of_change(estimator) * self.sign_of_change(new_estimator) >= 0
         # if not has_not_opposite_sign:
-            # print('Last years', self.massif_name, model_class, self.sign_of_change(estimator), self.sign_of_change(new_estimator))
+        # print('Last years', self.massif_name, model_class, self.sign_of_change(estimator), self.sign_of_change(new_estimator))
         return has_not_opposite_sign
 
     def sign_of_change(self, estimator):
@@ -312,9 +311,9 @@ class OneFoldFit(object):
         standard_gumbel_quantiles = [standard_gumbel_distribution.quantile(i / (n + 1)) for i in range(1, n + 1)]
         return standard_gumbel_quantiles
 
-
-    # def best_confidence_interval(self):
-    #     EurocodeConfidenceIntervalFromExtremes.from_estimator_extremes(self.best_estimator,
-    #                                                                    ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle,
-    #                                                                    temporal_covariate=np.array([2019, self.altitude_plot]),)
-
+    @property
+    def best_confidence_interval(self) -> EurocodeConfidenceIntervalFromExtremes:
+        return EurocodeConfidenceIntervalFromExtremes.from_estimator_extremes(self.best_estimator,
+                                                                       ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle,
+                                                                       coordinate=np.array(
+                                                                           [2019, self.altitude_plot]), )
diff --git a/projects/others/check_mcmc_convergence_for_return_levels/main_bayesian_mcmc.py b/projects/others/check_mcmc_convergence_for_return_levels/main_bayesian_mcmc.py
index 81818b43..429dcab6 100644
--- a/projects/others/check_mcmc_convergence_for_return_levels/main_bayesian_mcmc.py
+++ b/projects/others/check_mcmc_convergence_for_return_levels/main_bayesian_mcmc.py
@@ -107,7 +107,7 @@ def get_return_level_bayesian_example(nb_iterations_for_bayesian_fit):
                                                       nb_iterations_for_bayesian_fit=nb_iterations_for_bayesian_fit)
     return_level_bayesian = ExtractEurocodeReturnLevelFromMyBayesianExtremes(estimator=fitted_estimator,
                                                                              ci_method=ConfidenceIntervalMethodFromExtremes.my_bayes,
-                                                                             temporal_covariate=2019)
+                                                                             coordinate=2019)
     return return_level_bayesian
 
 
diff --git a/test/test_extreme_fit/test_estimator/test_spatio_temporal_estimator/test_gev_spatio_temporal_polynomial_extremes_mle.py b/test/test_extreme_fit/test_estimator/test_spatio_temporal_estimator/test_gev_spatio_temporal_polynomial_extremes_mle.py
index e29f7591..7959897d 100644
--- a/test/test_extreme_fit/test_estimator/test_spatio_temporal_estimator/test_gev_spatio_temporal_polynomial_extremes_mle.py
+++ b/test/test_extreme_fit/test_estimator/test_spatio_temporal_estimator/test_gev_spatio_temporal_polynomial_extremes_mle.py
@@ -14,6 +14,8 @@ from extreme_fit.model.margin_model.polynomial_margin_model.models_based_on_pari
 from extreme_fit.model.margin_model.polynomial_margin_model.polynomial_margin_model import \
     NonStationaryQuadraticLocationModel, \
     NonStationaryQuadraticScaleModel, NonStationaryQuadraticLocationGumbelModel, NonStationaryQuadraticScaleGumbelModel
+from extreme_fit.model.margin_model.polynomial_margin_model.utils import \
+    ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS
 from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \
     ConfidenceIntervalMethodFromExtremes
 from extreme_fit.model.result_from_model_fit.result_from_extremes.eurocode_return_level_uncertainties import \
@@ -76,45 +78,27 @@ class TestGevTemporalQuadraticExtremesMle(unittest.TestCase):
         self.assertAlmostEqual(estimator.result_from_model_fit.aic, estimator.aic())
         self.assertAlmostEqual(estimator.result_from_model_fit.bic, estimator.bic())
         # Assert we can compute the return level
-        covariate1_for_return_level = np.array([700, 0])
-        covariate2_for_return_level = np.array([700, 1000])
+        covariate1_for_return_level = np.array([500, 0])
+        covariate2_for_return_level = np.array([500, 50])
         covariate3_for_return_level = np.array([400, 0])
         coordinates = [covariate1_for_return_level, covariate2_for_return_level, covariate3_for_return_level]
         for coordinate in coordinates:
             EurocodeConfidenceIntervalFromExtremes.quantile_level = 0.98
             confidence_interval = EurocodeConfidenceIntervalFromExtremes.from_estimator_extremes(estimator,
                                                                                                  ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle,
-                                                                                                 temporal_covariate=coordinate)
+                                                                                                 coordinate=coordinate)
             gev_params = estimator.function_from_fit.get_params(coordinate)
-            # print(gev_params, coordinate)
             return_level = gev_params.return_level(return_period=50)
-            # print("my return level", return_level)
-            # print("their return level", confidence_interval.mean_estimate)
-            # print("diff", confidence_interval.mean_estimate - return_level)
-            # print('\n\n')
-            self.assertAlmostEqual(return_level, confidence_interval.mean_estimate)
-            self.assertFalse(np.isnan(confidence_interval.confidence_interval[0]))
-            self.assertFalse(np.isnan(confidence_interval.confidence_interval[1]))
-
-    def test_gev_spatio_temporal_margin_fit_1(self):
-        self.function_test_gev_spatio_temporal_margin_fit_non_stationary(StationaryAltitudinal)
-
-    #
-    def test_gev_spatio_temporal_margin_fit_1_bis(self):
-        self.function_test_gev_spatio_temporal_margin_fit_non_stationary(AltitudinalShapeLinearTimeStationary)
-
-    def test_gev_spatio_temporal_margin_fit_2(self):
-        # first model with both a time and altitude non stationarity
-        self.function_test_gev_spatio_temporal_margin_fit_non_stationary(
-            AltitudinalShapeConstantTimeLocationLinear)
-
-    # def test_gev_spatio_temporal_margin_fit_3(self):
-    #     self.function_test_gev_spatio_temporal_margin_fit_non_stationary(
-    #         AltitudinalShapeLinearTimeLocationLinear)
-    #
-    # def test_gev_spatio_temporal_margin_fit_4(self):
-    #     self.function_test_gev_spatio_temporal_margin_fit_non_stationary(
-    #         AltitudinalShapeLinearTimeLocScaleLinear)
+            if np.isnan(return_level) or np.isnan(confidence_interval.mean_estimate):
+                self.assertTrue(np.isnan(return_level) and np.isnan(confidence_interval.mean_estimate))
+            else:
+                self.assertAlmostEqual(return_level, confidence_interval.mean_estimate)
+                self.assertFalse(np.isnan(confidence_interval.confidence_interval[0]))
+                self.assertFalse(np.isnan(confidence_interval.confidence_interval[1]))
+
+    def test_gev_spatio_temporal_all(self):
+        for model_class in ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS:
+            self.function_test_gev_spatio_temporal_margin_fit_non_stationary(model_class)
 
 
 if __name__ == '__main__':
-- 
GitLab