From 73498803401b608bd4e4f01b808f25d062204d15 Mon Sep 17 00:00:00 2001 From: kyracho Date: Tue, 3 Sep 2024 17:35:13 -0700 Subject: [PATCH 1/6] rename indices to mask --- metalearners/metalearner.py | 12 ++++++------ metalearners/xlearner.py | 28 +++++++++++----------------- tests/test_learner.py | 4 ++-- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/metalearners/metalearner.py b/metalearners/metalearner.py index 1ec53c9..0191a2b 100644 --- a/metalearners/metalearner.py +++ b/metalearners/metalearner.py @@ -1336,12 +1336,12 @@ def __init__( n_folds=n_folds, random_state=random_state, ) - self._treatment_variants_indices: list[np.ndarray] | None = None + self._treatment_variants_mask: list[np.ndarray] | None = None def predict_conditional_average_outcomes( self, X: Matrix, is_oos: bool, oos_method: OosMethod = OVERALL ) -> np.ndarray: - if self._treatment_variants_indices is None: + if self._treatment_variants_mask is None: raise ValueError( "The metalearner needs to be fitted before predicting." "In particular, the MetaLearner's attribute _treatment_variant_indices, " @@ -1363,17 +1363,17 @@ def predict_conditional_average_outcomes( ) else: conditional_average_outcomes_list[tv][ - self._treatment_variants_indices[tv] + self._treatment_variants_mask[tv] ] = self.predict_nuisance( - X=index_matrix(X, self._treatment_variants_indices[tv]), + X=index_matrix(X, self._treatment_variants_mask[tv]), model_kind=VARIANT_OUTCOME_MODEL, model_ord=tv, is_oos=False, ) conditional_average_outcomes_list[tv][ - ~self._treatment_variants_indices[tv] + ~self._treatment_variants_mask[tv] ] = self.predict_nuisance( - X=index_matrix(X, ~self._treatment_variants_indices[tv]), + X=index_matrix(X, ~self._treatment_variants_mask[tv]), model_kind=VARIANT_OUTCOME_MODEL, model_ord=tv, is_oos=True, diff --git a/metalearners/xlearner.py b/metalearners/xlearner.py index 016a726..d083a97 100644 --- a/metalearners/xlearner.py +++ b/metalearners/xlearner.py @@ -96,17 +96,17 @@ def fit_all_nuisance( self._validate_treatment(w) self._validate_outcome(y, w) - self._treatment_variants_indices = [] + self._treatment_variants_mask = [] qualified_fit_params = self._qualified_fit_params(fit_params) self._cvs: list = [] for treatment_variant in range(self.n_variants): - self._treatment_variants_indices.append(w == treatment_variant) + self._treatment_variants_mask.append(w == treatment_variant) if synchronize_cross_fitting: cv_split_indices = self._split( - index_matrix(X, self._treatment_variants_indices[treatment_variant]) + index_matrix(X, self._treatment_variants_mask[treatment_variant]) ) else: cv_split_indices = None @@ -116,10 +116,8 @@ def fit_all_nuisance( for treatment_variant in range(self.n_variants): nuisance_jobs.append( self._nuisance_joblib_specifications( - X=index_matrix( - X, self._treatment_variants_indices[treatment_variant] - ), - y=y[self._treatment_variants_indices[treatment_variant]], + X=index_matrix(X, self._treatment_variants_mask[treatment_variant]), + y=y[self._treatment_variants_mask[treatment_variant]], model_kind=VARIANT_OUTCOME_MODEL, model_ord=treatment_variant, n_jobs_cross_fitting=n_jobs_cross_fitting, @@ -159,7 +157,7 @@ def fit_all_treatment( synchronize_cross_fitting: bool = True, n_jobs_base_learners: int | None = None, ) -> Self: - if self._treatment_variants_indices is None: + if self._treatment_variants_mask is None: raise ValueError( "The nuisance models need to be fitted before fitting the treatment models." "In particular, the MetaLearner's attribute _treatment_variant_indices, " @@ -188,9 +186,7 @@ def fit_all_treatment( ) treatment_jobs.append( self._treatment_joblib_specifications( - X=index_matrix( - X, self._treatment_variants_indices[treatment_variant] - ), + X=index_matrix(X, self._treatment_variants_mask[treatment_variant]), y=imputed_te_treatment, model_kind=TREATMENT_EFFECT_MODEL, model_ord=treatment_variant - 1, @@ -202,7 +198,7 @@ def fit_all_treatment( treatment_jobs.append( self._treatment_joblib_specifications( - X=index_matrix(X, self._treatment_variants_indices[0]), + X=index_matrix(X, self._treatment_variants_mask[0]), y=imputed_te_control, model_kind=CONTROL_EFFECT_MODEL, model_ord=treatment_variant - 1, @@ -225,7 +221,7 @@ def predict( is_oos: bool, oos_method: OosMethod = OVERALL, ) -> np.ndarray: - if self._treatment_variants_indices is None: + if self._treatment_variants_mask is None: raise ValueError( "The MetaLearner needs to be fitted before predicting. " "In particular, the X-Learner's attribute _treatment_variant_indices, " @@ -243,13 +239,11 @@ def predict( oos_method=propensity_score_oos, ) - control_indices = self._treatment_variants_indices[0] + control_indices = self._treatment_variants_mask[0] non_control_indices = ~control_indices for treatment_variant in range(1, self.n_variants): - treatment_variant_indices = self._treatment_variants_indices[ - treatment_variant - ] + treatment_variant_indices = self._treatment_variants_mask[treatment_variant] non_treatment_variant_indices = ~treatment_variant_indices if is_oos: tau_hat_treatment = self.predict_treatment( diff --git a/tests/test_learner.py b/tests/test_learner.py index afe2634..6b8f343 100644 --- a/tests/test_learner.py +++ b/tests/test_learner.py @@ -880,10 +880,10 @@ def test_model_reusage(outcome_kind, request): VARIANT_OUTCOME_MODEL: tlearner._nuisance_models[VARIANT_OUTCOME_MODEL] }, ) - # We need to manually copy _treatment_variants_indices for the xlearner as it's needed + # We need to manually copy _treatment_variants_mask for the xlearner as it's needed # for predict, the user should not have to do this as they should call fit before predict. # This is just for testing. - xlearner._treatment_variants_indices = tlearner._treatment_variants_indices + xlearner._treatment_variants_mask = tlearner._treatment_variants_mask np.testing.assert_allclose( tlearner.predict_conditional_average_outcomes(covariates, False), xlearner.predict_conditional_average_outcomes(covariates, False), From 91baf35cf45dea03436711c536ef5ea08f77c404 Mon Sep 17 00:00:00 2001 From: kyracho Date: Tue, 3 Sep 2024 17:49:08 -0700 Subject: [PATCH 2/6] add CHANGELOG.rst entry --- CHANGELOG.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 34eb7f8..2f54684 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,14 @@ Changelog ========= +0.12.0 (2024-09-03) +------------------- + +**New features** + +* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, and ``test_learner``. + + 0.11.0 (2024-09-xx) ------------------- From 00fb48c5b62bf7fe552bf940ef17cb05cffecba9 Mon Sep 17 00:00:00 2001 From: kyracho Date: Tue, 3 Sep 2024 18:13:06 -0700 Subject: [PATCH 3/6] rename additional variables in tlearner.py and update CHANGELOG.rst --- CHANGELOG.rst | 2 +- metalearners/metalearner.py | 2 +- metalearners/tlearner.py | 10 ++++------ metalearners/xlearner.py | 20 +++++++++----------- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2f54684..030a845 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,7 +12,7 @@ Changelog **New features** -* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, and ``test_learner``. +* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, ``tlearner``, and ``test_learner``. 0.11.0 (2024-09-xx) diff --git a/metalearners/metalearner.py b/metalearners/metalearner.py index 0191a2b..4024341 100644 --- a/metalearners/metalearner.py +++ b/metalearners/metalearner.py @@ -1344,7 +1344,7 @@ def predict_conditional_average_outcomes( if self._treatment_variants_mask is None: raise ValueError( "The metalearner needs to be fitted before predicting." - "In particular, the MetaLearner's attribute _treatment_variant_indices, " + "In particular, the MetaLearner's attribute _treatment_variant_mask, " "typically set during fitting, is None." ) # TODO: Consider multiprocessing diff --git a/metalearners/tlearner.py b/metalearners/tlearner.py index c009e59..946d833 100644 --- a/metalearners/tlearner.py +++ b/metalearners/tlearner.py @@ -71,10 +71,10 @@ def fit_all_nuisance( self._validate_treatment(w) self._validate_outcome(y, w) - self._treatment_variants_indices = [] + self._treatment_variants_mask = [] for v in range(self.n_variants): - self._treatment_variants_indices.append(w == v) + self._treatment_variants_mask.append(w == v) qualified_fit_params = self._qualified_fit_params(fit_params) @@ -82,10 +82,8 @@ def fit_all_nuisance( for treatment_variant in range(self.n_variants): nuisance_jobs.append( self._nuisance_joblib_specifications( - X=index_matrix( - X, self._treatment_variants_indices[treatment_variant] - ), - y=y[self._treatment_variants_indices[treatment_variant]], + X=index_matrix(X, self._treatment_variants_mask[treatment_variant]), + y=y[self._treatment_variants_mask[treatment_variant]], model_kind=VARIANT_OUTCOME_MODEL, model_ord=treatment_variant, n_jobs_cross_fitting=n_jobs_cross_fitting, diff --git a/metalearners/xlearner.py b/metalearners/xlearner.py index d083a97..02a94ed 100644 --- a/metalearners/xlearner.py +++ b/metalearners/xlearner.py @@ -160,7 +160,7 @@ def fit_all_treatment( if self._treatment_variants_mask is None: raise ValueError( "The nuisance models need to be fitted before fitting the treatment models." - "In particular, the MetaLearner's attribute _treatment_variant_indices, " + "In particular, the MetaLearner's attribute _treatment_variant_mask, " "typically set during nuisance fitting, is None." ) if not hasattr(self, "_cvs"): @@ -224,7 +224,7 @@ def predict( if self._treatment_variants_mask is None: raise ValueError( "The MetaLearner needs to be fitted before predicting. " - "In particular, the X-Learner's attribute _treatment_variant_indices, " + "In particular, the X-Learner's attribute _treatment_variant_mask, " "typically set during fitting, is None." ) n_outputs = 2 if self.is_classification else 1 @@ -244,7 +244,7 @@ def predict( for treatment_variant in range(1, self.n_variants): treatment_variant_indices = self._treatment_variants_mask[treatment_variant] - non_treatment_variant_indices = ~treatment_variant_indices + non_treatment_variant_mask = ~treatment_variant_indices if is_oos: tau_hat_treatment = self.predict_treatment( X=X, @@ -264,14 +264,12 @@ def predict( tau_hat_treatment = np.zeros(safe_len(X)) tau_hat_control = np.zeros(safe_len(X)) - tau_hat_treatment[non_treatment_variant_indices] = ( - self.predict_treatment( - X=index_matrix(X, non_treatment_variant_indices), - model_kind=TREATMENT_EFFECT_MODEL, - model_ord=treatment_variant - 1, - is_oos=True, - oos_method=oos_method, - ) + tau_hat_treatment[non_treatment_variant_mask] = self.predict_treatment( + X=index_matrix(X, non_treatment_variant_mask), + model_kind=TREATMENT_EFFECT_MODEL, + model_ord=treatment_variant - 1, + is_oos=True, + oos_method=oos_method, ) tau_hat_treatment[treatment_variant_indices] = self.predict_treatment( From b248794f7ddff11847e8a1c4c86fc3ca9c9ebba6 Mon Sep 17 00:00:00 2001 From: kyracho Date: Tue, 3 Sep 2024 18:31:32 -0700 Subject: [PATCH 4/6] rename missed variables --- metalearners/xlearner.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/metalearners/xlearner.py b/metalearners/xlearner.py index 02a94ed..f9ff549 100644 --- a/metalearners/xlearner.py +++ b/metalearners/xlearner.py @@ -243,8 +243,8 @@ def predict( non_control_indices = ~control_indices for treatment_variant in range(1, self.n_variants): - treatment_variant_indices = self._treatment_variants_mask[treatment_variant] - non_treatment_variant_mask = ~treatment_variant_indices + treatment_variant_mask = self._treatment_variants_mask[treatment_variant] + non_treatment_variant_mask = ~treatment_variant_mask if is_oos: tau_hat_treatment = self.predict_treatment( X=X, @@ -272,8 +272,8 @@ def predict( oos_method=oos_method, ) - tau_hat_treatment[treatment_variant_indices] = self.predict_treatment( - X=index_matrix(X, treatment_variant_indices), + tau_hat_treatment[treatment_variant_mask] = self.predict_treatment( + X=index_matrix(X, treatment_variant_mask), model_kind=TREATMENT_EFFECT_MODEL, model_ord=treatment_variant - 1, is_oos=False, From eb47b2df3f27a16fc88d66c0711bcf8680043cbe Mon Sep 17 00:00:00 2001 From: kyracho Date: Tue, 3 Sep 2024 18:53:04 -0700 Subject: [PATCH 5/6] change indice to mask in drlearner.py and update CHANGELOG.rst --- CHANGELOG.rst | 2 +- docs/api/metalearners.cross_fit_estimator.rst | 7 +++++ docs/api/metalearners.data_generation.rst | 7 +++++ docs/api/metalearners.drlearner.rst | 7 +++++ docs/api/metalearners.explainer.rst | 7 +++++ docs/api/metalearners.grid_search.rst | 7 +++++ docs/api/metalearners.metalearner.rst | 7 +++++ docs/api/metalearners.outcome_functions.rst | 7 +++++ docs/api/metalearners.rlearner.rst | 7 +++++ docs/api/metalearners.rst | 29 ++++++++++++++++++ docs/api/metalearners.slearner.rst | 7 +++++ docs/api/metalearners.tlearner.rst | 7 +++++ docs/api/metalearners.utils.rst | 7 +++++ docs/api/metalearners.xlearner.rst | 7 +++++ docs/api/modules.rst | 7 +++++ docs/examples/model.onnx | Bin 0 -> 94176 bytes metalearners/drlearner.py | 10 +++--- 17 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 docs/api/metalearners.cross_fit_estimator.rst create mode 100644 docs/api/metalearners.data_generation.rst create mode 100644 docs/api/metalearners.drlearner.rst create mode 100644 docs/api/metalearners.explainer.rst create mode 100644 docs/api/metalearners.grid_search.rst create mode 100644 docs/api/metalearners.metalearner.rst create mode 100644 docs/api/metalearners.outcome_functions.rst create mode 100644 docs/api/metalearners.rlearner.rst create mode 100644 docs/api/metalearners.rst create mode 100644 docs/api/metalearners.slearner.rst create mode 100644 docs/api/metalearners.tlearner.rst create mode 100644 docs/api/metalearners.utils.rst create mode 100644 docs/api/metalearners.xlearner.rst create mode 100644 docs/api/modules.rst create mode 100644 docs/examples/model.onnx diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 030a845..94854f2 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,7 +12,7 @@ Changelog **New features** -* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, ``tlearner``, and ``test_learner``. +* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, ``tlearner``, ``drlearner``, and ``test_learner``. 0.11.0 (2024-09-xx) diff --git a/docs/api/metalearners.cross_fit_estimator.rst b/docs/api/metalearners.cross_fit_estimator.rst new file mode 100644 index 0000000..ea548a4 --- /dev/null +++ b/docs/api/metalearners.cross_fit_estimator.rst @@ -0,0 +1,7 @@ +metalearners.cross\_fit\_estimator module +========================================= + +.. automodule:: metalearners.cross_fit_estimator + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.data_generation.rst b/docs/api/metalearners.data_generation.rst new file mode 100644 index 0000000..fdd67f3 --- /dev/null +++ b/docs/api/metalearners.data_generation.rst @@ -0,0 +1,7 @@ +metalearners.data\_generation module +==================================== + +.. automodule:: metalearners.data_generation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.drlearner.rst b/docs/api/metalearners.drlearner.rst new file mode 100644 index 0000000..4745ae9 --- /dev/null +++ b/docs/api/metalearners.drlearner.rst @@ -0,0 +1,7 @@ +metalearners.drlearner module +============================= + +.. automodule:: metalearners.drlearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.explainer.rst b/docs/api/metalearners.explainer.rst new file mode 100644 index 0000000..4a55020 --- /dev/null +++ b/docs/api/metalearners.explainer.rst @@ -0,0 +1,7 @@ +metalearners.explainer module +============================= + +.. automodule:: metalearners.explainer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.grid_search.rst b/docs/api/metalearners.grid_search.rst new file mode 100644 index 0000000..1f1d811 --- /dev/null +++ b/docs/api/metalearners.grid_search.rst @@ -0,0 +1,7 @@ +metalearners.grid\_search module +================================ + +.. automodule:: metalearners.grid_search + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.metalearner.rst b/docs/api/metalearners.metalearner.rst new file mode 100644 index 0000000..d0d7845 --- /dev/null +++ b/docs/api/metalearners.metalearner.rst @@ -0,0 +1,7 @@ +metalearners.metalearner module +=============================== + +.. automodule:: metalearners.metalearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.outcome_functions.rst b/docs/api/metalearners.outcome_functions.rst new file mode 100644 index 0000000..f2462d5 --- /dev/null +++ b/docs/api/metalearners.outcome_functions.rst @@ -0,0 +1,7 @@ +metalearners.outcome\_functions module +====================================== + +.. automodule:: metalearners.outcome_functions + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.rlearner.rst b/docs/api/metalearners.rlearner.rst new file mode 100644 index 0000000..1707a55 --- /dev/null +++ b/docs/api/metalearners.rlearner.rst @@ -0,0 +1,7 @@ +metalearners.rlearner module +============================ + +.. automodule:: metalearners.rlearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.rst b/docs/api/metalearners.rst new file mode 100644 index 0000000..df0906e --- /dev/null +++ b/docs/api/metalearners.rst @@ -0,0 +1,29 @@ +metalearners package +==================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + metalearners.cross_fit_estimator + metalearners.data_generation + metalearners.drlearner + metalearners.explainer + metalearners.grid_search + metalearners.metalearner + metalearners.outcome_functions + metalearners.rlearner + metalearners.slearner + metalearners.tlearner + metalearners.utils + metalearners.xlearner + +Module contents +--------------- + +.. automodule:: metalearners + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.slearner.rst b/docs/api/metalearners.slearner.rst new file mode 100644 index 0000000..abfa3b7 --- /dev/null +++ b/docs/api/metalearners.slearner.rst @@ -0,0 +1,7 @@ +metalearners.slearner module +============================ + +.. automodule:: metalearners.slearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.tlearner.rst b/docs/api/metalearners.tlearner.rst new file mode 100644 index 0000000..086debc --- /dev/null +++ b/docs/api/metalearners.tlearner.rst @@ -0,0 +1,7 @@ +metalearners.tlearner module +============================ + +.. automodule:: metalearners.tlearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.utils.rst b/docs/api/metalearners.utils.rst new file mode 100644 index 0000000..0368271 --- /dev/null +++ b/docs/api/metalearners.utils.rst @@ -0,0 +1,7 @@ +metalearners.utils module +========================= + +.. automodule:: metalearners.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/metalearners.xlearner.rst b/docs/api/metalearners.xlearner.rst new file mode 100644 index 0000000..1e7ded8 --- /dev/null +++ b/docs/api/metalearners.xlearner.rst @@ -0,0 +1,7 @@ +metalearners.xlearner module +============================ + +.. automodule:: metalearners.xlearner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/modules.rst b/docs/api/modules.rst new file mode 100644 index 0000000..c24a10e --- /dev/null +++ b/docs/api/modules.rst @@ -0,0 +1,7 @@ +metalearners +============ + +.. toctree:: + :maxdepth: 4 + + metalearners diff --git a/docs/examples/model.onnx b/docs/examples/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..99cecadcbbdcf320769e876a184e0ae901eb0e91 GIT binary patch literal 94176 zcmeHw3t$x0)&Fb=5SCYn2#6pU@KHnzh=OEKxV!`uH7X)iGzla?Bro$oRK%#Ls8plU zR%>fxZ56EwYHMw?YvQX~tN&uFt+xGYYTNI#t+lnaU#;4H|MNR{XYbwJ+0E`IAlhZZ z*)#WXp7$|3GkZ>6UO{eCL;a>1&Ya*I{rxiwhAyqEsjjOkD=I6iud6D|TToxu)Lc>5 zJmnyN|BV$jEmc#7=KBhB9jA5f{C?b`-Iwd%^?}dtTUjv5bgijaT~$-oTvgXp-&iot zls7ciudY~KT~pnBakzHu7*o4!-Rjx}H5E-w)oZJ(8Vg4)Z>*|XRM%8hySk>zluvmk z$3JKdnw3>oHYq22q;G+C-@qyV$ng)=W~{5Ptb!@~s}X998mkUghpIw#ggR0ku4by^ z)hrcItJNA+q1LL6>SA@Nx=d|RSNYWEeCkG@YV)a^ed-H7^?*<9_A!-V>Hu}18pTv5 zsmW@hnxdwvY3dlJbB;P!ov&)tg-m0!y27Wn`P6owy4I&|@u^#V>YG0Gpie#IQ{Mue zku1$YBF{K=2-7)~CHjn-t>&ruOl!TWR_j!)x&(BX0+Z5`FsaY`)R#nGV zvP{P+QYC7Js$zXA)dgx3>$F*24vkogJALY_K6Rf@-7oU6Qjdx}gOp$8u{6->FxKd3 zHHWFpWm*f>Vzogvsb+N%)7r?ou^?I@7KBOOzkWs_4Os4^zOl`lWzRqS)DX@?6gi=^eUIF9eF}0 z<-c)ECp~}NPP%T^ah>$fjpuaI?{20}y7@3Z zo&ECSPWtgQZhY%a^E&CTzQa4|u*LH`Y4i{-D}9N7+GJF6^X^LuYqV z%PWk1_xCKztcQ=~cJKZ&K$E^XEJU;Gt`E_XZ`X(D{J~uTdZX+M0a~%$NA$sSqf4l{ z;Eo{u^_&NS^oy>u1GM()yNIs6IX6UILxKSs_Wda#I{p{+0m?aJWr%Lxu`59LUv*yx zQ7Kct|LPZmG~}wP0Nru>uL3l?{hA<+t(+dB?N_%1DPJ`Z{r#yCA=){lmgpBhxvPU} zU;eKEl`elJNV_*a7NS3YKQBNN-h4hpH>|9lLyInbnCPW@$CuDQ@BfHs;`m8KfBM&M)cyZ4k3EshgSsXh$oNfpff)Er2rkZHdIWl zqb?88ySJPdq%Xd6Qh**={68W3`vb*6qKA(UP}3_Xg=obKXA+IxKBt(@Uwdbe4$Hki zNE@DiG(dR|Jiz{#))=JeYi=&4NsVs=>4dItgy_eM{}!OJd4Ul5jtvnN-g;Spw$^P3 z(FyOY4btd`PcEi;f85hSOW*t;K)L_Djp)vfX9F~`_`)C+j(ayix6Ed#4*%ROAsTzs zfdP8^|E*;eKDd(we|md>rhnMUUby~4qER1wD?n#2`FDs)pW$v(Ygp26ynREELOX8? z(XW1XH_;*gJCYsx<9`Ne@xa%E^qUvi20#Aee+B8?r`nIFQ%?C#pxrlM%EA5uS>I(d z=FPIM`S_XGFJ%q7Dc@g!b-$@>ZADE}mAeJx@Ps5afR{K&4dmqxi{4;0L=ELdeYnb3 z1zdgrFU$w>a(a*&$7f^tzoW+U0zH8j*g`owoR{e%1#@`uKS~x$Yyd@SIxoJ*@e=Ov z0*-zs@FH5w+lwPhsgk9A0WYYF)QP;PE>TO>N$O;^Or4@mRi~*^b-Fr3ovD_qv(yT8 zwpyt^%Nxphs@12;crU2n)qIVRb!2UKWRJLj*XA1DC+bwaYT%uxQC8{}UaK8mtuJA? zng4H*epmX`7kz50tlo~g+NZ8@x0dUC>U!C$c*DENCyjZLhYGxH?T{UZ7kWqC=2N%J z=5vQnec7kJ;_fHyvI~68r|$Ntulv+DeCi(A6n0u$4R3u8Hosl6bve8)=d!5=u-W6C z;jk+XV@HhUx>5Y!vGz(h!*vB5>F_>&1iR!Yc7VhCmcy<<>2%%$kL4ZyIN9TkGq5|( zRjE4TEOrF%oS$VEoU2v|;q!QtcT_n$1eXn!;*50>XVh|C9lN5DFC(0=Gd9ZBc`>`= zQlYSgw`2Ay@9g3RHZbq-e7V7HfaL6o8^jw9Eng2hRxy6D;BvC+#`H&e2zh>>_pxNMoAJWq*ue zJh4A8QS_lNDaZ4AHJQCJDN=rzOcPvUMz2{jc#5E>o+h&+YgUPrraDdRHB0;Be4Zg& z)M_?;CA(s6SPop)Uck8bl7$%pS#bI6z#Z%W2h)Uo!tU@|v-Cu<{lQo3JX3g~5=XWYCxxxVo+iN9^pADdkKVR z*We>EP3*mdy~X}uA2_jFi4*?P!c)XClO$&O`nFF!=2PGCsmFclyFT?jpX%V|xRkzk zm_I*!MNn1I+|n5SVxmRSCXI(V%u0WK=*OR^*U)X5D`ou{4iwBSH=j8?JkUqiyI)02 zeY%*I7ZiO=*By4Co17BrF=QR-Ge}xP?)U>#H8l<6Tl7?dep*wsG!lFD%L&)#c}Ox) zuPMpzX+l3NsQv^7(qj@It@G40*4;H9}~6^rGt-k_&F=+Zz5 zBr-6zAI^Q;7gmFZ-I0TG;Cd{$Uh^IqE=_GM_ssqDE_G{r`i%B~E1fHkcW>wmFZiOg z@owvux;9Eq*==n;U5mK=O-(eG%d!|txLnYCP}pbD?W503&(zAJTO~eA-?}-xV!68F z)8HCQ#4E>RqV;J+*9g_PEYlT=*E^CItGhvvwxlU zB&V+TYUP%>pU}&+wo7}fv7u$K-qPG#{f!0E-8TS+tNpGlvdt>I189S`2MnNsb!U(yzM z_Ho}5|KRY(iMIz&8Z`fmd8aN|Qnu*yll)ifuX~+5%YpG=IC&mdByd-pIvM_Gns>u z)ukiSK4_avR9zQufcTPRRJ@f)zlS#+tJD_DD%PCh_$4T|I(nmVguI)5I!aSiHm+F$ zS9lvGuD5ry3`>(yPavl5Vpr;tWTY~b&Sqkfu=&|d>~gEQH)?mZT4)+}Wug*YZguTF zx)(_HUa0+-g6*Yrq)gCHTR)i(lGUXnK%cfvU#RqZWGJv^ls>!kdsqUd#Wa0R_TWj2 zl_laQ7`4^6)XG!ZYf6`Ffj2X(l|JchO%QkK+Y2z6xY<07_*tpHb#;vX& z8*0mG39&E4v{~;9ewKQlX4E!oI(jDPXBXRE(s+*yQf$^EoeUe;(pw~KMXX{AO(u7; zx)e!R%{~!miYlk0OV2(?hnm&a_PLGQ3~k)%nhu(Xv_->iVil)@+9YhDHJ%QokF9NA ziE5j|Qf6;h#inVo+6QP-CGAQZx5Z80+R1t(tJ??G_|&nmy_Sx0z4C+2)W$VY4HK0o zW1Orm9p(0iwzmG3Jjsm{*YM-8NUwON*g3^!mOVZ;R77p}E z&s?IzDCwx9S@)ReR>{LC?MwG$y|O=g#fs6FUDMoTv%E z{k0lDQ+2;u`}k`$k{wLqjjg}OF@noS$T5n8ts>Ma;^jJw>Elp2JB<4uA(+Eh^np0I zGq~<}sh`0(4qOUncAUd8i7)4v#H%nz z@;7iGRR@7^WBxeSDhI%22#v!Z+%)p%upp@&5?qym{)6(`?8BLGtl44k;T+=@raw?v zYX`V+LL?Y8#2U`WksNv$fzzk*|7p_WNIo}5rp8{*;nMjl?n?eRhauRll+P7h;&s$; ziy96FeW66Wy^uen4^Y?~J{$xgX6hU(oe_?2i%R~`e^Sfk`j2mApq5)_{Kq#kz9~V| zCCDwPaf$tBoPwy5u};zF1spnk9M@tl=m_>88~D@ygIW>4 z*a#{l>aYY*=etaiKM6_9rJ4Q7?WI)Rp`+Lv(eODqZm z6?Gg2yOkR|MNT=!dALHbR-CGNXa_KRK7(?A27t`~+X21+pb3CzJ{lJRlmbYF1Sn~b zkQbt+M;F>X50DE|l>pMiG|^NPJzM$h60VJ@=mupG@_kSdNtb}iCICxFMU$&8>*O-g zjj4=(V>v9}mQ)(&qp?W8Q!s~5Zv)m1 zAQBV_d4MYcl%kK`sDxUrqB(j9siFu0ITaO#pohqO3oz48c(kL3@D*+jnwW0F{796E z1VUvQPD=q+0@MJARM!C82A~;5M4Jd6Vx015`NT&iVvmR>fE9F{c7QhY=mJ;|$_)T! zSm+*T*99Php&J-ieD?>#qvuB}s5}o4GYDnqG10s3Iyw?W%g7=`&8e7Jfr^w#t?OwX zLt*B@GtP=(jtbF8`ifdIA&gp@2ihrs)<_T0NV znOb2feT9cqsEBbC8nfU}6%USHX^K!GecOS>%(5Ynz-xjnM1`m&+yhyK&l@RPZGbS7hE45nP76 znaNrpkP;hsO(B^x<(PCG>Vj%lAG`b0JGUz-#~!GQ;`ndLg_p zc0mHss1%H366epO(88CZN31j{LKCrbIWQ@cIsF<=Q=QH`pn`A{0zyix%go&!QOHMl zbOW1;ZZhs=CdW)-mN~pFjzqi30MbJy$@MrDZWe&%MvsXgpa4WPQ_+Aj(eiO%djMke z6_(?`V`4P(nK)GdGId3IktOE(z>>=0#^zM)(h8QMpj5QsvbW%S!R7tAiRoc58OkDQLeaeD)^->t`2=&&q#U3UKvosm?OUZH zGJv%#I2FNLfwADJ&oW`OZ>O505=^yj2rfPsr-*Jc2=~B8G2?Fx3?bvs3^>_2*#`fw zfwO3ay=uHw3M%CQ#%kttA}V54bNZUD*{!Yu< z+R)cnTre5bHIPqE#a2R3xCzm2p^PR|0c5l<1hx!72&@DqRJ^`wvHgl)T?@~M9?WR! z-@Y`LPmL_X*POBnjxz+{NC06ZghJE?l9qF3~ zmSX@W0>}a&`j+BU^o=1Oz6?N6(eeIa4fRdU2qIe7w6?ynwlHtmX^WShxqRt@c3;0a z{)*~p^>uZdrq$N?&-EwGitdk2!(LDjNs?aQ(%jI}+*CGw?C?lgS#3*A*^I(|r?k{? z9(Tuox<64W_INr)V}}_!3o4qL3v&Ud4D#nR*N++4?#mI9^9x3}ncz7!ycS}t-xOJi z;tzBa#ShB!@A5*iUX>izL%nC_3)&nj}o zwTfKs1;fs)sa{iMtTHfsUf5rd7{!l`7y8&FLOWiH&y1%rGYO4|;Gm1Dl~dB zo~xf_DOX&p$mQ-D&$aK^u<@oFdQogc zzuT~2;KJ&Sx`!Zz{rH1>wC%|8`&LFKo6E4NtZ3}$@FbaDR<>;2>e@4^)-_f&HPts3 z9=M!SxG$<}s;XUGQxz$mlJ6f>SJqt7xUQUqz0%7{4Vq`g;aAx z80rHFm!sc@MvhE8wsIs(CLUE~@;)?f%AczgXT;>M29j(U6p?TlpFJg9b|jH3S|XV& zo<~Ke_}#!|I>m2vzGXbNy#x=EHtQ#_J*LUzT(aP@U7p=W-tOc_8z|iyZ$m#UIeuUA zDgA;P*u*5t4Ej{ar=IYsPM_-XsV9BvDW7`Ur=IbtXMO7XKJ}bWJ?~RL@TnhaF+l?v z`0Cijli0-v@VUvUJzO3Qqm3guwcSLh`jvM)i$qRsxY*%bwTbf6CV%C99w$Lv#{Czu zd*N^#aIq7~seK0L(_YQzCZ~3EB2@Hg5p`SPGg(;4;G5}{fV>q zt%~_f&(1C!;PVompso--XGC{63HLf~kBsQi-a`)V%BbwZ8zdPzXva>_i^O~Q!2&XK z8}D7E?ZGLyc}`yE8s`Sdz|HSfByk)k%}tWUmY-XGU2>sAm`FbK6ddRE1}SDHJMP8s zIB^nA%@t-m{Ypli#A8 z!inzJNTPel5uNPbxE3!7XgN)K^$WPfJJ&s)OJ5?da_By-@`3=rf`L=^F29^%rSWDD zv!DCKz0paEcWQ<`&Pz}C^4iM_FR!}dSze_b@0FL`8(Dne;ac|aA?)E1?BSu2-E|my z8_Js;)b5KQ`qxHg>5cWUcdB+b2Q?N}ymx@Qwgf>FnL} zcmY706+D66$%~z}TuL!{K-Kv{Z)J;(8)jqZiy-}uNd~IxrIZxJ4x5BGUS{D5-t+tP$kRFEK1C*wj zYEP4z*7(Mi+kL+`S3H)8B3ipG6Se8N90{^P3BM}DCk{|GwA0he<_OI|Nhhb)Np>}D zyHz^4wzS>DmNYr-T$aR5{H!S$&9o0dOY5!AZ9bXfdLG30*SbVY6yGYgM9UakigO>Y z(z;yRp=TXz+v#+_=wn8v7Z7U%1IvaDfHS@u)1>Tb#P!BF<2f|t3 zADX^jcxlU}XdS%Ae#a5nG}`((j()s?yW&|aYlG}K$WDXoQjlE`Itj39~CVDbdTaduAHF0QpDP0v2H8t-SQmc5s%?=78dvEm#M zSFpFFNS{&qJ@%ID7F{h=uSARYN3Y0P!u{u=wk<8~6BJu5`oNDCwfzjW)wdP3al4JT z_&v9<`t{Wiwwc=E+PKAbAE4=LmVS?YpvEVSg*^}~*;BNwJzSD?NmgfZO$XfzB-3GU zwY80474HL7b57twi+?g(#nb3npJenbwpldpyFdb8*~NWj+`gh?d2uh0w5Vr@W?(z5 zN1Qfxv5ngt(h)L_fz{cj8P_hZ!0On0bnjB{y?pxv1=~G6%F|Z{wV7&~c8QJa+IZNb zsQYh&WJXL@w+}S3EpOu)*x&AMNp4fJiuW@#eK*+Z+B(|hmXda{-8_B97ST@!YMaK= z$hMMI?2Ue!%$UF)35wG)leh8GDYe;YJb_&45VhJSpk^1_c)U2e#G<%wQCpx4Ie#1) z*kXSi{4+Gwr=y!~{QW^AdxF`xEoWa1lD?wTd%M}1+PFnI-T=BJLGuJXt>Sdh{l`-2 zNWBl*_R27}OZS1S`<6w5ahc3u$?E!4c-!zAPav(uwdWRAV{g|+w2f_aCO_8tNmpA2w0yl%Ro0d|? zAVF-V{%Qcny~(q}Um^yZSCqZf11KJoag;qb23x5_+DjB=4{_MMW3bgo5XHm+6#F#% zWuhpGItCku!2Fs|-R;IwjKopofNU8@+T&P?sYE%|vGzFRqJ-l^G?=WXW8*3IVYIz{ z;OXpqMaoQ$t{4*)^ONPprxHXZj?CAroBt!+oL!bxtK`7_q)ll26ywd|?!{Cy$C$6K zY)b1_KRx|QBwOFN7SNe#v+(1zfEze5`?M_GzGE_!xBWqCaAflz$|cbUBG-?R`Z4mE*&r+Cxb^3#xoQbh zLeh|VLUCUBa|xFxI~=u&dt*yIM`G8PGqexnCa97BHT-EG4krw`h=bPav>}%=7JqQK zdXT<2a&U?e6kL?y!QtpR2?*b}_?93b#pjv*@pmfp#{sw1hTT@c=K~|hFuu{{wkqJH z1JTELt{Wdd5ZpJj0|^HdQ(DN$2H->-aGArU`X3SwRPgzk2@dqA@HmigpqBFuIGk?) zu!a9Si~+CB@Zft|w};a?@TdLP4udj?`IF=k43htG>Ilx+gH!_e)PE3`?`Gix2fV}y zFEG0thW#bxGv?Rem?INc9HXXlI-O%>)*Q>9?orJ2iD#E91m;!p134jHqvgK4 ze2OzFflCHH)LnFH9tR1tc+r(lMm_()N6*okuqX4wp42t)9kBe!Fj zTg_3kxhL{21$dHT`_tSOFyi%kPvkX*C(U=c|jKpz_dV(HTjliGbZ`*9FiGAn7-!BHyOuPTdBq z4ZzK~z3IWvb@FLzgpp7wMPHYtojq8{OEy#CA&Faskz^W`jGvNjG#@-h0vHJ-0jSCS zxeB%A03w>CC2hcIGe9dqytv_{<}9uxo(~(xRsZwneF(c0L3+2$mfn;}^g9Pi=cBO# z*apxBa2tT+KOF}#iU4Kod_=S?ZIg-+KFhBff>;xQ>zh3y0wFw0AVg=`Jf_7w*%_}5a$U!886E~S$tFp zOx&{-m@%SY3go*1gy_TwQv4y3 z%D9RVw-t>=W*JD@uqYGJ*eUN8ehq_P^yrEfS2S`UO9MbFfH*+L#`8Gc1Mn8WLJ*aN zw&lRq1DK(_8K>I;WYV#F#=o%~q4#1eDW|)m#gK8(jBWwt;e1N^OJc#Dj zd~=vl%&D=4REYFaCMGU|f<_}<5ebwirz+YS3O!_Ov;mU=(hf}44H=>`1Y+i;11dtQ z3s^pS7y>e`WFVOw$--R5ZaaDi0Vy+5G4}h=u*jg6if&;9^5#^yiQwg^5OH?`+YMkm z_`YBVx&B^wqdvmEYTvTGLzdOBr9l(D~*k~GR37# zq!(;A#O(s;1`vxUoS}x4>Gpi2Z_Laa2^Gw=7emO}Db`qp+HwHnJhPCA8@<*DQ9(si zHP(=_E>z@0pxK~o96C{YIMn&vLv!iL^*bZRHUtFI4vkPzAhivk4M6-Wu9a0~9C%Cy zkm)BZ6;8#!TY<^8t$Bz9pdzO+;=|yP~S15~_TEj|* zS&AO*VDvbEjC)aLBDjh4BDk@dY-6&~%WyQ@98m5CCRsw7SFyb0XV3y6!V3Y?Sd&(GK#{1%^Whg5Js01*Jkr~Be66W#fWZztF(jF~KH%{}x zO@`S{U|j&>BQvDj%jvKRBJ*xTDuRis0u;(*M2K$Xinf04a7ZA1W5DhRU!$s6+{{{| zky*nGm2Qy$R74puv8ioGtu!%=#QWXo(E!sm1DKW7^cBnyC`Av^$ct2r%kn{VB!D1!mN3HiiU;NH7uHiU3LhjP!z;AthFOUz&h?9)Ot@V$O*un+zc4Tn0>rR3)$)fL4HQ z0BrzbI>WLZ)-ZnS#%VrS-Uc8erwf=28u8IqP)WE72t6SWH|nV-nGH`#8 zhzfz7INc2(6HMr(I?JX)Hw9p(+H#z(0`Qu2G2g|Vuq#3fUwVRjw1!W=ee%3cJ~c{< zzQ(Iv;da~tf;Rxj4BZ1vydbNT*nT}^X#i*jkfkba>LObELH=P4^-axX&5adxO>65L zYYTHvJ?+#*?Y@3fp3U+5n=2aERW+Ao-yza>b<>7;Qu|Ske^}U#?qga!Ul<~3#qrAe zA!;t)D_*D;^E0>4^8MfQ_yH&$%xvWQ^g7=*KefC?o;mVUs>rLD{Eps0c@2IzKNTFW z3f25@vhb7nDIH!vui>X|$nSkI-z(vzSACH zsphk#PU1V~=dyg~bGq{ld`G;Ab-W1AF8HRkCdGHB`5DmHd@%nHjQRWKb-3QWsMNa` zY|?*3VfX0Os|v8?mj*()0nQOAn+OK9Aoe=nhD#`m8~TXyHprK;usD4~V) zLJ9q{-|tGO=0|@jp&RIx5<2QFKE3w8UoN2^4*o+4eet>O659C7pOnz$cfM0X^K!VN z>=iCschp}?=>2hjDWO>>|91&J^wa+;p%Fj&bqR%*a@lx#y@WnDgs)3aIi7pG{nekB z(BmgDx4&$DoXd{8uY_LtM@I=Aaly+0%57Xh^w5vKLR3;QgJ^a4RHE*xc^&lGYkm@- zet*~*pc|Uk1nKqBqeFDVzYhq|lxI4Ebm!S$4$vJ1J346hg=YllgKGv5O==%Dhlc-l zGFO~EifByhyB&1b_HPAg>+%ai^xRV;Lp16#)j>NZwa%f3%AO8V(dE~L=%e?K3el@q zT^FP;|NE&B&Hurc5M4Flhyd-{d=}C85mShM@~`g&=;2kr?VvXcE(p@3VYwaD*y#|R zn167P3R~tC)1trJ5u~wCpBSL|T{%P>XMBlh*9mV0Xyll`1?a_%`2qUeQ+F5B-S>Vb zM1%VIgVZtfA3-{KQEQ0WFZ@D?rf&UhkS6^4FU7Q_syIN8b-va?kNm+2(b8WW+Cf7X zo*JTaE(-?fmp@uW^yCNMAi8?pdjb0T*wcu9^Nry|dAD31pttA#IY1YVSXfNIxaY$F z-TtRxL3;9t$2#cSf4n3>QwMDi(pi5zK0yDt|DhlaIdxBffzZkdD~3iwKe{k{(%dtHTE~!-zU|bXfcuWo66Ot*$+zYF%Sh zQ&W9o;epHf_2NZ!O;xq4YpNo}Q}X?T>dN$n*EEKg;G8Kx8|*L84*=Iz)HFq2R?1Pi z{KR^InkYZ+!rtnSY#&(n3wTFz)F|Fa9A5wR6L&|AIikD z`iz>Qj^gbGn@;Qxyzr#9M4r>4rz5+Z-c1&&Md9~ePLi5a)mgk@;Ti22a*oz3)Y)n! z@6G4%zJvW4JCFAdylVJKEx!wa7hf9qH5Y77&9Vt!q&CTe_sj5NIi9upKthT=`Vttro^vtd@plI)x2z8k@n99sLa6 zf|s+g&JNc)JsM|&TuRhgwrSyw`v#v}6oCDue4TNb+QQahBe7-Jl60!iIXKb&l#bn|4-Wbv-lh*Gl*Ykz4=<01Syz6p_5Y{8>a`#;qwv`jM7SBByV{BG7lMF2_N%&Pkm}?H3 z3j-=ouGulX^pX5$s1tZ-9nLK$v8i->y-MNDpy^z4Ot^Fgn`|Z<%pGC@HdKii1lQvF zof5rD;TwWB7wEy1>6vRCUx07G5W!0#wY*e$tx}ipB*gNxMac6+eD|B5tj=kEu`J3#PBOlb42GHo_ZOt~a!#fLilh`E)6{pN3N=7``#b_S4$KW3K14 z4(_;#ZI5%%iKpb%(!0#%;9Z*=88!N6@1~Wp5oC4cHT9We{ZxO}%Foap=fK>N0KV{_ z=BRCDc*Tw%Q&BR`HM~lmGKtvXsW}d9bZiyZ@(Kf=Yaz~ikF41QWQ-f}UB0cn% zb$8UndtA$(+&YF^Vr@;ESPZn2%kNrBQ-{RvI)#3MW2J5#=O3n5>h;xpv#(iR!;@RD zS>Wh<=v2g>Cv)V$ID{ZW-3o~KQD^$W$`7^ zR4`6)#FnOho@(FNcKSTFGFHS-o0$@o>vxecMz2c#bZm z-hcMQI~j*aU);O_IgyzYG_i_% zkJ=*Ha%kMH_2y-_(0#nyrBfPDGhVWE=>3PZwau1}%C>RS>DOc11Omkklb!|8Eo^#; zN^Dwodv9SAv`A2_Xh)6SCXc%u{4z(aR9E1xSR)3%1Y1%TTM2t($E^Zz1+e)5Uw(RwNM~ z-^(tsdwH88L5nyG#T9sy>)U4DJoewx6t&-53fR81af@G^gt{O>u}#EosByd2Vqu|n zi#QfmJ8v}o9u}Q=*6|8h&HqDC+bZ5F_sZzrBr_~cAgk@h9x2;2Y&-#x^p)2=Y|@Ev zo28B0?Gu%I>uLA2T4*9xfj4URw)xt)chCK|)Yi$8QmbTF+PJN-#;va2sNLPht=928 zGvH&<^G0o&2?Vh^+AUJl)aspn536&JsI7_BI6<-1;y(nneP^j`7w=sMSxhrTZCNc6 zablh%KXT+>81ql} z_(#V4TgUD4TgMy2zYWdWE9roWu~(b?s5U#w!oOcnag=4P7XD#-%+Iy0xrvuOz8+cc z`zBmXvbRh=$#uO8!}ICyt$(|ig~=>n2S>`{-WKRp&?x@>>8J3(GX28fMESQ)<{wcb z{}z5gt@8xAX=3_wYz;&sIZ&XRe#GIk130z@T6?>|yL1-E+Mq~u4UQ@pb1Y_hONHtw z9AD!!j@E);5$=+IGMA-xY~V-{692(FV-vzfAjXCc7jcQ;5@CWvMMT1o;9994$N5Ob zGNVOCothhu6>HxPVQlnTrFdXPUXNp(aCjIL~L{t*Qa+hb0|8#zTU(iF!V<2 z&`~rPIywM{ME{Xfz7%&9Ux{niz)*9;hC(Uu z3LhkA^CSS!JdQeoz(0#*0G%9exrooBkFz-#(7EAS1b9jJKztU7d1Ml_*%)6L@mCft zCL4(_AR|^nAuJUTOCi#R&YEV@aiwOFN!)Kz+%ZiRak!ru3>}Wl0$#x82!VUFC-~GXGk3id{AX+|;^1iwO zKRz-nMIa&21uESD+>U>v1rQ_9^C*jvN`l4ChL8aOiC!BMG1kNyE>~3Y^CJ+h)&VIa zMhqrVY1`3cH$ay(26>4-y#rWOMBt+zy{?nX3>Aq8tQ6gH;#WH9p(n2mD;*ac*Ys!= zBZ5&mfJo2^EXD?+z6AL-o{@mk5{&kgq3nQwkTS~X({RO{l|!YSq@G>ki zvwV-Y9q(a?Zgi9JB7T!~DC$x-Z0D$hC>;jIMjdQ_vqC# z2-wmi@x?c9db5OnHtugF^lJN0OK3v}C%%|6`0Wz<-=V)Mp*R1<=`MbM%u^+_=;8k< zp>4l=qJ&OtxVMDvX?(VX7EI$FTc3Z47ym}iW%0dZo++W=j|R@AJ09W07jItoFV39N z&8M$__+AO!_R1ei=%wdAD53hV{JDfa3^C=kfBr=Yef4Jp=F&?)VDe-AoMGeP!WT>E z?CzYo)N*G&XKy(FrN?R9u$mw}^!oKg?N3}4pe?^?3)1q-Y-8f zMAL3yF>YQ_7ow-WdsLAAcF~>1)bFJSi>daPR|l!U$2mDRESVUj8)nsp=;?b$2I-0~ zz7wR$qo#+bf9_VI`zp>O`reR7IFm%t#YF%28jJSPu=@k_m6_Lc&_ z^VfnPefHfo0XpHwJ6M^;T>%<;-3LKx{P56XYTiC3M74W<8loRxcU*`L&YQ`3Kdz`I znsw#ToMK`p=ga7P;Lia%ZR9mXcij6lCm30DGTZ(PPFeBAT`zY~ZTSZQI{2OY=Fpy} zZV%FuY5y0b7v8xdNb_Fg)EhgB?j^e7-G%J3{!>Eq@=YTHH0q~prb+7BVw&@LPU>;V z!#6=7&KYv@9W2Y$zwPRvQ;uNl7qwh=^8*8dwE4|2mfF=U*&fzl|;^rrCUv=$ZH;oMIx9_`=F2p%Y(BcN1SscN1TH#_wjt z&Qqw#Z`8%Y%aDc|94EE<%Y^v6oGMM0Oe}b+B{hBLU#tvUv*W6fN*|G-mRaX`j z<}IzPs%x%pzPP~O)KI^vY+YkT!}@bZAeqMyzdz4cFu?ElbMgkS9_Kf%Av?t?VWFzW)#GMN(}5 literal 0 HcmV?d00001 diff --git a/metalearners/drlearner.py b/metalearners/drlearner.py index 6c03ab3..f2c67e1 100644 --- a/metalearners/drlearner.py +++ b/metalearners/drlearner.py @@ -150,12 +150,12 @@ def fit_all_nuisance( self._validate_treatment(w) self._validate_outcome(y, w) - self._treatment_variants_indices = [] + self._treatment_variants_mask = [] qualified_fit_params = self._qualified_fit_params(fit_params) for treatment_variant in range(self.n_variants): - self._treatment_variants_indices.append(w == treatment_variant) + self._treatment_variants_mask.append(w == treatment_variant) self._cv_split_indices: SplitIndices | None @@ -168,10 +168,8 @@ def fit_all_nuisance( for treatment_variant in range(self.n_variants): nuisance_jobs.append( self._nuisance_joblib_specifications( - X=index_matrix( - X, self._treatment_variants_indices[treatment_variant] - ), - y=y[self._treatment_variants_indices[treatment_variant]], + X=index_matrix(X, self._treatment_variants_mask[treatment_variant]), + y=y[self._treatment_variants_mask[treatment_variant]], model_kind=VARIANT_OUTCOME_MODEL, model_ord=treatment_variant, n_jobs_cross_fitting=n_jobs_cross_fitting, From 37c59a2ebc6fa4ff496870b3ea349ca7ae76e84f Mon Sep 17 00:00:00 2001 From: kyracho Date: Wed, 4 Sep 2024 12:48:11 -0700 Subject: [PATCH 6/6] remove changelog entry for 0.12.0 and files in docs/api --- CHANGELOG.rst | 8 ----- docs/api/metalearners.cross_fit_estimator.rst | 7 ----- docs/api/metalearners.data_generation.rst | 7 ----- docs/api/metalearners.drlearner.rst | 7 ----- docs/api/metalearners.explainer.rst | 7 ----- docs/api/metalearners.grid_search.rst | 7 ----- docs/api/metalearners.metalearner.rst | 7 ----- docs/api/metalearners.outcome_functions.rst | 7 ----- docs/api/metalearners.rlearner.rst | 7 ----- docs/api/metalearners.rst | 29 ------------------- docs/api/metalearners.slearner.rst | 7 ----- docs/api/metalearners.tlearner.rst | 7 ----- docs/api/metalearners.utils.rst | 7 ----- docs/api/metalearners.xlearner.rst | 7 ----- docs/api/modules.rst | 7 ----- 15 files changed, 128 deletions(-) delete mode 100644 docs/api/metalearners.cross_fit_estimator.rst delete mode 100644 docs/api/metalearners.data_generation.rst delete mode 100644 docs/api/metalearners.drlearner.rst delete mode 100644 docs/api/metalearners.explainer.rst delete mode 100644 docs/api/metalearners.grid_search.rst delete mode 100644 docs/api/metalearners.metalearner.rst delete mode 100644 docs/api/metalearners.outcome_functions.rst delete mode 100644 docs/api/metalearners.rlearner.rst delete mode 100644 docs/api/metalearners.rst delete mode 100644 docs/api/metalearners.slearner.rst delete mode 100644 docs/api/metalearners.tlearner.rst delete mode 100644 docs/api/metalearners.utils.rst delete mode 100644 docs/api/metalearners.xlearner.rst delete mode 100644 docs/api/modules.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 94854f2..34eb7f8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,14 +7,6 @@ Changelog ========= -0.12.0 (2024-09-03) -------------------- - -**New features** - -* Rename ``_treatment_variants_indices`` to ``_treatment_variants_mask``in ``metalearner``, ``xlearner``, ``tlearner``, ``drlearner``, and ``test_learner``. - - 0.11.0 (2024-09-xx) ------------------- diff --git a/docs/api/metalearners.cross_fit_estimator.rst b/docs/api/metalearners.cross_fit_estimator.rst deleted file mode 100644 index ea548a4..0000000 --- a/docs/api/metalearners.cross_fit_estimator.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.cross\_fit\_estimator module -========================================= - -.. automodule:: metalearners.cross_fit_estimator - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.data_generation.rst b/docs/api/metalearners.data_generation.rst deleted file mode 100644 index fdd67f3..0000000 --- a/docs/api/metalearners.data_generation.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.data\_generation module -==================================== - -.. automodule:: metalearners.data_generation - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.drlearner.rst b/docs/api/metalearners.drlearner.rst deleted file mode 100644 index 4745ae9..0000000 --- a/docs/api/metalearners.drlearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.drlearner module -============================= - -.. automodule:: metalearners.drlearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.explainer.rst b/docs/api/metalearners.explainer.rst deleted file mode 100644 index 4a55020..0000000 --- a/docs/api/metalearners.explainer.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.explainer module -============================= - -.. automodule:: metalearners.explainer - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.grid_search.rst b/docs/api/metalearners.grid_search.rst deleted file mode 100644 index 1f1d811..0000000 --- a/docs/api/metalearners.grid_search.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.grid\_search module -================================ - -.. automodule:: metalearners.grid_search - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.metalearner.rst b/docs/api/metalearners.metalearner.rst deleted file mode 100644 index d0d7845..0000000 --- a/docs/api/metalearners.metalearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.metalearner module -=============================== - -.. automodule:: metalearners.metalearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.outcome_functions.rst b/docs/api/metalearners.outcome_functions.rst deleted file mode 100644 index f2462d5..0000000 --- a/docs/api/metalearners.outcome_functions.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.outcome\_functions module -====================================== - -.. automodule:: metalearners.outcome_functions - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.rlearner.rst b/docs/api/metalearners.rlearner.rst deleted file mode 100644 index 1707a55..0000000 --- a/docs/api/metalearners.rlearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.rlearner module -============================ - -.. automodule:: metalearners.rlearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.rst b/docs/api/metalearners.rst deleted file mode 100644 index df0906e..0000000 --- a/docs/api/metalearners.rst +++ /dev/null @@ -1,29 +0,0 @@ -metalearners package -==================== - -Submodules ----------- - -.. toctree:: - :maxdepth: 4 - - metalearners.cross_fit_estimator - metalearners.data_generation - metalearners.drlearner - metalearners.explainer - metalearners.grid_search - metalearners.metalearner - metalearners.outcome_functions - metalearners.rlearner - metalearners.slearner - metalearners.tlearner - metalearners.utils - metalearners.xlearner - -Module contents ---------------- - -.. automodule:: metalearners - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.slearner.rst b/docs/api/metalearners.slearner.rst deleted file mode 100644 index abfa3b7..0000000 --- a/docs/api/metalearners.slearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.slearner module -============================ - -.. automodule:: metalearners.slearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.tlearner.rst b/docs/api/metalearners.tlearner.rst deleted file mode 100644 index 086debc..0000000 --- a/docs/api/metalearners.tlearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.tlearner module -============================ - -.. automodule:: metalearners.tlearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.utils.rst b/docs/api/metalearners.utils.rst deleted file mode 100644 index 0368271..0000000 --- a/docs/api/metalearners.utils.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.utils module -========================= - -.. automodule:: metalearners.utils - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/metalearners.xlearner.rst b/docs/api/metalearners.xlearner.rst deleted file mode 100644 index 1e7ded8..0000000 --- a/docs/api/metalearners.xlearner.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners.xlearner module -============================ - -.. automodule:: metalearners.xlearner - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/modules.rst b/docs/api/modules.rst deleted file mode 100644 index c24a10e..0000000 --- a/docs/api/modules.rst +++ /dev/null @@ -1,7 +0,0 @@ -metalearners -============ - -.. toctree:: - :maxdepth: 4 - - metalearners