Forked from reversaal / OhmPi
Source project has a limited visibility.
main_eurocode_drawing.py 4.66 KiB
import time
from collections import OrderedDict

from experiment.eurocode_data.eurocode_visualizer import plot_model_name_to_dep_to_ordered_return_level_uncertainties
from experiment.eurocode_data.massif_name_to_departement import DEPARTEMENT_TYPES
from experiment.eurocode_data.utils import EUROCODE_ALTITUDES, LAST_YEAR_FOR_EUROCODE
from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSwe3Days
from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer import \
    AltitudeHypercubeVisualizer
from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \
    load_altitude_visualizer
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \
    NonStationaryLocationAndScaleTemporalModel
from root_utils import get_display_name_from_object_type

# Model class
import matplotlib as mpl

mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}']


def dep_to_ordered_return_level_uncertainties(model_class, last_year_for_the_data, altitudes):
    model_type = get_display_name_from_object_type(model_class).split('Stationary')[0] + 'Stationary'
    # model_name += ' 1958-' + str(last_year_for_the_data)
    is_non_stationary = model_type == 'NonStationary'
    model_symbol = '{\mu_1, \sigma_1}' if is_non_stationary else '0'
    parameter = ', 2017' if is_non_stationary else ''
    model_name = ' $ \widehat{q_{\\textrm{GEV}}(\\boldsymbol{\\theta_{\mathcal{M}_'
    model_name += model_symbol
    model_name += '}}'
    model_name += parameter
    model_name += ')}_{ \\textrm{MMSE}} $ ' + '({})'.format(model_type)
    # Load altitude visualizer
    altitude_visualizer = load_altitude_visualizer(AltitudeHypercubeVisualizer, altitudes=altitudes,
                                                   last_starting_year=None, nb_data_reduced_for_speed=False,
                                                   only_first_one=False, save_to_file=False,
                                                   exact_starting_year=1958,
                                                   first_starting_year=None,
                                                   study_classes=[CrocusSwe3Days],
                                                   trend_test_class=None)
    # Loop on the data
    assert isinstance(altitude_visualizer.tuple_to_study_visualizer, OrderedDict)
    dep_to_ordered_return_level_uncertainty = {dep: [] for dep in DEPARTEMENT_TYPES}
    for altitude, visualizer in altitude_visualizer.tuple_to_study_visualizer.items():
        print('{} processing altitude = {} '.format(model_name, altitude))
        dep_to_return_level_uncertainty = visualizer.dep_class_to_eurocode_level_uncertainty(model_class,
                                                                                             last_year_for_the_data)
        for dep, return_level_uncertainty in dep_to_return_level_uncertainty.items():
            dep_to_ordered_return_level_uncertainty[dep].append(return_level_uncertainty)

    return {model_name: dep_to_ordered_return_level_uncertainty}


def main_drawing():
    # Select parameters
    fast_plot = [True, False][1]
    model_class_and_last_year = [
                                    (StationaryTemporalModel, LAST_YEAR_FOR_EUROCODE),
                                    (StationaryTemporalModel, 2017),
                                    (NonStationaryLocationAndScaleTemporalModel, 2017),
                                ][1:]
    altitudes = EUROCODE_ALTITUDES[:]
    if fast_plot:
        model_class_and_last_year = model_class_and_last_year[:2]
        altitudes = altitudes[:2]

    model_name_to_dep_to_ordered_return_level = {}
    for model_class, last_year_for_the_data in model_class_and_last_year:
        start = time.time()
        model_name_to_dep_to_ordered_return_level.update(
            dep_to_ordered_return_level_uncertainties(model_class, last_year_for_the_data, altitudes))
        duration = time.time() - start
        print(model_class, duration)
    # Transform the dictionary into the desired format
    dep_to_model_name_to_ordered_return_level_uncertainties = {}
    for dep in DEPARTEMENT_TYPES:
        d2 = {model_name: model_name_to_dep_to_ordered_return_level[model_name][dep] for model_name in
              model_name_to_dep_to_ordered_return_level.keys()}
        dep_to_model_name_to_ordered_return_level_uncertainties[dep] = d2
    # Plot graph
    plot_model_name_to_dep_to_ordered_return_level_uncertainties(
        dep_to_model_name_to_ordered_return_level_uncertainties, altitudes, show=True)


if __name__ == '__main__':
    main_drawing()