From 6062c75fa27c7a55f11bb704e62d1b2e176866ad Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Sun, 24 Mar 2024 21:01:07 +0100 Subject: [PATCH 01/13] add first draft of vignette, additional edits --- R/bmm_model_IMM.R | 30 +++++----- R/bmm_model_mixture3p.R | 2 +- R/bmm_model_sdmSimple.R | 4 +- R/helpers-model.R | 6 +- R/helpers-prior.R | 15 +++++ man/IMM.Rd | 87 ++++++++++++++++++++++++++- man/SDM.Rd | 22 ++++++- man/mixture2p.Rd | 21 ++++++- man/mixture3p.Rd | 25 +++++++- vignettes/articles/vwm-crt.Rmd | 2 +- vignettes/extract-info.Rmd | 105 +++++++++++++++++++++++++++++++++ 11 files changed, 291 insertions(+), 28 deletions(-) create mode 100644 vignettes/extract-info.Rmd diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index 57847673..40e192f4 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -40,9 +40,9 @@ fixed_parameters = list(mu1 = 0, mu2 = 0, kappa2 = -100), default_priors = list( mu1 = list(main = "student_t(1, 0, 1)"), - kappa = list(main = "normal(2,1)", effects = "normal(0,1)"), - a = list(main = "normal(0,1)", effects = "normal(0,1)"), - c = list(main = "normal(0,1)", effects = "normal(0,1)") + kappa = list(main = "normal(2, 1)", effects = "normal(0, 1)"), + a = list(main = "normal(0, 1)", effects = "normal(0, 1)"), + c = list(main = "normal(0, 1)", effects = "normal(0, 1)") ), void_mu = FALSE ), @@ -92,9 +92,9 @@ fixed_parameters = list(mu1 = 0, mu2 = 0, kappa2 = -100), default_priors = list( mu1 = list(main = "student_t(1, 0, 1)"), - kappa = list(main = "normal(2,1)", effects = "normal(0,1)"), - c = list(main = "normal(0,1)", effects = "normal(0,1)"), - s = list(main = "normal(0,1)", effects = "normal(0,1)") + kappa = list(main = "normal(2, 1)", effects = "normal(0, 1)"), + c = list(main = "normal(0, 1)", effects = "normal(0, 1)"), + s = list(main = "normal(0, 1)", effects = "normal(0, 1)") ), void_mu = FALSE ), @@ -147,10 +147,10 @@ fixed_parameters = list(mu1 = 0, mu2 = 0, kappa2 = -100), default_priors = list( mu1 = list(main = "student_t(1, 0, 1)"), - kappa = list(main = "normal(2,1)", effects = "normal(0,1)"), - a = list(main = "normal(0,1)", effects = "normal(0,1)"), - c = list(main = "normal(0,1)", effects = "normal(0,1)"), - s = list(main = "normal(0,1)", effects = "normal(0,1)") + kappa = list(main = "normal(2, 1)", effects = "normal(0, 1)"), + a = list(main = "normal(0, 1)", effects = "normal(0, 1)"), + c = list(main = "normal(0, 1)", effects = "normal(0, 1)"), + s = list(main = "normal(0, 1)", effects = "normal(0, 1)") ), void_mu = FALSE ), @@ -169,11 +169,11 @@ #' @name IMM #' @details `r model_info(.model_IMMfull(), components =c('domain', 'task', 'name', 'citation'))` #' #### Version: `IMMfull` -#' `r model_info(.model_IMMfull(), components =c('requirements', 'parameters', 'fixed_parameters'))` +#' `r model_info(.model_IMMfull(), components = c('requirements', 'parameters', 'fixed_parameters', 'links', 'prior'))` #' #### Version: `IMMbsc` -#' `r model_info(.model_IMMbsc(), components =c('requirements', 'parameters', 'fixed_parameters'))` +#' `r model_info(.model_IMMbsc(), components = c('requirements', 'parameters', 'fixed_parameters', 'links', 'prior'))` #' #### Version: `IMMabc` -#' `r model_info(.model_IMMabc(), components =c('requirements', 'parameters', 'fixed_parameters'))` +#' `r model_info(.model_IMMabc(), components =c('requirements', 'parameters', 'fixed_parameters', 'links', 'prior'))` #' #' Additionally, all IMM models have an internal parameter that is fixed to 0 to #' allow the model to be identifiable. This parameter is not estimated and is not @@ -220,8 +220,8 @@ #' #' # specify the full IMM model with explicit column names for non-target features and distances #' model1 <- IMMfull(resp_err = "dev_rad", -#' nt_features = paste0('col_nt',1:7), -#' nt_distances = paste0('dist_nt',1:7), +#' nt_features = paste0('col_nt', 1:7), +#' nt_distances = paste0('dist_nt', 1:7), #' setsize = 'set_size') #' #' # fit the model diff --git a/R/bmm_model_mixture3p.R b/R/bmm_model_mixture3p.R index a1d7d857..86eba92f 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/bmm_model_mixture3p.R @@ -42,7 +42,7 @@ fixed_parameters = list(mu1 = 0, mu2 = 0, kappa2 = -100), default_priors = list( mu1 = list(main = "student_t(1, 0, 1)"), - kappa = list(main = "normal(2,1)", effects = "normal(0,1)"), + kappa = list(main = "normal(2, 1)", effects = "normal(0, 1)"), thetat = list(main = "logistic(0, 1)"), thetant = list(main = "logistic(0, 1)") ), diff --git a/R/bmm_model_sdmSimple.R b/R/bmm_model_sdmSimple.R index 666a70cd..0ed49e18 100644 --- a/R/bmm_model_sdmSimple.R +++ b/R/bmm_model_sdmSimple.R @@ -32,8 +32,8 @@ fixed_parameters = list(mu = 0), default_priors = list( mu = list(main = "student_t(1, 0, 1)"), - kappa = list(main = "student_t(5,1.75,0.75)", effects = "normal(0,1)"), - c = list(main = "student_t(5,2,0.75)", effects = "normal(0,1)") + kappa = list(main = "student_t(5, 1.75, 0.75)", effects = "normal(0, 1)"), + c = list(main = "student_t(5, 2, 0.75)", effects = "normal(0, 1)") ), void_mu = FALSE ), diff --git a/R/helpers-model.R b/R/helpers-model.R index 763e31ea..a876274e 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -279,6 +279,9 @@ model_info.bmmmodel <- function(model, components = 'all') { links <- model$links links_info <- summarise_links(links) + priors <- model$default_priors + priors_info <- summarise_default_prior(priors) + info_all <- list( domain = paste0("* **Domain:** ", model$domain, "\n\n"), task = paste0("* **Task:** ", model$task, "\n\n"), @@ -288,7 +291,8 @@ model_info.bmmmodel <- function(model, components = 'all') { requirements = paste0("* **Requirements:** \n\n ", model$requirements, "\n\n"), parameters = paste0("* **Parameters:** \n\n ", par_info, "\n"), fixed_parameters = paste0("* **Fixed parameters:** \n\n ", fixed_par_info, "\n"), - links = paste0("* **Default parameter links:** \n\n ", links_info, "\n") + links = paste0("* **Default parameter links:** \n\n - ", links_info, "\n\n"), + prior = paste0("* **Default priors:** \n\n", priors_info, "\n") ) if (length(components) == 1 && components == 'all') { diff --git a/R/helpers-prior.R b/R/helpers-prior.R index adf7e373..f1ce3230 100644 --- a/R/helpers-prior.R +++ b/R/helpers-prior.R @@ -258,3 +258,18 @@ combine_prior <- function(prior1, prior2) { } return(prior) } + + +summarise_default_prior <- function(prior_list) { + pars <- names(prior_list) + prior_info <- "" + for (par in pars) { + prior_info <- paste0(prior_info, " - `", par, "`:\n") + types <- names(prior_list[[par]]) + for (type in types) { + prior <- prior_list[[par]][[type]] + prior_info <- paste0(prior_info, " - `", type, "`: ", prior, "\n") + } + } + prior_info +} diff --git a/man/IMM.Rd b/man/IMM.Rd index 85298ccd..ef54e551 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -100,6 +100,37 @@ Interference measurement model by Oberauer and Lin (2017). \item \code{mu2} = 0 \item \code{kappa2} = -100 } +\item \strong{Default parameter links:} +\itemize{ +\item kappa = log; a = identity; c = identity; s = log +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu1}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: normal(2, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{a}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{c}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{s}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +} } } @@ -127,6 +158,32 @@ Interference measurement model by Oberauer and Lin (2017). \item \code{mu2} = 0 \item \code{kappa2} = -100 } +\item \strong{Default parameter links:} +\itemize{ +\item kappa = log; c = identity; s = log +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu1}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: normal(2, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{c}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{s}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +} } } @@ -154,6 +211,32 @@ Interference measurement model by Oberauer and Lin (2017). \item \code{mu2} = 0 \item \code{kappa2} = -100 } +\item \strong{Default parameter links:} +\itemize{ +\item kappa = log; a = identity; c = identity +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu1}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: normal(2, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{a}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{c}: +\itemize{ +\item \code{main}: normal(0, 1) +\item \code{effects}: normal(0, 1) +} +} } Additionally, all IMM models have an internal parameter that is fixed to 0 to @@ -179,8 +262,8 @@ ff <- bmmformula( # specify the full IMM model with explicit column names for non-target features and distances model1 <- IMMfull(resp_err = "dev_rad", - nt_features = paste0('col_nt',1:7), - nt_distances = paste0('dist_nt',1:7), + nt_features = paste0('col_nt', 1:7), + nt_distances = paste0('dist_nt', 1:7), setsize = 'set_size') # fit the model diff --git a/man/SDM.Rd b/man/SDM.Rd index 7f393a6a..2ddf8c2f 100644 --- a/man/SDM.Rd +++ b/man/SDM.Rd @@ -51,8 +51,26 @@ and how to use it. \item \code{mu} = 0 } \item \strong{Default parameter links:} - -mu = tan_half; c = log; kappa = log +\itemize{ +\item mu = tan_half; c = log; kappa = log +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: student_t(5, 1.75, 0.75) +\item \code{effects}: normal(0, 1) +} +\item \code{c}: +\itemize{ +\item \code{main}: student_t(5, 2, 0.75) +\item \code{effects}: normal(0, 1) +} +} } } \examples{ diff --git a/man/mixture2p.Rd b/man/mixture2p.Rd index 1a09b21a..b4d50941 100644 --- a/man/mixture2p.Rd +++ b/man/mixture2p.Rd @@ -49,8 +49,25 @@ Two-parameter mixture model by Zhang and Luck (2008). \item \code{kappa2} = -100 } \item \strong{Default parameter links:} - -mu1 = identity; kappa = log; thetat = identity +\itemize{ +\item mu1 = identity; kappa = log; thetat = identity +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu1}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: normal(2, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{thetat}: +\itemize{ +\item \code{main}: logistic(0, 1) +} +} } } \examples{ diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index 782b3ad2..a6ba9e9e 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -68,8 +68,29 @@ Three-parameter mixture model by Bays et al (2009). \item \code{kappa2} = -100 } \item \strong{Default parameter links:} - -mu1 = identity; kappa = log; thetat = identity; thetant = identity +\itemize{ +\item mu1 = identity; kappa = log; thetat = identity; thetant = identity +} +\item \strong{Default priors:} +\itemize{ +\item \code{mu1}: +\itemize{ +\item \code{main}: student_t(1, 0, 1) +} +\item \code{kappa}: +\itemize{ +\item \code{main}: normal(2, 1) +\item \code{effects}: normal(0, 1) +} +\item \code{thetat}: +\itemize{ +\item \code{main}: logistic(0, 1) +} +\item \code{thetant}: +\itemize{ +\item \code{main}: logistic(0, 1) +} +} } } \examples{ diff --git a/vignettes/articles/vwm-crt.Rmd b/vignettes/articles/vwm-crt.Rmd index 7e4a2b1c..57b6b549 100644 --- a/vignettes/articles/vwm-crt.Rmd +++ b/vignettes/articles/vwm-crt.Rmd @@ -59,7 +59,7 @@ The `bmm` package implements several measurement models for analyzing continuous #### The Interference Measurement Model [@Oberauer_Lin_2017] {.unnumbered} - - see `?IMM` and `vignette("imm")` + - see `?IMM` and `vignette("IMM")` #### The Signal Discrimination Model (SDM) by [@Oberauer_2023] {.unnumbered} diff --git a/vignettes/extract-info.Rmd b/vignettes/extract-info.Rmd new file mode 100644 index 00000000..aad4befa --- /dev/null +++ b/vignettes/extract-info.Rmd @@ -0,0 +1,105 @@ +--- +title: "Extracting default priors, the generated Stan code and data" +output: bookdown::html_document2 +author: + - Ven Popov + - Gidon Frischkorn +bibliography: REFERENCES.bib +header-includes: + - \usepackage{amsmath} +vignette: > + %\VignetteIndexEntry{Extracting default priors, the generated Stan code and data} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +pkgdown: + as_is: true +--- + + +```{r, include = FALSE} +options(crayon.enabled = TRUE, width = 800) +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + dev = "jpeg", + dpi = 100 +) +fansi::set_knit_hooks(knitr::knit_hooks, which = c("output","message","error")) +``` + +# Default priors for models in the `bmm` package + +Each model in `bmm` comes with default priors on all of its parameters. Unlike in the `brms` package, the default priors in `bmm` are informative, based on current expert knowledge in the domain of the model. These default priors help with model +identifiability and improve estimation. However, because the priors are informed, it is even more important for you to understand what priors are used when you estimate a model, or when you report the results of a model fit. + +You can use the function `default_prior()` from the `brms` package to extract the default priors for a model. The arguments to `default_prior` are the same as for the `fit_model` function in `bmm`. For example, if you want to extract the default priors for the SDM model (`vignette("sdm-simple")`), where you have a set_size categorical predictor of `c` and `kappa`, you can use the following code: + + +```{r message=FALSE, warning=FALSE} +library(bmm) + +# specify the formula +default_prior(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) +``` + +In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is supressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both kappa and c have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: + +```{r fig.width=4.5, fig.height=4} +log_c <- seq(-2,6, 0.01) +y <- brms::dstudent_t(log_c, df = 5, mu = 2, sigma = 0.75) +plot(log_c, y, type = 'l', xlab = 'log(c)', ylab = 'Density', main = 'Prior distribution for log(c)') +``` + +This corresponds to the following log-T prior over the native scale of `c`, with a median of ~7.4, and 80% of the prior mass between 2.44 and 22.35: + +```{r fig.width=4.5, fig.height=4} +c <- seq(0, 50, 0.01) +y <- brms::dstudent_t(log(c), df = 5, mu = 2, sigma = 0.75) / c +plot(c, y, type = 'l', xlab = 'c', ylab = 'Density', main = 'Prior distribution for c') +``` + +The default prior for `kappa` is similar, with a lower mean, a student-t distribution with 5 degrees of freedom, a mean of 1.75, and a standard deviation of 0.75, which corresponds to a median of 3.5 on the native scale. + +If we had retained the intercept in the formula, the default prior above would be placed on the intercept, while the effects of each factor level relative to the intercept would have a default prior of normal(0, 1): + +```{r message=FALSE, warning=FALSE} +default_prior(bmf(c ~ 1 + set_size, kappa ~ 1 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) +``` + +You can also see that in both cases, the last line is "constant(0)" on the Intercept of the `mu` parameter, which is fixed to 0 by default in the model, and is not estimated. You might wander why it doesn't say "mu" in the "dpar" column of that prior - this is because `brms` assumes mu is the default parameter in all models, so it hides it in the output. If you wanted to estimate mu, instead of leaving it fixed, the prior for it would change as well: + +```{r message=FALSE, warning=FALSE} +default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) +``` +mu uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of mu from -pi to pi. You will also notice above that for the regression coefficients on mu, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it. + +All of the above examples make an important point - priors are always specified on the scale at which the parameters are sampled. You can always check the documentation for a given model to see the links for the parameters (e.g. `?sdmSimple`). + + +# Extracting the Stan code + +The Stan code used for fitting a model is generated together by `bmm` and `brms`. `bmm` takes care of the code specific to the model, while `brms` generates the code for the regression syntax, priors and everything else. If you want to get the Stan code that would be used for fitting a model, so that you can inspect it or modify it, you can use the `stancode()` function from `brms`: + +```{r message=FALSE, warning=FALSE} +stancode(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) +``` From a821cbd875cc00a9c187d0531ebf7db3120c4fa5 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 01:07:07 +0100 Subject: [PATCH 02/13] add bmm version to first line of stancode --- R/helpers-model.R | 16 +++++++++++++++- R/helpers-postprocess.R | 8 +++++++- vignettes/extract-info.Rmd | 14 +++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/R/helpers-model.R b/R/helpers-model.R index a876274e..2d71af32 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -653,5 +653,19 @@ stancode.bmmformula <- function(object, data, model, prior = NULL, ...) { fit_args <- combine_args(nlist(config_args, dots, prior)) fit_args$object <- fit_args$formula fit_args$formula <- NULL - brms::do_call(brms::stancode, fit_args) + code <- brms::do_call(brms::stancode, fit_args) + add_bmm_version_to_stancode(code) +} + + +add_bmm_version_to_stancode <- function(stancode) { + version <- packageVersion("bmm") + text <- paste0("and bmm ", version) + brms_comp <- regexpr("brms.*(?=\\n)", stancode, perl = T) + insert_loc <- brms_comp + attr(brms_comp, "match.length") - 1 + new_stancode <- paste0(substr(stancode, 1, insert_loc), + " ", text, + substr(stancode, insert_loc + 1, nchar(stancode))) + class(new_stancode) <- class(stancode) + new_stancode } diff --git a/R/helpers-postprocess.R b/R/helpers-postprocess.R index f316ff93..75fe53cf 100644 --- a/R/helpers-postprocess.R +++ b/R/helpers-postprocess.R @@ -26,9 +26,15 @@ postprocess_brm.bmmmodel <- function(model, fit, ...) { dots <- list(...) class(fit) <- c('bmmfit','brmsfit') fit$version$bmm <- utils::packageVersion('bmm') - fit$bmm <- nlist(model, user_formula = dots$user_formula, configure_opts = dots$configure_opts) + fit$bmm <- nlist(model, user_formula = dots$user_formula, + configure_opts = dots$configure_opts) attr(fit$data, 'data_name') <- attr(dots$fit_args$data, 'data_name') + + # add bmm version to the stancode + fit$model <- add_bmm_version_to_stancode(fit$model) + fit <- NextMethod('postprocess_brm') + # clean up environments stored in the fit object reset_env(fit) } diff --git a/vignettes/extract-info.Rmd b/vignettes/extract-info.Rmd index aad4befa..c37c4ad7 100644 --- a/vignettes/extract-info.Rmd +++ b/vignettes/extract-info.Rmd @@ -98,8 +98,20 @@ All of the above examples make an important point - priors are always specified The Stan code used for fitting a model is generated together by `bmm` and `brms`. `bmm` takes care of the code specific to the model, while `brms` generates the code for the regression syntax, priors and everything else. If you want to get the Stan code that would be used for fitting a model, so that you can inspect it or modify it, you can use the `stancode()` function from `brms`: -```{r message=FALSE, warning=FALSE} +```{r comment = "", collapse=FALSE} stancode(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, model = sdmSimple(resp_err = 'dev_rad')) ``` + + +Alternatively, if you already have a fitted model object, you can just call `stancode()` on that object, which will give you the same result: + +```r +fit <- fit_model(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) +stancode(fit) +``` + + From 2262dfab9be2a4301d6c492d1dfba50a88652241 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 01:25:45 +0100 Subject: [PATCH 03/13] finish vignette --- R/helpers-data.R | 1 + R/utils.R | 2 +- vignettes/extract-info.Rmd | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/R/helpers-data.R b/R/helpers-data.R index 74dc5da2..5e48fe8f 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -245,6 +245,7 @@ rad2deg <- function(rad){ standata.bmmformula <- function(object, data, model, prior = NULL, ...) { # check model, formula and data, and transform data if necessary formula <- object + configure_options(list(...)) model <- check_model(model, data, formula) data <- check_data(model, data, formula) formula <- check_formula(model, data, formula) diff --git a/R/utils.R b/R/utils.R index a8c675f9..717f427a 100644 --- a/R/utils.R +++ b/R/utils.R @@ -357,7 +357,7 @@ order_data_query <- function(model, data, formula) { when using brms postprocessing methods that rely on the data order, such as generating predictions. Assuming you assigned the result of fit_model to a variable called `fit`, you can extract the sorted data from the fitted object - with:\n\n data_sorted <- fit$fit_args$data", width = 80), collapse = "\n") + with:\n\n data_sorted <- fit$data", width = 80), collapse = "\n") caution_msg <- crayon::red(caution_msg) message(caution_msg) } diff --git a/vignettes/extract-info.Rmd b/vignettes/extract-info.Rmd index c37c4ad7..d1bb8f55 100644 --- a/vignettes/extract-info.Rmd +++ b/vignettes/extract-info.Rmd @@ -1,5 +1,5 @@ --- -title: "Extracting default priors, the generated Stan code and data" +title: "Extracting default priors, the generated Stan code and Stan data" output: bookdown::html_document2 author: - Ven Popov @@ -8,7 +8,7 @@ bibliography: REFERENCES.bib header-includes: - \usepackage{amsmath} vignette: > - %\VignetteIndexEntry{Extracting default priors, the generated Stan code and data} + %\VignetteIndexEntry{Extracting default priors, the generated Stan code and Stan data} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} pkgdown: @@ -114,4 +114,14 @@ fit <- fit_model(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), stancode(fit) ``` +# Extracting the Stan data +If you want to extract the data that would be used for fitting a model, you can use the `standata()` function from `brms`. This function will return a list with the data that would be passed to Stan for fitting the model. + +```{r} +sd <- standata(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad'), + sort_data = TRUE) +str(sd) +``` From 53f9b9133ad9aa8703f7e79e5a9a2c4c60ec80eb Mon Sep 17 00:00:00 2001 From: GidonFrischkorn Date: Mon, 25 Mar 2024 08:24:34 +0100 Subject: [PATCH 04/13] Minor spelling & formatting edits --- vignettes/extract-info.Rmd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vignettes/extract-info.Rmd b/vignettes/extract-info.Rmd index d1bb8f55..31031dae 100644 --- a/vignettes/extract-info.Rmd +++ b/vignettes/extract-info.Rmd @@ -56,7 +56,7 @@ default_prior(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), model = sdmSimple(resp_err = 'dev_rad')) ``` -In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is supressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both kappa and c have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: +In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is suppressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both kappa and c have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: ```{r fig.width=4.5, fig.height=4} log_c <- seq(-2,6, 0.01) @@ -89,7 +89,8 @@ default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), data = OberauerLin_2017, model = sdmSimple(resp_err = 'dev_rad')) ``` -mu uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of mu from -pi to pi. You will also notice above that for the regression coefficients on mu, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it. + +The `mu` parameter uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of mu from -pi to pi. You will also notice above that for the regression coefficients on `mu`, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it, if you want to calculate Bayes Factors or use other Bayesian inference methods. All of the above examples make an important point - priors are always specified on the scale at which the parameters are sampled. You can always check the documentation for a given model to see the links for the parameters (e.g. `?sdmSimple`). From e5e28fbe0cb1585f5c0732496f9c0a3f601f5752 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 14:06:10 +0100 Subject: [PATCH 05/13] wrap parameters in code, directions to set_prior --- vignettes/extract-info.Rmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vignettes/extract-info.Rmd b/vignettes/extract-info.Rmd index 31031dae..1e7ccd42 100644 --- a/vignettes/extract-info.Rmd +++ b/vignettes/extract-info.Rmd @@ -50,13 +50,12 @@ You can use the function `default_prior()` from the `brms` package to extract th ```{r message=FALSE, warning=FALSE} library(bmm) -# specify the formula default_prior(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, model = sdmSimple(resp_err = 'dev_rad')) ``` -In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is suppressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both kappa and c have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: +In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is suppressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both `kappa` and `c` have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: ```{r fig.width=4.5, fig.height=4} log_c <- seq(-2,6, 0.01) @@ -82,7 +81,7 @@ default_prior(bmf(c ~ 1 + set_size, kappa ~ 1 + set_size), model = sdmSimple(resp_err = 'dev_rad')) ``` -You can also see that in both cases, the last line is "constant(0)" on the Intercept of the `mu` parameter, which is fixed to 0 by default in the model, and is not estimated. You might wander why it doesn't say "mu" in the "dpar" column of that prior - this is because `brms` assumes mu is the default parameter in all models, so it hides it in the output. If you wanted to estimate mu, instead of leaving it fixed, the prior for it would change as well: +You can also see that in both cases, the last line is "constant(0)" on the Intercept of the `mu` parameter, which is fixed to 0 by default in the model, and is not estimated. You might wonder why it doesn't say `mu` in the `dpar` column of that prior - this is because `brms` assumes `mu` is the default parameter in all models, so it hides it in the output. If you wanted to estimate `mu`, instead of leaving it fixed, the prior for it would change as well: ```{r message=FALSE, warning=FALSE} default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), @@ -90,10 +89,11 @@ default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), model = sdmSimple(resp_err = 'dev_rad')) ``` -The `mu` parameter uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of mu from -pi to pi. You will also notice above that for the regression coefficients on `mu`, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it, if you want to calculate Bayes Factors or use other Bayesian inference methods. +The `mu` parameter uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of `mu` from -pi to pi. You will also notice above that for the regression coefficients on `mu`, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it, if you want to calculate Bayes Factors or use other Bayesian inference methods. All of the above examples make an important point - priors are always specified on the scale at which the parameters are sampled. You can always check the documentation for a given model to see the links for the parameters (e.g. `?sdmSimple`). +To overwrite the default priors and set your own, you can use the `set_prior` function from `brms`. For more information, see `?brms::set_prior`. # Extracting the Stan code From e97571422e33da312983f0d713f02f2147336b0c Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 14:20:48 +0100 Subject: [PATCH 06/13] merge with develop and add link to reorganized articles section --- _pkgdown.yml | 1 + vignettes/{extract-info.Rmd => bmm_extract_info.Rmd} | 0 2 files changed, 1 insertion(+) rename vignettes/{extract-info.Rmd => bmm_extract_info.Rmd} (100%) diff --git a/_pkgdown.yml b/_pkgdown.yml index 317c6e6c..1aaf25d4 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -79,3 +79,4 @@ articles: Guides to using various features of the **bmm** package contents: - bmm_bmmformula + - bmm_extract_info diff --git a/vignettes/extract-info.Rmd b/vignettes/bmm_extract_info.Rmd similarity index 100% rename from vignettes/extract-info.Rmd rename to vignettes/bmm_extract_info.Rmd From a2d42429efc9766d3f66db8170428df3a93f849d Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 16:43:06 +0100 Subject: [PATCH 07/13] deprecate fit_model() in favor of bmm() --- NAMESPACE | 1 + NEWS.md | 3 +- R/{fit_model.R => bmm.R} | 66 +++++++++++++++------- R/bmm_model_IMM.R | 24 ++++---- R/bmm_model_mixture2p.R | 12 ++-- R/bmm_model_mixture3p.R | 24 ++++---- R/bmm_model_sdmSimple.R | 14 ++--- R/bmmformula.R | 4 +- R/helpers-data.R | 6 +- R/helpers-model.R | 4 +- R/helpers-postprocess.R | 2 +- R/helpers-prior.R | 8 +-- R/update.R | 2 +- R/utils.R | 18 +++--- README.Rmd | 34 ++++------- README.md | 38 +++++-------- _pkgdown.yml | 2 +- man/IMM.Rd | 30 +++++----- man/SDM.Rd | 14 ++--- man/bmf2bf.Rd | 2 +- man/bmm-package.Rd | 1 - man/{fit_model.Rd => bmm.Rd} | 63 ++++++++++++++------- man/bmm_options.Rd | 6 +- man/bmmformula.Rd | 2 +- man/check_data.Rd | 4 +- man/configure_model.Rd | 2 +- man/configure_options.Rd | 2 +- man/configure_prior.Rd | 4 +- man/default_prior.bmmformula.Rd | 2 +- man/figures/README-unnamed-chunk-4-1.png | Bin 6098 -> 29861 bytes man/mixture2p.Rd | 15 +++-- man/mixture3p.Rd | 26 ++++----- man/postprocess_brm.Rd | 2 +- tests/internal/bmmexamples.R | 8 +-- tests/testthat/test-bmm_model_IMM.R | 24 ++++---- tests/testthat/test-bmm_model_mixture3p.R | 6 +- tests/testthat/test-fit_model.R | 18 +++--- tests/testthat/test-helpers-postprocess.R | 16 +++--- tests/testthat/test-utils.R | 2 +- vignettes/bmm_bmmformula.Rmd | 6 +- vignettes/bmm_extract_info.Rmd | 8 +-- vignettes/bmm_imm.Rmd | 6 +- vignettes/bmm_mixture_models.Rmd | 6 +- vignettes/bmm_sdm_simple.Rmd | 4 +- 44 files changed, 286 insertions(+), 255 deletions(-) rename R/{fit_model.R => bmm.R} (70%) rename man/{fit_model.Rd => bmm.Rd} (73%) diff --git a/NAMESPACE b/NAMESPACE index f14b757a..0de2043c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -69,6 +69,7 @@ export(IMMbsc) export(IMMfull) export(bmf) export(bmf2bf) +export(bmm) export(bmm_options) export(bmmformula) export(c_bessel2sqrtexp) diff --git a/NEWS.md b/NEWS.md index b6651cfa..e4fc6265 100644 --- a/NEWS.md +++ b/NEWS.md @@ -17,7 +17,8 @@ * fix a bug in which the sort_data check occured in cases where it shouldn't (#158) ### Other changes -* `bmm` now requires the latest version of `brms` (>= 2.21.0). +* `bmm` now requires the latest version of `brms` (>= 2.21.0). +* the function `fit_model()` is deprecated in favor of `bmm()` (#163) # bmm 0.4.0 diff --git a/R/fit_model.R b/R/bmm.R similarity index 70% rename from R/fit_model.R rename to R/bmm.R index c044da14..54c8b778 100644 --- a/R/fit_model.R +++ b/R/bmm.R @@ -1,10 +1,8 @@ -#' @title Fit Measurement Models using BRMS -#' @description Fit a Bayesian multilevel measurement model. Currently -#' implemented are the two-parameter mixture model by Zhang and Luck (2008), -#' the three-parameter mixture model by Bays et al (2009), and three different -#' versions of the Interference Measurement Model (Oberauer et al., 2017). -#' This is a wrapper function for [brms::brm], which is used to estimate the -#' model. +#' @title Fit Bayesian Measurement Models +#' @description Fit a Bayesian measurement model using **brms** as a +#' backend interface to Stan. +#' +#' @name bmm #' #' @param formula An object of class `bmmformula`. A symbolic description of the #' model to be fitted. @@ -26,7 +24,7 @@ #' fitting, but you can provide prior constraints to model parameters #' @param sort_data Logical. If TRUE, the data will be sorted by the predictor #' variables for faster sampling. If FALSE, the data will not be sorted, but -#' sampling will be slower. If "check" (the default), `fit_model()` will check if +#' sampling will be slower. If "check" (the default), [bmm()] will check if #' the data is sorted, and ask you via a console prompt if it should be #' sorted. You can set the default value for this option using global #' `options(bmm.sort_data = TRUE/FALSE/"check)`)` or via `bmm_options(sort_data)` @@ -43,10 +41,25 @@ #' @param ... Further arguments passed to [brms::brm()] or Stan. See the #' description of [brms::brm()] for more details #' -#' @details `r a= supported_models(); a` +#' @details # Supported Models +#' +#' `r a= supported_models(); a` +#' +#' # bmmformula syntax +#' +#' see `vignette("bmm_bmmformula", package = "bmm")` for a detailed description of the syntax and how +#' it differs from the syntax for **brmsformula** +#' +#' # Default priors, Stan code and Stan data +#' +#' For more information about the default priors in **bmm** and about who to extract the Stan code and data generated by bmm and #' brms, see `vignette("bmm_extract_info", package = "bmm")`. +#' +#' # Miscellaneous #' #' Type `help(package=bmm)` for a full list of available help topics. #' +#' **fit_model()** is a deprecated alias for **bmm()**. +#' #' @returns An object of class brmsfit which contains the posterior draws along #' with many other useful information about the model. Use methods(class = #' "brmsfit") for an overview on available methods. @@ -56,7 +69,7 @@ #' Bayesian Measurement Modeling (bmm) package for R. #' https://doi.org/10.31234/osf.io/umt57 #' -#' @seealso [supported_models()], [brms::brm()] +#' @seealso [supported_models()], [brms::brm()], [default_prior()][default_prior.bmmformula()], [bmmformula()], [stancode()][stancode.bmmformula()], [standata()][standata.bmmformula()] #' #' @export #' @@ -66,19 +79,18 @@ #' dat <- data.frame(y=rsdm(n=2000)) #' #' # define formula -#' ff <- bmmformula(c ~ 1, -#' kappa ~ 1) +#' ff <- bmmformula(c ~ 1, kappa ~ 1) #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = dat, -#' model = sdmSimple(resp_err = "y"), -#' parallel=T, -#' iter=500, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = dat, +#' model = sdmSimple(resp_err = "y"), +#' parallel=T, +#' iter = 500, +#' backend = 'cmdstanr') #' } #' -fit_model <- function(formula, data, model, +bmm <- function(formula, data, model, prior = NULL, chains = 4, parallel = getOption('bmm.parallel', FALSE), @@ -114,3 +126,19 @@ fit_model <- function(formula, data, model, configure_opts = configure_opts) } + +#' @rdname bmm +#' @export +fit_model <- function(formula, data, model, + prior = NULL, + chains = 4, + parallel = getOption('bmm.parallel', FALSE), + sort_data = getOption('bmm.sort_data', "check"), + silent = getOption('bmm.silent', 1), + backend = getOption('brms.backend', NULL), + ...) { + message("You are using the deprecated `fit_model()` function. Please use `bmm()` instead.") + bmm(formula = formula, data = data, model = model, prior = prior, + chains = chains, parallel = parallel, sort_data = sort_data, + silent = silent, backend = backend, ...) +} diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index daf45a09..fb87a3d3 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -230,12 +230,12 @@ #' setsize = 'set_size') #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = data, -#' model = model1, -#' parallel = T, -#' iter = 500, -#' backend = 'cmdstanr') +#' fit <- bmm(formula = ff, +#' data = data, +#' model = model1, +#' parallel = T, +#' iter = 500, +#' backend = 'cmdstanr') #' #' # alternatively specify the IMM model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise @@ -246,12 +246,12 @@ #' regex = TRUE) #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = data, -#' model = model2, -#' parallel=T, -#' iter = 500, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = data, +#' model = model2, +#' parallel=T, +#' iter = 500, +#' backend='cmdstanr') #'} #' @export IMMfull <- function(resp_err, nt_features, nt_distances, setsize, regex = FALSE, diff --git a/R/bmm_model_mixture2p.R b/R/bmm_model_mixture2p.R index a19e58a5..4457c059 100644 --- a/R/bmm_model_mixture2p.R +++ b/R/bmm_model_mixture2p.R @@ -73,12 +73,12 @@ #' model <- mixture2p(resp_err = "y") #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = dat, -#' model = model, -#' parallel=T, -#' iter=500, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = dat, +#' model = model, +#' parallel=T, +#' iter=500, +#' backend='cmdstanr') #' } #' @export mixture2p <- function(resp_err, diff --git a/R/bmm_model_mixture3p.R b/R/bmm_model_mixture3p.R index 3c467f64..e943c10b 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/bmm_model_mixture3p.R @@ -102,24 +102,24 @@ #' model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), setsize = 4) #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = dat, -#' model = model1, -#' parallel=T, -#' iter = 500, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = dat, +#' model = model1, +#' parallel=T, +#' iter = 500, +#' backend='cmdstanr') #' #' # alternatively specify the 3-parameter model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise #' model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", setsize = 4, regex = TRUE) #' #' # fit the model -#' fit <- fit_model(formula = ff, -#' data = dat, -#' model = model2, -#' parallel=T, -#' iter = 500, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = dat, +#' model = model2, +#' parallel=T, +#' iter = 500, +#' backend='cmdstanr') #' } mixture3p <- function(resp_err, nt_features, setsize, regex = FALSE, links = NULL, ...) { diff --git a/R/bmm_model_sdmSimple.R b/R/bmm_model_sdmSimple.R index 0ed49e18..33d46ae5 100644 --- a/R/bmm_model_sdmSimple.R +++ b/R/bmm_model_sdmSimple.R @@ -78,13 +78,13 @@ #' prior(normal(1,2), class='Intercept', dpar='kappa') #' #' # specify the model -#' fit <- fit_model(formula = ff, -#' data = dat, -#' model = sdmSimple(resp_err = 'y'), -#' prior = prior, -#' parallel=T, -#' iter=2000, -#' backend='cmdstanr') +#' fit <- bmm(formula = ff, +#' data = dat, +#' model = sdmSimple(resp_err = 'y'), +#' prior = prior, +#' parallel=T, +#' iter=2000, +#' backend='cmdstanr') #' #' # extract coefficients and plot fit #' coef <- exp(brms::fixef(fit)[2:3,1]) diff --git a/R/bmmformula.R b/R/bmmformula.R index 79f6f523..777a6d06 100644 --- a/R/bmmformula.R +++ b/R/bmmformula.R @@ -45,7 +45,7 @@ #' bias ~ 1 + (1 | id)) #' #' and the rt and response variables would be specified in the model argument of -#' the `fit_model` function. +#' the `bmm()` function. #' #' Aside from that, the `bmm` formula syntax is the same as the `brms` formula #' syntax. For more information on the `brms` formula syntax, see @@ -213,7 +213,7 @@ check_formula.nontargets <- function(model, data, formula) { #' @title Convert `bmmformula` objects to `brmsformula` objects #' @description -#' Called by configure_model() inside fit_model() to convert the `bmmformula` into a +#' Called by [configure_model()] inside [bmm()] to convert the `bmmformula` into a #' `brmsformula` based on information in the model object. It will call the #' appropriate bmf2bf.\* methods based on the classes defined in the model_\* function. #' @param model The model object defining one of the supported `bmmmodels`` diff --git a/R/helpers-data.R b/R/helpers-data.R index 5e48fe8f..d2542703 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -4,7 +4,7 @@ #' @title Generic S3 method for checking data based on model type -#' @description Called by fit_model() to automatically perform checks on the +#' @description Called by [bmm()] to automatically perform checks on the #' data depending on the model type. It will call the appropriate check_data #' methods based on the list of classes defined in the .model_* functions. For #' models with several classes listed, it will call the functions in the order @@ -13,7 +13,7 @@ #' corresponds to the shared class. For example, for the .model_IMMabc model, #' this corresponds to the following order of check_data.* functions: #' check_data() -> check_data.vwm(), check_data.nontargets() the output of the -#' final function is returned to fit_model(). +#' final function is returned to bmm(). #' @param model A model list object returned from check_model() #' @param data The user supplied data.frame containing the data to be checked #' @param formula The user supplied formula @@ -221,7 +221,7 @@ rad2deg <- function(rad){ #' this function will return the combined stan data generated by `bmm` and #' `brms` #' -#' @inheritParams fit_model +#' @inheritParams bmm #' @param object A `bmmformula` object #' @param ... Further arguments passed to [brms::standata()]. See the #' description of [brms::standata()] for more details diff --git a/R/helpers-model.R b/R/helpers-model.R index 2d71af32..a4e6647a 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -1,5 +1,5 @@ #' @title Generic S3 method for configuring the model to be fit by brms -#' @description Called by fit_model() to automatically construct the model +#' @description Called by bmm() to automatically construct the model #' formula, family objects and default priors for the model specified by the #' user. It will call the appropriate configure_model.* functions based on the #' list of classes defined in the .model_* functions. Currently, we have a @@ -616,7 +616,7 @@ use_model_template <- function(model_name, #' this function will return the combined stan code generated by `bmm` and #' `brms` #' -#' @inheritParams fit_model +#' @inheritParams bmm #' @param object A `bmmformula` object #' @param ... Further arguments passed to [brms::stancode()]. See the #' description of [brms::stancode()] for more details diff --git a/R/helpers-postprocess.R b/R/helpers-postprocess.R index 75fe53cf..85a42b6b 100644 --- a/R/helpers-postprocess.R +++ b/R/helpers-postprocess.R @@ -1,5 +1,5 @@ #' @title Generic S3 method for postprocessing the fitted brm model -#' @description Called by fit_model() to automatically perform some type of postprocessing +#' @description Called by bmm() to automatically perform some type of postprocessing #' depending on the model type. It will call the appropriate postprocess_brm.* #' methods based on the list of classes defined in the .model_* functions. For #' models with several classes listed, it will call the functions in the order diff --git a/R/helpers-prior.R b/R/helpers-prior.R index f1ce3230..e6d71df5 100644 --- a/R/helpers-prior.R +++ b/R/helpers-prior.R @@ -6,12 +6,12 @@ #' model. Additionally, it will return all model parameters that have no prior #' specified (flat priors). This can help to get an idea about which priors #' need to be specified and also know which priors were used if no -#' user-specified priors were passed to the [fit_model()] function. +#' user-specified priors were passed to the [bmm()] function. #' #' The default priors in `bmm` tend to be more informative than the default #' priors in `brms`, as we use domain knowledge to specify the priors. #' -#' @inheritParams fit_model +#' @inheritParams bmm #' @param object A `bmmformula` object #' @param ... Further arguments passed to [brms::default_prior()] #' @@ -206,7 +206,7 @@ set_default_prior <- function(model, data, formula) { #' Generic S3 method for configuring the default prior for a bmmmodel #' -#' Called by fit_model() to automatically construct the priors for a given +#' Called by bmm() to automatically construct the priors for a given #' model, data and formula, and combine it with the prior given by the user. The #' first method executed is configure_prior.bmmmodel, which will build the prior #' based on information from the model object such as fixed_parameters, @@ -221,7 +221,7 @@ set_default_prior <- function(model, data, formula) { #' @param data A data.frame containing the data used in the model #' @param formula A `brmsformula` object returned from configure_model() #' @param user_prior A `brmsprior` object given by the user as an argument to -#' fit_model() +#' bmm() #' @param ... Additional arguments passed to the method #' @export #' @keywords internal, developer diff --git a/R/update.R b/R/update.R index 4eb3f530..6e5df406 100644 --- a/R/update.R +++ b/R/update.R @@ -30,7 +30,7 @@ update.bmmfit <- function(object, formula., newdata = NULL, recompile = NULL, .. } if ("model" %in% names(dots)) { stop2("You cannot update with a different model. - If you want to use a different model, please use `fit_model()` instead.") + If you want to use a different model, please use `bmm()` instead.") } object <- restructure(object) diff --git a/R/utils.R b/R/utils.R index 717f427a..f3a68a77 100644 --- a/R/utils.R +++ b/R/utils.R @@ -66,7 +66,7 @@ softmaxinv <- function(p, lambda = 1) { #' @param opts A list of options #' @param env The environment in which to set the options - when set to #' parent.frame() the changes would apply to the environment of the function -#' that called it. In our case, this is the environment of the fit_model() +#' that called it. In our case, this is the environment of the bmm() #' function. Changes will not be propagated to the user environment. #' @keywords internal #' @returns A list of options to pass to brm() @@ -128,7 +128,7 @@ glue_lf <- function(..., env.frame = -1) { } #' wrapper function to call brms, saving fit_args if backend is mock for testing -#' not used directly, but called by fit_model(). If fit_model() is run with +#' not used directly, but called by bmm(). If bmm() is run with #' backend="mock", then we can perform tests on the fit_args to check if the #' model configuration is correct. Avoids compiling and running the model #' @noRd @@ -153,7 +153,7 @@ combine_args <- function(args) { if (not_in(i, c('family'))) { config_args[[i]] <- dots[[i]] } else { - stop2('You cannot provide a family argument to fit_model. \\ + stop2('You cannot provide a family argument to bmm(). \\ Please use the model argument instead.') } } @@ -304,7 +304,7 @@ order_data_query <- function(model, data, formula) { ) caution_msg <- paste(strwrap("* caution: if you chose Option 2, you need to be careful when using brms postprocessing methods that rely on the data order, such as - generating predictions. Assuming you assigned the result of fit_model to a + generating predictions. Assuming you assigned the result of bmm() to a variable called `fit`, you can extract the sorted data from the fitted object with:\n\n data_sorted <- fit$data", width = 80), collapse = "\n") caution_msg <- crayon::red(caution_msg) @@ -355,7 +355,7 @@ order_data_query <- function(model, data, formula) { paste(predictors, collapse = ", "), "\n") caution_msg <- paste(strwrap("* caution: you have set `sort_data=TRUE`. You need to be careful when using brms postprocessing methods that rely on the data order, such as - generating predictions. Assuming you assigned the result of fit_model to a + generating predictions. Assuming you assigned the result of bmm() to a variable called `fit`, you can extract the sorted data from the fitted object with:\n\n data_sorted <- fit$data", width = 80), collapse = "\n") caution_msg <- crayon::red(caution_msg) @@ -438,11 +438,11 @@ identical.formula <- function(x, y, ...) { #' View or change global bmm options #' @param sort_data logical. If TRUE, the data will be sorted by the predictors. #' If FALSE, the data will not be sorted, but sampling will be slower. If -#' "check" (the default), `fit_model()` will check if the data is sorted, and +#' "check" (the default), `bmm()` will check if the data is sorted, and #' ask you via a console prompt if it should be sorted. **Default: "check"** #' @param parallel logical. If TRUE, chains will be run in parallel. If FALSE, #' chains will be run sequentially. You can also set these value for each -#' model separately via the argument `parallel` in `fit_model()`. **Default: +#' model separately via the argument `parallel` in `bmm()`. **Default: #' FALSE** #' @param default_priors logical. If TRUE (default), the default bmm priors will #' be used. If FALSE, only the basic `brms` priors will be used. **Default: @@ -460,7 +460,7 @@ identical.formula <- function(x, y, ...) { #' options. If arguments are provided, the function will change the options #' and return the old options invisibly. If you provide only some of the #' arguments, the other options will not be changed. The options are stored in -#' the global options list and will be used by `fit_model()` and other +#' the global options list and will be used by `bmm()` and other #' functions in the `bmm` package. Each of these options can also be set #' manually using the built-in `options()` function, by setting the #' `bmm.sort_data`, `bmm.default_priors`, and `bmm.silent` options. @@ -654,7 +654,7 @@ deprecated_args <- function(...) { dots <- list(...) stopif("model_type" %in% names(dots), 'The "model_type" argument was deprecated on Feb 3, 2024. Either: - - See ?fit_model for the new usage; + - See ?bmm for the new usage; - or install the old version of the package with: devtools::install_github("venpopov/bmm@v0.0.1")') } diff --git a/README.Rmd b/README.Rmd index 549524aa..e070c93e 100644 --- a/README.Rmd +++ b/README.Rmd @@ -149,7 +149,7 @@ remotes::install_github("venpopov/bmm@v0.0.1") ## Fitting models using bmm -The core function of the bmm package is the `fit_model()` function. This function +The core function of the bmm package is the `bmm()` function. This function takes: 1. a linear model formula specifying how parameters of the model should vary as @@ -169,34 +169,24 @@ Measurement Model would look like this: ``` A complete call to fit a model using bmm could look like this. For this example, -we are using the `OberauerLin_2017` data that is provided with the package. +we are using the `OberauerLin_2017` data that is provided with the package and we +will show how to fit the Interference Measurement Model to this data. If you want a detailed description of this model and and in depth explanation of the parameters +estimated in the model, please have a look at `vignette("bmm_imm")`. ``` r library(bmm) -data <- OberauerLin_2017 -``` - -For this quick example, we will show how to setup fitting the Interference -Measurement Model to this data. If you want a detailed description of this model -and and in depth explanation of the parameters estimated in the model, please -have a look at `vignette("IMM")`. -``` r -model_formula <- bmmformula(c ~ 0 + set_size, - a ~ 0 + set_size, - s ~ 0 + set_size, - kappa ~ 0 + set_size) +formula <- bmmformula(c ~ 0 + set_size, + a ~ 0 + set_size, + s ~ 0 + set_size, + kappa ~ 0 + set_size) model <- IMMfull(resp_err = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") -fit <- fit_model( - formula = model_formula, - data = data, - model = model -) +fit <- bmm(formula = formula, data = data, model = model) ``` Using this call, the `fit` object will save all the information about the fitted @@ -217,7 +207,7 @@ package](https://venpopov.github.io/bmm/articles/index.html) or [here for the development version](https://venpopov.github.io/bmm/dev/articles/index.html). -## Exploring cogntive measurement models +## Exploring measurement models To aid users in improving their intuition about what different models predict for observed data given a certain parameter set, the `bmm` package also includes @@ -272,11 +262,11 @@ end users. This way researchers that face challenges in writing their own STAN code to implement such models themselves can still use these models in almost any experimental design. -Under the hood, the main `bmm` `fit_model()` function will then call the appropriate functions for the specified model +Under the hood, the main `bmm()` function will then call the appropriate functions for the specified model and will perform several steps: 1. Configure the Sample (e.g., set up prallelization) -2. Check the information passed to the `fit_model()` function: +2. Check the information passed to the `bmm()` function: - if the model is installed and all required arguments were provided - if a valid formula was passed - if the data contains all necessary variables diff --git a/README.md b/README.md index 6add01ec..30b9afe5 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ remotes::install_github("venpopov/bmm@v0.0.1") ## Fitting models using bmm -The core function of the bmm package is the `fit_model()` function. This +The core function of the bmm package is the `bmm()` function. This function takes: 1. a linear model formula specifying how parameters of the model should @@ -186,34 +186,25 @@ Interference Measurement Model would look like this: A complete call to fit a model using bmm could look like this. For this example, we are using the `OberauerLin_2017` data that is provided with -the package. +the package and we will show how to fit the Interference Measurement +Model to this data. If you want a detailed description of this model and +and in depth explanation of the parameters estimated in the model, +please have a look at `vignette("bmm_imm")`. ``` r library(bmm) -data <- OberauerLin_2017 -``` - -For this quick example, we will show how to setup fitting the -Interference Measurement Model to this data. If you want a detailed -description of this model and and in depth explanation of the parameters -estimated in the model, please have a look at `vignette("IMM")`. -``` r -model_formula <- bmmformula(c ~ 0 + set_size, - a ~ 0 + set_size, - s ~ 0 + set_size, - kappa ~ 0 + set_size) +formula <- bmmformula(c ~ 0 + set_size, + a ~ 0 + set_size, + s ~ 0 + set_size, + kappa ~ 0 + set_size) model <- IMMfull(resp_err = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") -fit <- fit_model( - formula = model_formula, - data = data, - model = model -) +fit <- bmm(formula = formula, data = data, model = model) ``` Using this call, the `fit` object will save all the information about @@ -235,7 +226,7 @@ package](https://venpopov.github.io/bmm/articles/index.html) or [here for the development version](https://venpopov.github.io/bmm/dev/articles/index.html). -## Exploring cogntive measurement models +## Exploring measurement models To aid users in improving their intuition about what different models predict for observed data given a certain parameter set, the `bmm` @@ -291,12 +282,11 @@ cognitive measurement models for end users. This way researchers that face challenges in writing their own STAN code to implement such models themselves can still use these models in almost any experimental design. -Under the hood, the main `bmm` `fit_model()` function will then call the -appropriate functions for the specified model and will perform several -steps: +Under the hood, the main `bmm()` function will then call the appropriate +functions for the specified model and will perform several steps: 1. Configure the Sample (e.g., set up prallelization) -2. Check the information passed to the `fit_model()` function: +2. Check the information passed to the `bmm()` function: - if the model is installed and all required arguments were provided - if a valid formula was passed - if the data contains all necessary variables diff --git a/_pkgdown.yml b/_pkgdown.yml index 1aaf25d4..376fc3f0 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -34,7 +34,7 @@ reference: - title: "Fitting models" desc: "Main functions for model fitting" - contents: - - "fit_model" + - "bmm" - "bmmformula" - "update.bmmfit" - "summary.bmmfit" diff --git a/man/IMM.Rd b/man/IMM.Rd index ef54e551..e93a2243 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -102,7 +102,7 @@ Interference measurement model by Oberauer and Lin (2017). } \item \strong{Default parameter links:} \itemize{ -\item kappa = log; a = identity; c = identity; s = log +\item mu1 = tan_half; kappa = log; a = identity; c = identity; s = log } \item \strong{Default priors:} \itemize{ @@ -160,7 +160,7 @@ Interference measurement model by Oberauer and Lin (2017). } \item \strong{Default parameter links:} \itemize{ -\item kappa = log; c = identity; s = log +\item mu1 = tan_half; kappa = log; c = identity; s = log } \item \strong{Default priors:} \itemize{ @@ -213,7 +213,7 @@ Interference measurement model by Oberauer and Lin (2017). } \item \strong{Default parameter links:} \itemize{ -\item kappa = log; a = identity; c = identity +\item mu1 = tan_half; kappa = log; a = identity; c = identity } \item \strong{Default priors:} \itemize{ @@ -267,12 +267,12 @@ model1 <- IMMfull(resp_err = "dev_rad", setsize = 'set_size') # fit the model -fit <- fit_model(formula = ff, - data = data, - model = model1, - parallel = T, - iter = 500, - backend = 'cmdstanr') +fit <- bmm(formula = ff, + data = data, + model = model1, + parallel = T, + iter = 500, + backend = 'cmdstanr') # alternatively specify the IMM model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise @@ -283,12 +283,12 @@ model2 <- IMMfull(resp_err = "dev_rad", regex = TRUE) # fit the model -fit <- fit_model(formula = ff, - data = data, - model = model2, - parallel=T, - iter = 500, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = data, + model = model2, + parallel=T, + iter = 500, + backend='cmdstanr') } } \keyword{bmmmodel} diff --git a/man/SDM.Rd b/man/SDM.Rd index 2ddf8c2f..d5a99183 100644 --- a/man/SDM.Rd +++ b/man/SDM.Rd @@ -89,13 +89,13 @@ prior <- prior(normal(1,2), class='Intercept', dpar='c')+ prior(normal(1,2), class='Intercept', dpar='kappa') # specify the model -fit <- fit_model(formula = ff, - data = dat, - model = sdmSimple(resp_err = 'y'), - prior = prior, - parallel=T, - iter=2000, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = dat, + model = sdmSimple(resp_err = 'y'), + prior = prior, + parallel=T, + iter=2000, + backend='cmdstanr') # extract coefficients and plot fit coef <- exp(brms::fixef(fit)[2:3,1]) diff --git a/man/bmf2bf.Rd b/man/bmf2bf.Rd index aba4080f..cd42741d 100644 --- a/man/bmf2bf.Rd +++ b/man/bmf2bf.Rd @@ -16,7 +16,7 @@ A \code{brmsformula} defining the response variables and the additional paramete formulas for the specified \code{bmmmodel} } \description{ -Called by configure_model() inside fit_model() to convert the \code{bmmformula} into a +Called by \code{\link[=configure_model]{configure_model()}} inside \code{\link[=bmm]{bmm()}} to convert the \code{bmmformula} into a \code{brmsformula} based on information in the model object. It will call the appropriate bmf2bf.\* methods based on the classes defined in the model_\* function. } diff --git a/man/bmm-package.Rd b/man/bmm-package.Rd index 626e463f..9070c0ec 100644 --- a/man/bmm-package.Rd +++ b/man/bmm-package.Rd @@ -2,7 +2,6 @@ % Please edit documentation in R/bmm-package.R \docType{package} \name{bmm-package} -\alias{bmm} \alias{bmm-package} \title{bmm: Easy and Accesible Bayesian Measurement Models using 'brms'} \description{ diff --git a/man/fit_model.Rd b/man/bmm.Rd similarity index 73% rename from man/fit_model.Rd rename to man/bmm.Rd index 08dbdfb2..bce16a8e 100644 --- a/man/fit_model.Rd +++ b/man/bmm.Rd @@ -1,9 +1,23 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/fit_model.R -\name{fit_model} +% Please edit documentation in R/bmm.R +\name{bmm} +\alias{bmm} \alias{fit_model} -\title{Fit Measurement Models using BRMS} +\title{Fit Bayesian Measurement Models} \usage{ +bmm( + formula, + data, + model, + prior = NULL, + chains = 4, + parallel = getOption("bmm.parallel", FALSE), + sort_data = getOption("bmm.sort_data", "check"), + silent = getOption("bmm.silent", 1), + backend = getOption("brms.backend", NULL), + ... +) + fit_model( formula, data, @@ -44,7 +58,7 @@ by the \code{chain} argument) in parallel using the parallel package} \item{sort_data}{Logical. If TRUE, the data will be sorted by the predictor variables for faster sampling. If FALSE, the data will not be sorted, but -sampling will be slower. If "check" (the default), \code{fit_model()} will check if +sampling will be slower. If "check" (the default), \code{\link[=bmm]{bmm()}} will check if the data is sorted, and ask you via a console prompt if it should be sorted. You can set the default value for this option using global \verb{options(bmm.sort_data = TRUE/FALSE/"check)})\verb{or via}bmm_options(sort_data)`} @@ -70,14 +84,10 @@ with many other useful information about the model. Use methods(class = "brmsfit") for an overview on available methods. } \description{ -Fit a Bayesian multilevel measurement model. Currently -implemented are the two-parameter mixture model by Zhang and Luck (2008), -the three-parameter mixture model by Bays et al (2009), and three different -versions of the Interference Measurement Model (Oberauer et al., 2017). -This is a wrapper function for \link[brms:brm]{brms::brm}, which is used to estimate the -model. +Fit a Bayesian measurement model using \strong{brms} as a +backend interface to Stan. } -\details{ +\section{Supported Models}{ The following models are supported: \itemize{ \item IMMabc(resp_err, nt_features, setsize, regex, links) @@ -89,25 +99,38 @@ The following models are supported: } Type ?modelname to get information about a specific model, e.g. ?IMMfull +} + +\section{bmmformula syntax}{ +see \code{vignette("bmm_bmmformula", package = "bmm")} for a detailed description of the syntax and how +it differs from the syntax for \strong{brmsformula} +} +\section{Default priors, Stan code and Stan data}{ +For more information about the default priors in \strong{bmm} and about who to extract the Stan code and data generated by bmm and #' brms, see \code{vignette("bmm_extract_info", package = "bmm")}. +} + +\section{Miscellaneous}{ Type \code{help(package=bmm)} for a full list of available help topics. + +\strong{fit_model()} is a deprecated alias for \strong{bmm()}. } + \examples{ \dontrun{ # generate artificial data from the Signal Discrimination Model dat <- data.frame(y=rsdm(n=2000)) # define formula -ff <- bmmformula(c ~ 1, - kappa ~ 1) +ff <- bmmformula(c ~ 1, kappa ~ 1) # fit the model -fit <- fit_model(formula = ff, - data = dat, - model = sdmSimple(resp_err = "y"), - parallel=T, - iter=500, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = dat, + model = sdmSimple(resp_err = "y"), + parallel=T, + iter = 500, + backend = 'cmdstanr') } } @@ -118,5 +141,5 @@ Bayesian Measurement Modeling (bmm) package for R. https://doi.org/10.31234/osf.io/umt57 } \seealso{ -\code{\link[=supported_models]{supported_models()}}, \code{\link[brms:brm]{brms::brm()}} +\code{\link[=supported_models]{supported_models()}}, \code{\link[brms:brm]{brms::brm()}}, \link[=default_prior.bmmformula]{default_prior()}, \code{\link[=bmmformula]{bmmformula()}}, \link[=stancode.bmmformula]{stancode()}, \link[=standata.bmmformula]{standata()} } diff --git a/man/bmm_options.Rd b/man/bmm_options.Rd index 1f3fc15c..e9e5640e 100644 --- a/man/bmm_options.Rd +++ b/man/bmm_options.Rd @@ -16,12 +16,12 @@ bmm_options( \arguments{ \item{sort_data}{logical. If TRUE, the data will be sorted by the predictors. If FALSE, the data will not be sorted, but sampling will be slower. If -"check" (the default), \code{fit_model()} will check if the data is sorted, and +"check" (the default), \code{bmm()} will check if the data is sorted, and ask you via a console prompt if it should be sorted. \strong{Default: "check"}} \item{parallel}{logical. If TRUE, chains will be run in parallel. If FALSE, chains will be run sequentially. You can also set these value for each -model separately via the argument \code{parallel} in \code{fit_model()}. \strong{Default: +model separately via the argument \code{parallel} in \code{bmm()}. \strong{Default: FALSE}} \item{default_priors}{logical. If TRUE (default), the default bmm priors will @@ -52,7 +52,7 @@ options. If no arguments are provided, the function will return the current options. If arguments are provided, the function will change the options and return the old options invisibly. If you provide only some of the arguments, the other options will not be changed. The options are stored in -the global options list and will be used by \code{fit_model()} and other +the global options list and will be used by \code{bmm()} and other functions in the \code{bmm} package. Each of these options can also be set manually using the built-in \code{options()} function, by setting the \code{bmm.sort_data}, \code{bmm.default_priors}, and \code{bmm.silent} options. diff --git a/man/bmmformula.Rd b/man/bmmformula.Rd index 5ebf0872..cf2ea586 100644 --- a/man/bmmformula.Rd +++ b/man/bmmformula.Rd @@ -56,7 +56,7 @@ In \code{bmm}, the same formula would be written as: }\if{html}{\out{}} and the rt and response variables would be specified in the model argument of -the \code{fit_model} function. +the \code{bmm()} function. Aside from that, the \code{bmm} formula syntax is the same as the \code{brms} formula syntax. For more information on the \code{brms} formula syntax, see diff --git a/man/check_data.Rd b/man/check_data.Rd index 69dbf814..ee4562df 100644 --- a/man/check_data.Rd +++ b/man/check_data.Rd @@ -22,7 +22,7 @@ stages (e.g. in configure_model()), you can store and access them using the attr() function. } \description{ -Called by fit_model() to automatically perform checks on the +Called by \code{\link[=bmm]{bmm()}} to automatically perform checks on the data depending on the model type. It will call the appropriate check_data methods based on the list of classes defined in the .model_* functions. For models with several classes listed, it will call the functions in the order @@ -31,7 +31,7 @@ should be defined in the appropriate check_data.* function, where \* corresponds to the shared class. For example, for the .model_IMMabc model, this corresponds to the following order of check_data.* functions: check_data() -> check_data.vwm(), check_data.nontargets() the output of the -final function is returned to fit_model(). +final function is returned to bmm(). } \keyword{developer} \keyword{internal,} diff --git a/man/configure_model.Rd b/man/configure_model.Rd index 3015592e..55204463 100644 --- a/man/configure_model.Rd +++ b/man/configure_model.Rd @@ -25,7 +25,7 @@ See \code{\link[brms:custom_family]{brms::custom_family()}} for more details. } } \description{ -Called by fit_model() to automatically construct the model +Called by bmm() to automatically construct the model formula, family objects and default priors for the model specified by the user. It will call the appropriate configure_model.* functions based on the list of classes defined in the .model_* functions. Currently, we have a diff --git a/man/configure_options.Rd b/man/configure_options.Rd index 28d599ae..4b0c5bbd 100644 --- a/man/configure_options.Rd +++ b/man/configure_options.Rd @@ -11,7 +11,7 @@ configure_options(opts, env = parent.frame()) \item{env}{The environment in which to set the options - when set to parent.frame() the changes would apply to the environment of the function -that called it. In our case, this is the environment of the fit_model() +that called it. In our case, this is the environment of the bmm() function. Changes will not be propagated to the user environment.} } \value{ diff --git a/man/configure_prior.Rd b/man/configure_prior.Rd index 5fe118fe..1ddc6481 100644 --- a/man/configure_prior.Rd +++ b/man/configure_prior.Rd @@ -14,12 +14,12 @@ configure_prior(model, data, formula, user_prior, ...) \item{formula}{A \code{brmsformula} object returned from configure_model()} \item{user_prior}{A \code{brmsprior} object given by the user as an argument to -fit_model()} +bmm()} \item{...}{Additional arguments passed to the method} } \description{ -Called by fit_model() to automatically construct the priors for a given +Called by bmm() to automatically construct the priors for a given model, data and formula, and combine it with the prior given by the user. The first method executed is configure_prior.bmmmodel, which will build the prior based on information from the model object such as fixed_parameters, diff --git a/man/default_prior.bmmformula.Rd b/man/default_prior.bmmformula.Rd index 3cd45586..99e20e10 100644 --- a/man/default_prior.bmmformula.Rd +++ b/man/default_prior.bmmformula.Rd @@ -38,7 +38,7 @@ function will return the default priors that would be used to estimate the model. Additionally, it will return all model parameters that have no prior specified (flat priors). This can help to get an idea about which priors need to be specified and also know which priors were used if no -user-specified priors were passed to the \code{\link[=fit_model]{fit_model()}} function. +user-specified priors were passed to the \code{\link[=bmm]{bmm()}} function. The default priors in \code{bmm} tend to be more informative than the default priors in \code{brms}, as we use domain knowledge to specify the priors. diff --git a/man/figures/README-unnamed-chunk-4-1.png b/man/figures/README-unnamed-chunk-4-1.png index 41bb96d0180d90f04d86a5d4de9fd5b8dddb18ba..f0e4e5581d93fcae95319a7fcc298c5676511253 100644 GIT binary patch literal 29861 zcmb5Wc{r5)`#(H024mlskR@cvl0quWpt6^&*`>u!i0np6McE=!GG!-A*~-2aB4ZC( zB4yvQMf9AP`~G~N&+|Q=<98gtKRWL2X0Gdczt8JjUgzt4z2|}cc?~*hE@~7CMW>~C z#sG!F5K$=fIF17T#sA@$EDD9CcT`u`cUIR>cXx63G`w;7$~BE^Zr3~=uNY{kp->8s z9vNFX@EEfyKYL$%MCfx^Z)Rp3{hnNWiHkwkouTQyYsIc#B_6w!sK&I;kEA#rK0f&; z-BC=LRh6+md;IbEUyFJX0jIo$NXb_v`meBIqFbbGjhEdVRCDi-7gs)h=Un~i>+c`W zmx6zedM%F9#JrQRcrq%Ck>Dzjoa&h<{`jM*>D0~oAQD{=N%BZkf_TDVH1}jf?a;y! z|A*0mjq=UE_HzaL8tD5YcfY(=Xgf4<4YkMC{ML$qRo!W!8nD} z`GR5jZRgY2WA|;&N{Hq@+-n-XPx(`D!yHTLwLBc9D3_ftcIeaDR{6Z-^MXCqVLKsZ zXGffyhQlsI7at8`9V2_Uktpu@o2By6TQ(^**&{91HXHu2*dPuz2QAsf^8YYVTl!=d?cmR z+DMkOeh^j)w|-80v*oDwpY?4Y)0C&UiMW#-G+YmbrAraG=3?azp9)eY3y>jIPI00oXIwZ?-MHMy>BJXp2FhK z_sv$7IOo>QIKIOnlcV32zkT*f^-T2`BeYnJOL^LO+IaAJrD{0!`Yp*iFBYb~q5k2R zc=2nhn)w$=MbWEwl^PlwuIgNvW(&VVby?cq=R_XMBMz%dijPI^SM!2i6F73b=G|Tw z_kU9{I`@P^BrtPw={VVWx5+z#S}F$)-F2<>zq7EO=@YD@G*lS+!E41uk=!oOCQw$H zRi)uZ*nzRgnv3%*y`D2~KhaM-bWABJO`eTtZ2dlIM_qVKoSk;6jwm`;FlVIl!lS4!fz{T3cXs`Qev$Q#q23YylKmC-rD?v>{|OR= z!nI3U*Y)&J;_!DI3VqKJg@wPN;SU%5L2?P^KmURu63PDacl0>&A+yc!R}>15(mJDR zxp=ZNz{e-`ci^Iu>#ZLt_8ZTCDJ@m~I-l=e zBY7?qh2=+~ad;Glk$~65I(_V=@7VvJfB(IX2~Y48_^*Fy(ng`Vj<|7!{l6E&H|YK^ zzd>|+oqzZ1m)X8N*M*@{fdMXS?^36}x2L>kzkGPa-Iy1j+{Tz~Raw?oXfxKIZ()Cx z^+?#^Udr{^zG6CV`8(z!2?@gdAGX^s)dmL*a`>`}ql2vL6pYd>jQWc%t8etS#CEdx@?8I%g_+?F}E)MOH3U3zID+Ys8PKi>> z@bKZbgd>j_DlK#R{wM^!oTjviQ<--f&AXb?m3>igGt9d=g01zK#I^qEUziVF^iFvu z`7Sfv8G)N;@0+D^FcY=<@qON@Vq3Ggl~ey^+H5Q%@#RGNv41R$*e-My$B)kwY?@;v z{EsPLGUEy15s%yc=arzaxq^((P*(45ysTd9){*yH{Vwjhz1DMK#6#zaM9!*$^_~B@ zm~r_rUIKIT&(?~(@3QT)W7i_AJet|$ueT>rJC1mKJScD1gnM?KFK$J32^N+8nu6{(wa!*-h*}Hvkuy5nz0eGG^W|E52^FG+KSIw9Iw5qUuqxeP@}JRYiPE ze7V*8YyIlP}fpopN_-WudB0yYnXAfoeMW)fpW;CZ1U-^ogX!xiQTT z79+1Q1@-eBIXdkuh?YTl7UXg{UDzEKs>ryAucC6(>8rd6euqKQ?lH?(#SvR&zg) zt?JAq0ZlePla=ZtxH9Bicrx1fXh*u^W~uYQkafVqHL$$+ii4ACoSoYL$4w3~zNa*L z_xbcvRot2mHL7-dHcv;C{=l)O<{+oLRZ%@QJ(+qV6Df0rwKd-r7XK@^q=(`2-ACSy zHTALO+qrkWI-AfT7Ue$GmLPRLtBtHSNM^=xIU+>=OX#-xgK&Z!p6$oWX16B7xyDPS z;%;sbx_3^Vx%VYVUi^A6T+CFa)|VV4_*s5vju^DFA>~XbL+tYCpSa$7qJv+gRP%2< z{WA%7`|pO!8QibW2hLs!LKVMyFDtjG{-3Z3y~%Xnn29eY0EtnMwZX%IoZE? z72+%A1RCowI<3Hjq*-6ATh+?B%IQ~;Uz83jruSmeIH4rGMBX^d*AQJKuj=2#xYzv7 zwDRhZJ0B=c(=wH4V}0}4(fu494~gVrcZM61NctG{eHi_ecQ%*Ycjk+uTUl}+DMTqu z+;{r?{TlN59;B1)(>|Bz(YSO%9h<4;w=zkdlb-3`3qyT}b(3rpEj=H2&-S*K2+NQo z3*(|KWP5uIhnP38q7_8oZ7l58krWDt*L#q70&apuf;&>5M}h zi(VpU$HDyzh2TPgqxAQXZHtD&_lAD|Om!bh__mU!46sg9tXsv*;hpKUXqTq@ObLsB;1Md7d)sra?MX5ly@nV3`cxhw z%hEpxufY3`??Ggz_pygByqLf9lbplSHejLDG(nDmOSZ*-ZThlw?H|vCk1L0e+&u;v zI*40l9xkss%r9eBXsuKUS=ej#mA8vyW8t}m?!`H zjzTX8?0iALI!_PBFqKW6wZ!ulR?(LaQk>ej|%jPk~u`*IUZImkN2tVvbN9?TF>M=?0k9Xi|( zSn7;m(dEYQs!0_xt_Za8A^!$m^Y2G#1YFd@-jRdq~*Q>iaSO3oD6`J_qI+2{Pd>e)7jlA3dF;QoVVNN|_S|H)OZMAEP37{JE znEdcNf~-;itge8;=}Tb||7T+Moy#w`T)6CuH;$datNdA3x2Os9yJKP~hhPK;Dt>(0 zln!_Y{sUFj$_H))-Z+1K=OHS@N?GCe>$+hzD{`9}B+^fLexXCQI^J<&jP}~L(zFZY z-`7_@MxEnvz~8ZeHEF^-JKn9#9Lth zQMv;Zu%#Ntm`y|B*IS*$F^H4Ij%2w{>=Kt46`LiI04an3spgVG;w$hFQK7?aq~bj% z>FC1fwL~jRZx)gBw8iGLw~?H{4Z-JodO|IL3QdB?U%}`d zhs(-vx=)Wad%p|VT#UULn3dwAMmVSTL>s=O0AHFU>T<)Ee&7NjpA~c}`LEqiUxMmW zto7Z=-Iw}*$2$K}ztyYG0|hB^?xTv#0aIwJ+Td!PU#wbWM$}0BsDba{z8Sz9im}2l z6EFIyoHfQ6-A!1gC;JOl>4YaLaUX35tNh_7&a7llsGKG0J(HKJ6{U&&^NzQO8N(>5 z10MB+G8)MNth%;PndI$1Ki5CeGYSc%c+< zZs?*(gGNMR8|)1S?jd+brw{ffPld(Ewu$-1CZJN30?H(9Y80OlXJCorl4xvpx%$0t z@FfE((Y<1Dh<$Dr%b8L(RHV@DUd5&V-+d!mvTZU~=Z}Ph?}? zwQKSi&3(J%Bu5QHA6*@DUW|CEP0fcC0q?yg&B{*y)X7 zcXucwQRGxdzFn!;6@zbv?HEWGp*#a%~PSVjD)%nF!g&@B}=&<4jaJQj144Bo#ono3{q!4jbBH(Y6! zMD0da-1sH#EE!}^ez2z>=tqXg(~QpGF-2ZKKSSU*Mp#G9pVX_*W2EFdU?(1q!m1r6 zpy&>W_Q693h56B3n`@O0?xlSu0H8HY8tgZ_(|$58M?p@i6lk=C-REET#TIJ{1plt(Q8qb_P7f?IfoAdaKR4-Jl{QG)uA3eC6n0DFjHD;10bjmNu z#3%BNn;08Q5_Bb3daDCATM9o$6l_{o`=4wSy2Hkxos)#WA!+(YyfgePKDC3*D(iAz z>bifE=~L;r_IDLaG==2Z6nG1ga4FWkZk9qIXJf}Ukuy)$skf#2Kv2=32KQWl{@jNA z03~mR9R|>&*G!^$nTy#9T0q&N>!&p|Bl*F*+lNmh@QBeu$JBVcq2Rtvg}>RKQCSBP zf7e9z)*b3%d}`~qV!x}wr%b(Pxw4Y)pO`vsgjj#A@+;1_e1GhoV5FC3wg0-VdxOyM zC7xs7N^_+xA6$?rShQm(?3?fFt@87-cw={WMkz7jnD6p9m-qU}tugPVO}^b}4Y^a& zsbPuIHrC%9S8Jm9R7S-Esv903+ei=QuM-(kO{^Qp#JN0VJovM2=B>}d&@`7=(e;_s zTxuDjao0CF#4AoRlcI^RuphoRW$%fhYZQt5sb5QkfYRH>UFL&qbo+5322%@YTPSfaNsA>rQit% z`1#Sf&EXJ5QcmtuXye}#k5`K4zm z^ug-w2{fI<4I04332=`b!7!`+u#D$6&KrMx2w%!b#gNUBNPkX^zXwA5DR1y8$QZ2J z_|XdsnsGwt2+9)D#i>AWcqhoz*;IxqU>he)y_@vVQz5FehRf!xa*&jSlEUbaor@zF zl#yn?8E$z*VCT;fY9$j7NDAj5htd#Z1oudfqV<6wvu2Dzxqc~n$#$CD5OqYe`3{Qi z{{Av!VVMuoZtKA^PhjKXZi}HZN0N|6%cOx4{|*WPvlhU&mdo{`P=z@#TH5ujN3RG6 z;%`G$hNxsDY8^Z<4~4P{aP+!e(ov`onw(HF8z`^mn;*f{Q*WiG+ft7^Qd_sK*mu4-_)oD8Jp-Bfu#>`3 z3cx83@cj74uuNMKbgr7(HUS6s!FNM?dMtnF3-m3%>VTIZ(|Uzy9jh?RI{%pm>kxO2 z+ybJ#8&;d)c!Liq)^s=_NpeHm3N_5Bo71)sb~G<0*pUxj!L3;2csSu!TadtH9ebA0 zDte8R|9P#DQ)C?lZ!7&{uURx3KL3se!QV^lvMBbL2JGg&KvpB%hZ8IB_SJz~-bJ&7 z(kLe>{&2)T+;l`N#?3SjdAEu`rk8CQt*BS8BNVdUXIgKF6c|QLTCkp7I7S_;mx>dz zA~;c7-*xm&Ef9CPi}!)m6(8?kV+ALTB^VqhV1x1WNU=T~Xy%-xI z#$OMBFh&SMMd%Sl8LZcuQJ>bKJ8O(Ah8e2OKV@G_08&+(rY$AZTRL>AA`!T^;`d%Z z&5Lfdakp>+wn|S1$LMR+0r(JFM1?qg{E+AjJR|rMS?;kbA82oVQbDYt1#zO+AZkmt zeZPU4f5gDNO+3Hq@Ft%6GNp* z5HHW%3ls&*mjOA$i=J(?y)1}5h6L5i`pi7A%r|VHIht?HNs(Kt5{^K4>9tv zm{G=MNAf^aDO7132}OZ~(jmnEWoS7e_id@wX`sa!rsoHXU7=;HvHfr!3_Jz47UQ$6 zpaeXjfycNthSQA-y=3s0LRUEU9DXL}Y_iO{AKMYYx0)OMk%fG_b*8QyT-^c?KnzXq z<#8nALuMyoX)%Xk8NrN~Dt+>g_a?e3kmU}$mZwyHQcM3Qvfscvi&VmtK$e8aJ~9sN z)HUEy*FIc7ARaJW?%t^;RCtc=ia?AT-0o(ybTwcuH6ecV5K)y(L{0s*{F7YGW>%W( zT;N}xkS#lySnokPWL%b^bU5l1K_*NgyKfbJ7r5Ro8npoVAFN_Vm_V=pIM%3-y9$kw zEK8%V2w40mZc7SZ8WB=|oBT47NRPZua&S@hJJFBf)7Ompdl#nA>#pR1N0rmLgs*km*t^Mio5lIAc<5(X^@s+>n$a&16|=zH$9#0u&xdQl=7%o4jy z_;5Da2X0;nF0!3WCW{(-=W&Hbjq3JKB%|}|(;}PI&(ededm6*+R`Vf*qDUAYwmTp8 z|Mvw)CgR*c;jO&i)!Zmrz-|U-!M}39r6b*o5w@EjPsSkCvwYD?xEJc)cX;c`N5rDw zJsi`i+vFkE*FieJ>$vsr`@}UJ#v_b^boE-C-V4R|Lp24L-ZXrOI%u)r!2{;N^V4HO zKOSA?|Il@v)m7Hz3n~A*2H~7);wdn3GUNTT1O$S_%U^Aa7xQUmGyRezb0xQACG(lv zTZEKtyW+dgR9RvJJJDP>47kJ|Oyl(_JH23Ocz!p`oA2oAsV5dLTg%`2vo7#)%R0m$ ztg_FS%lD8tE1zEaBwg!b167K>^A{FrWbK$@Y<0BhNoog*m}~TJKL<~|qss4z&aHlI z-;sO`5TVZokj4FLXoY|cm$~i?ou|ryyXym)LaiK@H$rz;qC+HpCG%<~jrz~!3wQDb zF4vcJD(}QAo*znq9_88IZ2u!3ukH%oXG#-!Z~IIv22YFyvRG7_IcEdNjPmH;KDcIz z=>-2HK)_Kl9z`}FQelNt3N?N3>ZCNVQ%s-k|! zRBwHkiN$NbeMHrekSJ#NnitD3FO zzycSajbu*%I~?5Y?w77hIAVIZqonss+R-Q&oD72@%isOOC7)5@Dpk-|VJ*HSgfETu z=Za7?WKNxZyeRVfxGeQ35-q|yPtIJF^WICu?`$lLY`!Rv(U!%osT(X!@+&JPn^5PK zo?`I*jxn0B?aMVTgJz$(GqWo7;HjIUJ;gs$Lq>rau)U!CJ3TCSGWyi4XuxbvRvXVp zG9&*WVv+~ngngiaY_&|F%A``t8v$k@W$rhop2NzSa=7;?_EA#NK!mAMjb zxXhrm7UPJH+dKD=^IPUmrc`<+i1^S$%$hp%B-CX_ZM=BqKT#orJ0pef%lY;BbmzHf zURRM9zOP2S2dv~>z7)mP0J|)d^_3_ra$`TdA7XDiHsRkjf4M27Cnlk7cm+q&Ts9Dc zj4Bw~k~Mx!BkO$1e3u5Fw}=0fDPPTU1C2#eMbG)ugF%}k<;}koA+aNYp!(3*9GktB zBOO{4^-N>|$%%}imlTQU+0}{TzApgXL9G(zf0>!kGsSWKaNnrqyaA6WFUeBVgBHp$ zTj(Wn2cs0CHS)cSOfjgw_|h{D=F}KjNf?6ik4r;ST6^Ul(x1~pMedQ^mAX0`-90H* zevBMRQZi6xB2`o5fzNTrrC%gaoDnoG$CFu6++|brjNnW4acAXcTr& z9ffX7KvD#e8RPf~&2`i8^nI~|kDKKF_Z8`#Z!Ra~+*ax(!KT68&hr;w3N|M1S~v_J9Xuq8L?-V+Wdx zHiO;Nk&Bn%A6|_AJbbR;*u%b$Cj3;4ySd16YqSW=Wa7-wW5IjIk={M%;f0UMLuG%W z=qONd)BUgzZrX>BcV)SAWs(VT7w$&{U+7A1JyHsu-gw zNRhPv!et3S18;0InV^!Kz~q@0p7;Kf^+AvkxYKPPZ#!x1AL#McLuhBv;4^4=3|T0< z>iUE1w?KOWMW$rZAYvzb6oVN&1f{v(w+DHu2FCnO{13L}1|sLc`IJ*{n3X>|-);mm zE`y;PuV_K50(^voRYfl#>?D75?zh>m?~n76;w{U8pHPN^ye(_~1t3|I+IU`Jjpsu8 z2wCoVpP6oQ1_udKwnyNw8Sp}Mdd8uTLxs8n{bVE)=P12O`26(vM|Eo`r=jtV8WjmcBa-2TZcgADqCm+!(ox!M;TxTSixAA?)ou z_N@>eNC9U+LI-(C&kJbj0jD>Bh3F!M)?xKI0z^*IYhS#aLj>71YGt`Z>4Tv_{V)=( zX<5#J8+$P6)05bam|WE+#6^e|VGR{y--Tn6_^2Q}h!6N*{$C zbA_9aGUBif?4AUQutN;fkkPf9ZY?YBqww5$B5|XH53cs*~oI$c(NPo z5PMO8yKq8Z3+}=Iullsle9{A`|Jg1u7%iyn$-2PsuhXQ%T4N_NJolZ3nW(K3pJ4zE zgGj{+;ksk*%n@t^!ZBLzl>l@UdWdHy&kiRfEK^l7%1~m&5Ypf`sz(We<2sg=ELn~r z8y8Dca(#eG1F+j&1dn})E{4EnWx{z9u3sdyk)87Tp*su|N5r}K0@$J!v@UwHEeMIk zcsi7y{PBiHr+F;pO+d2p0UPtLy;JsJk7vOql9-#xFc*o_;%6k9trMJ#E>WenJG12R z#~`6m@W6@kB34?Wc^M$+7bKujO2F4_wEZy^M&y*eCIj9M72 zuB3xG&x?>fzjFHIIl5M=+)jUI`wC)BjMG|6=t+0`QO#`_!QM#mc2J$N_`E#3Lm9Ti}64 zw%6zEL$-TTT?XG?i{;eJ*k2}p%oGn1ZR3ZBojXGVLHF;=6~cP56IJJ^ja0tfVVQ>! zL)r08#UADDX~D{gh$EKcd!4}>#}hTA6rSwYm>Nc$!O?378b7y6$OY5wcL$6Dpb!_ke4;=Rynv7ym^}Ys4YGt-127E+5UGP zliD^v$^R{y3=a3`4<36;R20brZS%&UyZyVp}19cgD&-NmaUBuB+Z0 zbw;XvfVH7%zD4=y1m_Fb3V+N^jM;^H)`txL#w??7sJIewsb;63dbRCH!S0Ds-^PN< z#Z%5-iY`A;0&wE#k-A;?3VfS!`6&VGkg6OMxTq#thLE&~>Y<#gX6M;|7t ztNP*DD9yWGn{vA9LnDj|6(`Tm>_LccjhPm~=#q53FAvY z9o&Z!M%Y|d;^fEZa`RHB_hmmjQ*CnSN}Yc`@5t#s<-0#qe1mHNc?U7@$*w(={J$IJ zwNH{`yT)XGq|gwEm7@ z0~onz5{~We)v6j&#IMf{3`1l1cT;GSKgJHz<{b=7@yz{lu=0n{_3ah#^ zM4z6%Rq!nCZ?kmpH|zdIjcDaIMUljV}IemK~rCB=o+K`Mr6R^`;YXe zruk2Qk5Qk8>2&qMTVFlOZhUK4yLqf$DaVt#revgiEVxqX@1I}&IfkGu`|7m-u2Y=# z!oSU}=J)jgh`RZYDtjI?jaS|m&Kz5?dfxjg=g6+`;D_|LpZW@H{q-&C+(xTT4)iD# zgkxpN4t;22c>3WLC+SMm$-|GA`XZE5eTE!GoJqvcARqv9t~A(tDlXYtsc6wT{@$95 zUWg9)lh$)|buDBmV5}Ixf!W8XgCp&W(ZOqihClf3P6?Gdgqx>+tiNT;yzqK)=a2}x z!gs|E;j9;G|L(!0f-3+hG`-tK85ZSkQYP7)DW*RGKI=cs^l~!X5DS-YmH*Mp#6Zt{ z1?zB=ETf3~TD_*=6+hLr-5;dkr=8BbvMf8&6PaPf_$$6`+u}R-%-4Vfe{*e95 zQ^6>OhTWoy?{PX`O(y)8D5svRF=Xxq&BHzbbjeworKb69UM)762@~?Hfo>zk z%Dkt$!0Pk~g^Y#X#VF<%=990UT3_4hihh&M_MkG|ncuHIPyA#vLEG^N#o9fUKQB`} z+r)h8$vNJI8os_maj|@#idSX^cC9%rQvu1jCVvifs@17ulKlr79Q~BZR?IG*z%YrU zGf2;&aee)&(YFAPIZ35o`tqy>w6meryBotkpCrrQU6-!evfD&wSib!Cruxs*)M#7K z=00nH6q1+M2W%39LNyqdV+f$0O-IxipOts!odSqfUEittXp4B<6I`1NUC;99i-kTX z&vu#~EY8}A=`XZ%?a4$ZAGeQs_N1_c+xbQ+Bcybh) zk4kjlngItF>tlPUW+R8RH||LP5GDC=VoeGx9UJd4l=J-=roS$A3a44%EU4_@16R@ox5H&KcQTv#WL&K_GVwqbiKv^>V(_*M!983 zML;A><*p)*!_?=TkeTFxsoOpB&)Igx-u!b@ckG&9ru389vWLI&Z7vUT&$CFQwL{@q zPbADH)$2trH2e2Sf&Q9Y9aa^y`7x%Nk{AH&Pf>_ zf10WL6L82G<`_!WCHpD$v`(L(Z{m;W$e~g3g^~V<^;+8~i%FM6ot8+-RmdpB;dFu5 z{>A1OK4XkR%RR3lc~gqli1#A-X7Fa^SSet$YYBY2K*K3Qb0$|sV3OY%6w-QF-DItUugF`)k~KW&Z%6gqCk07LWc zhEDc=QESJ_l1EdPI87rSWzuoq^zm7wfqDyH?Tk{|_(G!Vp^wqv@wnsoZ6chGTdhz< zhwXb$&Zwge}@^%x9b2rT2UXyI`lOPqjQ%CAZ0WS;xAO= z7r^d8*?domJ<85!+$)@MH5rPU(y#X8Y}M^vCz)Hc2;x(5iYaWn)O(0()cIuD$IA#P zVOE7<8C&Lf9&c3lk#Bj*ai#(>w3y^zm1$yFn?id-$?IE7qX@URaZj4j={&|rb$UqM z*bo1Ay)fkc;q}N%V)SmcyFRD4#=~f2!+H={)}(_^y)5pF&-?LNdn@<%veR2!AYe;* z?^z=nul0blN{Uc8Eu*@|z0zM@@hxydlArO*GXGI-bp%k*T^f!G{@w0sm?T%uNQ-LMr`xp5$1yP? z?dx(VtPw~0dQQ7%`H0EumId3W+xS=&GWc-Jxk za}yL|CnS&M78J4B|D#KTSrPO%tziaA@ZTvH(sdzFA>{61qY(L(!*(?&H{@;W2wdgL z$aFci_~wiOh=tzkY?gp@Hu1TN=l7Plov%61@d+|Su6DpPExW+-xBDr7e0boBP2kF1 zL}KgHAvf?&s8GB440K(H?m@3F->UKnx#mgwBy4t)aXgjqM{xyOOe{0$VYq=>+s=W3 zXrbn0@$f)kLSr{1^Ak*G&wL^aHtrDS#?yUs&jUj~T$bpFF> z=nZ3zVbX1L2MH9vQ>PZFx{vj}ricp1mtd`fe_z`q6DydxwSG>m9Mm!A2~Jrp@9wyl z2u+T%ibx@0lK&l*|C_Ou zEH^3S4ULaRuAk&{bm%fw6-Z^>)_1@&8H1-z_GUZ!F3=TraNUpnjQ$eB&}v4Q^_^-T zcCX$2YO|BWs}%j?zfxgoVp-?HQ5`AV8s{$H|G`mfbjIDc4UPiAn)!{1 zn1Ih6cl?nmPG~TM!d3x;kGH6t>sQ*<(vw#vrhRduvNty72Q#atn#Ci~2{>W;lIx&* z$v+?+g``puB3oXv_H~Z*WCkIcSf|eqkG~Qo&TJy8egG&euIhcg1&+QQ^rE##!B7w| z3LdPmS7z{#wh(?YbemfGp97xP-(h8UYd-P@Tq?fa(UAWxyi|*jJ5JtlkOw1s%Y+9s zL+J#RSkfwAQ#VcQYT@1E0*v%%KkhNVpDC}-*HS9w*wogPI&=ZUjB5SHj!q^Mq6bg! zRtH|G*=2?%%-}etzCm&|wErQuhK4$R!thW@(n@MZ0J}?j<4&4vLfeuc{)m0!5ikHX zRSTK+ANyc37}+u}2G;-h7+u^TOx(IKCA2hBdFvh9PqSz2hr|@8Ksnh~9PW|=#@*-N zuD*bb@S4#1_gD-^yes9epC6xo1A5oksU>~BzJOJCJ2tavD}ELTv^@JJCZyE?R*r^S zw>cE%IJXbRQa82?k~1d(R?~ZWEF=53%8}XIif;>R_x#UFuUMW0+j-)BabSr=Lbr6j zP3;S@Ell_&jL|SJ#UPeCJHk)^6vsehen;yWIF3}54wpUeTkead#+3M<;{onE{SLke z0~h_FGy>t80tqquH|W7`4PN6YX9)OKde<~ektpt~nr9z@%74M60dPr7fYEp1(w+Ff z1ZW9j?rQ#?oNQ;rIUH8U6ebP3oAlEKmED}_hMTpa68vk<1=J^=iiR!@8el;vvE(#3 zQbYK8YkfuHU77ZY!7xe&`ix=78s0SDMuRr3X!1Vm)9$znkL@nrT7X{9KFK)qt&}1$ zhsWd;`MwOwaCvoH_*$RKS^4ed=Ozt0gtvlm3~33<+%O26E*mqN*c4)SrODl$$-0pG z;><7RD=ZjU8TC*Bux>B*5}J?xo2`HWqapYC{9a7xS7;c;`$1`QRXZt^jItssCMsuk zMfb{|FE;0(*A}EK)=xoS+unufDd=bSh z1L(~Rj@~`-qFznN?}-@W{V;->Lw|wQ++9?{Js&vDAtDgO#zBE8p;o8@L3%n!>9VU* zK}TY*Yj&TNUc;$1g^*cd90=O5^Ua|(Fk~sa+(@C69uM&^NqOfUSostpK}@NRtTk;r ztPiv_bN9z+Nvgl~>Oq$mMeFj6IipUza3I_H-;ROZU< zHq}cJYJkOD2!J7)j?%OC%8bpdfhW&XL-yVy?VZ~WDcM{RYHIR}iH;RteDwiwTHsw) z5y?iPW#3ON(h;%hvUBNper?QlY+Axp#b}^-vatT%H#~mlYCvznA@ya^)w@dcZ_}rj=@w1;6-DV7!C;bJACgv5l9hLsn zb=s=-uF^9dX2RoF{@5Qi(cZ~?XH4awZH5pOioVF30u6v{g=!ybTFup!+vh$i%*j#q z3@A5+n8=#E4fwq}RR+T22yZUaPM;;v zHZaOWI}erQM5<^ID9-G8MWQ4>g=xU9+i=)750EQNFh(za0Q{A%IG26$F_zWlHK)E! z)|i|F^~Km-*hb<}Oo;>oFAUGbAXAuE`nWE2mv70^4slp(mD>cZ8>hB^Fk!%9BX8Yy zbYajfAf2HiUHkN85Wt3bpi<<8L-=Ba*|h_h1BXC&8OL#(nGXG?&rS&IARAb0nYXl( zTK`20e}q-@^u3FF&?}*H+2Z~)H`m?(aZ@QAH#(IVkU+VLsQyEFknjtY6E=sQFjdwu zE(pfZUGirZo*v={wfI`V(M!p~*@jv401sl^-LEhq9M=g~J-KUbtOz&j0_P4gbhpMv zfSYVzgmZQx1{Y2*$WA=iyB8h+W_bZ=wiHKTmIRDv4Cl=_T-AGD9Kfjl$y(}J;ws{& zm&J*-wDX&EbzLeWfB%1&vg_zRJ9_!H=lgQKf&*=&Q zqVZr`^*zdx!@aAgO)P|=Eqy+)3NJq!(| zLsXnf{U=xN&>uWi^4)u6pUV3F_=1$*Vz-X8oL-+u_3{+QF3uI;Q`d>O753YkSr<5g zQVNF( z@QUf)PTkU}g~l13xw$YeX1i&jyg;aWm0XaMt(&Sm61?{-wKAy-a!7Hz0N4FUsfz6H z?|~&9j9@#WjU3n7E~o{DQ3RQ>3)ZwPWhvv+38x^R}4L_x>(PKcyD zxR93*GkfpUg$pXXC1MZ7ADmT5&)u=peKn#ym`;8ox&AAt`A4tM1y+Ytde1$%bx`Z{ z#R+7b{~0|1YNY4wdAgIL3s04!A6He|dyjF%(&&?C>hMf|(y_scuLk=}lP=S2nX8_3 z`EvBJy%+Fj!xQTu5`4GSHBSEijqxpmNGZnkldbZH6RZk+#G(Kn@EJ{oOn*10{Ahdu zKP(yX#{G~DuRb%$RHf$f!I#qNC+V&Irr1Cj|EnQazSn>4X}!H?wq|*@F2-o=_g&m> zNplEA%=fMon9J`-bO8E$>uju&F0>rSlgsH)LtL727mP;taSXtrFx}ew#;knlXx!IX zE*#n@`EY(r?T=(Ebi|3aIFG>zyoI9k^wDI1q~TvR=r*26K8H(*{S zk+=?8)iM~;59}TcTI;I6ysrk#Wy)|^(F4y4q9pEP|u0heyfG&C6&Am zmR7nQLDrYdSvK|XGE-dLEjSg0oPQEI%Jx^kq6)_Ui!Tjig}vJ{OR5oo{)eA`CFeG! z?C8qS<$DKR#_K|*vVN_6C9!6_%J7UOjdFD$l=8CMnNxJJm$qEO1;F$)cc1==q}4LBT@F)nmQvSVfp-0i5H42}S9ZCCrpAzMG6Xp7E`bCV5mQ>Xm)l zv;0jr^Q^IE-NDfKTyae~HgXNV*(S2tMp01H@#|lKip3>JvyPoYDekWIEVzg4JafEt zni}gVz}OU$IY=f>ugc>frQ7XKi;>M2)T!l>2h@9QI{X5I661w)$N7bzp@*44B_MogTO&Rooy^|a)lgi{zA7ZT8_NX zNEhk9b@Eu;=SqGELhkKR+~s|!HU6z*RaOxr`;H5lsThDbBKi5tUOOSzXRj?utT>~y zcwW_f+RodkK9dpT@XJj#f2@P?5`{G=v#NxMj*=N37rX7XfdYKG#SpwqR!;N6C+iiS zcno9q;4kgA^vg$-|48FtlFAsvadwnk`xs7CW;f9$*wLl)>BAMxTsCInDlLSqY|i0u zr$nqn(X2{ugi;PIL$(On-KS777NKG!{J0ZGi$Rbb@EAkTZaBgDlt*7h7mgxsH*9!8 z=^9_qS}YCve$_=T(Ii4us991l1D?E6{dymb`3V%FSww}(GLm?^&C$`6vSw+1!1NDO zi98=SI6eZJFSiV@B=)udWFolpQ{}HCa1Eu1uqekmQn_T)r}KrKK&GsqZ*Ti~910P|+PR!OpeKNTEJJ?@I*mJL_`i(OGdO7C)pM`I zgsh};sb=`I!X)i!II_4P9r8Q!nVV#~zuzev-*4m`HrqhGep<-SPwIi0#|L_aan!J5 zR?0j=pn8GeTU{@?aEN~7tuMh7^WAaHRl zj|-b^GkLcZEGUQlezxnppyP-}Me?G^_EZ@CsTPF3D%bl7UE@z5tv36YNmbVn?b0Jo znTE{sDNeA=O5`9k!bi=)OzHpyNal;-3_*h801Uw^7c1uWhd>C!<`97L7VAQxj$)AC0{HRN-US$8i~F4sn#lPIpvNZ^vxf3#?h8g0 zJ#(vQ1?Ms9`liUig4R=~3`qajd-YIqtEV!wS`Xe~WiX&}hGxcLxXiUNH_HDI|Bc>@ z8t<)arC`j!K_ia71R8#7i@2kKFeZEc@z?vGFT6Z%Q}P8CJ@Xl8$PA3k{3(2UifXr! zZ_oDc)<>0jI68jQ@YV1BR=?j&Bu?iaui(tpZ{zV5Gf1GhA%28ncFG9U`c^~pO%NAI zpfhB<#GT=Y*;HJU1{CS%t!co>=m)_0P?viLeMEl)lzcYaJPW5j%d=90huEQ+W6yei zvs=qepa*nroZ5+NQ-uopcPX9&hnrbMxX0_?@?AKiNdq}sBo%zZc_kHnd3^`Y3e)pm z{{j8})0dfPjG8K-)n>-@M!$JNj33b8{fw|TB{9?|4FKr}z)pI~P`4ULvp`ZWTNQ(lPDmsk_TaLiHFn3mS9cvi2ahjmKu3^}vyq z$8>t331@vk$Xt<4c$RRc|7-(~Q!y~wg+LJ|NA)GX$rMUBAuHwn9p;5Wm48-0job`` zv9j))+<0HyRRG&WZr|W$0Ub=dU-&pRq8DFAm;>fij|c2ap~6LE=4^$5DbNX7%uo6b zUQ2v>C!1ZPRZ!=_3qtS>35zlbL#pXdhQ^}zP3m+A*K4{&c~H!^dq(6-U~B!pZPC-QpMyBZ;?0pv&NL-KIvAQuxt#~r$bJCz<qw*EMx`GVE=DhVgdClm5Sy9G zsChE9^|8q5H!Nm2osV45-onPq>s_WdOAY2QbB!P>kRa0WY_iJj3rv>b_<6;`3Aq%FP&hA8@NR+{5gyLNarDyMZiTyDChT)K_7QAeU2zNX zW@__g&>d%_dY%qU@OxE9sZ|lRLSR=&dX9)>!l30J?Y#Q%toiF04egVvHvTihQ>K?aq=0zN+z>jnCe;h)s6e51fk4-FGOaGsv91ACum5G|=jSMR zFRy6r)GYhrC#&8%&|t=xzr6Dhbq+2T5X}<(XH9-N1Pi8)FySEo&K6^&Ge4o0~b3a0w zf=a(59z?gVC&&y|C1i+V2Q({UB{1+yCC8f|I0k42U3S!|WjU`t}R6A7Z>ZE7n1RAKZAh_xZ=5x@7ii_=y#kSxMlhil2N>4X2d-edW&G7fea;D4aDc5=NiG|yPwD(4(Z(#O1Ty&XiCDr(0Zc|nbcQ-E-i2R8|054u&x(Cw+2!suE7F`Lq^mM@js?#$glqrWz=y zMQI;0MK}FoRAO)`xiB#5VEU9vxsba_jhN2Q-phV zEYAvfX_GhSUz)@}I&Iyy!bgd!{V5Cw0djbI1^gf|O^;9VF(Btv0Z;rF%^rWpuZbU_ zDSDcvl5WL?l}_8a{|0)}(Z-KjV#N)4ppEgB0%lSto#`d-ANrI7C?tm9bTNwQy~K#h zpk;;)^TzAzXKgnOna&!1zZ2$S2BY?LUWRjpKF?iT+UcR2MbrAr6R40Ss=a;#i(#Z$ z(p~_jy)fy8{pK2C-caxIf7?#u^NAz$(!I~n1v4eMmbssdP=!@+^|Si8{|bcD4n_rV(hzj5{*jO_jpzA;NkY)SyioBUsurU82! zPBV_Cc;45iS^|E;l67K@w&(J&ei+F3o}bZ_<($|Bx#8%*$=l!=`{^&{^jn})_d0Cn zCSsp`Q>uaq)JDR3(m#>eCaIn78f)-vZQQm7m0K0;2E$Nkr7!%s-+w&QpU5_pe^R!H zt7XxdrfZ;1ElI2lCXnDu-Ud6xjPp3BH^9q{4W-b_zvhaj-O6(ohfay#fW-si6xjX> zN8%&O6kq8_jX?0WjqX^Vgx+AoC^3wsX zD=}}l%zsD0sWp~g=Nszmq%4=B+7WMRMCyY`xjbN9C;6YXZh*Q~7ALMF--ZcfrHn{V zl@0LsXW(8xOJplYad*>W#IOsdD(TRROa-GhxQ z5gQsYOu&t7yI(!d&wI{q$1Q%1ujA1#@sGVS|Y8j(@- zMSmtj*>=VgrG2TF{N1{)lFS$#$s;Bb+s!3b0t*6oTa`o!)jR>!?a-Fok2d9wirZJ{ z^|up7DDhnaeO?qfQMBrJ=%(%$ghE@m$(_tn;7E(bm2!nwC_eX)&TJPy-UO$Z1OuBE zU73C)iJ1O3u^-TFH7pwBZCYyhXkF$Mib{f0(}X46&G*-94bWB)*)|eMiU^~~F_K89 z3#+cvG?!d-;0_Dy{1@ueC(NARscYM<26Li6)LqQyS0JifY#y`-a0Ft}b6(`ZobhZ& z>Zr_T+73G*TI`7!v6=Tb77e>aDiGYOMZiJf!9Y8NXiZ4F%Wl7;Dj(SRw1fCXs|9IM zV&|K6j|ENAYA(>X=m=~jc`UEwe45JCTWx2E|L8a(Mrj;)ZC}IUrP5O0*b1l<3+)Ea z3(Bv8d#Cqp1;;ERt$NQL#}FJp*uh@MklE67g7?ELCF9j- z)ct{1xACV^aw}Dn{0HR(_4{^wtnUmu<=pPUyaybRosRnSgO#gHMP6?SNp5F0IeTiS z2a(SYL4W^EEfi-ys_76}bG}5=2^8C3N`8!`)N84*7F{vr@1~}cPO2EB#A#}D&n^W)5&_I1+dxdq7cc~7_b0}D;HSr;Blw6^5b4^n2 zJY+KHoY15UB1Gkjg1v1f18KKCJ?RF9PPZkc-HsNYAYTQ z!6iqFVs@Vk?^bAY?%0N`8? z*~#6F#rWG78miUIHHEGTxczvQ0EU5km{4s3`b`Ml;6OXCRXm9-!Cm~GH_y&Z9C zTik(72?zE6!pBb|&u)7CAWH$+p40OzZTg%tKHo6?CXkc0*)5r8?r;;<`tSLe)VkSa zE)|B0l6EC^O%CbOcJ-BOi?rQJsPY;`B0*v!S3qpPxfx%cJ1*Yu21rTH+D?|vFh?m6 zSSI6*et3<59UTFwy>G6aH3}&}Z-p9^r9^z)@ZE?y+2umv%m9{azcwg$+*baS`?<5gEb~PTk8C_yL;Ye33@I31jxv+@|!sB^zGRJk5u4?NI$t zNH%<_0bX7B*PA~_S|l1kDk8km!(x-7wQqe|9z3e;(_JMd5>OS6Xm4bxR4CnR*mwbS zd($r`)d%8+^9esXQXM|Wi+D097VW?3tRjyU zL530X^mpw%DN3x~At*_jYXxe9T8n4xF^QY_NqUk(>LX;DCEHs$wuEuo-pz@19ZVO8 z=0$?0o=J7goNSzUeDV+en&fBky_aHk^#-4V!dEivST@ZyL-z4%MWYxaNEsv8gEj2rU`RE9j83caQ(*=f;NvigbdK4 z(RI9|E}w;d4%Uv<8wtQ}+q;_Xw`nxld!D#=8EMLTsJjQBPUmy& zQu{zKH&1T-nM!D2y$9&=b`dr`vC&JncCHu?^qEVe+8v8JxvagI!H&WA_)%gGC(}cS z@Ds1*!b}?Tw{QUNf|LP29<+GSrjt9>@?P0DYFOZdqL`drXuHs%W=qvK5ooCZ`2z9OfRtjuybOXtZLzaB{7xkQyq+#v$ z%jxx?_0u(va4Y0Qfv8zR=)EMqvRA-I(zO!_(<562wogn;a$1a`#(C76rqXc~3S4T_CPzKqAVJ6_=7Mq3KD$iz4GlJu$~@ex>^KmJ@_Hp^Jog+pM7_*rDpS={2Rid4v`fxboHWvKrVHPjM|vrx-Et>gkc^H}Jp@QeU^N3`aEdKT z_y3QNdHNHA7&F8k{wSqU4l9Sk^20Kq#Mz&w#kY9OgG^yKnl9^0O!mfaC8azh7aDn_L@LxjLDn3 z3BcSFDTxOeYiqVRwq=|BW0DvAh}LELFcthdx!jqq-TlK!9e5&5ys zVsq#9I!+WWLciwf#u1@~ElUM_e1Ljcx-qMJw*pgKKzJ(|H}+KFdQG8d@9bS#m@!BW z4>3(wU!4_8z-pugy{^U!jTc)A&J__Pdd3O)5mvFfvSXe3q&lxUiK+mT=xyJ&TGr1U zjso0&02JDWi{njAok|z1>*}#P5Bi_z|9ew!Ixo;O<3UdR+G20Ppg6Z98PY&c!)>3F zKAmK$%zX?RqvGhs+n`iM8$sNVHIj}*w(z;}L?>6n7P9$B$X^wn@k$8ok4PbnC>fl+ zE9xq3Fu+D+Ykk{mObWar2TcdNvbz&h0k#l#yVkLv%~H&d4%fu1(tAYv;J043ShgGF z^>2YQ1Z#yNSL@cTXN;x)5R;>~3`k_!s9Uevqc&aXYvKO-=9(=-ovBh1&K{g-Itgy( zSdk!b9DgHA0;WV}T;S3xR>Be$Dn_0*x>^tjxhVGi$*5YDf+9Pmbo3VHimF^ZK*YN0 zSU?zstEUirp0cAIb8IUP+$&$!y?t9ELBh>mGP9FN<6JFAzmA4^$npPg3`;w)x`5h zZ!pmkfR6W)w3h~7rAJ=)ns>S*2t7b*8?YU)w`kFk{CYOcSAXYp-^D~r`kZpmXMgzS zyAfw#?!3Hby4X*typv(%uM^oW)8twbKefhH3ic*X{M@cqP1%${k1TCd9D_7A?)ilG zJ<>UO^`^d!jL_{TcZQnX-v$y2*Q|nYHg&Mjv?cl}q+`sm#D!VA2HJj%Fz!`GlP$yz z8aikAu!V@8)M6-*{WC!&%(fCn!)4DcQ&bo;7$J}5)J)TyF;S21q#-nZxHy4;9OhLg zQr>6K&~+s%r%9Ih4C;#VTt?A8K`aEj=cCW$^8TI?Q$N_>YD&G|AJ0cNn|1Pxy}Ae? zG(-E{$AV?HGHL0cEy#ef-4Ssc4FNEbW{zc9NVK}TF=ajRJ|ukJeYDvy`o6r_o-?3w zwfycir957IEoZRn?CsCbV3Ooc^L5j9F=2a3`54tWsEoJ!s~k;6?j$>Y^UZp&NG{tg zn)H6qPmRz{j~C1!pD=-pJowthmp@5Hf%F_j<@~WP+&sJ&;ijn!isd1+p36!RXoH@48D zu6qg7m_;sxB;q2rQ(@`rb#0If-qa-^$%cx9;7k38JD-^ynBydx4Kn!rFr%F>gEZJe{gU^(AdYQfh8K71WH+@B`IIr;-&&9Z#=G9-AuSqlO zrc0uH?kTei?3+=zh}U69@2v^J#V*O7w(STg#EWrhWS11N0VzX@*52$}u-FaX5NWur z@;fVgcI~I;BoFo3J6eX1{OQ@9CTA=f#nnEOSn1y4?5w2y96Irwf1D8ma`6M2E_LN3 zXUzv2ptOlGV6B(Y2nE2neajo#u94#s-vVcU1%%ZwaS-h61pN1( zT=3S0#m_=U+CU<650C{k{_unoG(jDHU9;(D15iJz$u`D>8`V z6Y=I+?61W;Db$bk#jcP6YTS!BvEnE5z_%@&=(Js;2|5=7h=h(JQ5o@Az@UP%X>QVJ z2XVRds!7z?ZR@B@w#;OoExoKRqKHn@m@)5v#s=Xg)J?e0s}me>DL8(iJN80Tu!^_z zNUyv-qRwr1Vjt+uDgd474F&Te1FMqgbXubLI`o|t4&8y&VVJ;NJji*22~KxW=L-mH zIb)42`QBysF~+_pwSBdUv`yh1&@!;gP<&_`M)cV5j7S#TV=-2!sY>WFaQ-Whll)rT zVc?Oj>t>-hsQ65iihhpPjm&jt4L|4djVHJQ@_x8177}$IUwUht>IajjreMmoL$VbV zBg|I#;e3@~oz+SlrF!qr_KWDl0Y(hWW-x#pm{}wx9LR)fq%_<_m<&ATlnY%!u@mT1 zk;yiUFe2^3*f+)=k}5Nrz5Iwj53Fe%Xs$P;l;9Ap1KmgJ8QnJj*NP%Q^i2M0SoZ5g zJR~~$gk)YhREK&*=lpERvZ>N?&htk8 zmntw(jld=cdHVBCg=W1!k&1ga($+8^X!yUwL`41e$cYJdTgzyoIHIAIi4Rcdt5@XQ zh`&CRDXWL*x)JI685zVBvbVcs(>|I$@j?6Vv!jvV3*w2Q{o9V79x$Xh2(h&WV@A~} zfG9U%Hr@6Jiq_VJN$u-|vGPXqNQ0eNvB)eLfTE&suEW^?v9IiJtNm4{yud#$buVAP z-2$2b#My|0M)Rjj=*Qb~TFK96w-7*V(iKc3hjC1xBzX-f1Nk1^m;TNw0@Nz}=01L^ z2fh8~_lHzCKyn>$y?+p`956JU2&)t$an8{ifG%N)!svE~TC*B0XrB#w-xou8ngSzL z^2KNCNOBG`#1~O#zTwQhOhWLZ6LnLZE z@W#8l;|ET-hB>x_?a;Q7;YU?XSDETry7CC z$Xgeh%KN{CoWQ>MBybRDN6}Z6HXDePNUlaXQpe(&CS0efdCyJSiCM9 zlo(r+i(lFtx`ju`aD*VzyoMxB9nL9q5RuEClSnCxXKfFE75J-q3MUON#wA6MGSQP1 zG$BnzNp!lzy)?QkX!cz+W25|vN~#2YI}8*j!m%T(f0LXhN@*X4PGw&P;+hW)Ji&#) zz8#j|QfU4$J=9?;A2Nd>T@nI6O2Sm0r}eJ8v0vx;u3v0uiQ`a8Gat22|NYjoL~jZ_ zT4#Tq(JCzP^;Uf-dquzDU7zRuA|Gx62}j(t)5G1Q^W&wK56vJAK37+HCuRjIaFJ9` zeOp~cuy>nD&qDb#uV3yEVU}ic=)*nyp8w=@D)^Xjimdnuq~}Lmn*^?0P3K$Ej(&a4 zKDRDHvOT)R{6nSkCFJZOeb0WZfbvL$fJNRuFzL4 zg1oyo=PCbANp=NT9{eZ1oU5blk2pBzm@WM86@R$VoIbLx$BPjA-`{PZn#hU{OTi@U zW}>AIX=f^iK6{XffAQ2|bnic(Qeq1-B%0e^ol?`O)yY*YL&#lxv<^)>LdZJ3nK;_J zYLnvp_-l$}1$eJ1|5@V5mU|0T)*LtnNQ_fan~dMi5ccZBr7ssc-AvS9sOQQ+=%6ns zz#W0DaZ=di!bn>ofmDdE?pA#Ql7jm8*9=LzXo$w*530=40FR*A2+m4dY8N?7Yr&>x zh4C2b7F8k1&fM!shf*qf&|UGj@N4`n%}Tu-7d`ENRy#6Z3VAhgs|Fj-Lz+&^)wJ73 zmq{ZccRe3HaHCrFVO=0XEGu$V@5Ot0|<{=H7EYVyUeYF|k@kDt2S=dJUw zRcjnc_STZP3igA)3k&_$7fBX+SxyBi;+bsS^Xokd=30(iMzyiB>aDf`t3B3`n(ac7 z7(5#*W`>d|P#CdX7`*QOFiLmVuk^-XV3kNeCT?vok!o|->K3ewZ=X}B@ek5Lc;8f~3L_*SR4EGa12c)n}At+q`?mFX&zt(*73k z0#U(R0^gnaywp>#8a9)D8MZm(WVR^o#Pz|NMuhZ!poeri*=CdG{jrin5-~>qGjMQ* z6~4&h*w_HlSWvl%`_*?KpUt#?!Ev$#mGXs>C|MwQ%v5cl+baf+(F4r!FIZa-1^9n& z668jmzfnT5mHei*93}%etKq#BkR$s}Z4j1tW&6~+RZre`h68MA5X86Xk1$a}9d30O zUS45%GuLEhah-4i`^4#yP8FAyHJ9l-Jlz+Fx|L*^26i3swbkeyhuA6MuJEU`d z*B@Yu30);26Y8!LEN#`?t-~q@pE3-M!a;Z}W}dp;=S=IkllAYMg{6}ngPs<}&Np9w z^Y#J__k*9}!Fgigk^&Z!J8axgGoqwUARgin19Ms*QxlDKn;=Gse8Ce{+gp! zED)WEbubD*RK*a?#Bd7H5dZt#NK?_HT@KlDq|HiLNR#ncc}If0x5nyjTrNAcOb{aa zg&vT}zom~fh?xvgf%@^f3bm4s_U49x`0M*Q2)_Jh#J5!f`MoR@DeL}c|ICB&PNQVK z6VG!F+}J0jJc>(-UyA}Ny zvT_!bG;mvC;$<>ZC_#|aEkw9UmjOcNnvLc0@m>G!pu5yvm|V!C8AXuF_{RlTA0G99 z($@&!!*aqv^W4X85uGxk-A4raGTYyeECOF`=F-MfFwb_1ES?}T>ivweqbOa%e;Hc_ zUH&n)Tn+pvO(_;H8w7o3-_c{tnrjMv9g?#{fbBWJmTI#f=fX>5#fzo4+F?a#0#o%L zG3uAwz>IMl;W(ipI)BH(wu1zv`fm4}%8(&{5OUUoj`wBsAYwEIphL*}%PCUs)WG+O zh@_YHf_uPZb2tyC<_IAhsV(C|3;DiKVq0Z=^^?ZQ6=^#C?DPHdd<9N;)n+oiRY1=uH~WJavS(y6~M)H zjpCqW992&eYlGkS9eCeS0mR<=7c5DnssQv5#wcQL+H-aEOt>c*X)##05hAcdf@#e!S-?y+0v0yU{1|bNRun)P%meBl49YKiL+@&GJ3S zCU6&Zg>1-1sD9mf%G^W~&~((KA%WLykbuQt3SrV583ASF?Kriq5*rP>ztRuxf^zD9 zVyrkaYtE!UIKSbS_i&ya%fE$yZn;k=BkW|5Of0DCH56y(6z+fpbpcpFk3FGOxg{t` zD?smJ^Z3ZAuc@#-{WT1u+0UcEn18=4-F=akg@NTZ5}r?si2V~X-ctW(7m7NL%C>C( zc&Ycs|NMv2EZ+YPoBn$xcl1-}_Y~YMmeRcSrlk7MGDUKZX+w zI3b>MIB#$emUJjA1O(aJQWnX+qyF??uP|c2hC-|b$C=N)^_FkNu-yZ;?|7LZ zIo9c*4;`O?U zvI{7pebbxcTXVZIFRa5YnbVwRz5Sh9#+z>0k8E}lS1Jag^$7{Z7N}cdiM#My2#W8~thyTcq#zqAa7?YYCAs>Yg{O_yT0~v!2Ui`fmdz2oU z;Ok{?Kf1s7A|fXv#fE&3gJ(bdz-B6 OQC3jD_EPR<@c#p@CJ(>> literal 6098 zcmb7I3p`X^*B?5=AdI`pU83BQYa={|48<@-gj`ZI!i>i?m+%~wiiU24aFn7%#pIF_ zk4ll8TykrW>qtU`g!vBjzE8dH^M3F5`QiNb-fR8W+H0-7*52z3*~WsOcReo#gW=z0 zxpOZD!wF+B9DTSo=nQGECKviCB3s*=qhAb$fWdfU2+0`lQf+N*bU?rm2pDfdayMz^ zhe{&RNz?)o{e_d0lQ&9Q%0{QCBr26er&7`10&2k^eU*q#qSIGq3+OM{$plPtX>xKm zyMRh6K#Az2g2BOpL3XJ(rj%V;%4WZylU}gd-N}S*c4;@8Jy<{;WV6S{#!w1$4P8K| z*z6TTlnPyEv)RLx%obE%o&ZayAPh#JcIA(wj+TEIgAuRawG*^Ic6B^6A@m(F)cl}} z&2#IGT{3kSGG820I{!Rno9K-kpIJ70{{r)veU4jREZ>Z=@7wZS;(9b@7w38w^QdIG1@c^)X>l5Kv zQk;lGoy`Tjm(6l+Fo~>v8<~(x%y&k zEo8jB7(G2%`)xo`U@BG_8;?CcKQ%Bsl~?x7f*rKuY0TquVQWlhruZHj=F4K2mcO{Q zn+>uZF07g7tv(2LM8n!Sb+1*(c-zrz$88;^R@SelQSfSu80YQMHRmXsjX*qP!djRmj^(?D6%$s0FBtc zK7DjpY^^IMC5}9pw6L43E2vz#0oL=$}22Zxw#Z6LXx0woDp=C z-<7BuSdDYukO-Tj82m&;VJqaor9X#r<|HEZDE}HoiWkcNhY(|1hiZN+V$M+DON1|@ za=HFV;5zx*6i~+~Qe3w};*bzSLlWde2_$wXyJ9@SD(B_-LN!(Uvc9n#vrFVNblrv%l!|@D~|=gjL&12 z78li6OslN8Q-8{=fJAi0QDx;RD&f%z`C$jhNJ9`(nc?cDz}o*^#?0{0kXn`zMI{ZQ z>Zha5=(`8kjluDmD$pqijm#5p)(fj$^j-hm2n!WVzrQoWUwi*I^N2J4CDi)-OoUpE z1Xe|pO#JPL8Co!dIDU77N}MAWj_k*X#5k88={6~S6a51v57)_qHVx)}$v}wK%>eHH{NQLen=r zL;h^Aj#>V!7Mzpiw`IQbf^#5Zw|>No<4S|I zk_TXPb1Hfdn!eHEAk&-}wGXJ8lkE?`rLBOAu+(1g;+XFVyPy*taRRPuoecT|nmu_( zLxonBAmwO|=vk}?s5X;5v{t=4PJv>N4^AD$o{Qw){8>VBGJm}!IFYIMR{YXj9FcB@ zM3$WsIu)4agBH1n13SqZJb*71l6nklM36Mik>h96Ltg~k%ETNIFtr-xrs>VftD9*!k)`h zjLXwu<*Vp^6Jx*GY6-PUNrK%VImiR>uhTuJ77(_=RDjmP)ZcOGf>lRB?$7f1+qXic z16M7$%Jl`n=^9iGPV`7{gM8Zz=hLy$x8vdAYFw89l#W(*L&a%|@_kSAaJ5gjJc8-2 zis-bX=uGUTAJ#wx9XTw6BM5$%+czfG8WKwX8R3u!h&WY?E$#RXl~Tta>K0?MsvkGl zh~618@1K!lsi7z(-A>)p0p3PG=0IC;|XwHt3>d;I&EFe!D|jWJ-zGn1vNYDej_7w z*}XKG=wnZg&xGfVPUN{#YNX85q(45e6rZT8kM{!N&p02nLE>diKFwuXxXvY2^*pbv z`SMixyoOn6Sz_N-(t7qpVunTMM9ARubP8-sbIYo7pG+cO>Z~z76MVmn+kf$iHdV&> z-rZOj9yekQ6qID+2q)nl+i`&goInfX&n!4~1nw@GZ%>^VY1(tSvxa&y7ervV^7_Ji zwW-MpJCm8UzC#cb5L`YhWnm%Pw?b7$At&wX{_Oz#MqwJ=zet9C)uKxaXQx3$HDIxVGi0(1doiL&xU?Gn)(z zdoPv#xyN)F5MJHI=A}oJQDfCE_TXo77caMoFXwnYKA3Zo0rkk(#6OQ7>N7G+cUa3x zYb#SVLwKq$@~!8E6exznfb^sOLLYNkH+$Dr*?zXj@=yRtHR5A&|0=XcWb|y)W!*wn zvX!sZsuDsv*GpFo)o~4G+6j?VyZZXOzSCZWLTByL9T??9H^QE=re$Mc$7k&2brHh$x{g4|VcL|Z0gvUGN4(Nq=-draFs9To8IXBD@s%ma~3x4Lxo1t~?m6vh1 zx7us6?%ytu2#)$4ud@wh&>DmMZC zCP%TCfNsgLa&D_i=y-Y&Pu(FRfo4Jsx#)n_hx6R>lsqw9dfIj@lcwfs;D3Rjb>ZBi zm^N_EO>AN-;9q8{!K%vl71xQ_6Sc;1Bjr{O&KVDUQGUFx$3c!l-O+bKX=-f<^yT4(kTbwnW|fw`7ePyEmr&6 z2L{13#erR8XHCwP_zYcEN@dWED90SN{H_dm-}UW|6aQ%XMblEM!ZG}G(*F2^wcCIP z6M4IlI1Ak^303F2+xR||+r9q)H0p_hR?XaXuR7a`YeG3di9YnHmOnmI(4@_%xVwq9 zsrZ^0&wAZMM;aDf6jGOKA|(`6B1;isVBM3Y6f9rE_CfMtVOV z1^k%`?j%Q8KYUSX`Yr<9kgIlW;&Eiaoz*^X}ev-;Ih=?$gU zi+LKumPhoKIRr zpNHbI*oUaF+4_gKHc}#&F9YMU2|H@fI=^MmXI54p50}3NjznzHE^U1Pj6dmx)fS|XjWH%EUx;htI4$p>c2OG+84f z%Ica)q3c?zzR~0&R{M|7&UkENxIp^8-GOKq5^e9bWTcLi%%`3|GUaq* zBln~j+EbLd8~rIX^G!QgvU`_6pDM-z_uo^GEa=Wze}rKb1pY> zx?bt2eSE4iYlP{^rVhy-GhlAuR+qm?c!ahhD&Ezh{Ub{-Oh3Wd`l0^a z1C}3yk2yih(LvLmVQ&xKh}3fGmuV%(rz)|G1$#GyM~J2l8FA~jy&vK^dMi?EwC7PE zkJid4BCI4KNBmTA`53$^;N?E-U(WiM9xraUH88QYMzYxpWlt9M!h{m|p|?%(!<7|Q`>A+FbdRpo`;s`gZF;ofNlb%=jy}%WFvf3u zaYo73R67oSF#V|@#&3D?WL%W@PaWk|Y5$CypH%r8(_yvWMp5#n;7V_Pm$}W(B2y3O Fe*i2&*OUMN diff --git a/man/mixture2p.Rd b/man/mixture2p.Rd index d093fa79..17a2f0a6 100644 --- a/man/mixture2p.Rd +++ b/man/mixture2p.Rd @@ -50,7 +50,7 @@ Two-parameter mixture model by Zhang and Luck (2008). } \item \strong{Default parameter links:} \itemize{ -\item mu1 = identity; kappa = log; thetat = identity +\item mu1 = tan_half; kappa = log; thetat = identity } \item \strong{Default priors:} \itemize{ @@ -68,7 +68,6 @@ Two-parameter mixture model by Zhang and Luck (2008). \item \code{main}: logistic(0, 1) } } - } } \examples{ @@ -83,12 +82,12 @@ ff <- bmmformula(kappa ~ 1, model <- mixture2p(resp_err = "y") # fit the model -fit <- fit_model(formula = ff, - data = dat, - model = model, - parallel=T, - iter=500, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = dat, + model = model, + parallel=T, + iter=500, + backend='cmdstanr') } } \keyword{bmmmodel} diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index a6ba9e9e..7a8b8b43 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -69,7 +69,7 @@ Three-parameter mixture model by Bays et al (2009). } \item \strong{Default parameter links:} \itemize{ -\item mu1 = identity; kappa = log; thetat = identity; thetant = identity +\item mu1 = tan_half; kappa = log; thetat = identity; thetant = identity } \item \strong{Default priors:} \itemize{ @@ -114,24 +114,24 @@ ff <- bmmformula( model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), setsize = 4) # fit the model -fit <- fit_model(formula = ff, - data = dat, - model = model1, - parallel=T, - iter = 500, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = dat, + model = model1, + parallel=T, + iter = 500, + backend='cmdstanr') # alternatively specify the 3-parameter model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", setsize = 4, regex = TRUE) # fit the model -fit <- fit_model(formula = ff, - data = dat, - model = model2, - parallel=T, - iter = 500, - backend='cmdstanr') +fit <- bmm(formula = ff, + data = dat, + model = model2, + parallel=T, + iter = 500, + backend='cmdstanr') } } \keyword{bmmmodel} diff --git a/man/postprocess_brm.Rd b/man/postprocess_brm.Rd index cb5c8339..5cdeec30 100644 --- a/man/postprocess_brm.Rd +++ b/man/postprocess_brm.Rd @@ -17,7 +17,7 @@ postprocess_brm(model, fit, ...) An object of class brmsfit, with any necessary postprocessing applied } \description{ -Called by fit_model() to automatically perform some type of postprocessing +Called by bmm() to automatically perform some type of postprocessing depending on the model type. It will call the appropriate postprocess_brm.* methods based on the list of classes defined in the .model_* functions. For models with several classes listed, it will call the functions in the order diff --git a/tests/internal/bmmexamples.R b/tests/internal/bmmexamples.R index d2644d89..ef085b9c 100644 --- a/tests/internal/bmmexamples.R +++ b/tests/internal/bmmexamples.R @@ -15,7 +15,7 @@ generate_bmm_examples <- function(seed = 123) { arrange(set_size, ID) formula <- bmf(c ~ 0 + set_size, kappa ~ 1) model <- sdmSimple('dev_rad') - bmmfit_example1 <- fit_model(formula, data, model, + bmmfit_example1 <- bmm(formula, data, model, parallel = TRUE, iter = 100, refresh = 0, @@ -36,7 +36,7 @@ generate_bmm_examples <- function(seed = 123) { dat <- data.frame(y = y, cond = factor(rep(c('A','B','C'), each=1000))) formula <- bmf(c ~ 0 + cond, kappa ~ 0 + cond) model <- sdmSimple('y') - bmmfit_sdm_vignette <- fit_model(formula, dat, model, init = 0.5, iter = 2000, + bmmfit_sdm_vignette <- bmm(formula, dat, model, init = 0.5, iter = 2000, chains = 4, save_pars = save_pars(group = FALSE)) bmmfit_sdm_vignette$bmm$fit_args$data <- NULL @@ -55,7 +55,7 @@ generate_bmm_examples <- function(seed = 123) { formula <- bmf(thetat ~ 0 + set_size + (0 + set_size || id), kappa ~ 0 + set_size + (0 + set_size || id)) model <- mixture2p(resp_err = "error") - bmmfit_mixture2p_vignette <- fit_model( + bmmfit_mixture2p_vignette <- bmm( formula = formula, data = dat_preprocessed, model = model, @@ -113,7 +113,7 @@ generate_bmm_examples <- function(seed = 123) { nt_features = paste0("color_item",2:5), setsize = setsize, nt_distances = paste0("dist_item",2:5)) - bmmfit_imm_vignette <- fit_model( + bmmfit_imm_vignette <- bmm( formula = model_formula, data = simData, model = model, diff --git a/tests/testthat/test-bmm_model_IMM.R b/tests/testthat/test-bmm_model_IMM.R index 34578bf3..0b17a7b7 100644 --- a/tests/testthat/test-bmm_model_IMM.R +++ b/tests/testthat/test-bmm_model_IMM.R @@ -11,7 +11,7 @@ test_that('IMMfull works when setsize is not predicted and there is setsize 1', nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), setsize = "set_size") - res <- try(fit <- fit_model(formula, dat, model, + res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) @@ -28,7 +28,7 @@ test_that('IMMabc works when setsize is not predicted and there is setsize 1', { model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt", 1:7), setsize = "set_size") - res <- try(fit <- fit_model(formula, dat, model, + res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) @@ -47,7 +47,7 @@ test_that('IMMbsc works when setsize is not predicted and there is setsize 1', { nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), setsize = "set_size") - res <- try(fit <- fit_model(formula, dat, model, + res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) @@ -65,7 +65,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') formula <- bmf( @@ -77,7 +77,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') formula <- bmf( @@ -90,7 +90,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') formula <- bmf( @@ -101,7 +101,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') formula <- bmf( @@ -113,7 +113,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') formula <- bmf( @@ -126,7 +126,7 @@ test_that('IMM models give an error if setsize is a predictor but there is an in nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') }) @@ -142,7 +142,7 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), setsize = "set_size") - expect_silent(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F)) + expect_silent(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) formula <- bmf( kappa ~ 1, @@ -153,7 +153,7 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_silent(fit_model(formula, dat, model, backend = 'mock', mock = 1, rename = F)) + expect_silent(bmm(formula, dat, model, backend = 'mock', mock = 1, rename = F)) formula <- bmf( @@ -166,5 +166,5 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), setsize = "set_size") - expect_silent(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F)) + expect_silent(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) }) diff --git a/tests/testthat/test-bmm_model_mixture3p.R b/tests/testthat/test-bmm_model_mixture3p.R index adf809ac..df35c05f 100644 --- a/tests/testthat/test-bmm_model_mixture3p.R +++ b/tests/testthat/test-bmm_model_mixture3p.R @@ -9,7 +9,7 @@ test_that('mixture3p works when setsize is not predicted and there is setsize 1' model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), setsize = "set_size") - res <- try(fit <- fit_model(formula, dat, model, + res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), silent = TRUE) expect_false(is_try_error(res)) @@ -26,7 +26,7 @@ test_that('mixture3p gives an error if setsize is a predictor but there is an in model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), setsize = "set_size") - expect_error(fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F), + expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), 'This model requires that the intercept is supressed when setsize is used as predictor.') @@ -35,5 +35,5 @@ test_that('mixture3p gives an error if setsize is a predictor but there is an in thetat ~ 1, thetant ~ 0 + set_size ) - expect_silent({fit = fit_model(formula, dat, model, backend = 'mock', mock=1, rename = F)}) + expect_silent({fit = bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)}) }) diff --git a/tests/testthat/test-fit_model.R b/tests/testthat/test-fit_model.R index 36c91219..6a5355b2 100644 --- a/tests/testthat/test-fit_model.R +++ b/tests/testthat/test-fit_model.R @@ -11,7 +11,7 @@ test_that("Available mock models run without errors", { # two-parameter model mock fit f <- bmmformula(kappa ~ 1, thetat ~ 1) - mock_fit <- fit_model(f, dat, mixture2p(resp_err = "resp_err"), + mock_fit <- bmm(f, dat, mixture2p(resp_err = "resp_err"), backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") @@ -20,7 +20,7 @@ test_that("Available mock models run without errors", { f <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) model <- mixture3p(resp_err = "resp_err", setsize = 3, nt_features = paste0("Item", 2:3, "_rel")) - mock_fit <- fit_model(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) + mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") @@ -28,7 +28,7 @@ test_that("Available mock models run without errors", { f <- bmmformula(kappa ~ 1, c ~ 1, a ~ 1) model <- IMMabc(resp_err = "resp_err", setsize = 3, nt_features = paste0("Item", 2:3, "_rel")) - mock_fit <- fit_model(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) + mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") @@ -37,7 +37,7 @@ test_that("Available mock models run without errors", { model <- IMMbsc(resp_err = "resp_err", setsize = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) - mock_fit <- fit_model(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) + mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") @@ -46,7 +46,7 @@ test_that("Available mock models run without errors", { model <- IMMfull(resp_err = "resp_err", setsize = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) - mock_fit <- fit_model(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) + mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") }) @@ -67,7 +67,7 @@ test_that("Available models produce expected errors", { for (model in okmodels) { model <- get_model(model) expect_error( - fit_model(bmmformula(kappa ~ 1), model = model(), backend = "mock", + bmm(bmmformula(kappa ~ 1), model = model(), backend = "mock", mock_fit = 1, rename = FALSE), "argument \"data\" is missing, with no default" ) @@ -81,7 +81,7 @@ test_that("Available models produce expected errors", { setsize = 5, nt_distances = "spaD2") expect_error( - fit_model(bmmformula(kappa ~ 1), dat, model1, + bmm(bmmformula(kappa ~ 1), dat, model1, backend = "mock", mock_fit = 1, rename = FALSE), "'nt_features' should equal max\\(setsize\\)-1" ) @@ -91,7 +91,7 @@ test_that("Available models produce expected errors", { setsize = TRUE, nt_distances = "spaD2") expect_error( - fit_model(bmmformula(kappa ~ 1), dat, model2, + bmm(bmmformula(kappa ~ 1), dat, model2, backend = "mock", mock_fit = 1, rename = FALSE), "must be either a variable in your data or " ) @@ -104,7 +104,7 @@ test_that("Available models produce expected errors", { setsize = 3, nt_distances = paste0("spaD", 2:3)) expect_error( - fit_model(bmmformula(kappa ~ 1), dat, model1, + bmm(bmmformula(kappa ~ 1), dat, model1, backend = "mock", mock_fit = 1, rename = FALSE), "All non-target distances to the target need to be postive." ) diff --git a/tests/testthat/test-helpers-postprocess.R b/tests/testthat/test-helpers-postprocess.R index 67019be3..4c323b0d 100644 --- a/tests/testthat/test-helpers-postprocess.R +++ b/tests/testthat/test-helpers-postprocess.R @@ -4,14 +4,14 @@ test_that("bmm version is added to mock model", { ff <- bmmformula(c ~ 1, kappa ~ 1) - fit <- fit_model(formula = ff, - data = dat, - model = sdmSimple(resp_err = "y"), - parallel=T, - iter=500, - backend='mock', - rename = F, - mock = 1) + fit <- bmm(formula = ff, + data = dat, + model = sdmSimple(resp_err = "y"), + parallel=T, + iter=500, + backend='mock', + rename = F, + mock = 1) expect_true("bmm" %in% names(fit$version)) }) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 074a03c5..17834eab 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -8,7 +8,7 @@ test_that("init argument is overwritten if the user supplies it", { test_that("user cannot overwrite the custom family", { config_args <- list(formula = 'a', family = 'b', data = 'd', stanvars = 'e', init = 1) dots <- list(family = 'c') - expect_error(combine_args(nlist(config_args, dots)), 'You cannot provide a family argument to fit_model') + expect_error(combine_args(nlist(config_args, dots)), 'You cannot provide a family argument to bmm') }) test_that("empty dots don't crash the function", { diff --git a/vignettes/bmm_bmmformula.Rmd b/vignettes/bmm_bmmformula.Rmd index bdfb75c1..e983af03 100644 --- a/vignettes/bmm_bmmformula.Rmd +++ b/vignettes/bmm_bmmformula.Rmd @@ -52,7 +52,7 @@ However, instead of predicting a `response` - as is typically done in `brms` - i [^1]: You can always find information on the parameters of a `bmmmodel` by calling the help for the model you want to fit: `?bmmmodel` -As you will typically provide a `bmmformula` for each parameter of a `bmmmodel`, we recommend to set up the formula in a separate object before passing it to the `fit_model` function. There are two ways to set up formulas, both work equally easy and well: +As you will typically provide a `bmmformula` for each parameter of a `bmmmodel`, we recommend to set up the formula in a separate object before passing it to the `bmm()` function. There are two ways to set up formulas, both work equally easy and well: 1. a single call to the function `bmmformula` or its short form `bmf`, separating formulas for different parameters by commas. 2. add a `bmmformula` for each parameter by using the `+` operator. @@ -165,14 +165,14 @@ user_formula <- bmf( my_model <- mixture2p(resp_err = "error") -bmmfit <- fit_model( +bmmfit <- bmm( formula = user_formula, data = my_data, model = my_model, ) ``` -If you were now interested to see how the `bmmformula` that you passed to `bmm` is converted to a `brmsformula`, you can access the `brmsformula` via the `bmmfit` object that will be returned by the `fit_model` function: +If you were now interested to see how the `bmmformula` that you passed to `bmm` is converted to a `brmsformula`, you can access the `brmsformula` via the `bmmfit` object that will be returned by the `bmm()` function: ```{r} bmmfit$formula diff --git a/vignettes/bmm_extract_info.Rmd b/vignettes/bmm_extract_info.Rmd index 1e7ccd42..e923de9b 100644 --- a/vignettes/bmm_extract_info.Rmd +++ b/vignettes/bmm_extract_info.Rmd @@ -44,7 +44,7 @@ fansi::set_knit_hooks(knitr::knit_hooks, which = c("output","message","error")) Each model in `bmm` comes with default priors on all of its parameters. Unlike in the `brms` package, the default priors in `bmm` are informative, based on current expert knowledge in the domain of the model. These default priors help with model identifiability and improve estimation. However, because the priors are informed, it is even more important for you to understand what priors are used when you estimate a model, or when you report the results of a model fit. -You can use the function `default_prior()` from the `brms` package to extract the default priors for a model. The arguments to `default_prior` are the same as for the `fit_model` function in `bmm`. For example, if you want to extract the default priors for the SDM model (`vignette("sdm-simple")`), where you have a set_size categorical predictor of `c` and `kappa`, you can use the following code: +You can use the function `default_prior()` from the `brms` package to extract the default priors for a model. The arguments to `default_prior` are the same as for the `bmm()` function in `bmm`. For example, if you want to extract the default priors for the SDM model (`vignette("sdm-simple")`), where you have a set_size categorical predictor of `c` and `kappa`, you can use the following code: ```{r message=FALSE, warning=FALSE} @@ -109,9 +109,9 @@ stancode(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), Alternatively, if you already have a fitted model object, you can just call `stancode()` on that object, which will give you the same result: ```r -fit <- fit_model(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), - data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) +fit <- bmm(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), + data = OberauerLin_2017, + model = sdmSimple(resp_err = 'dev_rad')) stancode(fit) ``` diff --git a/vignettes/bmm_imm.Rmd b/vignettes/bmm_imm.Rmd index 89c7034d..1344b0c5 100644 --- a/vignettes/bmm_imm.Rmd +++ b/vignettes/bmm_imm.Rmd @@ -202,10 +202,10 @@ model <- IMMfull(resp_err = "resp_err", ``` -Finally, we can fit the model by passing all the relevant arguments to the `fit_model` function: +Finally, we can fit the model by passing all the relevant arguments to the `bmm()` function: ``` r -fit <- fit_model( +fit <- bmm( formula = model_formula, data = simData, model = model, @@ -228,7 +228,7 @@ Using this `fit` object we can have a quick look at the summary of the fitted mo summary(fit) ``` -The first thing you might notice is that below the parts of the formula that was passed to the `fit_model` function, `bmm` has added a lot of additional specifications to implement the IMM. This is nothing that you have to check. But if you are interested in customizing and exploring different assumptions imposed by the IMM, you could start by taking this formula and adapting it accordingly. +The first thing you might notice is that below the parts of the formula that was passed to the `bmm()` function, `bmm` has added a lot of additional specifications to implement the IMM. This is nothing that you have to check. But if you are interested in customizing and exploring different assumptions imposed by the IMM, you could start by taking this formula and adapting it accordingly. Next, we can have a look at the estimated parameters. The first thing we should check is if the sampling converged, this is indicated by all `Rhat` values being close to one. If you want to do more inspection of the sampling, you can check out the functionality implemented in `brms`to do this. diff --git a/vignettes/bmm_mixture_models.Rmd b/vignettes/bmm_mixture_models.Rmd index 64892bfe..120564f9 100644 --- a/vignettes/bmm_mixture_models.Rmd +++ b/vignettes/bmm_mixture_models.Rmd @@ -183,11 +183,11 @@ Then we specify the model as simply as: model <- mixture2p(resp_err = "error") ``` -Finally, we fit the model with the `fit_model` function. The fit model function uses +Finally, we fit the model with the `bmm()` function. The fit model function uses the `brms` package to fit the model, so you can pass to it any argument that you would pass to the `brm` function. ``` r -fit <- fit_model( +fit <- bmm( formula = ff, data = dat_preprocessed, model = model, @@ -302,7 +302,7 @@ model <- mixture3p(resp_err = "error", nt_features = paste0('non_target_',1:5), Then we run the model just like before: ``` r -fit3p <- fit_model( +fit3p <- bmm( formula = ff, data = dat_preprocessed, model = model, diff --git a/vignettes/bmm_sdm_simple.Rmd b/vignettes/bmm_sdm_simple.Rmd index 8aebd71e..84bf31e8 100644 --- a/vignettes/bmm_sdm_simple.Rmd +++ b/vignettes/bmm_sdm_simple.Rmd @@ -168,7 +168,7 @@ ggplot(dat, aes(x=y, fill=cond)) + ## Estimating the model with `bmm` -To estimate the parameters of the SDM distribution, we can use the `fit_model()` function. First, let's specify the model formula. We want `c` and `kappa` to vary over conditions. The first two lines of the formula specify how the parameters vary over conditions. In this case, we want them to vary over the `cond` variable, so we use `c ~ 0 + cond` and `kappa ~ 0 + cond`: +To estimate the parameters of the SDM distribution, we can use the `bmm()` function. First, let's specify the model formula. We want `c` and `kappa` to vary over conditions. The first two lines of the formula specify how the parameters vary over conditions. In this case, we want them to vary over the `cond` variable, so we use `c ~ 0 + cond` and `kappa ~ 0 + cond`: ```{r} ff <- bmf( @@ -187,7 +187,7 @@ Finally, we can fit the model. We strongly recommend using `cmdstanr` as a backe ``` r -fit <- fit_model( +fit <- bmm( formula = ff, data = dat, model = model, From 79b20f37a4bb27c77d3c91df9ea92247e35dd13d Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 17:04:57 +0100 Subject: [PATCH 08/13] depreace setsize in favor of set_size --- NEWS.md | 5 +- R/bmm_model_IMM.R | 123 ++++++++++-------- R/bmm_model_mixture3p.R | 43 +++--- R/bmmformula.R | 22 ++-- R/data.R | 4 +- R/helpers-data.R | 48 +++---- R/helpers-model.R | 14 +- README.Rmd | 2 +- README.md | 10 +- man/IMM.Rd | 14 +- man/OberauerLin_2017.Rd | 2 +- man/ZhangLuck_2008.Rd | 2 +- man/bmf2bf.Rd | 2 +- man/bmm.Rd | 8 +- man/bmmformula.Rd | 8 +- man/configure_model.Rd | 14 +- man/mixture3p.Rd | 10 +- tests/internal/bmmexamples.R | 14 +- .../internal/generate_ref_model_fits_v0.2.1.R | 8 +- tests/internal/internal-model-tests.Rmd | 8 +- tests/internal/internal-model-tests.md | 8 +- tests/testthat/test-bmm_model_IMM.R | 46 +++---- tests/testthat/test-bmm_model_mixture3p.R | 10 +- tests/testthat/test-bmmformula.R | 4 +- tests/testthat/test-fit_model.R | 16 +-- tests/testthat/test-helpers-data.R | 88 ++++++------- tests/testthat/test-helpers-model.R | 18 +-- tests/testthat/test-helpers-prior.R | 2 +- tests/testthat/test-utils.R | 4 +- vignettes/bmm_imm.Rmd | 18 +-- vignettes/bmm_mixture_models.Rmd | 12 +- 31 files changed, 303 insertions(+), 284 deletions(-) diff --git a/NEWS.md b/NEWS.md index e4fc6265..1cd4b4b8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,6 +19,7 @@ ### Other changes * `bmm` now requires the latest version of `brms` (>= 2.21.0). * the function `fit_model()` is deprecated in favor of `bmm()` (#163) +* the argument **setsize** for the `mixture3p` and `IMM` models is now called **set_size** for consistency (#163). The old argument name is deprecated and will be removed in a future version. # bmm 0.4.0 @@ -70,7 +71,7 @@ to zero for scaling and as of now cannot be predicted by independent variables b # bmm 0.2.2 ### Bug Fixes -* fixed a bug where passing a character vector or negative values to setsize argument of visual working memory models caused an error or incorrect behavior (#97) +* fixed a bug where passing a character vector or negative values to set_size argument of visual working memory models caused an error or incorrect behavior (#97) # bmm 0.2.1 @@ -104,7 +105,7 @@ to zero for scaling and as of now cannot be predicted by independent variables b ### New features -* BREAKING CHANGE: Improve user interface to fit_model() ensures package stability and future development. Model specific arguments are now passed to the model functions as named arguments (e.g. `mixture3p(non_targets, setsize)`). This allows for a more flexible and intuitive way to specify model arguments. Passing model specific arguments directly to the `fit_model()` function is now deprecated (#43). +* BREAKING CHANGE: Improve user interface to fit_model() ensures package stability and future development. Model specific arguments are now passed to the model functions as named arguments (e.g. `mixture3p(non_targets, set_size)`). This allows for a more flexible and intuitive way to specify model arguments. Passing model specific arguments directly to the `fit_model()` function is now deprecated (#43). * Add information about each model such as domain, task, name, version, citation, requirements and parameters (#42) * Add ability to generate a template file for adding new models to the package with `use_model_template()` (for developers) (#39) diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index fb87a3d3..e27e9a88 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -3,12 +3,12 @@ #############################################################################! .model_IMMabc <- - function(resp_err = NULL, nt_features = NULL, setsize = NULL, regex = FALSE, + function(resp_err = NULL, nt_features = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( resp_vars = nlist(resp_err), - other_vars = nlist(nt_features, setsize), + other_vars = nlist(nt_features, set_size), domain = "Visual working memory", task = "Continuous reproduction", name = "Interference measurement model by Oberauer and Lin (2017).", @@ -59,11 +59,11 @@ .model_IMMbsc <- function(resp_err = NULL, nt_features = NULL, nt_distances = NULL, - setsize = NULL, regex = FALSE, links = NULL, ...) { + set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( resp_vars = nlist(resp_err), - other_vars = nlist(nt_features, nt_distances, setsize), + other_vars = nlist(nt_features, nt_distances, set_size), domain = "Visual working memory", task = "Continuous reproduction", name = "Interference measurement model by Oberauer and Lin (2017).", @@ -113,11 +113,11 @@ .model_IMMfull <- function(resp_err = NULL, nt_features = NULL, nt_distances = NULL, - setsize = NULL, regex = FALSE, links = NULL, ...) { + set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( resp_vars = nlist(resp_err), - other_vars = nlist(nt_features, nt_distances, setsize), + other_vars = nlist(nt_features, nt_distances, set_size), domain = "Visual working memory", task = "Continuous reproduction", name = "Interference measurement model by Oberauer and Lin (2017).", @@ -199,8 +199,8 @@ #' of non-target items to the target item. Alternatively, if regex=TRUE, a regular #' expression can be used to match the non-target distances columns in the #' dataset. Only necessary for the `IMMbsc` and `IMMfull` models. -#' @param setsize Name of the column containing the set size variable (if -#' setsize varies) or a numeric value for the setsize, if the setsize is +#' @param set_size Name of the column containing the set size variable (if +#' set_size varies) or a numeric value for the set_size, if the set_size is #' fixed. #' @param regex Logical. If TRUE, the `nt_features` and `nt_distances` arguments #' are interpreted as a regular expression to match the non-target feature @@ -227,14 +227,13 @@ #' model1 <- IMMfull(resp_err = "dev_rad", #' nt_features = paste0('col_nt', 1:7), #' nt_distances = paste0('dist_nt', 1:7), -#' setsize = 'set_size') +#' set_size = 'set_size') #' #' # fit the model #' fit <- bmm(formula = ff, #' data = data, #' model = model1, #' parallel = T, -#' iter = 500, #' backend = 'cmdstanr') #' #' # alternatively specify the IMM model with a regular expression to match non-target features @@ -242,46 +241,60 @@ #' model2 <- IMMfull(resp_err = "dev_rad", #' nt_features = 'col_nt', #' nt_distances = 'dist_nt', -#' setsize = 'set_size', +#' set_size = 'set_size', #' regex = TRUE) #' #' # fit the model #' fit <- bmm(formula = ff, #' data = data, #' model = model2, -#' parallel=T, -#' iter = 500, -#' backend='cmdstanr') +#' parallel = T, +#' backend = 'cmdstanr') #'} #' @export -IMMfull <- function(resp_err, nt_features, nt_distances, setsize, regex = FALSE, +IMMfull <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, links = NULL, ...) { + dots <- list(...) + if ("setsize" %in% names(dots)) { + set_size <- dots$setsize + warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") + } stop_missing_args() .model_IMMfull(resp_err = resp_err, nt_features = nt_features, - nt_distances = nt_distances, setsize = setsize, regex = regex, + nt_distances = nt_distances, set_size = set_size, regex = regex, links = links, ...) } #' @rdname IMM #' @keywords bmmmodel #' @export -IMMbsc <- function(resp_err, nt_features, nt_distances, setsize, regex = FALSE, +IMMbsc <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, links = NULL, ...) { + dots <- list(...) + if ("setsize" %in% names(dots)) { + set_size <- dots$setsize + warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") + } stop_missing_args() .model_IMMbsc(resp_err = resp_err, nt_features = nt_features, - nt_distances = nt_distances, setsize = setsize, regex = regex, + nt_distances = nt_distances, set_size = set_size, regex = regex, links = links, ...) } #' @rdname IMM #' @keywords bmmmodel #' @export -IMMabc <- function(resp_err, nt_features, setsize, regex = FALSE, links = NULL, +IMMabc <- function(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) { + dots <- list(...) + if ("setsize" %in% names(dots)) { + set_size <- dots$setsize + warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") + } stop_missing_args() .model_IMMabc(resp_err = resp_err, nt_features = nt_features, - setsize = setsize, regex = regex, links = links, ...) + set_size = set_size, regex = regex, links = links, ...) } #############################################################################! @@ -295,11 +308,11 @@ IMMabc <- function(resp_err, nt_features, setsize, regex = FALSE, links = NULL, #' @export check_data.IMMspatial <- function(model, data, formula) { nt_distances <- model$other_vars$nt_distances - max_setsize <- attr(data, 'max_setsize') + max_set_size <- attr(data, 'max_set_size') - stopif(!isTRUE(all.equal(length(nt_distances), max_setsize - 1)), + stopif(!isTRUE(all.equal(length(nt_distances), max_set_size - 1)), "The number of columns for non-target distances in the argument \\ - 'nt_distances' should equal max(setsize)-1})") + 'nt_distances' should equal max(set_size)-1})") # replace nt_distances data[,nt_distances][is.na(data[,nt_distances])] <- 999 @@ -319,10 +332,10 @@ check_data.IMMspatial <- function(model, data, formula) { #' @export configure_model.IMMabc <- function(model, data, formula) { # retrieve arguments from the data check - max_setsize <- attr(data, 'max_setsize') + max_set_size <- attr(data, 'max_set_size') lure_idx <- attr(data, "lure_idx_vars") nt_features <- model$other_vars$nt_features - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size # construct main brms formula from the bmm formula formula <- bmf2bf(model, formula) + @@ -332,11 +345,11 @@ configure_model.IMMabc <- function(model, data, formula) { brms::nlf(kappa1 ~ kappa) # additional internal terms for the mixture model formula - kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) - theta_nts <- paste0("theta", 3:(max_setsize + 1)) - mu_nts <- paste0("mu", 3:(max_setsize + 1)) + kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) + theta_nts <- paste0("theta", 3:(max_set_size + 1)) + mu_nts <- paste0("mu", 3:(max_set_size + 1)) - for (i in 1:(max_setsize - 1)) { + for (i in 1:(max_set_size - 1)) { formula <- formula + glue_nlf("{kappa_nts[i]} ~ kappa") + glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * a + (1 - {lure_idx[i]}) * (-100)") + @@ -346,7 +359,7 @@ configure_model.IMMabc <- function(model, data, formula) { # define mixture family formula$family <- brms::mixture(brms::von_mises("tan_half"), brms::von_mises("identity"), - nmix = c(1, max_setsize), + nmix = c(1, max_set_size), order = "none") nlist(formula, data) @@ -356,13 +369,13 @@ configure_model.IMMabc <- function(model, data, formula) { #' @export configure_prior.IMMabc <- function(model, data, formula, user_prior, ...) { # retrieve arguments from the data check - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size a_preds <- rhs_vars(formula$pforms$a) prior <- NULL - if (any(data$ss_numeric == 1) && !is.numeric(data[[setsize_var]]) && setsize_var %in% a_preds) { + if (any(data$ss_numeric == 1) && !is.numeric(data[[set_size_var]]) && set_size_var %in% a_preds) { prior <- brms::prior_("constant(0)", class = "b", - coef = paste0(setsize_var, 1), + coef = paste0(set_size_var, 1), nlpar = "a") } prior @@ -372,10 +385,10 @@ configure_prior.IMMabc <- function(model, data, formula, user_prior, ...) { #' @export configure_model.IMMbsc <- function(model, data, formula) { # retrieve arguments from the data check - max_setsize <- attr(data, 'max_setsize') + max_set_size <- attr(data, 'max_set_size') lure_idx <- attr(data, "lure_idx_vars") nt_features <- model$other_vars$nt_features - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size nt_distances <- model$other_vars$nt_distances # construct main brms formula from the bmm formula @@ -387,11 +400,11 @@ configure_model.IMMbsc <- function(model, data, formula) { brms::nlf(expS ~ exp(s)) # additional internal terms for the mixture model formula - kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) - theta_nts <- paste0("theta", 3:(max_setsize + 1)) - mu_nts <- paste0("mu", 3:(max_setsize + 1)) + kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) + theta_nts <- paste0("theta", 3:(max_set_size + 1)) + mu_nts <- paste0("mu", 3:(max_set_size + 1)) - for (i in 1:(max_setsize - 1)) { + for (i in 1:(max_set_size - 1)) { formula <- formula + glue_nlf("{kappa_nts[i]} ~ kappa") + glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * exp(-expS*{nt_distances[i]}) * c + (1 - {lure_idx[i]}) * (-100)") + @@ -401,7 +414,7 @@ configure_model.IMMbsc <- function(model, data, formula) { # define mixture family formula$family <- brms::mixture(brms::von_mises("tan_half"), brms::von_mises("identity"), - nmix = c(1, max_setsize), + nmix = c(1, max_set_size), order = "none") nlist(formula, data) @@ -410,13 +423,13 @@ configure_model.IMMbsc <- function(model, data, formula) { #' @export configure_prior.IMMbsc <- function(model, data, formula, user_prior, ...) { # retrieve arguments from the data check - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size s_preds <- rhs_vars(formula$pforms$s) prior <- NULL - if (any(data$ss_numeric == 1) && !is.numeric(data[[setsize_var]]) && setsize_var %in% s_preds) { + if (any(data$ss_numeric == 1) && !is.numeric(data[[set_size_var]]) && set_size_var %in% s_preds) { prior <- brms::prior_("constant(0)", class = "b", - coef = paste0(setsize_var, 1), + coef = paste0(set_size_var, 1), nlpar = "s") } prior @@ -425,10 +438,10 @@ configure_prior.IMMbsc <- function(model, data, formula, user_prior, ...) { #' @export configure_model.IMMfull <- function(model, data, formula) { # retrieve arguments from the data check - max_setsize <- attr(data, 'max_setsize') + max_set_size <- attr(data, 'max_set_size') lure_idx <- attr(data, "lure_idx_vars") nt_features <- model$other_vars$nt_features - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size nt_distances <- model$other_vars$nt_distances # construct main brms formula from the bmm formula @@ -440,11 +453,11 @@ configure_model.IMMfull <- function(model, data, formula) { brms::nlf(expS ~ exp(s)) # additional internal terms for the mixture model formula - kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) - theta_nts <- paste0("theta", 3:(max_setsize + 1)) - mu_nts <- paste0("mu", 3:(max_setsize + 1)) + kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) + theta_nts <- paste0("theta", 3:(max_set_size + 1)) + mu_nts <- paste0("mu", 3:(max_set_size + 1)) - for (i in 1:(max_setsize - 1)) { + for (i in 1:(max_set_size - 1)) { formula <- formula + glue_nlf("{kappa_nts[i]} ~ kappa") + glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * (exp(-expS*{nt_distances[i]}) * c + a) + (1 - {lure_idx[i]}) * (-100)") + @@ -455,7 +468,7 @@ configure_model.IMMfull <- function(model, data, formula) { # define mixture family formula$family <- brms::mixture(brms::von_mises("tan_half"), brms::von_mises("identity"), - nmix = c(1, max_setsize), + nmix = c(1, max_set_size), order = "none") nlist(formula, data) @@ -464,20 +477,20 @@ configure_model.IMMfull <- function(model, data, formula) { #' @export configure_prior.IMMfull <- function(model, data, formula, user_prior, ...) { # retrieve arguments from the data check - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size s_preds <- rhs_vars(formula$pforms$s) a_preds <- rhs_vars(formula$pforms$a) prior <- brms::empty_prior() - if (any(data$ss_numeric == 1) && !is.numeric(data[[setsize_var]]) && setsize_var %in% a_preds) { + if (any(data$ss_numeric == 1) && !is.numeric(data[[set_size_var]]) && set_size_var %in% a_preds) { prior <- brms::prior_("constant(0)", class = "b", - coef = paste0(setsize_var, 1), + coef = paste0(set_size_var, 1), nlpar = "a") } - if (any(data$ss_numeric == 1) && !is.numeric(data[[setsize_var]]) && setsize_var %in% s_preds) { + if (any(data$ss_numeric == 1) && !is.numeric(data[[set_size_var]]) && set_size_var %in% s_preds) { prior <- prior + brms::prior_("constant(0)", class = "b", - coef = paste0(setsize_var, 1), + coef = paste0(set_size_var, 1), nlpar = "s") } prior diff --git a/R/bmm_model_mixture3p.R b/R/bmm_model_mixture3p.R index e943c10b..793fa09c 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/bmm_model_mixture3p.R @@ -2,13 +2,13 @@ # MODELS #### #############################################################################! -.model_mixture3p <- function(resp_err = NULL, nt_features = NULL, setsize = NULL, +.model_mixture3p <- function(resp_err = NULL, nt_features = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( resp_vars = nlist(resp_err), - other_vars = nlist(nt_features, setsize), + other_vars = nlist(nt_features, set_size), domain = "Visual working memory", task = "Continuous reproduction", name = "Three-parameter mixture model by Bays et al (2009).", @@ -70,8 +70,8 @@ #' centered relative to the target. Alternatively, if regex=TRUE, a regular #' expression can be used to match the non-target feature columns in the #' dataset. -#' @param setsize Name of the column containing the set size variable (if -#' setsize varies) or a numeric value for the setsize, if the setsize is +#' @param set_size Name of the column containing the set size variable (if +#' set_size varies) or a numeric value for the set_size, if the set_size is #' fixed. #' @param regex Logical. If TRUE, the `nt_features` argument is interpreted as #' a regular expression to match the non-target feature columns in the dataset. @@ -99,7 +99,7 @@ #' ) #' #' # specify the 3-parameter model with explicit column names for non-target features -#' model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), setsize = 4) +#' model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) #' #' # fit the model #' fit <- bmm(formula = ff, @@ -111,7 +111,7 @@ #' #' # alternatively specify the 3-parameter model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise -#' model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", setsize = 4, regex = TRUE) +#' model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) #' #' # fit the model #' fit <- bmm(formula = ff, @@ -121,11 +121,16 @@ #' iter = 500, #' backend='cmdstanr') #' } -mixture3p <- function(resp_err, nt_features, setsize, regex = FALSE, +mixture3p <- function(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) { + dots <- list(...) + if ("setsize" %in% names(dots)) { + set_size <- dots$setsize + warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") + } stop_missing_args() .model_mixture3p(resp_err = resp_err, nt_features = nt_features, - setsize = setsize, regex = regex, links = links, ...) + set_size = set_size, regex = regex, links = links, ...) } #############################################################################! @@ -137,10 +142,10 @@ mixture3p <- function(resp_err, nt_features, setsize, regex = FALSE, #' @export configure_model.mixture3p <- function(model, data, formula) { # retrieve arguments from the data check - max_setsize <- attr(data, "max_setsize") + max_set_size <- attr(data, "max_set_size") lure_idx <- attr(data, "lure_idx_vars") nt_features <- model$other_vars$nt_features - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size # construct initial brms formula formula <- bmf2bf(model, formula) + @@ -150,11 +155,11 @@ configure_model.mixture3p <- function(model, data, formula) { brms::nlf(kappa1 ~ kappa) # additional internal terms for the mixture model formula - kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) - theta_nts <- paste0("theta", 3:(max_setsize + 1)) - mu_nts <- paste0("mu", 3:(max_setsize + 1)) + kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) + theta_nts <- paste0("theta", 3:(max_set_size + 1)) + mu_nts <- paste0("mu", 3:(max_set_size + 1)) - for (i in 1:(max_setsize - 1)) { + for (i in 1:(max_set_size - 1)) { formula <- formula + glue_nlf("{kappa_nts[i]} ~ kappa") + glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * (thetant + log(inv_ss)) + (1 - {lure_idx[i]}) * (-100)") + @@ -164,7 +169,7 @@ configure_model.mixture3p <- function(model, data, formula) { # define mixture family formula$family <- brms::mixture(brms::von_mises("tan_half"), brms::von_mises("identity"), - nmix = c(1, max_setsize), + nmix = c(1, max_set_size), order = "none") nlist(formula, data) @@ -174,14 +179,14 @@ configure_model.mixture3p <- function(model, data, formula) { #' @export configure_prior.mixture3p <- function(model, data, formula, user_prior, ...) { - # if there is setsize 1 in the data, set constant prior over thetant for setsize1 - setsize_var <- model$other_vars$setsize + # if there is set_size 1 in the data, set constant prior over thetant for set_size1 + set_size_var <- model$other_vars$set_size thetant_preds <- rhs_vars(formula$pforms$thetant) prior <- NULL - if (any(data$ss_numeric == 1) && !is.numeric(data[[setsize_var]]) && setsize_var %in% thetant_preds) { + if (any(data$ss_numeric == 1) && !is.numeric(data[[set_size_var]]) && set_size_var %in% thetant_preds) { prior <- brms::prior_("constant(-100)", class = "b", - coef = paste0(setsize_var, 1), + coef = paste0(set_size_var, 1), nlpar = "thetant") } prior diff --git a/R/bmmformula.R b/R/bmmformula.R index 777a6d06..bcb582ab 100644 --- a/R/bmmformula.R +++ b/R/bmmformula.R @@ -60,16 +60,16 @@ #' @export #' @examples #' imm_formula <- bmmformula( -#' c ~ 0 + setsize + (0 + setsize | id), +#' c ~ 0 + set_size + (0 + set_size | id), #' a ~ 1, -#' kappa ~ 0 + setsize + (0 + setsize | id) +#' kappa ~ 0 + set_size + (0 + set_size | id) #' ) #' #' # or use the shorter alias 'bmf' #' imm_formula2 <- bmf( -#' c ~ 0 + setsize + (0 + setsize | id), +#' c ~ 0 + set_size + (0 + set_size | id), #' a ~ 1, -#' kappa ~ 0 + setsize + (0 + setsize | id) +#' kappa ~ 0 + set_size + (0 + set_size | id) #' ) #' identical(imm_formula, imm_formula2) #' @@ -198,16 +198,16 @@ check_formula.default <- function(model, data, formula) { #' @export check_formula.nontargets <- function(model, data, formula) { - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size pred_list <- rhs_vars(formula, collapse = FALSE) - has_setsize <- sapply(pred_list, function(x) setsize_var %in% x) - ss_forms <- formula[has_setsize] + has_set_size <- sapply(pred_list, function(x) set_size_var %in% x) + ss_forms <- formula[has_set_size] intercepts <- sapply(ss_forms, has_intercept) stopif(any(intercepts), "The formula for parameter(s) {names(ss_forms)[intercepts]} contains \\ - an intercept and also uses setsize as a predictor. This model requires \\ - that the intercept is supressed when setsize is used as predictor. \\ - Try using 0 + {setsize_var} instead.") + an intercept and also uses set_size as a predictor. This model requires \\ + that the intercept is supressed when set_size is used as predictor. \\ + Try using 0 + {set_size_var} instead.") NextMethod("check_formula") } @@ -225,7 +225,7 @@ check_formula.nontargets <- function(model, data, formula) { #' model <- mixture2p(resp_err = "error") #' #' formula <- bmmformula( -#' thetat ~ 0 + setsize + (0 + setsize | id), +#' thetat ~ 0 + set_size + (0 + set_size | id), #' kappa ~ 1 + (1 | id) #' ) #' diff --git a/R/data.R b/R/data.R index 1fd4a56d..39feffe4 100644 --- a/R/data.R +++ b/R/data.R @@ -8,7 +8,7 @@ #' \describe{ #' \item{subID}{Integer uniquely identifying different subjects} #' \item{trial}{Trial identifyier} -#' \item{setsize}{The setsize of the data in this row} +#' \item{setsize}{The set_size of the data in this row} #' \item{response_error}{The response error, that is the difference between the response #' given and the target color in radians.} #' \item{col_lure1, col_Lure2, col_Lure3, col_Lure4, col_Lure5}{Color value of the lure items coded relative to the target color.} @@ -30,7 +30,7 @@ #' \item{ID}{Integer uniquely identifying different subjects} #' \item{session}{Session number} #' \item{trial}{Trial number within each session} -#' \item{set_size}{The setsize of the data in this row} +#' \item{set_size}{The set_size of the data in this row} #' \item{dev_rad}{The response error, that is the difference between the response #' given and the target color in radians.} #' \item{col_nt1,col_nt2,col_nt3,col_nt4,col_nt5,col_nt6_Col,col_nt7}{The non-target items' color value relative to the target.} diff --git a/R/helpers-data.R b/R/helpers-data.R index d2542703..acf4f7ed 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -69,17 +69,17 @@ check_data.nontargets <- function(model, data, formula) { The model requires these variable to be in radians. The model will continue to run, but the results may be compromised.') - ss <- check_var_setsize(model$other_vars$setsize, data) - max_setsize <- ss$max_setsize + ss <- check_var_set_size(model$other_vars$set_size, data) + max_set_size <- ss$max_set_size ss_numeric <- ss$ss_numeric - stopif(!isTRUE(all.equal(length(nt_features), max_setsize - 1)), + stopif(!isTRUE(all.equal(length(nt_features), max_set_size - 1)), "The number of columns for non-target values in the argument \\ - 'nt_features' should equal max(setsize)-1") + 'nt_features' should equal max(set_size)-1") - # create index variables for nt_features and correction variable for theta due to setsize - lure_idx_vars <- paste0('LureIdx',1:(max_setsize - 1)) - for (i in 1:(max_setsize - 1)) { + # create index variables for nt_features and correction variable for theta due to set_size + lure_idx_vars <- paste0('LureIdx',1:(max_set_size - 1)) + for (i in 1:(max_set_size - 1)) { data[[lure_idx_vars[i]]] <- ifelse(ss_numeric >= (i + 1), 1, 0) } data$ss_numeric <- ss_numeric @@ -88,47 +88,47 @@ check_data.nontargets <- function(model, data, formula) { data[,nt_features][is.na(data[,nt_features])] <- 0 # save some variables for later use - attr(data, 'max_setsize') <- max_setsize + attr(data, 'max_set_size') <- max_set_size attr(data, 'lure_idx_vars') <- lure_idx_vars NextMethod("check_data") } -check_var_setsize <- function(setsize, data) { - stopif(length(setsize) > 1, - "The setsize variable '{setsize}' must be a single numeric value or \\ +check_var_set_size <- function(set_size, data) { + stopif(length(set_size) > 1, + "The set_size variable '{set_size}' must be a single numeric value or \\ a single variable in your data. You provided a vector of length \\ - {length(setsize)}") + {length(set_size)}") - # class check - is setsize a single numeric value or a variable in the data + # class check - is set_size a single numeric value or a variable in the data # coericble to a numeric vector? - if (is_data_var(setsize, data)) { - ss_numeric <- try(as_numeric_vector(data[[setsize]]), silent = T) + if (is_data_var(set_size, data)) { + ss_numeric <- try(as_numeric_vector(data[[set_size]]), silent = T) stopif(is_try_error(ss_numeric), - "The setsize variable '{setsize}' must be coercible to a numeric \\ + "The set_size variable '{set_size}' must be coercible to a numeric \\ vector. Did you code your set size as a character vector?") - max_setsize <- max(ss_numeric, na.rm = T) + max_set_size <- max(ss_numeric, na.rm = T) } else { - max_setsize <- try(as_one_integer(setsize), silent = T) + max_set_size <- try(as_one_integer(set_size), silent = T) - stopif(is_try_error(max_setsize) | is.logical(setsize), - "The setsize variable '{setsize}' must be either a variable in your \\ + stopif(is_try_error(max_set_size) | is.logical(set_size), + "The set_size variable '{set_size}' must be either a variable in your \\ data or a single numeric value") - ss_numeric <- rep(max_setsize, nrow(data)) + ss_numeric <- rep(max_set_size, nrow(data)) } # value check stopif(any(ss_numeric < 1, na.rm = T), - "Values of the setsize variable '{setsize}' must be greater than 0") + "Values of the set_size variable '{set_size}' must be greater than 0") stopif(any(ss_numeric %% 1 != 0, na.rm = T), - "Values of the setsize variable '{setsize}' must be whole numbers") + "Values of the set_size variable '{set_size}' must be whole numbers") - list(max_setsize = max_setsize, ss_numeric = ss_numeric) + list(max_set_size = max_set_size, ss_numeric = ss_numeric) } diff --git a/R/helpers-model.R b/R/helpers-model.R index a4e6647a..59bb385b 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -43,10 +43,10 @@ #' \dontrun{ #' configure_model.mixture3p <- function(model, data, formula) { #' # retrieve arguments from the data check -#' max_setsize <- attr(data, "max_setsize") +#' max_set_size <- attr(data, "max_set_size") #' lure_idx <- attr(data, "lure_idx_vars") #' nt_features <- model$other_vars$nt_features -#' setsize_var <- model$other_vars$setsize +#' set_size_var <- model$other_vars$set_size #' #' # construct initial brms formula #' formula <- bmf2bf(model, formula) + @@ -56,11 +56,11 @@ #' brms::nlf(kappa1 ~ kappa) #' #' # additional internal terms for the mixture model formula -#' kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) -#' theta_nts <- paste0("theta", 3:(max_setsize + 1)) -#' mu_nts <- paste0("mu", 3:(max_setsize + 1)) +#' kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) +#' theta_nts <- paste0("theta", 3:(max_set_size + 1)) +#' mu_nts <- paste0("mu", 3:(max_set_size + 1)) #' -#' for (i in 1:(max_setsize - 1)) { +#' for (i in 1:(max_set_size - 1)) { #' formula <- formula + #' glue_nlf("{kappa_nts[i]} ~ kappa") + #' glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * (thetant + log(inv_ss)) + ", @@ -69,7 +69,7 @@ #' } #' #' # define mixture family -#' vm_list <- lapply(1:(max_setsize + 1), function(x) brms::von_mises(link = "identity")) +#' vm_list <- lapply(1:(max_set_size + 1), function(x) brms::von_mises(link = "identity")) #' vm_list$order <- "none" #' formula$family <- brms::do_call(brms::mixture, vm_list) #' diff --git a/README.Rmd b/README.Rmd index e070c93e..94c7c270 100644 --- a/README.Rmd +++ b/README.Rmd @@ -184,7 +184,7 @@ formula <- bmmformula(c ~ 0 + set_size, model <- IMMfull(resp_err = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") fit <- bmm(formula = formula, data = data, model = model) ``` diff --git a/README.md b/README.md index 30b9afe5..a83dfb94 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,11 @@ view the latest list of supported models by running: bmm::supported_models() #> The following models are supported: #> -#> - IMMabc(resp_err, nt_features, setsize, regex, links) -#> - IMMbsc(resp_err, nt_features, nt_distances, setsize, regex, links) -#> - IMMfull(resp_err, nt_features, nt_distances, setsize, regex, links) +#> - IMMabc(resp_err, nt_features, set_size, regex, links) +#> - IMMbsc(resp_err, nt_features, nt_distances, set_size, regex, links) +#> - IMMfull(resp_err, nt_features, nt_distances, set_size, regex, links) #> - mixture2p(resp_err, links) -#> - mixture3p(resp_err, nt_features, setsize, regex, links) +#> - mixture3p(resp_err, nt_features, set_size, regex, links) #> - sdmSimple(resp_err, links) #> #> Type ?modelname to get information about a specific model, e.g. ?IMMfull @@ -202,7 +202,7 @@ formula <- bmmformula(c ~ 0 + set_size, model <- IMMfull(resp_err = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") fit <- bmm(formula = formula, data = data, model = model) ``` diff --git a/man/IMM.Rd b/man/IMM.Rd index e93a2243..b9e91662 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -11,7 +11,7 @@ IMMfull( resp_err, nt_features, nt_distances, - setsize, + set_size, regex = FALSE, links = NULL, ... @@ -21,13 +21,13 @@ IMMbsc( resp_err, nt_features, nt_distances, - setsize, + set_size, regex = FALSE, links = NULL, ... ) -IMMabc(resp_err, nt_features, setsize, regex = FALSE, links = NULL, ...) +IMMabc(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) } \arguments{ \item{resp_err}{The name of the variable in the provided dataset containing @@ -46,8 +46,8 @@ of non-target items to the target item. Alternatively, if regex=TRUE, a regular expression can be used to match the non-target distances columns in the dataset. Only necessary for the \code{IMMbsc} and \code{IMMfull} models.} -\item{setsize}{Name of the column containing the set size variable (if -setsize varies) or a numeric value for the setsize, if the setsize is +\item{set_size}{Name of the column containing the set size variable (if +set_size varies) or a numeric value for the set_size, if the set_size is fixed.} \item{regex}{Logical. If TRUE, the \code{nt_features} and \code{nt_distances} arguments @@ -264,7 +264,7 @@ ff <- bmmformula( model1 <- IMMfull(resp_err = "dev_rad", nt_features = paste0('col_nt', 1:7), nt_distances = paste0('dist_nt', 1:7), - setsize = 'set_size') + set_size = 'set_size') # fit the model fit <- bmm(formula = ff, @@ -279,7 +279,7 @@ fit <- bmm(formula = ff, model2 <- IMMfull(resp_err = "dev_rad", nt_features = 'col_nt', nt_distances = 'dist_nt', - setsize = 'set_size', + set_size = 'set_size', regex = TRUE) # fit the model diff --git a/man/OberauerLin_2017.Rd b/man/OberauerLin_2017.Rd index 8b9e0d7a..1e5767c3 100644 --- a/man/OberauerLin_2017.Rd +++ b/man/OberauerLin_2017.Rd @@ -12,7 +12,7 @@ A data frame with 15,200 rows and 39 columns: \item{ID}{Integer uniquely identifying different subjects} \item{session}{Session number} \item{trial}{Trial number within each session} -\item{set_size}{The setsize of the data in this row} +\item{set_size}{The set_size of the data in this row} \item{dev_rad}{The response error, that is the difference between the response given and the target color in radians.} \item{col_nt1,col_nt2,col_nt3,col_nt4,col_nt5,col_nt6_Col,col_nt7}{The non-target items' color value relative to the target.} diff --git a/man/ZhangLuck_2008.Rd b/man/ZhangLuck_2008.Rd index aba4760a..78e0fb2d 100644 --- a/man/ZhangLuck_2008.Rd +++ b/man/ZhangLuck_2008.Rd @@ -11,7 +11,7 @@ A data frame with 4,000 rows and 9 columns: \describe{ \item{subID}{Integer uniquely identifying different subjects} \item{trial}{Trial identifyier} -\item{setsize}{The setsize of the data in this row} +\item{set_size}{The set_size of the data in this row} \item{response_error}{The response error, that is the difference between the response given and the target color in radians.} \item{col_lure1, col_Lure2, col_Lure3, col_Lure4, col_Lure5}{Color value of the lure items coded relative to the target color.} diff --git a/man/bmf2bf.Rd b/man/bmf2bf.Rd index cd42741d..147f5852 100644 --- a/man/bmf2bf.Rd +++ b/man/bmf2bf.Rd @@ -24,7 +24,7 @@ appropriate bmf2bf.\* methods based on the classes defined in the model_\* funct model <- mixture2p(resp_err = "error") formula <- bmmformula( - thetat ~ 0 + setsize + (0 + setsize | id), + thetat ~ 0 + set_size + (0 + set_size | id), kappa ~ 1 + (1 | id) ) diff --git a/man/bmm.Rd b/man/bmm.Rd index bce16a8e..f736b3dd 100644 --- a/man/bmm.Rd +++ b/man/bmm.Rd @@ -90,11 +90,11 @@ backend interface to Stan. \section{Supported Models}{ The following models are supported: \itemize{ -\item IMMabc(resp_err, nt_features, setsize, regex, links) -\item IMMbsc(resp_err, nt_features, nt_distances, setsize, regex, links) -\item IMMfull(resp_err, nt_features, nt_distances, setsize, regex, links) +\item IMMabc(resp_err, nt_features, set_size, regex, links) +\item IMMbsc(resp_err, nt_features, nt_distances, set_size, regex, links) +\item IMMfull(resp_err, nt_features, nt_distances, set_size, regex, links) \item mixture2p(resp_err, links) -\item mixture3p(resp_err, nt_features, setsize, regex, links) +\item mixture3p(resp_err, nt_features, set_size, regex, links) \item sdmSimple(resp_err, links) } diff --git a/man/bmmformula.Rd b/man/bmmformula.Rd index cf2ea586..2e54e9c2 100644 --- a/man/bmmformula.Rd +++ b/man/bmmformula.Rd @@ -67,16 +67,16 @@ You can also use the \code{bmf()} function as a shorthand for \code{bmmformula() \examples{ imm_formula <- bmmformula( - c ~ 0 + setsize + (0 + setsize | id), + c ~ 0 + set_size + (0 + set_size | id), a ~ 1, - kappa ~ 0 + setsize + (0 + setsize | id) + kappa ~ 0 + set_size + (0 + set_size | id) ) # or use the shorter alias 'bmf' imm_formula2 <- bmf( - c ~ 0 + setsize + (0 + setsize | id), + c ~ 0 + set_size + (0 + set_size | id), a ~ 1, - kappa ~ 0 + setsize + (0 + setsize | id) + kappa ~ 0 + set_size + (0 + set_size | id) ) identical(imm_formula, imm_formula2) diff --git a/man/configure_model.Rd b/man/configure_model.Rd index 55204463..5a59734e 100644 --- a/man/configure_model.Rd +++ b/man/configure_model.Rd @@ -59,10 +59,10 @@ A bare bones configure_model.* method should look like this: \dontrun{ configure_model.mixture3p <- function(model, data, formula) { # retrieve arguments from the data check - max_setsize <- attr(data, "max_setsize") + max_set_size <- attr(data, "max_set_size") lure_idx <- attr(data, "lure_idx_vars") nt_features <- model$other_vars$nt_features - setsize_var <- model$other_vars$setsize + set_size_var <- model$other_vars$set_size # construct initial brms formula formula <- bmf2bf(model, formula) + @@ -72,11 +72,11 @@ configure_model.mixture3p <- function(model, data, formula) { brms::nlf(kappa1 ~ kappa) # additional internal terms for the mixture model formula - kappa_nts <- paste0("kappa", 3:(max_setsize + 1)) - theta_nts <- paste0("theta", 3:(max_setsize + 1)) - mu_nts <- paste0("mu", 3:(max_setsize + 1)) + kappa_nts <- paste0("kappa", 3:(max_set_size + 1)) + theta_nts <- paste0("theta", 3:(max_set_size + 1)) + mu_nts <- paste0("mu", 3:(max_set_size + 1)) - for (i in 1:(max_setsize - 1)) { + for (i in 1:(max_set_size - 1)) { formula <- formula + glue_nlf("{kappa_nts[i]} ~ kappa") + glue_nlf("{theta_nts[i]} ~ {lure_idx[i]} * (thetant + log(inv_ss)) + ", @@ -85,7 +85,7 @@ configure_model.mixture3p <- function(model, data, formula) { } # define mixture family - vm_list <- lapply(1:(max_setsize + 1), function(x) brms::von_mises(link = "identity")) + vm_list <- lapply(1:(max_set_size + 1), function(x) brms::von_mises(link = "identity")) vm_list$order <- "none" formula$family <- brms::do_call(brms::mixture, vm_list) diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index 7a8b8b43..b357df83 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -4,7 +4,7 @@ \alias{mixture3p} \title{Three-parameter mixture model by Bays et al (2009).} \usage{ -mixture3p(resp_err, nt_features, setsize, regex = FALSE, links = NULL, ...) +mixture3p(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) } \arguments{ \item{resp_err}{The name of the variable in the dataset containing @@ -18,8 +18,8 @@ centered relative to the target. Alternatively, if regex=TRUE, a regular expression can be used to match the non-target feature columns in the dataset.} -\item{setsize}{Name of the column containing the set size variable (if -setsize varies) or a numeric value for the setsize, if the setsize is +\item{set_size}{Name of the column containing the set size variable (if +set_size varies) or a numeric value for the set_size, if the set_size is fixed.} \item{regex}{Logical. If TRUE, the \code{nt_features} argument is interpreted as @@ -111,7 +111,7 @@ ff <- bmmformula( ) # specify the 3-parameter model with explicit column names for non-target features -model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), setsize = 4) +model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) # fit the model fit <- bmm(formula = ff, @@ -123,7 +123,7 @@ fit <- bmm(formula = ff, # alternatively specify the 3-parameter model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise -model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", setsize = 4, regex = TRUE) +model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) # fit the model fit <- bmm(formula = ff, diff --git a/tests/internal/bmmexamples.R b/tests/internal/bmmexamples.R index ef085b9c..3c1b4042 100644 --- a/tests/internal/bmmexamples.R +++ b/tests/internal/bmmexamples.R @@ -75,11 +75,11 @@ generate_bmm_examples <- function(seed = 123) { Ss <- c(10,10,5,5) kappas <- c(15,10,15,10) nTrials = 1000 - setsize = 5 + set_size = 5 simData <- data.frame() for (i in 1:length(Cs)) { - item_location <- c(0, runif(setsize - 1, -pi,pi)) - item_distance <- c(0, runif(setsize - 1, min = 0.1, max = pi)) + item_location <- c(0, runif(set_size - 1, -pi,pi)) + item_distance <- c(0, runif(set_size - 1, min = 0.1, max = pi)) genData <- rIMM(n = nTrials, mu = item_location, dist = item_distance, @@ -93,13 +93,13 @@ generate_bmm_examples <- function(seed = 123) { dist_item1 = 0 ) init_colnames <- colnames(condData) - for (j in 1:(setsize - 1)) { + for (j in 1:(set_size - 1)) { condData <- cbind(condData,item_location[j + 1]) condData <- cbind(condData,item_distance[j + 1]) } colnames(condData) <- c(init_colnames, - paste0(rep(c("color_item","dist_item"),times = setsize - 1), - rep(2:(setsize),each = 2))) + paste0(rep(c("color_item","dist_item"),times = set_size - 1), + rep(2:(set_size),each = 2))) simData <- rbind(simData,condData) } simData$cond <- as.factor(simData$cond) @@ -111,7 +111,7 @@ generate_bmm_examples <- function(seed = 123) { ) model <- IMMfull(resp_err = "resp_err", nt_features = paste0("color_item",2:5), - setsize = setsize, + set_size = set_size, nt_distances = paste0("dist_item",2:5)) bmmfit_imm_vignette <- bmm( formula = model_formula, diff --git a/tests/internal/generate_ref_model_fits_v0.2.1.R b/tests/internal/generate_ref_model_fits_v0.2.1.R index 9771303d..e2821e8c 100644 --- a/tests/internal/generate_ref_model_fits_v0.2.1.R +++ b/tests/internal/generate_ref_model_fits_v0.2.1.R @@ -76,7 +76,7 @@ run_mixture3p <- function(...) { thetant ~ 0 + SetSize, kappa ~ 0 + SetSize) model <- mixture3p(non_targets = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit <- fit_model(formula, dat, model, parallel = TRUE, chains = 4, @@ -136,7 +136,7 @@ run_IMMabc <- function(...) { c ~ 0 + SetSize, kappa ~ 0 + SetSize) model <- IMMabc(non_targets = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit <- fit_model(formula, dat, model, parallel = TRUE, chains = 4, @@ -169,7 +169,7 @@ run_IMMbsc <- function(...) { kappa ~ 0 + SetSize) model <- IMMbsc(non_targets = paste0("Item", 2:4,"_Col_rad"), spaPos = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit <- fit_model(formula, dat, model, parallel = TRUE, chains = 4, @@ -202,7 +202,7 @@ run_IMMfull <- function(...) { kappa ~ 0 + SetSize) model <- IMMfull(non_targets = paste0("Item", 2:4,"_Col_rad"), spaPos = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit <- fit_model(formula, dat, model, parallel = TRUE, chains = 4, diff --git a/tests/internal/internal-model-tests.Rmd b/tests/internal/internal-model-tests.Rmd index ce02048a..0d3f6655 100644 --- a/tests/internal/internal-model-tests.Rmd +++ b/tests/internal/internal-model-tests.Rmd @@ -155,7 +155,7 @@ formula <- bmf(thetat ~ 0 + SetSize, model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$mixture3p <- fit_model(formula, data, model, parallel = TRUE, @@ -282,7 +282,7 @@ formula <- bmf(a ~ 0 + SetSize, model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMfull <- fit_model(formula, data, model, parallel = TRUE, @@ -347,7 +347,7 @@ formula <- bmf(c ~ 0 + SetSize, model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMbsc <- fit_model(formula, data, model, parallel = TRUE, @@ -411,7 +411,7 @@ formula <- bmf(a ~ 0 + SetSize, model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMabc <- fit_model(formula, data, model, parallel = TRUE, diff --git a/tests/internal/internal-model-tests.md b/tests/internal/internal-model-tests.md index 9d556d53..3ea7f4d9 100644 --- a/tests/internal/internal-model-tests.md +++ b/tests/internal/internal-model-tests.md @@ -235,7 +235,7 @@ formula <- bmf(thetat ~ 0 + SetSize, model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$mixture3p <- fit_model(formula, data, model, parallel = TRUE, @@ -554,7 +554,7 @@ formula <- bmf(a ~ 0 + SetSize, model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMfull <- fit_model(formula, data, model, parallel = TRUE, @@ -747,7 +747,7 @@ formula <- bmf(c ~ 0 + SetSize, model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMbsc <- fit_model(formula, data, model, parallel = TRUE, @@ -925,7 +925,7 @@ formula <- bmf(a ~ 0 + SetSize, model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), - setsize = "SetSize") + set_size = "SetSize") fit$IMMabc <- fit_model(formula, data, model, parallel = TRUE, diff --git a/tests/testthat/test-bmm_model_IMM.R b/tests/testthat/test-bmm_model_IMM.R index 0b17a7b7..56f864ad 100644 --- a/tests/testthat/test-bmm_model_IMM.R +++ b/tests/testthat/test-bmm_model_IMM.R @@ -1,4 +1,4 @@ -test_that('IMMfull works when setsize is not predicted and there is setsize 1', { +test_that('IMMfull works when set_size is not predicted and there is set_size 1', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -10,14 +10,14 @@ test_that('IMMfull works when setsize is not predicted and there is setsize 1', model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), - setsize = "set_size") + set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) }) -test_that('IMMabc works when setsize is not predicted and there is setsize 1', { +test_that('IMMabc works when set_size is not predicted and there is set_size 1', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -27,7 +27,7 @@ test_that('IMMabc works when setsize is not predicted and there is setsize 1', { ) model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt", 1:7), - setsize = "set_size") + set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) @@ -35,7 +35,7 @@ test_that('IMMabc works when setsize is not predicted and there is setsize 1', { }) -test_that('IMMbsc works when setsize is not predicted and there is setsize 1', { +test_that('IMMbsc works when set_size is not predicted and there is set_size 1', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -46,7 +46,7 @@ test_that('IMMbsc works when setsize is not predicted and there is setsize 1', { model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), - setsize = "set_size") + set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) expect_false(is_try_error(res)) @@ -54,7 +54,7 @@ test_that('IMMbsc works when setsize is not predicted and there is setsize 1', { }) -test_that('IMM models give an error if setsize is a predictor but there is an intercept', { +test_that('IMM models give an error if set_size is a predictor but there is an intercept', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -64,9 +64,9 @@ test_that('IMM models give an error if setsize is a predictor but there is an in ) model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( kappa ~ 1, @@ -76,9 +76,9 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( kappa ~ 1, @@ -89,9 +89,9 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( kappa ~ 1, @@ -100,9 +100,9 @@ test_that('IMM models give an error if setsize is a predictor but there is an in ) model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( kappa ~ 0+set_size, @@ -112,9 +112,9 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( kappa ~ 1, @@ -125,13 +125,13 @@ test_that('IMM models give an error if setsize is a predictor but there is an in model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') }) -test_that('IMM models run when setsize is a predictor and intercept is supressed', { +test_that('IMM models run when set_size is a predictor and intercept is supressed', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -141,7 +141,7 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed ) model <- IMMabc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_silent(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) formula <- bmf( @@ -152,7 +152,7 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed model <- IMMbsc(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_silent(bmm(formula, dat, model, backend = 'mock', mock = 1, rename = F)) @@ -165,6 +165,6 @@ test_that('IMM models run when setsize is a predictor and intercept is supressed model <- IMMfull(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_silent(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) }) diff --git a/tests/testthat/test-bmm_model_mixture3p.R b/tests/testthat/test-bmm_model_mixture3p.R index df35c05f..683af611 100644 --- a/tests/testthat/test-bmm_model_mixture3p.R +++ b/tests/testthat/test-bmm_model_mixture3p.R @@ -1,4 +1,4 @@ -test_that('mixture3p works when setsize is not predicted and there is setsize 1', { +test_that('mixture3p works when set_size is not predicted and there is set_size 1', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -8,14 +8,14 @@ test_that('mixture3p works when setsize is not predicted and there is setsize 1' ) model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), - setsize = "set_size") + set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), silent = TRUE) expect_false(is_try_error(res)) }) -test_that('mixture3p gives an error if setsize is a predictor but there is an intercept', { +test_that('mixture3p gives an error if set_size is a predictor but there is an intercept', { skip_on_cran() dat <- OberauerLin_2017 formula <- bmf( @@ -25,9 +25,9 @@ test_that('mixture3p gives an error if setsize is a predictor but there is an in ) model <- mixture3p(resp_err = 'dev_rad', nt_features = paste0("col_nt",1:7), - setsize = "set_size") + set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), - 'This model requires that the intercept is supressed when setsize is used as predictor.') + 'This model requires that the intercept is supressed when set_size is used as predictor.') formula <- bmf( diff --git a/tests/testthat/test-bmmformula.R b/tests/testthat/test-bmmformula.R index bf4cbe16..2235c4ad 100644 --- a/tests/testthat/test-bmmformula.R +++ b/tests/testthat/test-bmmformula.R @@ -4,7 +4,7 @@ test_that('+.bmmformula method works', { f2 <- bmf(kappa~1) f3 <- bmf(kappa~1, m ~ 1) f4 <- bmf(kappa~1, m ~ A+B+(A|ID)) - f5 <- bmf(c~setsize) + f5 <- bmf(c~set_size) f6 <- formula(c~1) f7 <- formula(m ~ A+B+(A|ID)) @@ -18,7 +18,7 @@ test_that('+.bmmformula method works', { expect_equal(f1 + f4, bmf(y~1,kappa~1, m ~ A+B+(A|ID))) # adding three bmmformulas work - expect_equal(f1+f2+f5, bmf(y~1, kappa~1, c~setsize)) + expect_equal(f1+f2+f5, bmf(y~1, kappa~1, c~set_size)) # adding a formula to a bmmformula works expect_equal(f1 + f6, bmf(y~1, c~1)) diff --git a/tests/testthat/test-fit_model.R b/tests/testthat/test-fit_model.R index 6a5355b2..c5944a3e 100644 --- a/tests/testthat/test-fit_model.R +++ b/tests/testthat/test-fit_model.R @@ -18,7 +18,7 @@ test_that("Available mock models run without errors", { # three-parameter model mock fit f <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - model <- mixture3p(resp_err = "resp_err", setsize = 3, + model <- mixture3p(resp_err = "resp_err", set_size = 3, nt_features = paste0("Item", 2:3, "_rel")) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) @@ -26,7 +26,7 @@ test_that("Available mock models run without errors", { # IMMabc model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, a ~ 1) - model <- IMMabc(resp_err = "resp_err", setsize = 3, + model <- IMMabc(resp_err = "resp_err", set_size = 3, nt_features = paste0("Item", 2:3, "_rel")) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) @@ -34,7 +34,7 @@ test_that("Available mock models run without errors", { # IMMbsc model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, s ~ 1) - model <- IMMbsc(resp_err = "resp_err", setsize = 3, + model <- IMMbsc(resp_err = "resp_err", set_size = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) @@ -43,7 +43,7 @@ test_that("Available mock models run without errors", { # IMMfull model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, a ~ 1, s ~ 1) - model <- IMMfull(resp_err = "resp_err", setsize = 3, + model <- IMMfull(resp_err = "resp_err", set_size = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) @@ -78,17 +78,17 @@ test_that("Available models produce expected errors", { for (model in okmodels) { model1 <- get_model(model)(resp_err = "resp_err", nt_features = "Item2_rel", - setsize = 5, + set_size = 5, nt_distances = "spaD2") expect_error( bmm(bmmformula(kappa ~ 1), dat, model1, backend = "mock", mock_fit = 1, rename = FALSE), - "'nt_features' should equal max\\(setsize\\)-1" + "'nt_features' should equal max\\(set_size\\)-1" ) model2 <- get_model(model)(resp_err = "resp_err", nt_features = "Item2_rel", - setsize = TRUE, + set_size = TRUE, nt_distances = "spaD2") expect_error( bmm(bmmformula(kappa ~ 1), dat, model2, @@ -101,7 +101,7 @@ test_that("Available models produce expected errors", { for (model in spamodels) { model1 <- get_model(model)(resp_err = "resp_err", nt_features = paste0("Item", 2:3, "_rel"), - setsize = 3, + set_size = 3, nt_distances = paste0("spaD", 2:3)) expect_error( bmm(bmmformula(kappa ~ 1), dat, model1, diff --git a/tests/testthat/test-helpers-data.R b/tests/testthat/test-helpers-data.R index a31de728..b7ebf37a 100644 --- a/tests/testthat/test-helpers-data.R +++ b/tests/testthat/test-helpers-data.R @@ -15,21 +15,21 @@ test_that("check_data() produces expected errors and warnings", { mls <- lapply(c('mixture2p','mixture3p','IMMabc','IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', setsize=2, nt_distances = 'z'), + expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 12, x = 1, z = 2), bmmformula(kappa ~ 1)), "It appears your response variable is in degrees.\n") - expect_silent(check_data(ml(resp_err = "y", nt_features = 'x', setsize=2, nt_distances = 'z'), + expect_silent(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(y ~ 1))) } mls <- lapply(c('mixture3p','IMMabc','IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_error(check_data(ml(resp_err = "y",nt_features='x', setsize = 5, nt_distances = 'z'), + expect_error(check_data(ml(resp_err = "y",nt_features='x', set_size = 5, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(kappa ~ 1)), - "'nt_features' should equal max\\(setsize\\)-1") - expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', setsize=2, nt_distances = 'z'), + "'nt_features' should equal max\\(set_size\\)-1") + expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 2*pi+1, z = 2), bmmformula(kappa ~ 1)), "at least one of your non_target variables are in degrees") @@ -37,102 +37,102 @@ test_that("check_data() produces expected errors and warnings", { mls <- lapply(c('IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_error(check_data(ml(resp_err = "y",nt_features=paste0('x',1:4), setsize = 5, nt_distances = 'z'), + expect_error(check_data(ml(resp_err = "y",nt_features=paste0('x',1:4), set_size = 5, nt_distances = 'z'), data.frame(y = 1, x1 = 1, x2=2,x3=3,x4=4, z = 2), bmmformula(kappa ~ 1)), - "'nt_distances' should equal max\\(setsize\\)-1") + "'nt_distances' should equal max\\(set_size\\)-1") } }) -test_that("check_var_setsize accepts valid input", { +test_that("check_var_set_size accepts valid input", { # Simple numeric vector is valid dat <- data.frame(y = rep(c(1,2,3), each=3)) - expect_silent(check_var_setsize('y', dat)) - expect_equal(names(check_var_setsize('y', dat)), c("max_setsize","ss_numeric")) - expect_equal(check_var_setsize('y', dat)$max_setsize, 3) - all(is.numeric(check_var_setsize('y', dat)$ss_numeric), na.rm = T) + expect_silent(check_var_set_size('y', dat)) + expect_equal(names(check_var_set_size('y', dat)), c("max_set_size","ss_numeric")) + expect_equal(check_var_set_size('y', dat)$max_set_size, 3) + all(is.numeric(check_var_set_size('y', dat)$ss_numeric), na.rm = T) # Factor with numeric levels is valid dat <- data.frame(y = factor(rep(c(1,2,3), each=3))) - expect_silent(check_var_setsize('y', dat)) - expect_equal(check_var_setsize('y', dat)$max_setsize, 3) - all(is.numeric(check_var_setsize('y', dat)$ss_numeric), na.rm = T) + expect_silent(check_var_set_size('y', dat)) + expect_equal(check_var_set_size('y', dat)$max_set_size, 3) + all(is.numeric(check_var_set_size('y', dat)$ss_numeric), na.rm = T) # Character vector representing numbers is valid dat <- data.frame(y = rep(c('1','2','3'), each=3)) - expect_silent(check_var_setsize('y', dat)) - expect_equal(check_var_setsize('y', dat)$max_setsize, 3) - all(is.numeric(check_var_setsize('y', dat)$ss_numeric), na.rm = T) + expect_silent(check_var_set_size('y', dat)) + expect_equal(check_var_set_size('y', dat)$max_set_size, 3) + all(is.numeric(check_var_set_size('y', dat)$ss_numeric), na.rm = T) # Numeric vector with NA values is valid (assuming NA is treated correctly) dat <- data.frame(y = rep(c(1,5,NA), each=3)) - expect_silent(check_var_setsize('y', dat)) - expect_equal(check_var_setsize('y', dat)$max_setsize, 5) - all(is.numeric(check_var_setsize('y', dat)$ss_numeric), na.rm = T) + expect_silent(check_var_set_size('y', dat)) + expect_equal(check_var_set_size('y', dat)$max_set_size, 5) + all(is.numeric(check_var_set_size('y', dat)$ss_numeric), na.rm = T) # Factor with NA and numeric levels is valid dat <- data.frame(y = factor(rep(c(1,5,NA), each=3))) - expect_silent(check_var_setsize('y', dat)) - expect_equal(check_var_setsize('y', dat)$max_setsize, 5) - all(is.numeric(check_var_setsize('y', dat)$ss_numeric), na.rm = T) + expect_silent(check_var_set_size('y', dat)) + expect_equal(check_var_set_size('y', dat)$max_set_size, 5) + all(is.numeric(check_var_set_size('y', dat)$ss_numeric), na.rm = T) }) -test_that("check_var_setsize rejects invalid input", { +test_that("check_var_set_size rejects invalid input", { # Factor with non-numeric levels is invalid dat <- data.frame(y = factor(rep(c('A','B','C'), each=3))) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Character vector with non-numeric values is invalid dat <- data.frame(y = rep(c('A','B','C'), each=3)) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Character vector with NA and non-numeric values is invalid dat <- data.frame(y = rep(c('A',NA,'C'), each=3)) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Factor with NA and non-numeric levels is invalid dat <- data.frame(y = factor(rep(c('A',NA,'C'), each=3))) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Character vector with numeric and non-numeric values is invalid dat <- data.frame(y = rep(c('A',5,'C'), each=3)) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Factor with numeric and non-numeric levels is invalid dat <- data.frame(y = factor(rep(c('A',5,'C'), each=3))) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Numeric vector with invalid set sizes (less than 1) is invalid dat <- data.frame(y = rep(c(0,1,5), each=3)) - expect_error(check_var_setsize('y', dat), "must be greater than 0") + expect_error(check_var_set_size('y', dat), "must be greater than 0") # Factor with levels less than 1 are invalid dat <- data.frame(y = factor(rep(c(0,4,5), each=3))) - expect_error(check_var_setsize('y', dat), "must be greater than 0") + expect_error(check_var_set_size('y', dat), "must be greater than 0") # Character vector representing set sizes with text is invalid - dat <- data.frame(y = rep(paste0('setsize ', c(2,3,8)), each=3)) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + dat <- data.frame(y = rep(paste0('set_size ', c(2,3,8)), each=3)) + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Factor representing set sizes with text is invalid - dat <- data.frame(y = factor(rep(paste0('setsize ', c(2,3,8)), each=3))) - expect_error(check_var_setsize('y', dat), "must be coercible to a numeric vector") + dat <- data.frame(y = factor(rep(paste0('set_size ', c(2,3,8)), each=3))) + expect_error(check_var_set_size('y', dat), "must be coercible to a numeric vector") # Numeric vector with decimals is invalid dat <- data.frame(y = c(1:8,1.3)) - expect_error(check_var_setsize('y', dat), "must be whole numbers") + expect_error(check_var_set_size('y', dat), "must be whole numbers") # Setsize must be of length 1 dat <- data.frame(y = c(1,2,3), z = c(1,2,3)) - expect_error(check_var_setsize(c('z','y'), dat), "You provided a vector") - expect_error(check_var_setsize(list('z','y'), dat), "You provided a vector") - expect_error(check_var_setsize(setsize=TRUE, dat), "must be either a variable in your data or a single numeric value") + expect_error(check_var_set_size(c('z','y'), dat), "You provided a vector") + expect_error(check_var_set_size(list('z','y'), dat), "You provided a vector") + expect_error(check_var_set_size(set_size=TRUE, dat), "must be either a variable in your data or a single numeric value") }) @@ -143,7 +143,7 @@ test_that("check_var_setsize rejects invalid input", { test_that("check_data() returns a data.frame()", { mls <- lapply(supported_models(print_call=FALSE), get_model) for (ml in mls) { - expect_s3_class(check_data(ml(resp_err = "y",nt_features = 'x', setsize=2, nt_distances = 'z'), + expect_s3_class(check_data(ml(resp_err = "y",nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(kappa ~ 1)), "data.frame") } @@ -212,7 +212,7 @@ test_that("standata() works with bmmformula", { dat <- OberauerLin_2017 sd <- standata(ff, dat, mixture3p(resp_err = "dev_rad", nt_features = 'col_nt', - setsize = "set_size", regex = T)) + set_size = "set_size", regex = T)) expect_equal(class(sd)[1], "standata") }) @@ -227,7 +227,7 @@ test_that("standata() returns a standata class", { standata <- standata(ff, dat, mixture3p(resp_err = "y" , nt_features = paste0('nt',1,'_loc'), - setsize = 2)) + set_size = 2)) expect_equal(class(standata)[1], "standata") }) diff --git a/tests/testthat/test-helpers-model.R b/tests/testthat/test-helpers-model.R index bc5d36d3..561f4c53 100644 --- a/tests/testthat/test-helpers-model.R +++ b/tests/testthat/test-helpers-model.R @@ -24,44 +24,44 @@ test_that("check_model() works with regular expressions", { models1 <- list( mixture3p("dev_rad", nt_features = paste0("col_nt", 1:7), - setsize = "set_size" + set_size = "set_size" ), IMMfull("dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), - setsize = "set_size" + set_size = "set_size" ), IMMbsc("dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), - setsize = "set_size" + set_size = "set_size" ), IMMabc("dev_rad", nt_features = paste0("col_nt", 1:7), - setsize = "set_size" + set_size = "set_size" ) ) models2 <- list( mixture3p("dev_rad", nt_features = "col_nt", - setsize = "set_size", + set_size = "set_size", regex = TRUE ), IMMfull("dev_rad", nt_features = "col_nt", nt_distances = "dist_nt", - setsize = "set_size", + set_size = "set_size", regex = TRUE ), IMMbsc("dev_rad", nt_features = "col_nt", nt_distances = "dist_nt", - setsize = "set_size", + set_size = "set_size", regex = TRUE ), IMMabc("dev_rad", nt_features = "col_nt", - setsize = "set_size", + set_size = "set_size", regex = TRUE ) ) @@ -106,7 +106,7 @@ test_that("stancode() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) sc <- stancode(ff, OberauerLin_2017, model = mixture3p(resp_err = "dev_rad", nt_features = "col_nt", - setsize = "set_size", + set_size = "set_size", regex = T) ) expect_equal(class(sc)[1], "character") diff --git a/tests/testthat/test-helpers-prior.R b/tests/testthat/test-helpers-prior.R index 979669eb..a8495316 100644 --- a/tests/testthat/test-helpers-prior.R +++ b/tests/testthat/test-helpers-prior.R @@ -14,7 +14,7 @@ test_that("default_prior() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) prior <- default_prior(ff, OberauerLin_2017, mixture3p(resp_err = "dev_rad", nt_features = "col_nt", - setsize = "set_size", + set_size = "set_size", regex = T)) expect_equal(class(prior)[1], "brmsprior") }) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 17834eab..ee144125 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -21,8 +21,8 @@ test_that("empty dots don't crash the function", { test_that("missing arguments in models are handled correctly", { expect_error(mixture2p(), "arguments are missing in mixture2p\\(\\)\\: resp_err") expect_error(sdmSimple(), "arguments are missing in sdmSimple\\(\\)\\: resp_err") - expect_error(mixture3p('y'), "arguments are missing in mixture3p\\(\\)\\: nt_features, setsize") - expect_error(mixture3p(setsize = 'y'), "arguments are missing in mixture3p\\(\\)\\: resp_err, nt_features") + expect_error(mixture3p('y'), "arguments are missing in mixture3p\\(\\)\\: nt_features, set_size") + expect_error(mixture3p(set_size = 'y'), "arguments are missing in mixture3p\\(\\)\\: resp_err, nt_features") }) test_that("get_variables works", { diff --git a/vignettes/bmm_imm.Rmd b/vignettes/bmm_imm.Rmd index 1344b0c5..15ea7f2b 100644 --- a/vignettes/bmm_imm.Rmd +++ b/vignettes/bmm_imm.Rmd @@ -124,15 +124,15 @@ As <- c(0.5,1,0.5,0.5) Ss <- c(10,10,5,5) kappas <- c(15,10,15,10) nTrials = 1000 -setsize = 5 +set_size = 5 simData <- data.frame() for (i in 1:length(Cs)) { # generate different non-target locations for each condition - item_location <- c(0, runif(setsize - 1, -pi,pi)) + item_location <- c(0, runif(set_size - 1, -pi,pi)) # generate different distances for each condition - item_distance <- c(0, runif(setsize - 1, min = 0.1, max = pi)) + item_distance <- c(0, runif(set_size - 1, min = 0.1, max = pi)) # simulate data for each condition genData <- rIMM(n = nTrials, @@ -151,14 +151,14 @@ for (i in 1:length(Cs)) { init_colnames <- colnames(condData) - for (j in 1:(setsize - 1)) { + for (j in 1:(set_size - 1)) { condData <- cbind(condData,item_location[j + 1]) condData <- cbind(condData,item_distance[j + 1]) } colnames(condData) <- c(init_colnames, - paste0(rep(c("color_item","dist_item"),times = setsize - 1), - rep(2:(setsize),each = 2))) + paste0(rep(c("color_item","dist_item"),times = set_size - 1), + rep(2:(set_size),each = 2))) simData <- rbind(simData,condData) } @@ -182,12 +182,12 @@ model_formula <- bmf( ) ``` -Then, we can specify the model that we want to estimate. This includes specifying the name of the variable containing the dependent variable `resp_err` in our simulated data set. Additionally, we also need to provide the information of the `non_target` locations, the name of the variable coding the spatial distances of the nt_features to the target `spaDist`, and the `setsize` used in our data. The `setsize` can either be a fixed integer, if there is only one setsize in your data, or the name of the variable coding the `setsize` in your data: +Then, we can specify the model that we want to estimate. This includes specifying the name of the variable containing the dependent variable `resp_err` in our simulated data set. Additionally, we also need to provide the information of the `non_target` locations, the name of the variable coding the spatial distances of the nt_features to the target `spaDist`, and the `set_size` used in our data. The `set_size` can either be a fixed integer, if there is only one set_size in your data, or the name of the variable coding the `set_size` in your data: ```{r} model <- IMMfull(resp_err = "resp_err", nt_features = paste0("color_item",2:5), - setsize = setsize, + set_size = set_size, nt_distances = paste0("dist_item",2:5)) ``` @@ -196,7 +196,7 @@ In the above example we specified all column names for the non_targets explicite ```{r} model <- IMMfull(resp_err = "resp_err", nt_features = "color_item[2-5]", - setsize = setsize, + set_size = set_size, nt_distances = "dist_item[2-5]", regex = TRUE) ``` diff --git a/vignettes/bmm_mixture_models.Rmd b/vignettes/bmm_mixture_models.Rmd index 120564f9..e2cb56cc 100644 --- a/vignettes/bmm_mixture_models.Rmd +++ b/vignettes/bmm_mixture_models.Rmd @@ -116,7 +116,7 @@ knitr::kable(dat[dat$set_size==4,][1:6,]) where: - `id` is a unique identifier for each participant -- `setsize` is the number of items presented in the memory array +- `set_size` is the number of items presented in the memory array - `response` the participant's recollection of the target orientation in radians - `target` the feature value of the target in radians - `non_target_1` to `non_target5` are the feature values of the non-targets in radians @@ -231,7 +231,7 @@ pmem <- exp(thetat)/(exp(thetat)+1) pg <- exp(0)/(exp(thetat)+1) ``` -Our estimates for kappa over setsize are: +Our estimates for kappa over set_size are: ```{r} kappa @@ -287,7 +287,7 @@ where the black dot represents the median of the posterior distribution, the thi # Fitting the 3-parameter mixture model with `bmm` -Fitting the 3-parameter mixture model is very similar. We have an extra parameter `thetant` that represents the mixture weight for non-target responses^[because now we have three mixture weights, you will need later to calculate the probability of target responses as $p_{mem} = \frac{exp(\theta_{target})}{1+exp(\theta_{target})+exp(\theta_{nontarget})}$, the probability of non-target responses as $p_{nt} =\frac{exp(\theta_{nontarget})}{1+exp(\theta_{target})+exp(\theta_{nontarget})}$, and the probability of guessing as $p_{guess} = 1-p_{mem}-p_{nt}$]. We also need to specify the names of the non-target variables and the setsize^[When the setsize varies in an experiment, provide the name of the variable containing the setsize information. If the set size is the same for all trials, provide a number, e.g. `setsize=4`] variable in the `mixture3p` function. +Fitting the 3-parameter mixture model is very similar. We have an extra parameter `thetant` that represents the mixture weight for non-target responses^[because now we have three mixture weights, you will need later to calculate the probability of target responses as $p_{mem} = \frac{exp(\theta_{target})}{1+exp(\theta_{target})+exp(\theta_{nontarget})}$, the probability of non-target responses as $p_{nt} =\frac{exp(\theta_{nontarget})}{1+exp(\theta_{target})+exp(\theta_{nontarget})}$, and the probability of guessing as $p_{guess} = 1-p_{mem}-p_{nt}$]. We also need to specify the names of the non-target variables and the set_size^[When the set_size varies in an experiment, provide the name of the variable containing the set_size information. If the set size is the same for all trials, provide a number, e.g. `set_size=4`] variable in the `mixture3p` function. ```{r} ff <- bmf( @@ -296,7 +296,7 @@ ff <- bmf( kappa ~ 0 + set_size + (0 + set_size | id) ) -model <- mixture3p(resp_err = "error", nt_features = paste0('non_target_',1:5), setsize = 'set_size') +model <- mixture3p(resp_err = "error", nt_features = paste0('non_target_',1:5), set_size = 'set_size') ``` Then we run the model just like before: @@ -320,11 +320,11 @@ In the above example we specified all column names for the non_targets explicite ```{r} model <- mixture3p(resp_err = "error", nt_features = "non_target_[1-5]", - setsize = 'set_size', + set_size = 'set_size', regex = TRUE) model <- mixture3p(resp_err = "error", nt_features = "non_target_", - setsize = 'set_size', + set_size = 'set_size', regex = TRUE) ``` From 68c80a3fb72f18e8faa11cc60872d3e9bbe95bda Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 17:11:15 +0100 Subject: [PATCH 09/13] rename imm distribution functions to lowercase --- NAMESPACE | 8 ++++---- NEWS.md | 9 ++++++--- R/distributions.R | 26 +++++++++++++------------- README.Rmd | 8 ++++---- README.md | 8 ++++---- man/IMM.Rd | 6 ++---- man/IMMdist.Rd | 24 ++++++++++++------------ man/ZhangLuck_2008.Rd | 2 +- tests/internal/bmmexamples.R | 2 +- tests/testthat/test-distributions.R | 8 ++++---- tests/testthat/test-fit_model.R | 4 ++-- vignettes/bmm_imm.Rmd | 2 +- 12 files changed, 54 insertions(+), 53 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 0de2043c..e5cc6b36 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -78,8 +78,8 @@ export(calc_error_relative_to_nontargets) export(check_data) export(configure_model) export(configure_prior) -export(dIMM) export(deg2rad) +export(dimm) export(dmixture2p) export(dmixture3p) export(dsdm) @@ -88,19 +88,19 @@ export(fit_model) export(k2sd) export(mixture2p) export(mixture3p) -export(pIMM) +export(pimm) export(pmixture2p) export(pmixture3p) export(postprocess_brm) export(print_pretty_models_md) export(psdm) -export(qIMM) +export(qimm) export(qmixture2p) export(qmixture3p) export(qsdm) -export(rIMM) export(rad2deg) export(revert_postprocess_brm) +export(rimm) export(rmixture2p) export(rmixture3p) export(rsdm) diff --git a/NEWS.md b/NEWS.md index 1cd4b4b8..82e03ad7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,7 +3,6 @@ ### New features * add a custom **summary()** method for bmm models (#144) * add a global options **bmm.summary_backend** to control the backend used for the summary() method (choices are "bmm" and "brms") -* BREAKING CHANGE: remove **get_model_prior(), get_stancode() and get_standata()**. Due to [recent changes](https://github.com/paul-buerkner/brms/pull/1604) in *brms* version 2.21.0, you can now use the *brms* functions `default_prior`, `stancode` and `standata` directly with *bmm* models. * function **restructure()** now allows to apply methods introduced in newer bmm versions to bmmfit objects created by older bmm versions * you can now specify any model parameter to be a constant by using an equal sign in the `bmmformula` (#142) * you can now choose to estimate parameters that are fixed to a constant by default for all models (#145) @@ -16,10 +15,14 @@ * fix bugs with the summary() function not displaying implicit parameters (#152) and not working properly with some hierarhical designs (#173) * fix a bug in which the sort_data check occured in cases where it shouldn't (#158) +### Deprecated functions and arguments +* BREAKING CHANGE: remove **get_model_prior(), get_stancode() and get_standata()**. Due to [recent changes](https://github.com/paul-buerkner/brms/pull/1604) in *brms* version 2.21.0, you can now use the *brms* functions `default_prior`, `stancode` and `standata` directly with *bmm* models. +* the function `fit_model()` is deprecated in favor of `bmm()` (#163) and will be removed in a future version +* the argument **setsize** for the `mixture3p` and `IMM` models is now called **set_size** for consistency (#163). The old argument name is deprecated and will be removed in a future version +* the distributions functions for the imm model are renamed from dIMM, pIMM, rIMM and qIMM to dimm, pimm, rimm and qimm (#163) + ### Other changes * `bmm` now requires the latest version of `brms` (>= 2.21.0). -* the function `fit_model()` is deprecated in favor of `bmm()` (#163) -* the argument **setsize** for the `mixture3p` and `IMM` models is now called **set_size** for consistency (#163). The old argument name is deprecated and will be removed in a future version. # bmm 0.4.0 diff --git a/R/distributions.R b/R/distributions.R index 3728abe6..d2ecb0ac 100644 --- a/R/distributions.R +++ b/R/distributions.R @@ -437,10 +437,10 @@ rmixture3p <- function(n, mu=c(0,2,-1.5), kappa = 5, pMem = 0.6, pNT = 0.2) { #' Hierarchical Bayesian measurement models for continuous reproduction of #' visual features from working memory. Journal of Vision, 17(5), 11. #' -#' @return `dIMM` gives the density of the interference measurement model, -#' `pIMM` gives the cumulative distribution function of the interference -#' measurement model, `qIMM` gives the quantile function of the interference -#' measurement model, and `rIMM` gives the random generation function for the +#' @return `dimm` gives the density of the interference measurement model, +#' `pimm` gives the cumulative distribution function of the interference +#' measurement model, `qimm` gives the quantile function of the interference +#' measurement model, and `rimm` gives the random generation function for the #' interference measurement model. #' #' @export @@ -448,7 +448,7 @@ rmixture3p <- function(n, mu=c(0,2,-1.5), kappa = 5, pMem = 0.6, pNT = 0.2) { #' @examples #' # example code #' -dIMM <- function(x, mu=c(0,2,-1.5), dist = c(0,0.5,2), +dimm <- function(x, mu=c(0,2,-1.5), dist = c(0,0.5,2), c=1, a = 0.2, b = 0, s = 2, kappa=5, log = FALSE) { stopif(isTRUE(any(kappa < 0)), "kappa must be non-negative") stopif(length(mu) != length(dist), @@ -486,21 +486,21 @@ dIMM <- function(x, mu=c(0,2,-1.5), dist = c(0,0.5,2), #' @rdname IMMdist #' @export -pIMM <- function(q, mu=c(0,2,-1.5), dist = c(0,0.5,2), +pimm <- function(q, mu=c(0,2,-1.5), dist = c(0,0.5,2), c=1, a = 0.2, b = 0, s = 2, kappa=5) { .NotYetImplemented() } #' @rdname IMMdist #' @export -qIMM <- function(p, mu=c(0,2,-1.5), dist = c(0,0.5,2), +qimm <- function(p, mu=c(0,2,-1.5), dist = c(0,0.5,2), c=1, a = 0.2, b = 0, s = 2, kappa=5) { .NotYetImplemented() } #' @rdname IMMdist #' @export -rIMM <- function(n, mu=c(0,2,-1.5), dist = c(0,0.5,2), +rimm <- function(n, mu=c(0,2,-1.5), dist = c(0,0.5,2), c=1, a = 0.2, b = 0, s = 2, kappa=5) { stopif(isTRUE(any(kappa < 0)), "kappa must be non-negative") stopif(length(mu) != length(dist), @@ -508,21 +508,21 @@ rIMM <- function(n, mu=c(0,2,-1.5), dist = c(0,0.5,2), stopif(isTRUE(any(s < 0)), "s must be non-negative") stopif(isTRUE(any(dist < 0)), "all distances have to be positive.") - maxy <- dIMM(mu[1], mu, dist, c, a, b, s, kappa) + maxy <- dimm(mu[1], mu, dist, c, a, b, s, kappa) xa <- c() - .rIMM_inner <- function(n, mu, dist, c, a, b, s, kappa, xa) { + .rimm_inner <- function(n, mu, dist, c, a, b, s, kappa, xa) { x <- stats::runif(n, -pi, pi) y <- stats::runif(n, 0, 1) * maxy - accept <- y < dIMM(x, mu, dist, c, a, b, s, kappa) + accept <- y < dimm(x, mu, dist, c, a, b, s, kappa) xa <- c(xa, x[accept]) if (length(xa) < n) { - return(.rIMM_inner(n, mu, dist, c, a, b, s, kappa, xa)) + return(.rimm_inner(n, mu, dist, c, a, b, s, kappa, xa)) } xa[1:n] } - .rIMM_inner(n, mu, dist, c ,a ,b ,s ,kappa , xa) + .rimm_inner(n, mu, dist, c ,a ,b ,s ,kappa , xa) } diff --git a/README.Rmd b/README.Rmd index 94c7c270..4eaf38f0 100644 --- a/README.Rmd +++ b/README.Rmd @@ -216,9 +216,9 @@ density and random generation function for all implemented models. These function provide an easy way to see what a model predicts for data given a certain set of parameters. For example you can easily plot the probability density function of the data for the Interference Measurement model using the -`dIMM` function. In similar fashion the random generation function included for +`dimm` function. In similar fashion the random generation function included for each model, generates random data based on a set of data generating parameters. -For the IMM, you can use `rIMM` to generate data given a set of parameters. +For the IMM, you can use `rimm` to generate data given a set of parameters. Plotting the random data against the density illustrates that the data follows the theoretically implied density. @@ -226,7 +226,7 @@ the theoretically implied density. library(ggplot2) simData <- data.frame( - x = bmm::rIMM(n = 500, + x = bmm::rimm(n = 500, mu = c(0,-1.5,2.5,1), dist = c(0, 2, 0.3, 1), c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) @@ -234,7 +234,7 @@ simData <- data.frame( ggplot(data = simData, aes(x = x)) + geom_histogram(aes(y = after_stat(density))) + - geom_function(fun = bmm::dIMM, + geom_function(fun = bmm::dimm, args = list(mu = c(0,-1.5,2.5,1), dist = c(0, 2, 0.3, 1), c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10)) + diff --git a/README.md b/README.md index a83dfb94..ece0025b 100644 --- a/README.md +++ b/README.md @@ -236,10 +236,10 @@ implemented models. These function provide an easy way to see what a model predicts for data given a certain set of parameters. For example you can easily plot the probability density function of the data for the Interference -Measurement model using the `dIMM` function. In similar fashion the +Measurement model using the `dimm` function. In similar fashion the random generation function included for each model, generates random data based on a set of data generating parameters. For the IMM, you can -use `rIMM` to generate data given a set of parameters. Plotting the +use `rimm` to generate data given a set of parameters. Plotting the random data against the density illustrates that the data follows the theoretically implied density. @@ -247,7 +247,7 @@ theoretically implied density. library(ggplot2) simData <- data.frame( - x = bmm::rIMM(n = 500, + x = bmm::rimm(n = 500, mu = c(0,-1.5,2.5,1), dist = c(0, 2, 0.3, 1), c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10) @@ -255,7 +255,7 @@ simData <- data.frame( ggplot(data = simData, aes(x = x)) + geom_histogram(aes(y = after_stat(density))) + - geom_function(fun = bmm::dIMM, + geom_function(fun = bmm::dimm, args = list(mu = c(0,-1.5,2.5,1), dist = c(0, 2, 0.3, 1), c = 1.5, a = 0.3, b = 0, s = 2, kappa = 10)) + diff --git a/man/IMM.Rd b/man/IMM.Rd index b9e91662..516db3f2 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -271,7 +271,6 @@ fit <- bmm(formula = ff, data = data, model = model1, parallel = T, - iter = 500, backend = 'cmdstanr') # alternatively specify the IMM model with a regular expression to match non-target features @@ -286,9 +285,8 @@ model2 <- IMMfull(resp_err = "dev_rad", fit <- bmm(formula = ff, data = data, model = model2, - parallel=T, - iter = 500, - backend='cmdstanr') + parallel = T, + backend = 'cmdstanr') } } \keyword{bmmmodel} diff --git a/man/IMMdist.Rd b/man/IMMdist.Rd index 6091f4a6..684e55a4 100644 --- a/man/IMMdist.Rd +++ b/man/IMMdist.Rd @@ -2,13 +2,13 @@ % Please edit documentation in R/distributions.R \name{IMMdist} \alias{IMMdist} -\alias{dIMM} -\alias{pIMM} -\alias{qIMM} -\alias{rIMM} +\alias{dimm} +\alias{pimm} +\alias{qimm} +\alias{rimm} \title{The Interference Measurement Model (IMM)} \usage{ -dIMM( +dimm( x, mu = c(0, 2, -1.5), dist = c(0, 0.5, 2), @@ -20,7 +20,7 @@ dIMM( log = FALSE ) -pIMM( +pimm( q, mu = c(0, 2, -1.5), dist = c(0, 0.5, 2), @@ -31,7 +31,7 @@ pIMM( kappa = 5 ) -qIMM( +qimm( p, mu = c(0, 2, -1.5), dist = c(0, 0.5, 2), @@ -42,7 +42,7 @@ qIMM( kappa = 5 ) -rIMM( +rimm( n, mu = c(0, 2, -1.5), dist = c(0, 0.5, 2), @@ -79,10 +79,10 @@ rIMM( \item{n}{Number of observations to generate data for} } \value{ -\code{dIMM} gives the density of the interference measurement model, -\code{pIMM} gives the cumulative distribution function of the interference -measurement model, \code{qIMM} gives the quantile function of the interference -measurement model, and \code{rIMM} gives the random generation function for the +\code{dimm} gives the density of the interference measurement model, +\code{pimm} gives the cumulative distribution function of the interference +measurement model, \code{qimm} gives the quantile function of the interference +measurement model, and \code{rimm} gives the random generation function for the interference measurement model. } \description{ diff --git a/man/ZhangLuck_2008.Rd b/man/ZhangLuck_2008.Rd index 78e0fb2d..29322221 100644 --- a/man/ZhangLuck_2008.Rd +++ b/man/ZhangLuck_2008.Rd @@ -11,7 +11,7 @@ A data frame with 4,000 rows and 9 columns: \describe{ \item{subID}{Integer uniquely identifying different subjects} \item{trial}{Trial identifyier} -\item{set_size}{The set_size of the data in this row} +\item{setsize}{The set_size of the data in this row} \item{response_error}{The response error, that is the difference between the response given and the target color in radians.} \item{col_lure1, col_Lure2, col_Lure3, col_Lure4, col_Lure5}{Color value of the lure items coded relative to the target color.} diff --git a/tests/internal/bmmexamples.R b/tests/internal/bmmexamples.R index 3c1b4042..b00be908 100644 --- a/tests/internal/bmmexamples.R +++ b/tests/internal/bmmexamples.R @@ -80,7 +80,7 @@ generate_bmm_examples <- function(seed = 123) { for (i in 1:length(Cs)) { item_location <- c(0, runif(set_size - 1, -pi,pi)) item_distance <- c(0, runif(set_size - 1, min = 0.1, max = pi)) - genData <- rIMM(n = nTrials, + genData <- rimm(n = nTrials, mu = item_location, dist = item_distance, c = Cs[i], a = As[i], diff --git a/tests/testthat/test-distributions.R b/tests/testthat/test-distributions.R index 9d3129e3..675e59f4 100644 --- a/tests/testthat/test-distributions.R +++ b/tests/testthat/test-distributions.R @@ -73,8 +73,8 @@ test_that("dmixture3p integrates to 1", { )$value, 1) }) -test_that("dIMM integrates to 1", { - expect_equal(integrate(dIMM, -pi, pi, +test_that("dimm integrates to 1", { + expect_equal(integrate(dimm, -pi, pi, mu = runif(3, min = -pi, pi), dist = c(0, runif(2, min = 0.1, max = pi)), kappa = runif(1, min = 1, max = 20), @@ -104,8 +104,8 @@ test_that("rmixture3p returns values between -pi and pi", { expect_true(all(res >= -pi) && all(res <= pi)) }) -test_that("rIMM returns values between -pi and pi", { - res <- rIMM(500, +test_that("rimm returns values between -pi and pi", { + res <- rimm(500, mu = runif(3, min = -pi, pi), dist = c(0, runif(2, min = 0.1, max = pi)), kappa = runif(1, min = 1, max = 20), diff --git a/tests/testthat/test-fit_model.R b/tests/testthat/test-fit_model.R index c5944a3e..ee4adb16 100644 --- a/tests/testthat/test-fit_model.R +++ b/tests/testthat/test-fit_model.R @@ -2,7 +2,7 @@ test_that("Available mock models run without errors", { withr::local_options("bmm.silent" = 2) skip_on_cran() dat <- data.frame( - resp_err = rIMM(n = 5), + resp_err = rimm(n = 5), Item2_rel = 2, Item3_rel = -1.5, spaD2 = 0.5, @@ -55,7 +55,7 @@ test_that("Available models produce expected errors", { withr::local_options("bmm.silent" = 2) skip_on_cran() dat <- data.frame( - resp_err = rIMM(n = 5), + resp_err = rimm(n = 5), Item2_rel = 2, Item3_rel = -1.5, spaD2 = -0.5, diff --git a/vignettes/bmm_imm.Rmd b/vignettes/bmm_imm.Rmd index 15ea7f2b..5fb4eb88 100644 --- a/vignettes/bmm_imm.Rmd +++ b/vignettes/bmm_imm.Rmd @@ -135,7 +135,7 @@ for (i in 1:length(Cs)) { item_distance <- c(0, runif(set_size - 1, min = 0.1, max = pi)) # simulate data for each condition - genData <- rIMM(n = nTrials, + genData <- rimm(n = nTrials, mu = item_location, dist = item_distance, c = Cs[i], a = As[i], From 0ed2608a6e06bdf7d09a04e261445ab0e0c9d2df Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 17:22:02 +0100 Subject: [PATCH 10/13] change resp_err to resp_error --- .dev/bmm_default_priors.Rmd | 4 +-- .dev/bmm_default_priors.md | 4 +-- R/bmm.R | 2 +- R/bmm_model_IMM.R | 30 +++++++++++------------ R/bmm_model_mixture2p.R | 12 ++++----- R/bmm_model_mixture3p.R | 14 +++++------ R/bmm_model_sdmSimple.R | 12 ++++----- R/bmmformula.R | 2 +- R/helpers-data.R | 2 +- R/helpers-model.R | 2 +- R/helpers-prior.R | 2 +- R/restructure.R | 2 +- README.Rmd | 2 +- README.md | 14 +++++------ man/IMM.Rd | 12 ++++----- man/SDM.Rd | 6 ++--- man/bmf2bf.Rd | 2 +- man/bmm.Rd | 14 +++++------ man/default_prior.bmmformula.Rd | 2 +- man/mixture2p.Rd | 6 ++--- man/mixture3p.Rd | 8 +++--- man/stancode.bmmformula.Rd | 2 +- man/standata.bmmformula.Rd | 2 +- tests/internal/bmmexamples.R | 6 ++--- tests/internal/internal-model-tests.Rmd | 10 ++++---- tests/internal/internal-model-tests.md | 10 ++++---- tests/testthat/test-bmm_model_IMM.R | 24 +++++++++--------- tests/testthat/test-bmm_model_mixture3p.R | 4 +-- tests/testthat/test-fit_model.R | 20 +++++++-------- tests/testthat/test-helpers-data.R | 24 +++++++++--------- tests/testthat/test-helpers-model.R | 4 +-- tests/testthat/test-helpers-postprocess.R | 2 +- tests/testthat/test-helpers-prior.R | 2 +- tests/testthat/test-update.R | 2 +- tests/testthat/test-utils.R | 6 ++--- vignettes/bmm_bmmformula.Rmd | 10 ++++---- vignettes/bmm_extract_info.Rmd | 12 ++++----- vignettes/bmm_imm.Rmd | 8 +++--- vignettes/bmm_mixture_models.Rmd | 8 +++--- vignettes/bmm_sdm_simple.Rmd | 2 +- 40 files changed, 156 insertions(+), 156 deletions(-) diff --git a/.dev/bmm_default_priors.Rmd b/.dev/bmm_default_priors.Rmd index 482ffd43..9447f43c 100644 --- a/.dev/bmm_default_priors.Rmd +++ b/.dev/bmm_default_priors.Rmd @@ -87,7 +87,7 @@ options(list(bmm.default_priors = FALSE)) All model parameters are `nlpar` so they get class `b` with coef `Intercept` ```{r} -model <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), setsize='set_size') +model <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), set_size='set_size') formula <- bmf(kappa ~ 1, thetat ~ 1, thetant ~ 1) default_prior(formula, dat, model) ``` @@ -252,7 +252,7 @@ compare_priors <- function(formula,dat,model) { ```{r} -model3p <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), setsize='set_size') +model3p <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), set_size='set_size') ```
Click to expand diff --git a/.dev/bmm_default_priors.md b/.dev/bmm_default_priors.md index a16fc5ee..eb3ea2c3 100644 --- a/.dev/bmm_default_priors.md +++ b/.dev/bmm_default_priors.md @@ -175,7 +175,7 @@ All model parameters are `nlpar` so they get class `b` with coef `Intercept` ``` r -model <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), setsize='set_size') +model <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), set_size='set_size') formula <- bmf(kappa ~ 1, thetat ~ 1, thetant ~ 1) get_model_prior(formula, dat, model) ``` @@ -661,7 +661,7 @@ compare_priors <- function(formula,dat,model) { ``` ``` r -model3p <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), setsize='set_size') +model3p <- mixture3p('dev_rad', nt_features = paste0('col_nt',1:7), set_size='set_size') ```
diff --git a/R/bmm.R b/R/bmm.R index 54c8b778..bfce3885 100644 --- a/R/bmm.R +++ b/R/bmm.R @@ -84,7 +84,7 @@ #' # fit the model #' fit <- bmm(formula = ff, #' data = dat, -#' model = sdmSimple(resp_err = "y"), +#' model = sdmSimple(resp_error = "y"), #' parallel=T, #' iter = 500, #' backend = 'cmdstanr') diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index e27e9a88..7aac0a40 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -3,11 +3,11 @@ #############################################################################! .model_IMMabc <- - function(resp_err = NULL, nt_features = NULL, set_size = NULL, regex = FALSE, + function(resp_error = NULL, nt_features = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(nt_features, set_size), domain = "Visual working memory", task = "Continuous reproduction", @@ -58,11 +58,11 @@ .model_IMMbsc <- - function(resp_err = NULL, nt_features = NULL, nt_distances = NULL, + function(resp_error = NULL, nt_features = NULL, nt_distances = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(nt_features, nt_distances, set_size), domain = "Visual working memory", task = "Continuous reproduction", @@ -112,11 +112,11 @@ } .model_IMMfull <- - function(resp_err = NULL, nt_features = NULL, nt_distances = NULL, + function(resp_error = NULL, nt_features = NULL, nt_distances = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(nt_features, nt_distances, set_size), domain = "Visual working memory", task = "Continuous reproduction", @@ -186,7 +186,7 @@ #' #' - b = "Background activation (internally fixed to 0)" #' -#' @param resp_err The name of the variable in the provided dataset containing +#' @param resp_error The name of the variable in the provided dataset containing #' the response error. The response Error should code the response relative to #' the to-be-recalled target in radians. You can transform the response error #' in degrees to radian using the `deg2rad` function. @@ -224,7 +224,7 @@ #' ) #' #' # specify the full IMM model with explicit column names for non-target features and distances -#' model1 <- IMMfull(resp_err = "dev_rad", +#' model1 <- IMMfull(resp_error = "dev_rad", #' nt_features = paste0('col_nt', 1:7), #' nt_distances = paste0('dist_nt', 1:7), #' set_size = 'set_size') @@ -238,7 +238,7 @@ #' #' # alternatively specify the IMM model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise -#' model2 <- IMMfull(resp_err = "dev_rad", +#' model2 <- IMMfull(resp_error = "dev_rad", #' nt_features = 'col_nt', #' nt_distances = 'dist_nt', #' set_size = 'set_size', @@ -252,7 +252,7 @@ #' backend = 'cmdstanr') #'} #' @export -IMMfull <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, +IMMfull <- function(resp_error, nt_features, nt_distances, set_size, regex = FALSE, links = NULL, ...) { dots <- list(...) @@ -261,7 +261,7 @@ IMMfull <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") } stop_missing_args() - .model_IMMfull(resp_err = resp_err, nt_features = nt_features, + .model_IMMfull(resp_error = resp_error, nt_features = nt_features, nt_distances = nt_distances, set_size = set_size, regex = regex, links = links, ...) } @@ -269,7 +269,7 @@ IMMfull <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE #' @rdname IMM #' @keywords bmmmodel #' @export -IMMbsc <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, +IMMbsc <- function(resp_error, nt_features, nt_distances, set_size, regex = FALSE, links = NULL, ...) { dots <- list(...) if ("setsize" %in% names(dots)) { @@ -277,7 +277,7 @@ IMMbsc <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") } stop_missing_args() - .model_IMMbsc(resp_err = resp_err, nt_features = nt_features, + .model_IMMbsc(resp_error = resp_error, nt_features = nt_features, nt_distances = nt_distances, set_size = set_size, regex = regex, links = links, ...) } @@ -285,7 +285,7 @@ IMMbsc <- function(resp_err, nt_features, nt_distances, set_size, regex = FALSE, #' @rdname IMM #' @keywords bmmmodel #' @export -IMMabc <- function(resp_err, nt_features, set_size, regex = FALSE, links = NULL, +IMMabc <- function(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) { dots <- list(...) if ("setsize" %in% names(dots)) { @@ -293,7 +293,7 @@ IMMabc <- function(resp_err, nt_features, set_size, regex = FALSE, links = NULL, warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") } stop_missing_args() - .model_IMMabc(resp_err = resp_err, nt_features = nt_features, + .model_IMMabc(resp_error = resp_error, nt_features = nt_features, set_size = set_size, regex = regex, links = links, ...) } diff --git a/R/bmm_model_mixture2p.R b/R/bmm_model_mixture2p.R index 4457c059..d409efd4 100644 --- a/R/bmm_model_mixture2p.R +++ b/R/bmm_model_mixture2p.R @@ -2,12 +2,12 @@ # MODELS #### #############################################################################! -.model_mixture2p <- function(resp_err = NULL, +.model_mixture2p <- function(resp_error = NULL, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(), domain = "Visual working memory", task = "Continuous reproduction", @@ -52,7 +52,7 @@ #' @title `r .model_mixture2p()$name` #' @details `r model_info(.model_mixture2p())` -#' @param resp_err The name of the variable in the provided dataset containing +#' @param resp_error The name of the variable in the provided dataset containing #' the response error. The response Error should code the response relative to #' the to-be-recalled target in radians. You can transform the response error #' in degrees to radian using the `deg2rad` function. @@ -70,7 +70,7 @@ #' ff <- bmmformula(kappa ~ 1, #' thetat ~ 1) #' -#' model <- mixture2p(resp_err = "y") +#' model <- mixture2p(resp_error = "y") #' #' # fit the model #' fit <- bmm(formula = ff, @@ -81,11 +81,11 @@ #' backend='cmdstanr') #' } #' @export -mixture2p <- function(resp_err, +mixture2p <- function(resp_error, links = NULL, ...) { stop_missing_args() - .model_mixture2p(resp_err = resp_err, links = links, ...) + .model_mixture2p(resp_error = resp_error, links = links, ...) } #############################################################################! diff --git a/R/bmm_model_mixture3p.R b/R/bmm_model_mixture3p.R index 793fa09c..af2a2524 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/bmm_model_mixture3p.R @@ -2,12 +2,12 @@ # MODELS #### #############################################################################! -.model_mixture3p <- function(resp_err = NULL, nt_features = NULL, set_size = NULL, +.model_mixture3p <- function(resp_error = NULL, nt_features = NULL, set_size = NULL, regex = FALSE, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(nt_features, set_size), domain = "Visual working memory", task = "Continuous reproduction", @@ -61,7 +61,7 @@ # user facing alias #' @title `r .model_mixture3p()$name` #' @details `r model_info(.model_mixture3p())` -#' @param resp_err The name of the variable in the dataset containing +#' @param resp_error The name of the variable in the dataset containing #' the response error. The response error should code the response relative to #' the to-be-recalled target in radians. You can transform the response error #' in degrees to radians using the `deg2rad` function. @@ -99,7 +99,7 @@ #' ) #' #' # specify the 3-parameter model with explicit column names for non-target features -#' model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) +#' model1 <- mixture3p(resp_error = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) #' #' # fit the model #' fit <- bmm(formula = ff, @@ -111,7 +111,7 @@ #' #' # alternatively specify the 3-parameter model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise -#' model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) +#' model2 <- mixture3p(resp_error = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) #' #' # fit the model #' fit <- bmm(formula = ff, @@ -121,7 +121,7 @@ #' iter = 500, #' backend='cmdstanr') #' } -mixture3p <- function(resp_err, nt_features, set_size, regex = FALSE, +mixture3p <- function(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) { dots <- list(...) if ("setsize" %in% names(dots)) { @@ -129,7 +129,7 @@ mixture3p <- function(resp_err, nt_features, set_size, regex = FALSE, warning("The argument 'setsize' is deprecated. Please use 'set_size' instead.") } stop_missing_args() - .model_mixture3p(resp_err = resp_err, nt_features = nt_features, + .model_mixture3p(resp_error = resp_error, nt_features = nt_features, set_size = set_size, regex = regex, links = links, ...) } diff --git a/R/bmm_model_sdmSimple.R b/R/bmm_model_sdmSimple.R index 33d46ae5..b4baa60f 100644 --- a/R/bmm_model_sdmSimple.R +++ b/R/bmm_model_sdmSimple.R @@ -2,10 +2,10 @@ # MODELS #### #############################################################################! -.model_sdmSimple <- function(resp_err = NULL, links = NULL, ...) { +.model_sdmSimple <- function(resp_error = NULL, links = NULL, ...) { out <- structure( list( - resp_vars = nlist(resp_err), + resp_vars = nlist(resp_error), other_vars = nlist(), domain = 'Visual working memory', task = 'Continuous reproduction', @@ -52,7 +52,7 @@ #' @details see `vignette("sdm-simple")` for a detailed description of the model #' and how to use it. #' `r model_info(.model_sdmSimple())` -#' @param resp_err The name of the variable in the dataset containing the +#' @param resp_error The name of the variable in the dataset containing the #' response error. The response error should code the response relative to the #' to-be-recalled target in radians. You can transform the response error in #' degrees to radians using the `deg2rad` function. @@ -80,7 +80,7 @@ #' # specify the model #' fit <- bmm(formula = ff, #' data = dat, -#' model = sdmSimple(resp_err = 'y'), +#' model = sdmSimple(resp_error = 'y'), #' prior = prior, #' parallel=T, #' iter=2000, @@ -93,9 +93,9 @@ #' lines(x, dsdm(x, mu=0, c=coef['c_Intercept'], #' kappa=coef['kappa_Intercept']), col='red') #' } -sdmSimple <- function(resp_err, links = NULL, ...) { +sdmSimple <- function(resp_error, links = NULL, ...) { stop_missing_args() - .model_sdmSimple(resp_err = resp_err, links = links, ...) + .model_sdmSimple(resp_error = resp_error, links = links, ...) } #############################################################################! diff --git a/R/bmmformula.R b/R/bmmformula.R index bcb582ab..af23ff75 100644 --- a/R/bmmformula.R +++ b/R/bmmformula.R @@ -222,7 +222,7 @@ check_formula.nontargets <- function(model, data, formula) { #' formulas for the specified `bmmmodel` #' @keywords internal, developer #' @examples -#' model <- mixture2p(resp_err = "error") +#' model <- mixture2p(resp_error = "error") #' #' formula <- bmmformula( #' thetat ~ 0 + set_size + (0 + set_size | id), diff --git a/R/helpers-data.R b/R/helpers-data.R index acf4f7ed..fcd234e6 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -238,7 +238,7 @@ rad2deg <- function(rad){ #' @examples #' sdata1 <- standata(bmf(c ~ 1, kappa ~ 1), #' data = OberauerLin_2017, -#' model = sdmSimple(resp_err = "dev_rad")) +#' model = sdmSimple(resp_error = "dev_rad")) #' str(sdata1) #' @importFrom brms standata #' @export diff --git a/R/helpers-model.R b/R/helpers-model.R index 59bb385b..c93d66dc 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -629,7 +629,7 @@ use_model_template <- function(model_name, #' @examples #' scode1 <- stancode(bmf(c ~ 1, kappa ~ 1), #' data = OberauerLin_2017, -#' model = sdmSimple(resp_err = "dev_rad")) +#' model = sdmSimple(resp_error = "dev_rad")) #' cat(scode1) #' @importFrom brms stancode #' @export diff --git a/R/helpers-prior.R b/R/helpers-prior.R index e6d71df5..99ef4b0d 100644 --- a/R/helpers-prior.R +++ b/R/helpers-prior.R @@ -29,7 +29,7 @@ #' @examples #' default_prior(bmf(c ~ 1, kappa ~ 1), #' data = OberauerLin_2017, -#' model = sdmSimple(resp_err = 'dev_rad')) +#' model = sdmSimple(resp_error = 'dev_rad')) #' @importFrom brms default_prior #' @export default_prior.bmmformula <- function(object, data, model, formula = object, ...) { diff --git a/R/restructure.R b/R/restructure.R index 67ff92ae..22203776 100644 --- a/R/restructure.R +++ b/R/restructure.R @@ -95,7 +95,7 @@ add_bmm_info <- function(x) { names(pforms) <- NULL user_formula <- brms::do_call("bmf", pforms) model = env$model - model$resp_vars <- list(resp_err = env$formula$resp) + model$resp_vars <- list(resp_error = env$formula$resp) model$other_vars <- list() if (inherits(model, 'sdmSimple')) { model$info$parameters$mu <- glue('Location parameter of the SDM distribution \\ diff --git a/README.Rmd b/README.Rmd index 4eaf38f0..c0225344 100644 --- a/README.Rmd +++ b/README.Rmd @@ -181,7 +181,7 @@ formula <- bmmformula(c ~ 0 + set_size, s ~ 0 + set_size, kappa ~ 0 + set_size) -model <- IMMfull(resp_err = "dev_rad", +model <- IMMfull(resp_error = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") diff --git a/README.md b/README.md index ece0025b..8a0b02c8 100644 --- a/README.md +++ b/README.md @@ -67,12 +67,12 @@ view the latest list of supported models by running: bmm::supported_models() #> The following models are supported: #> -#> - IMMabc(resp_err, nt_features, set_size, regex, links) -#> - IMMbsc(resp_err, nt_features, nt_distances, set_size, regex, links) -#> - IMMfull(resp_err, nt_features, nt_distances, set_size, regex, links) -#> - mixture2p(resp_err, links) -#> - mixture3p(resp_err, nt_features, set_size, regex, links) -#> - sdmSimple(resp_err, links) +#> - IMMabc(resp_error, nt_features, set_size, regex, links) +#> - IMMbsc(resp_error, nt_features, nt_distances, set_size, regex, links) +#> - IMMfull(resp_error, nt_features, nt_distances, set_size, regex, links) +#> - mixture2p(resp_error, links) +#> - mixture3p(resp_error, nt_features, set_size, regex, links) +#> - sdmSimple(resp_error, links) #> #> Type ?modelname to get information about a specific model, e.g. ?IMMfull ``` @@ -199,7 +199,7 @@ formula <- bmmformula(c ~ 0 + set_size, s ~ 0 + set_size, kappa ~ 0 + set_size) -model <- IMMfull(resp_err = "dev_rad", +model <- IMMfull(resp_error = "dev_rad", nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") diff --git a/man/IMM.Rd b/man/IMM.Rd index 516db3f2..9c599601 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -8,7 +8,7 @@ \title{Interference measurement model by Oberauer and Lin (2017).} \usage{ IMMfull( - resp_err, + resp_error, nt_features, nt_distances, set_size, @@ -18,7 +18,7 @@ IMMfull( ) IMMbsc( - resp_err, + resp_error, nt_features, nt_distances, set_size, @@ -27,10 +27,10 @@ IMMbsc( ... ) -IMMabc(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) +IMMabc(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) } \arguments{ -\item{resp_err}{The name of the variable in the provided dataset containing +\item{resp_error}{The name of the variable in the provided dataset containing the response error. The response Error should code the response relative to the to-be-recalled target in radians. You can transform the response error in degrees to radian using the \code{deg2rad} function.} @@ -261,7 +261,7 @@ ff <- bmmformula( ) # specify the full IMM model with explicit column names for non-target features and distances -model1 <- IMMfull(resp_err = "dev_rad", +model1 <- IMMfull(resp_error = "dev_rad", nt_features = paste0('col_nt', 1:7), nt_distances = paste0('dist_nt', 1:7), set_size = 'set_size') @@ -275,7 +275,7 @@ fit <- bmm(formula = ff, # alternatively specify the IMM model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise -model2 <- IMMfull(resp_err = "dev_rad", +model2 <- IMMfull(resp_error = "dev_rad", nt_features = 'col_nt', nt_distances = 'dist_nt', set_size = 'set_size', diff --git a/man/SDM.Rd b/man/SDM.Rd index d5a99183..1f09a74d 100644 --- a/man/SDM.Rd +++ b/man/SDM.Rd @@ -5,10 +5,10 @@ \alias{sdmSimple} \title{Signal Discrimination Model (SDM) by Oberauer (2023)} \usage{ -sdmSimple(resp_err, links = NULL, ...) +sdmSimple(resp_error, links = NULL, ...) } \arguments{ -\item{resp_err}{The name of the variable in the dataset containing the +\item{resp_error}{The name of the variable in the dataset containing the response error. The response error should code the response relative to the to-be-recalled target in radians. You can transform the response error in degrees to radians using the \code{deg2rad} function.} @@ -91,7 +91,7 @@ prior <- prior(normal(1,2), class='Intercept', dpar='c')+ # specify the model fit <- bmm(formula = ff, data = dat, - model = sdmSimple(resp_err = 'y'), + model = sdmSimple(resp_error = 'y'), prior = prior, parallel=T, iter=2000, diff --git a/man/bmf2bf.Rd b/man/bmf2bf.Rd index 147f5852..e05bbc48 100644 --- a/man/bmf2bf.Rd +++ b/man/bmf2bf.Rd @@ -21,7 +21,7 @@ Called by \code{\link[=configure_model]{configure_model()}} inside \code{\link[= appropriate bmf2bf.\* methods based on the classes defined in the model_\* function. } \examples{ - model <- mixture2p(resp_err = "error") + model <- mixture2p(resp_error = "error") formula <- bmmformula( thetat ~ 0 + set_size + (0 + set_size | id), diff --git a/man/bmm.Rd b/man/bmm.Rd index f736b3dd..377b94a0 100644 --- a/man/bmm.Rd +++ b/man/bmm.Rd @@ -90,12 +90,12 @@ backend interface to Stan. \section{Supported Models}{ The following models are supported: \itemize{ -\item IMMabc(resp_err, nt_features, set_size, regex, links) -\item IMMbsc(resp_err, nt_features, nt_distances, set_size, regex, links) -\item IMMfull(resp_err, nt_features, nt_distances, set_size, regex, links) -\item mixture2p(resp_err, links) -\item mixture3p(resp_err, nt_features, set_size, regex, links) -\item sdmSimple(resp_err, links) +\item IMMabc(resp_error, nt_features, set_size, regex, links) +\item IMMbsc(resp_error, nt_features, nt_distances, set_size, regex, links) +\item IMMfull(resp_error, nt_features, nt_distances, set_size, regex, links) +\item mixture2p(resp_error, links) +\item mixture3p(resp_error, nt_features, set_size, regex, links) +\item sdmSimple(resp_error, links) } Type ?modelname to get information about a specific model, e.g. ?IMMfull @@ -127,7 +127,7 @@ ff <- bmmformula(c ~ 1, kappa ~ 1) # fit the model fit <- bmm(formula = ff, data = dat, - model = sdmSimple(resp_err = "y"), + model = sdmSimple(resp_error = "y"), parallel=T, iter = 500, backend = 'cmdstanr') diff --git a/man/default_prior.bmmformula.Rd b/man/default_prior.bmmformula.Rd index 99e20e10..6208781c 100644 --- a/man/default_prior.bmmformula.Rd +++ b/man/default_prior.bmmformula.Rd @@ -46,7 +46,7 @@ priors in \code{brms}, as we use domain knowledge to specify the priors. \examples{ default_prior(bmf(c ~ 1, kappa ~ 1), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) } \seealso{ \code{\link[=supported_models]{supported_models()}}, \code{\link[brms:default_prior]{brms::default_prior()}} diff --git a/man/mixture2p.Rd b/man/mixture2p.Rd index 17a2f0a6..0f87e7aa 100644 --- a/man/mixture2p.Rd +++ b/man/mixture2p.Rd @@ -4,10 +4,10 @@ \alias{mixture2p} \title{Two-parameter mixture model by Zhang and Luck (2008).} \usage{ -mixture2p(resp_err, links = NULL, ...) +mixture2p(resp_error, links = NULL, ...) } \arguments{ -\item{resp_err}{The name of the variable in the provided dataset containing +\item{resp_error}{The name of the variable in the provided dataset containing the response error. The response Error should code the response relative to the to-be-recalled target in radians. You can transform the response error in degrees to radian using the \code{deg2rad} function.} @@ -79,7 +79,7 @@ dat <- data.frame(y = rmixture2p(n=2000)) ff <- bmmformula(kappa ~ 1, thetat ~ 1) -model <- mixture2p(resp_err = "y") +model <- mixture2p(resp_error = "y") # fit the model fit <- bmm(formula = ff, diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index b357df83..67c63ad1 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -4,10 +4,10 @@ \alias{mixture3p} \title{Three-parameter mixture model by Bays et al (2009).} \usage{ -mixture3p(resp_err, nt_features, set_size, regex = FALSE, links = NULL, ...) +mixture3p(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) } \arguments{ -\item{resp_err}{The name of the variable in the dataset containing +\item{resp_error}{The name of the variable in the dataset containing the response error. The response error should code the response relative to the to-be-recalled target in radians. You can transform the response error in degrees to radians using the \code{deg2rad} function.} @@ -111,7 +111,7 @@ ff <- bmmformula( ) # specify the 3-parameter model with explicit column names for non-target features -model1 <- mixture3p(resp_err = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) +model1 <- mixture3p(resp_error = "y", nt_features = paste0('nt',1:3,'_loc'), set_size = 4) # fit the model fit <- bmm(formula = ff, @@ -123,7 +123,7 @@ fit <- bmm(formula = ff, # alternatively specify the 3-parameter model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise -model2 <- mixture3p(resp_err = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) +model2 <- mixture3p(resp_error = "y", nt_features = "nt.*_loc", set_size = 4, regex = TRUE) # fit the model fit <- bmm(formula = ff, diff --git a/man/stancode.bmmformula.Rd b/man/stancode.bmmformula.Rd index 6a7beec0..8b7ce11c 100644 --- a/man/stancode.bmmformula.Rd +++ b/man/stancode.bmmformula.Rd @@ -39,7 +39,7 @@ this function will return the combined stan code generated by \code{bmm} and \examples{ scode1 <- stancode(bmf(c ~ 1, kappa ~ 1), data = OberauerLin_2017, - model = sdmSimple(resp_err = "dev_rad")) + model = sdmSimple(resp_error = "dev_rad")) cat(scode1) } \seealso{ diff --git a/man/standata.bmmformula.Rd b/man/standata.bmmformula.Rd index ef49ad76..6e3d9a9a 100644 --- a/man/standata.bmmformula.Rd +++ b/man/standata.bmmformula.Rd @@ -39,7 +39,7 @@ this function will return the combined stan data generated by \code{bmm} and \examples{ sdata1 <- standata(bmf(c ~ 1, kappa ~ 1), data = OberauerLin_2017, - model = sdmSimple(resp_err = "dev_rad")) + model = sdmSimple(resp_error = "dev_rad")) str(sdata1) } \seealso{ diff --git a/tests/internal/bmmexamples.R b/tests/internal/bmmexamples.R index b00be908..6a873533 100644 --- a/tests/internal/bmmexamples.R +++ b/tests/internal/bmmexamples.R @@ -54,7 +54,7 @@ generate_bmm_examples <- function(seed = 123) { set_size = as.factor(set_size)) formula <- bmf(thetat ~ 0 + set_size + (0 + set_size || id), kappa ~ 0 + set_size + (0 + set_size || id)) - model <- mixture2p(resp_err = "error") + model <- mixture2p(resp_error = "error") bmmfit_mixture2p_vignette <- bmm( formula = formula, data = dat_preprocessed, @@ -86,7 +86,7 @@ generate_bmm_examples <- function(seed = 123) { c = Cs[i], a = As[i], b = 0, s = Ss[i], kappa = kappas[i]) condData <- data.frame( - resp_err = genData, + resp_error = genData, trialID = 1:nTrials, cond = i, color_item1 = 0, @@ -109,7 +109,7 @@ generate_bmm_examples <- function(seed = 123) { s ~ 0 + cond, kappa ~ 0 + cond ) - model <- IMMfull(resp_err = "resp_err", + model <- IMMfull(resp_error = "resp_error", nt_features = paste0("color_item",2:5), set_size = set_size, nt_distances = paste0("dist_item",2:5)) diff --git a/tests/internal/internal-model-tests.Rmd b/tests/internal/internal-model-tests.Rmd index 0d3f6655..50801e92 100644 --- a/tests/internal/internal-model-tests.Rmd +++ b/tests/internal/internal-model-tests.Rmd @@ -153,7 +153,7 @@ formula <- bmf(thetat ~ 0 + SetSize, thetant ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- mixture3p(resp_err = 'dev_rad', +model <- mixture3p(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") @@ -216,7 +216,7 @@ data <- ref_fits$mixture2p$data formula <- bmf(thetat ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- mixture2p(resp_err = 'dev_rad') +model <- mixture2p(resp_error = 'dev_rad') fit$mixture2p <- fit_model(formula, data, model, parallel = TRUE, @@ -279,7 +279,7 @@ formula <- bmf(a ~ 0 + SetSize, s ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMfull(resp_err = 'dev_rad', +model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") @@ -344,7 +344,7 @@ formula <- bmf(c ~ 0 + SetSize, s ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMbsc(resp_err = 'dev_rad', +model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") @@ -409,7 +409,7 @@ formula <- bmf(a ~ 0 + SetSize, c ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMabc(resp_err = 'dev_rad', +model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") diff --git a/tests/internal/internal-model-tests.md b/tests/internal/internal-model-tests.md index 3ea7f4d9..59ca1b78 100644 --- a/tests/internal/internal-model-tests.md +++ b/tests/internal/internal-model-tests.md @@ -233,7 +233,7 @@ formula <- bmf(thetat ~ 0 + SetSize, thetant ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- mixture3p(resp_err = 'dev_rad', +model <- mixture3p(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") @@ -408,7 +408,7 @@ data <- ref_fits$mixture2p$data formula <- bmf(thetat ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- mixture2p(resp_err = 'dev_rad') +model <- mixture2p(resp_error = 'dev_rad') fit$mixture2p <- fit_model(formula, data, model, parallel = TRUE, @@ -551,7 +551,7 @@ formula <- bmf(a ~ 0 + SetSize, s ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMfull(resp_err = 'dev_rad', +model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") @@ -744,7 +744,7 @@ formula <- bmf(c ~ 0 + SetSize, s ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMbsc(resp_err = 'dev_rad', +model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), nt_distances = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") @@ -923,7 +923,7 @@ formula <- bmf(a ~ 0 + SetSize, c ~ 0 + SetSize, kappa ~ 0 + SetSize) -model <- IMMabc(resp_err = 'dev_rad', +model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") diff --git a/tests/testthat/test-bmm_model_IMM.R b/tests/testthat/test-bmm_model_IMM.R index 56f864ad..cf52d991 100644 --- a/tests/testthat/test-bmm_model_IMM.R +++ b/tests/testthat/test-bmm_model_IMM.R @@ -7,7 +7,7 @@ test_that('IMMfull works when set_size is not predicted and there is set_size 1' c ~ 1, s ~ 1 ) - model <- IMMfull(resp_err = 'dev_rad', + model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), set_size = "set_size") @@ -25,7 +25,7 @@ test_that('IMMabc works when set_size is not predicted and there is set_size 1', a ~ 1, c ~ 1 ) - model <- IMMabc(resp_err = 'dev_rad', + model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("col_nt", 1:7), set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, @@ -43,7 +43,7 @@ test_that('IMMbsc works when set_size is not predicted and there is set_size 1', c ~ 1, s ~ 1 ) - model <- IMMbsc(resp_err = 'dev_rad', + model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("col_nt", 1:7), nt_distances = paste0("dist_nt", 1:7), set_size = "set_size") @@ -62,7 +62,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 1, a ~ set_size ) - model <- IMMabc(resp_err = 'dev_rad', + model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), @@ -73,7 +73,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 1, s ~ set_size ) - model <- IMMbsc(resp_err = 'dev_rad', + model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") @@ -86,7 +86,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 1, s ~ set_size ) - model <- IMMfull(resp_err = 'dev_rad', + model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") @@ -98,7 +98,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 0 + set_size, a ~ set_size ) - model <- IMMabc(resp_err = 'dev_rad', + model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), @@ -109,7 +109,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 1, s ~ set_size ) - model <- IMMbsc(resp_err = 'dev_rad', + model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") @@ -122,7 +122,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i c ~ 0+set_size, s ~ set_size ) - model <- IMMfull(resp_err = 'dev_rad', + model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") @@ -139,7 +139,7 @@ test_that('IMM models run when set_size is a predictor and intercept is supresse c ~ 1, a ~ 0+set_size ) - model <- IMMabc(resp_err = 'dev_rad', + model <- IMMabc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), set_size = "set_size") expect_silent(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F)) @@ -149,7 +149,7 @@ test_that('IMM models run when set_size is a predictor and intercept is supresse c ~ 1, s ~ 0 + set_size ) - model <- IMMbsc(resp_err = 'dev_rad', + model <- IMMbsc(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") @@ -162,7 +162,7 @@ test_that('IMM models run when set_size is a predictor and intercept is supresse c ~ 1, s ~ 0+set_size ) - model <- IMMfull(resp_err = 'dev_rad', + model <- IMMfull(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), nt_distances = paste0("dist_nt",1:7), set_size = "set_size") diff --git a/tests/testthat/test-bmm_model_mixture3p.R b/tests/testthat/test-bmm_model_mixture3p.R index 683af611..bc3f9a32 100644 --- a/tests/testthat/test-bmm_model_mixture3p.R +++ b/tests/testthat/test-bmm_model_mixture3p.R @@ -6,7 +6,7 @@ test_that('mixture3p works when set_size is not predicted and there is set_size thetat ~ 1, thetant ~ 1 ) - model <- mixture3p(resp_err = 'dev_rad', + model <- mixture3p(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), set_size = "set_size") res <- try(fit <- bmm(formula, dat, model, @@ -23,7 +23,7 @@ test_that('mixture3p gives an error if set_size is a predictor but there is an i thetat ~ 1, thetant ~ set_size ) - model <- mixture3p(resp_err = 'dev_rad', + model <- mixture3p(resp_error = 'dev_rad', nt_features = paste0("col_nt",1:7), set_size = "set_size") expect_error(bmm(formula, dat, model, backend = 'mock', mock=1, rename = F), diff --git a/tests/testthat/test-fit_model.R b/tests/testthat/test-fit_model.R index ee4adb16..574ec404 100644 --- a/tests/testthat/test-fit_model.R +++ b/tests/testthat/test-fit_model.R @@ -2,7 +2,7 @@ test_that("Available mock models run without errors", { withr::local_options("bmm.silent" = 2) skip_on_cran() dat <- data.frame( - resp_err = rimm(n = 5), + resp_error = rimm(n = 5), Item2_rel = 2, Item3_rel = -1.5, spaD2 = 0.5, @@ -11,14 +11,14 @@ test_that("Available mock models run without errors", { # two-parameter model mock fit f <- bmmformula(kappa ~ 1, thetat ~ 1) - mock_fit <- bmm(f, dat, mixture2p(resp_err = "resp_err"), + mock_fit <- bmm(f, dat, mixture2p(resp_error = "resp_error"), backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) expect_type(mock_fit$bmm, "list") # three-parameter model mock fit f <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - model <- mixture3p(resp_err = "resp_err", set_size = 3, + model <- mixture3p(resp_error = "resp_error", set_size = 3, nt_features = paste0("Item", 2:3, "_rel")) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) @@ -26,7 +26,7 @@ test_that("Available mock models run without errors", { # IMMabc model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, a ~ 1) - model <- IMMabc(resp_err = "resp_err", set_size = 3, + model <- IMMabc(resp_error = "resp_error", set_size = 3, nt_features = paste0("Item", 2:3, "_rel")) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) expect_equal(mock_fit$fit, 1) @@ -34,7 +34,7 @@ test_that("Available mock models run without errors", { # IMMbsc model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, s ~ 1) - model <- IMMbsc(resp_err = "resp_err", set_size = 3, + model <- IMMbsc(resp_error = "resp_error", set_size = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) @@ -43,7 +43,7 @@ test_that("Available mock models run without errors", { # IMMfull model mock fit f <- bmmformula(kappa ~ 1, c ~ 1, a ~ 1, s ~ 1) - model <- IMMfull(resp_err = "resp_err", set_size = 3, + model <- IMMfull(resp_error = "resp_error", set_size = 3, nt_features = paste0("Item", 2:3, "_rel"), nt_distances = paste0("spaD", 2:3)) mock_fit <- bmm(f, dat, model, backend = "mock", mock_fit = 1, rename = FALSE) @@ -55,7 +55,7 @@ test_that("Available models produce expected errors", { withr::local_options("bmm.silent" = 2) skip_on_cran() dat <- data.frame( - resp_err = rimm(n = 5), + resp_error = rimm(n = 5), Item2_rel = 2, Item3_rel = -1.5, spaD2 = -0.5, @@ -76,7 +76,7 @@ test_that("Available models produce expected errors", { okmodels <- c("mixture3p", "IMMabc", "IMMbsc", "IMMfull") for (model in okmodels) { - model1 <- get_model(model)(resp_err = "resp_err", + model1 <- get_model(model)(resp_error = "resp_error", nt_features = "Item2_rel", set_size = 5, nt_distances = "spaD2") @@ -86,7 +86,7 @@ test_that("Available models produce expected errors", { "'nt_features' should equal max\\(set_size\\)-1" ) - model2 <- get_model(model)(resp_err = "resp_err", + model2 <- get_model(model)(resp_error = "resp_error", nt_features = "Item2_rel", set_size = TRUE, nt_distances = "spaD2") @@ -99,7 +99,7 @@ test_that("Available models produce expected errors", { spamodels <- c("IMMbsc", "IMMfull") for (model in spamodels) { - model1 <- get_model(model)(resp_err = "resp_err", + model1 <- get_model(model)(resp_error = "resp_error", nt_features = paste0("Item", 2:3, "_rel"), set_size = 3, nt_distances = paste0("spaD", 2:3)) diff --git a/tests/testthat/test-helpers-data.R b/tests/testthat/test-helpers-data.R index b7ebf37a..bf9bdd80 100644 --- a/tests/testthat/test-helpers-data.R +++ b/tests/testthat/test-helpers-data.R @@ -1,35 +1,35 @@ test_that("check_data() produces expected errors and warnings", { - expect_error(check_data(.model_mixture2p(resp_err = "y")), + expect_error(check_data(.model_mixture2p(resp_error = "y")), "Data must be specified using the 'data' argument.") - expect_error(check_data(.model_mixture2p(resp_err = "y"), + expect_error(check_data(.model_mixture2p(resp_error = "y"), data.frame(), bmmformula(kappa ~ 1)), "Argument 'data' does not contain observations.") - expect_error(check_data(.model_mixture2p(resp_err = "y"), + expect_error(check_data(.model_mixture2p(resp_error = "y"), data.frame(x = 1), bmmformula(kappa ~ 1)), "The response variable 'y' is not present in the data.") - expect_error(check_data(.model_mixture2p(resp_err = "y"), + expect_error(check_data(.model_mixture2p(resp_error = "y"), y~1), "Argument 'data' must be coercible to a data.frame.") mls <- lapply(c('mixture2p','mixture3p','IMMabc','IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), + expect_warning(check_data(ml(resp_error = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 12, x = 1, z = 2), bmmformula(kappa ~ 1)), "It appears your response variable is in degrees.\n") - expect_silent(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), + expect_silent(check_data(ml(resp_error = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(y ~ 1))) } mls <- lapply(c('mixture3p','IMMabc','IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_error(check_data(ml(resp_err = "y",nt_features='x', set_size = 5, nt_distances = 'z'), + expect_error(check_data(ml(resp_error = "y",nt_features='x', set_size = 5, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(kappa ~ 1)), "'nt_features' should equal max\\(set_size\\)-1") - expect_warning(check_data(ml(resp_err = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), + expect_warning(check_data(ml(resp_error = "y", nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 2*pi+1, z = 2), bmmformula(kappa ~ 1)), "at least one of your non_target variables are in degrees") @@ -37,7 +37,7 @@ test_that("check_data() produces expected errors and warnings", { mls <- lapply(c('IMMbsc','IMMfull'), get_model) for (ml in mls) { - expect_error(check_data(ml(resp_err = "y",nt_features=paste0('x',1:4), set_size = 5, nt_distances = 'z'), + expect_error(check_data(ml(resp_error = "y",nt_features=paste0('x',1:4), set_size = 5, nt_distances = 'z'), data.frame(y = 1, x1 = 1, x2=2,x3=3,x4=4, z = 2), bmmformula(kappa ~ 1)), "'nt_distances' should equal max\\(set_size\\)-1") @@ -143,7 +143,7 @@ test_that("check_var_set_size rejects invalid input", { test_that("check_data() returns a data.frame()", { mls <- lapply(supported_models(print_call=FALSE), get_model) for (ml in mls) { - expect_s3_class(check_data(ml(resp_err = "y",nt_features = 'x', set_size=2, nt_distances = 'z'), + expect_s3_class(check_data(ml(resp_error = "y",nt_features = 'x', set_size=2, nt_distances = 'z'), data.frame(y = 1, x = 1, z = 2), bmmformula(kappa ~ 1)), "data.frame") } @@ -210,7 +210,7 @@ test_that("standata() works with formula", { test_that("standata() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) dat <- OberauerLin_2017 - sd <- standata(ff, dat, mixture3p(resp_err = "dev_rad", + sd <- standata(ff, dat, mixture3p(resp_error = "dev_rad", nt_features = 'col_nt', set_size = "set_size", regex = T)) expect_equal(class(sd)[1], "standata") @@ -225,7 +225,7 @@ test_that("standata() returns a standata class", { nt1_loc = 2, nt2_loc = -1.5) - standata <- standata(ff, dat, mixture3p(resp_err = "y" , + standata <- standata(ff, dat, mixture3p(resp_error = "y" , nt_features = paste0('nt',1,'_loc'), set_size = 2)) expect_equal(class(standata)[1], "standata") diff --git a/tests/testthat/test-helpers-model.R b/tests/testthat/test-helpers-model.R index 561f4c53..54972ed9 100644 --- a/tests/testthat/test-helpers-model.R +++ b/tests/testthat/test-helpers-model.R @@ -104,7 +104,7 @@ test_that("stancode() works with formula", { test_that("stancode() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - sc <- stancode(ff, OberauerLin_2017, model = mixture3p(resp_err = "dev_rad", + sc <- stancode(ff, OberauerLin_2017, model = mixture3p(resp_error = "dev_rad", nt_features = "col_nt", set_size = "set_size", regex = T) @@ -120,7 +120,7 @@ test_that("no check for with stancode function", { }) test_that("change_constants() works", { - model <- sdmSimple(resp_err = "y") + model <- sdmSimple(resp_error = "y") formula <- bmf(mu ~ set_size, kappa = 3, c ~ 1) model <- change_constants(model, formula) }) diff --git a/tests/testthat/test-helpers-postprocess.R b/tests/testthat/test-helpers-postprocess.R index 4c323b0d..ebd5688a 100644 --- a/tests/testthat/test-helpers-postprocess.R +++ b/tests/testthat/test-helpers-postprocess.R @@ -6,7 +6,7 @@ test_that("bmm version is added to mock model", { fit <- bmm(formula = ff, data = dat, - model = sdmSimple(resp_err = "y"), + model = sdmSimple(resp_error = "y"), parallel=T, iter=500, backend='mock', diff --git a/tests/testthat/test-helpers-prior.R b/tests/testthat/test-helpers-prior.R index a8495316..ab3d6293 100644 --- a/tests/testthat/test-helpers-prior.R +++ b/tests/testthat/test-helpers-prior.R @@ -12,7 +12,7 @@ test_that("default_prior() works with formula", { test_that("default_prior() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - prior <- default_prior(ff, OberauerLin_2017, mixture3p(resp_err = "dev_rad", + prior <- default_prior(ff, OberauerLin_2017, mixture3p(resp_error = "dev_rad", nt_features = "col_nt", set_size = "set_size", regex = T)) diff --git a/tests/testthat/test-update.R b/tests/testthat/test-update.R index c89a25f8..738e2a8e 100644 --- a/tests/testthat/test-update.R +++ b/tests/testthat/test-update.R @@ -28,7 +28,7 @@ test_that("update.bmmfit works", { # refuse to change model expect_error( - update(fit1, model = mixture2p(resp_err = "dev_rad")), + update(fit1, model = mixture2p(resp_error = "dev_rad")), "You cannot update with a different model" ) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index ee144125..c6870846 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -19,10 +19,10 @@ test_that("empty dots don't crash the function", { test_that("missing arguments in models are handled correctly", { - expect_error(mixture2p(), "arguments are missing in mixture2p\\(\\)\\: resp_err") - expect_error(sdmSimple(), "arguments are missing in sdmSimple\\(\\)\\: resp_err") + expect_error(mixture2p(), "arguments are missing in mixture2p\\(\\)\\: resp_error") + expect_error(sdmSimple(), "arguments are missing in sdmSimple\\(\\)\\: resp_error") expect_error(mixture3p('y'), "arguments are missing in mixture3p\\(\\)\\: nt_features, set_size") - expect_error(mixture3p(set_size = 'y'), "arguments are missing in mixture3p\\(\\)\\: resp_err, nt_features") + expect_error(mixture3p(set_size = 'y'), "arguments are missing in mixture3p\\(\\)\\: resp_error, nt_features") }) test_that("get_variables works", { diff --git a/vignettes/bmm_bmmformula.Rmd b/vignettes/bmm_bmmformula.Rmd index e983af03..a69d2efb 100644 --- a/vignettes/bmm_bmmformula.Rmd +++ b/vignettes/bmm_bmmformula.Rmd @@ -101,7 +101,7 @@ This formula implements an exponential reduction in `thetat` from a `start_theta As the response is not provided to the `bmmformula`, in `bmm` the response variables, and also other variables relevant for a `bmmmodel`, are linked to the model when setting up the `bmmmodel` object. For example, when fitting the `mixture3p` model, you have to provide the names of the variables that reflect the response error (e.g., `y`), the location of the non-target features (e.g. `nt_col1`, ..., `nt_col4`), and the set-size (e.g., `ss`) in our data: ```r -my_model <- mixture3p(resp_err = "y", +my_model <- mixture3p(resp_error = "y", nt_features = paste0("nt_col",1:4), set_size = "ss") ``` @@ -125,14 +125,14 @@ When fixing a parameter to a constant value, you need to keep in mind that the v `bmm` fixes some parameters internally, as they are usually not an integral part of a measurement model, or need to be fixed to properly identify the model. For example in models for continuous reproduction visual working memory tasks, the distribution of target responses is usually assumed to be centered around the target. Consequently, the mean of this distribution `mu` is internally fixed to `0`. Such parameters are listed in the model object. So, you can see if a model has such parameters by accessing `my_model$fixed_parameters`. ```{r} -my_model <- sdmSimple(resp_err = "error") +my_model <- sdmSimple(resp_error = "error") my_model$fixed_parameters ``` Fixed parameters that can be freely estimated are also listed in the `parameters` of a model, that you can access using `my_model$parameters`. Parameters that are only listed in the `fixed_parameters` but not part of the `parameters` need to be fixed for identification purposes and thus cannot be estimated freely. For example in the `mixture_vwm` models, the location `mu2` and precision `kappa2` of the guessing distributions needs to be fixed for model identification. These parameters are listed in the `fixed_parameters` but not in the `parameters` and therefore cannot be estimated. Only, the internally fixed location of the target responses `mu1` can be estimated freely if needed. ```{r} -my_model <- mixture2p(resp_err = "error") +my_model <- mixture2p(resp_error = "error") names(my_model$fixed_parameters) names(my_model$parameters) @@ -141,7 +141,7 @@ names(my_model$parameters) If you want to freely estimate an internally fixed parameters, then you can freely estimate this parameter by providing a `bmmformula` for it. In the case of the above mentioned visual working memory models, you could for example be interested in seeing if subjects were biased (e.g., by distractors). If you want to estimate the overall bias in your data including variations between subjects indicated by `ID`, then you would additionally specify a `bmmformula` for `mu` in addition to the other formulas for the core mode parameters: ```r -my_model <- mixture2p(resp_err = "error") +my_model <- mixture2p(resp_error = "error") my_formula <- bmf( mu1 ~ 1 + (1 | ID), thetat ~ 0 + set_size + (0 + set_size | ID), @@ -163,7 +163,7 @@ user_formula <- bmf( kappa ~ 0 + set_size + (0 + set_size | id) ) -my_model <- mixture2p(resp_err = "error") +my_model <- mixture2p(resp_error = "error") bmmfit <- bmm( formula = user_formula, diff --git a/vignettes/bmm_extract_info.Rmd b/vignettes/bmm_extract_info.Rmd index e923de9b..dbb25ef2 100644 --- a/vignettes/bmm_extract_info.Rmd +++ b/vignettes/bmm_extract_info.Rmd @@ -52,7 +52,7 @@ library(bmm) default_prior(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) ``` In this case we used a formula of the type `~ 0 + factor`, which means that the intercept is suppressed, and a separate parameter is estimated for each level of the set_size factor variable. For the SDM model, both `kappa` and `c` have to be positive, so they are defined in the model on the log scale, and exponentiated afterwards. Thus, the parameters are sampled on the log scale, and the priors are defined on the log scale as well. The default prior for `c` is a student-t distribution with 5 degrees of freedom, a mean of 2, and a standard deviation of 0.75. This corresponds to the following prior distribution over the log scale, with 80% of the prior mass between 0.9 and 3.10: @@ -78,7 +78,7 @@ If we had retained the intercept in the formula, the default prior above would b ```{r message=FALSE, warning=FALSE} default_prior(bmf(c ~ 1 + set_size, kappa ~ 1 + set_size), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) ``` You can also see that in both cases, the last line is "constant(0)" on the Intercept of the `mu` parameter, which is fixed to 0 by default in the model, and is not estimated. You might wonder why it doesn't say `mu` in the `dpar` column of that prior - this is because `brms` assumes `mu` is the default parameter in all models, so it hides it in the output. If you wanted to estimate `mu`, instead of leaving it fixed, the prior for it would change as well: @@ -86,7 +86,7 @@ You can also see that in both cases, the last line is "constant(0)" on the Inter ```{r message=FALSE, warning=FALSE} default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) ``` The `mu` parameter uses a `tan_half` link function, which means that the `student_t(1, 0, 1)` prior results in a uniform prior over the native scale of `mu` from -pi to pi. You will also notice above that for the regression coefficients on `mu`, the default prior is an improper flat prior - this is the only parameter in `bmm` models which has a flat prior by default, and we strongly recommend you set a prior on it, if you want to calculate Bayes Factors or use other Bayesian inference methods. @@ -102,7 +102,7 @@ The Stan code used for fitting a model is generated together by `bmm` and `brms` ```{r comment = "", collapse=FALSE} stancode(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) ``` @@ -111,7 +111,7 @@ Alternatively, if you already have a fitted model object, you can just call `sta ```r fit <- bmm(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad')) + model = sdmSimple(resp_error = 'dev_rad')) stancode(fit) ``` @@ -122,7 +122,7 @@ If you want to extract the data that would be used for fitting a model, you can ```{r} sd <- standata(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), data = OberauerLin_2017, - model = sdmSimple(resp_err = 'dev_rad'), + model = sdmSimple(resp_error = 'dev_rad'), sort_data = TRUE) str(sd) ``` diff --git a/vignettes/bmm_imm.Rmd b/vignettes/bmm_imm.Rmd index 5fb4eb88..3c86102e 100644 --- a/vignettes/bmm_imm.Rmd +++ b/vignettes/bmm_imm.Rmd @@ -142,7 +142,7 @@ for (i in 1:length(Cs)) { b = 0, s = Ss[i], kappa = kappas[i]) condData <- data.frame( - resp_err = genData, + resp_error = genData, trialID = 1:nTrials, cond = i, color_item1 = 0, @@ -182,10 +182,10 @@ model_formula <- bmf( ) ``` -Then, we can specify the model that we want to estimate. This includes specifying the name of the variable containing the dependent variable `resp_err` in our simulated data set. Additionally, we also need to provide the information of the `non_target` locations, the name of the variable coding the spatial distances of the nt_features to the target `spaDist`, and the `set_size` used in our data. The `set_size` can either be a fixed integer, if there is only one set_size in your data, or the name of the variable coding the `set_size` in your data: +Then, we can specify the model that we want to estimate. This includes specifying the name of the variable containing the dependent variable `resp_error` in our simulated data set. Additionally, we also need to provide the information of the `non_target` locations, the name of the variable coding the spatial distances of the nt_features to the target `spaDist`, and the `set_size` used in our data. The `set_size` can either be a fixed integer, if there is only one set_size in your data, or the name of the variable coding the `set_size` in your data: ```{r} -model <- IMMfull(resp_err = "resp_err", +model <- IMMfull(resp_error = "resp_error", nt_features = paste0("color_item",2:5), set_size = set_size, nt_distances = paste0("dist_item",2:5)) @@ -194,7 +194,7 @@ model <- IMMfull(resp_err = "resp_err", In the above example we specified all column names for the non_targets explicitely via `paste0('color_item',2:5)`. Alternatively, you can use a regular expression to match the non-target feature columns in the dataset. For example, you can specify the model a few different ways via regular expressions: ```{r} -model <- IMMfull(resp_err = "resp_err", +model <- IMMfull(resp_error = "resp_error", nt_features = "color_item[2-5]", set_size = set_size, nt_distances = "dist_item[2-5]", diff --git a/vignettes/bmm_mixture_models.Rmd b/vignettes/bmm_mixture_models.Rmd index e2cb56cc..4a809c2e 100644 --- a/vignettes/bmm_mixture_models.Rmd +++ b/vignettes/bmm_mixture_models.Rmd @@ -180,7 +180,7 @@ ff <- bmf(thetat ~ 0 + set_size + (0 + set_size | id), Then we specify the model as simply as: ```{r} -model <- mixture2p(resp_err = "error") +model <- mixture2p(resp_error = "error") ``` Finally, we fit the model with the `bmm()` function. The fit model function uses @@ -296,7 +296,7 @@ ff <- bmf( kappa ~ 0 + set_size + (0 + set_size | id) ) -model <- mixture3p(resp_err = "error", nt_features = paste0('non_target_',1:5), set_size = 'set_size') +model <- mixture3p(resp_error = "error", nt_features = paste0('non_target_',1:5), set_size = 'set_size') ``` Then we run the model just like before: @@ -318,11 +318,11 @@ The rest of the analysis is the same as for the 2-parameter model. We can inspec In the above example we specified all column names for the non_targets explicitely via `paste0('non_target_',1:5)`. Alternatively, you can use a regular expression to match the non-target feature columns in the dataset. This is useful when the non-target feature columns are named in a consistent way, e.g. `non_target_1`, `non_target_2`, `non_target_3`, etc. For example, you can specify the model a few different ways via regular expressions: ```{r} -model <- mixture3p(resp_err = "error", +model <- mixture3p(resp_error = "error", nt_features = "non_target_[1-5]", set_size = 'set_size', regex = TRUE) -model <- mixture3p(resp_err = "error", +model <- mixture3p(resp_error = "error", nt_features = "non_target_", set_size = 'set_size', regex = TRUE) diff --git a/vignettes/bmm_sdm_simple.Rmd b/vignettes/bmm_sdm_simple.Rmd index 84bf31e8..a904be1d 100644 --- a/vignettes/bmm_sdm_simple.Rmd +++ b/vignettes/bmm_sdm_simple.Rmd @@ -180,7 +180,7 @@ ff <- bmf( Then we specify the model, which in this case is just `sdmSimple()`, and we provide the name of the response error variable in the dataset: ```{r} -model <- sdmSimple(resp_err = "y") +model <- sdmSimple(resp_error = "y") ``` Finally, we can fit the model. We strongly recommend using `cmdstanr` as a backend for fitting the SDM model, as it is much faster and more stable than the default `rstan` backend for this particular model. Here's how to fit the model with `cmdstanr`: From b45d7fd2e8db5661dec290ab59c07aa8c19e114e Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 17:30:38 +0100 Subject: [PATCH 11/13] rename datasets --- .dev/bmm_default_priors.Rmd | 2 +- .dev/bmm_default_priors.md | 2 +- .dev/visualizing_priors.R | 2 +- NEWS.md | 4 ++-- R/bmm_model_IMM.R | 2 +- R/data.R | 17 +++++++++-------- R/helpers-data.R | 2 +- R/helpers-model.R | 2 +- R/helpers-prior.R | 2 +- README.Rmd | 2 +- README.md | 2 +- _pkgdown.yml | 3 +-- data/OberauerLin_2017.rda | Bin 161021 -> 0 bytes data/ZhangLuck_2008.rda | Bin 21989 -> 0 bytes data/oberauer_lin_2017.rda | Bin 0 -> 160973 bytes data/zhang_luck_2008.rda | Bin 0 -> 22017 bytes man/IMM.Rd | 2 +- man/default_prior.bmmformula.Rd | 2 +- ...berauerLin_2017.Rd => oberauer_lin_2017.Rd} | 16 ++++++++-------- man/stancode.bmmformula.Rd | 2 +- man/standata.bmmformula.Rd | 2 +- man/{ZhangLuck_2008.Rd => zhang_luck_2008.Rd} | 10 +++++----- tests/internal/bmmexamples.R | 2 +- .../internal/generate_ref_model_fits_v0.2.1.R | 4 ++-- tests/testthat/test-bmm_model_IMM.R | 10 +++++----- tests/testthat/test-bmm_model_mixture3p.R | 4 ++-- tests/testthat/test-helpers-data.R | 4 ++-- tests/testthat/test-helpers-model.R | 6 +++--- tests/testthat/test-helpers-prior.R | 8 ++++---- vignettes/bmm_extract_info.Rmd | 12 ++++++------ 30 files changed, 63 insertions(+), 63 deletions(-) delete mode 100644 data/OberauerLin_2017.rda delete mode 100644 data/ZhangLuck_2008.rda create mode 100644 data/oberauer_lin_2017.rda create mode 100644 data/zhang_luck_2008.rda rename man/{OberauerLin_2017.Rd => oberauer_lin_2017.Rd} (59%) rename man/{ZhangLuck_2008.Rd => zhang_luck_2008.Rd} (87%) diff --git a/.dev/bmm_default_priors.Rmd b/.dev/bmm_default_priors.Rmd index 9447f43c..6c6f0b36 100644 --- a/.dev/bmm_default_priors.Rmd +++ b/.dev/bmm_default_priors.Rmd @@ -26,7 +26,7 @@ First, we can see what happens by default in `brms`. Let's look at a simple line It puts a default prior on all parameters that have only an intercept ```{r} -dat <- OberauerLin_2017 +dat <- oberauer_lin_2017 dat$cond <- factor(rep(1:4, each=nrow(dat)/4)) # fake condition for testing formulas get_prior(bf(dev_rad ~ 1, sigma ~ 1), dat) ``` diff --git a/.dev/bmm_default_priors.md b/.dev/bmm_default_priors.md index eb3ea2c3..88b8b483 100644 --- a/.dev/bmm_default_priors.md +++ b/.dev/bmm_default_priors.md @@ -21,7 +21,7 @@ Click to expand It puts a default prior on all parameters that have only an intercept ``` r -dat <- OberauerLin_2017 +dat <- oberauer_lin_2017 dat$cond <- factor(rep(1:4, each=nrow(dat)/4)) # fake condition for testing formulas get_prior(bf(dev_rad ~ 1, sigma ~ 1), dat) ``` diff --git a/.dev/visualizing_priors.R b/.dev/visualizing_priors.R index 74021af1..bba72146 100644 --- a/.dev/visualizing_priors.R +++ b/.dev/visualizing_priors.R @@ -1,4 +1,4 @@ -data <- OberauerLin_2017 +data <- oberauer_lin_2017 data$session <- as.factor(data$session) formula <- bmf(c ~ 0 + set_size, kappa ~ session) model <- sdmSimple('dev_rad') diff --git a/NEWS.md b/NEWS.md index 82e03ad7..233bb7c9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -61,7 +61,7 @@ to zero for scaling and as of now cannot be predicted by independent variables because the model would be unidentifiable. * the arguments used to fit the bmm model are now accessible in the `bmmfit` object via the `fit$bmm$fit_args` list. * add class('bmmfit') to the object returned from fit_model() allowing for more flexible postprocessing of the underlying `brmsfit` object. The object is now of class('bmmfit', 'brmsfit') -* changes to column names of datasets `ZhangLuck_2008` and `OberauerLin_2017` to make them more consistent +* changes to column names of datasets `zhang_luck_2008` and `oberauer_lin_2017` to make them more consistent ### Bug Fixes * an error with the treatment of distances in the `IMMfull` and the `IMMbsc` has been corrected. This versions ensures that only positive distances can be passed to any of the two models. @@ -90,7 +90,7 @@ to zero for scaling and as of now cannot be predicted by independent variables b * Add ability to extract information about the default priors in `bmm` models with `get_model_prior()` (#53) * Add ability to generate stan code and stan data for each model with `get_model_stancode()` and `get_model_standata()` (#81) * BREAKING CHANGE: Add distribution functions for likelihood (e.g. `dimm()`) and random variate generation `rimm()`) for all models in the package. Remove deprecated `gen_3p_data()` and `gen_imm_data()` functions (#69) -* Two new datasets available: `ZhangLuck_2008` and `OberauerLin_2017` (#22) +* Two new datasets available: `zhang_luck_2008` and `oberauer_lin_2017` (#22) ### Documentation diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index 7aac0a40..98166475 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -213,7 +213,7 @@ #' @examples #' \dontrun{ #' # load data -#' data <- OberauerLin_2017 +#' data <- oberauer_lin_2017 #' #' # define formula #' ff <- bmmformula( diff --git a/R/data.R b/R/data.R index 39feffe4..131c1216 100644 --- a/R/data.R +++ b/R/data.R @@ -3,7 +3,7 @@ #' Raw data of 8 subjects for the response error in a continuous reproduction task #' with set size 1, 2, 3, and 6 reported by Zhang & Luck (2008). #' -#' @format ## `ZhangLuck_2008` +#' @format ## `zhang_luck_2008` #' A data frame with 4,000 rows and 9 columns: #' \describe{ #' \item{subID}{Integer uniquely identifying different subjects} @@ -14,9 +14,9 @@ #' \item{col_lure1, col_Lure2, col_Lure3, col_Lure4, col_Lure5}{Color value of the lure items coded relative to the target color.} #' #' } -#' +#' @keywords dataset #' @source -"ZhangLuck_2008" +"zhang_luck_2008" #' Data from Experiment 1 reported by Oberauer & Lin (2017) @@ -24,8 +24,8 @@ #' Raw data of 19 subjects that completed a continuous reproduction task #' with set size 1 to 8 reported by Oberauer & Lin (2017). #' -#' @format ## `OberauerLin_2017` -#' A data frame with 15,200 rows and 39 columns: +#' @format ## `oberauer_lin_2017` +#' A data frame with 15,200 rows and 19 columns: #' \describe{ #' \item{ID}{Integer uniquely identifying different subjects} #' \item{session}{Session number} @@ -33,10 +33,11 @@ #' \item{set_size}{The set_size of the data in this row} #' \item{dev_rad}{The response error, that is the difference between the response #' given and the target color in radians.} -#' \item{col_nt1,col_nt2,col_nt3,col_nt4,col_nt5,col_nt6_Col,col_nt7}{The non-target items' color value relative to the target.} -#' \item{dist_nt1,dist_nt2,dist_nt3,dist_nt4,dist_nt5,dist_nt6_Pos,dist_nt7,dist_nt8}{The spatial distance between all non-target items and the target item in radians.} +#' \item{col_nt1, col_nt2, col_nt3, col_nt4, col_nt5, col_nt6, col_nt7}{The non-target items' color value relative to the target.} +#' \item{dist_nt1, dist_nt2, dist_nt3, dist_nt4, dist_nt5, dist_nt6, dist_nt7, dist_nt8}{The spatial distance between all non-target items and the target item in radians.} #' #' } #' +#' @keywords dataset #' @source -"OberauerLin_2017" +"oberauer_lin_2017" diff --git a/R/helpers-data.R b/R/helpers-data.R index fcd234e6..c1d11fd0 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -237,7 +237,7 @@ rad2deg <- function(rad){ #' #' @examples #' sdata1 <- standata(bmf(c ~ 1, kappa ~ 1), -#' data = OberauerLin_2017, +#' data = oberauer_lin_2017, #' model = sdmSimple(resp_error = "dev_rad")) #' str(sdata1) #' @importFrom brms standata diff --git a/R/helpers-model.R b/R/helpers-model.R index c93d66dc..5a9d4fa1 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -628,7 +628,7 @@ use_model_template <- function(model_name, #' @keywords extract_info #' @examples #' scode1 <- stancode(bmf(c ~ 1, kappa ~ 1), -#' data = OberauerLin_2017, +#' data = oberauer_lin_2017, #' model = sdmSimple(resp_error = "dev_rad")) #' cat(scode1) #' @importFrom brms stancode diff --git a/R/helpers-prior.R b/R/helpers-prior.R index 99ef4b0d..85fef862 100644 --- a/R/helpers-prior.R +++ b/R/helpers-prior.R @@ -28,7 +28,7 @@ #' #' @examples #' default_prior(bmf(c ~ 1, kappa ~ 1), -#' data = OberauerLin_2017, +#' data = oberauer_lin_2017, #' model = sdmSimple(resp_error = 'dev_rad')) #' @importFrom brms default_prior #' @export diff --git a/README.Rmd b/README.Rmd index c0225344..c742f2f3 100644 --- a/README.Rmd +++ b/README.Rmd @@ -169,7 +169,7 @@ Measurement Model would look like this: ``` A complete call to fit a model using bmm could look like this. For this example, -we are using the `OberauerLin_2017` data that is provided with the package and we +we are using the `oberauer_lin_2017` data that is provided with the package and we will show how to fit the Interference Measurement Model to this data. If you want a detailed description of this model and and in depth explanation of the parameters estimated in the model, please have a look at `vignette("bmm_imm")`. diff --git a/README.md b/README.md index 8a0b02c8..4677f4fd 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Interference Measurement Model would look like this: ``` A complete call to fit a model using bmm could look like this. For this -example, we are using the `OberauerLin_2017` data that is provided with +example, we are using the `oberauer_lin_2017` data that is provided with the package and we will show how to fit the Interference Measurement Model to this data. If you want a detailed description of this model and and in depth explanation of the parameters estimated in the model, diff --git a/_pkgdown.yml b/_pkgdown.yml index 376fc3f0..126f8de3 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -57,8 +57,7 @@ reference: - title: "Datasets" desc: "Available datasets for fitting the models" - contents: - - "OberauerLin_2017" - - "ZhangLuck_2008" + - has_keyword("dataset") - title: "Developers' corner" desc: "Functions to assist in developing new models" - contents: diff --git a/data/OberauerLin_2017.rda b/data/OberauerLin_2017.rda deleted file mode 100644 index 09ed3ba4b4d2d40ee665e118061aadd1abcf3dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161021 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 diff --git a/data/ZhangLuck_2008.rda b/data/ZhangLuck_2008.rda deleted file mode 100644 index f1b717bf113af942c765afea5cf813f9b2660904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21989 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 GOuB$KdwoR! diff --git a/data/oberauer_lin_2017.rda b/data/oberauer_lin_2017.rda new file mode 100644 index 0000000000000000000000000000000000000000..6fc434dc3ba38692e0c9623234db75b8c87c5940 GIT binary patch literal 160973 zcmdSAcT`hN6fYVO5D<_OdWR4bM5KhSNC_dKNdibmy7UeaY;+-n5oNH~^XeO%KeVi-Ur891VhIk40~wh}nyl zSOMmclJokzymbf$=Da#w=Xn70^P_~3@jq6pgcHCF;IE~-O@uHaGubbc*fjtEVF196 z?7MTZ7)w&fM=w>5Alf@5K(!A5P-X*MQnI)JV9fbX`r4OWiF4Kev+)0g%mIM&HaOQo zjqW1=ATDvv?zosX(D|O*BvL{r!MO{dn!^D4p`F|z?(dQRwu$}=+)9fw1Nc79fa}C(8G?jRr-+WH8&jHdpbO3so z*C2pSAs^;lQ2=0o^$w9NxRMEFOQ~6=Qt20<1*GAq=gEyvxAadHO%rZN4?nk10Yu*Z zPoD|E%x4+P%yTJM1pvL*G}r_I0Du8>N=$iR7`-z9kOu%WyrWY908GvgdavGh+)-s^ znfj>es6w67+cT-KuA8QnE|r7*NfWM~C8t6+!Eu183oOz4%&MeQ!%EMjiKTR1VVyjo zg2z=avj?Zys}%ADOkvYpTd-3_Wz^4DAIr>Gu}alhLAIw=FRQl13Q`4TP6{G#nxCGx z^u;pom%A^kN&rJm1p=mkuc_=8bS_A+UqD2Aoj1g}`eG&SQE?JbS<72i(1OChRtCc8 z#8e)y=gB``?ibF&e#2KQy<04QTllz?6e3c^t6+= zCWz~h8cBy7qwAZZ_XzggUiL`I+O z-`p}h1K#fwh3pv`X`-jnvcpK_|33vt;~qlw&Cgu-_bY7?-!&_3uZBBU5nJt83$BKC zSr`N|pED24WxeXwbk7mTf5_$>EyPyfRwa00cTPWAPTDszn(|T<&Y9kG5f?`mF|^@h z(mV7o4>8vC<;w4;VpfJU;KSH-0{Zj5Hp+0Q@?=;WZ8%){!$Vx2bSA6qVwj8mBCG9f zn1}x2qaAG64>?EShVLOqm0ygs9~l;+zp`p47#5*-EF-tX9vPOPcP%5W#JJOm=wIbx z$%d1aUwyO*hEtV4J;cq<9reg4y&Am-jIt7kk)|PE_iyT@*Pu^v+RcVl44HuMu_%D^ z`G;O72g^9V`0Y=^toT>yKOKL+l4@p_-O6XB^!!E5o>D`PBmU`SC~aVLlk9S{suaKP zWByN2I+u>B*7m80KfUuqLAWptBt0oCkP*|(0Kagz>BSjy$J1qL9;B^e*@!+K(9g+u z0oyM%4#w+O3iR85&WpM7rf*0_H7%^;#%%A-k0;Y!2U_OLj~k3C013Pi@ef^6zUqTO zCx55z)X3}45wB0xKAm`S`eZ;Eo{5NMotjp?-1oa7UgM3g@8Z9y+>lRH>!`0qRBY%~ zat!kOmrwUEr~Cd`*KM{smpT)_DXq+H zw@Vxz1gd+C=Ei^AsWhD8h*|40?Vn58i)}G8zM$D>tF%o?WI8>Hl{8x$(6{Q0+O24l z$+}v$&ofeUuz81}U9*`<@XbI<_mATD5X>_f1mi7<_6o$Q9!ZI5in^#nLDbK`#=>CL zKcDCC6J7M?c3a*H)wS@cAy^Ozz{}po#p6@gU00a=3XNNWSg5>i%9JX&IQD*b z*Q59S!>JECUZ3pG*KB_#xoiK+b+EWY3wPD+-{fLa?bWh(RT7H8y za6!0AKXt6H&-oPx&r1Qvz+Y7ur)5Dm=Ga^`Z5&(Io3hnf zPJGkB)ot~>Q_vCneAc;k^a)`2G+NAXLi4)EP+{|fxa=Q77|Z9zQ7;|G-}XDfg@kA~ z`o}!A7QA2t<~7mx@$;^oVv9anK=oMJt;)`+>_%&f+fccxV+;5`GH7sNcR0*|B}&+hvu1|i&<0!M6+$7o%*N~@oy*qTrAcm$li(HSVl&_^ z&Xk~Bt+tn4%o`Q1+vaK$ZjSH>kooRm5CZXvb@HtW%_ez{c1c*UR_t8`;I^CrJ=Gki7g{*NDxlWril0YccA;%+i#1+ZKKGEO5Nya&F6; z;1TFOp8Nx-n!dG8yDauv<>JpEV8re?e7~YKGwPnA?<-q+K1!Q*WH>rBhm{FDH7|Ck zF&6uXpIZwC+n|2_wT#wWvjQH zCLQeGqY4*oURjkHtbbL~9bs-wR{s%>472&BTe509?QR-gWFoJ8Pa>yBQ_L+UUW!zVX=T@#bfyv%0FIe!jU3KNbunTRu_c4t{ zvaRy%_0diCz}S9HX9(jCgOa<1_>`^4Hv-Th#OOLd=w*6aBm)Eu%? zvKcTHCcUGgBklE_6R{LZSZ0V{uNK~$aZZ?JsB0ylC@rhNT|;EOw#$V&bI(p{(&!R_ z!|d?B^BksgIim!A82)xS7 z$n2{Na6Pi6#+c$c$;#-dPGTA-}dF$Yf=z?;2r^bE_LP_ zavUAsEuE*HNEXfo=07g&EKhG=`95!zmGS`>y;2vSU(`dq z0;jf0krey~+O_kv0{C0{H8fc^9gY(oF=i#gz6+Vs+L|a3%if#Gww3pS2cA`a*8rKyqk` zwh<~c-tdRZoAMg$j<%j(Agu4fhKX1mqg z&}td$cMslOzI^oq`{!(ajl9?2?H)*a8Mh#%uStc-5(EZUTZRkoJdk5zx9ctoMmBK^p zmU|6HL15+1-nTQ&N(M`>pePI6cGFPdP{Clxl`6ZCy%ndel0{Xv@S<4j1_r2rxhEt7 z=3JVuo^+vDUe@N!j^E78IXI46EedCk`EqE%=~$WI)S1oq?t~?LJ3)KH+rD&zOrboV zPS_i;w6xUz(zVyqUYP%$U~X``Wwu@$f8{7q$bB#5W9Rj-tmK4d-7wT0bCq)1GkVNQ z>f#C^$KVm?o!*uMYUS2dC9%4X$qh+Ga;WY_Ou0#_fF!WPr8V2RL%ifoNk=)G(9d7( zeP*h``Ly_mz~1WZ>86^B-D|pc>aG^o#4GL<`;eJTt(iNv1U>{;x^eCPJT9pGdYnh& z8^<^IWWO=fE?N2=lo%y^!y{N#?Tf=f9gZkrI**yqfdI2tAL$IL2hE zv#-@Jo27leb}K;O)W_>LyJLcVCR-POD??MZuI#Z=W?2y&$OZ6il2G9 znai<+z}(UYZKe}V_Hm1auGz4U5#4fPN8?UDUnl1ZX^I%Wnt=QZ96oyyEru^d)+Q@v^7b=~9s_B>u1%f^kRfA?BlV z%;!6Vnny|q!3FyIEW8@eCH?mBRuQj(Sa3j$T8mZRbePoFSwfgj=bSg)zV7&?`P8fA zjw!-nch~9Rm+91fy^C3K$*N5SbTD&ou(PMQ5uL z->M94s{ic8Z_QpTET3GSu`}ItNYOsO zcbsyd(`-Au(K3o`?h+-#`_Ae`R65HZYlEfYV<@%0FknbIrRrZFMIjfa6 zN}zSS_qi6v)3=4O zb8`t3A8{LZS$(UHS%++21Ggo7j8 z@wKZUYjDqILZE(s$7_R4;BM zaa5SkW=*KJNP1@?gP<_bG$hAmA>7vQ%>jiRr)1SZPOT=BfkI?zp_sw^7 zoKqaeMRvDdIzb!CGuob-zTgc258KMmhy6HqSOz7i-VUt)cS7s z9do?6oLnYJDpL!)77*S)L(}}2J!m*2R6}ZqaOV?@T}&Groq`M;0rbBfo+{4-}VP?h5bzn2YsO0rsG#=NQ5YoUXwRPElRVpA8XPXcjD0Yk2 zG)6@EYD^~Ba%)Mo%q5LuO0ai8XhYt#v+;>d0!cn00 z(7Fz#g|`i(i5*uTtuz-t^|&ZamktFvN=~t_{DrLkcnP+^LK zY_uWslt;l0D_xD+t@T(<%7Z%Jl*T~4+(rz!d)om^@J_; z#D-*!tE|~ugIJAisdB8oph{G2UKAI-f9iObCM;V?yLtb5ST(Dy4%$Z3 z*X*>^yin$#<<2SPm!^Tzi`Z+paFSXOIk)He280r3@lvS>w=NJEe+j=nd2LIwiW98imMJDt#Yv~CGVxxp+>By8X8^u z!z+dRDg<)JFW3v!FO2niL6bC~&dNod_DU;HEvIfZc$y+U+e||Jn;Rtxw3iQw$$hp@ zYktlpt!AF#nfX97_q}IQ#MalCmzJ$}L0(Op`NzkfgzT4iQ!c%#+QoRRQ)-$NximnapbZ9$IPc+C^?+1!Mi9>WPt1?_`gifpcB0f&ZPE`F7e;tC+ogjq~zlr)@AL zs7_dgvt)q1;EW*xe9Sgt#jSK$D3q3bIzG4)qUbiTVc|hC|>egsAq0M}`Y|92M zi^q^7WF92uG!BUE^jI3WdF1n&)H{G(YgwK}+%VExkP+p$!RxPg71(`eV`XnfHFedbR5o2Fp{3LS$OZQx|$jVLLiQpuKXE*o~1A?AvuDUoVCm}Rv zG>fm2yt^W?!RXV7P6QKf@41#@lSBR5=nMSCjvF^W-rRf3M98CBcOlTB8IExg$3cgI z=IUo`D83_}H{gv|#kR(RX}_Rq5f?+cHShVp3R#f%H+~R2cSL`qh0A|xiTo7D7b^UG zMek*m5pzxPgCc>cQKCP~`baSAAx3iHMyhP(fS3l)KyhNT(8>Bel`9V03PBIs-o9iC zZVm^}NNg<=JL?v*!8FYup)tIHsy}fr+?uaaY=idw6yEVmgjNys;Zzx)CTu&R9ff(bs_K=#_Fvkm**{QYC2^zzakMNna zoo$Zx&?}UZZ5dK1_o2bq#$52kE6h?yuuG_%0Ni&)0}{1;q^aR!PcQwdyubQ~18dQj z8(*$enaf0FCX0^tzM1R5GWJD+lOUMqli@WrUmu1}Z2xHg89jfk4irqIGQoYvIfnPg z9GAu$L>I64-xsb{@aRH_R-U}q9jlD0wWz8(fJ_`L1c!Ocx1?D&tgDy5DUN!JVYn1r z#TR-r4!oY=%J=C2DfihR;p*S{H6RSz4-xYg^wuvdAtpdBTbtF>&ap#}=5TpMQ*>y{{(@8@=;eJ zHUfw4@~&|`4vuUso4Pno&BQCB%d$2cv?({Js*@rwb);zJtoc3Gt4sdj>DP{{ zFRokjYaB0p=ULBSh)1zYvjT~9(MjDmo{WC#et5}uk|5w7nK5z<(m2)_j{C%k1aX;2 zui1-jcHl138{+Xwx)%oqa1s`Gu@rZ4$59gYZrs_~hlKnLld@90qLLI{z6?@sh?|oH z0+yh-UCP`Pbh3@~kVI6YLIx|6D8-VU#Uqyo&4wqs$9L<*DhiBxN{v=X#lxaAWmp8H zg^ZXdo}HetBTLZm)MIsb?eFX2$x1-G&l03f7R?B0taj%s$o%+6aZ$?ZY0{)LHPkrQ z5*zU;;tNyiI6AQV$I;RFqfeb+hFC5WMTKO9#Ngaav+t|c@fY{>QnyBqK44pAo}L=N z{21PMrsk4=y*2#XLGA}yqM!~*fM@T+qc;7wD^9ds^8ov&n!MvEIDGiui%9gdNWQ0C zM8!+JS%qIJC3_i9fXNKpNKezd0iQa4o=LHZ2fV$J>GjjU`%`P^k_$DQ>L^dkrxZJy zQrr6PI-Y*1+3fp5Da`*a8Wd03niqG(VmmbtrD){hl`^xiU&9;Jl_Tns7CAKaIGFRt z{POD0qvOo$#q*R<&iBO=snmHwNT&YLJWA_TcU|j;*{TAs(P&&DtXGLknNP>00%8tM z0ed5J7z9S~Zp_JeuRNrr9%lv83xP=lFu%(zaDFT{>oZrsO9x|C1bawiy9!CmfXa-r z1Yt8^w4yPypPr1MlsmNSiAHtxKbP+;-#OiWEtJZIM>D=I88+amyx^|tuWFb42XwWm zC=Qfx+ur8~AFJnt2V{|80CGcgv7{!c#B)!p)TuN>GhGPEbW#{J6I-dI&;$SFieWUE z0pZ2jRRKyya=N?0kzI{!yo${Iv49z-L{D2~a6Cf51*VFUVrLPSc83dqGOXU*nYWwT z99&51b0wMkf)M?wOh&jkU^c>3!M|e8{19_l)Hy~lZNSYxd$15%HpG^9M~U;Q|5ZCK zMc@!Y!A+-v?Sd46+bdZ{2A>2@F0l|+An36T5s-b!s*e6OcC%NTm^~q!#8fT>n{GDF z)P2U5CEIx!teCTGuFA!LONyQ(2_TK+(64JTyg(bAKG4nH!m2{f#XPAOnW2E6gbhw2 zn=z&O+~`z+G9s(gPztx}1WMPYAGDCMgh)QOUuQ7Oeb_bAJ+HtV9;**a5ac%CR1l1h ziO0KVdMD3k)VE!r<|#k`inZ1(G^l83Z|ZRuA?9 zD9~ogBb(i)AO*?GISS0K=!%m>B3~udzA_#_RcJFe03o5=9Ry@qhE8k- zJR|cgnLA->N5kwRbvm?-JgrV1Ok=(hvhH|35fyY$^c3s3uoDnIO?GI%qA|6jl`Ees z%0Ue(q8+Z&UT7yI!dzpsE0|pHxCCXekrXmpuAiYd(K$Yc#T8kSCmHS8&7$N6f@Kf!zmy41lLmWdl z44M58an|=96Gp-hPtao?${tKsbVVRNpcZ7YtQ63o^r#2n3iP!le)d@aFTktg*f`H#fW?h1W%}fu-rWaB_Yb zE;-!s`F!|zgx%~9Un}dwx$645ngwY$PD@`Inb>4*);LUoDvS}#0%21a7;bOt9R-*t zLNlej@{$FsV!_Tsx+orqq={av0w-9&vlk4551~L_iCd$C3h}X)&e20eAXG|0#+`*l zf(UM@;>$=8G*SSACK7b<1#Dg*9_C~j0rON6zrSovjSo-pvwm}>Sl0*JS7rL zd@9{d&`mjIm1VdI1kT8FidBfEFrcokj*_Vej(5+H5tz)DmW*$B2kiBh${6)#%IJ$_ zcw+<^WroYTpD*VbL4^!}g#vOqVB7^aSI<7=Gvz#*15I!Eo?8;+gfWxs!mGzfY zDUcNGTZ36p$)E{Ko02X#+$JN79+d*-kpcOkke#_vvrA?fPzd&3A{l;WWW+k+`1r7MMWYHONE{iaL7fG zO;A;?OH~r&iNsVGp}AO+i5L%>ZMVnN((*0wocT!OhLDzPzpR^$omJvx#r8 z!zp=ZO2(l}x)@WLy$I57u1T1(EWT{+>?t2bNls~Hx>7hO+nw1~3YBTjIkT7y!a*T9 zTu5$}sAjAw3ET&F*GpCuG-c`?oGhuVRAk6uQB_#BQWOSys7mP#+QE$&-hgUdiL9|O zb99C=m?fpo(f$pmE8fP)1kuOo?1FMxzV>&ht>z{Id9Ex-PQ6J* zodP3v9%h`$Xct#L$g-d4`Z7EjkR+Hl zDApATbm3v=rcWa1xw)av7wbCDecO3hl4NA!2L&mB<2{Et^`0@fD}eM^6a{+o;5sgB z@v+&Ud}N;tsEVWv$750nDOM`}N7f%z@Z3If)^;_^_Uwf$h0v0+RCaC?PgiO1(o*9r zvJ3|tLg7s+T$J4Pxw+yeOIUa$1)&*!%DTdAv7c0UiK&hsGua?)6)+PCZW9+hNTMkn zfzN`Sv(lA~CBscHjyshbuOd{EDqxb=KiYuEG~qHR8zOvw#A5I4Mb026w1vl5tF5aR)w>0mE<9%QJhc}Iru0EhPuX3(#T1mN8;&) zOw73e$*kVcr0o0{I+kRl5}$vXPp_C6rt@H;@-6>XvNgBi_g{f?2anNwNmVGhyy!UQ z2}mjsrN9P6IcH>nk;!s6FgG3pic!kqW|Yc;bofPQ}Gab9=IOWEoL?%n;qP6O6j;Po$Zp8M1C>2VT-&IeOU#>Wy zkP7o?o8++EE5X53azE{$eaB4CVVsiC>quQR8>uf@iwN1@(NcG$!g8_j@ILAQ7ON&) zzeRP(&{%Ficxe`*K%ETIa4-cCEZTSB<2ym5-1F{x$B4tXJWf#R+DP_LXz_U4)6nJ# z)bJrs(b|IWvz3oX<8}(x(cF8S9KXJUGNV!2vO_j^Sj{5j9n4uZ`gZ~})URk#+PQ-r zCs)#r@_{JLgR~>+yfLNX*5-kI;Nt1`Lp^t#oXupVz75HGtvx&5<&v@iia>DK#|ZPt zrf|t{rB=AmF-*GmdLn{=M~k!P4?8&u&yEM1?UCk>Uc4xdgqS3(Av9W=?gDbM4pX zB3|HA{&9q%SnXyA(fwo)yWsuCZ>&+;0HNoC7(yiFCue&x>t%VBk(d$DvL>#2oJ6*q zI3-CKqM!Sco8Pj($=ryq!8Y)|(JfEXM)u=;L!%oq=R47!qd&`XAAk7sA?M{*-z#k3 z;?_>?HGV})ullo2;o&XnC*Mp)k}#D@4e1*xqO?=mw{+*VP?4dL1K|-NX@*$FF6DNz zNIVM^l&Mp~3YFQ^G2k{rabp;{w+UF^XY-C@A{rv z&hJ zAqYF+pqxS7Tr3sv6GgHhPH=Y#BEZchy^Hpj=s`yll2k1dq&DDsaf#}sy4j`2evK1Z zgV~RSGwF>8@h*&4L_A>b8I2aY0u#|yQUra8_=-GEKA>FFA|O{n4novzKr{T*LCb@T z@tj6Ujl&)cv2s#{%$bwMla<*>flaT9GDwb%C!`>i**Y_t2!HMZu#NwrFlq`YOnu5g zxP=mm)k#i@-|z%WEA)uyGO)6%W|=XI;QNM^pPTUXVBPKB8uAqoE>v)OIRB7l(MNigIDt^>H7*In?Lz2a>D4JtX$cS~{wKqbM_C4nC@iHenA{@e+i84Jr5KtKo zVr)*7KuQgJyyttwitpc00tutr*4ap#!(58YGL^=Ukq`z9{f3-EkB1JNF^isyxaguT zEem@`&|pb4Sm(j$u^A5jRL{aF3HirQE94BxGP$tR+sL)jd1!#}u{#)|WSg>Iw zdVl7ApSaC=&JP)}I>U#gx9Fecq9BM0_?Z zH)LKn(3-7tR;{O69|gC*4c88@zthoCx1D^A~&D#Nd^R=ndsR{3-L_fn{HTj&74ywyO*`5U#gdf%7N(KXYQ>QCVv zH?~&y_pCdYpN$3tLgv*9Xh#p`1*zBwyu(S^)?KZd0g7Q?pyQV%n8~XYN6?hd+lTuq zwEd3n^Zg%$H_FaJ9XhEUYt~qY+4nbaC-ao?A3N`Hkd6;GC!%$kD`F)i%%#L74C{0> zISt?8YI6I3?1YYVzm@;dUz6Ce{9a|Mc%_egOpXi)eg5}uOUwA&{M5Ya2V=+6xsw(s zweDNUm%GC2t+K0@ch25Fui4-o8&*j{d=P#>C0SYqrpx<$ac@=K-rC9bi>!AG<=2x^ zrLFJbwwFg1J3bhPhOF7rUZq5Cg%%puQ{^1xcYL26cf8(i4{&n)(h7NdZRdT&UCr+e zRwM6IcG|Dwwv8?ZceGxI%y%w-5RD87upirW;(!0}$ERnnTUCpi7W)g+G#5xo);&b6 z;lF==(^Hi%syP_HbfE1X6j3C?sUj3gP@C>FXgu_aL%`m=CXGfb@1>Ec4t-r*o7~6D zWtrN>gFt2j5Wyf)oZ;coGQmN*bOnoXE8;1_84gLABRMe;5Gy)Mg zgyn|NP%<@46B%;8spHusHH^}##eqtr)zhHEnrXC{*?Es~`Sqi533=KIRwvOwgj}W> zLfg}#$nQ7?QHy9atOIpgE0-a_=fmTry1+BQWxm*Nx{!Z0jVQ9*hgvy!H$Fuia~{Ey z(;JR+_9Cz$3w2Oz%<*!W$z?33L(7>6QPRPZ)1$`A|Ri;Y5%QZv&ZO@M_d02`lp%Nl7E! z`-y!*a?X=Ds4{(?5OT_^R+tN%x#+nteP>$l)(9Z7^4Y(NR>SfC5COm4`h5IIUVg#` zd<%Vu)Ks(q;=^H`6{aTJpD0W6v*{;(`0IbS|JBC@f_#ONwaPecJ0;ikJhlqW%BPN7 zkR_>Z=R^56EJt6LaV|W3AizBApqM;wvNcPk@&{uzcUK%k^QjSz;Tn!SWR28uYO!E= z8;#Z;5vrz6!MY!`5!-Vi>j!DHG)h@}vEx%r-ou8k zgq;Up#nhsE6^ot+by~^ON^M%_lL`s) zZjBpc>U^*kMRO8^UH=01EQsE7RpH6Owm&e1Q|TqK)^^UDWg{x z#YrfOCQ2(>w3+8hy=<uJY^_emY-jhRql*-p5iX6=Tt*HZP8 zYKqV6IxYjWYh^R4){EE&w8Nzcd(C)N&Plag;!_l2jRShC_M&xsfp&_BR9#(Oq-)7! z=9Ha8(xic89r#05U2`KDks<_zkPu0xOs2pB91#k0Gj~H7ODr_HLgg&|4e)4QzGb0> z246d(m91_X z^(v*Nkw&4^ryZJwg@)`z>;-L5TCu2*%)NPQ2Q`QG2 zkb1{HIBoLoZw&1GA3JY)Uxj4Y@w*th^;{Y(Q8aWhtUmlqnlaN}(;Fyg-Dn=|EA zNuxO|v=}1>)J*y6gZc=9O$o^r@RhBQ_7Lhd9MtS6LL()UHquTW%mOEoilNk*R+ag1 zQR-+nks3bBu}`*^=X&j2`Od3vcvENGT9Mk791`ARt!84!VJPQNJcGeTY?Iy0_T*{R z+x0X&Q|4CKyauA(Q4YnlH5O_pr5KtAs`n4&q%Cdt7Njtvfs&L~chUvQORN@I@^Ov7 zl?I8oHK*R(c?l-)nmi^GU|+COj|S3O>C=1(Hj`eC=fkcXm6XKoBrG<(-g%{O%$-Wr zC4v0MF$S$z9S7R}+AvlqwMKQgHv(aAMNvIr;AqF@*rEG z0f#YLETT88yDo-S7ebr;q-HGLWDG2QjFMVXiA%3>>;g@GK(9Wb6pKgy!sX~nLHP^? zOhzaMI7ot_!W{!<$v}I?8-L}$lt)h6TW-f8mp zj<&xweNjt8X62xm+Jrx7T&GYt!b96PD$KCw4=9#}>WCHbrPNT0I-;T6(Qx{Qu~1-! zBq-CkS7zP%UT9i-%@pCaiO##X`{FMEUBAn$T(PV-Yy=HwWwY-m$e!&ULJptz2+jGs zD&m1?VM&Bu32e!4!4q|NJG;I+J+TC44YQt*QgoboX2&1Qxs6*l+R3cI^jbNEj{Oiz zPy5n&H+QdN=fO_cA1&H%;2)o^Zy@d``r$<2UlN~kilR2(><{AR2bA>%)J2@+N7 zJ!rF21?(>^9^^(jCUVeg$V!J z@tr+*VAkt%>PZd$VH`EX>Hy#LpwL^5gbZ5I=q0nabqWDLgWkdxtU{QLe+83sO#BBL z{*jMr$>(3I`7Rmx4>ih)^Py=BG2rp;>m#d9_q)AEC|%{+qQHNww9%+<&JGc9l>=#^ zkheQ)aYB2+4vq(`UUZjU+lz7@e*G$p(hVT#-@i4RqV@0VzaL+9@k>nSy#h zBuUa^`R`(8;z*2e{gQ9r0(oPvRflN5-up&0u^gMsHxGPvYXg!n!58zl*RR^Moi}xZ z=a0nO`tU|XZkEK5?FUxCROB1`ir1fKz@Gz7#dX;U?|u1?O(C1sfp9afXhp_Vc^9v_ zPaR2$J~;D(@V#`G3(;^k-FZi@VHZn@)MRImw0Cb&G4#VRP8F}}Nq^@|4EZOnr2n{e z7jaD&Et)DBhH7dHSiL4yfA$h?d3Gx$@wnz=Tg&r7FL|F6yQg~JdfGqyK+Wv-?)va$ zILNs;!8ETD*87MfT+r0yj zg>`LM(fy+#!=Z%{DEWMAu!UXrQ>J~u>gCh+ZQdI;JQ;s9S1o>3+SZlE9i5hwR!^DM zyHG>pY37d&eevEk;VkbF8PiO}htI`~CW^!gWb+F2OAMsI(JaH-Eds`E8+&pa8p`koBXovKCJ8 z1;SKzW>*0Q0os&k{BlnvR(4-#EV$jZT~*kH&DY)8E#+0Ru(Pz@4&IE_foOf{P{9B- z(ujEc(~iMbdp*nlfW`JjZ9H)FiA9)EkYOCm%;MeBr7}&Bgvem8;{83p&-#28t6xTw z9v!v4_LIBbooOXH{5Zyw2)k0nYrx~K+`<{??*<4@^wg^RedwlJ$(VLid-{h=gUy?U zk$Umb(C_4m)hEy#rlq~Nvfat|4U@!ZN@^!RXR~a_csv61+8e&F{)A4yXdpS-CGDoz zXyzfcV&28xTzXBCR?`S`vw zNxS>+&nr(1q3N}35B~Xn@G1`XOJhzzsBm_(fY4oemD!xT)J0w`v#!YD_J%g4-oLk8 zyiR&MkfCr*dC`qSdBeT7L{bGRQ*pRcl9;WC6Tid%>Wl1EYoy`(=e4&`J5TC4_(cqF z#ui(Bl5NPU>waExx28O?l7*&)Sxx7be9pHx7Tr&%m*F*v{3LJMQ1r%<{~cMM!Qj(V zV98&BKkDDknp5~NOyQ-beH?Yn8!QOje26rjAVsa z@iIhSdL{zSd5It75e;SJN5IzNBwnBu|Jl5ca^@)6O^34(nD`BhUyL=7vLyz9amc=z z7N%_(|LU;Yrr*fLR;f6Pa`O{GiWC38FGGAjduTC#6Hg!?CbvbJ|CEeC{5T-8LEbHO zjP`x|Ea}SX?w_MEHpBEaqK#qr7K6R+hcMx5#Bu?`QRK<5jHd9~SaIFTfRNk)SB2Vi z@IoWRyi_k*k54LfSCWGA7_X|kWV-gub{oBh&&eh9u=e|7flb;{YEJyoNxhFjj5=|D>rSHv%CW-B`C1u#ig9K( zXy-?FRa56aE@~})&hZ9&zL?f}uMEjI_8Og;1uiq0hdO0Fx^v^_<+4WwPtXx#M}8?( z4oedp`tswnvoyl~{{Txsw7&xG0lb3u_Em}R6`6R86b=~~rkfXY1kGKL?E!hvZ1r8Y zJI&H9Hm1{k6*R<#f~AUz9}V&#WVj<0l<`XOOtBw$Jm;;Bm^q7#E2nPiIqxieM1Vn` zEPK-yR=M=W#Di=GqD4ff>qKggVBft(K(5>)RV#S}ip`^v&6{LhLItzMuow5+D{Va@ z$Oq4?6{kcrdt5M)r)AkRMr+~^(l6r&(j*7Y4Y$0MscfVk6Ghp{;EOR8M&~Wqq zMH{5Arx3eP*OSK^%iqtE^WEpzPZ|CXP26Y^3{viBRV#26@iag#N^36+mJo!|IJ1k| zz*?Oo_pf;=L8aKhPP!ZQ5%F}9R39r04YD9XFL&!!W$hrVqVm^F!XK^6p9$X`wuw;G z@Kzq>O&asmXGHG69A(-dBn*!QVSw*2>~48A&!5fuxI2Rtc_JJ z7eKQLEOY(7_qu(owH|OmnDV{r^ByDjRZj87WhRr3n$75sH_zhwUK(!rb|gFsBAhA&%(>CR}6@%YnlzF*30c=E|M>_ABo= z>eFrsA9cC4vLzkyJh6KV@3S?`uTXj}*6Wfu-q7vkn1F~P3?Xvnf$xSQB|22pFrY@e zJQ5h-;tMpCJ1BU`E<^G+G7KFSg@8SJB=M$OBa{mR@}Z#&WKh5!ncb#HQ%@?1)=vOp ziQWVL?oKb(BMzE^q*jB)b3Vt~Tgj^D3rRzBUl|vPTTGMy)oW~sn&3?^>gpfrHqHAN zHH%)@H=S4!7CZ#tR09`DauDS#fXOizatyZC%D`qb11y%1%!)Jl8bnRP=sikIK+#jU zY8(>fr~cf{)p4e@r|}HjW8ixT$;S9E8t)uj`LUCqku}T0Er#d1{n1nvK>4CiV2rvT zQU)&dnTQ5s90^N6TuAZoD>x`z1B0>_*-^?a``nRO?)JSCB~N<6WG<9a!U($O)ABCT zC6Pn)V=#Se=j6>#h32o7@sW%NUj)szfOpZ#@X+%Ub%a%D+%vzQf%HhVvFWPj#@vu{ zE2Fb(Dh|8Lqv&>@+D`g$?yO-Rf!bVw&9XE_kYalwqag_y+I_y?8k?8JOD)LkFk3A) ze{DN+>VTOdj%6T#uac`8uw+rbcbPXhI@wL< zeUt-oxpU-}|FI2Ffx=la2qjnGH}d$FE*UCPzv;qIQ*sv}SEY!HQifBhG%OB(^DKy_wkOccD{y%N?7gCrjV4 zJqwO*fje_mL6Axr-Ua@?wF6XETEY)OGn}dps)br`VF#l7*6e~5kP$E0AQoM7f(2}! zGew!hhY7(|>|-s=c8|&uZFG70C8TH}#QM>du8lFc)9J%4$YyO~ zP(w{-5Cmk#4fYzH?0tpO!X{%&N>Wj$R}y;*q0E5tA>I{K=@CQ`Z_i14N!ii8qY)g_ zoIB1$_;)=jAQX`p=Y#&5k!d5GV-EOYZX^9xs(XUHfgkNv$$k0kw3U|+*V%n}X3V0J z6u9rUVF!CpDPNLhA4-psrOkE%8C4*&Ve50R_a0-U%|!RFO(W3b z%M^IbMW)3k!G-A&oIMt};8Ab7AbKi0zYLJ?t;55cN$zqFrV>H_wuy)SL+|9Z2>)=(XAc;gXcJARWVV>Zy+rzowTE+ z=jdyZh8pSzD!LmSPKk!}H+Kj=w*0csyg+7hjF&gA_S}Sn|tfVjtnDJXL zR&jLwh)))~Q;xwvYV>Jlm#x@>N|eBrgXg><%^3bHj%KA4r`X@ZYlU95%Jtnat7POj zT0yWH?6EsZWJbbLc}rb$U2Zg=ngWu&?o&oMJ!fg}^wD*uocegQ=9=w!pl>CzC8|l^ z;4zMTa%EcYXp#9Xs00N!qU_Vekrr8Bg~>e6e$mfI_2I>snoNi}{y(MAvz@hR>69TW zQcVC53!0&v*F%HJokBWjEpTCEe#lO<3JHubS312BXMZ$SR&(!5^VB@&bxx@37Z;Dku)W^|L9gDLuDntm_dzzLb#z%lu<>Jf0z( zAsN3Zs0aX68bUAk;dQTE(2kmN>D|{62K&N90 z>pGjc8B4=BJy=Z5C6ltD=|6Z9`bVSA#qKzMX&Min(KEKhyUijv{I-pMFE19=INsZa zXP%~t5~HzKX6kh?H(nMt49YQlo~mmo4XY_3vaOp>oa? zb0Wr`Kqd%@Kww5k-3W4g$Vy}sy#8!^jk}io_O=~xHuz@nJbO~Q zXj`JrgtgH}a}{&77W9ruNKOE-zk(Nu3xI-rl)7e;jcn6Aaq4*@M;Gx0oA4MHoU`C& zRCke`gQF(GbRwa}jXI9gUXC8Q@*yZ9Gl5fMGxw96Wfhkt(((|<%qpWJb$rDh0)7mm zhAP_mc__d)c~ib0PPT4A;7cb00O)u=-XC%EDyWdbqYg!w#Qk(m9ASeZ(?iU(=(?$u z6L_ohrE1bHBDhWU&M!AQ7lSyLxOQF_)x;NzC6D*Z$p_9q%G0I4iK1$_qRm3wyB%Aj zfWo7zb7~66zpjN>a9J`1TIy^u1->yPHD~Rpe3g?qcDgSCgogY`e66-9l12*kF=j69 zW`?&1y=S7-?LhFhd6@L#Gi>f|s0Z#G+pU^-`va^O!T}pFql+TIrk^>TI8ohdpv)-m zzpD+-5L#41a%R2O9Z+gx!i8o#Kddm;aPBT_Gsy2|Gy9>?EYpXP6@v-W<7s``y?@sF zg!%6p#E&qrT7Mp_vU`#n+3igWi?&RRtIGvXvVr_4d(Q1}(W7bCf#||BhWVN~Mu3`} zX9Vx*BKFp}@Hm9x&huK&zC8_{b~VYOsoL>bWM4LpG>>2M#Fw5FeOPdFXqQrF6EQ5y zYBS|wFrs``C=s>Qs53}aG zPI_A0u#*M*2myjzQ8tWArlNBm4U=tmNIuzP-BQ{+OjR2PS?UwHtTiD$*&#AY_;l}j zx7r9{L=90X8a7i1o^5gwD+EK-cvdh zj>?y-J5}J-NdcG;IA0LmaGcs`ZN9mI+q4maW1mbL3U^;BlgBbT?QKfF=2Hy=rzWzS zq{|*`bR~#m&1}$U;hJ9@!({dxSO`538SZ!{ zj+^{`+pkzPfM9=waRi+oP+;f|-4GHzZ(HQee+7vt4Rh_pin0Scbos*Qt|G%S{!F|X z?#IDMxb1#QDoW^s_8c3060RawFuJuK;HYZ0*g4Wraq8ocA*m?JBn?xz0=MO=k(PhcP2voudpiYr8ftX5DjcMYF>bam|P=cn3j1 ze#4_q6By=J3JFmV6wvfpnkwQez^NYR!-o#xOc30hsVV z(07$|ALzPabPaWMmKs)EGXB-a1fx`o7DJ3;SF@$B>5tTb2GkSqU|!~gyP?c=sht`7gTSCN3VuELhRT$fYVk)|Zi%9|=79+lo?YJO7&a*JNy z@~g&^o!umkH0~_&tkNd}<0b4vQw89buWc{UbL*`^RX|U1n(rDhkYo0mB(KP8wdpLF z>K2poPVY0xZ6xz*}Q*61o@4-mxSf4^Acg@gEP?CsJR&)eQc^+mmk5-a~uh*)i zrxzAgS9i3&nyctVXKMvc?Kc4ruBCoNTlY~rz53c%xEc%jRAR-}iyq;xE%l&=fS%#d zsA8!o&h9^R`9pE>Vp8bZ&v47wD|?_gct7AnK2<1Oe=fUNJevOILbZq6w+m!CA=J}k zsiWAPeY@M)fSj;o==6D|Px0KI*hz>`#dBBnq0`ralZmlm z_VZ9y$<-6mqb3wO>9wJ~HV=vxpFOSrriyhk8_T;K&1oP+_Amn8O^x=G1d1D9xuMebe7#Io-}W!n==GI6du6WYr*q+{c&^K z!{yxb!*^|6k{P@XFOQYduBoDAat-K39Y@AWAB4`K)b^X|)2CSbTPl1(4=~1dcMN6}srU?a2E)|miJNmG?l=)!1nGYqN^|DQGFOc~o zfbBV_H^29O+$N2Iiiz-R6C`(!mNGGnyQnA+FVn``S^vFmC@vWvZUHZVkIN3@SbDLZ z`AZnnnI~fOc6;UVV+7f~;tYYq;G6b1c1DoM+jRB!U$t%`_iI<3T1Mcq@7B9rtN^L2 z1eZ5#CW~gCtiGpCGXdx8&A&!oBqrVA@7KPPXY}^H1OPIoWJjo*lMmwrtiC9`W`V2D z&LXyB+ePTiAxH^^lbUhdA;8;(1T1GidZVR@Ct@GJvZnue3=MGy7$nc>nU2tvjL1e64+wuRyZOA00WUPhK8f4hEedSZwT|kH- zioEkcQVudb4cV&RS4|A{N@!gh)WHr>Z}84p>>HJJ)WM)Ggfc8ptDDvEl~umD`WtaN zK>W|TcNsc{3$K}#o%7E3A0@e9s3=*P<*i1sLFK2M%$x~*b6g93~s z#P8X2abr?eYx!Ew5&TOaW=r&HChu|j!25D**L{@09NH^s6T-I*tBYGJyFe9hdRD39=3b6<4V-wej~*vq zPY>RRP8^NsG3{vEEf{LLPE`i5VCr#od`o*Bv_GQK)hsOc7T9o|Pi07oq6cFD(O2V? zdLj~_>CJ=-^7OVeH zv}q&i&#=EbquaJ!Pi0=;w(oa)4O{E)lOMWIK6BKF-;*xem#e#lJ+4tD1@C98qdBHr z^p>E^8oDb##9te~#h04n-Yy0$|3SK~^4K`Wy~28bq0YuQa(gr!wPR7|p3cX)md7cF z6NaiL=@3nZQbnO!nH`d6C*)x5Ag{V~Zn&^BiqoQL9JdsQ+INTQ#lFnJtkdY_b&Tlx zwbORSdmba<+xu@fkfQ2B-RSBayfbCrHm))UCt0S8PX9Sr)SB`^fGGmJ!Q%HRVeM(r z+?;ONY4@4NSK6K&-TE!_xX+5%MgjcEXvOun(|+cYd2cm2)HKpa{!j8^yTZ;Fd0-@0dlL}=Jh5k#*477Q1tkY+EBO2@_||QmSTAx zlYDVLDT6@4F#c_3Q0uiR+kSMzLa_$YEShhQj5CW6 z-eEaUZ(O`l>1<;4Z@8xubLxgdLu&8(XFyT#sQ*7JI~%KSF>Sv2c1EkgzZTZ-%B$t5 zuT{R)H0p|lfg+d93-M(u#JCnNaWgF_5Lfjw^P=>`q zxgq<)i%O|dx#5vj(i%&H2c4c>29!$(cf9$~PU57KQU0yRqge5W#qE_&=EgkY)LFPq zypC@B9Oe{4)@+-{6TGF*xA{;`WMLq?Pc&U?{4QhUt+2KpjCSH~Nx zma=Tcl)?9UPuQD>oz>(`pUbSAXl}7;2fq)@o;PLl@7f4HxY41Yy)UKoLErJ;`7Ms~ zVll^i0NUMLvj)97ZNWEvIAWFvr36DQvt4RM)8#1;>n^iYoV7VfJ$qA*`FsNemyKx_ zMuLA7_kBmsu3g6&bZTfrjZ)OwzNrP8bsn`pmb=GPH7A{c1{ABcROm@;hsqo;cgeu4 zDu^$LN)EHyh6`%Y$oC_pIB}vcbaZJFXlvUXfmeX%fq5!YYb;6l)%C6v{8@%1-;=7a zQPRQD+WNNt31qPB%ADx|zk!*9+g1;CQeAwq>_kl3WfXQ%5o3qOD~tor?EyKO-ko0F zMz$PQ{EUUsc=)xc6#0+L`kW7G(sHf=f#~!+FAQ=BeQG+f^}J!IfI0Kr7#h+@L6C8C1$d~-c6f!~mmu2Q8kEvc>MJWp@^QQKJ9qv^8EN`6i?zKR3qv2H5KtKdWb7M*pl8#>* z#Ve1dpR%>qE7M#Ze)i1(Wx|ck!juJ+1&28S|iOzRan{5HA zDQ4*@X!J!y*5kUDgpm%=9<* zzY5G1<=Qp0?xq)qrfhrqXf*khprU#kq^ET-b$Q3-XK$ZFWkAgAWJkkpS4uDFUEkV< zsCIB~Sboy1a_uh;9$|tTrzWG*Aldd%@z45!+=wm%Ng$tiHJs}R=b8(jiP3~-R{MT8vjQt1tMI@Z4an& z=jZLUWjMn1opXDI+>%PNq>-g{UL#S_HvOoyw3@HM?6KdQLjogf=0AS(WgTm_GOIY_U(j=AI9A}__5Wi3fA7t`|6BK;z5e&`|FPfM%xK1Bp_0rn#M2220wzQT zU_^rmiG+qs6EwpzWD%qxAk5H-ETAR^nXxfSOu#WlMFyEMFkoSns7h%WASPy{HUi?07E~kA>Wy{Abob|O$18)D` zVmL=*9^LFCcXIS_mI~9>H+N*AdDVe8X0KAUu7%jLr-#MTu>4d^Qn@1CQ~K*+_Lo2g zqo;;?5=sz+jyQo{>j{Ps_(zOz-;#nn1nMaO<6fPy9YNmxzj}yPhoP)Jjjr8I<$BZq zdTazK1)(bZI*jmB)VH|Cl~9Q&;j@nOVk4g}9)pRrnUxHIWN|qNS*W=e6rXOyc)LNT zkD6&09l9v-b(n}RS7dt*vjEq}(9cd?)PIS&dlCCuRP&g!W-P?lngCg2v(tSMrP43z$E%DEURrH0JAkvu8L6OZ}Hg@kpX;hQn~@{SlUG|ZPK6o!wv zJiJ&8y6nwQ;2{uYiXKKVXPXvt{Jz}QYC=+{b@Fz#9Jw7)47K)*1qIoRA;>*(r9TPW zzu6QX5<8bVRM`&>Q>Uvi^V#H|HAWT?TWx;D6ijef9je9#77bGaHu!87{fF4M%qBXDbdD@#so>pz}UXY(}fQ9_D$eMbsx>}5aqw?JG=-_NfP16ED5 zlkS;IVx7d{r^ce)JnXlqzech9K%q+>y*7N?$k2wzT6?Mr7LJX>y%!Iln14Bv;7pR| z?<;|+jjORW&-r;?na>*g`xwd17>VX$RlJyJoPzZ?3oULE+h^O>S9UAO$QIJUwm`Fe z`SYGZn!>>PJDKlmt<6JbgB-o68Lo38=E_(lKPj|{1p6z)MRh#hf`%?E=;0yb=kC3R z$zouDjA0MNh*#BB#eOOCe$1?YKEvlpuoTHnx*12-r)Qquld8+d`^}&0VG2O8kb_!rlxiI_$LKfEA+lDNew!4Z7F0i~V`g!tR79K3#WQ-O}oCJGAY)F4fT(vtFkQU%twr#?xKw zei({(dHmK7V;j@8g8JH@WK3~;{W54zs<3y4 z_}~wMiANN&m`{#QN_bV*e&rc33N;fMF9Iyp&u>}Ab~N zl=9*(>DeOIPEo<332t@G#oB{exe2q-<%X}BK6~!Qv}%x)q~kmM&eLR-9H%jk?r)XO z`Z)FSqij(!cf=qNlgBQcx!b&;JRb0ZT3BSx*M)YYWT2M?W%c z#}~UyeV4y4sSJ|5ZgiFK9Qt$mW6hq801u!lb9%K{`M5WfIPpk2R=ZOHOnOcXh zsZ9-!%tI0x1Za>=vdouxezf--_c2el{=%xFkn(xs!KZDb_|*&e)Vn;IJcz;4oW4e^ z!%7hHvRB4C;*H^{0p%$8<7*R-(HGdfw$^PkdoQ8_voLK%m|E2*Fs+%P3-<^h3Yx#as&q8uZtB0B-dc_(YRz?_-L(~EqZdAC79gbU>S}p; z zl!#gCJCjwqDVN~=Vd^PJ=R#zuU%TNo(Ii&xZOI9J*FV4Yy`N2u_6 zsjV2L?Kb=f93 zZeanp7?RG1sqM3X^b1PmDEi7g0e+V%t@NJnDX>z9${Qigy;bUA3f8##hg&#p3h=BZ z$lLGMl4Z5uZNPfu4U?+Y9KuUCy5XKq;jJrr6JIk?L@E%AV^1|^EZ;1@HaTG8sv;oq#|HDbdlQ`|;AL{dqi1l0O`Cd#qt zRhIF6n|ItPwgW(XgH8?AIgqGh5>5mkh-~d>nFB;q_rQz#6U%m>ECNSkjTdIA9n6el z?@zO7$7MJ_j2&lGU8#gLh88g`?LyBq{ZloTry?C(HzCTTN^)C=iPRMWKN`-?(DC+> zX!j%Qy^@O}8%^&TW|>pc(}i6C4w&@!`;>Q7@mMGz>As2|A)O#D?SVM zHR|Y01WQfbT$VM^9HJ855O*k-Bsk;TqUZeHsysVJz||_+uQk)en8Y+K8?Iixv$A|~ zxW8^s&h#Y`sy#np05h2@>(k84P&Qt*VC3oQBBzL+s;M~;?Xm7Ju7;?St7_@3>#>{u z-I8A`e9ZC68H14DpmJ9bHG{+!FIN(3G8D_i2RLtyg4QsItCUhjCL5FAbai5RH(k8q z`FY>AzVk-L9=p4uV00_-NE2xe1bBdCzRsTG?K_eM>(F!YuFv4^81y5`{F@E(45`_( zlYE`ew*Q6ZMZUVBuh-YSbf-9#(%wPEFZTo$9=N^wwRKlAXjgS25{!oI&gn$9vnGb_ zqWS&SjIUU*I6B)>Q7Ru=MTfPbvx4&uIo>nvXdh>Ts|Fyx(R9zVt(_q=ib|~%!9o*^ zUowsNp64x9>!^Co)#ih1Nf>?_pHGCez#K=CVb?5C4pefR4`!7^rGUXo?M$Pj)X8xR zm#&Lc+E%I!`|IzT#^Zx`;};i8e9&H&)&rMra^w-CKd!p{dM@4NCg{$%K2KA<=8uwl z|120)Q6Qi)z9tDM2NbtQ6PzrWmBcewI6ujUjC|46w%@xh%K-M2HTbDx#r$e{)%D^xNAyB;!j7^Q(pxWwXmi$M^0sps|h zQ@X{FGO^2*$9?hVi3*o-F81ujd+5!IYO&v;dp3M;)ORhf!s zIWY_wm<1SKv|fz~Tj#z#j?`_FgF?ia;i@1SR){0h$u4!;GPkH-AyVJPjmz= zu+>Fc&7}owUm0k@mdU`u2bJcv$62vfxA~%Mv4+_N^&3BXhDw1NMY@nC{5}lynAhpF zx}P;*$X-*2F%yuWEN*cHb4qVWgPQ=P>=urJR2n(+Y@R#2anEz7NU?Mp9cr)2$AwXowvd&VEu3!^*KDP8s&snY~EpZ#7bN*mI#1@h)BgUqYE8z_Xca!=Z|uvl2}x zV+2p&gE#W%(%iW5Il-ZgO||B8OZ37;(Rx0d@_s`q&&eEB9CpI?hJIZAV=-{_?-c&X z+aCk$9Qp+p5)r-c4J@;*(c`gA73sohTLClQLlvha$ViSH1A$idRp!^xYp>!EOU zms3L(0T1l49Pmu=`^dB}t(3v`LnTFJWOE!Gywx@%c{#c^n^M@#x$b$R^mAf0qze5} zi8Q)gJ$ftpKT2=1+vPN~v&^i~)-_MT^!6tp_ZFv|c+{SCtxvmQu0GNrGmbxeGPW}{ z-x=4I8IMOExPNHXef*LjWu~%=;$$Er&U5zWnI%Aj&N5tD*Y}aPRlq*BoZgR5nasi7 zVC(4UCd20AYSvq;Zmuqem!$2u#V{%U(WUU5dm6iHt*-@rbHElpW9FUiKzU;$3H3P~ zQg@%xlP-H}NSh9JI(}B2@5EKdOATa=zRgzA>(qTE&w4y%Kv^e^yMA!D2Gtp~F<)Zz zMy$@Y*ee_&h;|Q=Em0t-e1L%%PDWT+Jyh%SM{NdFr=+6Lp2-%BS9r zJU8PvVOm_78)OA;6}^C~d*$9b~QDV0INHs zZdYzKI4VHah@%`D{dtMY$*ocJDD3vJojRKSeEjMs>Bb8ELIuV1ExjE^<$lyISe-^b$dgL@9w&vRoviIIk*eZDK`2? zA;7|YrPnw*K}>PFX=CH!m#L=T05Od}QH;!a7~Cixz2&;-1;%o5qC>?sMO9hj2lH(O zP*JDEl;7B^Mc$NfdOh)uxdD4nvG$)_FhCyqWIa^aFg>f_{(4zU$rPVtE0%j*DGo9E z>8X!Xl{}^;VD-D(F=kGKG0{`uAm_UpQk)ma8t2s=iEzivfgL44_g(FaD{vNrdt;Ik zQ3^YP1n_O{5x}D^-o5wA@f*D_W!nb(?_+T4%}^ro5PKk2HXw$MseBxTM>4w@b^7!D z6@ASmcFQF*#|bzX?&hg(;ww^G1EPWqunX`puXbkA)~ti*MU^D9ExS1Q`htpQl>BS}u9w+V5kpb%N$H z)RDU;IoUPPV18ws!6+pU|p*FMR}CNl64s9V>A^kVlFmnM_r9AuKMCK11aCoN|2+Q^awanFSWTC*)Z_+;=-q zULUDwx@RqEHH;1edN&uz0Q`MAC9*p+Dft}=4n9HA9DY*X=pb*Y?>1gs&Lh#DRx(Pc z`gGtKDuV{M5%YQaIqEG)L;9Ue->L-wTTar4o-6Z`GjU7~7yd9-Mo55L7?u5|>KLJ2 zD_cD)ga@ZbD9?BcQV|2UynelO@pDy4tddw#>`q%|8Ul8;ZM`$8{IgAAU0l=P4I$GM zj4}EvMQ;<^i)~=%f#kVip(Qvm)r6+GD**`JjGWW# ziKL0l1-SbrJG?raCtE@b^HaAybK^NEjxFhL>faRtBY(FOJITm@B#pb{igSapq9AcI zY#0{kB<}|N58X^>x~n&NGXxRG^Du8}JKfb)=`kBe{j1*9XgZy!usCa7zn(j0qqbAig^p1dXA*MHEwr;)+Hm^@j{sClL zP61wJpUwrK{<;JD;QUA5fS?Jaf`-~At z&kI~&I48SY)H2<3*grbZa5c=zHplI1>+?dUJEDoG^vdI`QRtkG4_yNp)P7Qr%2D5_@(MgP9ukkcQSWL##YeYM>=b!L9vY7gN4HV&YCgS3w^87z{c4YH zquZ$V>OLVy;HdTrK9xt8QTQr9j-&8Ye$hwAsQ+L6B$7!afB_){k^t@kK$q(ua~kJx zf7cVJY%Tn4?LI1M100!#2>tHv#<>dUr};OF#R^CCiYgwXT2Uu|?;f9jxyMPyKVRRM zV=h*ayyJoLbls-~8zZ~NCD-}GOawZGR->K|$16@1>`DAcn_;VU-&14aJuc)wW#2zz zr*iWD=%0J(LIavA|C~CeO3BI8y(IsV|i7MRyjur#>tH?+xEM)CpEU(oiY& z=7x+Mb^O8`xE33UgZ}aP)u~c;#j|8;b~(SUTrjMBtL_s}!%l~#>73rHx8ktQ+jASQ zvHG0vQ?m+e-|xyfxiR2CIRXIWN8lhK2sawGJE7C)iJ;mFKH{rbs9<7Cb6c$Gr_yxj zFrgf11%&SnKCd9d_u0&gzb-0^_ugwWyJD^lzM}M5x&20#aJtlqQ}42%I1`0!364>c zKjM7@JrHqDgVUu91<=6|vmAe`8?V#k$!jnsW_9Dlscqz_QPxekb7iW#&fHE%3*o2o zi~dJzH9)<1x;4uD_`@LJ9rrng4AFfLGq({5FN%X?C)lt|YQh6`DA*Q`6G8ccq1w6k z7C>oH7DGIh{0cV!b0ey_3TqTlMY~o_j?uIZ>TrR+hF>=^NZRx+uCw-~&v~7W&`|If zMJnDC%2$%V6)TZ47=*&29XX_N$K)djb_lpLvW+6rcpga9^z+u>^Sz#WibpVG4Cfi9 zx-YD;P^g>zJ-n*xP)-^~5t;IRO?b;Vc5`Dh2|pB;GRk5fc(+BH>sade$6fUy{K?a?`SqP!uifq9p5s5x^{ zwqs*dsNAR-7MXcceqVwNXHaDylPph5XgkR8FzUoqM1#lY9o=6YIzLK7gYzy4;DSuC zRCgtZC>J1g4^8z*+nuWOnOJ9I$hLAGiF_t#SArM0d&NpW9CsTMX-B}lCPnHL8*`UJ z1?Am4Gm|cw(a9KO9zodf-j&_|T^G^jw!`eA;1sYP_AJQ4*I!=3{7=bjq9Mz<N zx^*m3bI+K}2ju@BqPy1=R0<-7$te!)Vl$k6vJ?+~ zAq7BoYw^3dfODy=PVPs1ExW;9q9B@^%^<0{tP%2{#c^A+g*$c**y$%Z7g z$gQ3DIWBxY{kP{%>5P`V^BcG&EP^cRFIaZ0>A1~Z%!YeD*Xd)&06K?TFC4%IG-8`F zO}}R_*j>glpY{Drl+TVT6hkGc2UeUe5?#@Twf^0js z3v2niB?<2)G_b}*MJYh)4v30cN)z&r63&59fIiS<*nf<9`p3UjIRNkn|k5HF18=5C7N@$-nj5H zCS6reyriCk!}O?cOMH77y*LVHi;o>MTVfN5@VYcrl~4UN^ek~tR2$nS`f#*hqqZQl z0tuqtWA%2$0hgJv+N`JiY6GopIda-fF~maUX1O=RM<~xP4ikF z`lK52WwlMr(au*L=>|Xgng>S!nz;oGog+9MlEQ7;KgI!JKi_%=$*zx=8H5?w_q4~GM z%8=z;INF~YE7?FXfxAr9Nowt0cSoqv^a8!DF7G(4K`{H~amC&>?cnm? z!*yR3EIoDG4{EKqad6TO@7_G`VdUOqH7rlD+~$W8CVLceSTdsX+EVcU;xbd_K{7^r zC9Kb{{PjP;rF=qPd-ig6ks>~u`)XqM$~VA}BBwWBHF@}5`KvE-LbT{Pc4yr=Yt@;& z2F7f%Z$9FBhA++HtcOE1T7k@nP80qGQO4LU!3!QeQw0ueDA7UzhC zaLAT6q3kE-;9Jn)$3CI3ZR7OR+-_j2A6lg_@=w%O?Q(gY85b~d6xC6qB_m9}R`%{* z*|UpP%IRPcC${kwc(N@^SQlc`m2ta{cvo%%A)Yh`U!F0$CFif?h?rrxg2D8iqIuIy zw#WU0OkH?BeRqhB@G1?-ztw`CI+N3dJ+9}4ox5y@SB0I)$PE#H6ZcZ*!R4C2h1P4p zYb;@6#AkjB?_X!6%rT*Vxw#`F#HF$G3Qz3Ya{0WAY+>;yu&^rut@;|*RKSJxmU-eMP?oz%Bx;+Hc1%kyP`x=}1Q_K4}yJJ{~7mJ=ayAHByE$2TtxZQ=Yj@$ah|(gzX%# zf?s&jhIEq7d-3wemv#&2bVM>u>sBkNvXu$%!!20vu9Ycc;r!NQ&Hp|&5Vg225sH~# z*(`7NM&LSzfvkAqb_*b23#f(E`BRmZWBREbX2$gIw;m(uKeK*$`FcD^{$S%}X4rd? zav_%$1#H)6ld&&7%GRgcz00j5M8igc@~gU+33D`w&0d5+hr zTkXvx=;$E88?ee4xe~vhK}6&Kv%L?mw!<&JrZg*VY**=Fs1|&%&U#mqe0|8KGnn^o z`FB$bn9wJ#hj7aLpXIZqmE6T}44@gm1r8ScYqOCumKB)EqMv0fQk3Y^ukHtgUgW(m13l3@Qj^RR2;#! zhH-ay9bAIDyOV+7?(QN65ugZ`qst?Dp~G44Zkk#8VT~cXa4*(&j)+c z8Yuc#kb{1(gJ5_1;#xD~wSOBlyX-1=YkW(>E2S@oJlkY^bvf2Z%PsRWD9$DyTxCvi zcS#~&!s|=xy{4$ygJXzmUQw9BOYqH(`AA=YZf{Q@=pm?(E^5?XpEbNEAmhYuD7EK>3Robk)1GGrXcu#m_~r1&;Z!!vZr{{`&MG zW@A0l#HyrI^7h>1>sV|DN+w2DVcHLcE#nFKU%4)Vib!lLsRKNmz{-h2kDT;^a2v+^ z$HnL{0yYj_b!%p0k`~jz7E^3^baS!k)zfK;OETQpk+kNTu1&v}^G32w=EXMZCK}<< z7Yprm4a73B6J7<0qVvapUjU*0p+*T`h(O0!rZ4Q3_3Y{EsPJxc|13yzKh^PE`M9_r z><+fr?AQp*oNoO?pT3;V^n^I4=c|Bnef~D(sP(>CD_z!du~=6UPcfSkj~tCn@!@it z^tE<}5c%SDYF=Jk=v3kreF4?rPl%{n?ywTy2X)m%nqjyN9VY!*Hi~6FO7s`G*|Zi+ zN5qI>)&sO4l+`S#_nq`x?@02M@>lTIXLE5)J+Q*+dD>&BuPm8SB~w-Jb^F$bEd0ck zI-lg`)38yoOi+8OA?wb?Svfhp*%`saZ?8WFHRP*jWT_>KomSiKElWe&K35V+fpaz^5^ECgmu2*+^-yB7(`Z zKAl{sMoc_WM)u##CMH_mwvl(?>EYRqa@~JI4ZrIO-<8<cVhafk>5dMdYCPZ3GnKj+Bt1v|Z$)f49nJZnj64c^e6CiKa7Rq=GC>}b#ZWddMG z9(|a|MT!uXTsR?Zr;4zjY@>j*8nkLzgk_C< z$ts%7u;&x9fLbvjAs}Mm&;7yVgXjPPm-lM0)m5?(`l;)#vA!c3Asux9b=2R)S zUa*jVW#;8?IUN2imfVL=2OWJ4jKV@<_D3hZ(X7vZLP*+~4d_CjCvw3bD+m;E+aU?V z9OWSq5m0pk&T_>=Q|6ERhnq+fETkZEm+ODUk|p;aTfL_me3Nb(HD;U^&%9khX{7Ya z63tiXrO#F!17CS!KOT{y^s@TjsM8~CjQ{(_6dvBx6X&|Mu&7R-O#bj=@lEUQqErs1 z0qyhoowL9BJV@4gBv)1Y=kfedK)(x5B2@?Gz;;zk(MS5E^6l^o_N0T*#Rl< zK2wN+7!6vUE8rPhl&tdZp+PJxq?~&c`sPE^P|4e3dpIJKcXIQEv2YC5>RgJH23)p> zHC-%^6^u$-Rrz;i2A3_6fWlp5b`YL&pwcEG{Cfkt@BG{~XK`8T3eRlR^{+GGvFyoF z4tO&wZTIiIP9Wr~Q$|8zlpJRForpq9xDgj%KC_#sXUEe53$CWeyn)GG{SfMAh47Z{ zeBqY(565lepk^$3;Sksc=#ag=@Sx5+V<)5C)#Tu; zZaFpzdY}b6Ve~}0IHj3FfyKknzRsLpFFvU9Ulo}-#dST~J4`*Pv|C1mWnI)C~ zp?kid86p=oeT@=YqC_+3C-aBNeb0mk-zl#HtGO}gIwucS?IMC{w?;dCl4zUA)(wa=*Mnve!mwbLDmN9Jb#ihm zn_iDmm6bkJPQ!$#o`=G;eUN#W;L}d5;Up_IBgMVUBN7h9yWInuaIA87qsET#ksoCf z|3q(Wxz0E)Uc2I8E!k8fGg_Gus;P2;h1u{UztB9MmnLs<4Isa`ErGj*Nzap|B%{xL z<*Bw5ljC*YIAzm0 z&s(B`W;N8L@;wSQ=+5VV^})zS5wr0iK=+LklpZ0e8t~?DSb1VjX9X{KG)F#ds(Iyh zESpWQSpQJ>NUX>xQrM0zr|2cGZ;5WWr6_oyld5_8-Aw{tVkuy@r1O!>j8{?-x?tX1 z7{qJ*Mrm7;gn2qR`CPo~_WHR+UcLo(HEtOcH{==9i27p-DLVaAep>hKb%8U!D)BmO zSJ&;PgsEo%s9PaZ1}oaCdR^Z+SnVyILdS3-TV3|Cdb6Ghrf^u$ARZQZR3|cDFwG&C zIVVafa6zfDJi7-!;23o!TT+zTZ0St|fAOt>_0*z`W|ao&6KLP!-GN?!5Ph>$wp`CH zv$G?1@ZR8UVDckqOa-MN2?!xGHxB#ui`qXYwtsp5U{aTXtE20iOj(V+Ac%*#kTNJi z=RqegUALY27jMhy9yTlOsr?nee71E4bS zR+fhMBR@sGcIrkplr>q>1tT{EFE?cWSq|HvM6{446zXHRcNOb+a`4=IJl(kAiyo+T zOM0zW_4WSnCmL!?kM#10l|CR&1$l|J7qo7Wy@@hMBYyrn$AEy4mY0qC61nM-@dq1(CKbO$h^EBDpY@l~kLoc3@AX=KJh5`^ruyZ; zJF5?F2N;Q%?$*_)WFu5`W>ALdyybdiOP^#A8(&@JVe#8LD~}*?KpuN zGMnZ3_i3J~6?+M(9h`wPZHgUHSVa4HNV|owf5X8ps;BZh3K|C&tJ{S^VZk! zPu4{U((ZzS6e1Tt<%JqH`w-w12$%oF^*tJlR`EYwtQhOX`aL)8_cW^Hj)Avt-lmr4x;kiAA zwMDeqses&Ajy*8(vi3XmTx*Q`^_$AJ0#jL%bSy#P(Q%!prGR$wR|JPd=USEUU=K;0e-c^yVe!f@!%($_Wx`Sg;@2&Pv zT{oUiyG90?y_?arHhou#vL+r{ColKakeoRl!~Vbv`wQRRZQk3a{@i2Vrc(6&yDqZj z=>TV-+}N%8uK#vo14#O6YnkM`u-NvI*0Is>2PGukidgRdagntm#!t7@2BzxC{hwV0 zu7ngTVyY=F$#lzb#z_Pq7_AIIEcd@mD@6gpCFz#cR>aK2a{qG>jWOr#x{+;OcH`fu z&&+Nx{J3Sy1FU%_uiIts=lAbj>zdxV^6kIB@#|(epArM%$Pz9bPpKL0T)!#Xzw}St zJDGQ^J54od{nm1SWpRJrx;OA}G|237g6N-YJa1;;Kk@eG{&5PVSzX{IDs$m%Nai1# zHc|C3QFiI*u}Alq>OF_pA8&8G`qxeSwjC$4WY3qmFR!jTJ@f|#`Ws)jzp_Cn99%zc z`{Z42%`0zDpZDD#|11*fpEiD3DS(n zp-~U~gYumlEMr}g+-Rf9)^*9{-Pa!q zv@{uvjI}}4jKY|LYe%IJWSI_){K>bS#L$Js+i_vD@?c9wq?y6xIpXZbI7J~Nx27tOrq3&85<7;4E56`_BQYGsiR{@uMe?og0e7s5nWOUM0YD zIv9Ypcx#21X4<}Bv-4BX^4r~Dji1w zPd!C3{3u{i6`Teirf5qQBk_?WqrnD*Y$}R#0NL=usSyZs7#nDh6wS)Rlt=OO;pm5X z+`ZOre0PX(=eDo!p7Iw!t_@0V(@_7eLJFDPGBUb7vE+B_)4d@9DTqVhb365G9yd@ z@OeQGP+F{kG>wBsqRLHxN~&R@3$}2uo|$dz6jl;G$dSwVTK9BO3a7-44JMLdMw%&B zGPlM-dbew9pKhU-360Z$3Z>_IYzy*Usl8YlOjAV$T5Bpe@>s!5rok2e0Q)U>Tzsu< zxbt4wOxK!Xslhr>-e#2Qk_{T=Yu*?TeIuCEEsv?xrD+W=RVbQJ_(4Oh}N zPG`+Puj4atH80T##V_>5)M92Hvz1vN=MDZqwskmVP-NrBIkWyX3+NzW=e(Zc54(Gi(Ynxe_sQ54`J9pK);Yh|EJ&^McohWlAT%`k zfJ>|rsyKJ4U7uWc2@7|V&9NG?+cAK2J-vT=d#VW+fDF4&g?kjXw`WJYjf9hE7`(ma zuC|o^3;39W6et%A$9i7IChV_uU!MxjLmZmptWVC%y1S3FKp3aOU0Z4?Vv00ajHNip z02B!vFv|oE5|i&@H;4)3Mw+GkmEDN5(P$gzB67wf|ATpHH1`=~=Y0s-rU3~ZZ#_+d zx!^ezV&a*xWpP|8)@HD<87;vY!Vpws-tAHJl!(f3KF)?6m zbwnZ-(zuL=pXup1vye}X58<0X$3d@bs6fFNqH2}St|2nuF@v?qc}bJ1iUF;Oh80- zGztd^3(mi@vKRyoL&SyUG%5jz*%C+oKtD8m{MB6k2M)&uHMb8?z1OP z{|+pLnQT=WyHu*wocwb|itF@ICYipi391fzOG8K*ZWavO1Wpvquy3cO zi+|l(ntx~dOd5^GsqvGaEOxqTEMR7e2M)-P5A8ccEQM_b56#Ufm54(^16GKMgiFP~ zhLov;WT7o-3wWNKRk6d#E-PbYX{M>POBGJJ-8JZSeQ(UK}rq9#)Lp-YG5|X`){5!;dUc6hu5oOPC zVc{~4rc$RWSc7xut>G4QV-!X!a7M*C7Ck0Tqk0+K^{NW8RM&;ew!O}iddjwc%v^&E zdYZ1?hOQxk-#|Xj>pNbc?(4ooMZlC|=`<4#wlRPp4bX9rf|jYNzyY)wEaE;Lo^wfUzaOrF-Fsmu+H=gBH&x*# zS=*77XPYJAvX0VJ)2FDSB&j~2I_bkI>6(mToA*IaAm`f~VZy#e&%3KLj2n+hyzlXL zSc_)h7|Bu%xZ*S!{ypNS%qPF!H^Q>L@m*UN`A;qkkl(hMdK9Wu*=AT1GB|OJ5!f=B zDXbAdB)ptY6L@h<&7`KKMQN51f!kSCh#--3-tYc}PtL|J78Qwh+`Cxt~phb??V{&gE1AcTR-lKvP28_ zQs`Piu(Vlc7i!9oaZDQ+nrZ^pXu=<^FO$9+{fZk&RH-r5UjXffKN9f>hk+kBr>q(; z`^6U3d`wE;C3ATL;)GqxH$Go)L6QhwXDe;zB`I&kqFY&l7|6vjPL}e9@$oT-Edjq0 z@Ed44q!O?ZOvyOfGrc9PYzF@<7G@U4wjyCIdqKw8D{xXZiFdMp`&vG)M@ve;NtB?g zN>7DG#6e2WqfINv2j;~y2cQzw6M(6y7HKW8t>yIU;cR2u9r!kF(xe1Sdo(b>busm6 zj7!Z4dh&5o;wI^SIN>LgIw+#d$r-?BB~hiMjb!?=6~;F@idp&L|2AFnlhv=wlvTi! zFFq(D@RZfSJ;q;n|Ls!1Bty&hSD*F;zGya<;fdJXN17A{sTB80!*Q&}Dv-^i0|NBz z+CO#-i4za`E`FlrK#CUA2QHp(xTEmK_$1&@dxOJ4{Pyy#OtP>=mVf-Qlj=?>M#24# zf8RyLvA6a^@9}BMld0%V#pc#ipU*Yh-Exb*fkxdDjX>PvbkPMlz;H=h zS=Oq$D7)BFr_VfDR{nm)ab>n$FDFMvW^^(em@8?C3^#n71!IQSSI&lAF-=Y6Ti0G&ZBzW5gM2aQTqoUF zpZzwn3e8p2u6h{MXij+%x~BGL<>Cmvk9)ck30W#G?4OK#Am*+;vNj-$Jb4wW>&+Ht z9UgtS<*A;YRN|elb@z|$o2TRB{mg=05IVXf=P##*t5R{Cc%J()j6B&jDZ=f?Y3^I& zW3vUza~Pm$dmYud#8VxwxFbBnO~^&m+IZDhgW%uon+AU!nFKT3PWLEa z*ZrT|FqC+53UV>MjUA(g*Bkx(D3TgD`${&BQ~#jd9_b zuyw_hbnX06-{r=BUBY#}y}inBS&(!Q4LEhb0Lu&4q?Po15K*>fL0{_{{P~3=SKZ00 zK=f++T^L;;JK`VI+Y6mnq}^SsU+bPp9h_DhQm3&$zL6N+Ab!tDLy&MZ`Szrm2c)Na ze|sDtT(AmKUF8REd&Wa9J{U7<=<9dwRiD@`7kiBOt}oJ=pKWy`*zprj z{xBLo@A7EzyuR8H?!JJyf>^H&KUh8~&etCdvGYmK>rvs4g;tigFA}be=D6EtvV^Xa zt_A0My5^D&Gqz`h3k>H#ZiQc~+snV=*X&ovzS|=*LY~f*l2QeMdfIWzrOMxjcyy{F znv?5Gr+D<_O5(Uw%9!G~8JFdN)&6w&!%0uyfIaSY0~MqiAG0|q-AiQ50v8@4}7NxaQ|LRW3-%;%DMJa^0+}BJC;dbo+SxgX3&OH@7V)-L=X!~0yXJokrcxFKC<4hj7wvb znZ+t)eV1SMfN@hijb(F++On>!Wpa#nDrI42@A~sS1p_S&rp=PMQ?{6^MPaYtwVGr&|GJtA;|{kTSRJ&Fz@)`vI{*u zo$gj!Adr&bwMW;+2SI4Ft0zmko58{};-U;v~tA4wjmk-+#&2E3H1Z}WQ?5Lrb? zeWhFNTfgp76zSqSm6-sTu+{W`;$T!P{rGj>_+4k!=CuzV2R@vHX((9)f)ul++N(4J zuC}*$5{g96FTO#*bKYN^y=mm+2&e5|cEs2%i$O;0*U?k$khZ#K=J#nDJuX~EYz}%U zYukuY>S9g$A!<$@Tiaa56l*T5NDgzr=L8jL`q0ocZVnkm>SjAhfMdj@0yYmUj-xqX z77#Ma(>#-arBI5CHn8^d>wxqhZB-fBSiU$~D`butZ4@5I8AVxo8URir(O@R5Wg;|@ z1gkv?V>~vtB*zD5ihvbZ9I4-M>}BBO@XIL(1&48-4#}L=o*9({SDV$`8VpFVkdosh zq2X~%H3v753_GTW6U!)Mk6K{Mm@AB<0BB%IRpK~F%);>~FL>KpLd%8;1auZ3= zfMwV+a=iF3x~+<3&+%0Q;Lfk0a2W|9gT)#2>hL~aTPyhv3wIT~0K%5g_%sQ`dhftZ)PE2Uto8liJKueK&CtDP>P6Az?QX#z!X@c*N9gd2A6aP+>cwfg4iS}>}?!qUp zkEc5O%+%f=SWxc<@umDD{C6?LMDXocHvcI14mPLu1q8zBZlNeUnpSI7i~0nHHg$9S z&IV6_2nN|G`7i-Oe{no(lYzX>$VkvgQgd2E?>mXyx6pr^_ zwKrq{QTDU<#RC@UuEdC@KYl47bq&t;2-u=WDOa8epM+3738vBg3nw7`<`j%+BkA4bKnu89_`yZOa6lwQ$=RY3 zP9&9njP4YJM&XSfK%FMYQz)6_fECMxxSP>Mfn4ZJ zEetb~fOG!c%5_RM#PqY2X`N+$j2jAniI;)gS>q8T8T|6KXlfns<4L$H=SNltN@dtH z4GrPO?0c=(F9`A4bTe>_`Ow>rfn>cxg+7||>8~`rVelw_7naeY!GO{!=v(EBg!4Z8 zKWD{%U9Z-Yi9MU*0zV!b*OQ?C&8tyEY0R+B-R(YdI&x=q97lPh{>xERk3~Gpf8HSL zk}6#lTsk2fP7%OsL#PDuOApkgEzD^8yA4$)Rc6u0E`}F7T3HiCDR?;biO!?^Ypx4l za)vNX$0}lqtazt9Sj@Az)ub_HBfaPSz56Rqh3@o%r7pw?=Qi!@4Y)qsLHv=mnYh0x zO0;ArBoV_uuCI>V7Ka#ZX^QZL=o$WxRjko$7&Off8VMu#Bv{6=#*!)%T4d-(d)nf| zp!zK`&!bzQoRYZhF*F>-{uvn_E;eTZE^RN52+efGyEt^Kzi_V{#*a?2Nz2seG~|ns zUcOU>Y5Xf$SRZ#eI+}M*O!`H7xP9DIf$+K`+*eTq_*z_xmcYaQqaC^B$ZrXDhgCWo zre``eECgc}IHl|#aLlMLID>>)KC{q2$Fbd)=M43QLb@(+T<{b8K52-EQBN)Pw_`DaloJT?59@o zb(`w(z5V0Gli`!5nmV71|#${eMJ)a!Q4&vwHt^#AhN$Q#!NWLFw%O|Zv01} zNIN)#IZFIhZ^=h8f||?--7zV(hBg0tBw$FHYi6!C_^tqk@DHOaP$H0_&1pAT={~aD zbcLs+B46DV;q23)IM%wu>;BW?F-)}+OVR4#cw7JWj&n7j0*|JbVx$(H=OI{SpX2k;#W=R`6 zMA*iqJ#rlOsvWFZEBkJt#S6XID@?It+pOKK52j6V7US&>!3{xqq;U)Rm>>9SSqypz z5Fvre%=^=Q-3ehV2SPuO79ZYU2#WL4bBmuutzf1)N-kHhke$slkL=NSP|$YltkuFp z9~PGMt2Yu&CWciN-SDIH=u?d5&)g%`AYb3Sm^U7i;=)B*`Q0S~&02{sj(tQdP&u6H1K|Z}=M# zC(10c9CZEOECx{_vfli61wCpA%kXAk?lc7^hV*Q--$%B zbKePF;_gBUF_^&R)aEYM9m-++=4i8wPLKs-=n<^cNp*bFs>2-}$ZJh-7YR(rvx>pV z=5|_H0QQ@yR$^80bcM!w3__;mrLb)Tf26&YGWkm)pCC8@0$CsS2t#N_B@k|bWlr%& zw}+U+e10TIUzxLaK(auEeIb7z3+I3KdtYrisjQ2qgSdxqKuNngA%Dd_auaJ`xg^CT z?5oxMCSc2~Aiog1_B79p-;4cW0QDm#+{Q~^p3q8`41Y+mCv7hupuOVLgISUTl%uXo zx+aFh-t&~~I?Z(vh=8EmsyPgAT(LE{D8hm0qs&T}cMkdho_C>)0iw7|VwS)bON z#MSCb_fxMYX-4wZYi6;D__yz=OGu0@@JmdPxot{$V+PJ_C`gv#iyiY*ro%Hgpx=^_ zJ9+43zYU&Pyf7T&qNp3CU&v0-FKTA*dvnT$hO9U)?JUvG|B5Q|E?%@p#8ZYx>l;SrzUZEJe-74m%}B1&R9A`=zRtr_qusl~{5 zmx3_lb00!p5*&G9biWY_0Zst02m#HHuiK_YRcHQ?!2Q5xiEVRqPVAVxULzhYECbfC zeqzOm0BijWy2SK*Qv_g}wKG9DxG|d{LUOyde^a4gBGcv7WbVD1x1$rl zvhmC2hWt@C>Uf8}HB9kWh*cnpk<=08o>bpKX%}6D_<`Er`kYHDv{L<&_gH$Dd1R3> zs&O*-za8q5&B|S|{ieAbuUMqvqMS4IGMtTZzmCk5xfBJUQz!!ytx}M3wt0;7=%0~1 z{NjBA%6|I@b!?x^e5Ucu{98A0RgLn{j7Gqmg>bHmrN%@T(o?O==Qkzv$8qloWYq1K zyPW^7#1$bNW9}+}J@yF^{dRXU$u{Zo=Z^p3r87pi3lB=8g^#U6zjlFF;a^Kf5Yf(M?2b{7Lw%lMX%))( zi{b*&2YOHiRG@$K^eGHw5cFv^)7jQOeCGD#45*XwE_Rlo5)cw>lnWpvmktrR{`D)L zGT~MUUu!GE(OpZXsVbA>?-)tg;s&sX)0*`TU~9wl>9oK(=oY+AN%&ir_GC5C=la`z zt-2@0!%}ws{4J7j0bp=2MD3g5&byjyCS>=>i{*_pjvM=EW?4NgixYEVvGXuPP0&w#IY znHcSu*4lcu!{=Y+`;WH`c}8_=Ce>MJOH}`UO(Rrt*?Tn_t`J*OaE%-JUaj#`GFDPB zSI!7`Qe%Mx%Zju6{pwbzo8*`1nRWSE@7b(Yyq=#Na!>7G9@?T@5n?Iu zb|3*>NU_8XrL%B=@FAuYC5BT!(){>#OOsi9#Tte~_jq_E#wx2NowU2^l zSNMfWV+8A8J}R4%;Q#s|$C2>yfl`k2UJy@1VNT zU6qr(S9aXqU$d1=Vg&U9d>wk|q4rm{x<*@N;)AWx}37r1L--Ktce6nNWfJh&!p3-&RgH z;*TZfSJYtAsm0Ltrz5bkAERJwM0;&A*O4n1FjZnSDE?bi@D}cL`Yz^`=;L@|ZJfzM z{6KOhpDm@(H!7KEd>-B@&NN1GLVSHlKaKH>k!t$q+#h(=R)c9$RXNp7GiGx2d*Tmg zvgjPjT_?{B+A(nUP{RIdc=elnvbB5We4b6CWosH$F6StEj&;w@+4G^%`sTb+BRk7_1#z51*39oPXNNchojtLMTnXhU^o`0e^d}VJ<6u_@plVtW6}bjil(UA~_01T0G75TI6-eWdvx{vOYn8mNLMq_PBL=9A!t zq3`(pby9`<=e*~QqJWjfxU0i&?VVgsE+i7|1U-G^iiJ0&H0AXpP2zO`7P&uwj6#_H zORGQ6n+V2?S1VEo5wTGznvCxS#opdgP(nYog$IXAvZl{a|OIk8AQ9XFAY zU&W@IQQziZvnr1K?fk#%j0nyzNp&0kvD?zGF2DSI01ZYpC;4C~bDbz-NeGgg64BE- zye`F-3)l8~Z!GX>R&4@WBN@X>88h&f#$B(HL!^#Wy{jed4XN~iVCrpsol4J`{n5gKC!(q5HC8eA2&*hQj?Cf5+JN(~`wYnPEB` zMN9r}83t-WM>gwq!r@hD(*1UO;vLAZ=Gbk^`+35lRR3j0k^Sit>%UCta-6XDTYQOn zG4eiG#A<0)jdW@TpN3nop40`Ci?+Q`_Ai!#CWAjIrlWWL^}(*uNEPEEum)+36o*wH zfN{_5Crvt2pB&R9eq>LXy@$2TJQ!5zwIrWmJjw(AUeSjI%$V?*={ho&D*}4QXg&|z zRJ8D7sVkcC9mByT4Q2l5a>vx5U->gE0rK_1djT-SzU%(CO=IF@FiIGy)(Y(U%EV6U z8*U@REJz5TvzjjW4t0LKa4gBQe!K#nc`(#!(|V?>Iy2E!AxZqcU z(+RukMu*!-=`OC4oy;qyDf^{Nj za($xPw8urNJ9fOP4L*3!D8^iHh$|C`4(VoqNd86ax-T-{^Zog>p`Ru;kELq;jd@=0bNFvrG&8k#>FrTq+(OUC702U=_HW%37 z3#4yoJm?JDKNe(DJm4Jsv(^jY_x5++5>dAexX&zKpiQ7|nLp(Y-3{u@OR)_7SQiNBUSh3!IY*uZ>#bkf_1d+^kArs=#*hajoMwkEMW&;_IWoXNtvPNTY#1@ zn!=z;`*C}<7nPTo5WeJsF%R+b_Nn?da=x5m=}JF@rJ*$;Am41B$lfCUl6t9$GZ?|W z2elt~>((s)o#yj6+WYS7ba^2-^8kY6;V$VpqiC&)*;A;W#y%mSlEAE*sk}#wF3gO5 znTrfX8b(YqzJ-$5Xkb78^&CUAQEK^hfzgKQz$1Kt_A9CUs5 z$vyh!E72$Kmq?ky81wls1V47_)6^!8BG;Yo%K;tC|NLb?`!^7}ZT=`Mw(Fuw65Az6 z6oFI3sX6it_W9YzGMw@D$z;=w=oR<)B@&v)B_`OF_ig?MA)W2-z=^ahK269UpRiD0 z7OEYi305*#;v3sF?v0#@M=Jp6Yo6EWqF>Z0GR)IK?&lr6LVjlIT{q~on1mDLqO}v) z81=BG@Yyx0tgM3@U!(1~I+XF!AhKciYne76ENe4)U=R2+K?L!xtEo;?gemG1U&4dN zj_P_F1)h)yo(pX|lkhAtxpdf95{)KKCkEW@6KNN_+*QTKZcG=1H* z2`?h>&z%^nKYg@ng#7p%EOC-wT)yL=2w64qj z$65%GO`%^3xpQZW5hzM{*k1w}Y5o;Zipgp$#WeMboG!qee2S77ASt~m?lDJ-)m@hR z#Dt(udXK;nYLg+3D+g7Ah+www{6IvASHdhogX~EZLQ*)?mdmPs8D=~c6-O;P1Vvv1 zr*Qj0dHu!I`bm~uGK^!+0;*DCPXbW3;MD1cyC&h|-R<)IoY0)ag33gw)FC|Dq1iNu zTHj3Q;=rw)a1lCSvUn72Qh@S1EWwJ)^YfJ@HBdRm4qdW32hJ$pr%jwQ9hbm1+!Yl| zLe}tivG-w>(r;w&-X-Bvn4)2fvEsAb`6?4JokVcS4U#PJ!JhLU_Z!M7HYB*Aq$W|3 zaBB~+?ue%ww?r{!qjVB`dHB;lv@ls2-oKOexg|u8By?vcWgxQXW(DG2$kUP9g_KOH zlIa}bA*REgQ*C58+G5jZl5k}SB*97nog%J)P6eRpTa4|3y^bP@M=Ym}c46LUmTIgB zI>!`B6j+94v3+!GVcZ!aZN|>HB*!PCEL+Sz8YEQzbs>XN>_}SS+vVhe+G3%z0mgakQ3Q*J&kat&>#2 z!zzl*T`nr=sY;E%<&j*+%oJdrUyHGTt}3cs%|DxM@G}0Ux}Hm5`A}8&rFpKKr|=yA zVd*LH+sSfDIxF@WW1{(ZW#Wt&WKtj3JY7+S&!=0YLX?oOj^luE6fulUrZJ4vNdf#9 zFXl2p{f{EZvw9mV2b7~pB?a7=ppp0qiL27HaN@F@YizKkMk6&8NQ6UEHXFq$My^v* z#_zE!kw^;Zrw*0&BwsV?-C~%7W2r15YPuhiCxV}iKQfcGKcSk*K`&u8T;XobDH9r&MY*FBR|BE zKurX{vx?ns-dM3hqA|f8&ORpn#{!F0Y zn+cTx2Pqgewr6lcBjf@NA2mU`Cs&aUza`+8D_43PwelygrJKMC7~3csS9QvemWUPM(wYME_C?^CY%Wv)Ou@^-|= zN4S?xLCWl))@LL%T?_Dcws&B-W~58ef>(Dy4>X&|11>378aAC2J(nmia*E;$;@KHC zs|_z@@9D#MB}T5uyvXBq^xR9fm7G{4EQ?~Yab4kHZTR2R35CLjBS5t<^ z?vEuIEfO&BfZr(pUN6FMRY8+2K?+g0(Xt4HKzVRXxvwBv%C>?=kf#qEeqR}XAa8vc zqx$SODoN&Qs>>aCS1iz=^zHgfQ99iuRW+5vI=$`@+G_Zzj=8*^RuPx=C~>!r3}<}) ziVO)28p+@_PK@Hnoswvhf(=vzOKmuu!b$=KHLM88ol785@cin9o@h>V34@Z6)EfQt zyj#H27S}K7v}p93u*h_6vH6u)V5~-MteF@UGR?<OYGEKNL0WIU=oL3N^{4`usWL?e*wWt$;okZK`|wUte59Z^1%2R|fofP! zW6-Gqr3tqfJ>+eks7_mCZ6S;Uzt9)Q0^lfH0xe8W`yBt>pJfAPZi#3_-A%_UB~WiO zAkCGHqMRmFRlZfkbX4Z`-mk&5P%J1xe`QoosuVNQ{vf$`QAzxkuGf-35z_ARYfhOc z-^}Axn^{ovRZ%cZz}D5k)VE6f>$!K%emKHp9f9w5#^Kj*(3~8|fv+R3m$QO7sbDUpbPQFF!}U-Zr+ zIE%1Kw5`U&1O>FXR1&F`PBhP?p&@jzh+Qy4ccLACdaIR5x?sR%av?wQVS^RxF@-3< z=1KB&AmpD{heY&$ilKi4Ign9jNCWS(Vhjj*J$rjUfT_7Lb<-zN_75@KYU`nAg_PAZ zz8M_+gGwldzI>_$5%t`WsU8Gf;X2r9ysH{JHB=-j{^>ikNRm;%W=LBU+3efz&Arl= zBP5m}VLbZ<99elu9#uQ%i=sPGD%p3Fb3dPq8FsP1YDCF)+9O83j|eVs+xVd0dYZ(; zV<%ICFP@b{q`m6o8vN{<;e-R{`7sM!D zpd_%!rXm~($>^a68Nemxmw%nTmZ53|M(VqaZn)WRR7E%ur^N~|!wnWoJNA{wtEnVJ z=6_=6$Il}lAdwR&_m(Z{;pac9pfCO5@xv+qtOu>Wr8i6z<{N>DC>3fJr<>-A4r>WE z*Cr0zjmdT`x$vkj1zL;nts+U6ovmv$*C29a2iIApaDNNq1T_bA*&q$041A(ZyoU$E zBYFjDdPQ~yRQ{9W(NP+AFq81oW(sv1Eh6@am`8zrdrBb67w-AyOL<@Y&&cRlTIJv4 zcYWyQnbBSk>`Avz9a>dS7HUPx1!ErRz$;(qF+-$+~ve26cp0B1(%IOKm| ztepOf0|;fj#_$qYu2Y=DxQVZvKRN*d|JDNTAdy$8m9n+8O^%{#w&83jZ-~#_Z z3VeIg^)zR*g$xn!2)+!=UM0JsYIg9NlPmb}k8Ox6a!F39T!602S5jRGih)CZ+%WX6 z9&5O2o2^`sLak*=m$KfQ9TxG(M*AkR4;eeXjX2`(eiDi~F-C_96eh+41W+HE;tEIL za+FgITn5EvL-kV%X2i1pOLn;05&L2{iAPnZsWgrxSs*VGho2QU_I$|vGhdR2g5y5G z@ri%~!6eQ6e$DRrMG+gSS#y2JFUq}ITI_xPrSH$}9(iV5$TJ-8C=?AE!X0-qk6GvF zzVvfa#=vhje_0jF7aFs5=?oz%zGR|^M+XY=+$6X$36x}B5tC6U0kMOP~!X}iw=qj9PSTEisf0AY?A)HTR zM-(+F=s0Ro-!aeDKBQTcz;(%5jY}{l&F!@sJ4^YqpG!xg|6~fjp7B9;(Ih;*kn`O0 z7l;9gQciP9(~zzP#qe`d0KSB{*`H&9{{WRhYQKCZ4!?+v?tp9Z$tTZ>f8d=7^9m~@ zBg`SVz*@m;5=2)^PlLG_;nnMxroKkQb37_}lPe;SQLs^W2m^$1hOo&`ZT~74{TB5< zXYay*JBQ}rf@{~7&D@j9`|1t2^ED*!b#ZX4vkWnI3ga5HAK>*S2m9E0#ZadVMC6v8V-o5$AHn2 z287q^{WjgjPyskJX1w6V=T=M$#t6@Q=99KbMH3DeTCe5$FrqAHJY&K!Gf*Ghh+}~V z#htXMX6Tpq@OEHiUTgK`V%`2!v>_M1UOjKIor-k7V+WRkrpWm9Oy&W16#E$at=*Sv zG^H!6-6RX>#1}l2_uNXmE3mVSg6UT$9rAQ6h)h@WaTY z6uJe|Wd99X8Y?Cc$gw&o8ei0!faX%xe2N8Zrc4!j(lX;nKU10mIDdY2s97M;(Adn* z8J#@}moW#f5LnQ$4BZoFY#?CLkeGJL_W-DG3$RA1RB!EptEGGmNA9Ou^gCasSP!bVPc)0)Wc-`Uvb82fxccfsYoCV5tp7)2Qz@? z4N>&P_sZ)s@e4y*%MgqZL^huIO!iR*+`iS`ssr>O9dYyvj0eVmIf57Z9E-Ry0dAe-j zWF#zRL@|fUIrM&xI5!#6-N0p_7_#nGIzjnm?I&oHqoW16m1!%bPxrET!!UXy|51(( zTP!azK?h}>t&dKeq`)E#IN485+cJ9g(JVkao9|5aVE{N2@D#lV^LQ&rQwV;)LQCz4 z^uZVPBffes-4n1t;^m7vjLrOVjGwTxtQA)nyM>cL6&O8bPE5x5})br+uB8Q7~_`|;FwM(y? zeb%oWd2rg0(o?%LJ5iP#RRO}z;~xYBJ==r`fb7vQz=N1TDv6{PEVU_|84zDzKhH4` zP+Je1X7U0Ic?O73ULA}$=1D1AXy`kWNO2L1$B$uX0+NL5`RIb0wI3KG3gd=2Hz^u0 z3%9k+uZ&DR`m^>=y$6PgS_l;Xzo-@a5vP93HU z6vP}3GvW8&Mhao!$Bu2G08fmm44D1dCjkr;+$rx&9ndTIGECm;aLy9u5ID)0+38;+ zK0|mbIhg)x{s9OgB9?&bEBHae6|4h+_vyfW%BpJ$x#{~3Ro0Yg%4aA9yqhOVWO~-@ zqHwe#HiU=MsTre&Y!U#8iVOD`M1cGcm#0q>12>z1*XOC;m@Z|T(3LD`!X%I`KZ2;a2VX)AFa@}FjW|7@|pym2KRStXyd+%QXb;Wk-{t?rqcWUb6l-Guhd$VI?770GOL;G82# zE9wwDe4bJEep8GJ!_V43>>&@fK^Wgkc9V{5i90xqDmc>Ln-jc2{7WF)v|0OCFg1 zpKw7U5b*rF9d5$h)om@+Y?U8Fypv|DwFbO@+nzMm*a*~7UG>Rq%#Nb`5eOHT1~$X= z%qW8K3UN5zp4vJ@FI z@C|r~9<@Nh2vT`OfwdYoU-nufBB>;iVwQZ;1}T><1Q{TCBeHMXN`b4!GeUUqcwC-v z+7z%O^$vThXd1YKF{GJU1Zl11NV@e&qt@$~!aSocvKuD-u+t3sr5FS~K61Mlp=!A&t+-D+ zl)U2y*ihkC+>XVSJzTjk~K1mO*V?Ak4*n zXRShXaLx1jlYKiOOksgx<+uh$SkCp!i=RuCO{ToN6S7mx7lxNK;RzPKzdi}Q2b#5c zq#LG|Z_yH4BR4dtynyqqi5I@k1t;v>V1g|oJp#FaK?`S!;nD%MxqszPsE7_%@BMb zy#m3@^O!tc+*b~i+}^$0UGHYpm*_m=&X4MbbdaecIec%EyiUvB;u2hFjn5tpcZg?a zzZ8$ryxE2CVu8iizGfdgHx&TN?-jdC8o18f@mIM$KE_oFaQo@O6M%qm&9eSc)8+Cj z+=yNoRX5qne)2-p#Ew)(jz3qL@&kJLcLp$k1vjJ?5%;ZyzDb5SeQ2u>b> ztUW7G%=l-yH5zCP>J@W$tkauY#SJpIWazCs_`OYF)DTzpAj5NZ&X>Xx*A@?` zhe%Rl*+m{LyqD)sCD3WKKB;JSbH|a{>)Pz*pm*XgnE%-P??$}sqg78F+oNi!Ez~4}c%e>mJu7K$m{t_0r{GG!LxrVt06a4xk+;R$?2`e7~)pWjKd-l%1rR)09BIb(uIIij|(?xYLU!0@! zlzL?z0*}s7@oGPsqxK3uK}Y(OeBzINQTWO~8Aq{E^C~>rk9MQosP$?++K+alzftED zdler-qwkb?r5>3_^b~zskBCwBN<1YV*+=Y@eX5UaqtB@GYCW=##8LOkKBY&rQR-BB zX{mpDe# zrNS2Oex?lhyzwmhBO?sOVQcYJY=T^~Ms+u_}EFb=xzy6wJuy&Jn+ z?{(?i`~p;9m#W!=gzr#bCVADC%d?ZpB;PR_U~PJOwx6^Q5oaH#Xq?Ehed(Q7V_bwuAXFGQ8BfA$JE~M{{@<_Y7Oqe%1fjV-<&Z9E! z=Qmx~d$q;qNh{s$?mOp>c@*=~_jTVq_p^C+1D%_@bm8G)bnfSMexCmQl0cCLNit-^B1lSLU;<(gL837z(M=7Qgk>g) zgv3h`n9R~5!a&lBQJ4c6kO)Q)u_$1W(=a9_5eNkYhHRunX-L?D{{wAp_44}d#m*{F zu0GEncgvx9%mkaAF&hzgbeiS45C%*}u5@#&4qe@GpE~;1&GCH7CrhK6;EB!Hp-tUm zum*z*o2ii_DT*a2ks}?~0LC;#nsc*9UC5B0DLk%s zbj7^sGu_)Dk97BYo?iD(u5UL9>A9zS*L%y`)3-~ha^>B~zB+rZ!{erVxjVYV=TS3r z9dq9JzI-l_@1DJR(a!Il@=op0BJR0MBfGBdbEFHqiFMpj=X<(q>f2dzlzd#3SyJo-JHkV%qN}k~ zj%8oMkkjmyQh3NGd=&lqLE2KT6)(u759P$JKlujA-{38xEwpTvg3?uDjjU{AXsl|A z#x0_ZXxkM%R4cwBh65~|aTPD`hZLO1NwTu>u&{)(} zjcFn_Ha4SCQLRQPtXoEvbIBtT=+RYpno8gwAdpyB;=M*~v9nq=s2Ea;F&2VCFv~`y z0E+^F(uKim7_Rp+=f8Mdvaz)d7fkl28U z48|rl1X-~{3R5BjU;>1spvhwhm|v-_s=I>(!X{BLK@gA;pn(A?nq?U%(KLe*L~P9z zr6h@_nUstOgra2|5lo;;5;GH0Sd$P^XpGGK{cUZ(=x@xiM2aMeMvzgH43rs}M8J|l zA~BSVfPzR!GZP>&g%~qJjKV1~1lTE(G>nO21kEKBgwZe|nWko0H6j=$N)~9t1S1m^ zEM+N?5DPG5ObR11O$Lks5)&kdKwu*vgtCas2oVN zIhmVkGC)#_BA~Fu6co&mlVZqI8H^hkiAYJ9J9pO-Px^h#6KpU@@+l=74YbMeOT?1T zfhi_QWCD^tK=}jYJdg>b(gY%kMWoRIe0PC-dFe(;$3@Vl>#v6rJ}D?dB!W|6q={vC zl6;aP2Ep?|BvJtaf$~XuF&I%0h-4<>hDhKbl1YR{$}S}eB@j?Vf(j(4nPH(CJ_p2u zBJ=S+1{UFPh8hHxk!XS%4T6+t!hl5xK?S7>CK(^01_R^}N)o(@4FXC?NZIisc^J?V zMu>tKTRttZ=-VkvIe>q-DNpVqfthr+OOv=w%cg;Wdlk5 z^(y+1KMetae|xQdnF>h7B{EH#A|#YaD5jZ&(I!k(CO{h*grFFb2w^g6WfWxy#1ILQ zQz0;rvt%kkB!ZOCA)*ukij<&4(8Nfnf^24xY=S_IG|>$u-{Mx*)xTG+GKvueftwmg zAWa%F4AF}un211%02!dm0!*n>M2RvIDK6Gs1d%Bul7$(Vq{O5YCPFhwn3hH|Q!!+t zBqj|hkYo}iKt#wvEQmmnObL>N#G+x8v53fNfXPAp_SJ3w?NwLl#UJV~N($R1($+1u zq$13*VS$LEkim)#C^KRrjKax?C<2THL|X-;L~LNpj8+&#EKr$dw%XfoCMvJ@BtPK@ z@d;3LD3hxIpAb?<6q-#8AQ)b`MQIK)qt|QB5+EhC(D`H4+p-69lOtGbSj=0EEdSBW9}Y zw!e-kU9}yx9km^`9km^`9km^`9km^`9km^`9km^`9km^`9r}*_M}DKfQQxTV)O-4l z{Y&?IYW!cvh`*0(ns;*-HOsq`0kE3y_uaX8nF{4|LA>1M<}YPMW!!SO>#}4_P*Gyh zPVMF5_g4eWT(Dst>uzrMdR}nXI8e;SZHsGHmw`KZDLo8B+&fLREfPs6hDm}TrbUq{ zAqZkdjUW(!12rNN+=WRW1kX+lUC$PJW~pcX|jQ2{Z4#UvIen2<_DB?C+rOiDr+L@~2(2qi^% zD1KuYq_M?8_<6%W>dd`%Kiw8-AT|OXqDLzIqDVLDo0yXTtsCV7T4x$ zZMWoYzfPh^h$xF07$l(qPze$yHj5Bb3>7kfkWGpcNg_;UieVT^Mp-DLOHrW3j8GDi z1sfRy5wK)2sVK;VV=@RsNn%2iN7cHPNeq(|jfjm>Y9z(61}qdtOj2eON+i@oBx(f3 zMlfSzOtM(iLo}3D4FD8l8JP(;^3|(t`HK9(G&4+5rjVu@NX(Q7r7{Fk%`rq75`sun zfMQZ)nn|Q2$&jTcBuEG%nn{ZwNkKsaN=cav5h$`Dq*4PENfL~t8IvYR%1IhAKt^RG z$x|{|fh9CFF=E7$WXez@CTIlGk!fM16G%xD1Va!D{A+64^&49LyH#4vTl<9@Vgn&; zV?|O?Yv$Ed+UC+xLe_X%A+9mCO<}EGO%eJ?tFaXyT~hZDCHNE~;)k6=yR{wKkAP9# zsP5EvYCE+Z+Lz|7tMGph|6g6)z#LFrqeoeuIN%o1Q&=QA0Sc%5(-EZ&_os&gIyQ7+_@J@ z@1ZN+o!p5=8sEy6$&Oo!2?5 zmCbj(>hd+syDlWVx?8U7k*ktdcRQVP|A*=k7T>(CS9a=QcXoj1G7%ag?%^>`yPUha zyO(o=uI_YcIn6t(x^CR=baNW*7Y>wN4ia_SmLqpv$m~QAmv>#;hR1g#-Q6K`qKmrc zc1xYkopCoioQU1robK%D&f<05Ai5Oj&UMKVySkS-a_;WTkmomd0Tqmt$UCUOo+0G6B9`> zgb0cR$q@!*MIk>Ts;d7k)o;T5BQq2dX%i%dY>=e@Vn~?G7>fo}vXTOn2^0v7qX-Qc zD1cH5L|KSsjA;l$2{8l-AZ&;t#9k^)Ci!|XvV11AWCTz z$~Fv1qd^-RA|VzdXemV!O(bX}(+Gl$VKk6znl+IyS+=z;Z{0Nk>+12W49$~aY;9Xr zwX|DC*2`wXeiao~pm)V{q8OqQGX{hZG9+PgRN2?Qn*0z#C;(If*IF`2TA!jYO~1rdNE4Fsf# z6EsAMAZeH*BMBl5Vo0y(EkWZ|M`o1=L*RC+ZMJI~+bE5UYQ~cgMxxliRc%`?YKXe|*~B-A2iiYQ5pX%R^y4ABB~4(>*`r#*Jml`^?Ii@kq^xH25HsepiwYmH{?ugc|_r)(pnVf5~-t@^1QHYZ*|k zr|R5(I8pQNl@qk-<+I+=M|#S;?p%fDTZ4C#HXv2i7x!?BzStExETn(XN-^5Rlsnux ztmw4$!&y%|jr$KYZ|D9w3c&*;dn$3~T0?Zq!g87mU&FxTNwybXY<`AI3zUc|m`LV< zut}^?J_loTVa4A-$Bg!bPQ!_i*!CdhVS+l&c6juP_KFX*_NG0`(H{bBj4oLL!E%U> z@o5a7w9#fp%OAq1h79JcS`ca7d9BlX;RA+s>2BT;gtJv@TxwT*hQLcM(;e@L3kWfq7Sl;)i>GV|*_`#-$i{yE zg23B)r7p=8Yp|Fg39vv=Qa-DMO?h@-EqzUdx%&o8WUF*cHpb|Q^weoGTG-Ta!+`HB zLnneZ0xBv%Wk?IEx&H}y|Hu4$u{53+bYuQ|P;0}V^23oMpNt@Q3&H#2Z%ZHXPOx? zPUP!gQ>#yVyY(u-&~1g?BxBDeV}2$#ssHMK#C)hw zu8zFM(1jlK4e6H!_SBO<0SLA)9N`R${;=Y@D(;DeR8b^{&^n~JJ>tNo;FL*5 zXy4L(ymFz|RDWBn%3qEhEJgI06W}#<99oPco2~(zSfl&yU$IJ~McbK0!Rz!K%je|1 z&zUE2_{Bi*ou83g$Ww4~Sixf+T8@?99x22Wg^V_x#c*78Wm3~+dPtoqS`Kd+bewPX zi@%%p&0He`iP=Oz;ydpcefQq$DJ( zat)Y5af%kCVIHUPA!Uo%^{>a+tw=dhVaxuU2SDQOrj8mm%737{6^kPq1i>pU z>oz=2>MbAsw3$9y2vz+^)#`)A@@#b%h}K`Yy)u!hDU7#-;)T?7ZQ$1b3^E+))b++Y z{NwGQ4gWzlQ~vL;~TMxk?wa*<<)|Cv(~Zi zQ&KE5b!{l%9_VTXpjE%d@iG6w-pGMTY(C^eBB(k&aE%SQhVU-xK0sG+SMLNrs(`bINOl$|tmj`t_O*>by)vvhzJ&!y}=Sd%}& z!EpoJCYw24hz#%E7CLgaF?%)FMu~U6u6eYYeg}GrC726%J>bb}fIjgZ47qdJZYyU) z)3q~gGMqc|@o3ujd}4;4$JEoFNEe0a&JRXgRXq3S+<(j}u?f!!t_HKWvQafTN&0Y9 z6e=DQ&^NT#9`&f+f_%w46uqV1abrwE62Y7is2mtj6jN!>L=lDY}*W z3t|ssYmPS))b3!)>7XO*sZh1s;xWb4CgnCx z9G5()HIPaXP_AaQ+Z`P0j_BRCeTFMUR5O!^Ixg2Sz#i4U-L~)g;2AALXfe@J04JUV1Q?_L;XEJ1eo_*l83x=M&|d8j(nKs_2?PxKot{I{3eV)A)q zu=%wq5Wsl_seG#d%5Ky$TJcNnU-e5E-^S* zmv@DxcS?C<_SM!{?u5As#t?Z z2L+!cEKUroBcdDdk}U#@)4XbJ3c6p1)eMx3FJjp#W1li2vnI6L)3ipJBr(F4jOFJk=M?DoKl|4EJ_4wBq z?W4_TfiYVJLY1keZuB%w^lNFP85tFe4aD+pXYjmMkSgzFh+vRzpJphABmy+to9)>p z94#PM>BnU6aGJ*QCVlcsv2w!avqR9p*2=zzs5YJNu? zV=3m_HJQv$mt6gq)@Z|Uu=Uy~>!z`3DOFB>p-XhLqqhD_*#EQCI83B5qUrPPB-&N| z0^z?58b8(7f58KFRSeGzPAhup{Oh9hc?T!mYRuavg44FWye0v(ph-)r;DNsb zu(92wquIv24FM{xUeBtUMih@MN>$9XmXSv+k(j~s_FWjY>;+FXj=k?37anfguac|8 zCWk%2P?Dqv0rX9uim~M&Fkj9!uAyp*QRi^-9#fh3x`?8AzE9!ph|X;P^KhU|>FDwZf-1RWPZ!il?=W1_Qo|J$&r8k>Ye=G7Xu2;xZV*g4sqh z@l!*T&72eHohaxT`c(EPu$}}y>;@Sp&mRgp2rvS5P)zdwtOw!2JYt z^rOx>Or`j3@>((vkFj;q=o-((>BQ_9z2RzX_g9qRWwTmk;Hei2VU<*zBt%M)Gh?>k z|0&#gs|cV%nV$KM7#W06Bl$UI}T@igYH%1gz^lJxAaiDQQu5L#AWythGc zRJL@ZG)WtG}7(6Cuuxc{Klak6#MQVeb_qF#7&5-xQ*qw zFwUWXbOK8bWserrBLdK&Fm|=XZqB0#s~1OMTUBT@OEDd_L*({pva(3=2p?C?4adfy zR23&w=gNI(Q11C(wzm?Ici==9Lz4WS!gt$;X767qO6r~!sCbgu$fu6FwQzCsUNgCP z2jjlXhsZeF9WkajDb}3-B0c>2Y-C65N~|EwnGW4eL#anY0@5p1y-j>v0IqI_8d6;~ zE~Zh;v00TR{02?jHE@i(kNQ7$qO^qa#dKLk6M5sFCQM2tuS%-2lgt^p*De876NBk( zD{9ly5-CG15&@6g;9fQ%(-JcbEPU-%ed8p0@=DOT6{5lEz6zBfzB{N2tatFv27F9r z#B(`7oF=E`*JYF@Jwr2g_SD$JNa}&^VLR zi4@?0Zdr{$U*}S_o_Yzy8BRLhlbmYD^3;TY2!fMQ%f?TZvk)A>u%c>psop=w1JZBp zrT3ulMfTjH>F;B)feh+3m4!L4FbH>;k(7d!s=eOct?k5}*TC{xF_=5Ol2edg@Kvp& z#ojO2X`LKbU?feDelcfP*}a{X$~r>TrbZ=>gprmme>JNl&DJ2?#Y)@qn>9iSr%N6vq!1I7&>suFAO7<5sKK_iVv!8QwLiH0Y$uy&rN8?4#$l<)9aCwb@-Y z@YZ(H@YH9Fx`GlSKk3XvSC+NZMm3Km9Dg4>SSwh^feHF>UY5D7MWbPCJeDyL6;;q% zIA26C_0`8+?K}wzDl1ndhu1HQS+!y)7e2)8_fyj+sGb$I`xyNjasoMXJ;{Pl-`3do$m>UaMA^!Uk8N4nUe-ehch@+(RzxK=0Xf zm@k0z&sW?sC6)!21Vq5lQi%W*pa`$Fs}jbU^45~Y-^J-F+kE_zJPTls!zo>kM@1VS z95xtM==@@t`i8g>lXJBy6Q;53P6MnCwzQl67o4ZEZM}PP5dIR8xR_9f~JCsljVh zRxUU;s7tGy5z@N-RwCS#?&ELWZYXF*8qKqL;@g06y>unpQbEm0^!Yuihk$M5CaZ5O^~(B)soJr7WNW zHC3H9l8!4ZRiva~%Q^A!QV7KMyWJKRR?}@G`XNsSfuMs%w3ly@=%i&tS?u|kV}bbN zOTsRly*Lix8W&j;wyoBne2-|z{kJ*9qq2`@6ja<&!KF*8bw$Qf-Nw|Q=bo;%d zFzE?NtFE5y6x2`I$v7*24AWU!z8mbfT@)%=U5r=p^P+W`uS(13blgYlx^|s=D!Q=q zw$JEboU%S~V_A#>A~uwUdtHusuP)6ss!rv%4(pvL3ySn3%u;O)Cq0?i{^=AN&ALzg zTu-GxW>X+7RfrFUopg?@(k5{GKI?x$HuyvgzX+M+@m%k<=v z6-e~coV}6k;~=Y#I(;#k`R{Au>|4c8c}m(Ra0Nh78<>*G9?VBejzEMFQUxTf90Qg1Nv)2H#7sS$ z;z{1@$sgI5PUwJ6ohY1r6wBUKmrf0E$!ks_Te;>vWIl{~F7c6p8s#^XAG8`c?s+Bc z+^i0sh6J_a1$hLR=~X=E&vJ224p)11j;ts_AgA(?D(yI%x9G0&Y*oL%YMZaLQw&d$ zN^~jA`Ax>zR3r^orEZ^h81z~sf$;dpoI>7)v)72otn0XYY83)&GfST=6tIbWM2xu` zEG6ZAD=!-yp_>_H27GD3P_JOJHPh^2Q_VwdH|&YSPXKW43_A4KM$|A8p-2FN4nmr; z#VZ%4eK)GIyPE9PQnqt0q1=PCL_K7j{tK?Ygl|F2Rq&Rn+9YAwD4k}#5`02T)ZDb9 z&`OJCtzsW(Z3#+R7?Woi(9o47`Njp+k3oXH^?Oqtrm~uLyUS2V4C6-~h%v2*A8r|t zM+B92tf>e^wB6<&Xrk2IibjQr-}T4_c1)mhMJjK3)x6D@QnBxHQ9CPlep77FO07dCorvF5AD|YKi}j zVg+i}yL(|Zi}e;VZiBXDxAl?~@c|$X#d}j_6wc zY}Z+LuI_Kqmu0Aq^hfF`L?1*8W(%?j+n6$+^Lbu!yzccV@m2a&b$TVaC$rsv{O|+` zkaIZt)1f_5=>DIg-s~=s!2U;b(_gP~3HKXxoACB45yw?a>W4!y%>KPfoUD^jCMdKS+>5gs$_ge}C#tjGvI@t3Atngs=!sc=|RSIqEV!?YKtI?33o` zn8S79eDf*RJn^_h_VFiAGOlK-b%*G|2Y_qIk`OS0f67pBv}>Am37OeW;%P;} zlj6~>P+d5!(xlVIo)+lfL@2#RSM?(o96Okiom2LEHSKV-sahn)EGGhtljNd2r47M) zQwIpv*2Y>a+pK2#{Rh4nbw?^6{H$`{FC1NY^+Ow;-=el`h}2l_dE})XUH-~#1QLV> zoKkXsh|$r7!a+j+-xz|H)fk1aFl_Uw3f@Jo`-N=(Yh>$O1?>b{D1EUDt9d9QmF~S7c;z4Ie9S=4X%bVXdpVtx)}V?#tF1~T4_ z*OSRT4>O|!=H~e`?WgE_yP$UL_HCRuG=2Xl6WU{qWUz+1gWxo&rJ6LV;hVs|6eYK~ zkgo=kZn=)dSMqB=#B^XJ3TWFFTBcKJ0R4?J8VmTaqiFWBG-*I*N@Zcub3UwpK){e$Fsa9ctrTL6d~MdAqI;S3-APY=VNG;TSxm`d4Xq+^fhui;1Zmq1{_$US zw=Z0Cn;*>$&dt&^cP=zg6~r_^a5$7R((KS9?mi%v^tLbS8CO}43wFV~F9Eh3=vBNQW3ol8h>YZU5AnCYRdE0 zYX@n$dMFIl34m9!a~+WhP$C)ScL-N)Fj7pyHf<uRhks)1qooU6(9Tnc7ZzN7s2)QeQ&Ad>Z|v|RwY_Hj zgav9oXtCfzNks1se4M-fp?z*10nW#OiQ?_O6Z!eq%EEfw?0|*feDXk&(xTbT*?d8$IvNhG^|ai+S22fLEmiJ4FnL&)}LEZ;*cJ~+{Z=>&I>S5 z5L^@`FnNyOA7se0L+<$iA3BeXpc*~F(g9nGkIvCDs zf{pouCp#THr?7+P5}ZhrEmEfKRYsr0&INw=VEk3o)5$d=*^txZ-kaKB!B&@=B(&0k z%jx$rJc-DCS`w~V$J;`LdqS9uM)13c3AxI<>3vgtDK^GaFQV1fRUm%&v=<-_EGGvk zgscX6oNCJG)Y!hl#u5iU24*{+U~j7H#1}eCxydO{O*yN-f4(-t-TZc={ zBPo8W(YNO;et9MKxp&n@G55U++@E@*Q!-S8!DQ5WVDQlDx#-Tzv7r>U8bkd-%_U2) z7k;qCASP4mBZP{unF;^Ezt%%c6cFgUubXu|*K}xEe+TWgmz2WK zv*~frPjV)Gdx*9ngdsx+ho2ot2n#MqC~w&``vtn5J@njo`_@)GsQRblj&@Ev;$jU; z#lnoFVX3-2NSn#{?nb6*Di4pxPX~O|GEu|L`}6@qg#c644V~G_8xJ>MVV&8EIO(Di zAh=JL8;7}P-Sx1q=II2jRZni6h4yy48O*~F;B8nD?dif- z`I@g0;y5kie)5ZaQK{A_kcbzFCd8RtWdn1Fdt66_KIwUrGdLM5^cjyWiu9X5SR zrlxNdc!*T+q%e=|{HMPt=?SyNpi*1BcU*mNss_9Mt!OUgjRF44MT z9t-9sdO zB~bbt~9p(Y8p z9=ei+C8-tx3ZvkNzbM^8kZP7}{*zOoCf&*aYe1C0y65g(fgz>c_SRd)p6&In(s&D& zNc)HO{NS563Kk8|!f`0fHKC^rHNKxjT9;>N{N0Zsy$Q@z>QdM=Ar2fAk_3PW$fWpj z<-|M-+)7PhX$glq#sXq$BKK28T?8vN1JrxWES-{OZ0AnQdySqZ4|f%*I}7=>DPG+8 z^Zs`MM&&WhR=oC0Fki7S%81ZUZ7z&2;*a9&?*Mf$xYYi>S@%OccPfMm7fcJqZX+4f zxeOEPmlac`K=-q={=>9K4?fPJPm7w1dp+YO+Oy&po39x+UBbkcvc5*78n4KEgvu|O# zQF>DW(bgy;8})5E62?xNI(sH#MT@nhfx6?0oXd5W?K}PY$f4guroXS- zLt-aSAxyzcci@%>g;O;)fD@TW2?N6aXvub-l6`-MTJ*ckx6HYLoN9(Uystsos^XfN z+7xu&QJn?Mk#YPNrbT|$(DB2P)`VO4ZpN=woc)K8q%Ev}37w~2``2H*iXY3)Ue*J~ z;JrTAW%hvBtV4K!6Ne^@A*dmyqwk}>Nvbpxch(O#Q~7v*f7c|^MLM17ue!I?25gjp z12$R`OB7yb@I_)$a#|?6q?2#C5TB(pCpOkmr&MztM^RX2bg#MXhRfx#6 zmCXw|mD?5Tz~p7b2NL{U!_M{KbzGn+Gu-j@G2MOjAMJ=yLqjZ;aU-cYZmt9g9@GFa zi{^@BwV$mp?2X8;QZQO7%=TY*uxcp%e6h@r&}M}}2@~nxnvU!m#^JO0G@P3<504O% zz|V`+S7rinwbtORZ&dUkOQv+NB@|JBJkFJL?yq5cr&;KwHnyI^m7xCWnB@JLW>=|o zF6@oX?42I3R*Qc=t8*T&CQGFJ*`yENf0AHzD$w|!1aUQds=UjFpjM@Iqs)21eOGY* zr9dI{{JbX)ZtbH%UkuW#_|10w<9adsS%;x(_cd;hEu*=sKMd?_Ka8CYg$sewuJLST zLR+`df_U3W^?SQ_lC=k2^t|QnN$Ykcx@Bc{Qlicy9Sc~WcM?Z3aQubSbBi!F%@9&f z8_ZX_DXA5^E4k3Ym4>)-5BM;Ews%KBUY9+D1P7ytwu7?XWl*nZ^01aihC&iR_RLhZCSCX92Y{zHD+ zE-WgNA&@ZqEB7I$$t#cGqLnMa@+#W9~*Q*QxH}b#L$Q(pH2oG^%d}s;;CVTSbb-X zSKPteK1!ZAm^vwh(WS6iLrI8n_*-2}K4WOz_Eqt3Erq=eyP7f2af!S4Z+0St zAc6PJOwIU>*+8DkRv`)%y|f#k@-l4;p=j?mxN$cQf@2R%+*Yxri0CygXTUnTXflr58}&7 z$*A)^SV~Z7%41G;7iS_2HDT=>F0dG*BEfM9y4T_Jl>FxFQHa0@bL#5BpRuk3t2eEb zKx;Oqwy+C|ZZ!O9n6Q@V2%UCJlm7-Av#ucQd=?{nj@?(!B5F-h=62u5nRsC8IG}8>q z(|+6$F>U{fpA1+!^CeNY1E%y8>=lvsY-Ahb;?n6I(6?>8_j9;6@s_Fy&&vL86*(-Z zwYNowhC!a5`1BvZzNSwGrUHoo@AoosI~po8wRraNzHuXX*Ix5^6Dn#{R|>UhJ`4s2 z3^9*cJf>{EJfaSP^i(i=dwUQ7Y+9OJor$y;L)d7l-kmZu2LSJ2OakS3U9hwl4 z-;Cw{)^xoZSu2Fu%Rq(}^7yH&7$X=#n|b>BlM^ZNj`+A5|D@=@w>{t@^X*G*5O1c`e~Kx?U9xIp*;z2XZe+Ny@jwfTzTs% z?_9I9KHbN%x*5QS;pLHj+pZYs_&f@n5wj0voAJ{W1HmycY*7v#^PNR>f2}2VZ9@1Q zDT^0KCF$~JKYW-WmtD)V8tp6__Lqdp(YC}Q*^!KXmke4`qfuupH3MUdnH2b(aA z;6^kXMduRjCXrOV-@K1gj65#x&OK#sy(o^I>>i$`f`?bH0`myx>+j*`rkjxhl21mM zgV|){Lb>!@@E`+9I(3ecq9dKkTU}D{PPNM>^9of}Vf@Zkkq9?vSV!(ErDv)c?fy(s zYF1$PUjUoo-fA@&CuGl*1j1Mu^GuhjDFWJrVdainukb^kO^*-e@xyS*XL ztipI7mk`~^t1e2xB?KE{YMpmh@ZTx7W(9+_6+;9gk|<+DK9J|dDZ>Ck=)am(Cp$G+ zFOyXc{)NMmSYqnY4~ku5zn1Of&oww%=eoZqPtFwHsh1VNDcfSF!}l%CQ4Oq_isKufS!EO6PhZr=!YIG)U3a3)%s4Y4FavVYW0fX zP#diX9#u1%qeyzEO~g(DyvBD@JlqB{1x{$b{wTKU`7|fP*GD8z%*jrR6X3so2*2Lc z`*pIK z9voBa*`Z-#3$f8B_9n`V0%Ls8yu3tPnKv&}7r z(rFRg=ECt;R5v>-BxU8ZhIg>UF5Mf2!XdOJH$b#n7Tcviic`fjr+6qm3mHitMa z7T|MADzLP>SUAXt+J^Vxd{;jBg2UI^w`+|WEMJ)W%;>q*d~%>GCO~OWj2U){E9&HI z0rR%KW*&b6`Bb8eCJERK^!wL{;xIntRt`_16m;9+Aat!SGqlsK-*Xxx&XzZd%I)rx zK95|9TPcH2C|S-xUO6CNjc6E-N!~>RIJrPRjP@Fc8^n}%WgzPt9iM8o(5N!+*XK19 z^vCk}t5MC>%Q7ChEwE(_5%?tT|tA#d8%#eH!<%;bbV}bt$%O#i2-+jL`sC z25)!2F4{4+*MM=}Ejz5+gztBPJu6HFZxI8LTa3MoQq(_kU3&d1x^~qFqGPk)=S46b zOk&M$6}uS;(w3b)C+UXpxcL%+EWVji>qK;(Qpv*G&7hzofPu!=E~1yy4`G}`JI#{0 zH_&L;h?;`{dgun%({LEh9A1b@Mga`zIL%R@pK?XN83C;|%FP5W9Dr(SC|B zW8sU8B-+tH7-DAJH9E3*h>Ip!D!fh-1CX18ce*T^K86!jfNv8zc|jyI(OeNF>4;E5 zA4omSHa!Qx8I8yG3m2#3FFqXGmsnzD-`OO zf5?`PzHMLD1=GNl!q(y@?&mRh5DnRwx&Zb&nD)XNuJ~4DCLoe)OT=IUeCwfYDDqW< z+%1vt<+WDbH)?Rc_9skX2wIhlrzFC-JK9<1ZCEa>;=HRt^(>nY0b5h>{f!B;Mo zrF|4@sS9nE7(YLmqlu0(qIIh7|aS+)9my>>R$_Mx8ICXZhyeF71deu0N7Nmf`hI?cEiF^GJxeB4ov_Eq)`jM(hEv9!a7^E#%AA^pDAG}qzYfxf}}s&IVsH2!mzEY99B)_1Lm`s};Z>rK&$eZ<_> zar(hxE*r6U;+B<_#No$R8)UST}(O-=rjlUVev?CeH; zJ>FvYkoFCjH#%vqqaM$u+RF$!*twAn4U3Bs%?-=N9fBiw?ap;BtDTNT!=q{DyUE)a zYK16ix$~V6pC;>U)0FzAs~=eAwJ|(kJjNVky}1oa%M|xBL%eXyuWyaxwDe0!=N_tf zaDK*078-UucRO9!9!N9WjQ4pslY6pNe~$g-;tH2!eb2DsQ~qBDe{EGKl3ju9dvrfm zswNb*OYx3L9BxMDbEk%$^DvD>h(3_wHILLaB^4g+AH%A2VRe2QOgU#5W<>0oOOHW@8 zI?oE?sg?=fNl?i}b70A+TYahi3NYnoD?dnrD5RrZns|tXbAm01kLW9Lg7Vgtj&PTg z4y8Y;xNeq4S0j$b*h538ZbNb@I^qmye3;?U#VX1>Qm{QU&{w81kbsh6rYT`NC>U@j)MnW!m2P^Hij!PQ{u(5*_=@*5 z$r+8p7L^TuYy)q;C}LqtF8tG7#+qQYJ?WGFXtehT#fRhGI7MB@P@p`(ob6~zH_+xV z{o}*Dw|?b*!$24;k^T^kBFh>++HR(*u-h05ldLTRKknE!QdebD#*?d5{4am4L+!nY znZTIMf^Z2h_1TcVDu9=XolB5jxnIR?e@1E`*;lzjIA$mvKRfoKj<;_qcrB)quOqLN zin(=hncrdU>oiyZ+#feybVx`5yfrV-e0}WBlIKpQ+#`>=q0ShC2(>;_R++ck#E!!j zi%w2Cf@JAEDLT;)8nLT6gE64#-kSay6n5KHuY_LC|D7;rZ8HR-C!s0~jOs-fCTBbryo)PIsZS%ozm%$LasLMhlF4UNplEpfO7~fC^S8vOklrne&$}OfYxRiptN8cQyyois|zodRw8k!(=>Q6TazU{VGpe7%K?VpibUK5&w2gtGW6K!T z+Z7PSw%!*gX-9L}KrDN| zrsRTW!D9f)xL}~Ct<&5z!~8!jPHyKzs4J-CSj$dphdGc|m*U^-%JwI&oL3TWwDBO7 z-(0|y$rUQH=`siQTf~cS9Gzp;Y05Mw>O@J>qR zkHtNd@oN>%6+^@}E6y@b#Vg^7*pIM+bf8W>C*^h_o?{}OW;D&jE-$1)lGKGkRuGoUEhKe?mKu%CO%`{SDX95=-WWhWx))YUKTDj`_ zjlRG{9p_uI=gLkn))oho^j6{OxA5YTee1X2!^%F$etsm@94vAN#`Ty!GqLtQGqc=x zel|Q9_dHYDE=akbfeO!_vId`N1{>q>OQSU(r{I69??gyQSB6YRFDV#bb&25d3a^* z%e8wPaI$fM0mxiPKl}ZR#QwQOzNq4@+j2q6auI{FJU}l;^{>+~d&SP6lwEzTSg13m zKhSdd`HUD+RyQHYAg?FY?dx*Ll_0**24?gKJFbKL$A9uwapyzP@;jel2?deGJ1)7& z9wx6bDYV=%JrR_|o=UublZbk1;tz=G;g!({^(L4b!lhdw5G%_4AKT{?MViv{w;Du= z5ap9n+I5>oD13pCDi4F1j}M-^QCDHFRHS48?l1wEbm>T=K}n;oA@qSH*Zj?%S}bPX zs&r|}j}z{ge~8hIsL@mYa+^3la@annDt&yf8( z3-^Ve7c{nA6&79?;uR0Mr>NK26b2-Mx7{kd*mz$we~P6O{x*#1&vBTD3MMH7E+nFZyaOl#No;lc$oJSf{nC%$JYIY*PHg ze?&mb{Luh)sYBB*rJH7}t>c=y2~od?G8?y#Dx45M*V{5T zW}wMtLH|ISMq~x*!%!v8VQ`+TlLTM)N94pXCFI*DEFw9}sz-N7IZYSD;Y#qS`6k@&D3+ZH zGJG_JD%W3`Eo~zIN~GQV*nQ#OU3}ixv0ROD^HG_>yl*8hRapfE8GH6`zT-SLmwvYH#=gf9h{#M`#jW4W=TKVa7#+fBX>^+x<8Fe4?AiB!FA;aoVV zI3#7%E6n9}SGk%0pRYNtpQEK4lT+XrJ&1i5$?erQ{ekJTQkGf}PbUB zA_?`nhIgqQ)Ei7{DwRoU+_Mc)o8MTm%Jc5hG96!w)y~iL%E)g62U{biG3+Om znx^e(&0TNGbLt3o#3uXaY@Gu6SZrn;uyP4upA4T5{3C4YHD{qTW?ME9@ma4m*01`f zL1QvhPxa*8cnW7)vE@2hI>joM-Jm}ltBNUSqP(b9aQTeTK&_r=qqSThT z^!70(zRWHaVl9tDW~zAu08?Pbksq2*7Jd|7`pjffrHZZ90+tzhg)IIHy;_Q<8E^3( z-;kfP9J6LUj(00MIV88Z_2}zJ1WkF~ApO=*ls~2#;rAWz!yb94QVk2~wZb;b(9RvX z0Y9T9xymjMw6rDkluR*JE2{EN+Oz&zYOhgqbU*?O406C1)rdBHv=#bYB{gR`Tr<3+ z*tpSn$Sc83LyQ9zW7#yW7Wi_v0i8K@ix=t>5-Y z>_=1qQU^LrNz*`h*6f-%(un<>I&;)j@A~{0 z*o?i{p0calZbO;z`m=U+YRcMZ7){fj1Xy}}7?2u!{1Z22vZ8$x&L6t3Y1f&F%?euZ zArvwG2%ZleEAG6Tv>^pqCh~|0rsXg##UD78z=-4rJgd!|b90+7*pBQ=m zFl@_3fq^v^%YP94T?ugEuoCwO3pkR*+A0@Hlo`ed8rhw`sw@goG<~j*KXN4b8fn~n zR@$h28x-2u1iCyr4-p-gHXt~&Io7ftXX=(m;k9~%6})R05s;aoezmIb)=VW+AdmEx z{dlf>1lroslbbyf409u&XxgtmP&*xT{fw3$xUw9TU8*K{^?2}1fQYAx-P8a*z1xCw z@!BwJx{#aZlX-am8s)s_-l`B%uo|I=gq#V6?)KrH2RT1uuO#e^XZ<601Sw{2m@LN2 zeNX*)J#}8Yeqwp4+;gP%)U751VUO#YCG2&kZOGOV|kE}OhxWIcgcb=`bRd>pu176vAhYg8k3P~^n zj5&&6p zF~nIO4}^H{Q>m6u_mh7?-_RrMn*Xp3~pc)HNbr%7092Vx;*XKCP0s{;fuR(mvD z;vOH&t@O{W^WKX`J!!(Fn1;mt;Tnwcey#Q>poWGyI?uX&t0}(LC{JDZ1}ZasQ933; zo}}EF=2v*XJj=tfzfn%$f?^D`B<_NL#tJvP)iA)}!Y~GHv{4jsiyrkKYvAUx45Asa z^U3v|dvTnm^A@bG)P-s(C1<+)W)TF3a70Vag!Ze*yX1!A27sj2w<(_4W+a7eDbdJE?LU@u(Mvuf-ZfC?%jRX2OfHiJ+C$2Ss}W4d1%Nc5 z7Le+V!3{rZlCK~!bl$Aqh#^ud0!2tL!B zv(D@X>OCFOfl#auae~Xd(Yr(ZWK+XFCIow_+@7T&&2kcJ9V+BoE;kIe`FULTvriw5 z&AgmXC7@%3mkNw^U0p;GEKH0O%>B1a5tVSk`8=iV7o9S2;f~Gx6x=@e^oZd7**hA@ zE8-C6mW@w#q1G6d3BaOb_lMx63efBGTw4bXb6g-_Fsen}%#MzyFIExM9HFQouek;Z z_FOMs=gvJBvwY87u@Y@Zu7ZtXT3F8deb9ElgM3}_YIz)B$#!XK!edNuYaH5mMQnYI zl=!8`;FTVtAL!b=a1AyK(*1)2{-v*lzB;xvR_aPpRth_NeEHWZ?RmK0ayUufo=coW z7vf$6-{3=z;E5$I{EiMOZcC~(-aGTqBt)~Sh@gehi({k3` zRnvIAL~S}y+BYvcLRcPx%y>>lD@BUz)ehlgEu4u+Zv4TX37tMSQ}~m+w1{|2nS4ir`pOsuu`q`Q?8ux;>mkZ<2l_E&FEcBI@lY|_904U6L~thK?VAN zwo|X-=I3Efr+Lp7KHq6T*7BAwidlvqS>gA+**huN;68m_4QQAF*BWy&*~X!tPr1VL z?}rF62Sd@xCvxtN%C5x24ieU}b(3A0=E^S~QTl26Af6z*Qz6;a9r+u)=i;3UaOp&g z!h%K`9>P3hA`)#kJhq@ZP?Bf<&N667|d?EM4 zR_H}5f~gdRtX1sHFjO$H@Wbo~mV+G3zpJq>9Oaxq$!TYe#>$z5#@laIO$Xr<7%Yzc ztyh>a(*|AY>%{%jN_c>6LM*8y^eCCUEa@{jxc!$r+P0f#)>fRv#C01+|B3} z-VJs))LbGHUwu47|G+Wx6tUyfam_E#ysFvXJk8Yi_Q)J%74hSKR$`xS&#y5W_GOwy z7|$m+izuauslJ12z31$^bv4I4#}B^cZCvvJCY>Wb^``!RB5I;uKkpFKG`o zJFL48+1ikz6oJAJ&+pFk=kCZ-!+b9_jEH#HFIPv}FHF=bVU#214K2%=*QdGXruBD` z{ASJ1@EUwnPjZB}x@#-EuDi_+wvC@lc|j@7r&{gTpu2dECHmd8s&bb*A}A}(S~Tpc z=BYLLfmvkB|1i^uHv{#Tv@ZUX*v4wL+-yR70npCasgb#|c!H_>q8=^x>vyqLQ?;an|;0awq~#Q zFKi*lRw1!OB|ITafWuf%zmtL1gZWn-%r-NGDTq;)ZHf*58IPW>9#_`?#|%8m3gVMJ z_q&mlkAhg)g$u>=M;z<~RkWs}-Btk-)J6uIDj<(1V=Gbi@)ukjmyE$0+}4|qaTyv3 z!nvzP3zI!^`?#5v7Os#G`F_NKN*QzVPUNJuEk=;HwejEyCv^WDXtSR=4 zfNVlw&aEO!7~(+ZPh74($+?4&L zRf7M?10XZysJ~-q#t9CMf+6!%qKl6qCCxj0*0yL$)odN9kCX)Uxt{2#)gMoj6UBed zm}o?ENZ~wDX#0mrJSx!S|5v^A;5hc`v=62e&zyDiB&SxsZ8)*$DAhSpm`8kEsT{z> zg0d@lq`5mU3GI>$D})i{N$Tz+JZsj>GDwf-#o~&eE^VwGv^xDVslekXW=ZKa8fuLS4 zu>zY7+GdLtqC`M&jc*LQ=b|?D3)VCR@an`XI8ijbGhnG;#0K2gdaVofNp7?WY=j#1 zG$?0sDMg$04)ET?E+K&$7|2qw_5Nzi?UJz+fBbfR)4lg??6U26MB-(~YC_;(*6^ys zJn`xK*<|fP*Lgm*ADe}?86`%zq2r-w?w)F}dRK{F6jZu^PD>$zaAv{CI9(teKI4-b zTN+YUOALPVh#v@HyezLR2mX8Zf@N4UrZS+wzCrA$*NFa@gm$nVO*$p;&oheX2XLV$ zQ!%cTv^%=x@!sVWK?tKWwEJh?A(u9Ym2XEp;FqaY{Q}T!Jr<3nUa}kUQE9^B2X)Z{ z-v~9HXx5a6gOaoZR}$BTU|LJ~qfH)xPc7WVkvLZnd+k#vDkf@?{gL=ywEbmwc@wI= z1lb(*@3MqDUU{5bBlpTjvKfLnsw~birU)LP-KW0AYpW>@26BF28^_OLJ+s)mS&Du% z{auJV4KXFnHLb8;aR*O?k_@Rd>*Sz4Dt?qdYcfOAr6^;L6OyUuot$cMljiA@Rf_t! zcekwJwWBU$1{q?B^=#AXrmD8}k2r5kipj&d)#1z1Pc1;6Id#{Omeo}<{5L2)mkumt zgB)v3k*fqBeO<`NWq<+cu;ebvPJ~j%OsWVrHH9n*#1b^zziTQC%uL@!DAQp|a@fnn zZS8HjX3Ac*X}Zz4A+)bioBTA}kKi=?B7zpUJm|2AEh=S?yPEM2Mn+amvxFO0>o23q z>zc}(>|1&@%|BP-ZVtu~m1Wjh!}-TKzd}}sC0G)f=h&KlK~F)85f7;GPLqN&hX$(p z{j_NUxhaGUX?*?=9?b z6|rUCdZ=6$c8gRFfuhkxPntc~UDFG4LD66PRew?DMzOxq|^`@^D#q z20sNTk@K5$xVR~{OcKn&k)89pWc{7|m3|Oyz_n3~0d{TG@22HA@>32mW=!{I!dQ_k zWLrFutd8Nhe+4oT09pQ+dUWh4w*mvC;GH`l-Dzmi5#lVK?6d^Ah97j+X-fX*%44Vg zNpHT2{qbv4FFqvXn|B2;m&X$h0Suuw?^+btx3 zM1qn9A`{AZh)@I&K@k9p2$sZYnpiZ0T0Va6-Od*-x$$!M*?qly9!1M`LWnL%PoT&$ zLr4%o6!{icgh-Ie;o0AA*Vn$heR}(P`0`JXbjKvGE<7&Xldk$#H1|YzJ?{GNgA^$M z$bJbRP{lRkk_5!tNVEwnoa{!E?cTlJcXi($7o_dxuQ!##ucf)D+V{?@&7SL%ZRq!FzIAlIcI;P8%Ndv}gg_BcW!qh=eMBubZQv&YScU@8&yMQJ%jdyVF;6SUe)H>wp45zTS2g!4Yq6+ z*3>qy(MeZo4^;9wn^~63%*2`?qESSWG)XE+0+T_SWEM1$Oazcfi3yA`F@=L=A^@CGiE761ei?15hx*~nG6vm5|ow%kqICY zh6$8P0gDP@F(}3;rX*QNWik@OKvG5;WKdwD!ZSvYNstW?AYwE^gkwcb5ri^eDV7N) zER!%O43ynp^O~88BV$E`fRuwKkTht?Az;QfW}-4!QV`Ti6&f-oNJP>>go!ahVquvQ zL5UKLGQmUzMMPmXDkwBWWFr{aloUjUf(XG9SfWcNW{PGeR9K;wG-84oq>33CG>K?2 zMgjYN{LLs12Tw-6p4&7WQ2Q6PbX0f{h}lt95G_thiL!4=S=Cya_k)6^fa{ zS9caU&PC1LcQLp|$+L5=R2-9Yn7Pusj-wXkc5v4q=tXi&-9sd#L`;c^0TfU&Vq-KY zXqrGRBMd_^1W7fv&TNE8%K%`>G>E~YCSKL5zXq?tv{9%6H85mo0NE*s1tf-!$e5~0b+(SFcFz3$&8t%1sNbHnIO#+Or*wAQjH=}kpP1-A*BN* z3_vgpG@@k519XMlim$Sy53i&S#YH4k=jAX_pkVP0FNCGkjKtc&H%wmz4 zGFlNfQjpA}0&GZQ6Er}Hk|<>sBQin=#B3mAGBpf{!cqkzOaN#@OoBvGOeRs7gIg`O z*_t%Joe|-Rk3dSRo0y~qkdj7_P(w5m1j%F!lQIIB!2}5?n92qLg_(o~5ugO5EQ$=n zO)~`)$)$v{A`%FhnUu*;2+~a1B2f&GCcw%_gp(AAOvt3b1R#*nNQRPk%ABx#t979uf%Cdnf)Fhp4h2qGwhA_fGKC}eC|B80X? zreqUD#IT74p(4UU5>Zi!X3UEi1#4clT&){gEoj;?S~aLE6&0y9L9w>Rt$kX)BUhDG z$}M8mjjUKLZOS!`s}_q_HMxyOu~x2Xu4=(iw$WU+=Gx}lKBdBT=Ji zm>NKoVPeeKB2<E1QY0aw!AXh|z}hx8ix5O( zV?<31R1lIxDU(U5NI{gykQzonQfU~@0C zVKYR@r7}UJkc?9(Vo;HiAu>V|W+Mb&=Id*3{S{SLZyHH3grvv;FobC{8IcK@WN5_6 zBSDy$Kt@aqVra%1F))#mEW}e0A~iMz5Tt2MBvAoF5@ZR6ikYHCp$4-vV_P$6wY9I{ z%2$|CEq9He8iPR6WP%1}kR+L+0imTSCLN@a~E6AC0n7@BPn5|Jdf-+}L# zFk=ui1PLP*5eW@2XpEL<83K_=DI|#~iZO)}Ns!7yOe|1|N|>DQ&nrVSL@oUub0wH zMhTcr2r|itF_?ms(IHVOCQQm0Mut(MgpkRMkRlkfCN@nnibWBS*(s2TGZ@TF!b&L= zM5dS|8Ad`QG;E)))mwket$saiw*2+Bt#7LOLSsavgEmT2BuNrzF%nFgP>C>7N+y#C zOp`-FB9UZC1t0`t2(d;Dj0!|X8fa2TnG!`Iiy#z)Hb`QOA2qf27yq4AxBmXug&Q5+ zNrhM-I_~a=bd08cd=f2r;1&VI?3XA&3!}h(Zal#S)mvnp8o9MI{6pQk0TRVnH%cHff==CXH{E z^u_eMyND6DE1a=#PL{Z9rCfrdx?PpdU3JdvT#ioaI$Rj;>y+r7*hh9Ng*xaovf|^7 zxZG=vai>6)S4JV|#EbIvwYT1{y)_92F;PK;gg}IoWF|XZtWJI7Dj3yzVOB9STXwpa#5-^BOBpHb?nMflhj429|VS^>4ItSml$234G=fBuV$6aOF+)oR2}v4Bq-bE7NK~R& zzz~w5jAWQbG6MjRhKw1KV%edUo@Z-A@+6D5lHuB_v7kWt0kFqzGZZBEfC4NN3HI8AK3}NRk@~u)$@L(hVZp zEi{8~$TC|^&DUMs4DQ{|>yvWLm*l*P1tpSbutR6X zB$7m+ib;HVPj*hZ*IhZeHyr9NmnGfNb=OYrcXbry-E!ky+=DxY=W)%$IPK23f_&@G zNE=9^Nhu^qK!8X{qLKt85=0Q|q@6pCbRBf=?wre!*Au#TUERAWb{uuxbh;OFmvLRh z=UsH}ZtjCOb9Y_GPd$~(y{0)gUCB9}b=^3f+?}1yoi6LAT;h|Z!g4_riSmdt(;*mw z3>X0flF=a~la1Y6xZS>3%%E#>BRZ#yq(Ltz3aV8mtE7e zcXnI^f<*+pkwpTKK=~4iDFQrvk^rK-mhSGH=S`w>xo($NaoFy;^UaV7Nivx}C?p9; zg5Q~C1XqekqL+7fbGx?}4(RB;-3PlnxaV9Ox)*mrcW-s?E1lPOZgfH@qFM|zf=RSm z@*tFoDFQ+uf>8tl5YV3x^6~C>QO&^@cI9=;o_o#Qd~?Si6ulE^0Et9|fk^n2 zK}e(#AtaY|%{g-BT%GY=-ni}E$DE$wF6+AMf;uF0++BU&fA5w`BuWty!xSVF1u$%+#QOi2(iBt?@9KrCbe3PLhL5(y?r5h;ukENLd1Z@_}TcB9#- z_NqReM~0)>DE2Bns*hNs@DzJh9<@ipDE6v6vX5$`!BOC-@Kktoy?0boP1in5m#PpV zgdj>nh=71;fQoQaLQEhaU8+I|k@RH~cUr|+1YkSuR2Q9s39wj)zwO% zbQl|sYY!(&C+ioD1Oh!UHri@LoUt%E1_%-C+MsGMoZ+yZKfqFw;yUlu>@V!dU}Ym2 z9L0G7$~ZMmTL}nXn$wv~QcChDnR1p6dO}suE#XLMsmX_^$@|GUY)+E~6voN8RH06m zYoYJ`L!+kUBISw4{dP|z$^PuIe$*4MH6(R8Jf!2DU3kdFQim-+3bMgHJ?zrFFn~SD zU@Y>-@0Qu9ey93WEQ(w##)ax+%Udg{D_UVgGd*ymPd<_ua=j9e!WrZz2HIrQbJc;) zo?19WeoslUyp0q~v;j;Ig7{&l3f>eB+N-UCr^94*^=Mh}G!))~J(#L*tsffdVINc- zqEb}YHmmQUOB>c{!cyU(0Z0XXO4}$=iHNt6V9GP_!jymg!%#L69jMPy9F`sgVGSNK?#|Bq ze%>{)_TS=F|h>5U86dcaMT3OiZfNgbCaT0(aN+?uBgq&e54I04$@t{+m zB5PV#H{DL(Co^?uJg1awIuETa!4QFylXclz1Y4Z8r6Ypm48_t3344)DUQvmM0>UGM zPplXJ)Kb&3&Y9L`;OKhJ!-@%6a7UW0vmSuP@uNyJiW0GOI*m>zNC%6+2)JP=+!{iG zsL5n0$Y9k)$jXX1HGrDt6skN>38Dn`he_1)@DRTqV~E5AQp<0cM2BWjIHMGRHbPE` z?1(eA)B{*y2uiSF020qhLP^J$LLG~!7O+8UJU>*Z<>+JWujS9U#cg`GJWxl=L3IgI znnYd^Ju`lU2;gR_3Dfb65P&*-Kq9gv)ln8Fo55BpwM7NM$u5w^xnCW#g1HtvAX&nR zX9a+zq#(8Mv`{RQk6=rHl2Dok$W;4GX2vjA6s41$TSirb+oX^vSgt0DYU_$kkRUd~ zr0^J0jvSIp2kPPg$skKbT|5<*EFOSXd+_(fpN%s`c_!BFwQm985$%gnrqRb&uEh7WKBX^v((4KpMxE$L~bYqm}POt44>v+TA|q zLk=I`a)|bgz9?L+w@z56L_4n+9z1pN?M;W3@~zdawrJBkM+LPPE{2bGL?%Bvp)Kg_ ztgKy4Qo7Wt5lz}UZ<^5|G#J*_z7>YyJ?wV(M^zkNn2t`T9~&A#qDY|pM4(cnAVst$ z5O0~~XJ;cOqch@3IMiN+*yEUdv+99}Oh3nEG9a6(xs zD7*{8;zVn8e-cOm#D(ii*;-5yjjsI;^NxAW;TGYim9Y})QUJOoO=KEuC7TT^SJuH7 zQ)Eg3mJnq^ZcTHI$H>Kl&f?mmSz$E{P9jZRDIY;jg4H`>Qj~NFnnTHKARC}bL+a9? zc(e-|>O3ekRJ1HUX*-ecrg66@@2Ejd+_|E7Fn%Ne6`&c!g2wleD>AWc6(wmgOdkj< zt|Sj|Ow#8=Q$&e4illVtAeo+#L4$#{h`M#k(jEX}IbV!T;fn-_ijkE4gJ$%ydl2+) zY9>1)yGL1?fwDlNvTP}UKrFFbP2Lt(nFZG`C983H3_3IE=a0q3XImo{pJfl}5f(}t z2E8drDLkGCOmvabwe~~h+M(5OKpWsx30gWsjmVdm4LY&yEuebUycd4^2E_ydeTcOe zh_sea7A=9I2uj2t8ZlodWl*xDZJo$1eSUN>xe zXCnNIUmndn7P-`J=um5T>@C5eW6gJX>0N+g=N(gFs^iJN^ze59ZIKtXETJ72fNQ={ zo8w!yZw=qPfC2Lj^Ay+YqCA(U^P&UywMSplTr*l8_gUeM`z{|nl)N-r-y6XYz6?Tj zamzvVm}z0zTzFHpL;o)PO}#AQSWZ)mdjM9(*+~UDILP#<_pCw-^N}v3xJU#|qcSas zB}5LfVw%9k=BLW5kVjx-DzBWz*81EsyU=R`EXf#_;IS2*!Bn^|9;t(Z+XH*?31B3C zA)72Couxk{DXX9jWed(Nw^W4+P7y3MLo*<7A&MYImIRSJjS(%; zu?h=z&jPh50By8sQ#g4)gjXUgcs97%#cLr%<&b23R;a5xeLAegt^PYc^F&z5-2%q-lh2`nnh8T7{f{(BYh7fG= z*z6H3Pl}v4SgfTh3ZTJ4L3H-81(Bw!e$T|gM$I&x*A*T7HQMl${RO!w8`I@CwWrMn z2KOBymu=16qITAdzgfQ(emXotJ31;lV)<#<@?2-@+2anKEzyM5m|7QMB+k`WPVoDy z!cYU7S8!iD8jto}H%4nj9~~2d>GpBUwSwi{Cea$YhFeRoBSy!z-nCziuI=#Yd^!`G zB8#>V$B>dFvVc%4V|yUHUrkFVlfWATmB0chR7lap8D~-CL4bjaO^dg8s6=-nh=Nbn z!s4JXX}ls;#~90Kuu_tyrz9yU5~-Sg`e5fU+dx?SfG8V|rTR(4i)%xKdWvOH2_{QH zBG(EDr!nv%bu7^{yqPn7VO6sIPHNbCx^BLrhz`dFju|9D2`FV;uL1;tWDty0y9Fh!P@ zbWo0_pOQEkk)dFT z@ZeQ2!n|n?nlJWpS*!wOYQA)nSdczR3!L)D#1phz$GD{?d$vVI5T?lj&9Icz!GMC0 zGbM|&Et@TK?u#TWL9>`4s>Z;;gJXoxTp!vFHPxs#n&8_Y=3&{GC0l3%z7VA-h zq>vbT8G}XqV!-Cz&TdFP z!Ob^DkmyN%Nmjw~p86p;AXUr)hroM)N>SVluCx;&C5YFj$=1}B$Ghqf2uwDUt&^y& zq7A#2Uvp}>D&+nYq+FK{MLB2l=@krp832e!NVRg*3?P>D1}U+TG#HtEx+*Mc4g(}1 zVeW|h5__;UX>b9COu75)_TubQ;SdBmo(;Ow8rVUtJO&`VvYdNWC*%T2^ zd|MPyTNc;Dure+H9GfbI^9^o}TAXu*my)3K_*857{Gg73QmIqWo!4Q(RV}S#j@@1u zoNS{ei>D8=?a*NQ6VH~KUu7ZR4!r*dQMnv(ad&v$?gGYzxrk)$F4>J2zT<}yEFbwA zUhHIz)~@(;cJA)HS0wG72br!OHL>AqmZVpm)3b( zIQyZk7l6q5qo?qO%gZLd^U=aYu~F?8BgZ!%*){ktMIURQnu}as4%ZNm4o|d}x!ArG zZQXgZ?NQ{?)|_33dT~b3fTo9#qo9jnpscYY5N!iBc`8A(bcR*&NvYOnz^B!q)|+%F zB5W)?w=J}@*@snMGG}iyMrt*PaH`6&sRp&P_By=0Yh=^>%)DkVoZjH-M#oP|1P#zj zl~VO|W^n>%C1}u)lrr2O*Gy@q)KFOP1p9KYG!iqHr40;K8Bk&!Tnh^c`#ySKH*$h_2I9eOl(n76sDzW5( zhVwNMJdTn?2|TbERtC%h+l!$xP8)oR*FmB0bYG3!W@3l}RtL+T~_nQ(GQN zs%J8Fk?>(lOO;fN2NO40XX{i^x^tlSw?>WImzvnFdSVg1SO-UD5_Ieoc|3TKe7zc^ zPFaCXWa{ha=*;1uxqXEEnoTlgv4A>e-ey1XiVngX#{wpzoLwUmVEgr zU{Ib$7tOL~Wix?Xle^>E4HRe6@ZPt@FHzXn&|9?cHA|lfNM<5a}BKCg; z!t?*PkA!GX`|#y%918J;cNgiv=Aj zQ#jlGKNtOPEgEaS{l)ThltyGxk*LK*jL1pxtm{Q0BG2P@72|~WX(5(i760FhC51Kc zzpejF_Wzat%=X_>T6gu5$a}R65vgR|ehpnqC_%(t;lF3#Tnt9ofa5eVA~!6QiYBqQ zN{52cF61vK3FX7`BbQyKN3OVNV#Mvi$p7?s@++gvwKB7aC~l#E5iQk%yd#Ul#uQ`{ zibOC%=eGzKB%;_Y=BF&QM&$buMU=|5h!Wi#5$dL!Yw>?4{Qs@QPP&%C@=w}=gD^ou zLqQW0!e3XkxEXAwIDwg%wwO>5+2c5&W`<*lsELRxTZmvpizb9OA#Xtrv*4BKuu;@f zV!Tw6g%k^6FgB0`5G-hRQI(RJlO1{7WKrP%E|&)b$htQ)dEK_ zM%*$3j8PB~KT#okbmB$Jk+Q3pG7U zc?KGi0^zD4U?l_4_%g$%d-@`uX{|?nKFv0ZHYVp8UU~PXEB5N`FQ=Q*eG^K3mb6x5 zT1(FlEKfy50L)!l-kvVsm?R`T$n(BO*#L;XyvKNazlwP>;7%9%!?WwKgYhyDF}E>e zL?60va$%ZsskxfZe*|Un6QUj7L^t}z9P*wM*lL!li6VJiX)6quz>z71lG*WND5NYZ zG#@~8I^4J(cJGY)$eMklasYYgs;EO{&!tc)`V*xVU8Blo8XgYz+iYGU(>;Y$FU27` z5#K11>6C9H>rH8%?W}^>B(h+$!%|#=cJm=887?x*f}{wOA7b_&&}jB{^9)Ilfq5j^ z5I`ZG_$e`QDv*`t+7hn?^D|!1&fpcX)S$zf{hEqQij9#3%@PEXA3=(QK|q=fcfY2& zbqP%v@2W=Zu>Eo>C|uX5d-cpvys@#J5(_NpCUBdnxm&ZSqr<>WK^e)?5@d0(pDf5p zTOu(dlne870eYfDuqAZh2sM+@GE|ZVmNt&vS)7X^j-fn(z=c$&xiY>`Nig&3`s^oQnMNr4lf0LlVE0zn^!mQyfRmi09S zp+WUb;y@Y}ry_V};Qlqut3z;wX$9nSO01X!X16qL*b2)IL=hQKElo7MBng+H?38Nj z=3gS80|S+$DLU2U*9{H9vJ?TcKouxG7dxt!n^7?oD3bz}?;jeGRf7OiFf=43)j-Z& z#o|edY$k%KECI`BT1w<%W_yPMTy!f%VE#f}_t4CndLHMf%OUCnDiWAhR0a-brNrd& zhCo_YA_eb$dI_4tCsS#I3TUCfRaqtrPg1r`b=F2{1<$xW{M1luSw|yqY!p4l+~GVV zDHS$c497>7UF35KOdAA=#8wY^8sZ%i=JmR{CakhU9xYJ-gJ?1nVSEO~@soYGrXv)N zg-9hUHuMj};W|Z3x)PM**8?MF5=j2I;IWVzx~*ilZFCI^x(+c-ZMH&0oM(>p%jpzA4)cG+C`};oMp^lL_pR zMmcjvY$doLo(0xYS5jF>Wags$vh3MU#ESWpy7U?xJi%w~F8cBbgA?R$) zId`(kEdeYtar^PzmWMCG9!l139kz6oRhF6T&&}c3qy$f&I2n6aLrxNOF*Dd?aGF=YnR38vW zAG+w}eR0*R@}2&9pHaK8a-ThF1T<1y??s;c9+mne^;j>op|(M<34q^{wXg8)&7(Kf z?>LkRB>sZ$Ue!z3dEe=VIc=%?_U)mClAI5>7dko%UoE`gMx3ycaQ~;Ut8b4#-~=c@ z%n?RkfdKT)ej?vm$Vn5=)&M=FvNP-glrm@^PPz=(9XLq0H$=-?Qgv-Db4S`@_UtO6 zpd?yGb+if_XP)Y9_ZrKtKG^$89IuPvYoPb>mGKzuDTS$23K8!PJz;RGnW;=JX@LBIcXtzBhV#UXZ3n0f(< zW01PwqFaS)Vxrv3(3LYzkrxd-l?f@Or}pinZ*6V9Fb(`!EdS3`C%7_aljgOX5C2i5 zlZu5WWGg>i5B}>bO@BMtGJE`r^G{vuCSlv%GfU43)6c+ghJkxkq~$YJkIJwNcdm~P{ zE%>EjUs?n;1}`>K9Gg`QkFDQ~M(g%#ySk&jYTaZuycSy?@bCmBC(vX70ZW3?r<`OI zxmrP~{Z4pDfRL@~qEEGGhI&B<(qNeZIC+XcRNe(Jh#0}wVzu$jG9hS5+M!7g_THU6W9n4S38xU^8}$_SqzQuPhs~<<8k6jv>}fk8yK11 z4XXEGx_V*yB!U_|kQK$6P-MlJ9(0(c%gWTVQueSIWF^|O;1n2IRFhY!PjSpA64;6K zVI}$?QWvL}s+I+lB_nZzhlGr~L7gme7H&WV)}N8>r85asqNvCqX}#L=MMJ@&FfCV) zLH+CiGE39KQ_5pNY4MS)R=ugx12n5juqCvcVN2(4RK`#)shcYK2Bn|S_N9KtgKRMMY2NlFB+9dvr7gsSjkkY9tNgC-_nvLWv#AD z8tfs+Xb$0@IEj(V)%}F7Nf-rz=RomInRQd5kd!1Ga}bWP+zTY3f-pVyEZQ(hK0t|( zAZM*-jIqRWvWWG(tT1gjy~F@gX$*iZa2aX9K2N9xvM3FV@D>Bo;L?-qRM3dM3KxKx z$AAX#oTePGy(l|NO#zGcLrM&lk^qA&7*)XrG$;oNa02Nx*+>ma5863#Mx>uu!iJ`7 zGUodeDvB!RM_e$Tx;mx)`SJa3FsdDySD&F%ua==0^aSfiqnEHGEmhD~&idIN^Yil< zr@g=+JQJG`fQ2t0_o_G>CF@i;mncgKF+d6?vpAt*lA7(AkH~fcBb*=v8)hhujR7+Q zNILb-LKc#%C25c@mIw#BrVzA<{Tzm@0T3jMfsN>cQ*ln(d!?WjiG#EWZCI!iCXuZG zuhjRjr*WNd@%9P5DFrd9`UXx5B~6J*z++u)GA4N?i;##5ur1}%F*&IC6Ns^12ln8d@S5$KJFr-v~Fc5BPYQ`{- zQ&KU2($x`TD?)W91IU$776RoZG7waP39`ew14`v(m4mohxPBGsEK4%d(v=Ei6F37( z3J3yA2{dcOlEQXlNrSK!Wt<paO-P^;bk_ik2EbTp0X9;wa#sY=5kD%GI#5S*ss|60^e~W8B``50Tr@+8o&>{! z`Y`VLLl{aBL!<DDucJH2`A=4N#0%R9H^ zoysL=qZ2RK3D<&*TTfR97X&zbCSO%07LowOJr8T|P z!Z$~S?t}L6^8^0N?R&Ko2l@3Ooiz~`U-^z_|EZmwyA%LAeGH%E^ z+~%48r>ow^xY;zn<~^4tiIy_jT!sbgTe!pKlU(1Wt+$LZ+r^_ZZnKEyT#&0i`^oY} z@{`(pVxh9oTahhv57fM}f~>#4Rns(cf73a9v8p!b#G<5GN=NkNtf@~77mn*{vaw}o z$%SGEyiCRst0o2;;y3YR>V6e#vru<~e<|Z8JH^-DCuvmQ8jn8zGyK`{In|v@3jLRm9|ZqA-uSZr=jZeP zl+33mqvQ5n8P30f z*Z;IqK0F*{-sk+;YL)@Zp9+;h=*KGhOh^J3XtQ#Sbk%u*=Z)|49_T+Q_PpGGe!rW- zu0FiFyWywKtM`owW;CgnCN7=n@_!;fZ@)Krxa-c2-J64_9^BD?__4^hkUstN#!mya zjXfVQSJke2AulwL?_aL-Y8m*u>w(;_8@iQ7ej_yzh<_Gyr=0_T%H@V*2x&j>SG zZ!hp>&VH;vkb)^y#^8U6EKPx9A}<5|@9-5ZDh*3eigI4t$w#pJr)yxQxj{%1)2Uq?x%8gjwY z>MeBvr!CQ5XXfhI2(`c8H=1w%ZBPuZ>kQht0Qr}}^JpxMkZe@i-uMO!c1!9QHKEL! z_EYTkeCVq3ad)Tuluzl9|K)4!^;8Q z|GPi;(uco{6ho}&S)ATgt-qyK_4j0#1=}z7%|5t(|4rS!>!K$zH}L-~`)^XaBW{bU zLYoeJYI=U^+1Rekd(USNu2*SWrpSFp+`k@qeCPx059sYbF8hn7iXOA4Yo@P z_|Vrt4tA^|ZCmH^hx6?qyX4OE{mjFr@qpUHjr}!Cjqae#&GQ5FFQGQBU!zSEUQan5 zK7&jr_?nqCYw(AT3i2yWy0K{Kg4&h^E(?M8$kavH4lak^Kivm~}6f8v0?aV`Q39 zSmkz(XncBL(PhI{jobU@RqSi1vdP~WxB4k_eM#qsJY0{f+WB1`5Ie};m9_2=jrW(n z+Rn&CORbp-o*q;mSYG0Hg|_w~IPG?_My+$eA+M;=0241ehqXqHZE>xaQUM8+%V(4f zR*xoLzxz7^4!9nY)mrPJlzV5;|EPT&EinUGb|&R<$E)>*mjet=pCp>r^EkIpJ?;w= zt(~1ZyGD6if8v=^1@C1+cEuUi@=`02sk;!&jy-5)7{@*J?v~v9hSwueD#`brsqegx z9m?pPH|#x`c1A*c<36QtUAwHSlRe3_T-9`kGq(!Rnjt!#A>%P9?>Y3PQ8`|V@)>cL z<}YWgtEN5<2S{h;Y1!0U5y{+oMj$7e&Ql=AtN z#Ol!jLp$9x_g%`@_sO(|cDF5lGatSGzK!Fph%NroYH+$h%uPB{57(m$0CjN19V$y{4|+^^3<=YyAg_7b^g7xsM%3~Vjj_K+y!f69E^FnKbg zYlA8Mt+l$y_NucjF~%_bUe;sRV2vBPaQy*8U-K7s52)>Pp=bBSL>;sLiQb!DNmX5U z%00U0km=!G(!;n2AOsNFvOJ7l8Jl%JBpq8UZHrBlVkLk~4PKh_{AryzkX(1PZ5Hvk zIIRI8_c8Y$vuTr*FYjfDkN2Bv?brr0y}m4FpAJO#L)}`v_gId1Uixl-8~KKx$fDun z47hug)r=cA){prt8}?tPS4gB3P_D*r&mGRW{N}Z?O0Jx7gLNUqLu~s9PrJY6we6)x zCgH9Ke05ok*$b*D4Z^DHc?9dqwi2b7a>9vscR%esU#@aVp=*M7{>vc6&{9l5ICI=P z!D(@Hqi!+W#bTkIXnN5$q{Xd`KJ{UR)*?WDX!cX+Y8rcd0V7jHgkF8!coGv+*0J*r z460Mq4(vT!Tb7$GXK*j8Ve%)%3iJp&!^B|`>on=6J}o`%qYs$N-GPy6+ z`PV4gyv>$0y7JOL;ko(Xk)vnsS}%F!^g7<3w;qUn?%ZNRnw2vp@+k}?em~@S^{Dnw z?GF;&@eaAiUw`oO)-gxj>2rOY7ALk#i6-vZLbaylUG9=UD6@i(JhZ+&eRC<4U;fb3 zxJ#q)-P+7#;a2%rGat-1HGI|f>~@R@?Y3F(tB2uBpH_UoU&Q40n;P^*gic))JlNrU ztR8)*GB^bubl)T3vh(B-sD(SVaiNW&vS(a#RYqb5V=uc{cf=83gnK4mmgr!>)g!i?IWno)^kej5LTKCStEJKXF7E$| z3i!`p`PDxbxv{%vZ#_)t$dU>%9&B2mQJfyeA2P+if~zTr?dRrxLws&l01zsh<{xRC z>mLQ0AMS+sWdk1N`UJf5zH$-VVTeo*ELX|a>6_TbeRF=MpboOKD7?a-`rR&L_&U$S zVd)k>NqL-XjY8!%#7?>FscsisHsV7k{;@w|ns1f?zuaFh6qtgn3QAsAtF9 zs!edu8E5U6Xn7@*MtMPduJ!b>*IL|`x5wA>UmX|3?s%Yv3&0bX)QTn?TGP`?`u_P{ z0ld@%OOgYasNEUpVawmb?CRyuR-<(B(g2V#;3-M&ztSBO%+-qfDk`9YhTXrW@soi9co>h2bskUZn3@m#>8Y>3cyD?xXI*95 z`rOLnzYaq5Rjt!Cc%9^RWO?M1)`gob8jq|miVTk4u#@5bl~avymzD1c;$Qet)cpe$ zICb@(jWdLpGn+3bIqw?=--*4rW$bZ3DiHnr{?kmHWAsy-rTzQVhaH1-%=dp*J*g$8 zWc>%^UOfJ7Fl^UeA!>#No8PWtrot^7Ro5*2U6YW67bTQHNxm zj#isJge4Vj6~2GFK(cQe3c2+)zwxT-2ZN~CjUQ@vnq@pY!k4QkWFITL2fxof%rU>f ziV-{1-2eT>;nqHlj>(UkS0h%9K1Y};Yka-puHa6^csCVTeLmCkF6eIpZMB1?aw;S6 z-2#ai`7d^tS&gabTiJ!XPd)68zO-{l=D%(}t=niYc?2~U&>K^A z_I((wQgGYe*Q$r+pJVF=nw`gf;}4JNC|CIhd^PP%CtY9IYE!-K^;6b*mkAnHuDBb; zZeow^x&UG9dPfr^|BNk|n?`wStd9STI7u~5^Pf%WG%?J?kLFs~GL+~HUfMjg)f8mc}YC-AQyitOrLxn9?Ge0Kao>qPs-fQ#mHf^@3I;*!4f&xj#6*K~7A z{lUPcqN`>4cN#T}MRm)j@-&zE-wK|8glS%`H{KkvBL!?}?YP`rYQuhVMM6-;l9@x( zV+-vVE^Vq8=C%^(Un7s|I#PUSrsiCAH@{u8_*I_y*y`uJRcaLa0J+V}@>?!X@eJf{ z3?ii!Z9W_k!si@v1}uad1Cv^o;~jE#WFSX-e}z+KFUONBLtExOU+)80dD<_}9!UVp zmDnQvyaHTmGdSAUwhA7ra?(2*vRK*}*7~l{b6SPW-)ntSTB41&Cxo*r+`2yb$jXz8BR#2dF@3iXq44B{j9WPl5Qm#z#(f*?HR=S?& z)59sGu=*q6Uc{w&KjbsdSVg$9NqELyl+yL4QJJju)!kRSlV8MJDKjevS1@IBCpLnt z6y=>oAKz<=9OK@}+B~Z)ns<@B0X{*pJ9Lv>@JZvE;@qaypy83?kUcG)w^7C_gG1af zvq$WroUX(DWhc%B?8YQ(BByc@PB&(~^pH=-78<(w=adlKYUD@j+=hW>2Ef^;eojP| z^6C&~=hj@XMCSoT#AC@UVs*dOCHR`q51b7Nm*?XKC$BCYU%yi+;|V^|v$uA>FeWbG zSl!+`caXOO5RosBPeLRH+8#+vP}bw&r_iXtgUjV>bSb60!6M60w3xbr4gE^ zMQ1ds91-y9Nkn6WK=qW0;@7b3?~M&ABNH@YvuE4@?atiBz}GXKo7_*hh<&4Tkk?Ex z7jCPzxBk@FY#cj|ODHp&`Bw0mV%82%_TL<}(DeJhZE(K#11GM)#Ix)Uh}s$0R(h>5 zgqGhM+)Nv9(iq*o;4f``AfnaY$FQmG=}#X#darB-53qk0{i3tsxkGiE^Ed3a`SH0& z^p!Wi3thxaKXE|_I$!Y6>{zDBxkiHmZNRRh=eN(~_8v5d)uesDhU%4Y{D@7B3&S+I z-}>?3o;!#piB@^RI&MA7%u^i*8eLg|#HH2bo+&hX*4Svo@2*4Znr@U+W#_-huuFQr zs>Xzql9l{JzdsOc(G)s4)*U{N3&choQV#5ALaGVssAmBK@o}H@h5I@(x^C~9LnJZu zUlRAV@9X6drLW$yHMrZ`hc=1o?ln4u$qh&`BY$fmYab@p$$U`wQDXPfBj%+u_ZnZj zIwHzvU4Hm%@a37WL;}*lf+Q)x% z+&llRfAY;%c;#$zR_3JaZ?(uD?-L7gV_o0s!YUEl?_xdEJqm3d`sI>fRn;xZG8b-{ zlk7fz_9-!{DB@{Z)s?#Nd2iOvHv0Zpg%rf*?i&4S@?>4V%sJmEwaB{YO<&J`!|^C; ziv9qde))wC^84t%hvvgss|Q(d$xQzaxd@k?C;FA z1<2Kr{l`N9S=wJclRXiKYs?!N32k1A3Vn@+i-%qW0Cd5{E8T#e_pKE5=NkIGX!AR0 z%@{Rq7Aw8!$|rxwjf}ap`qx_Rw~Q!n0lei4Q1Vh-20Y+!s{B+2O|L&y$Ej`adX^+} zNO>dh6YJ%V$!Z3=mf}r}iwii=s{c)Z5)JiQ@Ke4wv*Y|Iba=n-hgXf)K^{Z{r$J%qQnfn;U`gw5q#+jDZ=+$#fLAgbt_emqopspW3VMT!bUE^oa<@_5v=sQ)r$pP+94`o`_Z7ya8c z{@3`G`?|`j?=<|#sJR$^;TEKAQGcC_KKA-vblg(lk6E~B-0i@ZCI%me>i586BSX|< zP!fG++}P!TF*>5&{bpZeqADXO8%M{r!dTyhNr7b?}7m@h(cBhpQ@xE5# zxeX(`a4oF%iI9s6J6Yt(S-Me~+%o*k6t!GU+^anMCEsRkGx1tYcKmjO#!5qTT6p9V z>%kG5pMMtq62n>s`w96%=anRc6qHTGl$9~i%1}*EfqH=C&6BnlC}R|dz^;9&hxb-T zoqd=fjMpjIY0$A>&0DZw+t?Ak8Fa-@F4|=)zWrt(EPxd_k^CT1>?gQla(3I|U(>;# zC7lX4PnOu;0FT&aoqj4M|71-Yz4udn)UgXI5sQ60;o)D_)b{Y+G^$;H-dEKq%`NG4 zPj`5~m`2If`seW#`Q9qwE<%s-NA>4i#Z@Ti|}KdezXt4Ju?@t~spxkB5sY4w+v-*|qP zUK|emw%|TBiJdXapvgrxGKRW>X#Lek<~? z2I#l^z&{X^?Q!t4$7gTPgo)U!kGw#zKqj-=GCn>A-s$8e{c zykjO(&qeF0=Folx?L&d+sx|FZ-N?W8vI2A)PS%YVps#4s1Yr%W8H)yVuPRVN9vH9{^?j-rnvR8Y{C z^gjQzYg0!J^z^fMzxD+k>MVcL{d?hS0%$Pz+KT|WWWRES$ICl!uI<~2$VfUMxbW@! z$i9na5ftBho>|E3?BEHruZyQH$431m7YpJnb^R}NvOXOsz^aS>*r%a`2`F4Jl-*2eNXmwO2jRmpm{b%+9d)G+J8nq5PJDX1Lsy8V2jj9D17l$ zQ_*BSOS3aie&k1c1VGi`>SDbBjr8+3^v)iuUH3kBFUfVODP3Hjc01tmw4rO;>Jh7S zfyd=345@BlU=O3N{cP-(x?|qE^o^CaQRVEDX)?Qoo)-bi=v^bLXa%1=EC(SCMk z+WdXlR@`ma{6_g~{)lwHfN{b9(>8&2^YG(fDm= zsL{x}aTV*@@{W|a+V+#Q^tTtu)&@pHw}kN2`9`(Jb>y~;7>K~(E6dD>oE322a1Zxs z`qS!8YMVuX_TQmfBt)ZCZ3EQY{mwMbJD7CUEiuB;Z!?7dUo0r_3O)5m0izFAD(Dkgeof3e2)`4H3Khi|V%#sJXfAa^T3L1F4FS_g`U7a#`*Exi8*l-uBdRT)hw> zb*rz37Sb{$1C4d6HEewGHrN8L5OK3EPp#tz!tz?cWuaj*?(oKD5<&vcqVfJyJY4sz6hW_Tj-EoTb2`kc1 z;*?*={@iNKT8wx-1zjIsyO4Zt z_V?zjH<3SJPI7|0w0PEFB0mr+GjI*8ZsG-`vZ=3$~x~t=l&ynxPzvjv$)8#&ve!PwDg<Gf68KRQ-z=J)%5YM^)z z?G9fecfIpG8~3H}W$d&1FF(ovM-AIRndRC2y+2AA0Edd0u)68_aCz(0Rz`A(d#-En0CRL$ffsP!`F67+^#ink^D>f zs;+x18q;nJ@SKsiPs3|_&RFTM%$|?O$CR!;A0I7Y;(=Yxe)%c_x)j2T%uO#bP4&-Q}68GN_0R=STR z=~0hQBjkcV-f}i~(c{&i15?P#-%x~^}Hn84Y{n43eN zt8`N4CLUFui))FEjYK)>^ticM#tUhnBJE!+_yKQN0eK7cyOb(>cFQu>`q83QMDhcS+xGh=n`C&Uy)8aa_GO^^ zA5f7PKp<~!M?9QNmT6`)mil1Nv4_(y-0Nc(H21;E%r7?QHfFcj0hc&$*<~JPzfF8k znO96$BM}`QA`VMbGR3s1H2A-BQTH!xxWMqTo`BW(mWwv_T+`P$ymFf+Sn9y4W^Kq2 z(rrKvX;t~Bw?4-{W*BHfO=r)Y-K4{X0}axoSMF%Pn#tq6NysTF<3<| zzL%M{DEy_Db2Dw4Wd!@LrG&unc0R=^_(gvMS?i z$JmfQ`pW|^ZkcRHT`h`Q>X4ZT<7%lecNzA&5WCh(Z_hNZsWx-VS$Zx@JnIF92|DC^q}5l(=wPI z^QP%N{wH%v)^f9O)dm_*b*VE^-{L`Zz?|=%rj2c>t{D$~k46oh*`;98x@yU)m@s0y zR*$n9kH0s^Z9>9t6uc5HH6Z_cB0Uc}weGaZeQXS797bNwj4OMYde~Le_9Tyqr*(fR z?t@xS@!WvwwR-E#0bb4pfyVXbO*-NZb3M-<1~l3%T-L4_uVT(Ym#11*%@)kJcIM0m zvsCWbLoMOF5Bx>^|658`@F~H(LHF zFt2S0)@f5{G+O60RA%E_%qTG%j3-r%c8m>p3}$nhHyoZtNK3riTTH^ixt7DSYHH9d zOgQmo!Y8vMcKS=Y(0=~hW7)y+_wD3nJx4u?$M-_G!M3)WOP~MVUmNPXolP9sfaK2I zz}lVAxQgziT1(Tr2Rl*#wqnS5-*=uyc}f!WN+s8V@s;qR-Sir)#aY(K!Q7b_&-0h= zlJPK;&1)&tX6qrW#vcwmZ@ZROsUJJ8=`iSCe*VnMN~aQ2-?+>sUAsn#dC+|&T1M(rZ?)AK-MnKl#Etd^B}Uj#g^+Ve3^1V%7)a zW*hZ9tlnKoi+7;TyDysSvV#jLKx4I*_{=SS7YMsyNt^HRcs{-v6q^1F%wnwXda-QQ zwTyi`QFPBe8WJuT4dmD8%l#%RpUORM?fqJir0@C=mviyUlCISTj%!=*$kmHl@9C6i ze+UX~7;PN4cJX*&a(a4K79T|X=3`h;ea*9vE07A_0_OF#K=?0oYTqYBEENX41hmb#jL~9stn7eJ%S{D zOSd(bFqDN~Sowo$N9JdY3~m``S!_aTlS;T@0r+W6%zM0)eV;!2=YD!0d8L%&2omD$p>?MoVT->rwmY9$G@80Xj7exRS89A@EJ)SN zjm)!64KcpC*8OcX4<8MBP-h{R&y4T0VdEEIF!UrNP28Fk-80dY`dKMRuvq!cLgD81 z+{)26!%Iq9k25l67+0^px;b(N-E%1n#-6Q}lNNC?^~-^oZ1}R1e#w(Oz{}G6svg^n zxeq=ix7(OXLJ$Z~VMh-#+?RGX8)p-@G{@GlEGaCic!7-KRG1bJ*mx<&urZ8Wn6vD+ zSsHQicTp+rgGdADhI<>Oy5DX?96d=q!it{n8g>y2JD=h53 z_@8!PMm&9)J{;Al>OrcBZd&E9ZeT3JKr2R!0tCgR@55#MA9h9j7CPZmanCCmg|@#G z2}l4za>oglegGm#r?9lAF6|4Mp27sfa?6Vt)vz_%!wIou2pWs`-Ip(9m{aX#)v<{u zZ`OQG=t2*iTlKYfoi-aEth5or(!6JaB$-t7PAoebcsNO82U%=O)=)7-Mt!d2kJ%f- z->zqm2ci?=>ARV4oXZ@!lghal<|nsYa#%t@(ki15eC3W&l*-?$Rqz3_wjv_i>ay4r zVI@6V>JKepUC8OSO&iwM9)Le{>;oZlB)|_+XGaQUVOZKMv06(hJ1{52384x&>tC^& zA>j89-)+xA5`DuyCK_RdA(r7|u-3x$j1-+?kOw5F7QUw3=$qqrYyOl-6{ukJrzzWW+!p9##N* z?P&nrPqJ@a((9rdiw;@G6ODx3V0x2&-kHK9LbM1%0Xcc|n8)lYbB8T3m8ZVB>XRk0 zAG77jgYL)H8EUU%^DvZ$#I@dKE?T};Qw)V;37BSkILUODA2Imfxw`^8V;0y#VSYU@ zM?|AMMfQ62w=C1ykaU->W)VF}Wsj*6@oJz$OvbN|A3OJMe7ioa;?nc(HFn(0)@h~{ zkD>33%<`)G4fT<&eyN?-bG&xV>vuG%K06pgR%r=}LcC17pF8f+Y-?`;#`y3A-7vC& z>-K0&!W%B&-37_VsSj2~Ub50MwxRJYGM1d>B?Y9+?Y**)I6il?atFP?Ub+<4iCAX+ zp8KauHnR^Q^Q6-u11^0j9d*9m-6rjWY?9xrS#p({w{0N^FQ?beGMCffA83IH%`As! ztp;pm(eabWONqBKDzj+{jQDdUZ#Ob!%Ccp&zECbYaXX%e%Y;n3XIwWU_I;RGzCDen zwD_|lT!c@uX3X))_TAXcxMa#mL|Ir8klbiP#3LHFE)p^4j5~^!i&4ScO0a%CLhYB` z9HNRT0x|gPo?uR_&fVvHj7UcB&CPi=hJB3#u8%0SbWfu;MjOP zEe4c{1SK!Sp7kbGW(Dj_Fm8#i*g@9rc_k(mq*usg3szEO(Dcr%}`lL#ToS@FMZ)^=Pb5E+A5+_Nz$DN<%!rV!>{$LAq9x5)s7 zeeriJ056q_29{a5a|g=6(GpUkRT7jNDjU}=?bD;xLd76FGU98Hn=<9wHhd4F7rfYf zM=WJ1lL-=!n`PIsh0h-e;#Or>I%W4|cLK7MtiGvLTx5y(a|>Xec8UI7p}pZ?}_Sw=rdLLTH`REuL8{K zz`e#RO!zP_p)Gd|)o8P8xXm_YRf7Yg6`J=Zk4rEb?AC=ysX9i~==omLJ-?TgFTL=; zq4=dKEqYk8y}*guP#o5m>8Apm`0q*b8r*1}%Xe^;r$UyM(#!H4)qun)ua-&fWKf*(SvrD)UX{!awS;q?Q#nl|ah}JyeJ^2zG?nA^YT(F5>l59$mqnxP=6-c%Mtj?4Lo8X19_+0xqamvX zij7}yK^IYBYr%gtM?L$`==mXZ7-@K67;GbXLGR>AI;*u#-%&d?B8+ooadg-OrYe~q3W3~gEH71cA=~1LrxDP zS}haij?)*heG1W^JI1o&QBV}$$e&?MY+K3sbl z@%FzGB>K^|vL*4v!|bF}B)41jfRAt@^m#&j|hvS-=RI44Y}gmWzTa;%~Z+S4L!huhh_ zWU%(&rBoII%=+as=k1o^q~7XlExD3knJ#6BlJ%DPjwckUT0*uir-fzh|<)R(m!xH8zm5Gp<8%p|>!`c_}k33@N`eO+M$Ebja11IzT>V z7GNYI_}h4C+LI+E$Jkj9ocm=Bgggbz&AR4!b2C`OS8#J}n{l{ED0neUOl4Y2S+%19 z?rhIwZ9*L%K7n1YvFhn5d<2FFKR3Cm^Vm5xj$xSg^+PqGNb%?|waIb0&)d3ZM=gP1 zLO*6?GBIrdlMU8tPB@rDDY)i#OA1c5>DP;qh&9_AT^-h0p_%IlnVVj&b26QqEXZy&COerl-9n>D*!q&+CyZP)h~t@ydz*{H zd6%a%F`G--Y=;(9w%TQVghyU@xa}!r;j9c;WV~U679SaN<&efH*_L9Dlj_8+vbuUw zQ^7Ax!vYWpr#Hs@{XSv6oxfqb+k=>J>osC|g&}5rY1w;vQb2}36JZZw4~tC3HP2Qj zvC8W(nfBU3FJqV(QfAreO`UDW;~^kn7%*Rk@#OxbA(tMMD{m+Yj|0=sN9$-iyK>+gp>Fro80 zu~<4S_%GVOaoG)0kk(9GrWZAvPb1b!*>5RhZd|Zcd`t^3iljm+Prh!f zJt(r-*y_#8eMSXk*QT@Sm)Qd+RVEn;#qQ%LPR3??Hz|=x$E~)MpIc*FSLtrj<7cy{LVU@A_@2~@ja^bT=O3rPLN)f)5oZ(#fk7jP@VM%9P%pw(=nNdh%Y{uL^ zG0AElI%LN3;%vrddr40csyxTy4$>%$7f%GHve}85r@kg0;330S9@Go(w|Ctcx@ozX z(qMpz0D%Y_T+g%Zm;nfSg250E023Hn3i}oYFw7y)pRG%AJne*+3 zuuiWKJ)}2ok`#-ZW`g0#(I~TdkSJjY;dzte)*2?+Z?D;XhqUyvg=2Qg%fv`$)hjm7 zmQaX&jJH~R^j5-wgerWbyJ$#|k9FMkiy6$ISWIh3X*k@{&}~yJz#vi(cHftVTTL^w zGb0+8?%mxaL|i>;i|BgSK60j-(Q?aW7(1r^<4VjQ6MHFmmb`{_s^E)W;_NBcdum1`>~`jetCQh^I_((2 zVHl7RoKkjN%1*}nMDR^m6Cg_RMU^qUwo-3(oPD{NMf&DBdgct;(D`d1gP7-AhrPP| zAZsReMUS7h`|jITH9FLV@)A?YfG|lGzQ0hmZn&q$-053^Rv=$CSTQY)OJX+B4|=gI ztZ#wpgt6f(Z7Pas==h3|-QD`hru+T67%45a+wuVK1rUy zR~PNw&A}KM*Dy4^;Z??-p>enl*=2N~fqVh$0wiL!r6#dO*7|GUn@%vsVo`*ZY}@GA z>n4;>BoD?IdVX1@#cQRX0e^L+BfoDM3|$9)(WKGgYgzajE3~edyIB4C8JAg7GO}Ph zo()+o8t^WD zGLrn?*vqyB(=`~e9X*H(SM*dqAC_YI`#o+XitIS7Ts=4o8ygu4(x#NK9y90cdlC|) z#9Ka-Ju~U^bEh8eWC3*l7qr7cnYNq~Sx(Kbwdy{{8ZQ}q)f*V=)9^`pu5%>2&pD-? z>5F>4=gIijo_1MIjiiIIiw7<3JqP7sQI{OJ#$ktA7ZryK%y+E*6ylpZE{9SwYCwFu z5R6Q?obegV^F_0A<}hQ_2B9QZsBRhf-iw5L*or?Yt?y$A{I4XezE zFB#8b`*TY_POt zgSof)`ExG=4kOp)Vaot(>0v)k7RwcjF*6`FU8^JX<4Cq;R#|^W46K^C`D67uPx^D? zJ%nq;>lbC+3@B99nyuX` z7cY5}V$;Z&0?CQHHXgQl8oJYkM@QP;n$_G^j5qK#&2|st%!NlH6`L2QQYyYpXkW(m zK1tT{JPfa)09MZ9O02ljE8bShnS4`1Dmn2TW)_WEK3_Tyb=Wja#Vx)pvF?8=(<`R6 z8NJhj(VOhz&)CzMRbrsSqSlj3(8X-R+I#_U%Fzpu=)N=8XCZ}d-Ci`-&$jYztnF#e z>tZ4N!#^ix{$o9+Wi9+%Qe0^STPPt45eo(q64p=BFMXCTqrGWPlQGP>nTA8? z&fvwqz0D}%qysIlTe*E!9c~ibl#>1R_iQ>AP0DcVGzm-2U$U5iH1W7z-GP}ZPHtl$ zdXUU+cHcm{Z`k(lebgjO=NRYNCKE?v4TNZs4;VM=BVRa&%9Nb$W#utqS<@+vY_KJM z`z4=j?1nKSfgcB{VG=kYkK3JgTIS)IE@Nn3yI*cs+n+g?A85|{%Lztn_uGEyo7Z3# zeQvdTUye8JxiB9B+v}NRq>SIL7(^M&+x6L0ByQe!+Ga1#-z49#XV>oS#$``#_C?EO z-Pzr{Z0F|lFsG=IlHX{B?Qj`wrxIVS?3!~NjJ(W-5s$`ZRgMwo4_LHHd%oN$=cYASa+g7Q`Z( zm}|tM&YGLAY`+~$Z=TBw)?C?TFe@oxC|^EE=t|iHjEfg7fndc7qLn)>U;__)Mw+(2 zR6fgf#i0Ti=3s781l*CD%snjD)QCR~_r9%&?Mj%?_|0f%-*w(tN++ILK5VhDdCW`( zLHn8Ax0R6la_2S~$XTdb`o7y~zg|t79ODc^K$9!&GE0nMg!<`Xe0Ezc%pzw#*?YHo zvq{Ww+{->RiR`ZLT!eslpgGw#_RjEYZsoq2P0aCM752NB3Pwco>V+#si`hs(!Z7y{ zuEIY$714&TzA%$*rNl0tq$OlWGRcMzUz=tgmRYyXWe**bGwSFNh}#^QMZUf%Wj-l- z#=CbGlWEO}1!}yLmLW7hnNHkLAjKexO?o& zkxI$7W@Hagn8{@rz6W)IfJvm^6^>IZ%wq?St_dwdAzZAw_eXvsKucc*wlc7N6~R>Ats*CGVc2H&ST?-P2id-M+$4h7qn|xs`r;q26WNDdrQFSv#DEf^ZY7hIU;Gvdo96 zEM;xXq3tJ}iH)iYh{Oq8+`utpxx1LY*|zFrbj^xpmYP!plerA-%=yX;1K$>N54Ow_ z2Ae*`*^u~aI7rue$+dBa)|v3^)5)=u7}OcizSZ}2?2*wY3@{y<=b%Cvw&TV_CiRpg zDS9%KJ+W@)yR1>4P3_VFGT&&2+jGpz)r5qGN2&pX_TO|T#i6k*AvvY?F&HhlIRUOr zSaG|PKH2e;xZ@8J2ZIZ2)-c_*5Q8CXFPV>*KDfzZjUN<(4Q-a(bHogc`#H>jyF=&J zq1Ud_ac1f9lJjx$3lYXPYkcZ~G#%F=0?xi^72svMN3jUKW>#lyi932!&dHwRKvWC1 z%Z#)`#**!3dsH)7EQ~=n>2Hqf^5Ns}wq^py*|uG`*8tm2%*=$-t2b^|PGh1dXqT1* z(5$=Lp3ciK%z|h}GqPIEv^dI<1{A+9+B#3ZcZah%rO7u4;DeXRY8*yc!V;qoC!oI> zk;3WigJ5u)Ud# zVQ*q>*_cy_hKLhVi7dubvTe_nWOEx09TE{fX~U6Y0EEBTHeWkFX<>xYzzl7UMNF2hj#?70kw+Q!X3XBnC~j`-*lK3xIZDA8 zQ#=Nu!Wc&RAH&vebylq>0ZnQ@2ML*O@ZR2u%#DLXZ^@k@C-}079-*Eg6G1 zEr#CA53$_0#ry2`Law;De;0|H-b z&9Ko8ag7wM3eIybI7|ZFZG0h(u#UB3?j3f7sbb$sd4g5=k*}YWE99%Jds#Jd)&fK! zEh0+1GqHyKeP+_s!rv<)0epuo`o^po@-r%vEb6Q6w7GNa^tqdvf%fFnH#az&K6*gC znU!I3*-Wv_jjFOZn_s%`m<0 z*CwI$vVe>y2nT^ShmxrZgzCwjgk57q5?*s59W5=9g<=HOlk9$6A@Lf=p)Ta7%br+y z04YlV0$AFaZ7$jKw@0tA;|%~jLO7%><8kd}raxsJW|#?WJRcYAlK7Y*HV4fBI37Oj z;{chTeCF5$%Y^KEtg!c17tmn9W~fMjnoyYJ;vow!xtk@E$kbSJx@iiD=;X<{zNOQeJL00N3_!6 zrwMCMf|J+r`ebIkR<0W4wOQQd)soV7%7zY=xM>+_qpsh zL`Rh#)IdW_Yy}X*E`D?n1i0~}(^a6N1RA~GCa5b=h=c~L6%fSBNUarEGea~*b1)P% zG}Ay3z0H7)uNVRru@vH@<%$-x7=r`@21SY*q+MF96Ee?vJ?O%C;eqc5iYWM#`35(w zMis-ldCxkHcdy%X&g$WEx=FXP?(tnOWVyGVb>-(qxpFRS77`?hhp9<3>tIM1CBB3h zB=HG3WC##0*=H_Ro~M#O<4<~f-X!$=#Y(k53Mtpe!uVW?+hpWQ2x9!YNUPU__!~il``AK<*Jk{*^>d|MhDB;`m6lu(49mXs@i5 zZIr1*^@_#-+RNmMwX(9H!dWdUwya?Il~n@P!cjnhY)M68GQskeR@g?{L{Vh`Eq!Gy zEJae=Ewa)oc%`6HTD42zy6dF7jng^adHHTk#ZirrX|zOCm?$C(NSaBR4Lvvk<<%2K zL~qnn3?_(_SrTbXX+b28`31|2X3cL>l=O6`B=$;E9|Q<_@>A=+U7KcT*|geCqcCL! z02Y)9Ft*m&mNlAVOryLKc4OO$hsseoA>aVF?aG~EovKE5D%J1ZDgC~+!6_*N88RH| zbC5AfLPg!eX}@7xzf;DJu~xd)ni(dV#UioFy4P6NL{hB`XyHr{S2^7}y5qX;3$q{@ z%4%h!HL7H;F=eXE%(+xFW=o8k*seHpNvYuKPo=64Tcn?Hd5tqaD>+(b zpAXZXX=IbdT@wm&^Stncmy4vxjhKnEyOW)wAkrdfl$iqvbI(E^^GC=MX;+_AYP_XX)hCpw zulk6ghuc8X($dn>G))>Tn5d&z+X-k*ZHczchRbZtsPa^&n<{iG+-lWJ>KfYjFleNP zQK=1x+QJ(YXo@yI9@SgOQk_J+9ZA>Ho?fbZ6VTf;eV*p$ljQu=PaZrT1W3!6=e!aa z&q|TDAvv8obDDZ;lhIJ1T$B5fo=ChjiA0oCED%VhWduOYAeu#x3IVDpsj4CXo`4iR za1Xv!3E445LcNC*TufV_+~;>nie}Ebv$`URD8Ojt%o`bzxr=vp?&>Yf!(Roq)#sOq zL~?gy6E5A^mp{~$?kZK%elb(9r5s0BY__%-ni3{SlKUOD)&9#`zvJn8Tb10qT`pjc zuWM>oo_9(zq9v-yV`^%{sisoaH0>;Lj$2(_RH{x^Y1u27;mlNJTBc@YYP8XtRBKUd zsdh`E>$u#vIm>g5dlHp@0H@GNJ_J+M z1@p8`cHL8CHkR@HQszsVz5bMGIj)&DSM3sdnxnsq;|VmsmQgZYX;W2t-4h+qCu};_ zvm0zMM#x%F7sSw)TsrN}CKl_drZZJmtxDEcRh3oDvH9}q$tUtun7@D38qNcgds36kfK3}k&??ZX12`J zG}e6$3I*Uoy}rLX$wFjGNVJj?F(fguMS~_vG-b8DDJU0Ss2#hvZCf)&#@jYwiLqC` zTH5Z3HYo~27K25J4UnTGOhahVh(ZmG8X+<=q{b>X3KLSkR<&!n38bjBqHJWc-#=Sv zs`x6T`Ix+QQHP95Xue;>e0LsuJg)IR3&?%%P&#-%zI}c7KJO1pC$723){kp6eT1KB z^gM5As6LZtKDzwaHAdDQYnRmF^u4dQ(dVT05Pe+i%k7}|ke=7wX2c)8*;q&UZ7yEi z2l`7xPeuiE|*P?%1Tuw;2$N|Ky6Svb*NU3?`LUv6{PP zO=w*P2lZYj=LVPcAk24cF>av$ErrtsM((}8`V+s4Mzg=}XxVAp&YqS#N6)bz>T{eQ z=VCx>Sw}Pc`*{J**8ar5Ca$k&Nn3JX@=0wwCUV&?G%E&PSGke3kp`;*v$Y=k53X?$Y#$XCT1%|lY8;V?=mKuCX_c5I2;i)hb9(N%M2+? zjs(F;6tCm4AJkdvJ1^+Rd~itp=MKi~eJz_~Ku7|`j#MJ=J#Zi7UfIpW?VkWbIwWxrRB&Z3GiD6?nV*CZf6cjq}*i=`!t_zy$uuTw_$=3 zTERBupLSdo<|6wkjqs48A!Q{9U2OrQ>dn_TGbZdwo_#6n3k%|e36+$&WS~q~2p<&r zd>+N)R`I&zg;(OhfMS`ZlsjKi9#Go@-(#VnDJ5gST$ruP;K+Lj{fTA|W|&RU`?n@6 zNF85L!hQB#Wm!nTq#Jz3LqS*XwoT>OLDFT*%*Qhmb%f7nWhup|Oz#Ki+}w*=buPV1ZZ zOAl2^1IUpB=d7k&4>f&SO4*qx1sijCr`t`>tW|3zJslYktxc%Dfn1@r)7!U{BU&IU*E!wtSDMP(&I?7 zs|v}ZN&hdo2+(Ndvx9;X9wjR&wA%M?w!R6A@8!SQ$()z>t4H^mJTKw1fonSLT57^R zYv>D?J=nA>2EJF!YERR#2GuA*V#@}zAAaHzykJv)HoY(U7`n|L|bO)|`^{A*>H?O+!ysgCEFiVKHcyDEO`O5cilhc>!Pyq`a9`NUbScZ7 zcNk8aX%8Am(I7!2wE%p!1hUyyzD!!7$b?rAiiYwPV&LXoNSSbg?qv(I+RJMX^8q>osH5%XRo zNq`U5B;4~w7$8io1dSzG#F~6f`o9D*Jec{EaYB-9k0@l(mO^jWDHO>==Ggsi?a&|+ zV*Ip19wEz%b2HgR`uhC1iv%*zzZV$8Uu>enI~}`NzH?5`U=m`&E2JH6XMwQd%0?MA&s>M-KJ|h)?K#TEclX@^F7%+h_ zPB5F6RaV&4J+;j2%p}T1fua{E@5Eja}z zc<~-%M9m7Dh7ge+E(Y{7P(BQ#iSzDF|d zK|PBZ>o7eW=;$!1?)7C+u50f!U$tP*Tg~}k^R+V<3pE&D?q5qkA}4&%k}MiI&T~Dd ziq=yRfqmnV#9(+`lMB3P^jX5PV`hsF`nR@QQ!O?a&#=~W7ZQY3r3UjdYeKqrEm3t^ zJ_kwX+rhf!kp@c-(8C$tF|)?i-%1x>LIrg8ox4`JFtpmeXFc#$$%rCh{U1ytOkivV(tV&s!ZI8X=BUC+0xM76is9 zG1|f}rKuZZQSofY3PtnQOy24Cv+cgH6R%mHWN2-4+QXiOA-^*C$T}n-KotmCmOd;p zG|8V>`W`X!LLUu)a22lFb}L z%BpkCnT&S(>oQ+aAqin00iqy0Wv8G=a+0>Q5E%1GC}&&DHo1(kBxSZyw#;0UjyLV& z*$5*i!>QDvvbbkCu!#r(NtboN(%|6&2^fuA0n#CYcJY|T8ZbK&1Pj)NDF6)eVJm1t ztkHx|IrW~P6BK}GljhjbmLU9jljZb0d}rNskrE{1E+;zEEiWGu>zWVPb@=x4}ZWd%zPjc7;M5ou*SJ^(t zozv&nF4=(&w}UYCge3(a#Uef;=pNahY*hdWpIeSt^^M@;VB zo8LLN?CF}wdZ8<9`Ew+GZJF4CC}5R|Z6PQGE479?ZJ1d5=5ed`(~O9_XcGKcd>GRC za>$|t30OkcPpo0-_H`zGWz3hhT%((^%MZl9w_&2ohAbCB_p#z;tlFKU@Z3xzW%L>+ zXjbFW+MXq2lI5l(U8?Oo4 zKO0${NK198^tU8;ccQ`IGs4nXjP5;0gN?r{*U4)G0uSfoK}Nz7#(c*!J*T3>6`oi9 z8+#HLJ5~)Q7fdo8?qnEF$=qE)Y~Dho`K-xdMf5YczFCC3jaXU1uK&SGKL^{igt_ls z@~gttXg!yV&OL7AmCdIUDrjJCwe_>RaDOz5T__4HMs~g=fVF0><{XiX&pQe%v45)T zgFa$=w`JQ&Pjb87kV%-kkc;Pn(&RtZ_?mJ0n$5ENq%URp-&w9JR(SA?mVaCH#9Fr$mZ zHT28o-6bkw5h+kr@n(U+X@Lv5BKdWi#@VT_g*mN|=8ZfeiE z%Z&KJ%Z$%z9QAplwPpMAJ-^|$6yhuWrQR;m-`{h5+|c6yIIS1H5p z#sr#Rpo%Wh}iAFV?rmpZUzSA z$^nMgSXWkOaP7dBXppSIIx^+Sq_8#1B6!*JrVyKDy7@R_`jfNL>n1&9VJ;p|Q;dGP z5W(2>L&0+Sm(inq2t(_}5OZma`y5jX58Q(h`nb;CxhmBvBxYu%VFb#6HT*~GZy25;94W>&^+%jX#S5Q`A`PiA~e>R{g~<;>FVtfbn|CYN%PEyE#D zd8Kn(kN_cp@tNZ-OZBB$t=#qT4kfNeDVCQ6oYOLWT*0`dbeF{?t}|{Ig;~xL?E22c z3CL|mDCKOm35?11Z+A?XA>f1$9LN(aLQqoe_T>JGVAL-n`<~tv7t+#j4LUJKQk5 z@3PMG45nQ$R_~P2)wzH^mR_~Y){KXv)1@VB%r?F380vK64-(Qyt&IpPKEGlwp6gWD zVBA1nG?vpXVmOyJ(rqHem~9NaJ5K#AgxvIGINTLSo{VD_;f(8ZZE37zd5|(XoU$POie1 z-tFVx5$MzF6CVU0nQUAvgu(dOcQk>aI^P%C$FkYhFn|dHm`t>^5VWlMrXIkDtTDes zOR<=wB;LN9V1y!lxtMc4p&yv*F=bV8p$f3lB&U^tYp~4kvp&@CngmUjvf=C_xj>l4 zM_kRdvdtWQY|8nuq!>i|>yVR|Ryl8D;>~P4VeC7dAWe6|PqWTG__o>*f$QhU4EyVR zXMh4j>tQ*!51f*W2P~jKpihdlwY=a&vX94@+u-I*xva^H0CkjX`!JM_9taO(L58%r zWg~BlE+cEPa^s|NLPk^@Fg?844L}S@OwdRbLz4mUg8xFsc z5s2n!_?|<&e=}A?@-x!;*zg+e>ET|$SkuatgXZ%gQFO1M(C%r=5u%g0&!r={!-94k zh<5n@+>!kg;2RF5o|U}F@G{e04LdkF7;%eX7Zqce(zR&CX@1sQT0vduy5E&639nj{ zP0D_Bh1+3YS`mwV1>;=?zekrEbj8zL_ODu#-DXoW8Vi;z##=OwBPu;hh!%Um&*jMT zPJ=1bxPZ2H4SkG95ttU&y0ar4`~JjiyG&RM>`2z+b!p5ThI|i`RuZPqZLGGZzKuxX zYTb$~;HPZ{BU7{M*7~P+J_yhMH!51TSK8ULgYKAwtr|DlLtsgtt2Q4bJ}*J>SKh#b@h<=1<*!|i2)CQJ3LrhINuun>nS6YKS#R1IyEwli$P zPWg%L=ig>5u(Jp@UqZ4v&9SEXz91h!QLTmf%!1#n#rn@rf{yFGsSz9vp^p8M`A;628Y$-tpYUt3cTW@L|U&s<^|QBgffP{Piyw|1)eEgP9j z3C-}?N#oWK2rM8UFNgq0PZ^16XJwjZQzqG>rx$39Xw*7Yjza0>PS@QH=Y3y7B;p zKzhGfEGOi2Wu=pIDfDk|Cf#9S*Tt88o+f2y!VD@ ztj2U$Yra-q)VLYpaK)u%A4~DP2TA0-%uQ)qKd(j#wvZN0D@I*1{~i_73>FxTUNY7B zT{e}sf;1S4tSz5;{oPm%27tw3)y;subQ&-85@c3LTp0p_%aNJD_CotWaOkKzEgt<6WAQ0_$9E~dyX=u925U?ZT zOtW#_fOWZ)M|Rt`ZE|A_zE-KuR~up3KF?*%sfHQ38#0Ee3V3b!h0B=d%s{| zNGF2i&cv0-+u~~@NHO83sLL2=&2rlth)Z9r%FIg2jj9KSEcw z7cv#=JM8NPDw#?ntnG*XUyGzX#6>;h@`i^y90i3hkin zJGX-M9t&2U)ELaF#hlXGYo)748hqr92ghPoY%E{S(a4$tn_D_CSvA{fa#}H(GMIK> zm5Z>|qb}K{QZ>2|bsE?0M#mljTfeEJ0^$Xx%vQc!I9LrG#$`2j|2v3ZOEtQj5?^CD z-hG)R)n_E1mHl=7lurbITxI;>ja>X~O2RDstK_qz=kz>$W=VV{m00S8qahdT=#cDS zLZEY*?4MvUU1!!uSRoMkv}5t~DG!&#DJ@LYq+HgT!~z)UDnvB&X_gEDvb0F`mv`cJ zdruIvsZwJ4C);jPiR-zy1IB`5>*^#S>Uoeg^9^Es(&yDTJZl;+seTdNq4F*+!#d>2 z14M%5d_W8Zqzy7;Q3p4epCft6b-9(E|Xde$zm|R2v$vMw7G3uJq@TX7_C`J`>b4c8yzS=W1`EN zvA=T&SFbN-@=GbA&4(d~tE(M`6Q2$A0+sWMF4ex|BRSO0i8D6SB1Oa3X7f1B2FnY# zuag3#(5&p~O6h?!S1m4Y7Ai1bGgeOXW7QzJe_u)fyK0Qp_*(g`J-j8o6iS__na3 z_7RV7E2)Z%rozF5HJJNOgUD*Lw&B8;u+k=}r^7JbYvIH!tf!0k)%?#U=2(#R8u`r0 z+qg_RrZGfZElIPIt1dWAt;f{kDs$MvVHi=NXeY4D0q{&;1mUc-V+Ax=w{{_KpeTQReVFa$xM*1ncYvm zy$<>FNsO~s-!pq7`tv8}@Z@)~yN!wGqmvHD#bR#br<2uBXFcrgyIk&IrLoMGF5E>7 zJE@J_SXgW{7%98ZyA5bHpv~uc&t;ffl&oe!oA^Qw<&+JnszKRiRfI0%Sv@#G<6u{3 zL9O<*pDC`J3f38Y35i(8H{P|*n=g7K$ZI|AThEqO)E-Cpx(<^{=I8GzQ~z0i*9 z3U+Xp*u}Kcx}g>7uWKJ{Sfb18mnW zFOJ!nz0>0eZoP)}_ZzQQ)$$n3v+Cqx<4k_sg=gJrIIHoPz#eokjXA|6;p9!-SlQmtON4nN?y=dt$qSC0(HCPS?v>GlQ$Hy0p zOC6(|N)bVYqt0p=Qg)0v%;P=2q%JEClTv(kD@~5nv>A%Sw9PhWyGLltW*;jBV$gEf zU@?ALP)yX<9|bw6v>3Ew+r5JMht=GGDLt$xN*Z4~7Ox%;9wm&GuOh7(vz?V643z#f z0m}EFC^TX^?IS9$UP39!zZ^33NwS3a~Mj7Sm? zkx=qD1ZLxgHQY@+`)%yY>_%D3_RBLJOtu2Y*hC5>98X8cDXqkb4&~CN+UwPNdk8SL*%4NGnwxpe;$z`*fg$Z>1QKQAbmGc`F zo^(>_!J@@Ei#qR#=bEEGa|_(KRT*=K2=23D))BDw+%?;2bs2EyztF(CVbti>&6}9R zjLK~VcSWMJ#c1rY8c#av&PN06Jh!9p_T}ng!ua7*cMUv~n<&B{emS&&MlmXr@_(zQ z%$IUmWzSqZ%aieS!%KWHv^M0H^M*i~o!Ozx;VQfPAK!O<^SHp4QhaVYKtfHqu4LAV zn9Dn_LSzE-*&{J?vdeOpA5xKJ8Wh8|ci2+~BQF{f1U`c4PT{C6%n2Tmuw(nnSm5Cr; z{=KBK+OF3*{w(s(fIauD!1-CqW}8Q)niZf|tfs*C-W6Eyv@8r*4JLkUS}e?Am2)2} z0va!GKEHNjL5sxKk*+iEHOz3)KD1&yf7uyLXnio1t1KQX)MaLZhHc!AjL_ya|)7ujOG()#r#SZplb55);;HPwA4mOBEoE}!7fGYeJ+b&9J& zYv6>AtJR?iHn^{e5h#AO_*t0(QXwT>6Y@Cv!}2az^6TV;`n1Mi)b1NT5Mw)rMj(Zp~3nE4l{bBv1_%GGzZ2Z)@5=+@(s?jsTXF;A8yKZv>Ddw~i zbXXS;+H0oxzibxGdY(fIr@c!r%ewGWmh%zTx{d3ejttwZFMXKn zw$Iekz+(8AUOt;L*jrvgFMY@_o-0N>6_!jd3o$v-$9(Gu^DxuCog{Q$U8=95(Zw?8 zNdeJmOD+h!`YD_*R0acexV)!d$U~Eqpg^J0n*PzS}BO`Um z&ScHii%1`bGYN$QTs`=wC*f;1O#;A+-*uB|?&SMz5>J+l2j*PM7vjSV^Jg;&rt6GB z9UxmXUfIW`goJ8zLZ0YK9SA2dykJ{&;LB#K&0)IE7eTM!!_*x4_D`q2k z`5L*@?ns==27@kq(!F?%Doo*ak6oDT;<0MqzcEFBk&^4YS$uFNbQDJ8zl)_aX}nLVJQ;q_UMC`IE--9HX{@V^o>^H@P(g#9SB z7%IP###kQ5)S{$TVdAvK1IQ92!S*P6{zy_an8~#KmpIDGNt!a9XIR7I%-Jn?(2Z6N z2CTB2%z8NSZgYW;ZwFm3hjtv@?1gaQ;4mV}7dGM>SkGCn3pg5{(kSsD42Go4b{|7N z#$z(GQ{U@#TG(kuzn7sfcA7WZE#8|!-)9-CtQ?6KFENKz+cL@iiSQfD_85CDO!oV5 z1ey#DNG@5yeFC^(w(TPEp6e&R)9hHlPin#6Y1vCA;xOJr6z68u_52H*#oJ|8QP+f3 zXy0LS%Z5%KRHRw@x8umr70dYi$a0^M+fnc%jH4|iPf~qt@qk1G2!kD|P!9^>eRZ}o zg!jtzmS{e0u)Z9`AzTJAxM5=K*cPlmE7&z(#`&(RMOIzXf@`P@dk=0$&dHuL1?AF% z+kLhxhLN1hJP1MKnmY|l{>mA0Mm5|Pj4O8_xL{>@pz6Mh13jXAK|O(!WeFCo7woWl z^ii(~jewVul^8ohhm_(b*#v(bb@78U$pc0AZqC1qy<{j5Hg z5@;&E^AFh7i$^uXDL-wa;M9uLph4+t*kxB&5&>4$t=^bE_OQ5X$znS_C`MhJPkXp= zo8E(Y{7lKCZMQN<)%M224nxjAVLcDnn0`_7V?PmM6rZ6#g_AulKa{sP(*rY2rfQo_ zQof1K6=-Gvz#4ICJ-DlVU9HXog(U9US;8RNx( zrogDw=DvH_M!OYegC>=Xv7Ngf{9Q5_R$;|xUx%VN*zkjb?k$)d$7sc(^xcP3W=rpV zZ73HGgjqOc_v$%m>6P^lU&dQMQ{ART5$SzP2-oq2AG{FsWHsC2V7!3wB%p@Bv zVzSAs2Mr%bS_EQuVH7UoNujbI-#V;?KD-7FRBC*1Ew*pD&hdwLy#ly>)&@&nR#jb!_#X+GTNleC84xbYW0ZU_hAONN(9-;?_B*8W;5@6)=~7u!&a9t za6ebY9Q#-{R@5kP;nHNK1eil?9ENPlHsU5~A`v!()7(y!?8hfKfu8RDyprd$xW#_y zurlyrc32n8@;-)i8~FU0czUo{F|gcdrqH_Yw)f}2EH;i)IuDI^0?mGBd6gH9b6Q7P zpwnV7+1qQ@!gF61oN?<%Er;)w9Kq*7)|C~8gEZQV5t1bjS|--koJ`504y;3= z37E$1x1FOfxS>el@5P?{hv+Q*u$p_{`F{|@b)4q67;LqlM?ONmW(%>zgdAoXmk=+t zl$o5@GmFQU11jM_wHmp9vG<=HrMk=)jLDiNXV&naF{6Qm z_8Y@R;{&SBy9`#0i&#DegGKJVhGa3nZQU~TYTHjtnT(i;hUsaThrS=x4Wk~Z!zpo8 zC#U0oBm6D>TM#-~a9yzcy7{t2deCPv7K{zHUNG!BtrF(_`?CgH`|cux*}}|&Y|gVv&V(FxFR6yRJFe}ZJ;nzeqbkx5ajWZ3;~?X- z7Ytp!I9iTozFx$7vmiT6Epu1#<8;0CL3~epu z1;&OvfX-*K(kl1hK8BVfRUKv;jMscE9Ow8oh{UHpvs)Z~)VG*gwfR1)O4B0JS1}0t z*b`OhOX_z_M?IsO%SL|oReko3^Gn3Q-N1tx$5J4X1VlrEAbIc|CS_F6k&?qjqRVHg zCDUQXXIZ75_FY%ad%Z{z=*obdUJ&0InV+H(p+20JQ{QQFbYki3wWj#ZB_T+C%H*Jlq|$ofHS3j_y-=6WY{g%Ft%97L2iB-FOWxSmj9>jVl&@3`eG{ zEcdv~e_VcTeT+63VVIEGh8Vce6E^03S0+8H$tiEer&Dj;*_?&Ye#;FPkkF1R5 zNiBz_&qEQc=dp3#V@;#xX%}2*N9gOpdeP3Q31BwetQazY;fU0ImS^clQLd9j_Je)b zVT}9CFIZSLO{(5IJD=Y>pKA!u(fQ@|Rg7#XNd3%5pMn8wci}C^$FhRSi*12-twKu? ztVT@i9)l{dHrh5?xqj#Cgl09Y&TF93J1ioMQon`u^Uy&@FR8(!os*`x5w8`QmS<%l z#Dlrvfi`%ttI1uny2IkggXn6;>OTkXwPkq-+^xGJPLo#5Shuj3&BTj#BAr-NSaw}@ z9r{o#EAkfO6)tDtBvERn%bw(#!j!3JQ;-ueU(E>WF?O!vyFq@#>}#yifYqK3X57fI zcgzCagyyQTd@MDZ3)~1X8V*A-E}&Pp(R~t;P9X={)!RoQfMc-3X)IUMcx_>{lVQqY z+QyHqs+@QO9iPRZmL?31_K7rVFt>J03$}}ayQdSlZDuAGD?x_QhSAw&7F6%R2VM0k zLda;S>9vT~0}0H?XL~Xh3l4j(!2B968d}i{J%@#jmD=jGS7obRyPT;722Z?j$9%{y zp&wJ|G`x)yKKor4y2BxcgD;;0?zM98+2?9ZMjl)SOPQ=@27~)r!DqU_?Qzu^SS0GInr!NIL5oomMVGFb0lu4CaNqlL-AyS-)w5(a?@IyeaH1-OGWa>tUTW zS$@`I+1*N`4htwc)uU;Proyx2UqYzT#Ce*qmnG=6U8RxhgtP~Pc@!E8?Kpu|* zdptN%U8;;(tsBfRKDZI=u~cb&E`wOS5G(eoF&ySCHkYBLa?UGV7G%1Qs?pYE{_V7p z-)QnaeRw}RI7*v1tZY~eTP+3m(*c6NF>Q6ZlCHv|FLPlE#iSnl19^vyu47AihQz!5*Nvb$M*iU38RSPv3Drk; zDb&dDBYhq`Nt*2#FG+<30oWGkvXQdvxIUU)J|;V%4DR;X+Fx zo6k9guU-u|S%-%EB1qz}_ZXK05!YdM(2X{gw@y1OEnl~(2BTc&2eRIh4ZN)sp((a)v0(h+*fuMLNNs*Fg_XwPWLwbhU%If;D?C^T@jaLwjY;DhLX zig1e-mGdJK3e5{U3IgS#t3IggVD)erchYZQ*`EFY=16uDz2t{YI`Q1Xo{m0dUEFKW zjRz~K*3nOdko7W$GlhU{uO0`bxygFCJq$ZYc46H{lA2obb#QdNECFsjCI+KHGsgL# z7j>jj_4%?${kBmTQv{ zpwX7^S;WhLG;|;^_uvk57RyH^rJ%$dMy2A`kXtIBH)qI*W$SnLm_mkbYj#ts&a1|Yp?T;_5b zI&49Z%cfCsXw7Jo0_OTT><&Z*%!$ID4W};w;@%_)*T)=mYa60ThiaMBGygl5n zXAhG+ST}GUFFlV%)?oJW#fOO_M&@_1?5E0~g^pYeOFBUP-1g4vy>2cm@GPojX_$1ZnP+Ir~?-11;I(sHHhWIuC3u+^&-vqk$0 zMk24G5FUmGyS-q&rx>t;a|OY%3Zp{#7!0!5BFJ^%u;zwbv zm-4keqwA{yJ>oRCSu+r8vZuow)|8zW4OzTK1qaGu)NA)KX|#(+Zp2Uq;s>3Bb8OD@ zla5-^(n5E#?D*LD5FAKHa|7SULoZD|b-I+-lX(H@V|j9IrP1CLJ&cVVe%}XQ&)^4j zBf^8zZLtHSxfbpn^shCD;!Oyq>pYf>MtB%;KSV0*D?N53mRn7UzaCeS9US!XhhcY+ z@}M?$FyFv$;NizM4di^R2a^wp1H0$2H?VXv4_SJ7O~i)s171!{y_EIQ-azl*4kTo! z%16t%Dc4GAO{%ok0Ha}3r2n%A!$Ftei%5-O5)uqSCQy!ICQM`9Cg z391eUaf7*qe6}FlVPNlHwAF`d5~k5$&~;ilPj7kz7VQPYSD7jD(7SFH1JGRk)Ip`# zTsT?}TL5@49CnT~5kaESq^dk!C@3@q^Ij*q%VrylJZwe-3XE0^1IX61LKVXoIfh&K zv!JZN_!wTW^syCMx!Hg)DnhbgP<6Y}dc<*kc#;LA*Y99=@^0baTe%019Yl{m-C~_Q zCszjwLvJD1clZIMJIOsHyqQf>ZsGH?c~i93*w7wwOy(=;qT9s@e0FeQKT{O;9}@%D zS`c!bR)F7UUE8|tD;Af9ptoUqz_M!gq$3sFGS#CwfOlHW{G(Cw`d8cY1t*-vS^f=e zHHl#YrpgR1*rsAGo#Y)n?PLyQiKL<0$0ktQTBE?aKBExs;jm)RYI{P&VMVL93y{qR zWXraf6_{AD+F~>sIX0<2hF8-wPb){{I03H^M_Lr@No71*~EX3z)pyxq?J)~gp;^)L$qJJ%J(vV~p7TWyvLx6p_W|ykRsVp3BoU&Mvb6Pp=CHq)|38S{|8p>*;OSZvrokf3u9Hs`71DM5@ z*UZ-oF>~P=%sSQ(Chr<87*T8A=D@95RGzCy(|4ONj8~x5gU@2-xjTjdjL%CZlp}HW z9IxRRb>O7dhb|Wxt1B2Xnn&2tX~PSBiw%YYNOi4bv)OvY78+0>xP2C_8Fx+<(*4^Id%o&&heg~@zZn9hR| z>ePVun#a$A?VZ-VjUuZ6$!Qt5ky)%~%5&I}k9Pv2UInY66PdEZgWQGA$BGPBj16|P z*kdtbv|u!kmi7f^(duSnFy94~6?I_u`S612f|;mkVR@jFuEOt+0xa1*tJaI=9=4A2 z7Hc}p^E7H*9v-B|UAJaStngh|N%z^$W}6mkov{MCcFZA_n1kMGi&w29pLJ8g%$$wJ zRenw+6k1xWG#WwUVP?c^zKc{^{H>v2(2Y*Ee2{1}w>EXu!sjyyqTP-4m|irm7!??{ zT^5g#s%;$hRATh7;AH2;d%Ku2DOzF3H(EZA&i+YmKRY#8h+rJXgRsxJmdp&_#tLjW z%ti|*v}!es*27wC4<otsEr526IT99yXyZ`x=&SCNYKSgzY<0}g}2 z@abpGc<8mWP7L;uXwuKJnpaH7oJU!y>|BOfH9?}~_Wj5Oip8-yJ*H4+&gnBv`5Lo+ z+c%oZXt!wdv|%+#rQv*gcvtv45=ZG_w9@I|LPvSiwDm~FV0sz!yo>lOoSG^XJXa94_Ts;84d$0Kwdlc` z;iGM!wfCS~Uvvg`)GfA;D^%)6n=G2=O&n`zMEAsEF`Wi18u5nFe9=3@6xe=umJ$p{ z*=T{S*Y&dtJM~BvyH{)|{IIVY@Ur3jY&q>E_cGb93lDXMTSq0~F#XIh7_*t)XX<6A z>YpIrU_wa92a3^`fR)bPLtt0rZu1E$RO91K&&FTJk2rqR!E#B>;SZevxV@y}+{ zB>9zLd~YS8Nug*nyEJ7mC65z67Pg*)0{g88If42Zw%SEzO=oW8!SkZu~0;3>QU+yLX;AEZH;T;=zE#QP70GhQACfxg>p$CHi%tU^TwhgBMlfwU*Ir z#pdPct)vGwA3=3;ap!>}y}MZ-9uuCQlbrKdeYUWcOH-Pv#ctH*y4dkSh8-O#Ahu^I z(_whU*u~lfem(i0lqqg~a@t1qG2d=M`4HyDhEY|~|FG+}1P zIg18_FRiQwVYRl`OHL9totr!?;&?M;7;HQLlm|(xmL;g@FH2>q!BY%X|pA$bo3Y9#$?SM7j`Buz=z_))m_3_#tz8&>2iE_}|7s49w%heAmR9 zA)H3FZKDOO$3cm+s>N{9sQ4IC>wR)mShiS|-e*@PVrGr4=(B4d3CB^RA9=##IWwx! zrNhaVOD$Pq`Zb{~c3<{kd&~sdHyYz{Arx_QuKAXe@*QSfxy>2OF4=_4c8#a=Ke45B z%O-<@#u2MJ4lRrqtjBB8)#F{J94>oHlI@0(V9N)1!`o-UnF##9JE;Kkqt5SrONdrl7P zx_-O~(&1>eXuGn-kwK#7$`UKqgV$@HB6CISL4MZrUB-+CVX!gU<#*sei^OQeZI-W9 zrE>WWc0?@KCQf1bvP~tx&PSp=j_sj+m7uk2@_m*s;MGUVYnxgUIlsR8S&e)R7flD` z&n8R?yAKw2@*XT5w4CN}v;&U^i_l=35OU{pJw%tJj#EZXq%CF@-TUS>l=Izpz}5EL z9PX?uSCG}G=aKEqy7h8oui1|K4R5oS(O}`-wZQhClPp+YSV22_Fr1$qt~T6ZTEbA# z)nRDG#$xEZCQ1Ap*j{mkEL#oSTuI?{>$S~l*@o+u3@oRN#d^{^+E5io_c+(S7z5b2RGAgUZEmS_HP*@@2t8 z4m-@FHnwEQFX&rI8mywtcC4B!Fv@8C?OWf$=x5KD81H$d(rI|___9X74c;WlEQTwW zJ)L%qhL)28i?V9vfKX+_>oIV%io)TTY{Pc#QshB4bPCCsR?(RK<}SNMcZHt<%fjie><{<|42 z!&h2AY>{=?ix*w}kHc{duj9>&c6b`JdS7G|Sa3Ch(#K{-6c?}L&-~Pe*q`_A{Xcd#qVc~brvh-aRtQu8s$OUP~j^Ca!S}mD! z!v{C^$kcyZ^s^a-i)>Z7kd@DFw6mG~Z{Zbb?fV~O?02-xoVZ-psxa-ef*5mJJoKaT zVS#rWOecMj)ndnK7rHUXX!bh%tj;X&4a^Ig!=%W;ww7bI(uJhbsWc@yrFpRjC5KU~ zHWq&bWOI75RPSXZby$h`TCz8q#AxcZZu(CN!wL*vd-m{PH<(suo0AG=9e>IUuGAO| z=R8KV*?jixETnnZDp`<&&g>d0WI#hlWrvA`nzVYoct*!=D6^E##iSYfF=fNok`{I} zD>kUK9=dQAQ~DA`9=vZ{)Rr~e7qnq4*J%G+GudS4wYBuZ?XuaT>8l^Q3sE%(u3a?n_LzdvSSc(Nh0ir2KxQ=P8~OvJJpvGYP* zW-A_KW3_DkxA4-0Tkt@%o^Q=GtyrsA!Y+6$xw9kWXwGHLuHJ;pvduP(=6$R<8HMm` zNL4s1Nde4ZCI#OXCv3)>FZ1CY$4&0Fh}U7OHW~~SpF#lkJG7)8EEra=y8Ksgrg@f^ z(nQu#^xDQt*^7VMk2~4Z(~>UOy>>DCoL0}0ELbB6oDRGFlj9McCR6<|g4K&i^xPW>Uo>`FM@`H;d{{Wm6kgU$BfifaSVgm;$b>8Jx(>aMLRPMmUd?zvbzHe4 zBWgQs8E)C58!tjdgINqKwXp75;=X^$1ew0)+FoADYTWosZRE7Hn&Ex-$!TCPnVc*z zo&%!5!o7g*v?={a+hKst+g!F6&i$*m)Ozf&Xi(8z(CGA~hR&R#qh05Ty9r=>FoVPJ zvFGD|cam-(@MmTYOdSo!lW`t$3O!U8j5i;7srFDKM?c!mo9e6Rv6wjzLx~7D8sszP zYeOFL|3Y#~-P{Db6kGnmY#3qgyf(Pq+@ayVM1<4X2LW`*KsMU+}oGj*T2o6ps` z2&K}E`)cwx8aEhptHQi?_;7gipja%v*C7_uquy&l+dfmG&qFO*yJ+=hdE~O$tkUZ~ zlMP&$IPArz1ttgC{9{ppxv%JvgvHlk)?{Etd+BOgNL3#GFYS@+U>f>1lV_uEoiFulH%fRNh-tv0$jfX`0&c%zqdu@kOsDl z9F~n1dta-6+?YDm;5m#u4Q#Npd>POjhN`uhs8^q1I7%6S)}u;$M z>~om3SyA;EzNby_vU8W^lh4_lj>|BZZa$SbS1j?-g`&>emAoz%w7Sq?;6e0$R`S+m z`zh0o%M4a$Ja;CJdq+u!9oK)23f_r>IjaVEZ(y*0#fv|WYa_uBreTiKDYA>tah(C} zw7P8;%_?l!r45aR7i!U!%!0dC?FA=x=4ggkRD>R8e&!XL^}5f*&hHE(HK6IR=`^gE zD>jNwqoLY^B7_*ZFdb%ldi~h}Rf~U00;A}>wtbCvFk@-2q2jwncRJQGFCJx-6fYqk zrQ|c`X&QMje6yp;m%}3U**gvBTTE5)zZnIq6{84Ysc(-gmT9&6+0v=ACE(nG&91|( z*29ooXTei9etsEKh-_eftoMShG9=+e+AUQYjfwKrXOwoDU za0atn_cJInZQ@jl?-ip(?K8Oejbt*DURHeUHg} z*x-e&C_PLJ>hP`^d2JlFYCGq;!|`Ek{ zN-DK*!llM^gQn8K;EH_P+Vd`h3wVKO_i|*4wcy0M(5p3P)@K!%E_=6W{d`_k>Dk4TF_yX)$3K+eE&L;Yr6n${+J7vxa}R<@Rf^(7>#k*ea&&2 z`q}Dr-Y<^MBnGSAb)$AcMVZca9PBBBmeezX;yz{;tVRPq`wY1rHdb}oIqb&q!@r9c z-D^49`*2oyZ|P`3PLAq1>+qNLaDeQwQ%%+^a< z&X#Y6MZ4o|KwY{S@k*Q)OgLTB!C};8zjhS{X)#=4%0?Ts*R3F{_x|Z4Z@UYw@LwZB zwGRQTH_d8} zG*x0fF4N(IPIjefwz%=|JXg|Tdc#$ur@XEo6t7xbXI+Ovj8ox+bl)|iy{s7R2guI_ zXtmLWnD3u+f-zpBIZxwj6TfvOmuhH9TVrzMSu|v{D@KX`z6EyfS-FEC-&;>lpfTYDnc|K;9$2srn?mj8|+53@^63 z@)3V!1?yGay8~T^*4H*}bi3EL5>?-Mqsq^Xt%qV=!c|#%?b;_ZJ0dyWDc(uCEn2?Z z?D++&t>S}Wo6|wmy@Y!>Pzwo#H`4OO%Tt(Hvia-7s zzn#^bjRvlneWMu9A&GK(K6xviML8U1p`()5k=s6VS5|SL&XZnOO6mh1-UAk|u_0Dy zp21IIw`pbcVRIS8X%%gu9L8j^eHJiWI*d6jvzLJirY6*l)+?8w%Ut|f1=I2|Xi##p&OW-5-eZB?iq^h7`vL$tjy+Vw3Z&l zEUb);x*E>;pTGC`r6v}A7*>q4c`aGwK&{!ux#nPCPN>4u@2M?kR^|&v9OkarL#*_g zys(2K-h_9wc-HeHICWaLYUP%$?T57gO-)HzG_7d&w&qu_U7D;k-V3>Ad$Zw+coAdJ zgMprW;8VqOG&H6mkahPATLD6fO z^+7Yw=E5yn4|%D~__5;+u4DR~&iUiL{|qb4cwDYTeXPc2`zf(#GsMcQTnzcy_wL+# z69;Lo+b&xBnp=!KPs6E+B#({R^J4*)jW62tUs3$yT@SW&uGoC9#e))P)qd+TpPkuQ zLfCdpDd26%Xzf{ekNJi#?AaA^)UOip&Z^M8O*=j>Pr5+217F4^Ic}OT0IOqtmL&d>?7=F zzSf4$?6=y|Ym3c{hE!|F%iJhCELqP}1CJ$DtCl-Ab=Khb+x)G}oOtu|wUcWPk2qZk5<5vumxa>mjup2C&yMG5Ei$=~CRX9axfm^k{=`^Cw&vI|4jeCtT zR{D3AWqi`=wQ)2|#bDMw_Dq$f$1<$gEg6p8om#h2xyp>DA0sa{pjJ%0e8w7#_E}=l z9{o9AJq7_)oo9*8gZS|w71?mb!1|3Yu1_9DorDvwpg8YiJ`y>$karqBF5E0eW?Mv2 zjh1h-vBNrCx2C|qeKtc4_7-frV#9gO8k#ZXVWZl+p-#$pU$V=q0jAZX!)1MlSqz@c zwyoOVdo5ctqqTcZWwGzYZFoi>t_voXivvmBvkmSvbD3pn1l#)brqlhfh4yhZ|2yf{ zdT=fGdd@deE3=-@t<3$#mFpYb=Ryuc5qRubhVt~`b6U=5)5wIb+L^7kgJR+fwrF7Y zCG@>(h~>0XZQ#C}SM0HBX1XjcSe6fc$I^sh941!0vn=S&t+4n2%4t2BTPiY%N=OS9ttif?zTHRHV_gdr)BE#4~@Z z(UI6_@U!GT z%URWOXrlJCVHG-&Z=nlAHUrMr((ZC2%E7brx=+CTj;mQ1__E}%^!dAXGa{9@e~Ut_ z_3bmZ)r&p1e)d}Z47{4gOODK@zl*ohyOP0T%FB($TC#gx$5P`aOI@XV#(`w-Yge2FiJczBXg)VV*|Zr=RdboY!50k{kM4hVlm~f=v#Rx4FI|n)es04$3}$=I z&7@y3TePE$7E`u(9vU1%jvhp>6Y^wP){s z<6ohNJ4ywv!`EjDlM0LrJh;(efkN*$uQ*lN%6Ct8T~{eF7q01}8Q*!K1}K=h#$h!7GIB>&BsGUS%U zA&kt(5nCaTg|Jcz5CHTgSga31t*s9f_FrKv5rDqMlJJsX^y|DwT<+(NUJi)^$VTIF z@+1fXgty5ELcxnIuojR2u}H=$ii83zSS32VB;E`iR6A8{D{HG_cJ0Y`qt7P}zq|6K z12hnrhKxo`i3F2Lh{O>z6GIkE5;GV`qBN2pHCDY_)Lo~ly_auF_+Wbm5CtRVAS`B9 zo?tA(*{d@Q(1R^njV)mn#84H;197Zj~DD_1jx46s&O6^&83 zxDC!qa|yDhX&B~mt)ncXnK;tZOQm%rsZEM(l98y^E!dg#4V-E zmS#2qnHs)xF)YAJ=0`kbYL#)A;}-hiat)NoA!#xUGb%R5q^ssO8G(S5UhN7 zaJ5*9!zf$oN)>Hj60S51W>KuZutqZ2HjsgHC|Q&;j$)7ujz8 zic%>=(-|@$5LuE%F_9$MnFz$ql+iEy+O@Zr{R;s`D2*Mra)_W|3ShHF84?(##tdvB zK_-%tB-qSv3l!|ipPnh%kKYR!t2Wa#8ZwbZ8e~OAg2;sh7!r*H{65y#&}z1RvJ2hO zOT8#QlqGrv669e9N%3+`PGY|~;M&=?Y||!D24EzZpqZ457*GJ(WdPJuHtKvLqr=a5 zs9BO%PHoDSnF}yE%Yf%OLt?qkL7J;`F;8_PgtH)Iu96xOL}Zznl)IhWkf|udo6hLP z%ZjXuGCepVo-zmrw?IxG5hkW9F@{pe0!5h`Cda$Pq*te^Or2>o+gsHCt3?%U4G}{p zbBRzww6xk9Vu(V2M z;qiag^Wy(|@q2a7T4$Yg)?Rz<{oS9hS8k)+Ec0l;Qrh1I$glFJQ@xh1J7J&!NwrYF zU$i_<{R0y{qxRgg(dW}3)z+$1c13Cy%79(t>ThgNzC~rU_WUzHsxr$*$<|G^=T==Z z6=T}PkhlxXWR=hyGHO(-xKP5W-J?9~!xX#E(!GT6YFi^LS5^{xT2mjB@jO=0RDb%Ex>9;^c2X{V zlMCt|-O2P?G+s&4EAvELUXAtPRFi(yRGfYX__r?5{s$v(RLhB(?3SS1RA)4rd`xii z^;L@S{(S zK|~t3`PmrUy2UWdvIXdBi>TNq7cpx^Et-mc-TAjN;YMI(k$R%E)2H^Rm&aAN3m>fM z2hu){wzRZnn5*C31iq%*#Y}FseO1-?CH!gEGt^E6eN2FuFbAJ~G1zKG_nfXWbsKV~ zLrimgRzJ^9bywZdarP*f5qmFgsUz6|05D`DRLj(2@rL4#D#XogZZ~syKB@TzI}BlI zs(pEe5t_QD-hkq=f89I#F@it+9_j}c+wFY-?g4jsSUjTEouDRH-AzmTN8Zmz!kS4|d&a*o}myoO3 zZ+XAirdec77VPP#N@UnC^JnZT+rRQ=JLzG6k=4EaOr)s_AD<2QetOFIud_e?$`>$N zIdYWo*!$7{FtSR+AKAlawLj}HZSSn5ER*l{ot}379bc3F;lMOi_<`W|?yDWHxy2yJ zhPnV7`Qwtm^PYx6xGylG;`a%z0_nHs?@6sW(eIbvOcIAVivHfiPa`9@I;VbM96h}} z_+(Lt6M5B3C;Ns#Wc)WUyZ|E}8MT5x|E1L$eL4=0X>|IN|wBJ)EM zuZ?OkY+}MM|KWbp3j#0M5TKhKoL`GRh@)Q1ck6=pSY>_)+;#QwjYnxmdfhvq??U<1 z^JAAd9$yUpx<1Fh7kkHWzDT0Kyu9qmCzUk$vU5T|&Xe;V-G1P`%X{e0A~L0x4tVjT zu(fUa!x{cBQys3f;`h(59$)9{01BPo@w{!A$*_#4!#NEfX3m$XAX9!kA^tHrGIUAY zePJ=9?!e^A*y5<{{=c~%)UpDTn!dlnDO=WTqgkd_{<{_4>D@R|&#AmPS8Aac{K|#7 zx_{g6f5En&ICbuUD(($`(X0<>*8_2C{F%Y}_nrlpR8RS8W2xG8!(+qOu$0eZfX~s= ztN|*d!@OnR#hu{JjW!L3Q9ZWf zF`O3mEI+fW`@)5=1AqUHrIrs$PgoYzcb~{m^tPULW5{?00Q%pg`^+7qI#-$2+S zWe)CObLr^OpI!i+&`(TJ^BaggaVh*c2Xa45GyW6l_-r!wg8uZii)Z1AELMDq84s7V(seR{j%Jh6cvG!fhAaOjh@>|r)9}iB*Z?u0M z#WZafxhOpOGu(Fb=&AIp8Q{bNFPe_yeEh<)|6_QY5;UBw-d3GKDAYp^;j^DT=KeGa zW9_rpona-zYkq5udPI4qoZ+oi>Yj0j_Gz|xb>8dj_^lXxbmF1uj#UE znvXo#GXeY|rc}>AWm$xv^@59GcVo_VShVv%SI-Yc{@68TrQOqO@`g8B@n@fe*!*(t zW$xpP;@<(LIoDVEbH}1GzYOQVHiGXbZ7s2xcjW&@%yicWj7}9VNm(YHg2szBr@PyV ztU(B$vcl~)Id3?|ZS!A$2P!FxpZ>0`i@P46Jc?}##{!Q$(ma%~LH)(E z)#GkV-x&Vy-|J7YL4^aKVt6IT1L8Y0A<}E{XJ+J`?bJNWUZ@)%Exbgr(=Ly+6`m?lezoY!yqo{A)rh6>TUh)#k2pu+-xl z=Anqrk`DRlATN9e(D3SMC!F*e^-t4dXx@{^zu>0SZIpwL3$r|&%C}>R*>)VG039VK z#)JL3H?0_blJn^V%jWm7N2pJ+UP_ZGr^)IY=VT8V<{KQ-#q~!h_jBt+D_x%{;#VCG zp(lav->CTW&1BTWYiIB(y6o+;zf&BR}Dyw;4O3?pVFjFvY)OLdLOB-2P-F@ZOc6i>04S84a?lkfZd6nqkC~ zIy+DEcNFMZhKxAeC-tQqJp)+862&(PU7bIMc8f@(QFyl5Mg67d?yKkJi_?DvmaEPT z4MnlvWu{r4mW*5Mrl2mx^dvZ*yA*Ql>+z+@_FE`Q0WME@b#LOnx=XQ36Jza7C+Fre z+_^dlGpRklf2$Yw%2hKz&Rpr*uytarby!>8_y(XikM5TQ+Qk)9kA0EN-d*w7H{Whm z_u67LePG+^(?xHl=tg5}Gu*MGy8?HWXy?3aA1etwg-Lt$@1SO0EcnNe^Ul`;KA%o^ zbR0nwf(zSrTA1dSPrc2$=)_J0=(MZ$9nj9%L(t?dV!^z~@|sI}k3u=q*B+&vP~4x2 zYkqm<)N9fh0v#6JyOW#I8;y=w%s+PGL7ru5%l^@*Lo>Nu3zwaMSK9d#-x&5U)&nfj z)ch%ai6pn{O4jzcfx|}_trxDh{j=(X4L)_-t0cyh*hUNtF?$e+VF_>V%xAo7PQ{WE z4;bz8e>%!oXd*t5R{+Z62D`5K=0(Fc#zjGJ*E={j*k+`u)(d-KdgfUl6twU zynXNQoSLDB^S9rBp4$^SvC{kj+4s-nczLv4aPUu_`-s-cH^v(D?wBqA@+vu`j~#ks z|DiKmi}Y*-Mv;x$s?VeTzM#V;u+Hk1K0#zG-Y$O&2hX;V-oL#&Xr*?FC?(B1we16H zi7mfT9M+vR7o>zk_`k!}e_pWWE+y*Ld{_-nTMKaoJ*wL;`3e%$eZ+BXE5;a` zW|QQX1#`mM_ntr2z=!KjaDOen)bP^|_|V3&@|7K9&%66|zVqB&{b>$Ox3X~mcN_Ox zQLvXBQRcs!8b4c*T3D0&&w8aUBFJ*Tdk$~(b0FkfZ4p*m@Apnq>?Lsb)i3Ax_X~b# zt0}H59fwH_|F}Znb)7&D+tfuI;BN`&IT>HcTavtZm9C zFPF`!j+{xz9ArIJsC%x`MAx}cNwDr*+4z%t<~H_F!_!T@VrYm=V0&0SF+TPEQMx4r&$|v5o zoO}G^>#?Rsy_Ok`R~7x%o`0b|JuKS3pWD}Q>Z+j%Hhbn}*ueF|2Mm1Cti$ykbN9ly zE2X`G8w*3YGt=$2cS@+U^RpAhT?zYc+Z;IM(QC1kb+{${>frLT2HE!S)}R=lPr4bt zDo^^htA8%OpnDXnVyee(Jg%O8QIb<7t^QL0SWxb0rZPvql!$K5QR5FD#~i3X#IdqC ztoOn9-AK*5nUNcNS-*DVocSis+iZRmWxWzKOnDW7E&mHWYf=9W2E0kC`-1go z?WGUj!d%R>DjR8!bY8MmxuTl5C)Ub#cV*REZs2>z_s(1vsJWHA$3FfGX_oke(m80p z>s3z>Ieb$#h^49kp%*KD%=mDD7QR7yk9DLgmZLRa;{Wj7)z3XkoVEI7kf7Ij<1^q? z6uqjysyojnYB|bNLJGLle?=TQNIv>cJovR!;e1-j)?@E@M0&0BtJci{ZurvvZMRrt zie0l#$GwF6!yhj<@7tfh=f%swjq^)^9fcR1-s$3>^j6ZhJl^b(pC!6maK~5esGUYG zW0!Y9UXh?5nuSsCj^SrCRJGrCR({uQ??t8-e$sni5WOR+dGW*|sqWGC_oUw@9vX&z zJ1d{uG1b@*^bx0@XYO#e`ZIaR!aY`Yx~;!7QI{d*9#iCh*Mt4oz`5UUR6AhX_Q4rh zny4dehHd0GoH##D*(gg*>&)DqKQ5w9Q{R((7oyL)?9AMq>R(I<_2?TtCYpHOe^2!7 zd410&e=k~)GSOb3Xf)jOW9y^Lx}14Z;-e$j7nie73+|5F10x!*`i1b{h0V537S&Jg zT}xK_thaW2{+*Sp%Dp2)v~AB{y&{|@If8}-|r>-z42c};Ii|xNK9(R zC&!(^n*+9w^Yso{$*ytE{v%>ck28A5Ccd3UF18=~(ivSHR`!=qU*?Y?rV=0|iTFqCHiGWx8C^^U`d&NghEaIhi;K*Cw_XeNw0t;Oo z*DK!ecUQ~pD?SLlvyh)1$e$)U6$aWmFfuFO+|py)5WdY$UeG&!nD?~vxaw3a_E5R$ zqrC&XFCS>O1X~zuYWK^B&$H_iPoN_^{RK}`zT>0D2iH7KgYavcK9v^$^d} zZ8r>Xyo_T$m-Oau{Dg5N``tPF1^w*!Ly@4>sBuBg9JMW0`GR|qlxlqC`?oj&N#&sp zBbf0k_}$FQ@YfeA2E*b$?)O*6GteJv_TB(%|9P@)yHx4W%xg*p7O0kW{m>2eQ2TlD zhF9p<4qo7kKvCT3L$2@3NDiQP;Nm@FERW^R)sgfUSq~_mUdC205)X!B1Vd%yv1?y# z%R}UKJ{g(k&o33KdOvgo9yLy4c`IMr_vYT2dU@KZ?WS8xpM_#m4!_)whglANDQ?Tu z`k_5A-hVk}N$@X8z&=DCIP%WnP)4`jZm%XIZHpJI$A>?V<0pQ+0)kbF1}<72u)k(i zjR|fN$T3EDeYy}NX?vcYvJ$l`e)rV(zikdxG)MhSD&Mbq??H&h56AI_uYZEi-Y;>W zzIEv!pV_;waM$lYWrr1$qng|KnPi2lLmMYlU;)cbzMcaK^cyQzTRvR<@9VQ9(I<~A>Zqz* znZ;|~w%m9*^giU?%wnO1IW$HlL|@c<5G9yvZGympM&6>*zsFzbu!(=5OdaxY{uDfA zHP;3SKtN`GJYRVqZcp{rdFS^eo1^Pgy%1%0=x>MEeIATo9ar&|oGAA>kKx|d*~nAl zZ!5uYpu8Tu z-Fx)WpCQ4c?3~Mc9wgmd%zoyA2>6!3UP*gm<@HM81o1wsvNfQ)=f=uJ1X0&(2i=RVe%qK>W20|ts}XK% z!+Z>S=q$WV4f#j5*jn6;6zm+yYMJ_n!RUs4+ZRQzrP8esjCZ*u=DHN zX|74sQ+xS!j`Hh;fZC+#M)NDMMR*xhcqwTQ%+CIlVyKT)i$_$S>3Ktp)5GVV1p1`) z+%nS0)ERKq(1hg{liW>=x9O(@U+N+D({#g}b6n^~Q*&n@ysjk!=j15o$H=D+!-!mK9UJv3#E2#YCZs$F7?sU#ob^{vmDf}yMpgBM zYN!>BW2paZ{N5*QN)rlSFgHSb;4Vrhn@vnjAzo+UQ$Hwzv;8j&CG6 zVTu4Z9{|i!(KK(R2#Y~(!C^iymBgUf=m!_wHxkIbBnNw%K;@;!#4 zaKlHeaRSIP@4BIYbQb=}Y{JOMtHMQ2^(49f@KmC(q?K-CXlJf?3)VVkYJZXP1g`%T zzb&6l*r%5L_}F8tCa*WD{7&<)5Qh%mqC>15JBV{JO1Z-?^?Mpp3e{S(n2-V;)Z8`f zK_=cZe|@X>mKJl=6AMrKuK&z&FCnrW=ti@Fm&Xf~rg`1zJ7Ti|F92U- zn_c9#76!h3e`D^*2cK^hhi>Y1L3~yV%M42e!XR_63^R>1jN}z)<@nn+!|b)C#EaE4SANXu+Z)#u=$hx#lU1v1 z?xk~BZ>WTij||leV z;&{0Gz)lz+N~UeOvgT}`}cR!z*1!?h@mC$|Qg(k$Mr3OicWLmb?SyWK(uI@(3< zS^MT&0$3q}JOIka9`5F1zUA-(rm(Y(N_~{4cGKB3%g97$B1c!lRNpA%kFfP^802Ih zM8i0A+%xOmbG;J3UKchU>+9Z2NjyS!`~F;Iicv{Z~5Owpl{AiK(Sq}sj+hAw_)j% zQ&)O*G>qXpj0c8H^dd&DTrq^$q^Cw{gq!jZw=_*&FCa74uE-uc84tT>Rt%)KK$Jx8 zp6=A)pTDT^sSrDBxS58R(H@;m`_s8Sg!BLQTzq|Ub%S~~pg|;`=5Csqr|x3rXJ%KN zCQ{Ekl3%;vyzkU6`j|Dw3BG)@Cxtk^5DZ}a`PW@p*;8&v6U z&EWi}_aJs*sC$oH+K_V8(7=wwSv&&fMyyZXDqXC`2H#t<5wbxhTWp%$jNqgB0Bw<8BRgprNKxR#F5)-9Qx~ z?$L0y-brs58uIMR9#EwrNE%tj?uPC{4l6i;^4$dAYg$K6!IQL_WsQtcD8!_ZWl2~G zVv~42(Fz#z+Hejb%+j7m;}PB>*=T$#AK{JRoC!|ljmIn;JrcFtUP~&5M?J%3H4I=K zC}=(=!(10tDj-+Vc@z$*VPbjN(l^n_pUV%##s$|KDN}06e8=Htdh(Qis!$MswG(h0 zNo>jv_@1EJo!h;0tRSSx()PGuqxQe+x-IdM{*A6|D!9Kt?=~3|*HbuRcOivCJ6AVR z(M7OZDXb3O88?Mt$Bibk$n+qo%$|iW-lM1D+w1LZj*rBTKvka!O^e%Xd2i28x9egNv`9|$gG)kubjqqc`lY)FvNU^2E&$f68V ztI=?wYj0EWrgJovjMG?nlk^eWATFF~Upon@tz?=<>eezWp#j!q;rKcQ zJG$c(IenHX9`MR`l#%t?fP{(H(t(6gN=#+u7`c^`zQ>oNfd{HKq<{rnpO|KLBbSv= znW$_m!NfT(@*Er{)c9JGQH!8v^mO_KXjK+jN{+RAu0lYvM=1Cxy2h>+46I0=EUVbrRzxNgdtTCa7OFvgHUeZUAyh%i%3I_eoCm9ZJ@<$Gkkbu9vY2hmX?7DPwP;4^FVMTzSE32+!=_L+ntq15_9TgxcX zDS-`TY=I#PiKobtTVKN`p?iYj;6QQ2YdMx6PzAeS!M!EpZ61{nr6ZUOCbV*C`TbGx zcC!2dvZ;+pEtB_(#0+Lel}1n5Hs}md(q4m69aav~S)*G3VPzv@HPXjMcGMPoZb86k zp)jdT7ZJR5(J~$%U5B~bI?kk`6>BXc>L^04A4W@yk*0}(f;=5_WeUtUP~SM{R4|7* zmdNNIEeQ5}%~64P2dn2f9@NYnLD8a#ER4@#JVUhIiceH=2p~*6;{*a<$7-WzYpDs$ zc;^|%MS5(401*x)+_A7PO!FMKyUUYpdV5fSc+p5L78{hG%eZTv7dGOJmIb>SFXq;a zbnw=Wsv~NAixTDpW5K!;e5!XL)tuw9f|)`h{8%Wk^g}T-Sw#U*Y3gW!=)!Pg%e1gfSw`0(Woxf1G}xQfE`?s;u^Z7S6Dnx2PRoHFBaoWp?Ahr)Ec2y7;R0MgTZU3Y6fcr_ zcNB%iXuckL)OKeS$DYJe6?;nAY%$$M{HBdEJPOJpafnIuIG;H2h+QkYQo_wuY>zHf z6P&at!$5gVFIz)L3I}la;>9Rib?)M#_`=$`wL9(377JKZSq>RFL*4r`( zLM=)glQ*UFFmX&n1~#0ejns8Oc!bdeD!9mNxJJS`sO@2Cl~(5oB3W;$fg%O@bk+mk2$}+1ggTZA8fkU7Jyk|MpiV#g3@rZ~4 zhmlJx$1*sxDkU&&NAXB(_cx%Fs*!b}Wmq zi^-_+Rmut{6#DO#3H;*(^hw=19)j(U?)POj>fuYP3nabJTI+raMD@Zdwz8Jx-daoL zu<`6fJ#Bj`j?Csjwaht1q!JcP3^dde7V{aL1WJT@LWzZAhq8?XSuA6ik{ZF2E|Hcy z{Mz$4gykX!+B_=Asz!h}eb&0&8~~#TVi8)k)G|AXpdh2M1cYkeX^zZ&i_d~W9d@Kp z9R#}AD*Hm2{~lMCYQ7L&*DJtyK@hBrU~Vfp67NVa2_UGOFpX>-DIJhtuAz(}O>vC3 znJ8dbP2A-lBUYf5Dtx2h}z8$OQ4 z#Ejqvq14(OJ&erKpEs&WMHZHsV+AZ5S8qON?*(bjXre!nQ;nErG~&jk2~%qFMb;d3 z!b)^F=iJa#5T}q_$kx-#Vlbtc%r_QhJc9&32YdGdR)BBwYXXwb@~x$F_6BcdZwCEg znb4|12p!Y8U~vS%a`l@bSvXp;XDlNsf&4s6GQC83(l(+o(Ncj;*o?Hx2#J7(FYTT` zvO1dJ7!Yi{b7qzmeuNr;#iz4sn3H8xL?DXg3$?I>Vl1vh~ zLwB+%6B9v=qb%C2YC+|2OF@*xlH({1s@Frew17&Q#U{l%s7=PML@j2GI$Vd$En!gP8sZ23AsQZmxJ_D9EwB z#h-zi;nb|~e6ic{lo?>1EEbGycasn%Y!U{Kq%%u_J81(voB$RkU7UFp#v5z(>iTwQMMA(Z)YDoD+@V_A-Z=gtr9EO%I@kNd~s9E{)J(8gt>F3nU`j z5*u0>A&L&O6IrJxkbR>{v#u?7N6}d|Qi~5M~nkDX(Sb;AOkn zWqa(A!+}S7IN^qp+0q$km4$r0o{SI8!*UDafy#?iuz+=h?`l)4jBU@w( z#Goj{{f_MDxEUXrAOp%ElW*rE;lgA~0ylHnjcrmZ=3^r2Oem>7jzVQF*} z7!5Q6KkbW z^G`dj1>Gh&9}ER%)CE&*nbNAD07u=hhT+Mqh%*eIn3BC525*+-UTKE+fs1WXULyAL zd6cDdVtbDOS`ZWN4j1`w8MC>zJ}&lfYT8KYh}}v}CHee#4Vzs^2DJpj+ap!6*`{VI zIZTC7B9lQkL!{>(BoBiqOOa+EG+wokiV24@eM?;Nk(&PC@nE8~pUi>UBQd0AJ3+9P z%eag}1={A8t~l>;DYn3lk?4b{yx??ktNB1wAz7;J7#8khEu9d|*77yIN()B8E2bE1 zK#*5vRS{`28TGmqxewz|P4K0M2bj!qRHyA)igOdB`Lfq+TX(|j4hEmZs_DqV#fg33 zHB#%`N!z{ouQLQ^unJhL4M`kbiuGjR1%1;pt*EL6#xQ2o@xttqy`nhLj?KnIxVQR5 zQSCD93;Fi7umI?=)D)vU98}~@Ng+;BXyZH!7J;QOJ4l$_MWm!OHriKn1>?6UvjU2$ z7*)J0b212>KWUy$D$HCESO!gDGA9EAgYD_iNVgJfbcCP1m3cAY-{Qp}b4G!`??kJ# z7X{^TK%f!RJWC1+gWwLeSM{TZVaeU96C(<(BOHsyR>2Vnv@F9BH0mXxXx^(b`p4D3E1dL$UY$k-X|Ps&bgqa?H<>l|c7y6yxT_HKSR zKw<1mPlAK;l2vb>_DWXU?x3$b8noUk6u>weOF-i11x3UDLOq1-8 zUPY0YldGvTBUBLzIJM|3({5yF%jrW@tZbI|ZrfIMPnw3hF5sC-&V#?-QwG(zse{@V zuOEDTI5$f_UDukNr0Eh?K_@5ZoGjApH%_@$Ub91U@E$aZ)pn`;Olyf~Ug9vjaOP6m zzou*Nk1gl9J817)I+isSl{)GlJReLfpu9#)&LkXkTs!NYy~B8${7HRtI9&gUBP-B; zPFTmt)v<og>%X!MvyxRGnBwrSYzFwt!!hT6G#3}L^<#;Epr_Nc;h>)g`}vPHUb zNk;A{m$Z-T(LiSnH&s1TLtA?l@0UrboCIP zZhCs;Wc3dM)|J?VvlgnXv{aScaW}N8Vd%qMTeDH9iTwUoOjBi@n;5s^EMx`9oX{CA zlm=51XK$$@h)ONGTg@c-bN;a(wH{#SV~}pJq&yDgOujjy=a$ltl3i9utRtWpg@6Hc z^J!k{>56bQQK3X8lm@=j;v{k|MCG}IakHK+@?nN2HKGR04YoNKd~}@c$jr5?$-a5B z%UeG+2kB%#FX+pnC26|X#8TG^IF|`imt2)pqXXeAR`7I+f|gRN2$7|wuB+cSo*GdJ zORGjqCz1VMhN+V?qAT_d%X}hZF1E{t!qp)GR0?8 zIjwD4S~?9iyiD^qEg>a)K0uD35<;qMRhJz@3Kj^-y9Fp ziRJ56@A0as808dJ!-z?efU#}pIMq?MOgz&Q0Qjc{s%vIb9UiiT!6zC3E!ARTqG|( z4*VFG(ZRGo+CJ&fN&%n6EK`BB+pu(kk*c99mNJPYdJ+A%R@vv;Jn@~QP@C2K;Ku40 zHKYv~xpStW^0`_4;)An?T#a=#$OgG^1F%wx?lEa1M~WH(75C?0FgEhJrlv{8B^rKF zFMco|6s}+Lf{2TatBp~4KFTM_$RL>C_<{eBKF-Xl(DX`LY#K@*;$;kif8@4>M?g?y zyoML2^EWYxhp6NEh^_~1Q(pel`DZD6%NFIo_N1MZm-~I{sLjo;ip(u?N?W#UmEU@6 zTi4fX)m>Zu->33mc=lGz)=5+?98lF7MTKFs;EK~4eoXU|&lK}HbRn>7+%={GGU<-y z;8XLr$j`Yqq602pbP^y9Q-Cw<)-EIr12E3sO7k-_R<76*sIYy?z@_1W-lip>AJiz& zhakyUVxpN_vgO@xRk}1Nr-2&$b|}j^yTB`Lnok1ce2NJYRB{TcL0Qg)hVktSNCj%(vYYyTXS#C>y7aA1{L$-$JrVk5Ws%zW)tvfai1&6RzP##@FYscJ>Yq z57u6CQA>tku2pPF&Q5x>qXP1($|d@&;m+qK+fEXhnhGYKb5$;+AE4TR&ea|vs$pIC zwhdWTl*w1^W46$glTn81#G5T{#0D?`pbkKz(J%lIhD6h2T%+Yd7>w~!=iP^X+WdHh|a)hBPB}8i?7Sl#DYo*HVY!m}WI@xE7eaGc1P)GOIzmxj9E5Lz#wV z%{Zl`GkMrFD~y%TNHMbzxA-ARBdOXZf^lw7Q`+5RBivRsc|0*$@mg^vpy?0F`-0 z0If`Uta1xX4wk)HQX}51pjo3pEg1?#<*J)ZP(J{Gt6(W?#$t7xjjcwO~1+poTtNg&AuL8ski)ZMDYLxNl|Y)WCGW7{dmo7A;Q@EmHwUV>YViV3oUR zG@7}*vpOs-$tEHLpcR2KY)H$-t0UE&iH(~Q{iNF(ARCM)vjv%q_Uzk)<-3I|)c}nY z)M-YBX~qDIzF7;A?Utcnn3lv+C#q%u&HB_~#D4v%w4@9Lw6h|pk7&pS0L^&HRm#Td zH`CQ~BG6bEOg)sA)Q3iDrRB&g$c5h8>Q(V~gWK!C*Gfk^*y5)*82CE+!pBR{)XrBg z^VWtx-d!ivgBwzsoz>B^J-l$q!i&yhl2R&2072U~A8oKtZn0br4PG(Tm{Z7|Wh&jR z9E5`R*J~Qe_MiObhDtDZzJ*Z$DLth$kHj=w9s<+vl!||O0|hz64^OQn*0NhuxmU4&`OqmbkMP%kN^vMYsV-(ow+%F9L@9qX;NL9#6UQ%W?T;#0Qndv*C>7~cR4p7dxrzW2uBaa? zd0YBJs}TbL**|qiAc!BwszY)zb3>%!R?Wtzvyu=)5# za#RlNL?B@CF*jnPK0$dw3%+59K8-*#H5s1z?GnZoW+A{WXfn47&NqmiG3o8}*$ft#Ko^>9WYIxS<}@u|ZdkELPpy_j8lK=HHvmXBkU#Ra1gD63Y$Xe-tGEGj54 z3J@#IN#&zy~f`h)L zGfA=p`Q6l{KNm~GGUrMc1U2F@Nuwq*3}tqC`};G;uq@^Oa+mo~Q_8-$hz2tiRND0@ zE)N^0MdxTJU(b*`iHjW5IAshnOMID_s$<3@W1jqaAh+OP(YwFiSp4g8Md46L^Jx>U z+pM4DRYU<@+K@F4j&cjNp;(>Lo-Q&5zTX~B zFp;o!+-d{=%-)hDQ+Z8nZ<}tudJLM>Uv5X*kwvYP-pvx6YcI z4cXf2*!s~B!H?w=u_8Ls!TSuV|Nct$_;^vSM(L|Le$VeCfZwe(dG-y36pg#FHpP zzUlcufCn}C*Bk)7WZ6o!0Ep>BH{jy_41oR9=ja!Y`c-5I*)81XfK z#kF7Fkto_YmY>C!sRC_|y_uzi+u?ofO(%pl{M4FFPmeid?thTTtlC>}phPZUcY&X{ z@f0KTBhtaCt`EO%|LFCN?-}p?rIpFd#>B4Xy>>7}iZ*`nl(pzf?ydC?^o%}8Ou^O0 z?8~*S>sudvEBC_pR|Xs=D7aqf75|fva`NBLg4~tGzy5l8t2S&S|KM=hlV^=DDo@)M zQz@4>>*5iyOg07&a;fUIYmDR^yJI|d%3~>c8GX4C`CU{NEgpsU>NjxX{eJHY`Jowz zUybw1qtAP7d^R~H-s9O>E=3Ig7P?emZ9rN8+HP>8?e?NQ5AW>rXaqWwGGDZ@OK)-3 zKiB+_0B8~GkUjZJjYpD6b4=NJ$n_?1s*C;o>*spneEVrzlW`HZ@)EX{U(UNa?Qjzf za?NIfT$(NXxI#tW3T)KyEm){oL=k>>x#zjk-%}8z-}h)7Rz!oP`wi&oJB;3h9&>*R|%+N0E`giKQ zSAy+6_h-j_zK_W2ZD;$?fOQ9h9APF+07e5f7aFe3d5_M$i{Do6GPgTH9Vug}%kmb} zzzQF+6WuV27nRR{Cp-x0>+x8dVK#33dLFR{ZE_)`sMPKLV;UsRZ^BWcI0TZ z`p0Xc#{tA4LAkH>v&gPe#30fux^Px6A568)wly3(XKdO z7yie9^YM$dB-d=N`&{(8`@R?jkp0!GxCY7UtgNE9(+{*=;Gl5l_%*uY?9f+%qvZP} z+hW&=-3i$a!+XQ7k`W_tmW3ZjsJ!!$6d`g41HphCjHh>Wta1vXU^#B>88V7VKZ1BV zJ9>6>rTfb?#D3Uf55*@|BfaS&y4OMZ5K}_8n&}6iew`d%5~ReJ3*@HQ^H-C;mm}^I z($1SP)4FA7xiH2Z!tVDS=SR`*2W3mCt5bQ|uT(kkM$sLc()^Jo z(aRE@`_O9>g)QHw$}(gsKrOn+Jxt+_sn@;WGuPP%ufIRWr~6s_@K#Wj1W5ox7;I+t zy4pb6>z;9#PH*ATF~+?U(YOeU1EY7Yl)nvA2P$ivnOKqC_%-dZa%!hJ$=M5KUdo;= zM$^BkG+^r??_;dv;bT`O3l?3fK2CI>^oQPue81yR&`^7k{n$%7Yq_!eX>!2SteyYo zHV22-k+R-nKWNJ2@1L2Lfh0K7xXEO1L5n3Pu_?DK43*_7`}k;4kbz$}C6j!qz{n-h zkh$zex7&x|!SV^7Avp^nyZBGi0sz*Gje6SXg+9Z%lE zP6bAXk1BAd(h{uiXrKi(|L9qV10eQ8?X$zjqXyZ^V{i$evB@D`EzQ|stKrqDGigRn zpet&c+i8-~jq!wC>*v2h0G{7}ZXkVP4mn%^UDuYy5C&R>L$!K|y#~i!Y7z*>;Ucqf zVgF)XVg*>t8{RGQh1(YIpF^GqO26)ups82VcC+3_a$P0p)*g!W@?II5Lvn@zFMquH zfSoaa{l&9&aSD1bp*vhA`}VUbq@BEs#lirr&s9g3oH){Dtz9lPYh%j2sfbb8F9CvH z74I)ddL5B9UD^~6U%errU#@Y(PZ2$unNE49hv~$Lx0DX^-aClutoblZGCNPNa$N_x6jfNdbqacKp<+ z^>yyJ9=*`gbfPzD{d1MRAod2&cWr#MT=0(+wmbNYZS3b3G<E}sQ?J7K0u3gi}z1EjmMd_T#=$S-&yL38*8QPL!2;XdSq~+76?ZF zwe}*UCIe&O2C94*;BSCTeBzyf`$eLqgv=a!H6I{;?TuzdQB=6PQ=%>8T|iS1LP)i2iyR%cG-QPRNcTkEeZxP5Jr|>SrdF(mzQl#et5Xr3nW{VHCAwK!w%C!`-@c8GvlDZ>eNl?*) zgHOQmKFhjEPerNMMA?gGP5!Hwcb`2gYU5o#R)XT0on|*&XZ~nhKx(j1UJ7k;WBhaf zQGu`Y)W5(jF#{{dBLl~wpOyRdn`?NII6QpbCEWvG4Juh*6E&!|z*$%1??Ytq77++!%I(NAixIYRvH^ zr0*eVw6?}-?Qa%AEYlZtM=_Dby8h56QEcf`gBQHQr_lAM1_Ii}hA{fJ5}~-i4&H0? z^O=KkPdq?wGr0PRzkR&qyt0|YIAq&`K0h0(HjlIxiOOW_yp1lug}!xLNFZLl;nY4- zn}WmV=JzrHF{C<)N$Z!pK?Uxn-AJtTKlt$7K@j@awRRbQL@#~OMkzU`Z6Z!_caCd) zM6U>+;&nBAQ*JhUXcrlVci_NFg=}2I&yd ze$9rdNP0jg?Ea^rum5Ly;r~Bz*3F32CQ7*pW24y8F-e#eBevPbrebWvmO61(N6CrY zg=#jdZ3&Z`Z8qj+Iw{?d&ZeOoMx;K~nse-^bJ>N9>U_WZ2lm5z@5l4~dOh!6x!<(H zr>#jw?S;^fV|=|j9`ug5-%v~Mo{v#CIYPU`8!k@I?nxS(J-}46AEfHM7@#K68#kU_ z9uk#RQ@)n{_P#MXa$f^+wFImiTt~*CP5GGIU?CFf5Ow^}5?=#@_%rY8E?^vkR}L~} zKBg~D#a+RQnR$o;rd{&7Up(6Z?U~Z( zf4@Bl>d=S|LT2KSwW|Z#f3D$uX^Q9*(NvGtc%cQ6R+8A_dA0uYk>9jgHn=aga(JBaGBAG$4QUpB3wo z&b~;tmi$14Gn*1`9t=$`AC&AwL~mzEGW@ z!#T@c@oauy7D_^^`M2p}mtg+(gllpw)eznipdnTS^*7Y6>Jv{3;Q&lU@Q{XW@<@la zxRUQ>)HX`Q!@h94(1jy|8zvlVKe!4Q$?vIH^f631AP!*=YwF>i$eZyzX+p+i0^? z=Wgii^83(9SgFlhfIdcpU{>FJifMKsn?LOxhU@9fadBqRtF6A_?bpxFZ9;RqvU;Y| z8oYV8Q4f-ZF5zoH72ZiAZ&OpV$)CGr{OaBs5peV65XZkRW2-w4b05CNlUb*K&Nj*v z?ADyKU+%WwRyTxaWybJD3P>hhhpj|1QgG z(>|qwMyDY}s~KhnLR-F_fP^Yg5xk@5rxsEmRy*%GLJo5D^Q2 zkKyf^HfNDxDbuM|?5~R^XT10v&m3Y@%G^eaRN}iQmn1$z?xvFIl~Ri15Y%^@X@9%_ z((GL%=dDrFD;wrDiJ%WV`Q{Q4!s>sraf2U7>A zMJ0V-TaiV?+B->#11Gk+{(2`_Baj%Quw*Qrq+$zE!13q4{?-_-rDbPNxcT{#+q*AFw>~R`x5B zJ)DQ#f`|G=-^Yv?cc{v05%@TKMxqP9u1P}x`K!-=qC5`kIX$J@+a;kVv8GQ+e;Px; zbD_{_8uoui>oOsbGn;k!sBQ{VxZ+wOlqQipJ7keoGXT!R^=mOmj z?>d0Hrh!3k5lpYXzIV)xo!(x>ziRju0zz47U*0O}ZIP?puKfOGTCZ`#=Nt1Sfn$mF z%Ediwotf8)mvWm>!C%hSmMi5lc~4#Yn|2Vp^BC*E#KAM475VS*H#z#Lp_*%W7GaMs z7$gn)Po4XG!$6Nvo$Kqbb7>JR$PxnY*8btTIUsubbo7&kOA_{85^()Zik4rKqqs$# zPs!t#;_upe?wA9gX4(3^_9C@=tTzj>@%Ukuf*5&YQl2R0>B?Y`K%`NnB$=2?8iyhNE`{I!~(vlpY0=G#d}6NGA- z)UClvkgR%ipXc6tr7OvL<-H~6{cbUbt)|;WPFpm^n(z=Bs(a zyfFWJ7%raU)yA^B*lMc{=9zvqRgO@PjUjo~vEoFpX3Vk_p|Fo03ocmkpk0Xcq5($^ zLIOO(cc%D!9kXdDiZ|e{H_h&CszdOX&(GLW7Sn8#Yy%+e37ZRTy2A(?|DNkR<$Bly zjYCWZDAnEw+nMZ+Bl*KESecrNH5F;+#S`ysPJzmL_z1Su2`K`ti$kopQ8bJ&%?uBF z{M%5WrYLd8*r&O59E3|*4h*o^B3dvalwVhhX39k8fX)ILUE?8WM+kpxBo`bA|2)`tNK)}H@Xp{C}un9&PszrT<7K*Az zg;l8%rvZc0|2pQ^-GGS}3*yhcuUQ>Oy)gjTka%}{pC75iJ65K(*`AKidvHY=F zlV_Y~-pKcPS9XQq*!bZ1C%IIRe$8n>^T)2axcyQb?o)TdB0t`3#k&FoGtRut`>062 zIed_~|1)2R?v}x7g!Y{mGH;&97pwEMBfsi`r-CkJOf?Ld@fA2&F>-gUAI|xpYH7L; z6@eEU65K{LT5T4x_dQHe0SMN_i)!xZ0}W@!?Y$=^8;4WN!RvGvCKNSECNC3y+O2$# z5EnOU3vUXQWG9pPmfS|e<b$XpUSvB@r+ z@LOWc_eJ}|S1!sV*V^y=vR~1Ck6x;U_3yZP4_|j@Qtv!w&0a$ln&1sRIyMvteQ)*m z8zsE6eqX5|4yH}4qg2=jh>c3zRi&J`X7hc%FhLi-`c{dB3hV28-f_DWw=k7UU7sgS z2+*k%g!H(o96hlFUrX$PF0AspsOs}4Kg>&e;4IAJLD2Hf!L*F2U2AfM@1$6Kb{%%~ zSg|FCyt}?BQVHKqj#mUPpsfpU7%hF`_?Mz#rhGA3yRv7@K&#kw0x3u>2l|r_`bhzW zS`9wOOWVH_1-Ia}Gw*aPweD1YmpC3;r-k~&9}Fl7o#lL<4=&k}p-?Tir7BT+;fvWB zl!*U!QeT3$<|K!Fe~O(6C&lPn$3`N;r>9xCPyDf_lNpto#64nj!jyxQqjoayJ`vv8 zIazzr=gwq5^rDZj@YdH%EG*Azvr@1;LbEQ-Ii&A0?hfin2G4EO6}KY0KhSaHgz>9WO)O>Acw`P2{Dh7gRa1$)15JFGCBkpNoRAF!P66@^K3Yj5_K;gH68UvP zd#Ue1QV|R! z!G?v=27Zu}cNq^N^fs8W#0N8%_yz#FI64FKFqt`braocH=o37HnxQVRGs&V_ z2l{$dSz)jg?U?5C{iSx@=E2zX^;x(&zmd?^nX~MQs%Zw;qB0~3F^U9aX~>KBb*h!( zlu9!hL6c+ka4)Be|H(x>xX?tHU3^oMgf1Ku!XUi^ocDk)Iqa6T{PJAhR1HQ}f`*=M zsNX-WFAXt2b1XQfD#}arye{C72O}$xLSb{%;@Y|F2EA1q3ZdVptZ>Qi#si&Qve$OYZroCRr$~qT=f>i>lJ^rI|NN z(JmuIr66MDD|PTi4GeHmd5A3o%OwdawNkQAN1{!A)6w`KTg}APnRwIGfS=rGYVphZ z_N`Q_hXbw&Yp(Y+ly1`Kx-P_%^$36v20bkt&L#*8$Sdyp>#rd050lSMIUZQ8Nnspl zTyVsNCU(iCx)>fTh+n?GaHv0vpT;f!`31n}#$UVRFB>@PTr^0~pjVJ8Ag$V0nDt6C_ zr<+R!30zW0r!szl;SAaJ@%X6(>=maE_TGOwOwE#yzR23%*iIkT?rBFRt55bU6_(I% z{}%E&WUjV}JbHqSl+A|3^>Ue)APu0F zK@Be5c}yJg3A!WdZ8FCkIzPKkSnEL*aX^cz>u>3d<+R@7JgGp%7XoD?x^y)O8ooWs04OvgQ zwYn1gSqu)juPwYl0^d3rH&xDfz%**5RZ$~nn2(IHdCQ-ln?RuRX|ue=TQcZCz_|$n zBSvbE=FN~!&I{TN(kyK1y1rpsA<=CSsBXTDmCI$NZ@OF(Gy+->=b2s93{7esP@K|P zPx5M1ge$R$ZwEuaX~@IBx#GQ%rCK=6nCL*Wx&CarDtq1e7@oc~Y0F}#PgRN)QoddZ zbE~4N*5Q*Aj+9-&7>c6KZZm+2u(<1kzIaxkF46f$9G5lKOx9~izp8uCl@$~h;T8p*z9$la(* zCI>;cz4}PJJcWxdlV*JFjq6=D`qe&on*%68XQs+4YR^g&sz2PVa$w|I$syiHrX0a3 zUsCkQ3NRW_wds(TQ*nZU1UdJoqgJ?1J}R{JNXd1z-vzb8#|%K!+17C)ce9rFzixzQ zR58j`qu~ zP+nP)h4<;3w{d8YSlN|QlBMdMD2}`~e?h}5uj}5qB1>p`$@ww0x8{(gV|2KQhCpaP zH@Iq(nftgVTpf?uxhe!Dl6qgHc=b*K4}3+9hL|OD=USr{3@$QXtXEjSJL-AsH>9?Y zR_7ufHZC<9rU;3-rN>j%J20krO-Sma6`tX4fqo%QXgFP!o+!rR#j|B5LEsqa#;FdI zmGP;Q*{^cG$H!Viii5}ae~*IZ!0dgQ%ESlV@N^fj4GQjKlR~mf*Sif^t6R-bb~=(| z7o|DQ%x1jcx;oVGx6*Siw*@E;*G39&4Aaj`4cWQ8rAFs7K*Xs3xS6Xb%zl>0mWQps zpGZvbT;vlX%lj~O0bJEeott)OXn+F)k1JFS-)28I`vQkb>-=U|Fni2GjKP`5BeFSc3@HSJEdT9Ps@d+f=TyqA z302kVBMI7EJa59Sek;{z%WuV|_>`c_F8XZXw9K7q7cMxT<0Fsu*E0x;lw _G2U+ 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 Bcn1Ig literal 0 HcmV?d00001 diff --git a/data/zhang_luck_2008.rda b/data/zhang_luck_2008.rda new file mode 100644 index 0000000000000000000000000000000000000000..f7877fc57463d8d3dff474c72fa18c27e7c7ef9f GIT binary patch literal 22017 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 o*$Ac~PHNki2_}OClLQJ3(q@7-Kn#b1?_d5d% + data <- oberauer_lin_2017 %>% mutate(ID = as.factor(ID), set_size = as.factor(set_size)) %>% dplyr::filter(ID %in% c(1,2,3,4,5,6,7,8,9,10), diff --git a/tests/internal/generate_ref_model_fits_v0.2.1.R b/tests/internal/generate_ref_model_fits_v0.2.1.R index e2821e8c..b69690ac 100644 --- a/tests/internal/generate_ref_model_fits_v0.2.1.R +++ b/tests/internal/generate_ref_model_fits_v0.2.1.R @@ -15,11 +15,11 @@ install_and_load_bmm_version <- function(version) { library(bmm, lib.loc=path) } -# Load data for vwm models (Participant 1-10, SetSize 1-4, from OberauerLin_2017) +# Load data for vwm models (Participant 1-10, SetSize 1-4, from oberauer_lin_2017) # TODO: generalize in the future to allow for different datasets for different models ref_data <- function() { withr::local_package('dplyr') - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 dat <- dat %>% mutate(ID = as.factor(ID), SetSize = as.factor(SetSize)) %>% diff --git a/tests/testthat/test-bmm_model_IMM.R b/tests/testthat/test-bmm_model_IMM.R index cf52d991..ee50eca2 100644 --- a/tests/testthat/test-bmm_model_IMM.R +++ b/tests/testthat/test-bmm_model_IMM.R @@ -1,6 +1,6 @@ test_that('IMMfull works when set_size is not predicted and there is set_size 1', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, a ~ 1, @@ -19,7 +19,7 @@ test_that('IMMfull works when set_size is not predicted and there is set_size 1' test_that('IMMabc works when set_size is not predicted and there is set_size 1', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, a ~ 1, @@ -37,7 +37,7 @@ test_that('IMMabc works when set_size is not predicted and there is set_size 1', test_that('IMMbsc works when set_size is not predicted and there is set_size 1', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, c ~ 1, @@ -56,7 +56,7 @@ test_that('IMMbsc works when set_size is not predicted and there is set_size 1', test_that('IMM models give an error if set_size is a predictor but there is an intercept', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, c ~ 1, @@ -133,7 +133,7 @@ test_that('IMM models give an error if set_size is a predictor but there is an i test_that('IMM models run when set_size is a predictor and intercept is supressed', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, c ~ 1, diff --git a/tests/testthat/test-bmm_model_mixture3p.R b/tests/testthat/test-bmm_model_mixture3p.R index bc3f9a32..2cadca27 100644 --- a/tests/testthat/test-bmm_model_mixture3p.R +++ b/tests/testthat/test-bmm_model_mixture3p.R @@ -1,6 +1,6 @@ test_that('mixture3p works when set_size is not predicted and there is set_size 1', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, thetat ~ 1, @@ -17,7 +17,7 @@ test_that('mixture3p works when set_size is not predicted and there is set_size test_that('mixture3p gives an error if set_size is a predictor but there is an intercept', { skip_on_cran() - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 formula <- bmf( kappa ~ 1, thetat ~ 1, diff --git a/tests/testthat/test-helpers-data.R b/tests/testthat/test-helpers-data.R index bf9bdd80..3c2c588b 100644 --- a/tests/testthat/test-helpers-data.R +++ b/tests/testthat/test-helpers-data.R @@ -209,7 +209,7 @@ test_that("standata() works with formula", { test_that("standata() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 sd <- standata(ff, dat, mixture3p(resp_error = "dev_rad", nt_features = 'col_nt', set_size = "set_size", regex = T)) @@ -292,7 +292,7 @@ test_that('is_data_ordered works', { expect_false(is_data_ordered(data3, formula2)) # test with a complex formula with shared covariance structure across parameters - data <- OberauerLin_2017 + data <- oberauer_lin_2017 formula <- bmf(c ~ 0 + set_size + (0 + set_size | p1 | ID), kappa ~ 0 + set_size + (0 + set_size | p1 | ID)) expect_false(is_data_ordered(data, formula)) diff --git a/tests/testthat/test-helpers-model.R b/tests/testthat/test-helpers-model.R index 54972ed9..0276384f 100644 --- a/tests/testthat/test-helpers-model.R +++ b/tests/testthat/test-helpers-model.R @@ -20,7 +20,7 @@ test_that("check_model() refuses invalid models and accepts valid models", { }) test_that("check_model() works with regular expressions", { - dat <- OberauerLin_2017 + dat <- oberauer_lin_2017 models1 <- list( mixture3p("dev_rad", nt_features = paste0("col_nt", 1:7), @@ -104,7 +104,7 @@ test_that("stancode() works with formula", { test_that("stancode() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - sc <- stancode(ff, OberauerLin_2017, model = mixture3p(resp_error = "dev_rad", + sc <- stancode(ff, oberauer_lin_2017, model = mixture3p(resp_error = "dev_rad", nt_features = "col_nt", set_size = "set_size", regex = T) @@ -115,7 +115,7 @@ test_that("stancode() works with bmmformula", { test_that("no check for with stancode function", { withr::local_options('bmm.sort_data' = 'check') expect_no_message(stancode(bmf(kappa ~ set_size, c ~ set_size), - OberauerLin_2017, + oberauer_lin_2017, sdmSimple('dev_rad'))) }) diff --git a/tests/testthat/test-helpers-prior.R b/tests/testthat/test-helpers-prior.R index ab3d6293..d4eb2c2f 100644 --- a/tests/testthat/test-helpers-prior.R +++ b/tests/testthat/test-helpers-prior.R @@ -12,7 +12,7 @@ test_that("default_prior() works with formula", { test_that("default_prior() works with bmmformula", { ff <- bmmformula(kappa ~ 1, thetat ~ 1, thetant ~ 1) - prior <- default_prior(ff, OberauerLin_2017, mixture3p(resp_error = "dev_rad", + prior <- default_prior(ff, oberauer_lin_2017, mixture3p(resp_error = "dev_rad", nt_features = "col_nt", set_size = "set_size", regex = T)) @@ -47,7 +47,7 @@ test_that("in combine prior, prior2 overwrites only shared components with prior test_that("default priors are returned correctly", { dp <- default_prior(bmf(kappa ~ set_size, thetat ~ set_size), - OberauerLin_2017, + oberauer_lin_2017, mixture2p('dev_rad')) expect_equal(dp[dp$coef == "" & dp$class == "b", ]$prior, c("","normal(0, 1)")) expect_equal(dp[dp$coef == "Intercept", ]$prior, c("normal(2, 1)", "logistic(0, 1)")) @@ -56,7 +56,7 @@ test_that("default priors are returned correctly", { test_that("no check for sort_data with default_priors function", { withr::local_options('bmm.sort_data' = 'check') res <- capture_messages(default_prior(bmf(kappa ~ set_size, c ~ set_size), - OberauerLin_2017, + oberauer_lin_2017, sdmSimple('dev_rad'))) expect_false(any(grepl("sort", res))) }) @@ -72,6 +72,6 @@ test_that("default priors work when there are no fixed parameters", { prior_fn <- get_model_prior } - pr <- prior_fn(formula, OberauerLin_2017, sdmSimple('dev_rad')) + pr <- prior_fn(formula, oberauer_lin_2017, sdmSimple('dev_rad')) expect_s3_class(pr, 'brmsprior') }) diff --git a/vignettes/bmm_extract_info.Rmd b/vignettes/bmm_extract_info.Rmd index dbb25ef2..e5e7b3a4 100644 --- a/vignettes/bmm_extract_info.Rmd +++ b/vignettes/bmm_extract_info.Rmd @@ -51,7 +51,7 @@ You can use the function `default_prior()` from the `brms` package to extract th library(bmm) default_prior(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad')) ``` @@ -77,7 +77,7 @@ If we had retained the intercept in the formula, the default prior above would b ```{r message=FALSE, warning=FALSE} default_prior(bmf(c ~ 1 + set_size, kappa ~ 1 + set_size), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad')) ``` @@ -85,7 +85,7 @@ You can also see that in both cases, the last line is "constant(0)" on the Inter ```{r message=FALSE, warning=FALSE} default_prior(bmf(mu ~ 1 + set_size, c ~ 1, kappa ~ 1), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad')) ``` @@ -101,7 +101,7 @@ The Stan code used for fitting a model is generated together by `bmm` and `brms` ```{r comment = "", collapse=FALSE} stancode(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad')) ``` @@ -110,7 +110,7 @@ Alternatively, if you already have a fitted model object, you can just call `sta ```r fit <- bmm(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad')) stancode(fit) ``` @@ -121,7 +121,7 @@ If you want to extract the data that would be used for fitting a model, you can ```{r} sd <- standata(bmf(c ~ 0 + set_size, kappa ~ 0 + set_size), - data = OberauerLin_2017, + data = oberauer_lin_2017, model = sdmSimple(resp_error = 'dev_rad'), sort_data = TRUE) str(sd) From 78607241517d919ae1e2220a95d7a7e3871119ef Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 18:16:02 +0100 Subject: [PATCH 12/13] deprecate parallel argument --- NEWS.md | 1 + R/bmm.R | 29 +++++++------------ R/bmm_model_IMM.R | 4 +-- R/bmm_model_mixture2p.R | 6 ++-- R/bmm_model_mixture3p.R | 8 ++--- R/bmm_model_sdmSimple.R | 5 ++-- R/utils.R | 14 +++++---- man/IMM.Rd | 4 +-- man/SDM.Rd | 5 ++-- man/bmm.Rd | 15 ++-------- man/mixture2p.Rd | 6 ++-- man/mixture3p.Rd | 8 ++--- tests/internal/bmmexamples.R | 7 +---- .../internal/generate_ref_model_fits_v0.2.1.R | 18 ++++-------- tests/testthat/test-helpers-postprocess.R | 16 ++++------ vignettes/bmm_imm.Rmd | 4 +-- vignettes/bmm_mixture_models.Rmd | 14 ++++----- vignettes/bmm_sdm_simple.Rmd | 6 ++-- 18 files changed, 65 insertions(+), 105 deletions(-) diff --git a/NEWS.md b/NEWS.md index 233bb7c9..6dbecabb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -20,6 +20,7 @@ * the function `fit_model()` is deprecated in favor of `bmm()` (#163) and will be removed in a future version * the argument **setsize** for the `mixture3p` and `IMM` models is now called **set_size** for consistency (#163). The old argument name is deprecated and will be removed in a future version * the distributions functions for the imm model are renamed from dIMM, pIMM, rIMM and qIMM to dimm, pimm, rimm and qimm (#163) +* the argument parallel for the bmm() function is deprecated and will be removed in a future version. Use `cores` instead, as for brms::brm() (#163) ### Other changes * `bmm` now requires the latest version of `brms` (>= 2.21.0). diff --git a/R/bmm.R b/R/bmm.R index bfce3885..ec6e49b7 100644 --- a/R/bmm.R +++ b/R/bmm.R @@ -14,10 +14,6 @@ #' number of required arguments which need to be specified within the function #' call. Call [supported_models()] to see the list of supported models and #' their required arguments -#' @param parallel Logical; If TRUE, the number of cores on your machine will be -#' detected and brms will fit max(chains, cores) number of chains (specified -#' by the `chain` argument) in parallel using the parallel package -#' @param chains Numeric. Number of Markov chains (defaults to 4) #' @param prior One or more `brmsprior` objects created by [brms::set_prior()] #' or related functions and combined using the c method or the + operator. See #' also [default_prior()] for more help. Not necessary for the default model @@ -76,7 +72,7 @@ #' @examples #' \dontrun{ #' # generate artificial data from the Signal Discrimination Model -#' dat <- data.frame(y=rsdm(n=2000)) +#' dat <- data.frame(y = rsdm(2000)) #' #' # define formula #' ff <- bmmformula(c ~ 1, kappa ~ 1) @@ -85,25 +81,23 @@ #' fit <- bmm(formula = ff, #' data = dat, #' model = sdmSimple(resp_error = "y"), -#' parallel=T, -#' iter = 500, +#' cores = 4, #' backend = 'cmdstanr') #' } #' bmm <- function(formula, data, model, - prior = NULL, - chains = 4, - parallel = getOption('bmm.parallel', FALSE), - sort_data = getOption('bmm.sort_data', "check"), - silent = getOption('bmm.silent', 1), - backend = getOption('brms.backend', NULL), - ...) { + prior = NULL, + sort_data = getOption('bmm.sort_data', "check"), + silent = getOption('bmm.silent', 1), + backend = getOption('brms.backend', NULL), ...) { deprecated_args(...) dots <- list(...) # set temporary global options and return modified arguments for brms - configure_opts <- nlist(parallel, chains, sort_data, silent, backend) + configure_opts <- nlist(sort_data, silent, backend, parallel = dots$parallel, + cores = dots$cores) opts <- configure_options(configure_opts) + dots$parallel <- NULL # check model, formula and data, and transform data if necessary user_formula <- formula @@ -131,14 +125,11 @@ bmm <- function(formula, data, model, #' @export fit_model <- function(formula, data, model, prior = NULL, - chains = 4, - parallel = getOption('bmm.parallel', FALSE), sort_data = getOption('bmm.sort_data', "check"), silent = getOption('bmm.silent', 1), backend = getOption('brms.backend', NULL), ...) { message("You are using the deprecated `fit_model()` function. Please use `bmm()` instead.") bmm(formula = formula, data = data, model = model, prior = prior, - chains = chains, parallel = parallel, sort_data = sort_data, - silent = silent, backend = backend, ...) + sort_data = sort_data, silent = silent, backend = backend, ...) } diff --git a/R/bmm_model_IMM.R b/R/bmm_model_IMM.R index 98166475..8859d152 100644 --- a/R/bmm_model_IMM.R +++ b/R/bmm_model_IMM.R @@ -233,7 +233,7 @@ #' fit <- bmm(formula = ff, #' data = data, #' model = model1, -#' parallel = T, +#' cores = 4, #' backend = 'cmdstanr') #' #' # alternatively specify the IMM model with a regular expression to match non-target features @@ -248,7 +248,7 @@ #' fit <- bmm(formula = ff, #' data = data, #' model = model2, -#' parallel = T, +#' cores = 4, #' backend = 'cmdstanr') #'} #' @export diff --git a/R/bmm_model_mixture2p.R b/R/bmm_model_mixture2p.R index d409efd4..2bcbb6f4 100644 --- a/R/bmm_model_mixture2p.R +++ b/R/bmm_model_mixture2p.R @@ -76,9 +76,9 @@ #' fit <- bmm(formula = ff, #' data = dat, #' model = model, -#' parallel=T, -#' iter=500, -#' backend='cmdstanr') +#' cores = 4, +#' iter = 500, +#' backend = 'cmdstanr') #' } #' @export mixture2p <- function(resp_error, diff --git a/R/bmm_model_mixture3p.R b/R/bmm_model_mixture3p.R index af2a2524..961c884c 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/bmm_model_mixture3p.R @@ -105,9 +105,9 @@ #' fit <- bmm(formula = ff, #' data = dat, #' model = model1, -#' parallel=T, +#' cores = 4, #' iter = 500, -#' backend='cmdstanr') +#' backend = 'cmdstanr') #' #' # alternatively specify the 3-parameter model with a regular expression to match non-target features #' # this is equivalent to the previous call, but more concise @@ -117,9 +117,9 @@ #' fit <- bmm(formula = ff, #' data = dat, #' model = model2, -#' parallel=T, +#' cores = 4, #' iter = 500, -#' backend='cmdstanr') +#' backend = 'cmdstanr') #' } mixture3p <- function(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) { diff --git a/R/bmm_model_sdmSimple.R b/R/bmm_model_sdmSimple.R index b4baa60f..a90fb879 100644 --- a/R/bmm_model_sdmSimple.R +++ b/R/bmm_model_sdmSimple.R @@ -82,9 +82,8 @@ #' data = dat, #' model = sdmSimple(resp_error = 'y'), #' prior = prior, -#' parallel=T, -#' iter=2000, -#' backend='cmdstanr') +#' cores = 4, +#' backend = 'cmdstanr') #' #' # extract coefficients and plot fit #' coef <- exp(brms::fixef(fit)[2:3,1]) diff --git a/R/utils.R b/R/utils.R index f3a68a77..afde9118 100644 --- a/R/utils.R +++ b/R/utils.R @@ -72,12 +72,13 @@ softmaxinv <- function(p, lambda = 1) { #' @returns A list of options to pass to brm() configure_options <- function(opts, env = parent.frame()) { if (isTRUE(opts$parallel)) { - cores = parallel::detectCores() - if (opts$chains > parallel::detectCores()) { - opts$chains <- parallel::detectCores() + cores <- parallel::detectCores() + chains <- opts$chains + if (is.null(opts$chains)) { + chains <- 4 } } else { - cores = NULL + cores = opts$cores } if (not_in_list('silent', opts)) { opts$silent <- getOption('bmm.silent', 1) @@ -96,7 +97,7 @@ configure_options <- function(opts, env = parent.frame()) { .local_envir = env) # return only options that can be passed to brms/rstan/cmdstanr - exclude_args <- c('parallel', 'sort_data') + exclude_args <- c('parallel', 'sort_data', "cores") opts[not_in(names(opts), exclude_args)] } @@ -657,4 +658,7 @@ deprecated_args <- function(...) { - See ?bmm for the new usage; - or install the old version of the package with: devtools::install_github("venpopov/bmm@v0.0.1")') + warnif("parallel" %in% names(dots), + 'The "parallel" argument is deprecated. Please use cores instead. + See `help("brm")` for more information.') } diff --git a/man/IMM.Rd b/man/IMM.Rd index 1975c8de..7a896f19 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -270,7 +270,7 @@ model1 <- IMMfull(resp_error = "dev_rad", fit <- bmm(formula = ff, data = data, model = model1, - parallel = T, + cores = 4, backend = 'cmdstanr') # alternatively specify the IMM model with a regular expression to match non-target features @@ -285,7 +285,7 @@ model2 <- IMMfull(resp_error = "dev_rad", fit <- bmm(formula = ff, data = data, model = model2, - parallel = T, + cores = 4, backend = 'cmdstanr') } } diff --git a/man/SDM.Rd b/man/SDM.Rd index 1f09a74d..6702dd5b 100644 --- a/man/SDM.Rd +++ b/man/SDM.Rd @@ -93,9 +93,8 @@ fit <- bmm(formula = ff, data = dat, model = sdmSimple(resp_error = 'y'), prior = prior, - parallel=T, - iter=2000, - backend='cmdstanr') + cores = 4, + backend = 'cmdstanr') # extract coefficients and plot fit coef <- exp(brms::fixef(fit)[2:3,1]) diff --git a/man/bmm.Rd b/man/bmm.Rd index 377b94a0..f6179d87 100644 --- a/man/bmm.Rd +++ b/man/bmm.Rd @@ -10,8 +10,6 @@ bmm( data, model, prior = NULL, - chains = 4, - parallel = getOption("bmm.parallel", FALSE), sort_data = getOption("bmm.sort_data", "check"), silent = getOption("bmm.silent", 1), backend = getOption("brms.backend", NULL), @@ -23,8 +21,6 @@ fit_model( data, model, prior = NULL, - chains = 4, - parallel = getOption("bmm.parallel", FALSE), sort_data = getOption("bmm.sort_data", "check"), silent = getOption("bmm.silent", 1), backend = getOption("brms.backend", NULL), @@ -50,12 +46,6 @@ or related functions and combined using the c method or the + operator. See also \code{\link[=default_prior]{default_prior()}} for more help. Not necessary for the default model fitting, but you can provide prior constraints to model parameters} -\item{chains}{Numeric. Number of Markov chains (defaults to 4)} - -\item{parallel}{Logical; If TRUE, the number of cores on your machine will be -detected and brms will fit max(chains, cores) number of chains (specified -by the \code{chain} argument) in parallel using the parallel package} - \item{sort_data}{Logical. If TRUE, the data will be sorted by the predictor variables for faster sampling. If FALSE, the data will not be sorted, but sampling will be slower. If "check" (the default), \code{\link[=bmm]{bmm()}} will check if @@ -119,7 +109,7 @@ Type \code{help(package=bmm)} for a full list of available help topics. \examples{ \dontrun{ # generate artificial data from the Signal Discrimination Model -dat <- data.frame(y=rsdm(n=2000)) +dat <- data.frame(y = rsdm(2000)) # define formula ff <- bmmformula(c ~ 1, kappa ~ 1) @@ -128,8 +118,7 @@ ff <- bmmformula(c ~ 1, kappa ~ 1) fit <- bmm(formula = ff, data = dat, model = sdmSimple(resp_error = "y"), - parallel=T, - iter = 500, + cores = 4, backend = 'cmdstanr') } diff --git a/man/mixture2p.Rd b/man/mixture2p.Rd index 0f87e7aa..55a56ffe 100644 --- a/man/mixture2p.Rd +++ b/man/mixture2p.Rd @@ -85,9 +85,9 @@ model <- mixture2p(resp_error = "y") fit <- bmm(formula = ff, data = dat, model = model, - parallel=T, - iter=500, - backend='cmdstanr') + cores = 4, + iter = 500, + backend = 'cmdstanr') } } \keyword{bmmmodel} diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index 67c63ad1..09f3d8af 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -117,9 +117,9 @@ model1 <- mixture3p(resp_error = "y", nt_features = paste0('nt',1:3,'_loc'), set fit <- bmm(formula = ff, data = dat, model = model1, - parallel=T, + cores = 4, iter = 500, - backend='cmdstanr') + backend = 'cmdstanr') # alternatively specify the 3-parameter model with a regular expression to match non-target features # this is equivalent to the previous call, but more concise @@ -129,9 +129,9 @@ model2 <- mixture3p(resp_error = "y", nt_features = "nt.*_loc", set_size = 4, re fit <- bmm(formula = ff, data = dat, model = model2, - parallel=T, + cores = 4, iter = 500, - backend='cmdstanr') + backend = 'cmdstanr') } } \keyword{bmmmodel} diff --git a/tests/internal/bmmexamples.R b/tests/internal/bmmexamples.R index d3b7cd13..fb8655b3 100644 --- a/tests/internal/bmmexamples.R +++ b/tests/internal/bmmexamples.R @@ -1,6 +1,6 @@ generate_bmm_examples <- function(seed = 123) { withr::local_options(brms.backend = 'rstan', - bmm.parallel = TRUE, + mc.cores = parallel::detectCores(), bmm.sort_data = TRUE) withr::local_package('dplyr') set.seed(seed) @@ -16,7 +16,6 @@ generate_bmm_examples <- function(seed = 123) { formula <- bmf(c ~ 0 + set_size, kappa ~ 1) model <- sdmSimple('dev_rad') bmmfit_example1 <- bmm(formula, data, model, - parallel = TRUE, iter = 100, refresh = 0, init = 1, @@ -59,9 +58,6 @@ generate_bmm_examples <- function(seed = 123) { formula = formula, data = dat_preprocessed, model = model, - parallel = T, - iter = 2000, - chains = 4, refresh = 100, save_pars = save_pars(group = FALSE), save_warmup = FALSE @@ -117,7 +113,6 @@ generate_bmm_examples <- function(seed = 123) { formula = model_formula, data = simData, model = model, - chains = 4, save_pars = save_pars(group = FALSE), save_warmup = FALSE ) diff --git a/tests/internal/generate_ref_model_fits_v0.2.1.R b/tests/internal/generate_ref_model_fits_v0.2.1.R index b69690ac..25e53dd5 100644 --- a/tests/internal/generate_ref_model_fits_v0.2.1.R +++ b/tests/internal/generate_ref_model_fits_v0.2.1.R @@ -47,9 +47,7 @@ run_sdmSimple <- function(...) { kappa ~ 1) model <- sdmSimple() fit <- fit_model(formula, dat, model, - parallel = TRUE, - chains = 4, - iter = 2000, + cores = parallel::detectCores(), refresh = 500, init = 1, silent = 1, @@ -78,8 +76,7 @@ run_mixture3p <- function(...) { model <- mixture3p(non_targets = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") fit <- fit_model(formula, dat, model, - parallel = TRUE, - chains = 4, + cores = parallel::detectCores(), iter = 1000, refresh = 500, init = 1, @@ -107,8 +104,7 @@ run_mixture2p <- function(...) { kappa ~ 0 + SetSize) model <- mixture2p() fit <- fit_model(formula, dat, model, - parallel = TRUE, - chains = 4, + cores = parallel::detectCores(), iter = 1000, refresh = 500, init = 1, @@ -138,8 +134,7 @@ run_IMMabc <- function(...) { model <- IMMabc(non_targets = paste0("Item", 2:4,"_Col_rad"), set_size = "SetSize") fit <- fit_model(formula, dat, model, - parallel = TRUE, - chains = 4, + cores = parallel::detectCores(), iter = 1000, refresh = 500, init = 1, @@ -171,8 +166,7 @@ run_IMMbsc <- function(...) { spaPos = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") fit <- fit_model(formula, dat, model, - parallel = TRUE, - chains = 4, + cores = parallel::detectCores(), iter = 1000, refresh = 500, init = 1, @@ -204,7 +198,7 @@ run_IMMfull <- function(...) { spaPos = paste0("Item", 2:4,"_Pos_rad"), set_size = "SetSize") fit <- fit_model(formula, dat, model, - parallel = TRUE, + cores = parallel::detectCores(), chains = 4, iter = 1000, refresh = 500, diff --git a/tests/testthat/test-helpers-postprocess.R b/tests/testthat/test-helpers-postprocess.R index ebd5688a..c63e10a4 100644 --- a/tests/testthat/test-helpers-postprocess.R +++ b/tests/testthat/test-helpers-postprocess.R @@ -1,15 +1,8 @@ test_that("bmm version is added to mock model", { - dat <- data.frame(y = rsdm(n=10)) - - ff <- bmmformula(c ~ 1, - kappa ~ 1) - - fit <- bmm(formula = ff, - data = dat, + fit <- bmm(formula = bmmformula(c ~ 1, kappa ~ 1), + data = data.frame(y = rsdm(n=10)), model = sdmSimple(resp_error = "y"), - parallel=T, - iter=500, - backend='mock', + backend = 'mock', rename = F, mock = 1) expect_true("bmm" %in% names(fit$version)) @@ -17,7 +10,8 @@ test_that("bmm version is added to mock model", { test_that("get_mu_pars works",{ - a <- brm(y~ a, data.frame(y = c(1,2,3), a = c('A',"B","C")), backend = "mock", mock_fit = 1, rename=F) + a <- brm(y~ a, data.frame(y = c(1,2,3), a = c('A',"B","C")), + backend = "mock", mock_fit = 1, rename=F) mus <- get_mu_pars(a) expect_equal(mus, c("Intercept", "aB", "aC")) }) diff --git a/vignettes/bmm_imm.Rmd b/vignettes/bmm_imm.Rmd index 3c86102e..4ff1e045 100644 --- a/vignettes/bmm_imm.Rmd +++ b/vignettes/bmm_imm.Rmd @@ -209,9 +209,7 @@ fit <- bmm( formula = model_formula, data = simData, model = model, - parallel = TRUE, - chains = 4, - iter = 2000, + cores = 4, backend = "cmdstanr" ) ``` diff --git a/vignettes/bmm_mixture_models.Rmd b/vignettes/bmm_mixture_models.Rmd index 4a809c2e..ba56655c 100644 --- a/vignettes/bmm_mixture_models.Rmd +++ b/vignettes/bmm_mixture_models.Rmd @@ -191,10 +191,9 @@ fit <- bmm( formula = ff, data = dat_preprocessed, model = model, - parallel=T, - iter=2000, - refresh=100, - backend='cmdstanr' + cores = 4, + refresh = 100, + backend = 'cmdstanr' ) ``` @@ -306,10 +305,9 @@ fit3p <- bmm( formula = ff, data = dat_preprocessed, model = model, - parallel=T, - iter=2000, - refresh=100, - backend='cmdstanr' + cores = 4, + refresh = 100, + backend = 'cmdstanr' ) ``` diff --git a/vignettes/bmm_sdm_simple.Rmd b/vignettes/bmm_sdm_simple.Rmd index a904be1d..5a8d08a2 100644 --- a/vignettes/bmm_sdm_simple.Rmd +++ b/vignettes/bmm_sdm_simple.Rmd @@ -191,11 +191,9 @@ fit <- bmm( formula = ff, data = dat, model = model, - parallel = T, - chains = 4, + cores = 4, init = 0.5, - iter = 2000, - backend='cmdstanr' + backend = 'cmdstanr' ) ``` From e57f27797c0d83b17fdf6786ee3f6434c3f95e69 Mon Sep 17 00:00:00 2001 From: Ven Popov Date: Mon, 25 Mar 2024 19:16:24 +0100 Subject: [PATCH 13/13] rename bmmmodel to bmmodel --- DESCRIPTION | 3 +-- NAMESPACE | 18 +++++++------- NEWS.md | 4 ++-- R/bmm.R | 4 ++-- R/bmmformula.R | 16 ++++++------- R/helpers-data.R | 2 +- R/helpers-model.R | 24 +++++++++---------- R/helpers-postprocess.R | 2 +- R/helpers-prior.R | 14 +++++------ R/{bmm_model_IMM.R => model_IMM.R} | 14 +++++------ ...mm_model_mixture2p.R => model_mixture2p.R} | 6 ++--- ...mm_model_mixture3p.R => model_mixture3p.R} | 6 ++--- ...mm_model_sdmSimple.R => model_sdmSimple.R} | 6 ++--- R/restructure.R | 8 ++++++- R/summary.R | 6 ++--- R/utils.R | 8 +++---- README.Rmd | 2 +- README.md | 2 +- _pkgdown.yml | 2 +- man/IMM.Rd | 6 ++--- man/SDM.Rd | 6 ++--- man/bmf2bf.Rd | 4 ++-- man/bmm.Rd | 4 ++-- man/bmmformula.Rd | 6 ++--- man/configure_prior.Rd | 6 ++--- man/default_prior.bmmformula.Rd | 4 ++-- man/mixture2p.Rd | 6 ++--- man/mixture3p.Rd | 6 ++--- man/stancode.bmmformula.Rd | 4 ++-- man/standata.bmmformula.Rd | 4 ++-- man/use_model_template.Rd | 4 ++-- tests/testthat/test-helpers-model.R | 4 ++-- vignettes/bmm_bmmformula.Rmd | 12 +++++----- 33 files changed, 114 insertions(+), 109 deletions(-) rename R/{bmm_model_IMM.R => model_IMM.R} (98%) rename R/{bmm_model_mixture2p.R => model_mixture2p.R} (97%) rename R/{bmm_model_mixture3p.R => model_mixture3p.R} (98%) rename R/{bmm_model_sdmSimple.R => model_sdmSimple.R} (98%) diff --git a/DESCRIPTION b/DESCRIPTION index 6399f02a..92de2e44 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: bmm Title: Easy and Accesible Bayesian Measurement Models using 'brms' -Version: 0.4.7.9000 +Version: 0.4.8.9000 Authors@R: c( person("Vencislav", "Popov", , "vencislav.popov@gmail.com", role = c("aut", "cre", "cph")), person("Gidon", "Frischkorn", , "gidon.frischkorn@psychologie.uzh.ch", role = c("aut", "cph")), @@ -49,7 +49,6 @@ URL: https://github.com/venpopov/bmm, https://venpopov.github.io/bmm/ BugReports: https://github.com/venpopov/bmm/issues Additional_repositories: https://mc-stan.org/r-packages/ - https://paul-buerkner.github.io/brms/ VignetteBuilder: knitr Depends: R (>= 3.6.0), diff --git a/NAMESPACE b/NAMESPACE index e5cc6b36..3e480a5a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,18 +4,18 @@ S3method("+",bmmformula) S3method("[",bmmformula) S3method("[<-",bmmformula) S3method(add_links,bmmfit) -S3method(add_links,bmmmodel) -S3method(bmf2bf,bmmmodel) +S3method(add_links,bmmodel) +S3method(bmf2bf,bmmodel) S3method(check_data,IMMspatial) -S3method(check_data,bmmmodel) +S3method(check_data,bmmodel) S3method(check_data,default) S3method(check_data,nontargets) S3method(check_data,sdmSimple) S3method(check_data,vwm) -S3method(check_formula,bmmmodel) +S3method(check_formula,bmmodel) S3method(check_formula,default) S3method(check_formula,nontargets) -S3method(check_model,bmmmodel) +S3method(check_model,bmmodel) S3method(check_model,default) S3method(configure_model,IMMabc) S3method(configure_model,IMMbsc) @@ -26,7 +26,7 @@ S3method(configure_model,sdmSimple) S3method(configure_prior,IMMabc) S3method(configure_prior,IMMbsc) S3method(configure_prior,IMMfull) -S3method(configure_prior,bmmmodel) +S3method(configure_prior,bmmodel) S3method(configure_prior,default) S3method(configure_prior,mixture3p) S3method(default_prior,bmmformula) @@ -40,8 +40,8 @@ S3method(is_constant,bmmformula) S3method(is_constant,default) S3method(is_nl,bmmformula) S3method(is_nl,default) -S3method(model_info,bmmmodel) -S3method(postprocess_brm,bmmmodel) +S3method(model_info,bmmodel) +S3method(postprocess_brm,bmmodel) S3method(postprocess_brm,default) S3method(postprocess_brm,sdmSimple) S3method(print,bmmformula) @@ -60,7 +60,7 @@ S3method(rhs_vars,bmmformula) S3method(rhs_vars,formula) S3method(stancode,bmmformula) S3method(standata,bmmformula) -S3method(summarise_model,bmmmodel) +S3method(summarise_model,bmmodel) S3method(summary,bmmfit) S3method(update,bmmfit) export("%>%") diff --git a/NEWS.md b/NEWS.md index 6dbecabb..e72d28e7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -52,10 +52,10 @@ ### New features -* BREAKING CHANGE: The `fit_model` function now requires a `bmmformula` to be passed. The syntax of the `bmmformula` or its short form `bmf` is equal to specifying a `brmsformula`. However, as of this version the `bmmformula` only specifies how parameters of a `bmmmodel` change across experimental conditions or continuous predictors. The response variables that the model is fit to now have to be specified when the model is defined using `model = bmmmodel()`. (#79) +* BREAKING CHANGE: The `fit_model` function now requires a `bmmformula` to be passed. The syntax of the `bmmformula` or its short form `bmf` is equal to specifying a `brmsformula`. However, as of this version the `bmmformula` only specifies how parameters of a `bmmodel` change across experimental conditions or continuous predictors. The response variables that the model is fit to now have to be specified when the model is defined using `model = bmmodel()`. (#79) * BREAKING CHANGE: The `non_target` and `spaPos` variables for the `mixture3p` and `IMM` models were relabled to `nt_features` and `nt_distances` for consistency. This is also to communicate that distance is not limited to spatial distance but distances on any feature dimensions of the retrieval cues. Currently, still only a single generalization gradient for the cue features is possible. * This release includes reference fits for all implemented models to ensure that future changes to the package do not compromise the included models and change the results that their implementations produce. -* The `check_formula` methods have been adapted to match the new `bmmformula` syntax. It now evaluates if formulas have been specified using the `bmmformula` function, if formulas for all parameters of a `bmmmodel` have been specified and warns the user that only a fixed intercept will be estimated if no formula for one of the parameters was provided. Additionally, `check_formula` throws an error should formulas be provided that do not match a parameter of the called `bmmmodel` unless they are part of a non-linear transformation. +* The `check_formula` methods have been adapted to match the new `bmmformula` syntax. It now evaluates if formulas have been specified using the `bmmformula` function, if formulas for all parameters of a `bmmodel` have been specified and warns the user that only a fixed intercept will be estimated if no formula for one of the parameters was provided. Additionally, `check_formula` throws an error should formulas be provided that do not match a parameter of the called `bmmodel` unless they are part of a non-linear transformation. * You can now specify formulas for internally fixed parameters such as `mu` in all visual working memory models. This allows you to predict if there is response bias in the data. If a formula is not provided for `mu`, the model will assume that the mean of the response distribution is fixed to zero. * there is now an option `bmm.silent` that allows to suppress messages * the baseline activation `b` was removed from the `IMM` models, as this is internally fixed diff --git a/R/bmm.R b/R/bmm.R index ec6e49b7..fc017154 100644 --- a/R/bmm.R +++ b/R/bmm.R @@ -8,9 +8,9 @@ #' model to be fitted. #' @param data An object of class data.frame, containing data of all variables #' used in the model. The names of the variables must match the variable names -#' passed to the `bmmmodel` object for required argurments. +#' passed to the `bmmodel` object for required argurments. #' @param model A description of the model to be fitted. This is a call to a -#' `bmmmodel` such as `mixture3p()` function. Every model function has a +#' `bmmodel` such as `mixture3p()` function. Every model function has a #' number of required arguments which need to be specified within the function #' call. Call [supported_models()] to see the list of supported models and #' their required arguments diff --git a/R/bmmformula.R b/R/bmmformula.R index af23ff75..afd84fb1 100644 --- a/R/bmmformula.R +++ b/R/bmmformula.R @@ -1,7 +1,7 @@ -#' @title Create formula for predicting parameters of a `bmmmodel` +#' @title Create formula for predicting parameters of a `bmmodel` #' #' @description This function is used to specify the formulas predicting the -#' different parameters of a `bmmmodel`. +#' different parameters of a `bmmodel`. #' #' @aliases bmf #' @@ -54,7 +54,7 @@ #' You can also use the `bmf()` function as a shorthand for `bmmformula()`. #' #' -#' @param ... Formulas for predicting a `bmmmodel` parameter. Each formula for a +#' @param ... Formulas for predicting a `bmmodel` parameter. Each formula for a #' parameter should be specified as a separate argument, separated by commas #' @return A list of formulas for each parameters being predicted #' @export @@ -175,7 +175,7 @@ check_formula <- function(model, data, formula) { } #' @export -check_formula.bmmmodel <- function(model, data, formula) { +check_formula.bmmodel <- function(model, data, formula) { stopif(is_brmsformula(formula), "The provided formula is a brms formula. Please use the bmf() function. E.g.: bmmformula(kappa ~ 1, thetat ~ 1) or bmf(kappa ~ 1, thetat ~ 1)") @@ -216,10 +216,10 @@ check_formula.nontargets <- function(model, data, formula) { #' Called by [configure_model()] inside [bmm()] to convert the `bmmformula` into a #' `brmsformula` based on information in the model object. It will call the #' appropriate bmf2bf.\* methods based on the classes defined in the model_\* function. -#' @param model The model object defining one of the supported `bmmmodels`` +#' @param model The model object defining one of the supported `bmmodels`` #' @param formula The `bmmformula` that should be converted to a `brmsformula` #' @returns A `brmsformula` defining the response variables and the additional parameter -#' formulas for the specified `bmmmodel` +#' formulas for the specified `bmmodel` #' @keywords internal, developer #' @examples #' model <- mixture2p(resp_error = "error") @@ -235,9 +235,9 @@ bmf2bf <- function(model, formula) { UseMethod("bmf2bf") } -# default method for all bmmmodels with 1 response variable +# default method for all bmmodels with 1 response variable #' @export -bmf2bf.bmmmodel <- function(model, formula) { +bmf2bf.bmmodel <- function(model, formula) { # check if the model has only one response variable and extract if TRUE resp <- model$resp_vars constants <- model$fixed_parameters diff --git a/R/helpers-data.R b/R/helpers-data.R index c1d11fd0..d2f00476 100644 --- a/R/helpers-data.R +++ b/R/helpers-data.R @@ -35,7 +35,7 @@ check_data.default <- function(model, data, formula) { } #' @export -check_data.bmmmodel <- function(model, data, formula) { +check_data.bmmodel <- function(model, data, formula) { stopif(missing(data), "Data must be specified using the 'data' argument.") data <- try(as.data.frame(data), silent = TRUE) stopif(is_try_error(data), "Argument 'data' must be coercible to a data.frame.") diff --git a/R/helpers-model.R b/R/helpers-model.R index 5a9d4fa1..fef18269 100644 --- a/R/helpers-model.R +++ b/R/helpers-model.R @@ -105,9 +105,9 @@ check_model.default <- function(model, data = NULL, formula = NULL) { "Did you forget to provide the required arguments to the model function? See ?{fun_name} for details on properly specifying the model argument") } - stopif(!is_supported_bmmmodel(model), + stopif(!is_supported_bmmodel(model), "You provided an object of class `{class(model)}` to the model argument. - The model argument should be a `bmmmodel` function. + The model argument should be a `bmmodel` function. You can see the list of supported models by running `supported_models()` {supported_models()}") @@ -115,7 +115,7 @@ check_model.default <- function(model, data = NULL, formula = NULL) { } #' @export -check_model.bmmmodel <- function(model, data = NULL, formula = NULL) { +check_model.bmmodel <- function(model, data = NULL, formula = NULL) { model <- replace_regex_variables(model, data) model <- change_constants(model, formula) NextMethod("check_model") @@ -258,7 +258,7 @@ model_info <- function(model, components = 'all') { #' @export -model_info.bmmmodel <- function(model, components = 'all') { +model_info.bmmodel <- function(model, components = 'all') { pars <- model$parameters par_info <- "" if (length(pars) > 0) { @@ -330,7 +330,7 @@ get_model2 <- function(model) { #'Create a file with a template for adding a new model (for developers) #' #'@param model_name A string with the name of the model. The file will be named -#' `bmm_model_model_name.R` and all necessary functions will be created with +#' `model_model_name.R` and all necessary functions will be created with #' the appropriate names and structure. The file will be saved in the `R/` #' directory #'@param testing Logical; If TRUE, the function will return the file content but @@ -339,7 +339,7 @@ get_model2 <- function(model) { #' If TRUE the function will add a section for the custom family, placeholders #' for the stan_vars and corresponding empty .stan files in #' `inst/stan_chunks/`, that you can fill For an example, see the sdmSimple -#' model in `/R/bmm_model_sdmSimple.R`. If FALSE (default) the function will +#' model in `/R/model_sdmSimple.R`. If FALSE (default) the function will #' not add the custom family section nor stan files. #'@param stanvar_blocks A character vector with the names of the blocks that #' will be added to the custom family section. See [brms::stanvar()] for more @@ -382,7 +382,7 @@ use_model_template <- function(model_name, 'genquant','functions'), open_files = TRUE, testing = FALSE) { - file_name <- paste0('bmm_model_', model_name, '.R') + file_name <- paste0('model_', model_name, '.R') # check if model exists if (model_name %in% supported_models(print_call = FALSE)) { stop(paste0("Model ", model_name, " already exists")) @@ -395,7 +395,7 @@ use_model_template <- function(model_name, "#############################################################################!\n", "# MODELS ####\n", "#############################################################################!\n", - "# see file 'R/bmm_model_mixture3p.R' for an example\n\n") + "# see file 'R/model_mixture3p.R' for an example\n\n") check_data_header <- paste0( @@ -414,7 +414,7 @@ use_model_template <- function(model_name, "#############################################################################!\n", "# A bmf2bf.* function should be defined if the default method for consructing\n", "# the brmsformula from the bmmformula does not apply\n", - "# The shared method for all `bmmmodels` is defined in helpers-formula.R.\n", + "# The shared method for all `bmmodels` is defined in helpers-formula.R.\n", "# See ?bmf2bf for details.\n", "# (YOU CAN DELETE THIS SECTION IF YOUR MODEL USES A STANDARD FORMULA WITH 1 RESPONSE VARIABLE)\n\n") @@ -450,7 +450,7 @@ use_model_template <- function(model_name, " default_priors = list(par1 = list(), par2 = list()),\n", " void_mu = FALSE\n", " ),\n", - " class = c('bmmmodel', '<>')\n", + " class = c('bmmodel', '<>')\n", " )\n", " out$links[names(links)] <- links\n", " out\n", @@ -468,11 +468,11 @@ use_model_template <- function(model_name, "#' @param required_arg2 A description of the required argument\n", "#' @param links A list of links for the parameters.", "#' @param ... used internally for testing, ignore it\n", - "#' @return An object of class `bmmmodel`\n", + "#' @return An object of class `bmmodel`\n", "#' @export\n", "#' @examples\n", "#' \\dontrun{\n", - "#' # put a full example here (see 'R/bmm_model_mixture3p.R' for an example)\n", + "#' # put a full example here (see 'R/model_mixture3p.R' for an example)\n", "#' }\n", "<> <- function(resp_var1, required_arg1, required_arg2, links = NULL, ...) {\n", " stop_missing_args()\n", diff --git a/R/helpers-postprocess.R b/R/helpers-postprocess.R index 85a42b6b..90f2fdd9 100644 --- a/R/helpers-postprocess.R +++ b/R/helpers-postprocess.R @@ -22,7 +22,7 @@ postprocess_brm <- function(model, fit, ...) { } #' @export -postprocess_brm.bmmmodel <- function(model, fit, ...) { +postprocess_brm.bmmodel <- function(model, fit, ...) { dots <- list(...) class(fit) <- c('bmmfit','brmsfit') fit$version$bmm <- utils::packageVersion('bmm') diff --git a/R/helpers-prior.R b/R/helpers-prior.R index 85fef862..eaa29bfb 100644 --- a/R/helpers-prior.R +++ b/R/helpers-prior.R @@ -54,7 +54,7 @@ default_prior.bmmformula <- function(object, data, model, formula = object, ...) #' @title construct constant priors to fix fixed model parameters -#' @param model a `bmmmodel` object +#' @param model a `bmmodel` object #' @param formula a `brmsformula` object #' @param additional_pars a list of name=value pairs to fix additional #' parameters where the name is the parameter name and the value is the fixed @@ -97,7 +97,7 @@ fixed_pars_priors <- function(model, formula, additional_pars = list()) { } -#' Set default priors for a bmmmodel +#' Set default priors for a bmmodel #' #' This function #' allows you to specify default priors flexibly regardless of the formula the @@ -107,7 +107,7 @@ fixed_pars_priors <- function(model, formula, additional_pars = list()) { #' intercept, and priors on the effects of the predictors relative to the #' intercept. #' -#' @param model A `bmmmodel` object +#' @param model A `bmmodel` object #' @param formula A `brmsformula` object #' @param data A data.frame containing the data used in the model #' @noRd @@ -204,11 +204,11 @@ set_default_prior <- function(model, data, formula) { prior } -#' Generic S3 method for configuring the default prior for a bmmmodel +#' Generic S3 method for configuring the default prior for a bmmodel #' #' Called by bmm() to automatically construct the priors for a given #' model, data and formula, and combine it with the prior given by the user. The -#' first method executed is configure_prior.bmmmodel, which will build the prior +#' first method executed is configure_prior.bmmodel, which will build the prior #' based on information from the model object such as fixed_parameters, #' default_priors, etc. Thus it is important to define these values in the model #' object. The function will also recognize if the user has specified that some @@ -217,7 +217,7 @@ set_default_prior <- function(model, data, formula) { #' not based on information in the model object, can be defined in the #' configure_prior.* method for the model. See configure_prior.IMMfull for an #' example. -#' @param model A `bmmmodel` object +#' @param model A `bmmodel` object #' @param data A data.frame containing the data used in the model #' @param formula A `brmsformula` object returned from configure_model() #' @param user_prior A `brmsprior` object given by the user as an argument to @@ -235,7 +235,7 @@ configure_prior.default <- function(model, data, formula, user_prior, ...) { } #' @export -configure_prior.bmmmodel <- function(model, data, formula, user_prior, ...) { +configure_prior.bmmodel <- function(model, data, formula, user_prior, ...) { prior <- fixed_pars_priors(model, formula) default_prior <- set_default_prior(model, data, formula) prior <- combine_prior(default_prior, prior) diff --git a/R/bmm_model_IMM.R b/R/model_IMM.R similarity index 98% rename from R/bmm_model_IMM.R rename to R/model_IMM.R index 8859d152..f0fea518 100644 --- a/R/bmm_model_IMM.R +++ b/R/model_IMM.R @@ -50,7 +50,7 @@ # attributes regex = regex, regex_vars = c("nt_features"), - class = c("bmmmodel", "vwm", "nontargets", "IMMabc") + class = c("bmmodel", "vwm", "nontargets", "IMMabc") ) out$links[names(links)] <- links out @@ -105,7 +105,7 @@ # attributes regex = regex, regex_vars = c('nt_features', 'nt_distances'), - class = c("bmmmodel", "vwm", "nontargets", "IMMspatial", "IMMbsc") + class = c("bmmodel", "vwm", "nontargets", "IMMspatial", "IMMbsc") ) out$links[names(links)] <- links out @@ -162,7 +162,7 @@ # attributes regex = regex, regex_vars = c('nt_features', 'nt_distances'), - class = c("bmmmodel", "vwm", "nontargets", "IMMspatial", "IMMfull") + class = c("bmmodel", "vwm", "nontargets", "IMMspatial", "IMMfull") ) out$links[names(links)] <- links out @@ -208,8 +208,8 @@ #' @param links A list of links for the parameters. *Currently does not affect #' the model fits, but it will in the future.* #' @param ... used internally for testing, ignore it -#' @return An object of class `bmmmodel` -#' @keywords bmmmodel +#' @return An object of class `bmmodel` +#' @keywords bmmodel #' @examples #' \dontrun{ #' # load data @@ -267,7 +267,7 @@ IMMfull <- function(resp_error, nt_features, nt_distances, set_size, regex = FAL } #' @rdname IMM -#' @keywords bmmmodel +#' @keywords bmmodel #' @export IMMbsc <- function(resp_error, nt_features, nt_distances, set_size, regex = FALSE, links = NULL, ...) { @@ -283,7 +283,7 @@ IMMbsc <- function(resp_error, nt_features, nt_distances, set_size, regex = FALS } #' @rdname IMM -#' @keywords bmmmodel +#' @keywords bmmodel #' @export IMMabc <- function(resp_error, nt_features, set_size, regex = FALSE, links = NULL, ...) { diff --git a/R/bmm_model_mixture2p.R b/R/model_mixture2p.R similarity index 97% rename from R/bmm_model_mixture2p.R rename to R/model_mixture2p.R index 2bcbb6f4..018b32f9 100644 --- a/R/bmm_model_mixture2p.R +++ b/R/model_mixture2p.R @@ -42,7 +42,7 @@ ), void_mu = FALSE ), - class = c("bmmmodel", "vwm", "mixture2p") + class = c("bmmodel", "vwm", "mixture2p") ) out$links[names(links)] <- links out @@ -59,8 +59,8 @@ #' @param links A list of links for the parameters. *Currently does not affect #' the model fits, but it will in the future.* #' @param ... used internally for testing, ignore it -#' @return An object of class `bmmmodel` -#' @keywords bmmmodel +#' @return An object of class `bmmodel` +#' @keywords bmmodel #' @examples #' \dontrun{ #' # generate artificial data diff --git a/R/bmm_model_mixture3p.R b/R/model_mixture3p.R similarity index 98% rename from R/bmm_model_mixture3p.R rename to R/model_mixture3p.R index 961c884c..6d03d7d6 100644 --- a/R/bmm_model_mixture3p.R +++ b/R/model_mixture3p.R @@ -51,7 +51,7 @@ # attributes regex = regex, regex_vars = c('nt_features'), - class = c("bmmmodel", "vwm", "nontargets", "mixture3p") + class = c("bmmodel", "vwm", "nontargets", "mixture3p") ) out$links[names(links)] <- links out @@ -78,8 +78,8 @@ #' @param links A list of links for the parameters. *Currently does not affect #' the model fits, but it will in the future.* #' @param ... used internally for testing, ignore it -#' @return An object of class `bmmmodel` -#' @keywords bmmmodel +#' @return An object of class `bmmodel` +#' @keywords bmmodel #' @export #' @examples #' \dontrun{ diff --git a/R/bmm_model_sdmSimple.R b/R/model_sdmSimple.R similarity index 98% rename from R/bmm_model_sdmSimple.R rename to R/model_sdmSimple.R index a90fb879..ee8eaea3 100644 --- a/R/bmm_model_sdmSimple.R +++ b/R/model_sdmSimple.R @@ -37,7 +37,7 @@ ), void_mu = FALSE ), - class = c('bmmmodel', 'vwm', 'sdmSimple') + class = c('bmmodel', 'vwm', 'sdmSimple') ) out$links[names(links)] <- links out @@ -59,9 +59,9 @@ #' @param links A list of links for the parameters. *Currently does not affect #' the model fits, but it will in the future.* #' @param ... used internally for testing, ignore it -#' @return An object of class `bmmmodel` +#' @return An object of class `bmmodel` #' @export -#' @keywords bmmmodel +#' @keywords bmmodel #' @examples #' \dontrun{ #' # simulate data from the model diff --git a/R/restructure.R b/R/restructure.R index 22203776..51df77db 100644 --- a/R/restructure.R +++ b/R/restructure.R @@ -55,6 +55,12 @@ restructure.bmmfit <- function(x, ...) { x$bmm$model <- check_model(new_model, x$data, x$bmm$user_formula) } + if (restr_version < "0.4.8") { + cl <- class(x$bmm$model) + cl[1] <- "bmmodel" + class(x$bmm$model) <- cl + } + x$version$bmm_restructure <- current_version NextMethod('restructure') } @@ -78,7 +84,7 @@ add_links.bmmfit <- function(x) { } #' @export -add_links.bmmmodel <- function(x) { +add_links.bmmodel <- function(x) { model_name <- class(x)[length(class(x))] new_model <- get_model(model_name)() x$links <- new_model$links diff --git a/R/summary.R b/R/summary.R index f1fa02aa..669c4577 100644 --- a/R/summary.R +++ b/R/summary.R @@ -20,11 +20,11 @@ summary.bmmfit <- function(object, priors = FALSE, prob = 0.95, robust = FALSE, out <- rename_mu_smry(out, get_mu_pars(object)) # get the bmm specific information - bmmmodel <- object$bmm$model + bmmodel <- object$bmm$model bmmform <- object$bmm$user_formula out$formula <- bmmform - out$model <- bmmmodel + out$model <- bmmodel out$data <- object$data # assign bmmsummary class to handle the printing @@ -179,7 +179,7 @@ summarise_model <- function(model, ...) { # TODO: build this up #' @export -summarise_model.bmmmodel <- function(model, ...) { +summarise_model.bmmodel <- function(model, ...) { construct_model_call(model, ...) } diff --git a/R/utils.R b/R/utils.R index afde9118..1b6ea461 100644 --- a/R/utils.R +++ b/R/utils.R @@ -257,13 +257,13 @@ is_try_warning <- function(x) { inherits(x, "warning") } -is_bmmmodel <- function(x) { - inherits(x, "bmmmodel") +is_bmmodel <- function(x) { + inherits(x, "bmmodel") } -is_supported_bmmmodel <- function(x) { +is_supported_bmmodel <- function(x) { valid_models <- supported_models(print_call = FALSE) - is_bmmmodel(x) && inherits(x, valid_models) + is_bmmodel(x) && inherits(x, valid_models) } is_bmmfit <- function(x) { diff --git a/README.Rmd b/README.Rmd index c742f2f3..4e55644e 100644 --- a/README.Rmd +++ b/README.Rmd @@ -160,7 +160,7 @@ identify the model 3. the model that should be fit You can get more detailed information on the models implemented in bmm by -invoking the documentation of each model typing `?bmmmodel` into your console. +invoking the documentation of each model typing `?bmmodel` into your console. For example, calling the information on the full version of the Interference Measurement Model would look like this: diff --git a/README.md b/README.md index 4677f4fd..3be8b9df 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ function takes: 3. the model that should be fit You can get more detailed information on the models implemented in bmm -by invoking the documentation of each model typing `?bmmmodel` into your +by invoking the documentation of each model typing `?bmmodel` into your console. For example, calling the information on the full version of the Interference Measurement Model would look like this: diff --git a/_pkgdown.yml b/_pkgdown.yml index 126f8de3..f06852ff 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -45,7 +45,7 @@ reference: - title: "Specifying models" desc: "Functions for specifying which model to fit" - contents: - - has_keyword("bmmmodel") + - has_keyword("bmmodel") - title: "Distributions" desc: "Functions for special distributions" - contents: diff --git a/man/IMM.Rd b/man/IMM.Rd index 7a896f19..00641d80 100644 --- a/man/IMM.Rd +++ b/man/IMM.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bmm_model_IMM.R +% Please edit documentation in R/model_IMM.R \name{IMM} \alias{IMM} \alias{IMMfull} @@ -60,7 +60,7 @@ the model fits, but it will in the future.}} \item{...}{used internally for testing, ignore it} } \value{ -An object of class \code{bmmmodel} +An object of class \code{bmmodel} } \description{ Interference measurement model by Oberauer and Lin (2017). @@ -289,4 +289,4 @@ fit <- bmm(formula = ff, backend = 'cmdstanr') } } -\keyword{bmmmodel} +\keyword{bmmodel} diff --git a/man/SDM.Rd b/man/SDM.Rd index 6702dd5b..44a2fa35 100644 --- a/man/SDM.Rd +++ b/man/SDM.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bmm_model_sdmSimple.R +% Please edit documentation in R/model_sdmSimple.R \name{SDM} \alias{SDM} \alias{sdmSimple} @@ -19,7 +19,7 @@ the model fits, but it will in the future.}} \item{...}{used internally for testing, ignore it} } \value{ -An object of class \code{bmmmodel} +An object of class \code{bmmodel} } \description{ Signal Discrimination Model (SDM) by Oberauer (2023) @@ -104,4 +104,4 @@ lines(x, dsdm(x, mu=0, c=coef['c_Intercept'], kappa=coef['kappa_Intercept']), col='red') } } -\keyword{bmmmodel} +\keyword{bmmodel} diff --git a/man/bmf2bf.Rd b/man/bmf2bf.Rd index e05bbc48..4b87c537 100644 --- a/man/bmf2bf.Rd +++ b/man/bmf2bf.Rd @@ -7,13 +7,13 @@ bmf2bf(model, formula) } \arguments{ -\item{model}{The model object defining one of the supported `bmmmodels``} +\item{model}{The model object defining one of the supported `bmmodels``} \item{formula}{The \code{bmmformula} that should be converted to a \code{brmsformula}} } \value{ A \code{brmsformula} defining the response variables and the additional parameter -formulas for the specified \code{bmmmodel} +formulas for the specified \code{bmmodel} } \description{ Called by \code{\link[=configure_model]{configure_model()}} inside \code{\link[=bmm]{bmm()}} to convert the \code{bmmformula} into a diff --git a/man/bmm.Rd b/man/bmm.Rd index f6179d87..7c090de1 100644 --- a/man/bmm.Rd +++ b/man/bmm.Rd @@ -33,10 +33,10 @@ model to be fitted.} \item{data}{An object of class data.frame, containing data of all variables used in the model. The names of the variables must match the variable names -passed to the \code{bmmmodel} object for required argurments.} +passed to the \code{bmmodel} object for required argurments.} \item{model}{A description of the model to be fitted. This is a call to a -\code{bmmmodel} such as \code{mixture3p()} function. Every model function has a +\code{bmmodel} such as \code{mixture3p()} function. Every model function has a number of required arguments which need to be specified within the function call. Call \code{\link[=supported_models]{supported_models()}} to see the list of supported models and their required arguments} diff --git a/man/bmmformula.Rd b/man/bmmformula.Rd index 2e54e9c2..787bc1b2 100644 --- a/man/bmmformula.Rd +++ b/man/bmmformula.Rd @@ -3,14 +3,14 @@ \name{bmmformula} \alias{bmmformula} \alias{bmf} -\title{Create formula for predicting parameters of a \code{bmmmodel}} +\title{Create formula for predicting parameters of a \code{bmmodel}} \usage{ bmmformula(...) bmf(...) } \arguments{ -\item{...}{Formulas for predicting a \code{bmmmodel} parameter. Each formula for a +\item{...}{Formulas for predicting a \code{bmmodel} parameter. Each formula for a parameter should be specified as a separate argument, separated by commas} } \value{ @@ -18,7 +18,7 @@ A list of formulas for each parameters being predicted } \description{ This function is used to specify the formulas predicting the -different parameters of a \code{bmmmodel}. +different parameters of a \code{bmmodel}. } \section{General formula structure}{ The formula argument accepts formulas of the following syntax: diff --git a/man/configure_prior.Rd b/man/configure_prior.Rd index 1ddc6481..97d46cc1 100644 --- a/man/configure_prior.Rd +++ b/man/configure_prior.Rd @@ -2,12 +2,12 @@ % Please edit documentation in R/helpers-prior.R \name{configure_prior} \alias{configure_prior} -\title{Generic S3 method for configuring the default prior for a bmmmodel} +\title{Generic S3 method for configuring the default prior for a bmmodel} \usage{ configure_prior(model, data, formula, user_prior, ...) } \arguments{ -\item{model}{A \code{bmmmodel} object} +\item{model}{A \code{bmmodel} object} \item{data}{A data.frame containing the data used in the model} @@ -21,7 +21,7 @@ bmm()} \description{ Called by bmm() to automatically construct the priors for a given model, data and formula, and combine it with the prior given by the user. The -first method executed is configure_prior.bmmmodel, which will build the prior +first method executed is configure_prior.bmmodel, which will build the prior based on information from the model object such as fixed_parameters, default_priors, etc. Thus it is important to define these values in the model object. The function will also recognize if the user has specified that some diff --git a/man/default_prior.bmmformula.Rd b/man/default_prior.bmmformula.Rd index dba1c487..ee5edddf 100644 --- a/man/default_prior.bmmformula.Rd +++ b/man/default_prior.bmmformula.Rd @@ -11,10 +11,10 @@ \item{data}{An object of class data.frame, containing data of all variables used in the model. The names of the variables must match the variable names -passed to the \code{bmmmodel} object for required argurments.} +passed to the \code{bmmodel} object for required argurments.} \item{model}{A description of the model to be fitted. This is a call to a -\code{bmmmodel} such as \code{mixture3p()} function. Every model function has a +\code{bmmodel} such as \code{mixture3p()} function. Every model function has a number of required arguments which need to be specified within the function call. Call \code{\link[=supported_models]{supported_models()}} to see the list of supported models and their required arguments} diff --git a/man/mixture2p.Rd b/man/mixture2p.Rd index 55a56ffe..f1879837 100644 --- a/man/mixture2p.Rd +++ b/man/mixture2p.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bmm_model_mixture2p.R +% Please edit documentation in R/model_mixture2p.R \name{mixture2p} \alias{mixture2p} \title{Two-parameter mixture model by Zhang and Luck (2008).} @@ -18,7 +18,7 @@ the model fits, but it will in the future.}} \item{...}{used internally for testing, ignore it} } \value{ -An object of class \code{bmmmodel} +An object of class \code{bmmodel} } \description{ Two-parameter mixture model by Zhang and Luck (2008). @@ -90,4 +90,4 @@ fit <- bmm(formula = ff, backend = 'cmdstanr') } } -\keyword{bmmmodel} +\keyword{bmmodel} diff --git a/man/mixture3p.Rd b/man/mixture3p.Rd index 09f3d8af..6d3c478a 100644 --- a/man/mixture3p.Rd +++ b/man/mixture3p.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/bmm_model_mixture3p.R +% Please edit documentation in R/model_mixture3p.R \name{mixture3p} \alias{mixture3p} \title{Three-parameter mixture model by Bays et al (2009).} @@ -31,7 +31,7 @@ the model fits, but it will in the future.}} \item{...}{used internally for testing, ignore it} } \value{ -An object of class \code{bmmmodel} +An object of class \code{bmmodel} } \description{ Three-parameter mixture model by Bays et al (2009). @@ -134,4 +134,4 @@ fit <- bmm(formula = ff, backend = 'cmdstanr') } } -\keyword{bmmmodel} +\keyword{bmmodel} diff --git a/man/stancode.bmmformula.Rd b/man/stancode.bmmformula.Rd index 507ad452..fa720146 100644 --- a/man/stancode.bmmformula.Rd +++ b/man/stancode.bmmformula.Rd @@ -11,10 +11,10 @@ \item{data}{An object of class data.frame, containing data of all variables used in the model. The names of the variables must match the variable names -passed to the \code{bmmmodel} object for required argurments.} +passed to the \code{bmmodel} object for required argurments.} \item{model}{A description of the model to be fitted. This is a call to a -\code{bmmmodel} such as \code{mixture3p()} function. Every model function has a +\code{bmmodel} such as \code{mixture3p()} function. Every model function has a number of required arguments which need to be specified within the function call. Call \code{\link[=supported_models]{supported_models()}} to see the list of supported models and their required arguments} diff --git a/man/standata.bmmformula.Rd b/man/standata.bmmformula.Rd index 72354965..695eaad9 100644 --- a/man/standata.bmmformula.Rd +++ b/man/standata.bmmformula.Rd @@ -11,10 +11,10 @@ \item{data}{An object of class data.frame, containing data of all variables used in the model. The names of the variables must match the variable names -passed to the \code{bmmmodel} object for required argurments.} +passed to the \code{bmmodel} object for required argurments.} \item{model}{A description of the model to be fitted. This is a call to a -\code{bmmmodel} such as \code{mixture3p()} function. Every model function has a +\code{bmmodel} such as \code{mixture3p()} function. Every model function has a number of required arguments which need to be specified within the function call. Call \code{\link[=supported_models]{supported_models()}} to see the list of supported models and their required arguments} diff --git a/man/use_model_template.Rd b/man/use_model_template.Rd index cc8a9503..3fb42672 100644 --- a/man/use_model_template.Rd +++ b/man/use_model_template.Rd @@ -15,7 +15,7 @@ use_model_template( } \arguments{ \item{model_name}{A string with the name of the model. The file will be named -\code{bmm_model_model_name.R} and all necessary functions will be created with +\code{model_model_name.R} and all necessary functions will be created with the appropriate names and structure. The file will be saved in the \verb{R/} directory} @@ -23,7 +23,7 @@ directory} If TRUE the function will add a section for the custom family, placeholders for the stan_vars and corresponding empty .stan files in \verb{inst/stan_chunks/}, that you can fill For an example, see the sdmSimple -model in \verb{/R/bmm_model_sdmSimple.R}. If FALSE (default) the function will +model in \verb{/R/model_sdmSimple.R}. If FALSE (default) the function will not add the custom family section nor stan files.} \item{stanvar_blocks}{A character vector with the names of the blocks that diff --git a/tests/testthat/test-helpers-model.R b/tests/testthat/test-helpers-model.R index 0276384f..f872fda8 100644 --- a/tests/testthat/test-helpers-model.R +++ b/tests/testthat/test-helpers-model.R @@ -82,8 +82,8 @@ test_that("use_model_template() prevents duplicate models", { expect_error(use_model_template(model)) } - model_files <- list.files(path = "R/", pattern = "^bmm_model_.*\\.R$") - model_files_names <- gsub("^bmm_model_", "", model_files) + model_files <- list.files(path = "R/", pattern = "^model_.*\\.R$") + model_files_names <- gsub("^model_", "", model_files) model_files_names <- gsub("\\.R$", "", model_files_names) for (model in model_files_names) { expect_error(use_model_template(model)) diff --git a/vignettes/bmm_bmmformula.Rmd b/vignettes/bmm_bmmformula.Rmd index a69d2efb..576e13b5 100644 --- a/vignettes/bmm_bmmformula.Rmd +++ b/vignettes/bmm_bmmformula.Rmd @@ -48,11 +48,11 @@ The `bmmformula` syntax generally follows the same principles as the formula syn parameter ~ peffects + ( geffects | group) ``` -However, instead of predicting a `response` - as is typically done in `brms` - in `bmm` a `bmmformula` predicts a `parameter` from a `bmmmodel`[^1]. The `peffects` part specifies all effects that are assumed to be the same across observations. In typical vocabulary such effects are called 'population-level' or 'overall' effects. The `geffects` part specifies effects that are assumed to vary across grouping variables specified in `group`. Typically, these effects are called 'group-level' or 'varying' effects. +However, instead of predicting a `response` - as is typically done in `brms` - in `bmm` a `bmmformula` predicts a `parameter` from a `bmmodel`[^1]. The `peffects` part specifies all effects that are assumed to be the same across observations. In typical vocabulary such effects are called 'population-level' or 'overall' effects. The `geffects` part specifies effects that are assumed to vary across grouping variables specified in `group`. Typically, these effects are called 'group-level' or 'varying' effects. -[^1]: You can always find information on the parameters of a `bmmmodel` by calling the help for the model you want to fit: `?bmmmodel` +[^1]: You can always find information on the parameters of a `bmmodel` by calling the help for the model you want to fit: `?bmmodel` -As you will typically provide a `bmmformula` for each parameter of a `bmmmodel`, we recommend to set up the formula in a separate object before passing it to the `bmm()` function. There are two ways to set up formulas, both work equally easy and well: +As you will typically provide a `bmmformula` for each parameter of a `bmmodel`, we recommend to set up the formula in a separate object before passing it to the `bmm()` function. There are two ways to set up formulas, both work equally easy and well: 1. a single call to the function `bmmformula` or its short form `bmf`, separating formulas for different parameters by commas. 2. add a `bmmformula` for each parameter by using the `+` operator. @@ -73,7 +73,7 @@ my_formula <- bmf(thetat ~ 1 + set_size) + my_formula ``` -As noted above, `bmm` generally assumes that you pass a `bmmformula` for each parameter of a model. If you do not pass a `bmmformula` for one or more parameters, `bmm` will throw a warning and only estimate a fixed intercept for the parameters for which no `bmmformula` was provided. If you are unsure about the parameters of a model, call the help via `?bmmmodel`, replacing 'bmmmodel' with the name of the model (e.g. `?sdmSimple`). +As noted above, `bmm` generally assumes that you pass a `bmmformula` for each parameter of a model. If you do not pass a `bmmformula` for one or more parameters, `bmm` will throw a warning and only estimate a fixed intercept for the parameters for which no `bmmformula` was provided. If you are unsure about the parameters of a model, call the help via `?bmmodel`, replacing 'bmmodel' with the name of the model (e.g. `?sdmSimple`). As `bmmformula` syntax builds upon `brmsformula` syntax, you can use any functionality you might use in `brms` for specifying a `bmmformula`. One difference is, that you _do not_ have to explicitly specify if a formula is a non-linear formula, as `bmm` recognizes a formula as non-linear as soon as one of the left-hand side arguments of a formula is also used as a right-hand side argument in the whole formula. So the argumetn `nl` does not exist for `bmmformula`. Similarly, adding grouping statements around group-level effects to estimate them separately for different sub-groups in your design can be added. So for example, a more complicated `bmmformula` could look like this: @@ -98,7 +98,7 @@ This formula implements an exponential reduction in `thetat` from a `start_theta # Seperating response variables from model parameters -As the response is not provided to the `bmmformula`, in `bmm` the response variables, and also other variables relevant for a `bmmmodel`, are linked to the model when setting up the `bmmmodel` object. For example, when fitting the `mixture3p` model, you have to provide the names of the variables that reflect the response error (e.g., `y`), the location of the non-target features (e.g. `nt_col1`, ..., `nt_col4`), and the set-size (e.g., `ss`) in our data: +As the response is not provided to the `bmmformula`, in `bmm` the response variables, and also other variables relevant for a `bmmodel`, are linked to the model when setting up the `bmmodel` object. For example, when fitting the `mixture3p` model, you have to provide the names of the variables that reflect the response error (e.g., `y`), the location of the non-target features (e.g. `nt_col1`, ..., `nt_col4`), and the set-size (e.g., `ss`) in our data: ```r my_model <- mixture3p(resp_error = "y", @@ -106,7 +106,7 @@ my_model <- mixture3p(resp_error = "y", set_size = "ss") ``` -Internally, `bmm` will then link the response variables to the `bmmformula` given for the parameters of a `bmmmodel`. +Internally, `bmm` will then link the response variables to the `bmmformula` given for the parameters of a `bmmodel`. # Fixing parameters to constant values