--- a +++ b/R/bind_moves.R @@ -0,0 +1,136 @@ + + +## This function creates a named list of movement functions taking a single +## argument 'param'; all the rest (e.g. likelihood, prior, posterior functions, +## config, etc) is enclosed in the functions. + +bind_moves <- function(moves = custom_moves(), config, data, + likelihoods, priors) { + + out <- custom_moves(moves) + + + ## Binding: + + ## Each function needs to go through binding separately, as custom functions + ## for likelihoods and priors often correspond to the same argument in + ## different functions. + + + ## remove move$mu if disabled + if (!any(config$move_mu)) { + out$mu <- NULL + } else { + out$mu <- bind_to_function(out$mu, + data = data, + config = config, + custom_ll = likelihoods$genetic, + custom_prior = priors$mu + ) + } + + + ## remove move$pi if disabled + if (!any(config$move_pi)) { + out$pi <- NULL + } else { + out$pi <- bind_to_function(out$pi, + data = data, + config = config, + custom_ll = likelihoods$reporting, + custom_prior = priors$pi + ) + } + + + ## remove move$eps if disabled + if (!any(config$move_eps)) { + out$eps <- NULL + } else { + out$eps <- bind_to_function(out$eps, + data = data, + config = config, + custom_ll = likelihoods$contact, + custom_prior = priors$eps + ) + } + + ## remove move$lambda if disabled + if (!any(config$move_lambda)) { + out$lambda <- NULL + } else { + out$lambda <- bind_to_function(out$lambda, + data = data, + config = config, + custom_ll = likelihoods$contact, + custom_prior = priors$lambda + ) + } + + + ## remove move$alpha if no ancestry can be moved + if (!any(config$move_alpha)) { + out$alpha <- NULL + } else { + out$alpha <- bind_to_function(out$alpha, + data = data, + list_custom_ll = likelihoods + ) + } + + + ## remove move$t_inf if disabled + if (!any(config$move_t_inf)) { + out$t_inf <- NULL + } else { + out$t_inf <- bind_to_function(out$t_inf, + data = data, + list_custom_ll = likelihoods + ) + } + + + ## remove swap if disabled + if (!any(config$move_swap_cases)) { + out$swap_cases <- NULL + } else { + out$swap_cases <- bind_to_function(out$swap_cases, + data = data, + list_custom_ll = likelihoods + ) + } + + + ## remove move$kappa if disabled + if (!any(config$move_kappa)) { + out$kappa <- NULL + } else { + out$kappa <- bind_to_function(out$kappa, + data = data, + config = config, + list_custom_ll = likelihoods + ) + } + + + ## perform binding for new unknown movements + known_moves <- names(custom_moves()) + new_moves <- !names(out) %in% known_moves + if (any(new_moves)) { + for (i in seq_along(out)) { + if (new_moves[i]) { + out[[i]] <- bind_to_function(out[[i]], + data = data, + config = config, + likelihoods = likelihoods, + priors = priors + ) + } + } + } + + ## the output is a list of movement functions with enclosed objects ## + return(out) + +} +