From 486ab59d45c828dd615e952b3a74d2f1a019fd29 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 16 Oct 2019 11:28:22 +0200
Subject: [PATCH] [EXTREME ESTIMATOR][MARGIN MODEL] refactor linear margin
 model folder organization. refactor names in univariate trend analysis

---
 .../utils_hypercube.py                        |   5 +-
 .../study_visualization/study_visualizer.py   |   7 +-
 .../stations_data/main_spatial_comparison.py  |   2 +-
 .../regression_margin/regression_margin.py    |   2 +-
 .../simulation/lin_space2_simulation.py       |   2 +-
 experiment/simulation/lin_space_simulation.py |   2 +-
 .../trend_analysis/non_stationary_trends.py   |   6 +-
 ...bstract_comparison_non_stationary_model.py |   8 +-
 .../abstract_gev_trend_test.py                |  57 +++++-----
 .../gev_trend_test_one_parameter.py           |   6 +-
 .../gev_trend_test_two_parameters.py          |   6 +-
 .../trend_analysis/univariate_test/utils.py   |  10 +-
 .../estimator/abstract_estimator.py           |   5 +-
 .../full_estimator/abstract_full_estimator.py |   2 +-
 .../full_estimator_for_simulation.py          |   2 +-
 .../abstract_margin_estimator.py              |   5 +-
 .../margin_estimator_for_simulation.py        |   2 +-
 .../linear_margin_model/__init__.py           |   0
 .../abstract_temporal_linear_margin_model.py  |  68 ++++++++++++
 .../linear_margin_model.py                    |   0
 .../temporal_linear_margin_models.py          |  65 +++++++++++
 .../temporal_linear_margin_model.py           | 103 ------------------
 .../extreme_models/result_from_fit.py         |  42 +++++++
 .../test_margin_function.py                   |   2 +-
 .../test_extreme_models/test_margin_model.py  |   9 +-
 .../test_margin_temporal.py                   |   2 +-
 .../test_margin_temporal_transformed.py       |   2 +-
 .../test_max_stable_temporal.py               |   2 +-
 .../test_gev/test_gev_temporal.py             |   2 +-
 .../test_dataset.py                           |   3 +-
 .../test_slicer.py                            |   2 +-
 .../test_fitmaxstab_with_margin.py            |   2 +-
 .../test_rmaxstab_with_margin.py              |   2 +-
 test/test_utils.py                            |   4 +-
 utils.py                                      |   3 +
 35 files changed, 253 insertions(+), 189 deletions(-)
 create mode 100644 extreme_estimator/extreme_models/margin_model/linear_margin_model/__init__.py
 create mode 100644 extreme_estimator/extreme_models/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py
 rename extreme_estimator/extreme_models/margin_model/{ => linear_margin_model}/linear_margin_model.py (100%)
 create mode 100644 extreme_estimator/extreme_models/margin_model/linear_margin_model/temporal_linear_margin_models.py
 delete mode 100644 extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py

diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/utils_hypercube.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/utils_hypercube.py
index 267d4e35..608b4842 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/utils_hypercube.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/utils_hypercube.py
@@ -12,7 +12,8 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat
 from utils import get_display_name_from_object_type
 
 
-def load_quantity_visualizer(quantity_hypercube_class, altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one,
+def load_quantity_visualizer(quantity_hypercube_class, altitudes, last_starting_year, nb_data_reduced_for_speed,
+                             only_first_one,
                              save_to_file, study_classes, trend_test_class):
     visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
                    for study in study_iterator_global(study_classes=study_classes, only_first_one=only_first_one,
@@ -47,7 +48,7 @@ def load_altitude_visualizer(altitude_hypercube_class, altitudes, last_starting_
                                           last_starting_year=last_starting_year,
                                           first_starting_year=first_starting_year,
                                           exact_starting_year=exact_starting_year,
-                                            verbose=verbose,
+                                          verbose=verbose,
                                           )
     assert isinstance(visualizer, AltitudeHypercubeVisualizer)
     return visualizer
diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
index faa2ef59..be39035a 100644
--- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
+++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py
@@ -1,12 +1,10 @@
 import os
 import os.path as op
 from collections import OrderedDict
-from multiprocessing.pool import Pool
 from random import sample, seed
 from typing import Dict
 
 import math
-import matplotlib
 import matplotlib.pyplot as plt
 import numpy as np
 import pandas as pd
@@ -15,7 +13,6 @@ import seaborn as sns
 from experiment.meteo_france_data.scm_models_data.abstract_extended_study import AbstractExtendedStudy
 from experiment.trend_analysis.abstract_score import MeanScore, AbstractTrendScore
 from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
-from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
 from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest
 from experiment.trend_analysis.non_stationary_trends import \
     ConditionalIndedendenceLocationTrendTest, MaxStableLocationTrendTest, IndependenceLocationTrendTest
@@ -25,7 +22,7 @@ from experiment.utils import average_smoothing_with_sliding_window
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \
     FullEstimatorInASingleStepWithSmoothMargin
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
     LinearStationaryMarginModel
 from extreme_estimator.extreme_models.margin_model.margin_function.abstract_margin_function import \
     AbstractMarginFunction
@@ -46,7 +43,7 @@ from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima
 from test.test_utils import load_test_max_stable_models
 from utils import get_display_name_from_object_type, VERSION_TIME, float_to_str_with_only_some_significant_digits, \
-    cached_property, NB_CORES
+    cached_property
 
 BLOCK_MAXIMA_DISPLAY_NAME = 'block maxima '
 
diff --git a/experiment/meteo_france_data/stations_data/main_spatial_comparison.py b/experiment/meteo_france_data/stations_data/main_spatial_comparison.py
index 592c4750..36f6dc46 100644
--- a/experiment/meteo_france_data/stations_data/main_spatial_comparison.py
+++ b/experiment/meteo_france_data/stations_data/main_spatial_comparison.py
@@ -1,5 +1,5 @@
 from experiment.meteo_france_data.stations_data.comparison_analysis import ComparisonAnalysis
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
 from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \
     BetweenZeroAndOneNormalization
 from utils import get_display_name_from_object_type
diff --git a/experiment/regression_margin/regression_margin.py b/experiment/regression_margin/regression_margin.py
index 31a65482..18cc9a57 100644
--- a/experiment/regression_margin/regression_margin.py
+++ b/experiment/regression_margin/regression_margin.py
@@ -2,7 +2,7 @@ import numpy as np
 
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import FullEstimatorInASingleStepWithSmoothMargin
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
     ConstantMarginModel
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
diff --git a/experiment/simulation/lin_space2_simulation.py b/experiment/simulation/lin_space2_simulation.py
index b25c00b8..271501de 100644
--- a/experiment/simulation/lin_space2_simulation.py
+++ b/experiment/simulation/lin_space2_simulation.py
@@ -2,7 +2,7 @@ from experiment.simulation.abstract_simulation import AbstractSimulation
 from extreme_estimator.estimator.full_estimator.full_estimator_for_simulation import FULL_ESTIMATORS_FOR_SIMULATION
 from extreme_estimator.estimator.margin_estimator.margin_estimator_for_simulation import \
     MARGIN_ESTIMATORS_FOR_SIMULATION
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import ConstantMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import ConstantMarginModel
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_1D import LinSpaceSpatialCoordinates
diff --git a/experiment/simulation/lin_space_simulation.py b/experiment/simulation/lin_space_simulation.py
index b00ec2d7..4a30b96e 100644
--- a/experiment/simulation/lin_space_simulation.py
+++ b/experiment/simulation/lin_space_simulation.py
@@ -1,5 +1,5 @@
 from experiment.simulation.abstract_simulation import AbstractSimulation
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import ConstantMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import ConstantMarginModel
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_1D import LinSpaceSpatialCoordinates
diff --git a/experiment/trend_analysis/non_stationary_trends.py b/experiment/trend_analysis/non_stationary_trends.py
index e1eecad9..0334c3c2 100644
--- a/experiment/trend_analysis/non_stationary_trends.py
+++ b/experiment/trend_analysis/non_stationary_trends.py
@@ -10,11 +10,11 @@ from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \
     FullEstimatorInASingleStepWithSmoothMargin, AbstractFullEstimator
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator, \
     AbstractMarginEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import \
     LinearStationaryMarginModel, LinearNonStationaryLocationMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
+    StationaryStationModel, NonStationaryLocationStationModel
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import StationaryStationModel, \
-    NonStationaryLocationStationModel
 from extreme_estimator.extreme_models.utils import OptimizationConstants
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 from utils import get_display_name_from_object_type
diff --git a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py b/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
index c9fb5671..9bff527b 100644
--- a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
+++ b/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
@@ -1,7 +1,7 @@
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
 from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \
-    NonStationaryLocationAndScaleModel, NonStationaryLocationStationModel, NonStationaryScaleStationModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
+    NonStationaryLocationStationModel, NonStationaryScaleStationModel
 import numpy as np
 
 
@@ -28,10 +28,10 @@ class AbstractComparisonNonStationaryModelOneParameter(AbstractComparisonNonStat
 class ComparisonAgainstMu(AbstractComparisonNonStationaryModelOneParameter, GevLocationAndScaleTrendTest):
 
     def __init__(self, years, maxima, starting_year):
-        super().__init__(years, maxima, starting_year, stationary_model_class=NonStationaryLocationStationModel)
+        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryLocationStationModel)
 
 
 class ComparisonAgainstSigma(AbstractComparisonNonStationaryModelOneParameter, GevLocationAndScaleTrendTest):
 
     def __init__(self, years, maxima, starting_year):
-        super().__init__(years, maxima, starting_year, stationary_model_class=NonStationaryScaleStationModel)
+        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryScaleStationModel)
diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
index 1db2c6ee..f9a59b27 100644
--- a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
+++ b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
@@ -5,9 +5,9 @@ from scipy.stats import chi2
 
 from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.param_function.linear_coef import LinearCoef
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import StationaryStationModel, \
-    NonStationaryLocationStationModel, NonStationaryScaleStationModel, NonStationaryShapeStationModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import AbstractTemporalLinearMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
+    StationaryStationModel
 from extreme_estimator.extreme_models.utils import SafeRunException
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
@@ -26,25 +26,26 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     quantile_for_strength = 0.98
     nb_years_for_quantile_evolution = 10
 
-    def __init__(self, years, maxima, starting_year, non_stationary_model_class, stationary_model_class=StationaryStationModel):
+    def __init__(self, years, maxima, starting_year, unconstrained_model_class, constrained_model_class=StationaryStationModel,
+                 fit_method=AbstractTemporalLinearMarginModel.ISMEV_GEV_FIT_METHOD_STR):
         super().__init__(years, maxima, starting_year)
+        self.fit_method = fit_method
+        # Load observations, coordinates and datasets
         df = pd.DataFrame({AbstractCoordinates.COORDINATE_T: years})
         df_maxima_gev = pd.DataFrame(maxima, index=df.index)
         observations = AbstractSpatioTemporalObservations(df_maxima_gev=df_maxima_gev)
-        self.coordinates = AbstractTemporalCoordinates.from_df(df,
-                                                               transformation_class=CenteredScaledNormalization)  # type: AbstractTemporalCoordinates
+        self.coordinates = AbstractTemporalCoordinates.from_df(df, transformation_class=CenteredScaledNormalization)
         self.dataset = AbstractDataset(observations=observations, coordinates=self.coordinates)
 
         try:
-            # todo: rename stationary -> standard, non-stationary -> more complex model
-            # Fit stationary model
-            stationary_model = stationary_model_class(self.coordinates, starting_point=self.starting_year)
-            self.stationary_estimator = LinearMarginEstimator(self.dataset, stationary_model)
-            self.stationary_estimator.fit()
-            # Fit non stationary model
-            non_stationary_model = non_stationary_model_class(self.coordinates, starting_point=self.starting_year)
-            self.non_stationary_estimator = LinearMarginEstimator(self.dataset, non_stationary_model)
-            self.non_stationary_estimator.fit()
+            # Fit constrained model
+            constrained_model = constrained_model_class(self.coordinates, starting_point=self.starting_year, fit_method=self.fit_method)
+            self.constrained_estimator = LinearMarginEstimator(self.dataset, constrained_model)
+            self.constrained_estimator.fit()
+            # Fit unconstrained model
+            unconstrained_model = unconstrained_model_class(self.coordinates, starting_point=self.starting_year, fit_method=self.fit_method)
+            self.unconstrained_estimator = LinearMarginEstimator(self.dataset, unconstrained_model)
+            self.unconstrained_estimator.fit()
             self.crashed = False
         except SafeRunException:
             self.crashed = True
@@ -81,28 +82,28 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
 
     @property
     def likelihood_ratio(self):
-        return self.non_stationary_deviance - self.stationary_deviance
+        return self.unconstrained_model_deviance - self.constrained_model_deviance
 
     @property
-    def stationary_deviance(self):
+    def constrained_model_deviance(self):
         if self.crashed:
             return np.nan
         else:
-            return self.stationary_estimator.result_from_fit.deviance
+            return self.constrained_estimator.result_from_fit.deviance
 
     @property
-    def non_stationary_deviance(self):
+    def unconstrained_model_deviance(self):
         if self.crashed:
             return np.nan
         else:
-            return self.non_stationary_estimator.result_from_fit.deviance
+            return self.unconstrained_estimator.result_from_fit.deviance
 
     @property
-    def non_stationary_nllh(self):
+    def unconstained_nllh(self):
         if self.crashed:
             return np.nan
         else:
-            return self.non_stationary_estimator.result_from_fit.nllh
+            return self.unconstrained_estimator.result_from_fit.nllh
 
     # Evolution of the GEV parameters and corresponding quantiles
 
@@ -111,20 +112,20 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         return np.sign(self.test_trend_slope_strength)
 
     def get_non_stationary_linear_coef(self, gev_param_name: str):
-        return self.non_stationary_estimator.margin_function_fitted.get_coef(gev_param_name,
-                                                                             AbstractCoordinates.COORDINATE_T)
+        return self.unconstrained_estimator.margin_function_fitted.get_coef(gev_param_name,
+                                                                            AbstractCoordinates.COORDINATE_T)
 
     @cached_property
     def non_stationary_constant_gev_params(self) -> GevParams:
         # Constant parameters correspond to the gev params in 1958
-        return self.non_stationary_estimator.margin_function_fitted.get_gev_params(coordinate=np.array([1958]),
-                                                                                   is_transformed=False)
+        return self.unconstrained_estimator.margin_function_fitted.get_gev_params(coordinate=np.array([1958]),
+                                                                                  is_transformed=False)
 
     @cached_property
     def stationary_constant_gev_params(self) -> GevParams:
         # Constant parameters correspond to any gev params
-        return self.stationary_estimator.margin_function_fitted.get_gev_params(coordinate=np.array([1958]),
-                                                                                   is_transformed=False)
+        return self.constrained_estimator.margin_function_fitted.get_gev_params(coordinate=np.array([1958]),
+                                                                                is_transformed=False)
 
 
     @property
diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
index f4582a5b..f2628318 100644
--- a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
+++ b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
@@ -1,13 +1,13 @@
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
     NonStationaryLocationStationModel, NonStationaryScaleStationModel, NonStationaryShapeStationModel
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 
 
 class GevTrendTestOneParameter(AbstractGevTrendTest):
 
-    def __init__(self, years, maxima, starting_year, non_stationary_model_class, gev_param_name):
-        super().__init__(years, maxima, starting_year, non_stationary_model_class)
+    def __init__(self, years, maxima, starting_year, unconstrained_model_class, gev_param_name):
+        super().__init__(years, maxima, starting_year, unconstrained_model_class)
         self.gev_param_name = gev_param_name
 
     @property
diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
index c2b0cbca..84db815a 100644
--- a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
+++ b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
@@ -1,5 +1,5 @@
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
     NonStationaryLocationAndScaleModel, StationaryStationModel
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 
@@ -13,9 +13,9 @@ class GevTrendTestTwoParameters(AbstractGevTrendTest):
 
 class GevLocationAndScaleTrendTest(GevTrendTestTwoParameters):
 
-    def __init__(self, years, maxima, starting_year, stationary_model_class=StationaryStationModel):
+    def __init__(self, years, maxima, starting_year, constrained_model_class=StationaryStationModel):
         super().__init__(years, maxima, starting_year,
-                         NonStationaryLocationAndScaleModel, stationary_model_class=stationary_model_class)
+                         NonStationaryLocationAndScaleModel, constrained_model_class=constrained_model_class)
 
     @property
     def mu1(self):
diff --git a/experiment/trend_analysis/univariate_test/utils.py b/experiment/trend_analysis/univariate_test/utils.py
index 18e3aafe..4574992d 100644
--- a/experiment/trend_analysis/univariate_test/utils.py
+++ b/experiment/trend_analysis/univariate_test/utils.py
@@ -3,20 +3,22 @@ from multiprocessing.pool import Pool
 import numpy as np
 
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
+    AbstractTemporalLinearMarginModel
 from utils import NB_CORES
 
 
-def compute_gev_change_point_test_result(smooth_maxima, starting_year, trend_test_class, years):
+def compute_gev_change_point_test_result(smooth_maxima, starting_year, trend_test_class, years, fit_method=AbstractTemporalLinearMarginModel.ISMEV_GEV_FIT_METHOD_STR):
     trend_test = trend_test_class(years, smooth_maxima, starting_year)  # type: AbstractGevTrendTest
     assert isinstance(trend_test, AbstractGevTrendTest)
     return trend_test.test_trend_type, \
            trend_test.test_trend_slope_strength, \
-           trend_test.non_stationary_nllh, \
+           trend_test.unconstained_nllh, \
            trend_test.test_trend_constant_quantile, \
            trend_test.mean_difference_same_sign_as_slope_strenght, \
            trend_test.variance_difference_same_sign_as_slope_strenght, \
-           trend_test.non_stationary_deviance, \
-           trend_test.stationary_deviance
+           trend_test.unconstrained_model_deviance, \
+           trend_test.constrained_model_deviance
 
 
 def compute_gev_change_point_test_results(multiprocessing, maxima, starting_years, trend_test_class,
diff --git a/extreme_estimator/estimator/abstract_estimator.py b/extreme_estimator/estimator/abstract_estimator.py
index 73f453ea..ae736464 100644
--- a/extreme_estimator/estimator/abstract_estimator.py
+++ b/extreme_estimator/estimator/abstract_estimator.py
@@ -1,13 +1,10 @@
 import time
 
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearMarginModel
-from extreme_estimator.extreme_models.margin_model.margin_function.parametric_margin_function import \
-    ParametricMarginFunction
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from extreme_estimator.extreme_models.result_from_fit import ResultFromFit
 from extreme_estimator.extreme_models.margin_model.margin_function.abstract_margin_function import \
     AbstractMarginFunction
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
-from extreme_estimator.extreme_models.margin_model.param_function.linear_coef import LinearCoef
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
 
diff --git a/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py b/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
index 38b59b5b..cdce4f7b 100644
--- a/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
+++ b/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
@@ -3,7 +3,7 @@ from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator impo
 from extreme_estimator.estimator.max_stable_estimator.abstract_max_stable_estimator import MaxStableEstimator
 from extreme_estimator.extreme_models.margin_model.abstract_margin_model import AbstractMarginModel
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model import AbstractMaxStableModel
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
diff --git a/extreme_estimator/estimator/full_estimator/full_estimator_for_simulation.py b/extreme_estimator/estimator/full_estimator/full_estimator_for_simulation.py
index dd436b01..811db6d3 100644
--- a/extreme_estimator/estimator/full_estimator/full_estimator_for_simulation.py
+++ b/extreme_estimator/estimator/full_estimator/full_estimator_for_simulation.py
@@ -1,6 +1,6 @@
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \
     FullEstimatorInASingleStepWithSmoothMargin
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
     ConstantMarginModel
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
diff --git a/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
index 220d4b57..03aa7d4b 100644
--- a/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
+++ b/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
@@ -1,10 +1,7 @@
 from abc import ABC
 
 from extreme_estimator.estimator.abstract_estimator import AbstractEstimator
-from extreme_estimator.extreme_models.margin_model.margin_function.abstract_margin_function import \
-    AbstractMarginFunction
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearMarginModel, \
-    LinearAllParametersAllDimsMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
diff --git a/extreme_estimator/estimator/margin_estimator/margin_estimator_for_simulation.py b/extreme_estimator/estimator/margin_estimator/margin_estimator_for_simulation.py
index 0737759e..311fba79 100644
--- a/extreme_estimator/estimator/margin_estimator/margin_estimator_for_simulation.py
+++ b/extreme_estimator/estimator/margin_estimator/margin_estimator_for_simulation.py
@@ -1,5 +1,5 @@
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
     ConstantMarginModel
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
diff --git a/extreme_estimator/extreme_models/margin_model/linear_margin_model/__init__.py b/extreme_estimator/extreme_models/margin_model/linear_margin_model/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/extreme_estimator/extreme_models/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py b/extreme_estimator/extreme_models/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py
new file mode 100644
index 00000000..5f3eefff
--- /dev/null
+++ b/extreme_estimator/extreme_models/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py
@@ -0,0 +1,68 @@
+import numpy as np
+import pandas as pd
+
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
+from extreme_estimator.extreme_models.result_from_fit import ResultFromFit, ResultFromIsmev, ResultFromExtremes
+from extreme_estimator.extreme_models.utils import r, ro, get_null
+from extreme_estimator.extreme_models.utils import safe_run_r_estimator
+from extreme_estimator.margin_fits.gev.gev_params import GevParams
+from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
+
+
+class AbstractTemporalLinearMarginModel(LinearMarginModel):
+    """Linearity only with respect to the temporal coordinates"""
+    ISMEV_GEV_FIT_METHOD_STR = 'isMev.gev.fit'
+    EXTREMES_FEVD_BAYESIAN_FIT_METHOD_STR = 'extRemes.fevd.Bayesian'
+
+    def __init__(self, coordinates: AbstractCoordinates, use_start_value=False, params_start_fit=None,
+                 params_sample=None, starting_point=None, fit_method='isMev.gev.fit'):
+        super().__init__(coordinates, use_start_value, params_start_fit, params_sample, starting_point)
+        assert fit_method in [self.ISMEV_GEV_FIT_METHOD_STR, self.EXTREMES_FEVD_BAYESIAN_FIT_METHOD_STR]
+        self.fit_method = fit_method
+
+    def fitmargin_from_maxima_gev(self, data: np.ndarray, df_coordinates_spat: pd.DataFrame,
+                                  df_coordinates_temp: pd.DataFrame) -> ResultFromFit:
+        assert data.shape[1] == len(df_coordinates_temp.values)
+        if self.fit_method == self.ISMEV_GEV_FIT_METHOD_STR:
+            return self.ismev_gev_fit(data, df_coordinates_temp)
+        if self.fit_method == self.EXTREMES_FEVD_BAYESIAN_FIT_METHOD_STR:
+            return self.extremes_fevd_bayesian_fit(data, df_coordinates_temp)
+
+    # Gev Fit with isMev package
+
+    def ismev_gev_fit(self, data: np.ndarray, df_coordinates_temp: pd.DataFrame) -> ResultFromIsmev:
+        res = safe_run_r_estimator(function=r('gev.fit'), use_start=self.use_start_value,
+                                   xdat=ro.FloatVector(data[0]), y=df_coordinates_temp.values, mul=self.mul,
+                                   sigl=self.sigl, shl=self.shl)
+        return ResultFromIsmev(res, self.margin_function_start_fit.gev_param_name_to_dims)
+
+    # Gev fit with extRemes package
+
+    def extremes_fevd_bayesian_fit(self, data, df_coordinates_temp) -> ResultFromExtremes:
+        res = safe_run_r_estimator(function=r('fevd_fixed'), use_start=self.use_start_value,
+                                   xdat=ro.FloatVector(data[0]), y=df_coordinates_temp.values, mul=self.mul,
+                                   sigl=self.sigl, shl=self.shl)
+        return ResultFromExtremes(res, self.margin_function_start_fit.gev_param_name_to_dims)
+
+    # Default arguments for all methods
+
+    @property
+    def mul(self):
+        return get_null()
+
+    @property
+    def sigl(self):
+        return get_null()
+
+    @property
+    def shl(self):
+        return get_null()
+
+    @property
+    def siglink(self):
+        return r('identity')
+
+
+
+
+
diff --git a/extreme_estimator/extreme_models/margin_model/linear_margin_model.py b/extreme_estimator/extreme_models/margin_model/linear_margin_model/linear_margin_model.py
similarity index 100%
rename from extreme_estimator/extreme_models/margin_model/linear_margin_model.py
rename to extreme_estimator/extreme_models/margin_model/linear_margin_model/linear_margin_model.py
diff --git a/extreme_estimator/extreme_models/margin_model/linear_margin_model/temporal_linear_margin_models.py b/extreme_estimator/extreme_models/margin_model/linear_margin_model/temporal_linear_margin_models.py
new file mode 100644
index 00000000..fb7eaf39
--- /dev/null
+++ b/extreme_estimator/extreme_models/margin_model/linear_margin_model/temporal_linear_margin_models.py
@@ -0,0 +1,65 @@
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
+    AbstractTemporalLinearMarginModel
+from extreme_estimator.extreme_models.utils import r
+from extreme_estimator.margin_fits.gev.gev_params import GevParams
+
+
+class StationaryStationModel(AbstractTemporalLinearMarginModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({})
+
+
+class NonStationaryLocationStationModel(AbstractTemporalLinearMarginModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({GevParams.LOC: [self.coordinates.idx_temporal_coordinates]})
+
+    @property
+    def mul(self):
+        return 1
+
+
+class NonStationaryScaleStationModel(AbstractTemporalLinearMarginModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
+
+    @property
+    def sigl(self):
+        return 1
+
+
+class NonStationaryLogScaleStationModel(NonStationaryScaleStationModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
+
+    @property
+    def siglink(self):
+        return r('exp')
+
+
+class NonStationaryShapeStationModel(AbstractTemporalLinearMarginModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({GevParams.SHAPE: [self.coordinates.idx_temporal_coordinates]})
+
+    @property
+    def shl(self):
+        return 1
+
+
+class NonStationaryLocationAndScaleModel(AbstractTemporalLinearMarginModel):
+
+    def load_margin_functions(self, gev_param_name_to_dims=None):
+        super().load_margin_functions({GevParams.LOC: [self.coordinates.idx_temporal_coordinates],
+                                       GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
+
+    @property
+    def mul(self):
+        return 1
+
+    @property
+    def sigl(self):
+        return 1
\ No newline at end of file
diff --git a/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py b/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py
deleted file mode 100644
index 156558e1..00000000
--- a/extreme_estimator/extreme_models/margin_model/temporal_linear_margin_model.py
+++ /dev/null
@@ -1,103 +0,0 @@
-import numpy as np
-import pandas as pd
-
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearMarginModel
-from extreme_estimator.extreme_models.result_from_fit import ResultFromFit, ResultFromIsmev
-from extreme_estimator.extreme_models.utils import r, ro, get_null
-from extreme_estimator.extreme_models.utils import safe_run_r_estimator
-from extreme_estimator.margin_fits.gev.gev_params import GevParams
-from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
-
-
-class TemporalLinearMarginModel(LinearMarginModel):
-    # Linearity only with respect to the temporal coordinates
-
-    def __init__(self, coordinates: AbstractCoordinates, use_start_value=False, params_start_fit=None,
-                 params_sample=None, starting_point=None):
-        super().__init__(coordinates, use_start_value, params_start_fit, params_sample, starting_point)
-
-    def fitmargin_from_maxima_gev(self, data: np.ndarray, df_coordinates_spat: pd.DataFrame,
-                                  df_coordinates_temp: pd.DataFrame) -> ResultFromFit:
-        # Gev Fit with isMev package
-        assert data.shape[1] == len(df_coordinates_temp.values)
-        res = safe_run_r_estimator(function=r('gev.fit'), use_start=self.use_start_value,
-                                   xdat=ro.FloatVector(data[0]), y=df_coordinates_temp.values, mul=self.mul,
-                                   sigl=self.sigl, shl=self.shl)
-        return ResultFromIsmev(res, self.margin_function_start_fit.gev_param_name_to_dims)
-
-    @property
-    def mul(self):
-        return get_null()
-
-    @property
-    def sigl(self):
-        return get_null()
-
-    @property
-    def shl(self):
-        return get_null()
-
-    @property
-    def siglink(self):
-        return r('identity')
-
-
-class StationaryStationModel(TemporalLinearMarginModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({})
-
-
-class NonStationaryLocationStationModel(TemporalLinearMarginModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({GevParams.LOC: [self.coordinates.idx_temporal_coordinates]})
-
-    @property
-    def mul(self):
-        return 1
-
-
-class NonStationaryScaleStationModel(TemporalLinearMarginModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
-
-    @property
-    def sigl(self):
-        return 1
-
-
-class NonStationaryLogScaleStationModel(NonStationaryScaleStationModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
-
-    @property
-    def siglink(self):
-        return r('exp')
-
-
-class NonStationaryShapeStationModel(TemporalLinearMarginModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({GevParams.SHAPE: [self.coordinates.idx_temporal_coordinates]})
-
-    @property
-    def shl(self):
-        return 1
-
-
-class NonStationaryLocationAndScaleModel(TemporalLinearMarginModel):
-
-    def load_margin_functions(self, gev_param_name_to_dims=None):
-        super().load_margin_functions({GevParams.LOC: [self.coordinates.idx_temporal_coordinates],
-                                       GevParams.SCALE: [self.coordinates.idx_temporal_coordinates]})
-
-    @property
-    def mul(self):
-        return 1
-
-    @property
-    def sigl(self):
-        return 1
diff --git a/extreme_estimator/extreme_models/result_from_fit.py b/extreme_estimator/extreme_models/result_from_fit.py
index c3170e18..212ce05f 100644
--- a/extreme_estimator/extreme_models/result_from_fit.py
+++ b/extreme_estimator/extreme_models/result_from_fit.py
@@ -92,6 +92,48 @@ class ResultFromIsmev(ResultFromFit):
         return convertFloatVector_to_float(self.name_to_value['conv']) == 0
 
 
+class ResultFromExtremes(ResultFromFit):
+
+    def __init__(self, result_from_fit: robjects.ListVector, gev_param_name_to_dim=None) -> None:
+        super().__init__(result_from_fit)
+        self.gev_param_name_to_dim = gev_param_name_to_dim
+
+    @property
+    def margin_coef_dict(self):
+        assert self.gev_param_name_to_dim is not None
+        # Build the Coeff dict from gev_param_name_to_dim
+        coef_dict = {}
+        i = 0
+        mle_values = self.name_to_value['mle']
+        for gev_param_name in GevParams.PARAM_NAMES:
+            # Add intercept
+            intercept_coef_name = LinearCoef.coef_template_str(gev_param_name, LinearCoef.INTERCEPT_NAME).format(1)
+            coef_dict[intercept_coef_name] = mle_values[i]
+            i += 1
+            # Add a potential linear temporal trend
+            if gev_param_name in self.gev_param_name_to_dim:
+                temporal_coef_name = LinearCoef.coef_template_str(gev_param_name,
+                                                                  AbstractCoordinates.COORDINATE_T).format(1)
+                coef_dict[temporal_coef_name] = mle_values[i]
+                i += 1
+        return coef_dict
+
+    @property
+    def all_parameters(self):
+        return self.margin_coef_dict
+
+    @property
+    def nllh(self):
+        return convertFloatVector_to_float(self.name_to_value['nllh'])
+
+    @property
+    def deviance(self):
+        return - 2 * self.nllh
+
+    @property
+    def convergence(self) -> str:
+        return convertFloatVector_to_float(self.name_to_value['conv']) == 0
+
 class ResultFromSpatialExtreme(ResultFromFit):
     """
     Handler from any result with the result of a fit functions from the package Spatial Extreme
diff --git a/test/test_extreme_estimator/test_extreme_models/test_margin_function.py b/test/test_extreme_estimator/test_extreme_models/test_margin_function.py
index 56722109..1d1fd8ea 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_margin_function.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_margin_function.py
@@ -2,7 +2,7 @@ import unittest
 
 import numpy as np
 
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
 from extreme_estimator.extreme_models.margin_model.margin_function.abstract_margin_function import \
     AbstractMarginFunction
 from extreme_estimator.extreme_models.margin_model.margin_function.linear_margin_function import LinearMarginFunction
diff --git a/test/test_extreme_estimator/test_extreme_models/test_margin_model.py b/test/test_extreme_estimator/test_extreme_models/test_margin_model.py
index f317c22a..e146af2c 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_margin_model.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_margin_model.py
@@ -1,12 +1,7 @@
 import unittest
 
-import numpy as np
-
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
-from extreme_estimator.extreme_models.margin_model.margin_function.abstract_margin_function import \
-    AbstractMarginFunction
-from extreme_estimator.extreme_models.margin_model.spline_margin_model import ConstantSplineMarginModel, \
-    SplineMarginModel, Degree1SplineMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel
+from extreme_estimator.extreme_models.margin_model.spline_margin_model import Degree1SplineMarginModel
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
 from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_1D import LinSpaceSpatialCoordinates
 from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_2D import LinSpaceSpatial2DCoordinates
diff --git a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py
index 17bb019a..affe7ad8 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py
@@ -3,7 +3,7 @@ import unittest
 import numpy as np
 
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
     LinearStationaryMarginModel
 from extreme_estimator.extreme_models.utils import set_seed_for_test
 from spatio_temporal_dataset.dataset.simulation_dataset import MarginDataset
diff --git a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal_transformed.py b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal_transformed.py
index df2e0b1c..d3a9ca08 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal_transformed.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal_transformed.py
@@ -3,7 +3,7 @@ import unittest
 import numpy as np
 
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
     LinearStationaryMarginModel
 from extreme_estimator.extreme_models.utils import set_seed_for_test
 from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_spatio_temporal_coordinates import \
diff --git a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
index e0b4c08a..c48667bd 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
@@ -4,7 +4,7 @@ import numpy as np
 
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \
     FullEstimatorInASingleStepWithSmoothMargin
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel, \
     LinearStationaryMarginModel
 from extreme_estimator.extreme_models.utils import set_seed_for_test
 from spatio_temporal_dataset.dataset.simulation_dataset import FullSimulatedDataset
diff --git a/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py b/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py
index f0a17fb3..64403ba0 100644
--- a/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py
+++ b/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py
@@ -4,7 +4,7 @@ import numpy as np
 import pandas as pd
 
 from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import StationaryStationModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryStationModel, \
     NonStationaryLocationStationModel
 from extreme_estimator.extreme_models.utils import r, set_seed_r
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
diff --git a/test/test_spatio_temporal_dataset/test_dataset.py b/test/test_spatio_temporal_dataset/test_dataset.py
index 538f9f0c..bedad477 100644
--- a/test/test_spatio_temporal_dataset/test_dataset.py
+++ b/test/test_spatio_temporal_dataset/test_dataset.py
@@ -2,9 +2,8 @@ import unittest
 from itertools import product
 
 import numpy as np
-from rpy2.rinterface import RRuntimeError
 
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearNonStationaryLocationMarginModel
 from extreme_estimator.extreme_models.utils import set_seed_for_test, SafeRunException
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
 from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \
diff --git a/test/test_spatio_temporal_dataset/test_slicer.py b/test/test_spatio_temporal_dataset/test_slicer.py
index ed13dda6..3d24a110 100644
--- a/test/test_spatio_temporal_dataset/test_slicer.py
+++ b/test/test_spatio_temporal_dataset/test_slicer.py
@@ -2,7 +2,7 @@ from typing import List
 
 import unittest
 
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import ConstantMarginModel
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import ConstantMarginModel
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 from spatio_temporal_dataset.dataset.simulation_dataset import FullSimulatedDataset
diff --git a/test/test_unitary/test_fitmaxstab/test_fitmaxstab_with_margin.py b/test/test_unitary/test_fitmaxstab/test_fitmaxstab_with_margin.py
index c2945acb..86d74df4 100644
--- a/test/test_unitary/test_fitmaxstab/test_fitmaxstab_with_margin.py
+++ b/test/test_unitary/test_fitmaxstab/test_fitmaxstab_with_margin.py
@@ -2,7 +2,7 @@ import unittest
 
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \
     FullEstimatorInASingleStepWithSmoothMargin
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import ConstantMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import ConstantMarginModel, \
     LinearMarginModelExample
 from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model import CovarianceFunction
 from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Schlather
diff --git a/test/test_unitary/test_rmaxstab/test_rmaxstab_with_margin.py b/test/test_unitary/test_rmaxstab/test_rmaxstab_with_margin.py
index c4825bf6..0c6869b9 100644
--- a/test/test_unitary/test_rmaxstab/test_rmaxstab_with_margin.py
+++ b/test/test_unitary/test_rmaxstab/test_rmaxstab_with_margin.py
@@ -2,7 +2,7 @@ import unittest
 
 import numpy as np
 
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import ConstantMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import ConstantMarginModel, \
     LinearAllParametersAllDimsMarginModel
 from extreme_estimator.extreme_models.utils import r
 from extreme_estimator.margin_fits.gev.gev_params import GevParams
diff --git a/test/test_utils.py b/test/test_utils.py
index bc11b408..09b329ab 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -6,9 +6,9 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import Crocus, C
 from extreme_estimator.estimator.full_estimator.abstract_full_estimator import SmoothMarginalsThenUnitaryMsp, \
     FullEstimatorInASingleStepWithSmoothMargin
 from extreme_estimator.estimator.max_stable_estimator.abstract_max_stable_estimator import MaxStableEstimator
-from extreme_estimator.extreme_models.margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.linear_margin_model import LinearAllParametersAllDimsMarginModel, \
     ConstantMarginModel
-from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import \
+from extreme_estimator.extreme_models.margin_model.linear_margin_model.temporal_linear_margin_models import \
     NonStationaryLocationStationModel, NonStationaryScaleStationModel, NonStationaryShapeStationModel
 from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model import \
     AbstractMaxStableModelWithCovarianceFunction, CovarianceFunction
diff --git a/utils.py b/utils.py
index f43fe09f..2305a67c 100644
--- a/utils.py
+++ b/utils.py
@@ -9,6 +9,7 @@ for c in [' ', ':', '-']:
 
 NB_CORES = 7
 
+
 def get_root_path() -> str:
     return op.dirname(op.abspath(__file__))
 
@@ -70,12 +71,14 @@ class ClassPropertyDescriptor(object):
         self.fset = func
         return self
 
+
 def classproperty(func):
     if not isinstance(func, (classmethod, staticmethod)):
         func = classmethod(func)
 
     return ClassPropertyDescriptor(func)
 
+
 if __name__ == '__main__':
     e = Example()
     print(e.big_attribute)
-- 
GitLab