From a594c050bed7807285401ef2b8b27e6a4e376ac1 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 18 Mar 2020 15:43:35 +0100
Subject: [PATCH] [refactoring] abstract estimator return an abstract function

---
 .../study_visualization/study_visualizer.py   |  2 +-
 .../regression_margin/regression_margin.py    |  2 +-
 experiment/simulation/abstract_simulation.py  |  2 +-
 .../trend_analysis/non_stationary_trends.py   |  2 +-
 .../abstract_gev_trend_test.py                | 22 ++++++-------
 extreme_fit/estimator/abstract_estimator.py   |  3 +-
 .../full_estimator/abstract_full_estimator.py |  4 +--
 .../abstract_margin_estimator.py              |  2 +-
 .../abstract_quantile_estimator.py            |  4 +--
 .../abstract_quantile_function.py             |  3 +-
 .../abstract_margin_function.py               |  3 +-
 .../margin_model/abstract_margin_model.py     |  1 +
 .../test_coordinate_sensitivity.py            |  6 ++--
 .../test_gev_temporal_extremes_bayesian.py    | 10 +++---
 .../test_gev_temporal_extremes_gumbel.py      |  2 +-
 .../test_gev_temporal_extremes_mle.py         | 10 +++---
 .../test_gev/test_gev_temporal_is_mev.py      | 20 ++++++------
 .../test_estimator/test_margin_estimators.py  |  2 +-
 .../test_estimator/test_quantile_estimator.py |  2 +-
 .../test_model/test_margin_temporal.py        | 24 +++++++-------
 .../test_margin_temporal_transformed.py       | 32 +++++++++----------
 .../test_model/test_max_stable_temporal.py    | 24 +++++++-------
 22 files changed, 93 insertions(+), 89 deletions(-)
 rename extreme_fit/{estimator/quantile_estimator => function}/abstract_quantile_function.py (71%)

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 264c7566..9d34c7c1 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
@@ -768,7 +768,7 @@ class StudyVisualizer(VisualizationParameters):
         estimator.fit()
 
         # Set visualization attributes for margin_fct
-        margin_fct = estimator.margin_function_from_fit
+        margin_fct = estimator.function_from_fit
         margin_fct._visualization_x_limits = self.study.visualization_x_limits
         margin_fct._visualization_y_limits = self.study.visualization_y_limits
         margin_fct.mask_2D = self.study.mask_french_alps
diff --git a/experiment/regression_margin/regression_margin.py b/experiment/regression_margin/regression_margin.py
index 0dfcdccc..33b67924 100644
--- a/experiment/regression_margin/regression_margin.py
+++ b/experiment/regression_margin/regression_margin.py
@@ -57,7 +57,7 @@ for i in range(nb_estimator):
     margin_model_for_estimator = margin_model_for_estimator_class(coordinates)
     full_estimator = FullEstimatorInASingleStepWithSmoothMargin(dataset, margin_model_for_estimator, max_stable_model)
     full_estimator.fit()
-    full_estimator.margin_function_from_fit.visualize_function(axes=axes, show=False)
+    full_estimator.function_from_fit.visualize_function(axes=axes, show=False)
 plt.show()
 
 # Display all the margin on the same graph for comparison
diff --git a/experiment/simulation/abstract_simulation.py b/experiment/simulation/abstract_simulation.py
index 2a94a6bc..70f59120 100644
--- a/experiment/simulation/abstract_simulation.py
+++ b/experiment/simulation/abstract_simulation.py
@@ -59,7 +59,7 @@ class AbstractSimulation(object):
             estimator = estimator_class.from_dataset(dataset)  # type: AbstractEstimator
             # Fit the estimator and get the margin_function
             estimator.fit()
-            margin_function_fitted_list.append(estimator.margin_function_from_fit)
+            margin_function_fitted_list.append(estimator.function_from_fit)
 
         # Individual error dict
         self.dump_fitted_margins_pickle(estimator_class, margin_function_fitted_list)
diff --git a/experiment/trend_analysis/non_stationary_trends.py b/experiment/trend_analysis/non_stationary_trends.py
index 2c63e957..cf1a8c8e 100644
--- a/experiment/trend_analysis/non_stationary_trends.py
+++ b/experiment/trend_analysis/non_stationary_trends.py
@@ -75,7 +75,7 @@ class AbstractNonStationaryTrendTest(object):
     def get_mu_coefs(self, starting_point):
         # for the non stationary model gives the mu1 parameters that was fitted
         estimator = self.get_estimator(starting_point)
-        margin_function = estimator.margin_function_from_fit  # type: LinearMarginFunction
+        margin_function = estimator.function_from_fit  # type: LinearMarginFunction
         assert isinstance(margin_function, LinearMarginFunction)
         mu_coefs = [margin_function.mu_intercept, margin_function.mu1_temporal_trend]
         if self.has_spatial_coordinates:
diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
index 2782f461..45470bae 100644
--- a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
+++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py
@@ -131,20 +131,20 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         return np.sign(self.time_derivative_of_return_level)
 
     def get_non_stationary_linear_coef(self, gev_param_name: str):
-        return self.unconstrained_estimator.margin_function_from_fit.get_coef(gev_param_name,
-                                                                              AbstractCoordinates.COORDINATE_T)
+        return self.unconstrained_estimator.function_from_fit.get_coef(gev_param_name,
+                                                                       AbstractCoordinates.COORDINATE_T)
 
     @cached_property
     def unconstrained_estimator_gev_params(self) -> GevParams:
         # Constant parameters correspond to the gev params in 1958
-        return self.unconstrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([1958]),
-                                                                                    is_transformed=False)
+        return self.unconstrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([1958]),
+                                                                             is_transformed=False)
 
     @cached_property
     def constrained_estimator_gev_params(self) -> GevParams:
         # Constant parameters correspond to any gev params
-        return self.constrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([1958]),
-                                                                                  is_transformed=False)
+        return self.constrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([1958]),
+                                                                           is_transformed=False)
 
     def time_derivative_times_years(self, nb_years):
         # Compute the slope strength
@@ -163,7 +163,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     def relative_change_in_return_level(self, initial_year, final_year):
         return_level_values = []
         for year in [initial_year, final_year]:
-            gev_params = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(
+            gev_params = self.unconstrained_estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
             return_level_values.append(gev_params.quantile(self.quantile_level))
@@ -289,7 +289,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         label = 'Y({})'.format(year) if year is not None else label
         if year is None:
             year = 2019
-        gev_params_year = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(
+        gev_params_year = self.unconstrained_estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
         extended_maxima = [gev_params_year.gumbel_inverse_standardization(q) for q in extended_quantiles]
@@ -380,7 +380,7 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     def compute_empirical_quantiles(self, estimator):
         empirical_quantiles = []
         for year, maximum in sorted(zip(self.years, self.maxima), key=lambda t: t[1]):
-            gev_param = estimator.margin_function_from_fit.get_gev_params(
+            gev_param = estimator.function_from_fit.get_gev_params(
                 coordinate=np.array([year]),
                 is_transformed=False)
             maximum_standardized = gev_param.gumbel_standardization(maximum)
@@ -426,8 +426,8 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         plt.gca().set_ylim(bottom=0)
 
     def get_gev_params_with_big_shape_and_correct_shape(self):
-        gev_params = self.unconstrained_estimator.margin_function_from_fit.get_gev_params(coordinate=np.array([YEAR_OF_INTEREST_FOR_RETURN_LEVEL]),
-                                                                                          is_transformed=False)  # type: GevParams
+        gev_params = self.unconstrained_estimator.function_from_fit.get_gev_params(coordinate=np.array([YEAR_OF_INTEREST_FOR_RETURN_LEVEL]),
+                                                                                   is_transformed=False)  # type: GevParams
         gev_params_with_corrected_shape = GevParams(loc=gev_params.location,
                                                     scale=gev_params.scale,
                                                     shape=0.5)
diff --git a/extreme_fit/estimator/abstract_estimator.py b/extreme_fit/estimator/abstract_estimator.py
index d9be7274..c8e93cad 100644
--- a/extreme_fit/estimator/abstract_estimator.py
+++ b/extreme_fit/estimator/abstract_estimator.py
@@ -2,6 +2,7 @@ from typing import Union
 
 from cached_property import cached_property
 
+from extreme_fit.function.abstract_function import AbstractFunction
 from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit
 from extreme_fit.function.margin_function.abstract_margin_function import \
     AbstractMarginFunction
@@ -35,7 +36,7 @@ class AbstractEstimator(object):
         return self._result_from_fit
 
     @cached_property
-    def margin_function_from_fit(self) -> AbstractMarginFunction:
+    def function_from_fit(self) -> AbstractFunction:
         raise NotImplementedError
 
     # Short cut properties
diff --git a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
index 2657a881..b6ff59ce 100644
--- a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
+++ b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py
@@ -34,7 +34,7 @@ class SmoothMarginalsThenUnitaryMsp(AbstractFullEstimator):
         maxima_frech = AbstractMarginModel.gev2frech(maxima_gev=maxima_gev_train,
                                                      coordinates_values=self.dataset.coordinates_values(
                                                          self.train_split),
-                                                     margin_function=self.margin_estimator.margin_function_from_fit)
+                                                     margin_function=self.margin_estimator.function_from_fit)
         # Update maxima frech field through the dataset object
         self.dataset.set_maxima_frech(maxima_frech, split=self.train_split)
         # Estimate the max stable parameters
@@ -86,7 +86,7 @@ class FullEstimatorInASingleStepWithSmoothMargin(AbstractFullEstimator):
         )
 
     @cached_property
-    def margin_function_from_fit(self) -> LinearMarginFunction:
+    def function_from_fit(self) -> LinearMarginFunction:
         return load_margin_function(self, self.linear_margin_model)
 
 
diff --git a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
index 0e6f6537..117594e3 100644
--- a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
+++ b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py
@@ -47,5 +47,5 @@ class LinearMarginEstimator(AbstractMarginEstimator):
         return compute_nllh(self, self.maxima_gev_train, self.coordinate_temp, self.margin_model)
 
     @cached_property
-    def margin_function_from_fit(self) -> LinearMarginFunction:
+    def function_from_fit(self) -> LinearMarginFunction:
         return load_margin_function(self, self.margin_model)
diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
index 739c8929..d43aae92 100644
--- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
+++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py
@@ -2,7 +2,7 @@ from cached_property import cached_property
 
 from extreme_fit.estimator.abstract_estimator import AbstractEstimator
 from extreme_fit.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator
-from extreme_fit.estimator.quantile_estimator.abstract_quantile_function import AbstractQuantileFunction
+from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunction
 from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 
@@ -26,5 +26,5 @@ class QuantileEstimatorFromMargin(AbstractQuantileEstimator, LinearMarginEstimat
 
     @cached_property
     def quantile_function_from_fit(self) -> AbstractQuantileFunction:
-        linear_margin_function = super().margin_function_from_fit
+        linear_margin_function = super().function_from_fit
         return AbstractQuantileFunction(linear_margin_function, self.quantile)
diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py b/extreme_fit/function/abstract_quantile_function.py
similarity index 71%
rename from extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py
rename to extreme_fit/function/abstract_quantile_function.py
index ef9af2fa..4c06c95e 100644
--- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py
+++ b/extreme_fit/function/abstract_quantile_function.py
@@ -1,9 +1,10 @@
 import numpy as np
 
+from extreme_fit.function.abstract_function import AbstractFunction
 from extreme_fit.function.margin_function.abstract_margin_function import AbstractMarginFunction
 
 
-class AbstractQuantileFunction(object):
+class AbstractQuantileFunction(AbstractFunction):
 
     def __init__(self, margin_function: AbstractMarginFunction, quantile: float):
         self.margin_function = margin_function
diff --git a/extreme_fit/function/margin_function/abstract_margin_function.py b/extreme_fit/function/margin_function/abstract_margin_function.py
index fb10aa47..994e7ebc 100644
--- a/extreme_fit/function/margin_function/abstract_margin_function.py
+++ b/extreme_fit/function/margin_function/abstract_margin_function.py
@@ -7,12 +7,13 @@ import pandas as pd
 from experiment.meteo_france_data.scm_models_data.visualization.utils import create_adjusted_axes
 from extreme_fit.distribution.gev.gev_params import GevParams
 from experiment.meteo_france_data.plot.create_shifted_cmap import imshow_shifted
+from extreme_fit.function.abstract_function import AbstractFunction
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
 from spatio_temporal_dataset.slicer.split import Split
 from root_utils import cached_property
 
 
-class AbstractMarginFunction(object):
+class AbstractMarginFunction(AbstractFunction):
     """
     AbstractMarginFunction maps points from a space S (could be 1D, 2D,...) to R^3 (the 3 parameters of the GEV)
     """
diff --git a/extreme_fit/model/margin_model/abstract_margin_model.py b/extreme_fit/model/margin_model/abstract_margin_model.py
index 24593139..ef7ae1a7 100644
--- a/extreme_fit/model/margin_model/abstract_margin_model.py
+++ b/extreme_fit/model/margin_model/abstract_margin_model.py
@@ -32,6 +32,7 @@ class AbstractMarginModel(AbstractModel, ABC):
         raise NotImplementedError
 
     def default_load_margin_functions(self, margin_function_class):
+        # todo: check it i could remove these attributes
         self.margin_function_sample = margin_function_class(coordinates=self.coordinates,
                                                             default_params=GevParams.from_dict(self.params_sample))
         self.margin_function_start_fit = margin_function_class(coordinates=self.coordinates,
diff --git a/test/test_experiment/test_coordinate_sensitivity.py b/test/test_experiment/test_coordinate_sensitivity.py
index e709029a..f0eb3a4b 100644
--- a/test/test_experiment/test_coordinate_sensitivity.py
+++ b/test/test_experiment/test_coordinate_sensitivity.py
@@ -33,15 +33,15 @@ class TestCoordinateSensitivity(unittest.TestCase):
                 if self.DISPLAY:
                     print('Stationary')
                     stationary_est = trend_test.get_estimator(starting_point=None)
-                    print(stationary_est.margin_function_from_fit.coordinates.df_all_coordinates)
+                    print(stationary_est.function_from_fit.coordinates.df_all_coordinates)
                     print(stationary_est.result_from_model_fit.convergence)
-                    print(stationary_est.margin_function_from_fit.coef_dict)
+                    print(stationary_est.function_from_fit.coef_dict)
                     print('Non Stationary')
                     non_stationary_est = trend_test.get_estimator(starting_point=1960)
                     print(non_stationary_est.result_from_model_fit.convergence)
                     non_stationary_est = trend_test.get_estimator(starting_point=1990)
                     print(non_stationary_est.result_from_model_fit.convergence)
-                    print(non_stationary_est.margin_function_from_fit.coef_dict)
+                    print(non_stationary_est.function_from_fit.coef_dict)
                     print(get_display_name_from_object_type(transformation_class), 'mu1s: ', mu1s)
                     print('\n')
                 self.assertTrue(0.0 not in mu1s)
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
index ec0b6977..d3e3a9e4 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py
@@ -43,7 +43,7 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
                                                           fit_method=self.fit_method)
         ref = {'loc': 0.34272436381693616, 'scale': 1.3222588712831973, 'shape': 0.30491484962825105}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -55,8 +55,8 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
         mu1_values = estimator.result_from_model_fit.df_posterior_samples.iloc[:, 1]
         self.assertTrue((mu1_values != 0).any())
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_gev_temporal_margin_fit_non_stationary_location_and_scale(self):
@@ -67,8 +67,8 @@ class TestGevTemporalExtremesBayesian(unittest.TestCase):
         mu1_values = estimator.result_from_model_fit.df_posterior_samples.iloc[:, 1]
         self.assertTrue((mu1_values != 0).any())
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
index 8aee8f21..018aeebb 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py
@@ -42,7 +42,7 @@ class TestGevTemporalExtremesGumbel(unittest.TestCase):
                                                    fit_method=TemporalMarginFitMethod.extremes_fevd_mle)
         ref = {'loc': -0.0862185692806497, 'scale': 1.0818465357627252, 'shape': 0}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
index 94f98974..88677c67 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py
@@ -43,7 +43,7 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    fit_method=self.fit_method)
         ref = {'loc': 0.02191974259369493, 'scale': 1.0347946062900268, 'shape': 0.829052520147379}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
             self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
@@ -54,8 +54,8 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    starting_year=0,
                                                    fit_method=self.fit_method)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
         self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
 
@@ -66,8 +66,8 @@ class TestGevTemporalExtremesMle(unittest.TestCase):
                                                    starting_year=0,
                                                    fit_method=self.fit_method)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
         self.assertAlmostEqual(estimator.result_from_model_fit.nllh, estimator.nllh)
 
diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
index 2e52087c..333cfd19 100644
--- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
+++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_is_mev.py
@@ -45,7 +45,7 @@ class TestGevTemporal(unittest.TestCase):
                                                    fit_method=self.fit_method)
         ref = {'loc': 0.04309190816463247, 'scale': 2.0688696961628437, 'shape': 0.8291528207825063}
         for year in range(1, 3):
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(np.array([year])).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(np.array([year])).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -56,21 +56,21 @@ class TestGevTemporal(unittest.TestCase):
             estimator = LinearMarginEstimator(self.dataset, margin_model)
             estimator.fit()
             # Checks that parameters returned are indeed different
-            mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-            mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+            mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+            mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
             self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_gev_temporal_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=3)
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks starting point parameter are well passed
-        self.assertEqual(3, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(3, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(np.array([1])).to_dict()
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(np.array([3])).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(np.array([1])).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(np.array([3])).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year3)
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(np.array([5])).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(np.array([5])).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year3)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -84,8 +84,8 @@ class TestGevTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=28)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_estimator/test_margin_estimators.py b/test/test_extreme_fit/test_estimator/test_margin_estimators.py
index 7f5eabb2..9a5a5c55 100644
--- a/test/test_extreme_fit/test_estimator/test_margin_estimators.py
+++ b/test/test_extreme_fit/test_estimator/test_margin_estimators.py
@@ -34,7 +34,7 @@ class TestSmoothMarginEstimator(unittest.TestCase):
                 # Plot
                 if self.DISPLAY:
                     margin_model.margin_function_sample.visualize_function(show=True)
-                    estimator.margin_function_from_fit.visualize_function(show=True)
+                    estimator.function_from_fit.visualize_function(show=True)
         self.assertTrue(True)
 
 
diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
index 9bf1a3c1..bd517938 100644
--- a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
+++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py
@@ -32,7 +32,7 @@ class TestSmoothMarginEstimator(unittest.TestCase):
 
             for quantile_estimator in quantile_estimators:
                 quantile_estimator.fit()
-                print(quantile_estimator.margin_function_from_fit)
+                print(quantile_estimator.function_from_fit)
 
         # self.assertTrue(True)
 
diff --git a/test/test_extreme_fit/test_model/test_margin_temporal.py b/test/test_extreme_fit/test_model/test_margin_temporal.py
index fdf159f2..31b87e87 100644
--- a/test/test_extreme_fit/test_model/test_margin_temporal.py
+++ b/test/test_extreme_fit/test_model/test_margin_temporal.py
@@ -33,7 +33,7 @@ class TestMarginTemporal(unittest.TestCase):
         ref = {'loc': 1.3456595684773085, 'scale': 1.090369430386199, 'shape': 0.6845422250749476}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -42,32 +42,32 @@ class TestMarginTemporal(unittest.TestCase):
         margin_model = LinearNonStationaryLocationMarginModel(self.coordinates)
         estimator = LinearMarginEstimator(self.dataset, margin_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
-        self.assertAlmostEqual(estimator.margin_function_from_fit.mu1_temporal_trend,
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend,
                                self.smooth_margin_model.margin_function_sample.mu1_temporal_trend,
                                places=3)
         # Checks starting point parameter are well passed
-        self.assertEqual(2, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(2, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -80,8 +80,8 @@ class TestMarginTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py b/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
index f4a42a81..66392b46 100644
--- a/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
+++ b/test/test_extreme_fit/test_model/test_margin_temporal_transformed.py
@@ -41,8 +41,8 @@ class TestMarginTemporalTransformed(unittest.TestCase):
                'shape': 0.7289248773961512}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate,
-                                                                                     is_transformed=False).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate,
+                                                                              is_transformed=False).to_dict()
             self.assertEqual(mle_params_estimated, ref)
 
     def test_margin_fit_nonstationary(self):
@@ -50,32 +50,32 @@ class TestMarginTemporalTransformed(unittest.TestCase):
         margin_model = LinearNonStationaryLocationMarginModel(self.coordinates)
         estimator = LinearMarginEstimator(self.dataset, margin_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1,
+                                                                                is_transformed=False).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3,
+                                                                                is_transformed=False).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1,
+                                                                                is_transformed=False).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2,
+                                                                                is_transformed=False).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5,
-                                                                                       is_transformed=False).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5,
+                                                                                is_transformed=False).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -88,8 +88,8 @@ class TestMarginTemporalTransformed(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
diff --git a/test/test_extreme_fit/test_model/test_max_stable_temporal.py b/test/test_extreme_fit/test_model/test_max_stable_temporal.py
index 8a6a6b3b..cd111c34 100644
--- a/test/test_extreme_fit/test_model/test_max_stable_temporal.py
+++ b/test/test_extreme_fit/test_model/test_max_stable_temporal.py
@@ -37,7 +37,7 @@ class TestMaxStableTemporal(unittest.TestCase):
         ref = {'loc': 1.2091156634312243, 'scale': 1.1210085591373455, 'shape': 0.9831957705294134}
         for year in range(1, 3):
             coordinate = np.array([0.0, 0.0, year])
-            mle_params_estimated = estimator.margin_function_from_fit.get_gev_params(coordinate).to_dict()
+            mle_params_estimated = estimator.function_from_fit.get_gev_params(coordinate).to_dict()
             for key in ref.keys():
                 self.assertAlmostEqual(ref[key], mle_params_estimated[key], places=3)
 
@@ -47,32 +47,32 @@ class TestMaxStableTemporal(unittest.TestCase):
         estimator = FullEstimatorInASingleStepWithSmoothMargin(self.dataset, margin_model,
                                                                self.max_stable_model)
         estimator.fit()
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate3 = np.array([0.0, 0.0, 3])
-        mle_params_estimated_year3 = estimator.margin_function_from_fit.get_gev_params(coordinate3).to_dict()
+        mle_params_estimated_year3 = estimator.function_from_fit.get_gev_params(coordinate3).to_dict()
         self.assertNotEqual(mle_params_estimated_year1, mle_params_estimated_year3)
 
     def test_margin_fit_nonstationary_with_start_point(self):
         # Create estimator
         estimator = self.fit_non_stationary_estimator(starting_point=2)
         # By default, estimator find the good margin
-        self.assertNotEqual(estimator.margin_function_from_fit.mu1_temporal_trend, 0.0)
-        self.assertAlmostEqual(estimator.margin_function_from_fit.mu1_temporal_trend,
+        self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0)
+        self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend,
                                self.smooth_margin_model.margin_function_sample.mu1_temporal_trend,
                                places=2)
         # Checks starting point parameter are well passed
-        self.assertEqual(2, estimator.margin_function_from_fit.starting_point)
+        self.assertEqual(2, estimator.function_from_fit.starting_point)
         # Checks that parameters returned are indeed different
         coordinate1 = np.array([0.0, 0.0, 1])
-        mle_params_estimated_year1 = estimator.margin_function_from_fit.get_gev_params(coordinate1).to_dict()
+        mle_params_estimated_year1 = estimator.function_from_fit.get_gev_params(coordinate1).to_dict()
         coordinate2 = np.array([0.0, 0.0, 2])
-        mle_params_estimated_year2 = estimator.margin_function_from_fit.get_gev_params(coordinate2).to_dict()
+        mle_params_estimated_year2 = estimator.function_from_fit.get_gev_params(coordinate2).to_dict()
         self.assertEqual(mle_params_estimated_year1, mle_params_estimated_year2)
         coordinate5 = np.array([0.0, 0.0, 5])
-        mle_params_estimated_year5 = estimator.margin_function_from_fit.get_gev_params(coordinate5).to_dict()
+        mle_params_estimated_year5 = estimator.function_from_fit.get_gev_params(coordinate5).to_dict()
         self.assertNotEqual(mle_params_estimated_year5, mle_params_estimated_year2)
 
     def fit_non_stationary_estimator(self, starting_point):
@@ -86,8 +86,8 @@ class TestMaxStableTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-        mu1_estimator1 = estimator1.margin_function_from_fit.mu1_temporal_trend
-        mu1_estimator2 = estimator2.margin_function_from_fit.mu1_temporal_trend
+        mu1_estimator1 = estimator1.function_from_fit.mu1_temporal_trend
+        mu1_estimator2 = estimator2.function_from_fit.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
 
 
-- 
GitLab