diff --git a/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py index 3e15ae0daf6a17fde586d9f59c7c569b9db3089e..0cd6db0f92e69f0ebe0e45596ac65a27033d4586 100644 --- a/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py @@ -14,24 +14,23 @@ from projects.projected_snowfall.elevation_temporal_model_for_projections.ensemb class IndependentEnsembleFit(AbstractEnsembleFit): """For each gcm_rcm_couple, we create a OneFoldFit""" - def __init__(self, massif_names, gcm_rcm_couple_to_altitude_studies: Dict[Tuple[str, str], AltitudesStudies], models_classes, - fit_method=MarginFitMethod.extremes_fevd_mle, temporal_covariate_for_fit=None, only_models_that_pass_goodness_of_fit_test=True, - confidence_interval_based_on_delta_method=False): - super().__init__(massif_names, gcm_rcm_couple_to_altitude_studies, models_classes, fit_method, temporal_covariate_for_fit, only_models_that_pass_goodness_of_fit_test, - confidence_interval_based_on_delta_method) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # Set appropriate setting OneFoldFit.last_year = 2100 OneFoldFit.nb_years = 95 # Load a classical visualizer self.gcm_rcm_couple_to_visualizer = {} - for gcm_rcm_couple, studies in gcm_rcm_couple_to_altitude_studies.items(): + for gcm_rcm_couple, studies in self.gcm_rcm_couple_to_altitude_studies.items(): + print(gcm_rcm_couple) visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies, self.models_classes, False, self.massif_names, self.fit_method, self.temporal_covariate_for_fit, self.only_models_that_pass_goodness_of_fit_test, - self.confidence_interval_based_on_delta_method) + self.confidence_interval_based_on_delta_method, + self.remove_physically_implausible_models) self.gcm_rcm_couple_to_visualizer[gcm_rcm_couple] = visualizer # Assign max diff --git a/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py index 88dede3a05bef0fe531acbdd5737ddf163b025ae..7c30e4f745c3c20bbbe59b3b2a5bff071106277a 100644 --- a/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py @@ -44,17 +44,17 @@ def main(): set_seed_for_test() AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2 - fast = True + fast = False if fast is None: massif_names = None - gcm_rcm_couples = gcm_rcm_couples[:2] + gcm_rcm_couples = gcm_rcm_couples[1:2] AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 - altitudes_list = altitudes_for_groups[2:3] + altitudes_list = altitudes_for_groups[:2] elif fast: AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 - massif_names = ['Vanoise', 'Haute-Maurienne', 'Vercors'][:] - gcm_rcm_couples = gcm_rcm_couples[:2] - altitudes_list = altitudes_for_groups[1:2] + massif_names = None + gcm_rcm_couples = ('CNRM-CM5', 'CCLM4-8-17') + altitudes_list = altitudes_for_groups[:1] else: massif_names = None altitudes_list = altitudes_for_groups[:] @@ -83,7 +83,8 @@ def main_loop(gcm_rcm_couples, altitudes_list, massif_names, study_classes, ense massif_names=massif_names, temporal_covariate_for_fit=temporal_covariate_for_fit, confidence_interval_based_on_delta_method=False, - display_only_model_that_pass_gof_test=False + display_only_model_that_pass_gof_test=False, + remove_physically_implausible_models=True, ) visualizer.plot() del visualizer diff --git a/test/test_projects/test_altitude_spatial/test_one_fold_fit.py b/test/test_projects/test_altitude_spatial/test_one_fold_fit.py index 32ebd32b7f9578abdbce968bda3d62042c2e3425..33daf73f40f49f089d600a4bf3f659bc41aad89d 100644 --- a/test/test_projects/test_altitude_spatial/test_one_fold_fit.py +++ b/test/test_projects/test_altitude_spatial/test_one_fold_fit.py @@ -3,10 +3,13 @@ import unittest from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel from extreme_fit.model.margin_model.polynomial_margin_model.gev_altitudinal_models import StationaryAltitudinal from extreme_fit.model.margin_model.polynomial_margin_model.models_based_on_pariwise_analysis.gev_with_constant_shape_wrt_altitude import \ AltitudinalShapeConstantTimeLocationLinear, AltitudinalShapeConstantTimeScaleLinear, \ AltitudinalShapeConstantTimeLocScaleLinear +from extreme_fit.model.margin_model.polynomial_margin_model.utils import \ + ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.one_fold_fit import OneFoldFit from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import \ @@ -14,7 +17,6 @@ from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_ class TestOneFoldFit(unittest.TestCase): - pass def setUp(self) -> None: super().setUp() @@ -35,7 +37,8 @@ class TestOneFoldFit(unittest.TestCase): for study_class in [SafranSnowfall1Day, AdamontSnowfall][:]: dataset = self.load_dataset(study_class) one_fold_fit = OneFoldFit(self.massif_name, dataset, - models_classes=self.model_classes, temporal_covariate_for_fit=None) + models_classes=self.model_classes, temporal_covariate_for_fit=None, + only_models_that_pass_goodness_of_fit_test=False) _ = one_fold_fit.best_estimator.margin_model self.assertTrue(True) @@ -44,7 +47,8 @@ class TestOneFoldFit(unittest.TestCase): dataset = self.load_dataset(study_class) one_fold_fit = OneFoldFit(self.massif_name, dataset, models_classes=self.model_classes, - temporal_covariate_for_fit=TimeTemporalCovariate) + temporal_covariate_for_fit=TimeTemporalCovariate, + only_models_that_pass_goodness_of_fit_test=False) _ = one_fold_fit.best_estimator.margin_model self.assertTrue(True) @@ -53,10 +57,24 @@ class TestOneFoldFit(unittest.TestCase): dataset = self.load_dataset(study_class, scenario=AdamontScenario.rcp85) one_fold_fit = OneFoldFit(self.massif_name, dataset, models_classes=self.model_classes, - temporal_covariate_for_fit=AnomalyTemperatureTemporalCovariate) + temporal_covariate_for_fit=AnomalyTemperatureTemporalCovariate, + only_models_that_pass_goodness_of_fit_test=False) _ = one_fold_fit.best_estimator.margin_model self.assertTrue(True) + def test_remove_physically_implausible_models(self): + self.massif_name = "Aravis" + self.altitudes = [600, 900] + self.model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS + dataset = self.load_dataset(AdamontSnowfall, + scenario=AdamontScenario.rcp85, gcm_rcm_couple=('CNRM-CM5', 'CCLM4-8-17')) + one_fold_fit = OneFoldFit(self.massif_name, dataset, + models_classes=self.model_classes, + temporal_covariate_for_fit=None, + only_models_that_pass_goodness_of_fit_test=False, + remove_physically_implausible_models=True) + self.assertFalse(one_fold_fit.has_at_least_one_valid_model) + if __name__ == '__main__': unittest.main()