---
title: "Optional Bayesian Backend Installation"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Optional Bayesian Backend Installation}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

## Core installation

The package is independently useful without a Bayesian backend. Model
contracts, readiness audits, deterministic simulation, preparation,
specification, and prior predictive checks do not require `brms`, `rstan`,
`posterior`, `bayesplot`, or a compiler.

```{r core-installation, eval=FALSE}
install.packages(
  "gp3bayes",
  repos = NULL,
  type = "source"
)
```

## Optional fitting and validation dependencies

Full-MCMC fitting uses `brms` with either `rstan` or `cmdstanr`. Posterior
diagnostics and visualisation use `posterior` and `bayesplot`.

For the `rstan` route:

```{r rstan-packages, eval=FALSE}
install.packages(
  c(
    "brms",
    "rstan",
    "posterior",
    "bayesplot"
  )
)
```

For the `cmdstanr` route, install the common packages first:

```{r cmdstanr-common-packages, eval=FALSE}
install.packages(
  c(
    "brms",
    "posterior",
    "bayesplot"
  )
)
```

Then install CmdStanR from the Stan R-universe repository:

```{r cmdstanr-installation, eval=FALSE}
install.packages(
  "cmdstanr",
  repos = c(
    "https://stan-dev.r-universe.dev",
    getOption("repos")
  )
)

cmdstanr::check_cmdstan_toolchain()
cmdstanr::install_cmdstan()
```

The supported fitting interface remains restricted to `brms` and full MCMC.
`gp3bayes` allows `rstan` or `cmdstanr` as implementation backends but does not
expose variational inference, Pathfinder, Laplace approximation, arbitrary Stan
programs, arbitrary model families, or arbitrary backend arguments.

## Windows toolchain check

On Windows, source compilation requires the Rtools version compatible with the
installed R version. After installing Rtools, start a clean R session and run:

```{r windows-build-tools, eval=FALSE}
pkgbuild::has_build_tools(
  debug = TRUE
)
```

The result should be `TRUE`.

For `cmdstanr`, additionally run:

```{r cmdstanr-preflight, eval=FALSE}
cmdstanr::check_cmdstan_toolchain()
check_cmdstan_backend(strict = TRUE)
```

## Backend preflight

```{r backend-capabilities, eval=FALSE}
bayesian_backend_capabilities()
```

For `rstan`:

```{r rstan-preflight, eval=FALSE}
stopifnot(
  requireNamespace("brms", quietly = TRUE),
  requireNamespace("rstan", quietly = TRUE),
  requireNamespace("posterior", quietly = TRUE)
)
```

For `cmdstanr`:

```{r cmdstanr-namespace-preflight, eval=FALSE}
stopifnot(
  requireNamespace("brms", quietly = TRUE),
  requireNamespace("cmdstanr", quietly = TRUE),
  requireNamespace("posterior", quietly = TRUE)
)

check_cmdstan_backend(strict = TRUE)
```

## Minimal compilation smoke test

Compilation should be tested with a deliberately small synthetic model before a
large analysis. Short chains may produce low effective-sample-size warnings;
those warnings must not be interpreted as adequate posterior inference.

```{r compilation-smoke, eval=FALSE}
simulation <- simulate_hierarchical_binary_data(
  n_participants = 8,
  trials_per_participant = 6,
  n_items = 4,
  random_slope_sd = 0,
  seed = 7001
)

contract <- create_model_contract(
  family = "binary",
  outcome_col = "selected",
  participant_col = "participant_id",
  item_col = "item_id",
  trial_col = "trial_id",
  condition_col = "condition"
)

prepared <- prepare_hierarchical_binary_data(
  simulation$data,
  contract,
  condition_levels = c(
    "control",
    "treatment"
  )
)

specification <- specify_binary_model(
  prepared,
  baseline = 0.35
)

smoke_fit <- fit_binary_model_backend(
  specification,
  backend = "rstan",
  chains = 2,
  iter = 300,
  warmup = 150,
  cores = 2,
  seed = 7002,
  refresh = 0
)
```

A successful smoke fit confirms compilation and sampling execution only.
Production analyses require adequate iterations, sampling diagnostics,
posterior predictive checks, sensitivity assessment, and transparent
reporting.

## Clean-process package checks

After a Stan fit on Windows, run package checks and pkgdown builds in separate
clean R processes. This avoids accidental inheritance of model-compilation
flags from the interactive session.

```text
Rscript --vanilla -e "devtools::check()"
Rscript --vanilla -e "pkgdown::check_pkgdown(); pkgdown::build_site(preview = FALSE)"
```
