Commit a2500f2e authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[projection swe] add test_ensemble_fit.py. start margin model with effect

parent 8497a037
No related merge requests found
Showing with 104 additions and 26 deletions
+104 -26
class AbstractMarginModelWithEffect(object):
pass
from extreme_fit.model.margin_model.linear_margin_model.margin_model_with_effect.abstract_margin_model_with_effect import \
AbstractMarginModelWithEffect
from extreme_fit.model.margin_model.polynomial_margin_model.gev_altitudinal_models import StationaryAltitudinal
class MarginModelWithGcmEffect(AbstractMarginModelWithEffect):
pass
class StationaryAltitudinalWithGCMEffect(MarginModelWithGcmEffect, StationaryAltitudinal):
pass
...@@ -56,27 +56,8 @@ class AbstractAltitudinalModel(AbstractSpatioTemporalPolynomialModel): ...@@ -56,27 +56,8 @@ class AbstractAltitudinalModel(AbstractSpatioTemporalPolynomialModel):
s = '0' s = '0'
else: else:
s = ','.join(l) s = ','.join(l)
# return '$ \\boldsymbol{ \\mathcal{M}_{%s} }$' % s
return '$ \\boldsymbol{%s}$' % s return '$ \\boldsymbol{%s}$' % s
# @property
# def name_str(self):
# name = ''
# for coordinate_name, idx in zip(['s', 't'], [self.coordinates.idx_x_coordinates, self.coordinates.idx_temporal_coordinates]):
# name += coordinate_name
# for param_name in GevParams.PARAM_NAMES:
# name += self.dim_to_str_number(param_name, idx)
# if isinstance(self, AbstractAddCrossTerm):
# name += 'sxt'
# for c in [AbstractAddCrossTermForLocation, AbstractAddCrossTermForScale, AbstractAddCrossTermForShape]:
# if isinstance(self, c):
# name += '1'
# else:
# name += '0'
# return name
class StationaryAltitudinal(AbstractAltitudinalModel): class StationaryAltitudinal(AbstractAltitudinalModel):
@property @property
......
...@@ -156,10 +156,11 @@ class VisualizerForProjectionEnsemble(object): ...@@ -156,10 +156,11 @@ class VisualizerForProjectionEnsemble(object):
for ensemble_fit in self.ensemble_fits(IndependentEnsembleFit): for ensemble_fit in self.ensemble_fits(IndependentEnsembleFit):
for gcm_rcm_couple in self.gcm_rcm_couples: for gcm_rcm_couple in self.gcm_rcm_couples:
visualizer = ensemble_fit.gcm_rcm_couple_to_visualizer[gcm_rcm_couple] visualizer = ensemble_fit.gcm_rcm_couple_to_visualizer[gcm_rcm_couple]
one_fold_fit = visualizer.massif_name_to_one_fold_fit[massif_name] if massif_name in visualizer.massif_name_to_one_fold_fit:
coef = one_fold_fit.best_coef(param_name, 0, degree) one_fold_fit = visualizer.massif_name_to_one_fold_fit[massif_name]
altitude = visualizer.altitude_group.reference_altitude coef = one_fold_fit.best_coef(param_name, 0, degree)
gcm_rcm_couple_to_data[gcm_rcm_couple].append((altitude, coef)) altitude = visualizer.altitude_group.reference_altitude
gcm_rcm_couple_to_data[gcm_rcm_couple].append((altitude, coef))
# Plot # Plot
ax = plt.gca() ax = plt.gca()
for gcm_rcm_couple, data in gcm_rcm_couple_to_data.items(): for gcm_rcm_couple, data in gcm_rcm_couple_to_data.items():
......
...@@ -41,7 +41,7 @@ def main(): ...@@ -41,7 +41,7 @@ def main():
study_class = AdamontSnowfall study_class = AdamontSnowfall
ensemble_fit_classes = [IndependentEnsembleFit, TogetherEnsembleFit][1:] ensemble_fit_classes = [IndependentEnsembleFit, TogetherEnsembleFit][1:]
temporal_covariate_for_fit = [TimeTemporalCovariate, temporal_covariate_for_fit = [TimeTemporalCovariate,
AnomalyTemperatureWithSplineTemporalCovariate][0] AnomalyTemperatureWithSplineTemporalCovariate][1]
set_seed_for_test() set_seed_for_test()
AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2 AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2
...@@ -61,8 +61,8 @@ def main(): ...@@ -61,8 +61,8 @@ def main():
AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10
altitudes_list = altitudes_for_groups[:1] altitudes_list = altitudes_for_groups[:1]
else: else:
massif_names = None massif_names = ['Vanoise']
altitudes_list = altitudes_for_groups[:] altitudes_list = altitudes_for_groups[3:]
assert isinstance(gcm_rcm_couples, list) assert isinstance(gcm_rcm_couples, list)
......
import unittest
from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario
from extreme_data.meteo_france_data.scm_models_data.altitudes_studies import AltitudesStudies
from extreme_fit.model.margin_model.linear_margin_model.margin_model_with_effect.margin_model_with_gcm_effect import \
StationaryAltitudinalWithGCMEffect
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_trend.ensemble_fit.together_ensemble_fit.together_ensemble_fit import TogetherEnsembleFit
from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import \
TimeTemporalCovariate
from spatio_temporal_dataset.coordinates.temporal_coordinates.temperature_covariate import \
AnomalyTemperatureWithSplineTemporalCovariate
class TestEnsembleFit(unittest.TestCase):
def setUp(self) -> None:
super().setUp()
self.altitudes = [1200, 1500, 1800]
self.massif_names = ["Vanoise"]
study_class = AdamontSnowfall
gcm_rcm_couples = [('CNRM-CM5', 'ALADIN53'), ('EC-EARTH', 'CCLM4-8-17')]
scenario = AdamontScenario.rcp85
self.gcm_rcm_couple_to_altitude_studies = {
c: AltitudesStudies(study_class, self.altitudes,
gcm_rcm_couple=c, scenario=scenario) for c in gcm_rcm_couples
}
def test_basic_ensemble_together_fit(self):
model_classes = [StationaryAltitudinal,
AltitudinalShapeConstantTimeLocationLinear,
AltitudinalShapeConstantTimeScaleLinear,
AltitudinalShapeConstantTimeLocScaleLinear
][:]
for temporal_covariate in [TimeTemporalCovariate,
AnomalyTemperatureWithSplineTemporalCovariate]:
ensemble_fit = TogetherEnsembleFit(massif_names=self.massif_names,
gcm_rcm_couple_to_altitude_studies=self.gcm_rcm_couple_to_altitude_studies,
models_classes=model_classes,
temporal_covariate_for_fit=temporal_covariate,
only_models_that_pass_goodness_of_fit_test=False)
_ = ensemble_fit.visualizer.massif_name_to_one_fold_fit[self.massif_names[0]].best_function_from_fit
self.assertTrue(True)
def test_ensembe_fit_with_effect(self):
model_classes = [StationaryAltitudinal,
StationaryAltitudinalWithGCMEffect][:1]
for temporal_covariate in [TimeTemporalCovariate,
AnomalyTemperatureWithSplineTemporalCovariate]:
ensemble_fit = TogetherEnsembleFit(massif_names=self.massif_names,
gcm_rcm_couple_to_altitude_studies=self.gcm_rcm_couple_to_altitude_studies,
models_classes=model_classes,
temporal_covariate_for_fit=temporal_covariate,
only_models_that_pass_goodness_of_fit_test=False)
model_class_to_estimator = ensemble_fit.visualizer.massif_name_to_one_fold_fit[self.massif_names[0]].model_class_to_estimator
model_class_to_expected_number_params = {
StationaryAltitudinal: 5,
StationaryAltitudinalWithGCMEffect: 6,
}
for model_class in model_classes:
expected = model_class_to_expected_number_params[model_class]
found = model_class_to_estimator[model_class].margin_model.nb_params
self.assertEqual(expected, found)
# _ = ensemble_fit.visualizer.massif_name_to_one_fold_fit[self.massif_names[0]].best_function_from_fit
self.assertTrue(True)
if __name__ == '__main__':
unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment