@@ -135,3 +135,94 @@ make_deterministic_fit_fn <- function(ids, fit = NULL) {
135135 get_calls = function () env $ calls
136136 )
137137}
138+
139+ make_test_link_cmdstan_fit_fn <- function () {
140+ function (stan_data , variable_names , cmdstan , seed , model_fn = NULL ) {
141+ n_draws <- 4L
142+ draw_offsets <- c(- 0.03 , - 0.01 , 0.01 , 0.03 )
143+ delta_center <- if (is.numeric(stan_data $ hub_ref_cross ) && is.numeric(stan_data $ spoke_ref_cross )) {
144+ mean(as.double(stan_data $ hub_ref_cross ) - as.double(stan_data $ spoke_ref_cross ), na.rm = TRUE )
145+ } else {
146+ 0
147+ }
148+ if (! is.finite(delta_center )) {
149+ delta_center <- 0
150+ }
151+ hub_prior_signal <- mean(as.double(stan_data $ hub_prior_sd %|| % numeric ()), na.rm = TRUE )
152+ if (is.finite(hub_prior_signal )) {
153+ delta_center <- delta_center + (hub_prior_signal * 0.01 )
154+ }
155+
156+ build_theta_draws <- function (base_vals , prefix ) {
157+ base_vals <- as.double(base_vals %|| % numeric ())
158+ if (length(base_vals ) < 1L ) {
159+ return (NULL )
160+ }
161+ out <- vapply(
162+ seq_along(base_vals ),
163+ function (idx ) base_vals [[idx ]] + draw_offsets + ((idx - 1L ) * 0.005 ),
164+ numeric (n_draws )
165+ )
166+ colnames(out ) <- paste0(prefix , " [" , seq_along(base_vals ), " ]" )
167+ out
168+ }
169+
170+ draws <- matrix (nrow = n_draws , ncol = 0L )
171+ if (" delta" %in% variable_names ) {
172+ draws <- cbind(draws , delta = delta_center + draw_offsets )
173+ }
174+ if (" log_alpha" %in% variable_names ) {
175+ draws <- cbind(draws , log_alpha = c(- 0.04 , - 0.01 , 0.01 , 0.04 ))
176+ }
177+
178+ theta_hub_draws <- build_theta_draws(stan_data $ hub_ref , " theta_hub" )
179+ if (! is.null(theta_hub_draws ) &&
180+ (" theta_hub" %in% variable_names || any(grepl(" ^theta_hub\\ [" , variable_names )))) {
181+ keep <- if (" theta_hub" %in% variable_names ) {
182+ rep(TRUE , ncol(theta_hub_draws ))
183+ } else {
184+ colnames(theta_hub_draws ) %in% variable_names
185+ }
186+ draws <- cbind(draws , theta_hub_draws [, keep , drop = FALSE ])
187+ }
188+
189+ theta_spoke_draws <- build_theta_draws(stan_data $ spoke_ref , " theta_spoke" )
190+ if (! is.null(theta_spoke_draws ) &&
191+ (" theta_spoke" %in% variable_names || any(grepl(" ^theta_spoke\\ [" , variable_names )))) {
192+ keep <- if (" theta_spoke" %in% variable_names ) {
193+ rep(TRUE , ncol(theta_spoke_draws ))
194+ } else {
195+ colnames(theta_spoke_draws ) %in% variable_names
196+ }
197+ draws <- cbind(draws , theta_spoke_draws [, keep , drop = FALSE ])
198+ }
199+
200+ if (ncol(draws ) < 1L ) {
201+ draws <- matrix (delta_center + draw_offsets , ncol = 1L )
202+ colnames(draws ) <- " delta"
203+ }
204+
205+ list (
206+ fit = NULL ,
207+ draws_matrix = draws ,
208+ diagnostics = list (
209+ divergences = 0L ,
210+ max_rhat = 1.0 ,
211+ min_ess_bulk = 1000
212+ ),
213+ mcmc_config_used = list (
214+ chains = as.integer(cmdstan $ chains %|| % 4L ),
215+ parallel_chains = as.integer(cmdstan $ parallel_chains %|| % cmdstan $ chains %|| % 4L ),
216+ threads_per_chain = as.integer(cmdstan $ threads_per_chain %|| % 1L ),
217+ cmdstanr_version = " test"
218+ )
219+ )
220+ }
221+ }
222+
223+ test_link_btl_config <- function (x = list ()) {
224+ utils :: modifyList(
225+ list (cmdstan_fit_fn = make_test_link_cmdstan_fit_fn()),
226+ x %|| % list ()
227+ )
228+ }
0 commit comments