From 482ca2acc95bf4be36da02c7db44200440f0eeea Mon Sep 17 00:00:00 2001
From: fmazy <francois-remi.mazy@inria.fr>
Date: Mon, 23 May 2022 22:32:41 +0200
Subject: [PATCH] 20220523 2232

---
 .../__pycache__/_allocator.cpython-38.pyc     | Bin 2776 -> 4055 bytes
 .../__pycache__/_unbiased.cpython-38.pyc      | Bin 3683 -> 3683 bytes
 clumpy/allocation/_allocator.py               |  42 ++++++++++++++++++
 clumpy/allocation/_unbiased.py                |   2 +-
 4 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/clumpy/allocation/__pycache__/_allocator.cpython-38.pyc b/clumpy/allocation/__pycache__/_allocator.cpython-38.pyc
index 3923f9a9c32b480666aa193583d1e23ca68ddc78..534b19d9919afd5686f303c9f221671efce3b2eb 100644
GIT binary patch
delta 2106
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

delta 839
zcmcaEe?ycnl$V!_fq{X6^K5(4Gl7YGGK@VFwTtE48B%yt_*xiJ_?nrbL{fxO1X2WB
z7^6f}n1UHJg(sdk8kG#vg^XDk7#JKF7#NDJ7#J8*8KM|d7^0X`7^9d|_)}R@Sm!XN
zu%)oKutu?_aHMdyFhsGX2&8bQ@U$>Su|w>N;sBd2xS5$LfRT}JatO1I5FY~rLy-W8
z5M*FrSjkW%Jb4nc7o*JNyUa?H7jo=zT*-KgC9xv2Sd-@#OLBfeWf2cZF-Y4j-pstr
zlFY=M_~MeplGIzQnRzLx6}Ol(^Ga?p<rUmwOG(X1ElHi+%PDUm#K6FCi!tC9Pg-Uk
zOhfT4=FF6eB4LnuU_u0>h$lWdCp9rIzMv>SDbaoMUCyH^N+1==3=9lzn#{Kt6K}B;
zXI7=&VlPT9$Vp62)#NNv1u5VL5z-(6<hUY95KA3I$bgJxD@x2u$<MvTmYk8FnVhQ0
zT?BEGR}sYY$sF7^a$r}039wUm<BJn>3vyE93o^^{OClyGaku&MGcYh{GTma$EJ@8R
zzQtagT9Q~&Ql!ZOF^;Vuu_!UO_!e_^YUM3fFbCa#T*av+@nD(aqRFN_1}uyrnw*o%
zd5nEUL5>A`#Tdl01QB4zAPA7Nig+0q7(mV_7Gq#w;9z9oWng4rWcbU($n>8_n?sc0
z50_LC?_^otqhcTh>98bJ1WJaQoJA6ofABhs$btO9ev2a@zAQezG(PecQ%UaR06tqq
zRLgD&#FrMNB$lMcgB3=`mzGan$EPgr1JceIqA6Bn3kqG<ywco)$|9M`FZenGBtQ-a
yrxK7$i$F?|0s(A3$RD>jY;yBcN^?@}7(s~|<W?4D4kjK(9!3F15DCUid>H_@F2RNX

diff --git a/clumpy/allocation/__pycache__/_unbiased.cpython-38.pyc b/clumpy/allocation/__pycache__/_unbiased.cpython-38.pyc
index 1e566c3ce682586650f2bbf770e5137057e38290..6f9ac9deccbc990d9edb82f15c86ed632713f611 100644
GIT binary patch
delta 22
dcmaDX^H_#Al$V!_fq{Xc@@03D_D0??J^)C71|a|d

delta 22
dcmaDX^H_#Al$V!_fq{YH#i#Zp^^Lq?d;m;;29W>&

diff --git a/clumpy/allocation/_allocator.py b/clumpy/allocation/_allocator.py
index 28c9d4a..e06070b 100644
--- a/clumpy/allocation/_allocator.py
+++ b/clumpy/allocation/_allocator.py
@@ -12,6 +12,8 @@ from ..tools._path import path_split
 from ._gart import generalized_allocation_rejection_test
 from copy import deepcopy
 
+from scipy.stats import norm
+
 class Allocator():
     """
     Allocator
@@ -67,7 +69,47 @@ class Allocator():
     #                   mask=mask)
         
     #     return(lul, proba_layer)
+    
+    def nb_monte_carlo(self,
+                       lul:LandUseLayer,
+                       tm:TransitionMatrix,
+                       features=None,
+                       mask:MaskLayer=None,
+                       alpha = 0.05,
+                       epsilon = 0.001):
+        
+        if features is None:
+            features = self.calibrator.features
+                
+        initial_state = self.calibrator.initial_state
+        final_states = self.calibrator.tpe.get_final_states()
+        
+        final_states_id = {final_state:final_states.index(final_state) for final_state in final_states}
+        P_v = np.array([tm.get(int(initial_state),
+                               int(final_state)) for final_state in final_states])
+        
+        J = lul_origin.get_J(state=initial_state,
+                      mask=mask)
+        X = lul_origin.get_X(J=J, 
+                             features=features)
         
+        X = self.calibrator.feature_selector.transform(X)
+        
+        P, final_states, P_Y = self.calibrator.tpe.transition_probabilities(
+            J=J,
+            Y=X,
+            P_v=P_v,
+            return_P_Y=True,
+            return_P_Y__v=False)
+        
+        p_alpha = norm.ppf(1-alpha/2)
+        
+        # remove initial state
+        if initial_state in final_states:
+            P = np.delete(P, list(final_states).index(initial_state), axis=1)
+        
+        return np.max(p_alpha**2/epsilon**2 * P * (1-P) / (P_Y * P.shape[0]))
+    
     def _clean_proba(self, 
                     P, 
                     final_states):
diff --git a/clumpy/allocation/_unbiased.py b/clumpy/allocation/_unbiased.py
index 61524a0..8643ff2 100644
--- a/clumpy/allocation/_unbiased.py
+++ b/clumpy/allocation/_unbiased.py
@@ -42,7 +42,7 @@ class Unbiased(Allocator):
         super().__init__(calibrator=calibrator,
                          verbose=verbose,
                          verbose_heading_level=verbose_heading_level)
-
+    
     def allocate(self,
                  lul:LandUseLayer,
                  tm:TransitionMatrix,
-- 
GitLab