From a2ded98d1ebc40a99a6c27d9b61d287808894786 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 28 Nov 2018 15:00:40 +0100
Subject: [PATCH] add example of python code equivalent or r code (an example
 from SpatialExtremes library)

---
 example.R                                     | 35 ++++++++++
 example.py                                    | 65 +++++++++++++++++++
 .../margin_model/abstract_margin_model.py     |  8 ++-
 .../margin_model/smooth_margin_model.py       | 10 +++
 extreme_estimator/gev_params.py               |  1 +
 5 files changed, 117 insertions(+), 2 deletions(-)
 create mode 100644 example.R
 create mode 100644 example.py

diff --git a/example.R b/example.R
new file mode 100644
index 00000000..0083b6ea
--- /dev/null
+++ b/example.R
@@ -0,0 +1,35 @@
+library(SpatialExtremes)
+# Title     : TODO
+# Objective : TODO
+# Created by: erwan
+# Created on: 27/11/18
+# define the coordinate of each location
+set.seed(42)
+n.site <- 30
+locations <- matrix(runif(2*n.site, 0, 10), ncol = 2)
+colnames(locations) <- c("lon", "lat")
+print(locations)
+##Simulate a max-stable process - with unit Frechet margins
+data <- rmaxstab(40, locations, cov.mod = "whitmat", nugget = 0, range = 3,
+smooth = 0.5)
+##Now define the spatial model for the GEV parameters
+param.loc <- -10 + 2 * locations[,2]
+param.scale <- 5 + 2 * locations[,1] + locations[,2]^2
+param.shape <- rep(0.2, n.site)
+##Transform the unit Frechet margins to GEV
+for (i in 1:n.site)
+data[,i] <- frech2gev(data[,i], param.loc[i], param.scale[i], param.shape[i])
+##Define a model for the GEV margins to be fitted
+##shape ~ 1 stands for the GEV shape parameter is constant
+##over the region
+loc.form <- loc ~ lat
+scale.form <- scale ~ lon + I(lat^2)
+shape.form <- shape ~ 1
+##Fit a max-stable process using the Schlather
+res = fitmaxstab(data, locations, "whitmat", loc.form, scale.form, shape.form)
+print(res['fitted.values'])
+## Model without any spatial structure for the GEV parameters
+## Be careful this could be *REALLY* time consuming
+# res = fitmaxstab(data, locations, "whitmat", fit.margin=TRUE)
+# print(res['fitted.values'])
+
diff --git a/example.py b/example.py
new file mode 100644
index 00000000..aec25196
--- /dev/null
+++ b/example.py
@@ -0,0 +1,65 @@
+import numpy as np
+import pandas as pd
+
+from extreme_estimator.extreme_models.margin_model.smooth_margin_model import LinearMarginModel, \
+    LinearAllParametersAllDimsMarginModel
+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
+from extreme_estimator.extreme_models.utils import r, set_seed_r
+from extreme_estimator.gev_params import GevParams
+from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
+from spatio_temporal_dataset.dataset.simulation_dataset import FullSimulatedDataset
+from spatio_temporal_dataset.temporal_observations.annual_maxima_observations import MaxStableAnnualMaxima
+
+print('R')
+set_seed_r()
+r("""
+n.site <- 30
+locations <- matrix(runif(2*n.site, 0, 10), ncol = 2)
+colnames(locations) <- c("lon", "lat")""")
+
+for _ in range(2):
+    set_seed_r()
+    r("""data <- rmaxstab(40, locations, cov.mod = "whitmat", nugget = 0, range = 3,
+    smooth = 0.5)""")
+    print(np.sum(r.data))
+    r("""
+    ##param.loc <- -10 + 2 * locations[,2]
+    ##TODO-IMPLEMENT SQUARE: param.scale <- 5 + 2 * locations[,1] + locations[,2]^2
+    ##param.scale <- 5 + 2 * locations[,1] + locations[,2]
+    param.shape <- rep(0.2, n.site)
+    param.loc <- rep(0.2, n.site)
+    param.scale <- rep(0.2, n.site)
+    ##Transform the unit Frechet margins to GEV
+    for (i in 1:n.site)
+    data[,i] <- frech2gev(data[,i], param.loc[i], param.scale[i], param.shape[i])""")
+    print(np.sum(r.data))
+
+print('\n\nPython')
+
+params_sample = {'range': 3, 'smooth': 0.5, 'nugget': 0.0}
+max_stable_model = Schlather(covariance_function=CovarianceFunction.whitmat, params_sample=params_sample)
+df = pd.DataFrame(data=r.locations, columns=AbstractCoordinates.COORDINATE_NAMES[:2])
+coordinates = AbstractCoordinates.from_df(df)
+set_seed_r()
+maxima = MaxStableAnnualMaxima.from_sampling(nb_obs=40, max_stable_model=max_stable_model, coordinates=coordinates)
+print(np.sum(maxima.maxima_frech))
+
+# gev_param_name_to_coef_list = {
+#     GevParams.GEV_LOC: [-10, 0, 2],
+#     GevParams.GEV_SHAPE: [5, 2, 1],
+#     GevParams.GEV_SCALE: [0.2, 0, 0],
+# }
+gev_param_name_to_coef_list = {
+    GevParams.GEV_LOC: [0.2, 0, 0],
+    GevParams.GEV_SHAPE: [0.2, 0, 0],
+    GevParams.GEV_SCALE: [0.2, 0, 0],
+}
+margin_model = LinearAllParametersAllDimsMarginModel.from_coef_list(coordinates, gev_param_name_to_coef_list)
+maxima_gev = margin_model.frech2gev(maxima.maxima_frech, coordinates.coordinates_values, margin_model.margin_function_sample)
+print(np.sum(maxima_gev))
+
+# dataset = FullSimulatedDataset.from_double_sampling(nb_obs=nb_obs, margin_model=margin_model,
+#                                                     coordinates=coordinates,
+#                                                     max_stable_model=max_stable_model)
+
diff --git a/extreme_estimator/extreme_models/margin_model/abstract_margin_model.py b/extreme_estimator/extreme_models/margin_model/abstract_margin_model.py
index d296b19d..11349070 100644
--- a/extreme_estimator/extreme_models/margin_model/abstract_margin_model.py
+++ b/extreme_estimator/extreme_models/margin_model/abstract_margin_model.py
@@ -18,8 +18,10 @@ class AbstractMarginModel(AbstractModel):
         self.margin_function_start_fit = None  # type: AbstractMarginFunction
         self.load_margin_functions()
 
-    def load_margin_functions(self, margin_function_class: type = None):
-        assert margin_function_class is not None
+    def load_margin_functions(self):
+        pass
+
+    def default_load_margin_functions(self, margin_function_class):
         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,
@@ -69,3 +71,5 @@ class AbstractMarginModel(AbstractModel):
     def fitmargin_from_maxima_gev(self, maxima_gev: np.ndarray, coordinates_values: np.ndarray) \
             -> AbstractMarginFunction:
         pass
+
+
diff --git a/extreme_estimator/extreme_models/margin_model/smooth_margin_model.py b/extreme_estimator/extreme_models/margin_model/smooth_margin_model.py
index e18ff3a7..4791dcec 100644
--- a/extreme_estimator/extreme_models/margin_model/smooth_margin_model.py
+++ b/extreme_estimator/extreme_models/margin_model/smooth_margin_model.py
@@ -11,6 +11,8 @@ from extreme_estimator.gev_params import GevParams
 class LinearMarginModel(AbstractMarginModel):
 
     def load_margin_functions(self, gev_param_name_to_linear_dims=None):
+        assert gev_param_name_to_linear_dims is not None, 'LinearMarginModel cannot be used for sampling/fitting \n' \
+                                                          'load_margin_functions needs to be implemented in child class'
         # Load sample coef
         self.default_params_sample = self.default_param_name_and_dim_to_coef()
         linear_coef_sample = self.gev_param_name_to_linear_coef(param_name_and_dim_to_coef=self.params_sample)
@@ -49,6 +51,14 @@ class LinearMarginModel(AbstractMarginModel):
                                   coordinates_values: np.ndarray) -> AbstractMarginFunction:
         return self.margin_function_start_fit
 
+    @classmethod
+    def from_coef_list(cls, coordinates, gev_param_name_to_coef_list):
+        params = {}
+        for gev_param_name in GevParams.GEV_PARAM_NAMES:
+            for dim, coef in enumerate(gev_param_name_to_coef_list[gev_param_name]):
+                params[(gev_param_name, dim)] = coef
+        return cls(coordinates, params_sample=params, params_start_fit=params)
+
 
 class ConstantMarginModel(LinearMarginModel):
 
diff --git a/extreme_estimator/gev_params.py b/extreme_estimator/gev_params.py
index 31cb8247..5ee8656f 100644
--- a/extreme_estimator/gev_params.py
+++ b/extreme_estimator/gev_params.py
@@ -27,3 +27,4 @@ class GevParams(object):
     def to_array(self) -> np.ndarray:
         gev_param_name_to_value = self.to_dict()
         return np.array([gev_param_name_to_value[gev_param_name] for gev_param_name in self.GEV_PARAM_NAMES])
+
-- 
GitLab