From ca6425c536b6f1cba6acb094cb8cc669dd8caa53 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:25:51 +0100 Subject: [PATCH 01/60] docs: update mixed MRF implementation plan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Blume-Capel variable support across all phases (A-G) - Add pseudolikelihood consistency note (mixedGM vs bgms verified) - Add PR and commit strategy (§16, 17 planned commits) - Fix test numbering: unit T1-T12, integration T13-T19, edge-case T20-T27, regression R1-R3 - Split §3.3 edge-selection table by PL mode - Fix §3.1/3.2 parameter label (threshold → main effect) - Add BC note to §2.1 conditional OMRF formula - Cross-reference phase checkpoints with T-numbers - Remove legacy workflow section (superseded by commit strategy) - Add reuse inventory entries for variable_helpers BC functions - Add BC items to risk register --- dev/mixedmrf/implementation_plan.md | 438 ++++++++++++++++++++-------- 1 file changed, 310 insertions(+), 128 deletions(-) diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 562a665c..8566118d 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -1,6 +1,8 @@ # Mixed MRF — Implementation Plan -**Date:** 2026-02-25 (updated 2026-03-04; review amendments applied 2026-03-04) +**Date:** 2026-02-25 (updated 2026-03-04; review amendments 2026-03-04; +Blume-Capel + PL consistency 2026-03-05; commit strategy 2026-03-05; +consistency review 2026-03-05) **Branch:** `ggm_mixed` (PR #78) **Goal:** Build a monolithic `MixedMRFModel` in C++ that supports both conditional and marginal pseudo-likelihood, with and without edge selection. @@ -52,6 +54,19 @@ The following issues identified in the plan reviews have been fixed in mixedGM: - **Simulation study** (`dev/simulation_study_plan.md`): 54-cell design covering p ∈ {5,10,15}, q ∈ {5,10,15}, n ∈ {250,500,1000}. +### Pseudolikelihood consistency (verified) + +The discrete pseudolikelihood formulas in mixedGM and the bgms OMRF have +been compared and **match exactly** for ordinal variables. The mixedGM code +was originally ported from bgms (`compute_denom_ordinal`); the same +category-threshold parameterization, rest-score definition, and log-sum-exp +stabilization are used. The marginal OMRF correctly handles the +$\Theta_{ss}$ self-interaction term. No reconciliation is needed. + +The mixedGM prototype does **not** implement Blume-Capel variables. The +Blume-Capel pseudolikelihood paths must therefore be adapted from the bgms +OMRF code directly rather than ported from mixedGM (see §1 and Phase B/C). + --- ## Table of contents @@ -71,23 +86,44 @@ The following issues identified in the plan reviews have been fixed in mixedGM: 13. [Testing strategy](#testing-strategy) 14. [Reuse inventory](#reuse-inventory) 15. [Risk register](#risk-register) +16. [PR and commit strategy](#pr-and-commit-strategy) --- ## 1. Model overview -The mixed MRF models the joint distribution of $p$ ordinal variables +The mixed MRF models the joint distribution of $p$ discrete variables $x$ ($x_s \in \{0, 1, \ldots, C_s\}$) and $q$ continuous variables $y$: $$\log f(x, y) \propto \sum_s \mu_{x,s}(x_s) + x^\top K_{xx}\, x - \tfrac{1}{2}(y - \mu_y)^\top K_{yy}\,(y - \mu_y) + 2\, x^\top K_{xy}\, y$$ +### Discrete variable types + +Each discrete variable $x_s$ is either **ordinal** or **Blume-Capel**, +matching the existing `OMRFModel` design: + +| Type | Main-effect parameterization | # free params | Reference level | +|------|------------------------------|:---:|---| +| Ordinal | $\mu_{x,s}(c) = \mu_{s,c}$, free thresholds ($c = 1,\ldots,C_s$; category 0 fixed at 0) | $C_s$ | Category 0 (fixed) | +| Blume-Capel | $\mu_{x,s}(c) = \alpha_s(c - \text{ref}_s) + \beta_s(c - \text{ref}_s)^2$ | 2 | User-specified $\text{ref}_s$ | + +For Blume-Capel variables the observations are centered at +$\text{ref}_s$ in the constructor (i.e., `x_.col(s) -= baseline_category_(s)`), +so all downstream code — rest-scores, sufficient statistics, likelihoods — +operates in a shifted coordinate system where the reference category +corresponds to zero, exactly as in `OMRFModel`. + +The $x^\top K_{xx}\, x$ term uses the (centered) observation values +for both variable types; only the main-effect structure $\mu_{x,s}(\cdot)$ +and the log-partition denominator differ. + Parameters: | Symbol | Storage | Dimension | Role | |--------|---------|-----------|------| -| $\mu_x$ | `mux_` | $p \times \max(C_s)$ | Ordinal thresholds (main effects) | +| $\mu_x$ | `mux_` | $p \times \max(C_s)$ | Ordinal thresholds **or** Blume-Capel ($\alpha, \beta$) | | $K_{xx}$ | `Kxx_` | $p \times p$ symmetric, zero diag | Discrete pairwise interactions | | $K_{yy}$ | `Kyy_` | $q \times q$ SPD | Continuous precision matrix | | $K_{xy}$ | `Kxy_` | $p \times q$ | Cross-type interactions | @@ -136,6 +172,11 @@ $$\log f(x_s = c \mid x_{-s}, y) = \mu_{x,s,c} + c \cdot r_s The rest-score $r_s$ depends on $K_{xx}$ and $K_{xy}$ but **not** on $K_{yy}$. +The formula above shows the ordinal form. For Blume-Capel variables the +main-effect term $\mu_{x,s,c}$ is replaced by +$\alpha_s(c - \text{ref}_s) + \beta_s(c - \text{ref}_s)^2$ and the +denominator uses `compute_denom_blume_capel()` (see §1 and Phase B.1). + **Conditional GGM** — $y \mid x$ is multivariate Gaussian: $$y \mid x \sim N\bigl(\mu_y + 2\,x\,K_{xy}\,K_{yy}^{-1},\; K_{yy}^{-1}\bigr)$$ @@ -192,7 +233,7 @@ the MH acceptance ratio for each group. | Step | Parameter | Components in acceptance ratio | |------|-----------|-------------------------------| -| 1 | $\mu_{x,s,c}$ (one threshold) | `cond_omrf(s)` + prior | +| 1 | $\mu_{x,s}$ (one main effect) | `cond_omrf(s)` + prior | | 2 | $\mu_{y,j}$ (one mean) | `cond_ggm()` + prior | | 3 | $K_{xx,ij}$ (one pair) | `cond_omrf(i) + cond_omrf(j)` + prior | | 4 | $K_{yy}$ (one element) | `cond_ggm()` + prior (Cholesky proposal) | @@ -202,7 +243,7 @@ the MH acceptance ratio for each group. | Step | Parameter | Components in acceptance ratio | |------|-----------|-------------------------------| -| 1 | $\mu_{x,s,c}$ | `marg_omrf(s)` + prior | +| 1 | $\mu_{x,s}$ | `marg_omrf(s)` + prior | | 2 | $\mu_{y,j}$ | `cond_ggm()` + $\sum_s$ `marg_omrf(s)` + prior | | 3 | $K_{xx,ij}$ | `marg_omrf(i) + marg_omrf(j)` + prior | | 4 | $K_{yy}$ | `cond_ggm()` + $\sum_s$ `marg_omrf(s)` + prior (Cholesky proposal) | @@ -216,13 +257,14 @@ expensive per iteration. ### 3.3 Edge selection (post-warmup) -Three independent edge-selection sweeps, same in both PL modes: +Three independent edge-selection sweeps per iteration. The acceptance +components differ by PL mode because $\Theta$ depends on $K_{yy}$: -| Edge type | Indicator | RJ proposal | Acceptance components | -|-----------|-----------|-------------|----------------------| -| Discrete-discrete | $G_{xx}$ | Toggle + spike-and-slab | `omrf(i) + omrf(j)` | -| Continuous-continuous | $G_{yy}$ | Cholesky-based toggle | `cond_ggm()` | -| Cross | $G_{xy}$ | Toggle + spike-and-slab | `omrf(i) + cond_ggm()` | +| Edge type | Indicator | RJ proposal | Conditional PL | Marginal PL | +|-----------|-----------|-------------|----------------|-------------| +| Discrete-discrete | $G_{xx}$ | Toggle + spike-and-slab | `cond_omrf(i) + cond_omrf(j)` | `marg_omrf(i) + marg_omrf(j)` | +| Continuous-continuous | $G_{yy}$ | Cholesky-based toggle | `cond_ggm()` | `cond_ggm()` + $\sum_s$ `marg_omrf(s)` | +| Cross | $G_{xy}$ | Toggle + spike-and-slab | `cond_omrf(i) + cond_ggm()` | `cond_ggm()` + $\sum_s$ `marg_omrf(s)` | --- @@ -286,6 +328,8 @@ public: const arma::imat& x, // n × p discrete (0-based categories) const arma::mat& y, // n × q continuous const arma::ivec& num_categories, // p-vector + const arma::uvec& is_ordinal_variable, // 1 = ordinal, 0 = Blume-Capel + const arma::ivec& baseline_category, // reference category per variable bool edge_selection, const std::string& pseudolikelihood, // "conditional" or "marginal" int seed @@ -324,16 +368,26 @@ public: private: // --- Data --- arma::imat x_; // n × p discrete observations + // Blume-Capel columns are centered at baseline_category_ + // in the constructor (same convention as OMRFModel). + arma::mat x_dbl_; // n × p double version of x_ (post-centering) arma::mat y_; // n × q continuous observations int n_, p_, q_; arma::ivec num_categories_; // p-vector int max_cats_; // max(num_categories) + arma::uvec is_ordinal_variable_; // 1 = ordinal, 0 = Blume-Capel + arma::ivec baseline_category_; // reference category per discrete variable + + // --- Sufficient statistics --- + arma::imat counts_per_category_; // (max_cats+1) × p category counts (ordinal vars only) + arma::imat blume_capel_stats_; // 2 × p linear and quadratic sums (BC vars only) // --- Parameters --- - arma::mat mux_; // p × max_cats thresholds - // mux_(s, c) is the threshold for category c+1 of variable s; - // category 0 is the reference level (threshold fixed at 0). - // In C++ loops always use index c-1 when accessing mux_ for category c. + arma::mat mux_; // p × max_cats thresholds / Blume-Capel coefficients + // Ordinal: mux_(s, c) = threshold for category c+1; + // category 0 is the reference (fixed at 0). + // Blume-Capel: mux_(s, 0) = linear α_s, + // mux_(s, 1) = quadratic β_s. arma::vec muy_; // q-vector continuous means arma::mat Kxx_; // p × p discrete interactions (diagonal always zero; // enforced by construction — not a free parameter) @@ -393,17 +447,41 @@ Implement `parameter_dimension`, `get/set_vectorized_parameters`, `get_edge_indicators`, `get_inclusion_probability`, `get_num_variables`, `get_num_pairwise`, `has_edge_selection`, `has_adaptive_metropolis`. +**Constructor must center Blume-Capel observations:** +```cpp +for (int s = 0; s < p_; ++s) { + if (!is_ordinal_variable_(s)) { + x_.col(s) -= baseline_category_(s); + } +} +x_dbl_ = arma::conv_to::from(x_); +``` +This mirrors `OMRFModel`'s constructor exactly and ensures that rest-scores, +sufficient statistics, and the conditional mean all use the same coordinate +system regardless of variable type. + +**Sufficient statistics** (computed in the constructor, identical to `OMRFModel`): +- `counts_per_category_`: for each ordinal variable, count observations per + category $c \in \{0, \ldots, C_s\}$. +- `blume_capel_stats_`: for each Blume-Capel variable, store + $\sum_i x_{is}$ (row 0, linear) and $\sum_i x_{is}^2$ (row 1, quadratic), + where $x$ is already centered. + **Parameter vectorization order (free parameters only):** -1. `mux_`: For each variable $s = 0,\ldots,p-1$, copy columns $0 \ldots C_s-1$ - of row $s$ (i.e., the thresholds for categories $1 \ldots C_s$; category 0 - is the fixed reference level). Each variable contributes $C_s$ entries; - the total count is $\sum_s C_s$. Variables with different $C_s$ produce - runs of different length — **do not use a fixed stride**. +1. `mux_`: For each variable $s = 0,\ldots,p-1$: + - If ordinal: copy columns $0 \ldots C_s-1$ ($C_s$ thresholds). + - If Blume-Capel: copy columns 0 and 1 ($\alpha_s, \beta_s$; always 2 entries). + Total count: $\sum_{s \in \text{ord}} C_s + 2 \cdot |\text{BC}|$. + Variables produce runs of different length — **do not use a fixed stride**. ``` idx = 0 for s in 0..p-1: - for c in 0..num_categories_[s]-1: - out[idx++] = mux_(s, c) // threshold for category c+1 + if is_ordinal_variable_[s]: + for c in 0..num_categories_[s]-1: + out[idx++] = mux_(s, c) + else: // Blume-Capel + out[idx++] = mux_(s, 0) // linear α + out[idx++] = mux_(s, 1) // quadratic β ``` 2. `Kxx_`: strictly upper-triangular entries (symmetry supplies the lower half). Count = $p(p-1)/2$. Diagonal entries are always zero and excluded. @@ -446,24 +524,45 @@ In `mixed_mrf_likelihoods.cpp`: #### `log_conditional_omrf(int s)` — per-variable discrete PL Computes $\log f(x_s \mid x_{-s}, y)$ summed over all $n$ observations. +The function **branches on `is_ordinal_variable_(s)`** to select the +appropriate main-effect structure and denominator. +**Rest-score (same for both variable types):** ``` -rest_score = x_[, -s] * Kxx_[-s, s] + 2 * y_ * Kxy_[s, ]^T - ^-- n×(p-1) * (p-1)×1 ^-- n×q * q×1 +rest_score = x_dbl_ * Kxx_.col(s) - x_dbl_.col(s) * Kxx_(s,s) + + 2 * y_ * Kxy_.row(s).t() = n-vector +``` +(`Kxx_(s,s) = 0` by construction, so the self-interaction subtraction is +a no-op for $K_{xx}$; it becomes relevant in the marginal case for $\Theta$.) +**Ordinal path:** +``` For each observation v: For c = 1..C_s: - eta[v,c] = mux_[s, c] + c * rest_score[v] + eta[v,c] = mux_(s, c-1) + c * rest_score[v] log_Z[v] = log(1 + sum_c exp(eta[v,c])) (log-sum-exp stabilized) - ll += mux_[s, x_[v,s]] + x_[v,s] * rest_score[v] - log_Z[v] - (only if x_[v,s] > 0 for the threshold part) + ll += mux_(s, x[v,s]-1) + x[v,s] * rest_score[v] - log_Z[v] + (only if x[v,s] > 0 for the threshold part) ``` +Use `compute_denom_ordinal()` from `variable_helpers.h`. -**Reuse opportunity:** The inner loop (compute log-partition for -one ordinal variable given a rest-score vector) is identical to -`OMRFModel::ordinal_log_pseudolikelihood_ratio()`. Extract or -duplicate the stabilized log-sum-exp computation. +**Blume-Capel path:** +``` +alpha = mux_(s, 0); beta = mux_(s, 1); ref = baseline_category_(s) +For each observation v: + For c = 0..C_s: + theta_c = alpha * (c - ref) + beta * (c - ref)^2 + eta[v,c] = theta_c + (c - ref) * rest_score[v] + log_Z[v] = log_sum_exp over c + ll += alpha * x[v,s] + beta * x[v,s]^2 + x[v,s] * rest_score[v] - log_Z[v] + (x already centered at ref) +``` +Use `compute_denom_blume_capel()` from `variable_helpers.h`. + +**Reuse opportunity:** Both denominator functions already exist in +`src/utils/variable_helpers.{h,cpp}` and are battle-tested in the OMRF. +The mixed MRF calls them directly—no duplication needed. #### `log_conditional_ggm()` — conditional GGM log-likelihood @@ -532,10 +631,22 @@ Each update function follows the pattern: 4. Accept/reject 5. Robbins-Monro update of proposal SD -#### `update_threshold(int s, int c)` — one threshold $\mu_{x,s,c}$ -- Propose: $\mu'_{x,s,c} \sim N(\mu_{x,s,c}, \sigma_{\mu_x,s,c})$ -- Acceptance: `log_conditional_omrf(s)` at proposed vs current + prior ratio -- Prior: Normal(0, $\sigma^2$) +#### `update_main_effect(int s, int c)` — one main-effect parameter + +- **Ordinal** ($c \in \{0,\ldots,C_s-1\}$): updates threshold $\mu_{s,c}$. + - Propose: $\mu'_{s,c} \sim N(\mu_{s,c}, \sigma)$ + - Acceptance: `log_conditional_omrf(s)` at proposed vs current + prior + - Prior: Beta-type (same as `OMRFModel`: $\alpha\,x - (\alpha+\beta)\log(1+e^x)$) +- **Blume-Capel** ($c \in \{0, 1\}$: linear, quadratic): + updates $\alpha_s$ or $\beta_s$. + - Propose: same Normal random-walk + - Acceptance: `log_conditional_omrf(s)` at proposed vs current + prior + - Prior: same Beta-type prior on each coefficient + +The function signature is the same for both types; `is_ordinal_variable_(s)` +selects which main-effect slot to perturb. Matches `OMRFModel`'s +`do_one_metropolis_step` loop which iterates over categories for ordinal +variables and over `{0, 1}` for Blume-Capel variables. #### `update_continuous_mean(int j)` — one mean $\mu_{y,j}$ - Propose: $\mu'_{y,j} \sim N(\mu_{y,j}, \sigma_{\mu_y,j})$ @@ -599,10 +710,16 @@ helpers in `mixed_mrf_cholesky.cpp`, ported from ```cpp void MixedMRFModel::do_one_metropolis_step(int iteration) { - // Step 1: Update all thresholds - for (int s = 0; s < p_; ++s) - for (int c = 0; c < num_categories_[s]; ++c) - update_threshold(s, c, iteration); + // Step 1: Update all main effects (ordinal thresholds or BC α/β) + for (int s = 0; s < p_; ++s) { + if (is_ordinal_variable_(s)) { + for (int c = 0; c < num_categories_[s]; ++c) + update_main_effect(s, c, iteration); + } else { + update_main_effect(s, 0, iteration); // linear α + update_main_effect(s, 1, iteration); // quadratic β + } + } // Step 2: Update all continuous means for (int j = 0; j < q_; ++j) @@ -632,13 +749,13 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { ### B.5 Testing checkpoint — conditional PL estimation -**Test 1: Likelihood agreement** +**Test 1 (T1, T2, T10): Likelihood agreement** - Generate data from `mixed_gibbs_generate()` in R - Compute `log_conditional_omrf(s)` and `log_conditional_ggm()` in both R (prototype) and C++ at the same parameter values - Assert agreement to machine precision -**Test 2: Recovery (estimation only, no edge selection)** +**Test 2 (T13): Recovery (estimation only, no edge selection)** - Generate data from known parameters (p=3 ordinal, q=2 continuous) - Run mixed sampler with conditional PL, no edge selection - Check posterior means recover true parameters (correlation > 0.9) @@ -659,14 +776,26 @@ excluded explicitly: Theta_ = Kxx_ + 2 * Kxy_ * Kyy_inv_ * Kxy_^T (cached; see C.3) // n-vector of rest-scores: -rest_score = x_dbl * Theta_.col(s) // include all n obs, all p vars - - x_dbl.col(s) * Theta_(s, s) // subtract self-interaction +rest_score = x_dbl_ * Theta_.col(s) // include all n obs, all p vars + - x_dbl_.col(s) * Theta_(s, s) // subtract self-interaction + 2.0 * arma::dot(Kxy_.row(s), Kyy_inv_ * muy_) // scalar bias, same for all obs ``` This matches `rcpp_log_pl_marginal_omrf` in `mixedGM/src/log_likelihoods.cpp` -exactly. The inner log-partition loop is then identical to `log_conditional_omrf`. +exactly for ordinal variables. + +**Blume-Capel variables in marginal PL:** The rest-score is the same as +above. The difference is in the numerator and denominator: +- The numerator adds $\alpha_s x_{vs} + \beta_s x_{vs}^2 + + x_{vs} \cdot r_{vs}$ (using centered observations) plus + $\Theta_{ss} \cdot x_{vs}^2$ for the self-interaction. +- The denominator uses `compute_denom_blume_capel()` with `col_offset(c)` + set to $\theta_c + (c - \text{ref})^2 \cdot \Theta_{ss}$ instead of + $\mu_{s,c} + c^2 \cdot \Theta_{ss}$. + +This parallels the ordinal-vs-Blume-Capel branching already present in +`OMRFModel::log_pseudoposterior_with_state()`. ### C.2 Modify `update_continuous_mean(int j)` for marginal mode @@ -713,15 +842,15 @@ in the two modes. ### C.5 Testing checkpoint — marginal PL estimation -**Test 3: Marginal likelihood agreement** +**Test 3 (T3, T11): Marginal likelihood agreement** - Same data as Test 1, compute `log_marginal_omrf(s)` in R and C++ - Assert agreement -**Test 4: Recovery (marginal PL)** +**Test 4 (T14): Recovery (marginal PL)** - Same setup as Test 2 but `pseudolikelihood = "marginal"` - Check posterior means recover true parameters -**Test 5: Conditional vs marginal agreement** +**Test 5 (T16): Conditional vs marginal agreement** - Run both modes on the same data, compare posterior means - They should be similar (not identical — different approximations) @@ -812,9 +941,25 @@ void MixedMRFModel::update_edge_indicators() { } ``` -### D.5 Testing checkpoint — edge selection +### D.5 Blume-Capel and edge selection + +Edge selection for $K_{xx}$ pairs is **type-agnostic**: the acceptance +ratio evaluates `log_conditional_omrf(i) + log_conditional_omrf(j)` +(or marginal equivalents), and those functions already branch on +`is_ordinal_variable_`. No additional edge-selection logic is needed +for Blume-Capel variables—this mirrors the `OMRFModel` design where +`update_edge_indicator_parameter_pair()` calls +`compute_log_likelihood_ratio_for_variable()`, which dispatches to the +correct denominator internally. + +Cross-edges $G_{xy}$ involving a Blume-Capel discrete variable also +require no special handling: the rest-score uses the centered +observations, and the likelihood function dispatches to the Blume-Capel +denominator as needed. + +### D.6 Testing checkpoint — edge selection -**Test 6: Structure recovery** +**Test 6 (T15): Structure recovery** - Generate data from a sparse mixed graph (some edges zero) - Run with edge selection, check posterior inclusion probabilities recover the true structure (true edges have high PIP, false edges low) @@ -840,18 +985,26 @@ The user interface uses **Option A** (decided): a single data frame plus a `variable_type` argument: ```r -bgm(data, variable_type = c("o", "o", "c", ...)) +bgm(data, variable_type = c("ordinal", "blume-capel", "continuous", ...)) ``` - `data`: an $n \times (p+q)$ data frame or matrix with all variables. -- `variable_type`: character vector, length $p+q$; values `"o"` (ordinal) - or `"c"` (continuous). Column order must match `variable_type`. - -`bgm()` splits `data` into the integer matrix `x` (ordinal columns) and -numeric matrix `y` (continuous columns), then dispatches to -`sample_mixed_mrf_cpp()`. The split indices must be stored in the output -object so that `coef`, `predict`, and `simulate` methods can reconstruct -the original column order. +- `variable_type`: character vector, length $p+q$; values `"ordinal"`, + `"blume-capel"`, or `"continuous"`. Column order must match + `variable_type`. Abbreviated forms (`"o"`, `"b"`, `"c"`) may be + supported via `match.arg` for convenience. +- `baseline_category`: integer vector, length $p+q$ (entries for + continuous and ordinal columns are ignored). Specifies the reference + category for each Blume-Capel variable. Passed through to + `sample_mixed_mrf_cpp()`. + +`bgm()` splits `data` into the integer matrix `x` (ordinal + Blume-Capel +columns) and numeric matrix `y` (continuous columns), constructs +`is_ordinal_variable` and `baseline_category` vectors for the discrete +subset, then dispatches to `sample_mixed_mrf_cpp()`. The split indices +and variable-type metadata must be stored in the output object so that +`coef`, `predict`, and `simulate` methods can reconstruct the original +column order. **Missing data** is an explicit non-goal for this PR. `has_missing_data()` returns `false` and `impute_missing()` is an empty @@ -868,7 +1021,7 @@ The output structure needs to accommodate: ### E.4 Testing checkpoint — end-to-end -**Test 7: `bgm()` with mixed data** +**Test 7 (T19): `bgm()` with mixed data** - Call `bgm()` with `variable_type` containing both ordinal and continuous - Check output structure matches expected format - Verify S3 methods work (`print`, `summary`, `coef`, `predict`) @@ -924,10 +1077,17 @@ Extend `mrf_simulation.cpp` to support mixed data generation via block Gibbs sampling, matching `mixed_gibbs_generate()`: 1. Sample $x_s \mid x_{-s}, y$: categorical from log-sum-exp stabilized - probabilities + probabilities. + - For ordinal variables use `compute_probs_ordinal()`. + - For Blume-Capel variables use `compute_probs_blume_capel()` + (both already available in `variable_helpers.h`). 2. Sample $y \mid x$: multivariate Normal with conditional mean $\mu_y + 2\,x\,K_{xy}\,K_{yy}^{-1}$ and covariance $K_{yy}^{-1}$ +Note: the mixedGM Gibbs generator handles ordinal variables only. +The Blume-Capel Gibbs sampling step must be added using the existing +bgms probability helpers. + ### G.2 Mixed MRF prediction Extend `mrf_prediction.cpp` for posterior predictive checks on mixed data. @@ -987,34 +1147,40 @@ Cross-reference the existing mixedGM test files for each scenario: | T1 | `log_conditional_omrf(s)` | Compare C++ vs R prototype at known parameters | | T2 | `log_conditional_ggm()` | Compare C++ vs R prototype at known parameters | | T3 | `log_marginal_omrf(s)` | Compare C++ vs R prototype at known parameters | -| T4 | `parameter_dimension()` | Check count for known p, q, num_categories | -| T5 | Vectorization round-trip | `set(get(params)) == params` | +| T4 | `parameter_dimension()` | Check count for known p, q, num_categories (ordinal + BC mix) | +| T5 | Vectorization round-trip | `set(get(params)) == params` (include BC variables) | | T6 | Cholesky permutation | Verify permute is involution, PD maintained | | T7 | Analytic Gaussian check | Set $K_{xy}=0$ so `log_conditional_ggm()` reduces to a standard MVN and compare against closed form | | T8 | Fixture replay | Load deterministic R fixtures and ensure C++ reproduces saved log-likelihood components bit-for-bit | | T9 | Cache freshness | After each parameter tweak, recompute `conditional_mean_` and (if needed) `Theta_` from scratch and compare with cached copies | +| T10 | BC conditional OMRF | Compare `log_conditional_omrf(s)` for a Blume-Capel variable against OMRF-only model at same parameters | +| T11 | BC marginal OMRF | Same as T10 but for `log_marginal_omrf(s)` | +| T12 | BC observation centering | Verify that centered observations + `compute_denom_blume_capel` produce the same result as the standalone `OMRFModel` | ### Integration tests (sampling correctness) | Test | What | How | |------|------|-----| -| T7 | Conditional PL recovery | Generate → estimate → check cor > 0.9 | -| T8 | Marginal PL recovery | Generate → estimate → check cor > 0.9 | -| T9 | Edge selection recovery | Sparse graph → check PIP > 0.5 for true, < 0.5 for false | -| T10 | Cond vs marginal agreement | Both modes → posterior means close | -| T11 | Reproducibility | Same seed → identical output | -| T12 | Multi-chain | 4 chains → R-hat < 1.1 | +| T13 | Conditional PL recovery | Generate → estimate → check cor > 0.9 | +| T14 | Marginal PL recovery | Generate → estimate → check cor > 0.9 | +| T15 | Edge selection recovery | Sparse graph → check PIP > 0.5 for true, < 0.5 for false | +| T16 | Cond vs marginal agreement | Both modes → posterior means close | +| T17 | Reproducibility | Same seed → identical output | +| T18 | Multi-chain | 4 chains → R-hat < 1.1 | +| T19 | End-to-end `bgm()` | Call `bgm()` with mixed data; check output structure and S3 methods | ### Edge-case & stress tests | Test | What | How | |------|------|-----| -| T13 | Kyy PD invariant | Run 1k iterations with aggressive proposals; Cholesky of $K_{yy}$ must succeed after every accepted move | -| T14 | Cache consistency under RJ | After edge births/deaths, recompute caches and assert equality (debug build) | -| T15 | Degenerate $p=1$ | Single ordinal variable, ensure sampler runs and recovers $K_{xy}, K_{yy}$ | -| T16 | Degenerate $q=1$ | Scalar precision, ensure Cholesky permutation code handles the trivial case | -| T17 | Binary-only ordinal | All $C_s=1$, verify conditional PL matches logistic rest-scores | -| T18 | Gibbs generator sanity | Compare empirical moments from `mixed_gibbs_generate()` against theoretical targets before using it for fixtures | +| T20 | Kyy PD invariant | Run 1k iterations with aggressive proposals; Cholesky of $K_{yy}$ must succeed after every accepted move | +| T21 | Cache consistency under RJ | After edge births/deaths, recompute caches and assert equality (debug build) | +| T22 | Degenerate $p=1$ | Single ordinal variable, ensure sampler runs and recovers $K_{xy}, K_{yy}$ | +| T23 | Degenerate $q=1$ | Scalar precision, ensure Cholesky permutation code handles the trivial case | +| T24 | Binary-only ordinal | All $C_s=1$, verify conditional PL matches logistic rest-scores | +| T25 | Gibbs generator sanity | Compare empirical moments from `mixed_gibbs_generate()` against theoretical targets before using it for fixtures | +| T26 | Mixed ordinal + BC | Graph with both ordinal and Blume-Capel discrete variables; verify recovery | +| T27 | BC-only discrete | All discrete variables are Blume-Capel; verify recovery and edge selection | ### Regression tests @@ -1054,6 +1220,10 @@ Cross-reference the existing mixedGM test files for each scenario: |-----------|--------|------------| | Cholesky update/downdate | `src/models/ggm/cholupdate.h` | Direct include | | Log-sum-exp stabilization | `OMRFModel::compute_logZ_*` | Adapt pattern | +| Ordinal denominator | `src/utils/variable_helpers.{h,cpp}` `compute_denom_ordinal` | Direct call | +| Blume-Capel denominator | `src/utils/variable_helpers.{h,cpp}` `compute_denom_blume_capel` | Direct call | +| Ordinal probabilities | `src/utils/variable_helpers.{h,cpp}` `compute_probs_ordinal` | Direct call (Gibbs generator) | +| Blume-Capel probabilities | `src/utils/variable_helpers.{h,cpp}` `compute_probs_blume_capel` | Direct call (Gibbs generator) | | Robbins-Monro adaptation | `OMRFModel::robbins_monro_*` | Direct reuse | | Edge prior (SBM) | `src/priors/sbm_edge_prior.h` | Direct reuse | | WarmupSchedule | `src/mcmc/execution/warmup_schedule.h` | Direct reuse | @@ -1079,60 +1249,72 @@ Cross-reference the existing mixedGM test files for each scenario: | Factor 2 convention mismatch | Wrong posteriors | Document consistently; unit-test against R prototype | | PD violation during Kyy proposals | Crash | Cholesky-based proposals guarantee PD by construction | | Large parameter space mixing | Poor ESS | Per-parameter Robbins-Monro; future: block updates or HMC | +| Blume-Capel not in prototype | No mixedGM reference for BC paths | Adapt from bgms `OMRFModel`; validated via OMRF-vs-mixed comparison tests (T10-T12) | --- -## Updated implementation workflow - -Given that mixedGM provides tested C++ likelihood implementations and -validated R MH updates, the recommended workflow is: - -### Phase 1: Port likelihoods (1-2 days) - -1. Create `src/models/mixed/` directory -2. Copy `mixedGM/src/log_likelihoods.cpp` → `mixed_mrf_likelihoods.cpp` -3. Remove Rcpp exports, convert to internal functions -4. Adapt to bgms coding conventions (SafeRNG, etc.) -5. **Validation**: Call mixedGM Rcpp functions from R and compare to bgms - -### Phase 2: Skeleton class (1-2 days) - -1. Create `mixed_mrf_model.h` following GGMModel pattern -2. Implement all BaseModel pure virtuals (stubs where needed) -3. Implement `parameter_dimension()`, `get/set_vectorized_parameters()` -4. Implement `clone()`, `set_seed()`, lifecycle hooks -5. **Validation**: Class compiles, vectorization round-trip passes - -### Phase 3: MH updates (2-3 days) - -1. Port `cond_omrf_update_*` functions from R to C++ -2. Port `cond_ggm_update_*` functions from R to C++ -3. Port `cond_update_cross_associations` from R to C++ -4. Implement `do_one_metropolis_step()` calling all update functions -5. **Validation**: Compare posterior samples vs mixedGM on same data - -### Phase 4: Edge selection (2-3 days) - -1. Port `*_update_*_indicator_pair` functions from R to C++ -2. Implement `update_edge_indicators()` calling all three edge types -3. Implement `initialize_graph()`, `prepare_iteration()` -4. **Validation**: Run edge selection tests from mixedGM - -### Phase 5: R interface (1-2 days) - -1. Create `sample_mixed.cpp` following `sample_ggm.cpp` pattern -2. Extend `bgm()` to detect and dispatch mixed data -3. Extend `build_output.R` for mixed model output structure -4. **Validation**: End-to-end `bgm()` call works - -### Phase 6: Gibbs generator (1 day) - -1. Port `mixed_gibbs_generate_cpp()` to `mrf_simulation.cpp` -2. Extend `simulate.bgms()` for mixed models -3. **Validation**: Generated data matches mixedGM output - -### Total estimated effort: 8-13 days - -The C++ likelihood implementations (Phase B-C in the original plan) are -largely complete via mixedGM, reducing the remaining work to porting MH -updates and wiring into the bgms infrastructure. +## PR and commit strategy + +**Branch:** `ggm_mixed` (currently at the same commit as `main`). +**PR:** A single draft PR opened early for visibility, merged only after +all phases are complete and CI passes. + +### Principles + +1. **Every commit compiles and passes `R CMD check`.** No broken + intermediate states on the branch. If a phase needs multiple + sub-steps before the package can build, stage them locally and + squash into one commit that restores a green state. +2. **One commit per logical unit of work.** A "logical unit" is the + smallest change that is self-contained and reviewable on its own: + a new file, a completed function group, a test suite, a wiring + change. Avoid mixing unrelated concerns in one commit. +3. **Tests accompany the code they exercise.** When a commit adds + a function, the corresponding unit test belongs in the same commit + (or the immediately following one if fixtures must be generated + first). Do not defer all tests to the end. +4. **Commit messages use the project's conventional-commit prefixes:** + `feat:`, `fix:`, `test:`, `refactor:`, `docs:`, `dev:`. + Keep the first line under 72 characters; add a body paragraph only + when the "why" is non-obvious. + +### Planned commits + +The table below maps implementation phases to commits. Each row is one +`git commit`. Rows may be split further if a phase turns out large, or +merged if two steps are trivially small — the guiding rule is always +principle 1 (green build) and principle 2 (one logical concern). + +| # | Prefix | Message | Phase | What ships | +|:-:|--------|---------|:-----:|------------| +| 1 | `feat` | `feat: add MixedMRFModel skeleton and data structures` | A | Header, constructor (incl. BC centering), trivial overrides, vectorization, sufficient statistics. Stubs for sampling functions (`do_one_metropolis_step` etc.) so the class compiles. No sampling yet. | +| 2 | `test` | `test: add mixed MRF skeleton tests` | A | `test-mixed-mrf-skeleton.R`: compile check, `parameter_dimension`, vectorization round-trip (ordinal + BC mix). | +| 3 | `feat` | `feat: add mixed MRF likelihood functions` | B.1 | `mixed_mrf_likelihoods.cpp`: `log_conditional_omrf`, `log_conditional_ggm`, cache helpers. Ordinal + Blume-Capel paths. | +| 4 | `test` | `test: add mixed MRF likelihood unit tests` | B.1 | `test-mixed-mrf-likelihood.R`: T1–T3 (compare C++ vs R fixtures), T7 (analytic Gaussian), T10–T12 (BC-specific). | +| 5 | `feat` | `feat: add conditional PL Metropolis updates` | B.3–B.4 | `mixed_mrf_metropolis.cpp`: all 5 MH update functions + `do_one_metropolis_step` (conditional mode). Cholesky helpers in `mixed_mrf_cholesky.cpp`. | +| 6 | `test` | `test: add conditional PL recovery test` | B.5 | `test-mixed-mrf-sampling.R`: T13 (conditional PL parameter recovery, estimation only). | +| 7 | `feat` | `feat: add marginal PL mode and Theta caching` | C | `log_marginal_omrf`, Theta cache, marginal-mode branches in MH updates. | +| 8 | `test` | `test: add marginal PL recovery and comparison tests` | C.5 | T14 (marginal PL recovery), T16 (cond vs marginal agreement). | +| 9 | `feat` | `feat: add mixed MRF edge selection` | D | `mixed_mrf_edge_selection.cpp`: RJ sweeps for Kxx, Kyy, Kxy. `update_edge_indicators`, `initialize_graph`, `prepare_iteration`. | +| 10 | `test` | `test: add mixed MRF edge selection tests` | D | T15 (structure recovery), T26–T27 (BC edge cases). | +| 11 | `feat` | `feat: add Rcpp interface and bgm() mixed dispatch` | E | `sample_mixed.cpp`, `bgm.R` changes, `validate_data.R`/`validate_model.R` extensions, `build_output.R` mixed output. | +| 12 | `test` | `test: add end-to-end bgm() mixed model tests` | E | T19 (end-to-end), S3 method checks (`print`, `summary`, `coef`). | +| 13 | `feat` | `feat: add mixed MRF warmup and adaptation` | F | `init_metropolis_adaptation`, `tune_proposal_sd`, warmup schedule integration. | +| 14 | `feat` | `feat: add mixed MRF simulation and prediction` | G | Gibbs generator in `mrf_simulation.cpp`, `simulate.bgms` + `predict.bgms` extensions. | +| 15 | `test` | `test: add simulation and prediction tests` | G | T25 (Gibbs sanity), generator tests, prediction tests. | +| 16 | `test` | `test: verify GGM, OMRF, bgmCompare regression suite` | — | Run full existing test suite, fix any regressions. R1–R3. | +| 17 | `docs` | `docs: add mixed MRF documentation and pkgdown entries` | — | Roxygen for new exported functions, `_pkgdown.yml` entries, NEWS.md entry. | + +### Conventions for this branch + +- **Do not rebase onto main mid-flight.** Merge main into `ggm_mixed` + only if a conflict blocks progress, and note it in the PR + description. +- **Fixture files** (`.rds`, `.rda`) generated for tests go in + `dev/fixtures/mixed/` and are committed alongside the test that + consumes them. +- **Plan updates** during implementation get their own `docs:` commit + (e.g., `docs: update mixed MRF plan — Phase B lessons`). +- **Squash-merge** is used when merging the PR into `main`. The full + per-phase history remains on the branch for reference, but `main` + gets a single clean merge commit. From 6454d3721a3b475236573cf376332fbec30106c2 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:46:05 +0100 Subject: [PATCH 02/60] feat: add MixedMRFModel skeleton and data structures --- dev/mixedmrf/implementation_plan.md | 34 +- src/models/mixed/mixed_mrf_model.cpp | 446 +++++++++++++++++++++++++++ src/models/mixed/mixed_mrf_model.h | 342 ++++++++++++++++++++ 3 files changed, 805 insertions(+), 17 deletions(-) create mode 100644 src/models/mixed/mixed_mrf_model.cpp create mode 100644 src/models/mixed/mixed_mrf_model.h diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 8566118d..eb57f2e9 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -110,7 +110,7 @@ matching the existing `OMRFModel` design: | Blume-Capel | $\mu_{x,s}(c) = \alpha_s(c - \text{ref}_s) + \beta_s(c - \text{ref}_s)^2$ | 2 | User-specified $\text{ref}_s$ | For Blume-Capel variables the observations are centered at -$\text{ref}_s$ in the constructor (i.e., `x_.col(s) -= baseline_category_(s)`), +$\text{ref}_s$ in the constructor (i.e., `discrete_observations_.col(s) -= baseline_category_(s)`), so all downstream code — rest-scores, sufficient statistics, likelihoods — operates in a shifted coordinate system where the reference category corresponds to zero, exactly as in `OMRFModel`. @@ -325,8 +325,8 @@ class MixedMRFModel : public BaseModel { public: // Construction MixedMRFModel( - const arma::imat& x, // n × p discrete (0-based categories) - const arma::mat& y, // n × q continuous + const arma::imat& discrete_observations, // n × p discrete (0-based categories) + const arma::mat& continuous_observations, // n × q continuous const arma::ivec& num_categories, // p-vector const arma::uvec& is_ordinal_variable, // 1 = ordinal, 0 = Blume-Capel const arma::ivec& baseline_category, // reference category per variable @@ -367,11 +367,11 @@ public: private: // --- Data --- - arma::imat x_; // n × p discrete observations - // Blume-Capel columns are centered at baseline_category_ - // in the constructor (same convention as OMRFModel). - arma::mat x_dbl_; // n × p double version of x_ (post-centering) - arma::mat y_; // n × q continuous observations + arma::imat discrete_observations_; // n × p discrete observations + // Blume-Capel columns centered at baseline_category_ + // in the constructor (same convention as OMRFModel). + arma::mat discrete_observations_dbl_; // n × p double version (post-centering) + arma::mat continuous_observations_; // n × q continuous observations int n_, p_, q_; arma::ivec num_categories_; // p-vector int max_cats_; // max(num_categories) @@ -451,10 +451,10 @@ Implement `parameter_dimension`, `get/set_vectorized_parameters`, ```cpp for (int s = 0; s < p_; ++s) { if (!is_ordinal_variable_(s)) { - x_.col(s) -= baseline_category_(s); + discrete_observations_.col(s) -= baseline_category_(s); } } -x_dbl_ = arma::conv_to::from(x_); +discrete_observations_dbl_ = arma::conv_to::from(discrete_observations_); ``` This mirrors `OMRFModel`'s constructor exactly and ensures that rest-scores, sufficient statistics, and the conditional mean all use the same coordinate @@ -529,8 +529,8 @@ appropriate main-effect structure and denominator. **Rest-score (same for both variable types):** ``` -rest_score = x_dbl_ * Kxx_.col(s) - x_dbl_.col(s) * Kxx_(s,s) - + 2 * y_ * Kxy_.row(s).t() +rest_score = discrete_observations_dbl_ * Kxx_.col(s) - discrete_observations_dbl_.col(s) * Kxx_(s,s) + + 2 * continuous_observations_ * Kxy_.row(s).t() = n-vector ``` (`Kxx_(s,s) = 0` by construction, so the self-interaction subtraction is @@ -570,8 +570,8 @@ Computes $\log f(y \mid x)$ using cached `Kyy_inv_`, `Kyy_log_det_`, and `conditional_mean_`. ``` -conditional_mean_ = 1*muy_^T + 2 * x_ * Kxy_ * Kyy_inv_ -D = y_ - conditional_mean_ +conditional_mean_ = 1*muy_^T + 2 * discrete_observations_ * Kxy_ * Kyy_inv_ +D = continuous_observations_ - conditional_mean_ quad_sum = sum((D * Kyy_) .* D) // trace of Kyy * D^T * D ll = n/2 * (-q * log(2*pi) + Kyy_log_det_) - quad_sum / 2 ``` @@ -582,7 +582,7 @@ but with a non-zero, observation-dependent conditional mean. ### B.2 Implement cache maintenance #### `recompute_conditional_mean()` -Recompute `conditional_mean_ = 1*muy^T + 2 * x_ * Kxy_ * Kyy_inv_`. +Recompute `conditional_mean_ = 1*muy^T + 2 * discrete_observations_ * Kxy_ * Kyy_inv_`. Called after any change to `muy_`, `Kxy_`, or `Kyy_`. #### `recompute_Kyy_decomposition()` @@ -776,8 +776,8 @@ excluded explicitly: Theta_ = Kxx_ + 2 * Kxy_ * Kyy_inv_ * Kxy_^T (cached; see C.3) // n-vector of rest-scores: -rest_score = x_dbl_ * Theta_.col(s) // include all n obs, all p vars - - x_dbl_.col(s) * Theta_(s, s) // subtract self-interaction +rest_score = discrete_observations_dbl_ * Theta_.col(s) // include all n obs, all p vars + - discrete_observations_dbl_.col(s) * Theta_(s, s) // subtract self-interaction + 2.0 * arma::dot(Kxy_.row(s), Kyy_inv_ * muy_) // scalar bias, same for all obs ``` diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp new file mode 100644 index 00000000..71002763 --- /dev/null +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -0,0 +1,446 @@ +#include +#include "models/mixed/mixed_mrf_model.h" +#include "rng/rng_utils.h" +#include "mcmc/execution/warmup_schedule.h" + + +// ============================================================================= +// Constructor +// ============================================================================= + +MixedMRFModel::MixedMRFModel( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + bool edge_selection, + const std::string& pseudolikelihood, + double main_alpha, + double main_beta, + double pairwise_scale, + int seed +) : + n_(discrete_observations.n_rows), + p_(discrete_observations.n_cols), + q_(continuous_observations.n_cols), + discrete_observations_(discrete_observations), + continuous_observations_(continuous_observations), + num_categories_(num_categories), + is_ordinal_variable_(is_ordinal_variable), + baseline_category_(baseline_category), + edge_indicators_(initial_edge_indicators), + inclusion_probability_(inclusion_probability), + edge_selection_(edge_selection), + edge_selection_active_(false), + main_alpha_(main_alpha), + main_beta_(main_beta), + pairwise_scale_(pairwise_scale), + use_marginal_pl_(pseudolikelihood == "marginal"), + rng_(seed) +{ + // Dimension counts + num_main_ = count_num_main_effects(); + num_pairwise_xx_ = (p_ * (p_ - 1)) / 2; + num_pairwise_yy_ = (q_ * (q_ - 1)) / 2; + num_cross_ = p_ * q_; + + max_cats_ = num_categories_.max(); + + // Center Blume-Capel observations at baseline category so that all + // downstream code operates in a shifted coordinate system where the + // reference corresponds to zero (same convention as OMRFModel). + for(size_t s = 0; s < p_; ++s) { + if(!is_ordinal_variable_(s)) { + discrete_observations_.col(s) -= baseline_category_(s); + } + } + discrete_observations_dbl_ = arma::conv_to::from(discrete_observations_); + + // Compute sufficient statistics + compute_sufficient_statistics(); + + // Initialize parameters to zero + mux_ = arma::zeros(p_, max_cats_); + muy_ = arma::zeros(q_); + Kxx_ = arma::zeros(p_, p_); + Kyy_ = arma::eye(q_, q_); + Kxy_ = arma::zeros(p_, q_); + + // Initialize proposal SDs + prop_sd_mux_ = arma::ones(p_, max_cats_); + prop_sd_muy_ = arma::ones(q_); + prop_sd_Kxx_ = arma::ones(p_, p_); + prop_sd_Kyy_ = arma::ones(q_, q_); + prop_sd_Kxy_ = arma::ones(p_, q_); + + // Initialize Kyy caches (Kyy starts as identity) + Kyy_chol_ = arma::eye(q_, q_); + Kyy_inv_ = arma::eye(q_, q_); + Kyy_log_det_ = 0.0; + + // Initialize conditional mean: μ_y' + 2 x Kxy Kyy_inv + // With Kxy = 0 and Kyy = I, this is just 1 * μ_y' = 0. + conditional_mean_ = arma::zeros(n_, q_); + + // Initialize Theta (marginal PL only): Kxx + 2 Kxy Kyy_inv Kxy' + // With Kxy = 0, Theta = Kxx = 0. + if(use_marginal_pl_) { + Theta_ = arma::zeros(p_, p_); + } + + // Initialize edge-order permutation vectors + edge_order_xx_ = arma::regspace(0, num_pairwise_xx_ - 1); + edge_order_yy_ = arma::regspace(0, num_pairwise_yy_ - 1); + edge_order_xy_ = arma::regspace(0, num_cross_ - 1); +} + + +// ============================================================================= +// Copy constructor +// ============================================================================= + +MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) + : BaseModel(other), + n_(other.n_), + p_(other.p_), + q_(other.q_), + num_main_(other.num_main_), + num_pairwise_xx_(other.num_pairwise_xx_), + num_pairwise_yy_(other.num_pairwise_yy_), + num_cross_(other.num_cross_), + discrete_observations_(other.discrete_observations_), + discrete_observations_dbl_(other.discrete_observations_dbl_), + continuous_observations_(other.continuous_observations_), + num_categories_(other.num_categories_), + max_cats_(other.max_cats_), + is_ordinal_variable_(other.is_ordinal_variable_), + baseline_category_(other.baseline_category_), + counts_per_category_(other.counts_per_category_), + blume_capel_stats_(other.blume_capel_stats_), + mux_(other.mux_), + muy_(other.muy_), + Kxx_(other.Kxx_), + Kyy_(other.Kyy_), + Kxy_(other.Kxy_), + edge_indicators_(other.edge_indicators_), + inclusion_probability_(other.inclusion_probability_), + edge_selection_(other.edge_selection_), + edge_selection_active_(other.edge_selection_active_), + main_alpha_(other.main_alpha_), + main_beta_(other.main_beta_), + pairwise_scale_(other.pairwise_scale_), + prop_sd_mux_(other.prop_sd_mux_), + prop_sd_muy_(other.prop_sd_muy_), + prop_sd_Kxx_(other.prop_sd_Kxx_), + prop_sd_Kyy_(other.prop_sd_Kyy_), + prop_sd_Kxy_(other.prop_sd_Kxy_), + Kyy_inv_(other.Kyy_inv_), + Kyy_chol_(other.Kyy_chol_), + Kyy_log_det_(other.Kyy_log_det_), + Theta_(other.Theta_), + conditional_mean_(other.conditional_mean_), + use_marginal_pl_(other.use_marginal_pl_), + rng_(other.rng_), + edge_order_xx_(other.edge_order_xx_), + edge_order_yy_(other.edge_order_yy_), + edge_order_xy_(other.edge_order_xy_) +{ +} + + +// ============================================================================= +// Sufficient statistics +// ============================================================================= + +void MixedMRFModel::compute_sufficient_statistics() { + // Category counts for ordinal variables + counts_per_category_ = arma::zeros(max_cats_ + 1, p_); + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(size_t i = 0; i < n_; ++i) { + int cat = discrete_observations_(i, s); + if(cat >= 0 && cat <= num_categories_(s)) { + counts_per_category_(cat, s)++; + } + } + } + } + + // Blume-Capel statistics (linear and quadratic sums of centered obs) + blume_capel_stats_ = arma::zeros(2, p_); + for(size_t s = 0; s < p_; ++s) { + if(!is_ordinal_variable_(s)) { + for(size_t i = 0; i < n_; ++i) { + int val = discrete_observations_(i, s); // already centered + blume_capel_stats_(0, s) += val; + blume_capel_stats_(1, s) += val * val; + } + } + } +} + + +size_t MixedMRFModel::count_num_main_effects() const { + size_t count = 0; + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + count += num_categories_(s); + } else { + count += 2; // linear α and quadratic β + } + } + return count; +} + + +// ============================================================================= +// Cache maintenance +// ============================================================================= + +void MixedMRFModel::recompute_conditional_mean() { + // conditional_mean_ = 1*μ_y' + 2 * discrete_obs * Kxy * Kyy_inv + conditional_mean_ = arma::repmat(muy_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * Kxy_ * Kyy_inv_; +} + +void MixedMRFModel::recompute_Kyy_decomposition() { + Kyy_chol_ = arma::chol(Kyy_); // upper Cholesky + Kyy_inv_ = arma::inv_sympd(Kyy_); + Kyy_log_det_ = 2.0 * arma::sum(arma::log(Kyy_chol_.diag())); +} + +void MixedMRFModel::recompute_Theta() { + // Θ = Kxx + 2 Kxy Kyy_inv Kxy' + Theta_ = Kxx_ + 2.0 * Kxy_ * Kyy_inv_ * Kxy_.t(); +} + + +// ============================================================================= +// Parameter vectorization +// ============================================================================= + +// Vectorization order (free parameters): +// 1. mux_: per-variable (ordinal: C_s thresholds; BC: 2 coefficients) +// 2. Kxx_: upper-triangular, row-major — p(p-1)/2 +// 3. muy_: all q means +// 4. Kyy_: upper-triangle including diagonal — q(q+1)/2 +// 5. Kxy_: all p*q entries, row-major + +size_t MixedMRFModel::parameter_dimension() const { + if(!edge_selection_active_) { + return full_parameter_dimension(); + } + // Count active parameters only + size_t dim = num_main_ + q_; // mux + muy always active + + // Active Kxx edges + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(gxx(i, j)) dim++; + } + } + + // Kyy diagonal always active; off-diagonal gated by edge indicators + dim += q_; // diagonal + for(size_t i = 0; i < q_ - 1; ++i) { + for(size_t j = i + 1; j < q_; ++j) { + if(gyy(i, j)) dim++; + } + } + + // Active Kxy edges + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(gxy(i, j)) dim++; + } + } + + return dim; +} + +size_t MixedMRFModel::full_parameter_dimension() const { + // mux + Kxx upper-tri + muy + Kyy upper-tri-with-diag + Kxy full + return num_main_ + num_pairwise_xx_ + q_ + + (q_ * (q_ + 1)) / 2 + num_cross_; +} + +arma::vec MixedMRFModel::get_vectorized_parameters() const { + arma::vec out(full_parameter_dimension(), arma::fill::zeros); + size_t idx = 0; + + // 1. mux_ + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) { + out(idx++) = mux_(s, c); + } + } else { + out(idx++) = mux_(s, 0); // linear α + out(idx++) = mux_(s, 1); // quadratic β + } + } + + // 2. Kxx_ upper-triangular + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + out(idx++) = Kxx_(i, j); + } + } + + // 3. muy_ + for(size_t j = 0; j < q_; ++j) { + out(idx++) = muy_(j); + } + + // 4. Kyy_ upper-triangle including diagonal + for(size_t i = 0; i < q_; ++i) { + for(size_t j = i; j < q_; ++j) { + out(idx++) = Kyy_(i, j); + } + } + + // 5. Kxy_ row-major + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + out(idx++) = Kxy_(i, j); + } + } + + return out; +} + +arma::vec MixedMRFModel::get_full_vectorized_parameters() const { + return get_vectorized_parameters(); +} + +void MixedMRFModel::set_vectorized_parameters(const arma::vec& params) { + size_t idx = 0; + + // 1. mux_ + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) { + mux_(s, c) = params(idx++); + } + } else { + mux_(s, 0) = params(idx++); + mux_(s, 1) = params(idx++); + } + } + + // 2. Kxx_ upper-triangular (mirror to lower) + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + Kxx_(i, j) = params(idx); + Kxx_(j, i) = params(idx); + idx++; + } + } + + // 3. muy_ + for(size_t j = 0; j < q_; ++j) { + muy_(j) = params(idx++); + } + + // 4. Kyy_ upper-triangle including diagonal (mirror off-diag) + for(size_t i = 0; i < q_; ++i) { + for(size_t j = i; j < q_; ++j) { + Kyy_(i, j) = params(idx); + if(i != j) Kyy_(j, i) = params(idx); + idx++; + } + } + + // 5. Kxy_ row-major + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + Kxy_(i, j) = params(idx++); + } + } + + // Refresh all caches + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + if(use_marginal_pl_) { + recompute_Theta(); + } +} + +arma::ivec MixedMRFModel::get_vectorized_indicator_parameters() { + size_t total = num_pairwise_xx_ + num_pairwise_yy_ + num_cross_; + arma::ivec out(total); + size_t idx = 0; + + // 1. Upper-triangle of Gxx + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + out(idx++) = gxx(i, j); + } + } + + // 2. Upper-triangle of Gyy + for(size_t i = 0; i < q_ - 1; ++i) { + for(size_t j = i + 1; j < q_; ++j) { + out(idx++) = gyy(i, j); + } + } + + // 3. Full Gxy block row-major + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + out(idx++) = gxy(i, j); + } + } + + return out; +} + + +// ============================================================================= +// Infrastructure +// ============================================================================= + +void MixedMRFModel::set_seed(int seed) { + rng_ = SafeRNG(seed); +} + +std::unique_ptr MixedMRFModel::clone() const { + return std::make_unique(*this); +} + + +// ============================================================================= +// Stubs (to be implemented in later phases) +// ============================================================================= + +void MixedMRFModel::do_one_metropolis_step(int /*iteration*/) { + // Phase B/C: MH updates for all parameter groups +} + +void MixedMRFModel::update_edge_indicators() { + // Phase D: reversible-jump edge birth/death moves +} + +void MixedMRFModel::initialize_graph() { + // Phase D: random graph initialization for edge selection + // For now, start with all edges included (matching initial_edge_indicators) +} + +void MixedMRFModel::prepare_iteration() { + // Shuffle edge-update order to avoid order bias. + // Always called, even when edge selection is off, to keep RNG consistent. + edge_order_xx_ = arma_randperm(rng_, num_pairwise_xx_); + edge_order_yy_ = arma_randperm(rng_, num_pairwise_yy_); + edge_order_xy_ = arma_randperm(rng_, num_cross_); +} + +void MixedMRFModel::init_metropolis_adaptation(const WarmupSchedule& /*schedule*/) { + // Phase F: initialize Robbins-Monro controllers +} + +void MixedMRFModel::tune_proposal_sd(int /*iteration*/, const WarmupSchedule& /*schedule*/) { + // Phase F: Robbins-Monro proposal-SD tuning +} diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h new file mode 100644 index 00000000..b26910d6 --- /dev/null +++ b/src/models/mixed/mixed_mrf_model.h @@ -0,0 +1,342 @@ +#pragma once + +#include +#include "models/base_model.h" +#include "rng/rng_utils.h" + +/** + * MixedMRFModel - Mixed Markov Random Field Model + * + * Joint model for p discrete (ordinal or Blume-Capel) variables x and + * q continuous variables y. The joint density is: + * + * log f(x, y) ∝ Σ_s μ_{x,s}(x_s) + x' Kxx x + * - ½ (y - μ_y)' Kyy (y - μ_y) + 2 x' Kxy y + * + * Supports both conditional and marginal pseudo-likelihood, with and + * without edge selection via spike-and-slab priors. + * + * Discrete variables are either ordinal (free category thresholds, category + * 0 as reference) or Blume-Capel (linear α + quadratic β, user-specified + * reference). Blume-Capel observations are centered at their baseline + * category in the constructor, matching the OMRFModel convention. + * + * Inherits from BaseModel for compatibility with the generic MCMC framework + * (ChainRunner, MetropolisSampler, WarmupSchedule). + */ +class MixedMRFModel : public BaseModel { +public: + + // ========================================================================= + // Construction + // ========================================================================= + + /** + * Construct from raw observations. + * + * @param discrete_observations Integer matrix of discrete observations (n × p, 0-based) + * @param continuous_observations Continuous observations (n × q) + * @param num_categories Number of categories per discrete variable (p-vector) + * @param is_ordinal_variable 1 = ordinal, 0 = Blume-Capel (p-vector) + * @param baseline_category Reference category per discrete variable (p-vector) + * @param inclusion_probability Prior inclusion probabilities ((p+q) × (p+q)) + * @param initial_edge_indicators Initial edge inclusion matrix ((p+q) × (p+q)) + * @param edge_selection Enable edge selection (spike-and-slab) + * @param pseudolikelihood "conditional" or "marginal" + * @param main_alpha Beta prior hyperparameter α for main effects + * @param main_beta Beta prior hyperparameter β for main effects + * @param pairwise_scale Scale parameter of Cauchy prior on interactions + * @param seed RNG seed for reproducibility + */ + MixedMRFModel( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + bool edge_selection, + const std::string& pseudolikelihood, + double main_alpha = 1.0, + double main_beta = 1.0, + double pairwise_scale = 2.5, + int seed = 1 + ); + + /** Copy constructor for cloning (required for parallel chains). */ + MixedMRFModel(const MixedMRFModel& other); + + // ========================================================================= + // Capability queries + // ========================================================================= + + /** @return false (MixedMRFModel is Metropolis-only, no gradient). */ + bool has_gradient() const override { return false; } + /** @return true (supports adaptive Metropolis via Robbins-Monro). */ + bool has_adaptive_metropolis() const override { return true; } + /** @return true when edge selection is enabled. */ + bool has_edge_selection() const override { return edge_selection_; } + /** @return false (missing data not yet supported). */ + bool has_missing_data() const override { return false; } + + // ========================================================================= + // Core sampling methods + // ========================================================================= + + /** + * Perform one full Metropolis sweep over all parameter groups. + * @param iteration Current iteration (for Robbins-Monro adaptation) + */ + void do_one_metropolis_step(int iteration = -1) override; + + /** + * Initialize Metropolis adaptation controllers for proposal-SD tuning. + * Called before warmup begins. + */ + void init_metropolis_adaptation(const WarmupSchedule& schedule) override; + + /** + * Tune proposal SDs via Robbins-Monro (Stage 3b). + * Called every iteration; checks schedule internally. + */ + void tune_proposal_sd(int iteration, const WarmupSchedule& schedule) override; + + /** + * Shuffle edge update order at the start of each iteration. + * Advances the RNG state consistently even when edge selection is off. + */ + void prepare_iteration() override; + + // ========================================================================= + // Edge selection + // ========================================================================= + + /** Perform one sweep of reversible-jump edge birth/death moves. */ + void update_edge_indicators() override; + + /** Initialize a random graph structure for starting edge selection. */ + void initialize_graph() override; + + /** + * Enable or disable edge-selection proposals. + * @param active true to enable edge birth/death moves + */ + void set_edge_selection_active(bool active) override { + edge_selection_active_ = active; + } + + // ========================================================================= + // Parameter vectorization + // ========================================================================= + + /** + * Dimensionality of the active parameter space. + * When edge selection is active, excludes parameters for inactive edges. + */ + size_t parameter_dimension() const override; + + /** + * Full parameter dimension (all parameters, regardless of edge state). + * Used for fixed-size sample storage. + */ + size_t full_parameter_dimension() const override; + + /** Get active parameters as a flat vector. */ + arma::vec get_vectorized_parameters() const override; + + /** Get all parameters as a flat vector (inactive edges are 0). */ + arma::vec get_full_vectorized_parameters() const override; + + /** Set parameters from a flat vector. */ + void set_vectorized_parameters(const arma::vec& params) override; + + /** Get vectorized edge indicators (Gxx upper-tri, Gyy upper-tri, Gxy full). */ + arma::ivec get_vectorized_indicator_parameters() override; + + // ========================================================================= + // Infrastructure + // ========================================================================= + + /** Set random seed for reproducibility. */ + void set_seed(int seed) override; + + /** Clone the model for parallel execution. */ + std::unique_ptr clone() const override; + + /** @return Reference to the model's random number generator. */ + SafeRNG& get_rng() override { return rng_; } + + /** @return Current edge-indicator matrix ((p+q) × (p+q)). */ + const arma::imat& get_edge_indicators() const override { + return edge_indicators_; + } + + /** @return Mutable reference to the prior inclusion-probability matrix. */ + arma::mat& get_inclusion_probability() override { + return inclusion_probability_; + } + + /** @return Total number of variables (p + q). */ + int get_num_variables() const override { + return static_cast(p_ + q_); + } + + /** + * Number of unique off-diagonal pairs in the (p+q) × (p+q) indicator + * matrix: p(p-1)/2 + q(q-1)/2 + p*q. + */ + int get_num_pairwise() const override { + return static_cast(num_pairwise_xx_ + num_pairwise_yy_ + num_cross_); + } + + // ========================================================================= + // Missing data (not yet supported) + // ========================================================================= + + /** No-op: missing data not supported in this PR. */ + void impute_missing() override {} + +private: + + // ========================================================================= + // Counts and dimensions + // ========================================================================= + + size_t n_; // Number of observations + size_t p_; // Number of discrete variables + size_t q_; // Number of continuous variables + size_t num_main_; // Total main-effect params (Σ C_s for ord + 2 per BC) + size_t num_pairwise_xx_; // p(p-1)/2 + size_t num_pairwise_yy_; // q(q-1)/2 + size_t num_cross_; // p * q + + // ========================================================================= + // Data + // ========================================================================= + + arma::imat discrete_observations_; // Discrete observations (n × p) + // BC columns centered at baseline_category_ in ctor. + arma::mat discrete_observations_dbl_; // Double version (post-centering) + arma::mat continuous_observations_; // Continuous observations (n × q) + arma::ivec num_categories_; // Categories per discrete variable (p-vector) + int max_cats_; // max(num_categories) + arma::uvec is_ordinal_variable_; // 1 = ordinal, 0 = Blume-Capel (p-vector) + arma::ivec baseline_category_; // Reference category per discrete variable (p-vector) + + // ========================================================================= + // Sufficient statistics + // ========================================================================= + + arma::imat counts_per_category_; // (max_cats+1) × p category counts (ordinal only) + arma::imat blume_capel_stats_; // 2 × p linear/quadratic sums (BC only) + + // ========================================================================= + // Parameters + // ========================================================================= + + arma::mat mux_; // p × max_cats main effects + // Ordinal: mux_(s,c) = threshold for category c+1; + // category 0 is reference (fixed at 0). + // Blume-Capel: mux_(s,0) = linear α_s, + // mux_(s,1) = quadratic β_s. + arma::vec muy_; // q-vector continuous means + arma::mat Kxx_; // p × p discrete interactions (symmetric, zero diag) + arma::mat Kyy_; // q × q SPD precision matrix + arma::mat Kxy_; // p × q cross-type interactions + + // ========================================================================= + // Edge indicators + // ========================================================================= + + // Combined (p+q) × (p+q) indicator matrix: + // Gxx block : rows [0,p), cols [0,p) — symmetric, zero diag + // Gyy block : rows [p,p+q), cols [p,p+q) — symmetric, zero diag + // Gxy block : rows [0,p), cols [p,p+q) — full p×q rectangle + arma::imat edge_indicators_; + arma::mat inclusion_probability_; + bool edge_selection_; + bool edge_selection_active_; + + // ========================================================================= + // Priors + // ========================================================================= + + double main_alpha_; // Beta prior α for main effects + double main_beta_; // Beta prior β for main effects + double pairwise_scale_; // Cauchy scale for interaction priors + + // ========================================================================= + // Proposal SDs (Robbins-Monro adapted) + // ========================================================================= + + arma::mat prop_sd_mux_; // p × max_cats + arma::vec prop_sd_muy_; // q-vector + arma::mat prop_sd_Kxx_; // p × p + arma::mat prop_sd_Kyy_; // q × q + arma::mat prop_sd_Kxy_; // p × q + + // ========================================================================= + // Cached quantities + // ========================================================================= + + arma::mat Kyy_inv_; // q × q inverse of Kyy + arma::mat Kyy_chol_; // q × q upper Cholesky of Kyy + double Kyy_log_det_; // log|Kyy| + arma::mat Theta_; // p × p Kxx + 2 Kxy Kyy_inv Kxy' (marginal PL only) + arma::mat conditional_mean_; // n × q μ_y' + 2 discrete_obs Kxy Kyy_inv + + // ========================================================================= + // Configuration + // ========================================================================= + + bool use_marginal_pl_; // true = marginal, false = conditional + + // ========================================================================= + // RNG and edge-update order + // ========================================================================= + + SafeRNG rng_; + arma::uvec edge_order_xx_; // Shuffled xx-edge pair indices + arma::uvec edge_order_yy_; // Shuffled yy-edge pair indices + arma::uvec edge_order_xy_; // Shuffled xy-edge pair indices + + // ========================================================================= + // Private helpers + // ========================================================================= + + /** Count total main-effect parameters across all discrete variables. */ + size_t count_num_main_effects() const; + + /** Compute category counts and BC sufficient statistics from discrete_observations_. */ + void compute_sufficient_statistics(); + + /** Recompute conditional_mean_ from muy_, Kxy_, Kyy_inv_. */ + void recompute_conditional_mean(); + + /** Recompute Kyy_chol_, Kyy_inv_, Kyy_log_det_ from Kyy_. */ + void recompute_Kyy_decomposition(); + + /** Recompute Theta_ from Kxx_, Kxy_, Kyy_inv_ (marginal PL only). */ + void recompute_Theta(); + + // ========================================================================= + // Edge-indicator accessor helpers + // ========================================================================= + + int gxx(int i, int j) const { return edge_indicators_(i, j); } + int gyy(int i, int j) const { return edge_indicators_(p_ + i, p_ + j); } + int gxy(int i, int j) const { return edge_indicators_(i, p_ + j); } + + void set_gxx(int i, int j, int val) { + edge_indicators_(i, j) = val; + edge_indicators_(j, i) = val; + } + void set_gyy(int i, int j, int val) { + edge_indicators_(p_ + i, p_ + j) = val; + edge_indicators_(p_ + j, p_ + i) = val; + } + void set_gxy(int i, int j, int val) { + edge_indicators_(i, p_ + j) = val; + } +}; From 8bca7d282a3d0ab2934137cb85f05b085bbf9d17 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 22:57:12 +0100 Subject: [PATCH 03/60] test: add mixed MRF skeleton tests --- R/RcppExports.R | 4 + src/RcppExports.cpp | 21 ++ src/test_mixed_mrf.cpp | 114 +++++++++++ tests/testthat/test-mixed-mrf-skeleton.R | 235 +++++++++++++++++++++++ 4 files changed, 374 insertions(+) create mode 100644 src/test_mixed_mrf.cpp create mode 100644 tests/testthat/test-mixed-mrf-skeleton.R diff --git a/R/RcppExports.R b/R/RcppExports.R index 4eca5302..d99cf745 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -57,3 +57,7 @@ compute_Vn_mfm_sbm <- function(num_variables, dirichlet_alpha, t_max, lambda) { .Call(`_bgms_compute_Vn_mfm_sbm`, num_variables, dirichlet_alpha, t_max, lambda) } +test_mixed_mrf_skeleton <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed) { + .Call(`_bgms_test_mixed_mrf_skeleton`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed) +} + diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 805000be..1cf2aad1 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -289,6 +289,26 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// test_mixed_mrf_skeleton +Rcpp::List test_mixed_mrf_skeleton(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, int seed); +RcppExport SEXP _bgms_test_mixed_mrf_skeleton(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP seedSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); + Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); + Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); + Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_skeleton(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -305,6 +325,7 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_sample_ggm", (DL_FUNC) &_bgms_sample_ggm, 19}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, + {"_bgms_test_mixed_mrf_skeleton", (DL_FUNC) &_bgms_test_mixed_mrf_skeleton, 10}, {NULL, NULL, 0} }; diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp new file mode 100644 index 00000000..9d9600a4 --- /dev/null +++ b/src/test_mixed_mrf.cpp @@ -0,0 +1,114 @@ +// test_mixed_mrf.cpp — Rcpp test helpers for MixedMRFModel skeleton (Phase A.3) +// +// These are lightweight exported functions that construct a MixedMRFModel from +// R inputs and return diagnostic information for testthat assertions. + +#include +#include "models/mixed/mixed_mrf_model.h" + +// [[Rcpp::export]] +Rcpp::List test_mixed_mrf_skeleton( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + bool edge_selection, + const std::string& pseudolikelihood, + int seed +) { + MixedMRFModel model( + discrete_observations, + continuous_observations, + num_categories, + is_ordinal_variable, + baseline_category, + inclusion_probability, + initial_edge_indicators, + edge_selection, + pseudolikelihood, + 1.0, 1.0, 2.5, + seed + ); + + // --- Dimension checks --- + size_t param_dim = model.parameter_dimension(); + size_t full_param_dim = model.full_parameter_dimension(); + int num_variables = model.get_num_variables(); + int num_pairwise = model.get_num_pairwise(); + + // --- Vectorized parameter round-trip --- + arma::vec params_before = model.get_vectorized_parameters(); + model.set_vectorized_parameters(params_before); + arma::vec params_after = model.get_vectorized_parameters(); + double roundtrip_max_diff = arma::max(arma::abs(params_before - params_after)); + + // --- Full-parameter vector --- + arma::vec full_params = model.get_full_vectorized_parameters(); + + // --- Edge indicators --- + arma::ivec indicator_vec = model.get_vectorized_indicator_parameters(); + const arma::imat& edge_mat = model.get_edge_indicators(); + + // --- Non-trivial parameter round-trip --- + // Set some non-zero parameters and verify round-trip + arma::vec test_params(full_param_dim); + for(size_t i = 0; i < full_param_dim; ++i) { + test_params(i) = static_cast(i + 1) * 0.01; + } + // Kyy must be SPD: overwrite the Kyy block with a diagonal-dominant SPD matrix. + // Kyy occupies indices: num_main + num_pairwise_xx + q ... num_main + num_pairwise_xx + q + q(q+1)/2 - 1 + // For simplicity, just make it diagonal = large positive + int p = discrete_observations.n_cols; + int q = continuous_observations.n_cols; + size_t num_main = 0; + for(int s = 0; s < p; ++s) { + if(is_ordinal_variable(s)) { + num_main += num_categories(s); + } else { + num_main += 2; + } + } + size_t kyy_start = num_main + p * (p - 1) / 2 + q; + // Write identity-like SPD into Kyy block + size_t kyy_idx = kyy_start; + for(int i = 0; i < q; ++i) { + for(int j = i; j < q; ++j) { + if(i == j) { + test_params(kyy_idx) = 2.0 + i * 0.1; // positive diagonal + } else { + test_params(kyy_idx) = 0.01; // small off-diagonal + } + kyy_idx++; + } + } + + model.set_vectorized_parameters(test_params); + arma::vec recovered = model.get_vectorized_parameters(); + double nontrivial_max_diff = arma::max(arma::abs(test_params - recovered)); + + // --- Clone round-trip --- + auto cloned = model.clone(); + arma::vec cloned_params = cloned->get_vectorized_parameters(); + double clone_max_diff = arma::max(arma::abs(recovered - cloned_params)); + + return Rcpp::List::create( + Rcpp::Named("parameter_dimension") = param_dim, + Rcpp::Named("full_parameter_dimension") = full_param_dim, + Rcpp::Named("num_variables") = num_variables, + Rcpp::Named("num_pairwise") = num_pairwise, + Rcpp::Named("params_length") = params_before.n_elem, + Rcpp::Named("roundtrip_max_diff") = roundtrip_max_diff, + Rcpp::Named("nontrivial_roundtrip_max_diff") = nontrivial_max_diff, + Rcpp::Named("clone_max_diff") = clone_max_diff, + Rcpp::Named("indicator_length") = indicator_vec.n_elem, + Rcpp::Named("edge_indicators_rows") = edge_mat.n_rows, + Rcpp::Named("edge_indicators_cols") = edge_mat.n_cols, + Rcpp::Named("has_edge_selection") = model.has_edge_selection(), + Rcpp::Named("has_adaptive_metropolis") = model.has_adaptive_metropolis(), + Rcpp::Named("has_gradient") = model.has_gradient(), + Rcpp::Named("has_missing_data") = model.has_missing_data() + ); +} diff --git a/tests/testthat/test-mixed-mrf-skeleton.R b/tests/testthat/test-mixed-mrf-skeleton.R new file mode 100644 index 00000000..0519cf67 --- /dev/null +++ b/tests/testthat/test-mixed-mrf-skeleton.R @@ -0,0 +1,235 @@ +# ============================================================================== +# Phase A.3: MixedMRFModel Skeleton Tests +# ============================================================================== +# +# Verifies that the MixedMRFModel C++ class compiles, links, and that +# parameter_dimension() and get/set_vectorized_parameters() round-trip +# correctly. Tests cover: +# +# 1. All-ordinal variables (p ordinal discrete + q continuous) +# 2. All-Blume-Capel variables +# 3. Mixed ordinal + Blume-Capel variables +# 4. Both conditional and marginal pseudolikelihood modes +# 5. Clone round-trip +# 6. Dimension arithmetic (num_variables, num_pairwise, indicator length) +# +# ============================================================================== + +# The helper-fixtures.R file loads bgms, but test_file() may skip it. +# Ensure the package is available: +if(!requireNamespace("bgms", quietly = TRUE)) { + skip("bgms package not installed") +} +test_mixed_mrf_skeleton = bgms:::test_mixed_mrf_skeleton + +# ---- Helper to build test inputs for a given scenario ---- +make_mixed_mrf_inputs = function(n, p, q, num_categories, is_ordinal, + baseline_category, edge_selection = FALSE, + pseudolikelihood = "conditional", + seed = 42L) { + set.seed(seed) + # Discrete observations: each column in 0..(num_categories[s]) + discrete_obs = matrix(0L, nrow = n, ncol = p) + for(s in seq_len(p)) { + discrete_obs[, s] = sample(0L:num_categories[s], n, replace = TRUE) + } + # Continuous observations + continuous_obs = matrix(rnorm(n * q), nrow = n, ncol = q) + + total = p + q + inclusion_prob = matrix(0.5, nrow = total, ncol = total) + diag(inclusion_prob) = 0 + edge_ind = matrix(1L, nrow = total, ncol = total) + diag(edge_ind) = 0L + + list( + discrete_observations = discrete_obs, + continuous_observations = continuous_obs, + num_categories = as.integer(num_categories), + is_ordinal_variable = as.integer(is_ordinal), + baseline_category = as.integer(baseline_category), + inclusion_probability = inclusion_prob, + initial_edge_indicators = edge_ind, + edge_selection = edge_selection, + pseudolikelihood = pseudolikelihood, + seed = seed + ) +} + +run_skeleton_test = function(inputs) { + do.call(test_mixed_mrf_skeleton, inputs) +} + +# ---- Expected dimension calculator (mirrors C++ logic) ---- +expected_full_dim = function(p, q, num_categories, is_ordinal) { + num_main = sum(ifelse(is_ordinal == 1L, num_categories, 2L)) + num_pairwise_xx = p * (p - 1) / 2 + num_pairwise_yy_with_diag = q * (q + 1) / 2 + num_cross = p * q + num_main + num_pairwise_xx + q + num_pairwise_yy_with_diag + num_cross +} + +expected_num_pairwise = function(p, q) { + p * (p - 1) / 2 + q * (q - 1) / 2 + p * q +} + +expected_indicator_length = function(p, q) { + expected_num_pairwise(p, q) +} + +# ============================================================================== +# Test scenarios +# ============================================================================== + +test_that("all-ordinal skeleton has correct dimensions", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$num_variables, p + q) + expect_equal(res$parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) + expect_equal(res$full_parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) + expect_equal(res$params_length, res$full_parameter_dimension) + expect_equal(res$num_pairwise, expected_num_pairwise(p, q)) + expect_equal(res$indicator_length, expected_indicator_length(p, q)) + expect_equal(res$edge_indicators_rows, p + q) + expect_equal(res$edge_indicators_cols, p + q) +}) + +test_that("all-Blume-Capel skeleton has correct dimensions", { + p = 3L; q = 2L; n = 20L + num_cats = c(4L, 3L, 4L) + is_ord = c(0L, 0L, 0L) + baseline = c(2L, 1L, 2L) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$num_variables, p + q) + # BC always contributes 2 per variable + expect_equal(res$parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) + expect_equal(res$full_parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) +}) + +test_that("mixed ordinal + BC skeleton has correct dimensions", { + p = 4L; q = 3L; n = 25L + num_cats = c(2L, 4L, 3L, 3L) + is_ord = c(1L, 0L, 1L, 0L) + baseline = c(0L, 2L, 0L, 1L) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$num_variables, p + q) + expect_equal(res$parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) +}) + +test_that("zero-parameter round-trip is exact", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$roundtrip_max_diff, 0.0) +}) + +test_that("non-trivial parameter round-trip is exact", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) +}) + +test_that("non-trivial round-trip with Blume-Capel variables", { + p = 4L; q = 3L; n = 25L + num_cats = c(2L, 4L, 3L, 3L) + is_ord = c(1L, 0L, 1L, 0L) + baseline = c(0L, 2L, 0L, 1L) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) +}) + +test_that("clone produces identical parameters", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + expect_equal(res$clone_max_diff, 0.0) +}) + +test_that("marginal pseudolikelihood mode works", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, + pseudolikelihood = "marginal") + res = run_skeleton_test(inp) + + expect_equal(res$parameter_dimension, + expected_full_dim(p, q, num_cats, is_ord)) + expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) +}) + +test_that("capability queries return correct values", { + p = 3L; q = 2L; n = 20L + num_cats = c(2L, 3L, 2L) + is_ord = c(1L, 1L, 1L) + baseline = rep(0L, p) + + inp_no_es = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, + edge_selection = FALSE) + res_no_es = run_skeleton_test(inp_no_es) + expect_false(res_no_es$has_edge_selection) + expect_true(res_no_es$has_adaptive_metropolis) + expect_false(res_no_es$has_gradient) + expect_false(res_no_es$has_missing_data) + + inp_es = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, + edge_selection = TRUE) + res_es = run_skeleton_test(inp_es) + expect_true(res_es$has_edge_selection) +}) + +test_that("single discrete + single continuous works", { + p = 1L; q = 1L; n = 15L + num_cats = 2L + is_ord = 1L + baseline = 0L + + inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) + res = run_skeleton_test(inp) + + # p=1: 0 xx edges, q=1: 0 yy edges, 1 cross edge + expect_equal(res$num_variables, 2L) + expect_equal(res$num_pairwise, 1L) + expect_equal(res$indicator_length, 1L) + # mux: 2 thresholds, Kxx: 0, muy: 1, Kyy: 1 diag, Kxy: 1 + expect_equal(res$full_parameter_dimension, 2 + 0 + 1 + 1 + 1) + expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) +}) From 5df7c3bfd8dd1a52e4e9bfeb807680960a97c779 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:13:17 +0100 Subject: [PATCH 04/60] fix: resolve test-bgm-spec failures and hidden files NOTE - Add ::: bindings for internal functions in test-bgm-spec.R - Exclude .lintr and .editorconfig from tarball via .Rbuildignore --- .Rbuildignore | 4 ++++ tests/testthat/test-bgm-spec.R | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/.Rbuildignore b/.Rbuildignore index 4c78b301..fcf9b275 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -17,6 +17,10 @@ # GitHub / CI ^\.github$ +# Hidden config files (development only) +^\.lintr$ +^\.editorconfig$ + # R CMD build artifacts ^doc$ ^Meta$ diff --git a/tests/testthat/test-bgm-spec.R b/tests/testthat/test-bgm-spec.R index 702d3b51..b7706f46 100644 --- a/tests/testthat/test-bgm-spec.R +++ b/tests/testthat/test-bgm-spec.R @@ -3,6 +3,12 @@ # Phase B.5 of the R scaffolding refactor. # ============================================================================== +# These are internal (non-exported) functions — bind via ::: for testing. +bgm_spec = bgms:::bgm_spec +validate_bgm_spec = bgms:::validate_bgm_spec +new_bgm_spec = bgms:::new_bgm_spec +sampler_sublist = bgms:::sampler_sublist + # ============================================================================== # Shared helpers / fixtures # ============================================================================== From 34f73dbfa5e50def8d2ebb6c5af93ea930c05cdb Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:45:25 +0100 Subject: [PATCH 05/60] feat: add conditional PL likelihood functions (B.1) Implement log_conditional_omrf(s) and log_conditional_ggm() in mixed_mrf_likelihoods.cpp. OMRF branches on ordinal vs Blume-Capel using compute_denom_ordinal/blume_capel from variable_helpers. GGM uses cached Kyy decomposition and conditional mean. 14 test assertions validated against pure-R reference implementations. Cross-validation against mixedGM deferred to B.5 estimation tests. --- R/RcppExports.R | 4 + dev/mixedmrf/implementation_plan.md | 16 +- src/RcppExports.cpp | 22 + src/models/mixed/mixed_mrf_likelihoods.cpp | 77 +++ src/models/mixed/mixed_mrf_model.h | 17 + src/test_mixed_mrf.cpp | 49 ++ tests/testthat/test-mixed-mrf-likelihoods.R | 549 ++++++++++++++++++++ 7 files changed, 732 insertions(+), 2 deletions(-) create mode 100644 src/models/mixed/mixed_mrf_likelihoods.cpp create mode 100644 tests/testthat/test-mixed-mrf-likelihoods.R diff --git a/R/RcppExports.R b/R/RcppExports.R index d99cf745..3f72d3ce 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -61,3 +61,7 @@ test_mixed_mrf_skeleton <- function(discrete_observations, continuous_observatio .Call(`_bgms_test_mixed_mrf_skeleton`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed) } +test_mixed_mrf_likelihoods <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed) { + .Call(`_bgms_test_mixed_mrf_likelihoods`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed) +} + diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index eb57f2e9..85f3d876 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -517,7 +517,16 @@ The diagonal of `edge_indicators_` is always zero and excluded throughout. ## Phase B — Conditional pseudo-likelihood -### B.1 Implement log-likelihood functions +### B.1 Implement log-likelihood functions ✅ + +Implemented in `src/models/mixed/mixed_mrf_likelihoods.cpp`. +Declared as private methods in `mixed_mrf_model.h` with a `friend` +declaration for the test helper. + +Tests: `tests/testthat/test-mixed-mrf-likelihoods.R` (14 assertions) +validated against pure-R reference implementations covering ordinal, +Blume-Capel, GGM, zero-params, nonzero-params, minimal (p=1,q=1), +and all-BC configurations. In `mixed_mrf_likelihoods.cpp`: @@ -749,11 +758,14 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { ### B.5 Testing checkpoint — conditional PL estimation -**Test 1 (T1, T2, T10): Likelihood agreement** +**Test 1 (T1, T2, T10): Likelihood agreement + cross-validation** - Generate data from `mixed_gibbs_generate()` in R - Compute `log_conditional_omrf(s)` and `log_conditional_ggm()` in both R (prototype) and C++ at the same parameter values - Assert agreement to machine precision +- Cross-validate against `mixedGM::rcpp_log_pl_conditional_omrf` and + `mixedGM::rcpp_log_pl_conditional_ggm` for a three-way check + (bgms C++, R reference, mixedGM C++) **Test 2 (T13): Recovery (estimation only, no edge selection)** - Generate data from known parameters (p=3 ordinal, q=2 continuous) diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 1cf2aad1..7ac4c45e 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -309,6 +309,27 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// test_mixed_mrf_likelihoods +Rcpp::List test_mixed_mrf_likelihoods(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, const arma::vec& params, int seed); +RcppExport SEXP _bgms_test_mixed_mrf_likelihoods(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP paramsSEXP, SEXP seedSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); + Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); + Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); + Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); + Rcpp::traits::input_parameter< const arma::vec& >::type params(paramsSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_likelihoods(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -326,6 +347,7 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, {"_bgms_test_mixed_mrf_skeleton", (DL_FUNC) &_bgms_test_mixed_mrf_skeleton, 10}, + {"_bgms_test_mixed_mrf_likelihoods", (DL_FUNC) &_bgms_test_mixed_mrf_likelihoods, 11}, {NULL, NULL, 0} }; diff --git a/src/models/mixed/mixed_mrf_likelihoods.cpp b/src/models/mixed/mixed_mrf_likelihoods.cpp new file mode 100644 index 00000000..2a1fae27 --- /dev/null +++ b/src/models/mixed/mixed_mrf_likelihoods.cpp @@ -0,0 +1,77 @@ +#include +#include "models/mixed/mixed_mrf_model.h" +#include "utils/variable_helpers.h" +#include "math/explog_macros.h" + + +// ============================================================================= +// log_conditional_omrf +// ============================================================================= +// Conditional OMRF pseudolikelihood for discrete variable s: +// log f(x_s | x_{-s}, y) = numerator - sum_v log(Z_v) +// +// Branches on is_ordinal_variable_(s) to select ordinal thresholds or +// Blume-Capel (linear + quadratic) main effects. +// ============================================================================= + +double MixedMRFModel::log_conditional_omrf(int s) const { + int C_s = num_categories_(s); + + // Rest score: contribution from other discrete vars + continuous vars + arma::vec rest = discrete_observations_dbl_ * Kxx_.col(s) + - discrete_observations_dbl_.col(s) * Kxx_(s, s) + + 2.0 * continuous_observations_ * Kxy_.row(s).t(); + + // Numerator (sufficient-statistic form): dot(x_s, rest) + main-effect sums + double numer = arma::dot(discrete_observations_dbl_.col(s), rest); + + if(is_ordinal_variable_(s)) { + // Ordinal: add threshold contributions sum_{c=1}^{C_s} count_c * mux_(s, c-1) + for(int c = 1; c <= C_s; ++c) { + numer += static_cast(counts_per_category_(c, s)) * mux_(s, c - 1); + } + + // Denominator via compute_denom_ordinal (FAST/SAFE block-split) + arma::vec main_param = mux_.row(s).cols(0, C_s - 1).t(); + arma::vec bound = static_cast(C_s) * rest; + arma::vec denom = compute_denom_ordinal(rest, main_param, bound); + + return numer - arma::accu(bound + ARMA_MY_LOG(denom)); + } else { + // Blume-Capel: alpha * sum(x) + beta * sum(x^2) + double alpha = mux_(s, 0); + double beta = mux_(s, 1); + numer += alpha * static_cast(blume_capel_stats_(0, s)) + + beta * static_cast(blume_capel_stats_(1, s)); + + // Denominator via compute_denom_blume_capel (computes bound internally) + arma::vec bound; + arma::vec denom = compute_denom_blume_capel( + rest, alpha, beta, baseline_category_(s), C_s, bound + ); + + return numer - arma::accu(bound + ARMA_MY_LOG(denom)); + } +} + + +// ============================================================================= +// log_conditional_ggm +// ============================================================================= +// Conditional GGM log-likelihood: log f(y | x) +// y | x ~ N(conditional_mean_, Kyy_inv_) +// +// Uses cached Kyy_inv_, Kyy_log_det_, and conditional_mean_. +// ============================================================================= + +double MixedMRFModel::log_conditional_ggm() const { + arma::mat D = continuous_observations_ - conditional_mean_; + + // Quadratic form: trace(Kyy * D' * D) = sum((D * Kyy_) .* D) + double quad_sum = arma::accu((D * Kyy_) % D); + + return static_cast(n_) / 2.0 * + (-static_cast(q_) * std::log(2.0 * arma::datum::pi) + + Kyy_log_det_) + - quad_sum / 2.0; +} diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index b26910d6..0be172e1 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -27,6 +27,13 @@ class MixedMRFModel : public BaseModel { public: + // Test helpers need access to private likelihood functions + friend Rcpp::List test_mixed_mrf_likelihoods( + const arma::imat&, const arma::mat&, const arma::ivec&, + const arma::uvec&, const arma::ivec&, const arma::mat&, + const arma::imat&, bool, const std::string&, const arma::vec&, int + ); + // ========================================================================= // Construction // ========================================================================= @@ -320,6 +327,16 @@ class MixedMRFModel : public BaseModel { /** Recompute Theta_ from Kxx_, Kxy_, Kyy_inv_ (marginal PL only). */ void recompute_Theta(); + // ========================================================================= + // Likelihood functions (implemented in mixed_mrf_likelihoods.cpp) + // ========================================================================= + + /** Conditional OMRF pseudolikelihood for discrete variable s, summed over all n. */ + double log_conditional_omrf(int s) const; + + /** Conditional GGM log-likelihood: log f(y | x), using cached decomposition. */ + double log_conditional_ggm() const; + // ========================================================================= // Edge-indicator accessor helpers // ========================================================================= diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp index 9d9600a4..d296217c 100644 --- a/src/test_mixed_mrf.cpp +++ b/src/test_mixed_mrf.cpp @@ -112,3 +112,52 @@ Rcpp::List test_mixed_mrf_skeleton( Rcpp::Named("has_missing_data") = model.has_missing_data() ); } + + +// [[Rcpp::export]] +Rcpp::List test_mixed_mrf_likelihoods( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + bool edge_selection, + const std::string& pseudolikelihood, + const arma::vec& params, + int seed +) { + MixedMRFModel model( + discrete_observations, + continuous_observations, + num_categories, + is_ordinal_variable, + baseline_category, + inclusion_probability, + initial_edge_indicators, + edge_selection, + pseudolikelihood, + 1.0, 1.0, 2.5, + seed + ); + + // Set parameters (caller must ensure Kyy block is SPD) + model.set_vectorized_parameters(params); + + int p = discrete_observations.n_cols; + + // Evaluate log_conditional_omrf for each discrete variable + Rcpp::NumericVector omrf_ll(p); + for(int s = 0; s < p; ++s) { + omrf_ll[s] = model.log_conditional_omrf(s); + } + + // Evaluate log_conditional_ggm + double ggm_ll = model.log_conditional_ggm(); + + return Rcpp::List::create( + Rcpp::Named("omrf_ll") = omrf_ll, + Rcpp::Named("ggm_ll") = ggm_ll + ); +} diff --git a/tests/testthat/test-mixed-mrf-likelihoods.R b/tests/testthat/test-mixed-mrf-likelihoods.R new file mode 100644 index 00000000..8f4e7c44 --- /dev/null +++ b/tests/testthat/test-mixed-mrf-likelihoods.R @@ -0,0 +1,549 @@ +# ============================================================================= +# test-mixed-mrf-likelihoods.R — Phase B.1 likelihood tests +# ============================================================================= +# Tests for log_conditional_omrf() and log_conditional_ggm() in the +# MixedMRFModel, validated against pure-R reference implementations. + +# ------------------------------------------------------------------ +# R reference: conditional OMRF pseudolikelihood for variable s +# ------------------------------------------------------------------ +# Computes log f(x_s | x_{-s}, y) summed over n observations. +# +# @param x_int n x p integer matrix (0-based categories) +# @param y n x q continuous matrix +# @param Kxx p x p symmetric, zero diagonal +# @param Kxy p x q cross-interactions +# @param mux p x max_cats thresholds / BC coefficients +# @param num_cats p-vector of category counts +# @param is_ordinal p-vector (1 = ordinal, 0 = BC) +# @param baseline_cat p-vector of reference categories +# @param s 0-based variable index +# +# Returns: scalar log-likelihood. +ref_log_conditional_omrf = function(x_int, y, Kxx, Kxy, mux, num_cats, + is_ordinal, baseline_cat, s) { + n = nrow(x_int) + s1 = s + 1L # R indexing + + # Center BC observations (same as constructor) + x = x_int + for(j in seq_len(ncol(x))) { + if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] + } + x_dbl = matrix(as.double(x), nrow = n) + + # Rest score + rest = x_dbl %*% Kxx[, s1] - x_dbl[, s1] * Kxx[s1, s1] + + 2.0 * y %*% t(Kxy[s1, , drop = FALSE]) + rest = as.numeric(rest) + + C_s = num_cats[s1] + + if(is_ordinal[s1]) { + # Numerator: dot(x_s, rest) + sum_c count_c * mux(s, c) + numer = sum(x_dbl[, s1] * rest) + for(c in seq_len(C_s)) { + count_c = sum(x[, s1] == c) + numer = numer + count_c * mux[s1, c] + } + # Log-normalizer per person (log-sum-exp stabilized) + log_Z = numeric(n) + for(v in seq_len(n)) { + terms = numeric(C_s + 1) + terms[1] = 0 # reference category + for(c in seq_len(C_s)) { + terms[c + 1] = mux[s1, c] + c * rest[v] + } + mx = max(terms) + log_Z[v] = mx + log(sum(exp(terms - mx))) + } + return(numer - sum(log_Z)) + } else { + # Blume-Capel + alpha = mux[s1, 1] + beta = mux[s1, 2] + ref = baseline_cat[s1] + + numer = sum(x_dbl[, s1] * rest) + + alpha * sum(x[, s1]) + beta * sum(x[, s1]^2) + + log_Z = numeric(n) + for(v in seq_len(n)) { + cats = 0:C_s + centered = cats - ref + theta = alpha * centered + beta * centered^2 + terms = theta + centered * rest[v] + mx = max(terms) + log_Z[v] = mx + log(sum(exp(terms - mx))) + } + return(numer - sum(log_Z)) + } +} + +# ------------------------------------------------------------------ +# R reference: conditional GGM log-likelihood +# ------------------------------------------------------------------ +# Computes log f(y | x) using conditional mean and precision Kyy. +# +# @param x_int n x p integer matrix (0-based) +# @param y n x q continuous matrix +# @param Kxy p x q cross-interactions +# @param Kyy q x q SPD precision matrix +# @param muy q-vector of means +# @param is_ordinal p-vector +# @param baseline_cat p-vector +# +# Returns: scalar log-likelihood. +ref_log_conditional_ggm = function(x_int, y, Kxy, Kyy, muy, + is_ordinal, baseline_cat) { + n = nrow(y) + q = ncol(y) + + # Center BC observations + x = x_int + for(j in seq_len(ncol(x))) { + if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] + } + x_dbl = matrix(as.double(x), nrow = n) + + Kyy_inv = solve(Kyy) + logdet_val = as.numeric(determinant(Kyy, logarithm = TRUE)$modulus) + + # Conditional mean: repmat(muy', n, 1) + 2 * x_dbl * Kxy * Kyy_inv + cond_mean = matrix(rep(muy, each = n), nrow = n) + + 2.0 * x_dbl %*% Kxy %*% Kyy_inv + + D = y - cond_mean + quad_sum = sum((D %*% Kyy) * D) + + ll = n / 2.0 * (-q * log(2 * pi) + logdet_val) - quad_sum / 2.0 + return(ll) +} + + +# ------------------------------------------------------------------ +# Helper to build a zero parameter vector with correct structure +# ------------------------------------------------------------------ +build_param_vec = function(p, q, num_cats, is_ordinal) { + num_main = 0L + for(s in seq_len(p)) { + if(is_ordinal[s]) { + num_main = num_main + num_cats[s] + } else { + num_main = num_main + 2L + } + } + num_pairwise_xx = p * (p - 1L) / 2L + num_kyy = q * (q + 1L) / 2L + num_cross = p * q + total = num_main + num_pairwise_xx + q + num_kyy + num_cross + list( + total = total, + num_main = num_main, + num_pairwise_xx = num_pairwise_xx, + q = q, + num_kyy = num_kyy, + num_cross = num_cross, + kyy_start = num_main + num_pairwise_xx + q # 0-based start of Kyy block + ) +} + + +# ------------------------------------------------------------------ +# Test setup shared across tests +# ------------------------------------------------------------------ +make_test_data = function() { + set.seed(42) + n = 10L; p = 3L; q = 2L + num_cats = c(2L, 3L, 2L) + is_ordinal = c(1L, 1L, 0L) # vars 1,2 ordinal; var 3 BC + baseline_cat = c(0L, 0L, 1L) # BC var has ref = 1 + + x = matrix(0L, n, p) + x[, 1] = sample(0:2, n, replace = TRUE) + x[, 2] = sample(0:3, n, replace = TRUE) + x[, 3] = sample(0:2, n, replace = TRUE) # original BC obs in [0, C_s] + y = matrix(rnorm(n * q), n, q) + + pq = p + q + inc_prob = matrix(0.5, pq, pq) + edge_ind = matrix(1L, pq, pq) + diag(edge_ind) = 0L + + list( + n = n, p = p, q = q, + x = x, y = y, + num_cats = num_cats, + is_ordinal = as.integer(is_ordinal), + baseline_cat = baseline_cat, + inc_prob = inc_prob, + edge_ind = edge_ind + ) +} + + +# ============================================================================== +# Tests +# ============================================================================== + +test_that("log_conditional_omrf at zero parameters equals -n*log(C+1)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + # Kyy = identity + idx = info$kyy_start + for(i in seq_len(d$q)) { + for(j in i:d$q) { + idx = idx + 1L + if(i == j) params[idx] = 1.0 + } + } + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L + ) + + # Ordinal vars: expected = -n * log(C_s + 1) + expect_equal(res$omrf_ll[1], -d$n * log(d$num_cats[1] + 1), tolerance = 1e-10) + expect_equal(res$omrf_ll[2], -d$n * log(d$num_cats[2] + 1), tolerance = 1e-10) + + # BC var: at zero params, all categories have theta = 0, rest = 0 + # so Z = num_cats + 1, numer = 0 => ll = -n * log(C+1) + expect_equal(res$omrf_ll[3], -d$n * log(d$num_cats[3] + 1), tolerance = 1e-10) +}) + + +test_that("log_conditional_ggm at zero parameters equals standard normal", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + idx = info$kyy_start + for(i in seq_len(d$q)) { + for(j in i:d$q) { + idx = idx + 1L + if(i == j) params[idx] = 1.0 + } + } + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L + ) + + # At zero params: y ~ N(0, I), so ll = sum(dnorm(y, log = TRUE)) + expected = sum(dnorm(d$y, log = TRUE)) + expect_equal(res$ggm_ll, expected, tolerance = 1e-10) +}) + + +test_that("log_conditional_omrf matches R reference (ordinal, nonzero params)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + # Set some nonzero main effects + params[1] = 0.3; params[2] = -0.2 # var 1 thresholds (C=2) + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 # var 2 thresholds (C=3) + params[6] = 0.5; params[7] = -0.3 # var 3 BC alpha, beta + + # Set some Kxx edges (upper-tri, row-major: (0,1), (0,2), (1,2)) + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 # Kxx(0,1) + params[kxx_start + 2] = -0.1 # Kxx(0,2) + params[kxx_start + 3] = 0.15 # Kxx(1,2) + + # muy + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + params[muy_start + 2] = -0.2 + + # Kyy = SPD (2x2 with positive eigenvalues) + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 # Kyy(0,0) + params[kyy_start + 2] = 0.3 # Kyy(0,1) + params[kyy_start + 3] = 1.5 # Kyy(1,1) + + # Kxy (p x q, row-major) + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.1 # Kxy(0,0) + params[kxy_start + 2] = -0.05 # Kxy(0,1) + params[kxy_start + 3] = 0.08 # Kxy(1,0) + params[kxy_start + 4] = 0.12 # Kxy(1,1) + params[kxy_start + 5] = -0.07 # Kxy(2,0) + params[kxy_start + 6] = 0.04 # Kxy(2,1) + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L + ) + + # Reconstruct parameter matrices for R reference + mux = matrix(0, d$p, max(d$num_cats)) + mux[1, 1:2] = c(0.3, -0.2) + mux[2, 1:3] = c(0.1, 0.4, -0.1) + mux[3, 1:2] = c(0.5, -0.3) + + Kxx = matrix(0, d$p, d$p) + Kxx[1, 2] = Kxx[2, 1] = 0.2 + Kxx[1, 3] = Kxx[3, 1] = -0.1 + Kxx[2, 3] = Kxx[3, 2] = 0.15 + + Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) + muy = c(0.1, -0.2) + + # Check each ordinal variable against R reference + for(s in 0:1) { + expected = ref_log_conditional_omrf( + d$x, d$y, Kxx, Kxy, mux, d$num_cats, + d$is_ordinal, d$baseline_cat, s + ) + expect_equal(res$omrf_ll[s + 1], expected, tolerance = 1e-8, + label = paste0("ordinal var ", s)) + } +}) + + +test_that("log_conditional_omrf matches R reference (Blume-Capel, nonzero params)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + # Same params as ordinal test + params[1] = 0.3; params[2] = -0.2 + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 + params[6] = 0.5; params[7] = -0.3 + + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 + params[kxx_start + 2] = -0.1 + params[kxx_start + 3] = 0.15 + + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + params[muy_start + 2] = -0.2 + + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.1 + params[kxy_start + 2] = -0.05 + params[kxy_start + 3] = 0.08 + params[kxy_start + 4] = 0.12 + params[kxy_start + 5] = -0.07 + params[kxy_start + 6] = 0.04 + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L + ) + + mux = matrix(0, d$p, max(d$num_cats)) + mux[1, 1:2] = c(0.3, -0.2) + mux[2, 1:3] = c(0.1, 0.4, -0.1) + mux[3, 1:2] = c(0.5, -0.3) + + Kxx = matrix(0, d$p, d$p) + Kxx[1, 2] = Kxx[2, 1] = 0.2 + Kxx[1, 3] = Kxx[3, 1] = -0.1 + Kxx[2, 3] = Kxx[3, 2] = 0.15 + + Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) + + # Test BC variable (s = 2, 0-based) + expected = ref_log_conditional_omrf( + d$x, d$y, Kxx, Kxy, mux, d$num_cats, + d$is_ordinal, d$baseline_cat, s = 2 + ) + expect_equal(res$omrf_ll[3], expected, tolerance = 1e-8) +}) + + +test_that("log_conditional_ggm matches R reference (nonzero params)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + # Set same params + params[1] = 0.3; params[2] = -0.2 + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 + params[6] = 0.5; params[7] = -0.3 + + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 + params[kxx_start + 2] = -0.1 + params[kxx_start + 3] = 0.15 + + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + params[muy_start + 2] = -0.2 + + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.1 + params[kxy_start + 2] = -0.05 + params[kxy_start + 3] = 0.08 + params[kxy_start + 4] = 0.12 + params[kxy_start + 5] = -0.07 + params[kxy_start + 6] = 0.04 + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L + ) + + Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), 2, 2) + Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) + muy = c(0.1, -0.2) + + expected = ref_log_conditional_ggm( + d$x, d$y, Kxy, Kyy, muy, d$is_ordinal, d$baseline_cat + ) + expect_equal(res$ggm_ll, expected, tolerance = 1e-8) +}) + + +test_that("log_conditional_ggm invariant to Kxx changes", { + # GGM likelihood depends on Kyy, Kxy, muy but not Kxx + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params1 = rep(0, info$total) + params2 = rep(0, info$total) + + # Both: same Kyy = SPD, same Kxy, same muy + kyy_start = info$kyy_start + for(params in list(params1, params2)) { + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + } + # But different Kxx + kxx_start = info$num_main + params1[kxx_start + 1] = 0.5 + params2[kxx_start + 1] = -0.3 + + # Need to re-assign since list() copies + params1[kyy_start + 1] = 2.0 + params1[kyy_start + 2] = 0.3 + params1[kyy_start + 3] = 1.5 + params2[kyy_start + 1] = 2.0 + params2[kyy_start + 2] = 0.3 + params2[kyy_start + 3] = 1.5 + + res1 = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params1, 1L + ) + res2 = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "conditional", params2, 1L + ) + + # GGM likelihood should be identical regardless of Kxx + expect_equal(res1$ggm_ll, res2$ggm_ll, tolerance = 1e-12) +}) + + +test_that("likelihood with p=1 ordinal, q=1 continuous works", { + set.seed(99) + n = 5L; p = 1L; q = 1L + x = matrix(sample(0:1, n, replace = TRUE), n, p) + y = matrix(rnorm(n), n, q) + num_cats = 1L + is_ordinal = 1L + baseline_cat = 0L + pq = p + q + inc_prob = matrix(0.5, pq, pq) + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + # Params: 1 threshold + 0 Kxx + 1 muy + 1 Kyy + 1 Kxy = 4 + params = c(0.5, # mux(0,0) = threshold + 0.2, # muy + 1.5, # Kyy(0,0) + 0.1) # Kxy(0,0) + + res = bgms:::test_mixed_mrf_likelihoods( + x, y, num_cats, is_ordinal, baseline_cat, + inc_prob, edge_ind, FALSE, "conditional", params, 1L + ) + + # R reference + mux = matrix(0.5, 1, 1) + Kxx = matrix(0, 1, 1) + Kxy = matrix(0.1, 1, 1) + Kyy = matrix(1.5, 1, 1) + muy = 0.2 + + expected_omrf = ref_log_conditional_omrf( + x, y, Kxx, Kxy, mux, num_cats, is_ordinal, baseline_cat, s = 0 + ) + expected_ggm = ref_log_conditional_ggm( + x, y, Kxy, Kyy, muy, is_ordinal, baseline_cat + ) + + expect_equal(res$omrf_ll[1], expected_omrf, tolerance = 1e-10) + expect_equal(res$ggm_ll, expected_ggm, tolerance = 1e-10) +}) + + +test_that("all-Blume-Capel discrete variables work", { + set.seed(77) + n = 8L; p = 2L; q = 1L + num_cats = c(3L, 4L) + is_ordinal = c(0L, 0L) + baseline_cat = c(1L, 2L) + + x = matrix(0L, n, p) + x[, 1] = sample(0:3, n, replace = TRUE) + x[, 2] = sample(0:4, n, replace = TRUE) + y = matrix(rnorm(n), n, q) + + pq = p + q + inc_prob = matrix(0.5, pq, pq) + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + # Params: 2 BC + 2 BC + 1 Kxx + 1 muy + 1 Kyy + 2 Kxy = 9 + # num_main = 4, num_pairwise_xx = 1, q = 1, num_kyy = 1, num_cross = 2 + params = c(0.3, -0.1, # BC var 0: alpha, beta + 0.2, -0.05, # BC var 1: alpha, beta + 0.15, # Kxx(0,1) + -0.1, # muy + 2.0, # Kyy + 0.08, -0.06) # Kxy + + res = bgms:::test_mixed_mrf_likelihoods( + x, y, num_cats, is_ordinal, baseline_cat, + inc_prob, edge_ind, FALSE, "conditional", params, 1L + ) + + mux = matrix(0, 2, 4) + mux[1, 1:2] = c(0.3, -0.1) + mux[2, 1:2] = c(0.2, -0.05) + + Kxx = matrix(0, 2, 2) + Kxx[1, 2] = Kxx[2, 1] = 0.15 + + Kxy = matrix(c(0.08, -0.06), nrow = 2, ncol = 1) + Kyy = matrix(2.0, 1, 1) + muy = -0.1 + + for(s in 0:1) { + expected = ref_log_conditional_omrf( + x, y, Kxx, Kxy, mux, num_cats, is_ordinal, baseline_cat, s + ) + expect_equal(res$omrf_ll[s + 1], expected, tolerance = 1e-8, + label = paste0("BC var ", s)) + } + + expected_ggm = ref_log_conditional_ggm( + x, y, Kxy, Kyy, muy, is_ordinal, baseline_cat + ) + expect_equal(res$ggm_ll, expected_ggm, tolerance = 1e-8) +}) From b0265e9dcbe673b0b9af7a4ab51bde9a8632e54c Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Thu, 5 Mar 2026 23:58:09 +0100 Subject: [PATCH 06/60] feat: add conditional PL Metropolis updates (B.3/B.4) Six scalar MH update functions in mixed_mrf_metropolis.cpp: - update_main_effect: ordinal thresholds and BC alpha/beta - update_continuous_mean: muy with conditional_mean_ save/restore - update_Kxx: symmetric discrete interactions - update_Kyy_offdiag: permute-based Cholesky (ported from mixedGM) - update_Kyy_diag: log-scale Cholesky with Jacobian - update_Kxy: cross interactions with conditional_mean_ save/restore Static helpers: log_beta_prior, permutation builders, get_constants/constrained_diagonal for Cholesky block updates. do_one_metropolis_step wired as 5-step sweep: main effects -> muy -> Kxx -> Kyy -> Kxy, edge-gated. Robbins-Monro adaptation deferred to Phase F. --- dev/mixedmrf/implementation_plan.md | 12 +- src/models/mixed/mixed_mrf_metropolis.cpp | 367 ++++++++++++++++++++++ src/models/mixed/mixed_mrf_model.cpp | 37 ++- src/models/mixed/mixed_mrf_model.h | 22 ++ 4 files changed, 433 insertions(+), 5 deletions(-) create mode 100644 src/models/mixed/mixed_mrf_metropolis.cpp diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 85f3d876..f6d1243a 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -588,7 +588,11 @@ ll = n/2 * (-q * log(2*pi) + Kyy_log_det_) - quad_sum / 2 **Reuse opportunity:** This is structurally identical to `GGMModel::log_density_impl` but with a non-zero, observation-dependent conditional mean. -### B.2 Implement cache maintenance +### B.2 Implement cache maintenance ✅ + +All three functions implemented in Phase A (`mixed_mrf_model.cpp`). +The proposed-state bookkeeping rules below are the design contract +consumed by B.3's MH updates. #### `recompute_conditional_mean()` Recompute `conditional_mean_ = 1*muy^T + 2 * discrete_observations_ * Kxy_ * Kyy_inv_`. @@ -631,7 +635,7 @@ temporaries are discarded cheaply (Armadillo move semantics). 5. **Every accepted RJ edge toggle (Phase D)** must trigger the same cache-refresh logic as an MH acceptance for that parameter type. -### B.3 Implement MH updates (conditional PL) +### B.3 Implement MH updates (conditional PL) ✅ Each update function follows the pattern: 1. Save current parameter value @@ -715,7 +719,7 @@ helpers in `mixed_mrf_cholesky.cpp`, ported from - Prior: Cauchy(0, scale) - Only if $G_{xy,ij} = 1$ -### B.4 Implement `do_one_metropolis_step(int iteration)` +### B.4 Implement `do_one_metropolis_step(int iteration)` ✅ ```cpp void MixedMRFModel::do_one_metropolis_step(int iteration) { @@ -1303,7 +1307,7 @@ principle 1 (green build) and principle 2 (one logical concern). | 2 | `test` | `test: add mixed MRF skeleton tests` | A | `test-mixed-mrf-skeleton.R`: compile check, `parameter_dimension`, vectorization round-trip (ordinal + BC mix). | | 3 | `feat` | `feat: add mixed MRF likelihood functions` | B.1 | `mixed_mrf_likelihoods.cpp`: `log_conditional_omrf`, `log_conditional_ggm`, cache helpers. Ordinal + Blume-Capel paths. | | 4 | `test` | `test: add mixed MRF likelihood unit tests` | B.1 | `test-mixed-mrf-likelihood.R`: T1–T3 (compare C++ vs R fixtures), T7 (analytic Gaussian), T10–T12 (BC-specific). | -| 5 | `feat` | `feat: add conditional PL Metropolis updates` | B.3–B.4 | `mixed_mrf_metropolis.cpp`: all 5 MH update functions + `do_one_metropolis_step` (conditional mode). Cholesky helpers in `mixed_mrf_cholesky.cpp`. | +| 5 | `feat` | `feat: add conditional PL Metropolis updates` | B.3–B.4 | `mixed_mrf_metropolis.cpp`: 6 MH update functions (main effect, muy, Kxx, Kyy off-diag, Kyy diag, Kxy) + static Cholesky helpers + `do_one_metropolis_step` 5-step sweep. | | 6 | `test` | `test: add conditional PL recovery test` | B.5 | `test-mixed-mrf-sampling.R`: T13 (conditional PL parameter recovery, estimation only). | | 7 | `feat` | `feat: add marginal PL mode and Theta caching` | C | `log_marginal_omrf`, Theta cache, marginal-mode branches in MH updates. | | 8 | `test` | `test: add marginal PL recovery and comparison tests` | C.5 | T14 (marginal PL recovery), T16 (cond vs marginal agreement). | diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp new file mode 100644 index 00000000..3c252dfd --- /dev/null +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -0,0 +1,367 @@ +#include +#include "models/mixed/mixed_mrf_model.h" +#include "rng/rng_utils.h" +#include "mcmc/execution/step_result.h" +#include "math/explog_macros.h" + + +// ============================================================================= +// Beta-type prior used for all main effects (ordinal thresholds and BC α/β). +// Matches OMRFModel::log_pseudoposterior_main_component. +// ============================================================================= + +static double log_beta_prior(double x, double alpha, double beta) { + return x * alpha - std::log1p(MY_EXP(x)) * (alpha + beta); +} + + +// ============================================================================= +// update_main_effect +// ============================================================================= +// MH update for one main-effect parameter. +// Ordinal: mux_(s, c) = threshold for category c+1 (c in [0, C_s-1]) +// Blume-Capel: mux_(s, 0) = linear α, mux_(s, 1) = quadratic β +// (c indexes 0 or 1 for BC) +// +// The accept/reject uses log_conditional_omrf(s) + beta-type prior. +// ============================================================================= + +void MixedMRFModel::update_main_effect(int s, int c) { + double& current = mux_(s, c); + double proposal_sd = prop_sd_mux_(s, c); + + double current_val = current; + double proposed = rnorm(rng_, current_val, proposal_sd); + + // Current log-posterior + double ll_curr = log_conditional_omrf(s) + log_beta_prior(current_val, main_alpha_, main_beta_); + + // Proposed log-posterior + current = proposed; + double ll_prop = log_conditional_omrf(s) + log_beta_prior(proposed, main_alpha_, main_beta_); + + double ln_alpha = ll_prop - ll_curr; + + if(std::log(runif(rng_)) >= ln_alpha) { + current = current_val; // reject + } +} + + +// ============================================================================= +// update_continuous_mean +// ============================================================================= +// MH update for one continuous mean parameter muy_(j). +// The accept/reject uses log_conditional_ggm() + Normal(0, 1) prior. +// Must save/restore conditional_mean_ around the proposal. +// ============================================================================= + +void MixedMRFModel::update_continuous_mean(int j) { + double current_val = muy_(j); + double proposed = rnorm(rng_, current_val, prop_sd_muy_(j)); + + // Current log-posterior (Normal(0,1) prior: -x^2/2 up to constant) + double ll_curr = log_conditional_ggm() + R::dnorm(current_val, 0.0, 1.0, true); + + // Set proposed value and refresh conditional_mean_ + arma::mat cond_mean_saved = conditional_mean_; + muy_(j) = proposed; + recompute_conditional_mean(); + + double ll_prop = log_conditional_ggm() + R::dnorm(proposed, 0.0, 1.0, true); + + double ln_alpha = ll_prop - ll_curr; + + if(std::log(runif(rng_)) >= ln_alpha) { + muy_(j) = current_val; // reject + conditional_mean_ = std::move(cond_mean_saved); + } +} + + +// ============================================================================= +// update_Kxx +// ============================================================================= +// MH update for one discrete-discrete interaction Kxx_(i, j). +// Symmetric: sets both (i,j) and (j,i). +// Acceptance: log_conditional_omrf(i) + log_conditional_omrf(j) + Cauchy prior. +// ============================================================================= + +void MixedMRFModel::update_Kxx(int i, int j) { + double current_val = Kxx_(i, j); + double proposed = rnorm(rng_, current_val, prop_sd_Kxx_(i, j)); + + // Current log-posterior + double ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j) + + R::dcauchy(current_val, 0.0, pairwise_scale_, true); + + // Set proposed value (symmetric) + Kxx_(i, j) = proposed; + Kxx_(j, i) = proposed; + + double ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j) + + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + + double ln_alpha = ll_prop - ll_curr; + + if(std::log(runif(rng_)) >= ln_alpha) { + Kxx_(i, j) = current_val; // reject + Kxx_(j, i) = current_val; + } +} + + +// ============================================================================= +// Kyy helpers: permutation-based Cholesky updates +// ============================================================================= +// Ported from mixedGM/R/continuous_variable_helper.R. +// These operate on the (q-1, q) block after permuting target indices to +// the last two positions. + +// Build a permutation vector that moves indices (i, j) to positions (q-1, q). +// Same involution property as the R version. +static arma::uvec make_perm_offdiag(int i, int j, int q) { + int A = q - 2; // 0-based target for first index + int B = q - 1; // 0-based target for second index + arma::uvec perm = arma::regspace(0, q - 1); + + if((i == A && j == B) || (i == B && j == A)) { + // already in position + } else if(i == A || j == A) { + int other = (i == A) ? j : i; + if(other != B) std::swap(perm(other), perm(B)); + } else if(i == B || j == B) { + int other = (i == B) ? j : i; + if(other != A) std::swap(perm(other), perm(A)); + } else { + std::swap(perm(i), perm(A)); + std::swap(perm(j), perm(B)); + } + return perm; +} + +// Build permutation vector that moves index i to position q-1 (last). +static arma::uvec make_perm_diag(int i, int q) { + arma::uvec perm = arma::regspace(0, q - 1); + if(i != q - 1) std::swap(perm(i), perm(q - 1)); + return perm; +} + +// Apply symmetric permutation: M[perm, perm] +static arma::mat permute_matrix(const arma::mat& M, const arma::uvec& perm) { + return M.submat(perm, perm); +} + +// Extract constants from upper Cholesky factor (q×q) for (q-2, q-1) block update. +// Returns: {c1, c2, c3, c4} +struct CholConstants { + double c1, c2, c3, c4; +}; + +static CholConstants get_constants(const arma::mat& L, int q) { + // L is upper-triangular Cholesky factor + // phi_q and phi_q_1 are columns q-1 and q-2, excluding rows (q-2, q-1) + int qm1 = q - 1; // last column (0-based) + int qm2 = q - 2; // second-to-last column + + double c1 = 0.0; + for(int k = 0; k < qm2; ++k) { + c1 += L(k, qm1) * L(k, qm2); + } + double c2 = L(qm2, qm2); + double c3 = 0.0; + for(int k = 0; k < qm2; ++k) { + c3 += L(k, qm1) * L(k, qm1); + } + double c4 = c3 + c1 * c1 / (c2 * c2); + + return {c1, c2, c3, c4}; +} + +// Constrained diagonal: R(omega, constants) from mixedGM +static double constrained_diagonal(double omega, const CholConstants& C) { + if(omega == 0.0) { + return C.c4; + } else { + double t = (omega - C.c1) / C.c2; + return C.c3 + t * t; + } +} + + +// ============================================================================= +// update_Kyy_offdiag +// ============================================================================= +// MH update for one off-diagonal element of the precision matrix Kyy_(i, j). +// Uses the mixedGM permute-based Cholesky approach: +// 1. Permute target pair to last two positions +// 2. Cholesky of permuted Kyy +// 3. Propose on the Cholesky scale: phi' ~ N(Phi[q-2, q-1], sd) +// 4. Map back to Kyy space with constrained diagonal +// 5. Unpermute +// 6. Full recompute of GGM likelihood +// +// Prior: Cauchy(0, pairwise_scale_) on off-diag, Gamma(1, 1) on diagonal. +// ============================================================================= + +void MixedMRFModel::update_Kyy_offdiag(int i, int j) { + int q = static_cast(q_); + + arma::uvec perm = make_perm_offdiag(i, j, q); + arma::mat Kyy_perm = permute_matrix(Kyy_, perm); + arma::mat Phi = arma::chol(Kyy_perm); // upper Cholesky + CholConstants C = get_constants(Phi, q); + + // Current Cholesky-scale value + double phi_curr = Phi(q - 2, q - 1); + double phi_prop = rnorm(rng_, phi_curr, prop_sd_Kyy_(i, j)); + + // Map to Kyy space + double omega_prop = C.c1 + C.c2 * phi_prop; + double diag_curr = Kyy_perm(q - 1, q - 1); + double diag_prop = constrained_diagonal(omega_prop, C); + + // Build proposed permuted Kyy + arma::mat Kyy_prop_perm = Kyy_perm; + Kyy_prop_perm(q - 2, q - 1) = omega_prop; + Kyy_prop_perm(q - 1, q - 2) = omega_prop; + Kyy_prop_perm(q - 1, q - 1) = diag_prop; + + // Unpermute + arma::mat Kyy_prop = permute_matrix(Kyy_prop_perm, perm); + + // Save current state + arma::mat Kyy_saved = Kyy_; + arma::mat Kyy_inv_saved = Kyy_inv_; + arma::mat Kyy_chol_saved = Kyy_chol_; + double Kyy_log_det_saved = Kyy_log_det_; + arma::mat cond_mean_saved = conditional_mean_; + + // Evaluate proposed likelihood + Kyy_ = Kyy_prop; + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + double ll_prop = log_conditional_ggm(); + + // Evaluate current likelihood (restore) + Kyy_ = Kyy_saved; + Kyy_inv_ = Kyy_inv_saved; + Kyy_chol_ = Kyy_chol_saved; + Kyy_log_det_ = Kyy_log_det_saved; + conditional_mean_ = cond_mean_saved; + double ll_curr = log_conditional_ggm(); + + double ln_alpha = ll_prop - ll_curr; + + // Prior ratio: Cauchy on off-diag + Gamma(1,1) on diagonal that changed + ln_alpha += R::dcauchy(Kyy_prop(i, j), 0.0, pairwise_scale_, true); + ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); + ln_alpha += R::dgamma(diag_prop, 1.0, 1.0, true); + ln_alpha -= R::dgamma(diag_curr, 1.0, 1.0, true); + + if(std::log(runif(rng_)) < ln_alpha) { + // Accept: install proposed Kyy and refresh caches + Kyy_ = Kyy_prop; + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); + } +} + + +// ============================================================================= +// update_Kyy_diag +// ============================================================================= +// MH update for one diagonal element of Kyy. +// Proposes on the log-Cholesky scale to ensure positivity. +// Prior: Gamma(1, 1) on the diagonal element + Jacobian for log-scale proposal. +// ============================================================================= + +void MixedMRFModel::update_Kyy_diag(int i) { + int q = static_cast(q_); + + arma::uvec perm = make_perm_diag(i, q); + arma::mat Kyy_perm = permute_matrix(Kyy_, perm); + arma::mat L = arma::chol(Kyy_perm); // upper Cholesky + + // Propose on log(L[q-1, q-1]) scale + double theta_curr = std::log(L(q - 1, q - 1)); + double theta_prop = rnorm(rng_, theta_curr, prop_sd_Kyy_(i, i)); + + // Rebuild Kyy_prop from modified Cholesky + L(q - 1, q - 1) = std::exp(theta_prop); + arma::mat Kyy_prop_perm = L.t() * L; + arma::mat Kyy_prop = permute_matrix(Kyy_prop_perm, perm); + + // Save current state + arma::mat Kyy_saved = Kyy_; + arma::mat Kyy_inv_saved = Kyy_inv_; + arma::mat Kyy_chol_saved = Kyy_chol_; + double Kyy_log_det_saved = Kyy_log_det_; + arma::mat cond_mean_saved = conditional_mean_; + + // Evaluate proposed likelihood + Kyy_ = Kyy_prop; + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + double ll_prop = log_conditional_ggm(); + + // Evaluate current likelihood (restore) + Kyy_ = Kyy_saved; + Kyy_inv_ = Kyy_inv_saved; + Kyy_chol_ = Kyy_chol_saved; + Kyy_log_det_ = Kyy_log_det_saved; + conditional_mean_ = cond_mean_saved; + double ll_curr = log_conditional_ggm(); + + double ln_alpha = ll_prop - ll_curr; + + // Prior ratio: Gamma(1, 1) on diagonal + ln_alpha += R::dgamma(Kyy_prop(i, i), 1.0, 1.0, true); + ln_alpha -= R::dgamma(Kyy_(i, i), 1.0, 1.0, true); + + // Jacobian for log-scale proposal + ln_alpha += theta_prop - theta_curr; + + if(std::log(runif(rng_)) < ln_alpha) { + Kyy_ = Kyy_prop; + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); + } +} + + +// ============================================================================= +// update_Kxy +// ============================================================================= +// MH update for one cross-type interaction Kxy_(i, j). +// Acceptance: log_conditional_omrf(i) + log_conditional_ggm() + Cauchy prior. +// Must save/restore conditional_mean_ around the proposal. +// ============================================================================= + +void MixedMRFModel::update_Kxy(int i, int j) { + double current_val = Kxy_(i, j); + double proposed = rnorm(rng_, current_val, prop_sd_Kxy_(i, j)); + + // Current log-posterior + double ll_curr = log_conditional_omrf(i) + log_conditional_ggm() + + R::dcauchy(current_val, 0.0, pairwise_scale_, true); + + // Set proposed value and refresh conditional_mean_ + arma::mat cond_mean_saved = conditional_mean_; + Kxy_(i, j) = proposed; + recompute_conditional_mean(); + + double ll_prop = log_conditional_omrf(i) + log_conditional_ggm() + + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + + double ln_alpha = ll_prop - ll_curr; + + if(std::log(runif(rng_)) >= ln_alpha) { + Kxy_(i, j) = current_val; // reject + conditional_mean_ = std::move(cond_mean_saved); + } else if(use_marginal_pl_) { + recompute_Theta(); + } +} diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 71002763..82a6e27a 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -417,7 +417,42 @@ std::unique_ptr MixedMRFModel::clone() const { // ============================================================================= void MixedMRFModel::do_one_metropolis_step(int /*iteration*/) { - // Phase B/C: MH updates for all parameter groups + // Step 1: Update all main effects (ordinal thresholds or BC α/β) + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) + update_main_effect(s, c); + } else { + update_main_effect(s, 0); // linear α + update_main_effect(s, 1); // quadratic β + } + } + + // Step 2: Update all continuous means + for(size_t j = 0; j < q_; ++j) + update_continuous_mean(j); + + // Step 3: Update Kxx (upper triangle, edge-gated) + for(size_t i = 0; i < p_ - 1; ++i) + for(size_t j = i + 1; j < p_; ++j) + if(!edge_selection_active_ || gxx(i, j) == 1) + update_Kxx(i, j); + + // Step 4: Update Kyy (off-diag + diagonal, edge-gated) + if(q_ >= 2) { + for(size_t i = 0; i < q_ - 1; ++i) + for(size_t j = i + 1; j < q_; ++j) + if(!edge_selection_active_ || gyy(i, j) == 1) + update_Kyy_offdiag(i, j); + } + for(size_t i = 0; i < q_; ++i) + update_Kyy_diag(i); + + // Step 5: Update Kxy (edge-gated) + for(size_t i = 0; i < p_; ++i) + for(size_t j = 0; j < q_; ++j) + if(!edge_selection_active_ || gxy(i, j) == 1) + update_Kxy(i, j); } void MixedMRFModel::update_edge_indicators() { diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 0be172e1..485fdd6c 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -337,6 +337,28 @@ class MixedMRFModel : public BaseModel { /** Conditional GGM log-likelihood: log f(y | x), using cached decomposition. */ double log_conditional_ggm() const; + // ========================================================================= + // MH update functions (implemented in mixed_mrf_metropolis.cpp) + // ========================================================================= + + /** Update one main-effect: mux_(s, c). Ordinal threshold or BC α/β. */ + void update_main_effect(int s, int c); + + /** Update one continuous mean: muy_(j). */ + void update_continuous_mean(int j); + + /** Update one discrete interaction: Kxx_(i, j). Symmetric. */ + void update_Kxx(int i, int j); + + /** Update one off-diagonal precision element: Kyy_(i, j). Cholesky-based. */ + void update_Kyy_offdiag(int i, int j); + + /** Update one diagonal precision element: Kyy_(i, i). Log-scale Cholesky. */ + void update_Kyy_diag(int i); + + /** Update one cross interaction: Kxy_(i, j). */ + void update_Kxy(int i, int j); + // ========================================================================= // Edge-indicator accessor helpers // ========================================================================= From a5fe0e40b8995fffff1ce1ea49054b6ccafda678 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 18:00:24 +0100 Subject: [PATCH 07/60] feat: add mixed MRF sampler test helper and fix c3 constant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix get_constants: include diagonal L(q-1,q-1)² in c3 (was missing, causing wrong constrained diagonal) - Add test_mixed_mrf_sampler() Rcpp export for recovery tests - Add test-mixed-mrf-sampling.R (conditional PL recovery test) --- R/RcppExports.R | 4 + src/RcppExports.cpp | 23 +++ src/models/mixed/mixed_mrf_metropolis.cpp | 4 + src/test_mixed_mrf.cpp | 50 +++++ tests/testthat/test-mixed-mrf-sampling.R | 224 ++++++++++++++++++++++ 5 files changed, 305 insertions(+) create mode 100644 tests/testthat/test-mixed-mrf-sampling.R diff --git a/R/RcppExports.R b/R/RcppExports.R index 3f72d3ce..a0177aea 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -65,3 +65,7 @@ test_mixed_mrf_likelihoods <- function(discrete_observations, continuous_observa .Call(`_bgms_test_mixed_mrf_likelihoods`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed) } +test_mixed_mrf_sampler <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed) { + .Call(`_bgms_test_mixed_mrf_sampler`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed) +} + diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 7ac4c45e..b28f12c3 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -330,6 +330,28 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// test_mixed_mrf_sampler +Rcpp::List test_mixed_mrf_sampler(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, int n_warmup, int n_samples, int seed); +RcppExport SEXP _bgms_test_mixed_mrf_sampler(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP n_warmupSEXP, SEXP n_samplesSEXP, SEXP seedSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); + Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); + Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); + Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); + Rcpp::traits::input_parameter< int >::type n_warmup(n_warmupSEXP); + Rcpp::traits::input_parameter< int >::type n_samples(n_samplesSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_sampler(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -348,6 +370,7 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, {"_bgms_test_mixed_mrf_skeleton", (DL_FUNC) &_bgms_test_mixed_mrf_skeleton, 10}, {"_bgms_test_mixed_mrf_likelihoods", (DL_FUNC) &_bgms_test_mixed_mrf_likelihoods, 11}, + {"_bgms_test_mixed_mrf_sampler", (DL_FUNC) &_bgms_test_mixed_mrf_sampler, 12}, {NULL, NULL, 0} }; diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index 3c252dfd..ae0b6e46 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -169,10 +169,14 @@ static CholConstants get_constants(const arma::mat& L, int q) { c1 += L(k, qm1) * L(k, qm2); } double c2 = L(qm2, qm2); + // c3 excludes only row qm2 (the row being modified), not qm1. + // In R: sum(cholm[-(q-1), q]^2) — excludes row q-1 (1-based) = row qm2 (0-based). + // Must include L(qm1, qm1) (the diagonal entry of the last row). double c3 = 0.0; for(int k = 0; k < qm2; ++k) { c3 += L(k, qm1) * L(k, qm1); } + c3 += L(qm1, qm1) * L(qm1, qm1); // diagonal entry double c4 = c3 + c1 * c1 / (c2 * c2); return {c1, c2, c3, c4}; diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp index d296217c..2f931cee 100644 --- a/src/test_mixed_mrf.cpp +++ b/src/test_mixed_mrf.cpp @@ -161,3 +161,53 @@ Rcpp::List test_mixed_mrf_likelihoods( Rcpp::Named("ggm_ll") = ggm_ll ); } + + +// [[Rcpp::export]] +Rcpp::List test_mixed_mrf_sampler( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + bool edge_selection, + const std::string& pseudolikelihood, + int n_warmup, + int n_samples, + int seed +) { + MixedMRFModel model( + discrete_observations, + continuous_observations, + num_categories, + is_ordinal_variable, + baseline_category, + inclusion_probability, + initial_edge_indicators, + edge_selection, + pseudolikelihood, + 1.0, 1.0, 2.5, + seed + ); + + size_t full_dim = model.full_parameter_dimension(); + + // Warmup (discard samples) + for(int iter = 0; iter < n_warmup; ++iter) { + model.do_one_metropolis_step(iter); + } + + // Sampling + arma::mat samples(n_samples, full_dim); + for(int iter = 0; iter < n_samples; ++iter) { + model.do_one_metropolis_step(n_warmup + iter); + samples.row(iter) = model.get_full_vectorized_parameters().t(); + } + + return Rcpp::List::create( + Rcpp::Named("samples") = samples, + Rcpp::Named("full_parameter_dimension") = full_dim + ); +} diff --git a/tests/testthat/test-mixed-mrf-sampling.R b/tests/testthat/test-mixed-mrf-sampling.R new file mode 100644 index 00000000..9a258492 --- /dev/null +++ b/tests/testthat/test-mixed-mrf-sampling.R @@ -0,0 +1,224 @@ +# ============================================================================= +# test-mixed-mrf-sampling.R — Phase B.5 sampler correctness tests +# ============================================================================= +# Validates that do_one_metropolis_step() in MixedMRFModel produces correct +# posterior samples by comparing bgms against the mixedGM reference sampler. +# +# Because no proposal adaptation is implemented yet (Phase F), acceptance +# rates are low with the default proposal SD = 1.0. Tests use correlation +# thresholds rather than absolute agreement. + +skip_if_not_installed("mixedGM") + +# --------------------------------------------------------------------------- +# Helper: extract parameter matrices from bgms sample matrix +# --------------------------------------------------------------------------- +# The vectorization order in bgms is: +# 1. mux: per-variable, C_s thresholds each (for ordinal) +# 2. Kxx: upper-triangular, row-major +# 3. muy: q means +# 4. Kyy: upper-triangle including diagonal +# 5. Kxy: p*q entries, row-major +extract_bgms_estimates = function(samples, p, q, num_cats_bgms) { + S = colMeans(samples) + idx = 1L + + # 1. mux (per-variable: C_s thresholds each) + max_cat = max(num_cats_bgms) + mux = matrix(0, p, max_cat) + for(s in 1:p) { + for(c in seq_len(num_cats_bgms[s])) { + mux[s, c] = S[idx]; idx = idx + 1L + } + } + + # 2. Kxx upper-tri + Kxx = matrix(0, p, p) + for(i in 1:(p - 1)) for(j in (i + 1):p) { + Kxx[i, j] = Kxx[j, i] = S[idx]; idx = idx + 1L + } + + # 3. muy + muy = S[idx:(idx + q - 1)]; idx = idx + q + + # 4. Kyy upper-tri + diag + Kyy = matrix(0, q, q) + for(i in 1:q) for(j in i:q) { + Kyy[i, j] = Kyy[j, i] = S[idx]; idx = idx + 1L + } + + # 5. Kxy row-major + Kxy = matrix(S[idx:(idx + p * q - 1)], nrow = p, ncol = q, byrow = TRUE) + + list(mux = mux, Kxx = Kxx, muy = muy, Kyy = Kyy, Kxy = Kxy) +} + + +# =========================================================================== +# Test 1: ordinal simulation recovery (3-category, p=3, q=2, n=1000) +# =========================================================================== +test_that("conditional PL sampler recovers parameters (ordinal simulation)", { + skip_on_cran() + + p = 3L; q = 2L; n = 1000L + + Kxx_true = matrix(c(0, 0.4, -0.2, + 0.4, 0, 0.3, + -0.2, 0.3, 0), 3, 3) + Kxy_true = matrix(c(0.2, -0.1, 0.15, + 0.1, 0.3, -0.2), nrow = p, ncol = q) + Kyy_true = matrix(c(1.3, 0.2, 0.2, 1.1), 2, 2) + mux_true = matrix(c(0.5, -0.5, 0.3, + -0.3, -1.0, -0.5), nrow = p, ncol = 2) + muy_true = c(0.5, -0.3) + + set.seed(456) + sim = mixedGM::mixed_gibbs_generate( + n = n, Kxx = Kxx_true, Kxy = Kxy_true, Kyy = Kyy_true, + mux = mux_true, muy = muy_true, + num_categories = rep(3L, p), n_burnin = 1000 + ) + + # --- run mixedGM (with Robbins-Monro adaptation) --- + set.seed(42) + mgm = mixedGM::mixed_sampler( + x = sim$x, y = sim$y, num_categories = rep(3L, p), + n_warmup = 4000L, n_samples = 8000L, + edge_selection = FALSE, verbose = FALSE, + pseudolikelihood = "conditional" + ) + mgm_est = mgm$final_parameters + + # --- run bgms (no adaptation) --- + num_cats_bgms = rep(2L, p) # max category index + pq = p + q + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + sim$x, sim$y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, FALSE, "conditional", + 4000L, 8000L, 42L + ) + bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) + + # --- correlations bgms vs mixedGM (r >= 0.95) --- + kxx_ut = upper.tri(bgms_est$Kxx) + expect_gt( + cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.95, + label = "Kxx bgms-mgm correlation" + ) + expect_gt( + cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.95, + label = "Kxy bgms-mgm correlation" + ) + expect_gt( + cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.95, + label = "Kyy bgms-mgm correlation" + ) + expect_gt( + cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.95, + label = "mux bgms-mgm correlation" + ) + + # --- signs agree with truth --- + expect_true( + all(sign(bgms_est$Kxx[kxx_ut]) == sign(Kxx_true[kxx_ut])), + label = "Kxx signs match truth" + ) +}) + + +# =========================================================================== +# Test 2: real data cross-validation (Wenchuan, ordinal + continuous) +# =========================================================================== +test_that("conditional PL sampler agrees with mixedGM on Wenchuan data", { + skip_on_cran() + + data(Wenchuan, package = "bgms") + W = na.omit(Wenchuan) + + p = 4L; q = 2L + x = as.matrix(W[, 1:p]) - 1L # convert 1-5 to 0-4 + y = as.matrix(W[, (p + 1):(p + q)]) + + num_cats_mgm = rep(5L, p) # total categories for mixedGM + num_cats_bgms = rep(4L, p) # max category index for bgms + + # --- mixedGM --- + set.seed(42) + mgm = mixedGM::mixed_sampler( + x = x, y = y, num_categories = num_cats_mgm, + n_warmup = 4000L, n_samples = 8000L, + edge_selection = FALSE, verbose = FALSE, + pseudolikelihood = "conditional" + ) + mgm_est = mgm$final_parameters + + # --- bgms --- + pq = p + q + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, FALSE, "conditional", + 4000L, 8000L, 42L + ) + bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) + + # --- correlations bgms vs mixedGM (r >= 0.95) --- + kxx_ut = upper.tri(bgms_est$Kxx) + expect_gt( + cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.95, + label = "Kxx bgms-mgm correlation (Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.95, + label = "Kxy bgms-mgm correlation (Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.95, + label = "Kyy bgms-mgm correlation (Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.95, + label = "mux bgms-mgm correlation (Wenchuan)" + ) + + # --- Kxx sign patterns agree --- + expect_true( + all(sign(bgms_est$Kxx[kxx_ut]) == sign(mgm_est$Kxx[kxx_ut])), + label = "Kxx signs agree (Wenchuan)" + ) +}) + + +# =========================================================================== +# Test 3: sampler does not crash on Kyy updates (c3 regression test) +# =========================================================================== +test_that("Kyy updates do not crash (c3 get_constants regression)", { + # Minimal setup: p=2, q=2 binary triggers the c3 code path + # where L(qm1,qm1)^2 must be included in the sum. + set.seed(99) + n = 50L; p = 2L; q = 2L + x = matrix(sample(0:1, n * p, replace = TRUE), n, p) + y = matrix(rnorm(n * q), n, q) + + pq = p + q + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + # If c3 bug is present, this crashes with "chol(): decomposition failed" + result = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(c(1L, 1L)), + as.integer(c(1L, 1L)), c(0L, 0L), + inc_prob, edge_ind, FALSE, "conditional", + 100L, 100L, 123L + ) + + expect_equal(nrow(result$samples), 100L) + expect_true(all(is.finite(result$samples))) +}) From ede74a14fa7ac6174e1b94778250f0713998b7ad Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 18:00:40 +0100 Subject: [PATCH 08/60] docs: add Phase B+ rank-1 Cholesky optimization plan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Phase B+ (10 sub-steps) for replacing O(q³) permute-based Kyy updates with GGM-style rank-1 Cholesky infrastructure - Add B+.10 rank-2 quadratic-form shortcut (O(nq) vs O(npq+nq²)) - Design decision: keep Cholesky over Woodbury-only for PD safety - Add tests T28-T30, commits 6a-6d to planned schedule - Update risk register, reuse inventory, and table of contents --- dev/mixedmrf/implementation_plan.md | 355 +++++++++++++++++++++++++++- 1 file changed, 342 insertions(+), 13 deletions(-) diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index f6d1243a..0f1d63f4 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -78,15 +78,16 @@ OMRF code directly rather than ported from mixedGM (see §1 and Phase B/C). 5. [Implementation phases](#5-implementation-phases) 6. [Phase A — Skeleton and data structures](#phase-a--skeleton-and-data-structures) 7. [Phase B — Conditional pseudo-likelihood](#phase-b--conditional-pseudo-likelihood) -8. [Phase C — Marginal pseudo-likelihood](#phase-c--marginal-pseudo-likelihood) -9. [Phase D — Edge selection](#phase-d--edge-selection) -10. [Phase E — R interface and integration](#phase-e--r-interface-and-integration) -11. [Phase F — Warmup, adaptation, and diagnostics](#phase-f--warmup-adaptation-and-diagnostics) -12. [Phase G — Simulation and prediction](#phase-g--simulation-and-prediction) -13. [Testing strategy](#testing-strategy) -14. [Reuse inventory](#reuse-inventory) -15. [Risk register](#risk-register) -16. [PR and commit strategy](#pr-and-commit-strategy) +8. [Phase B+ — Rank-1 Cholesky optimization](#phase-b--rank-1-cholesky-optimization) +9. [Phase C — Marginal pseudo-likelihood](#phase-c--marginal-pseudo-likelihood) +10. [Phase D — Edge selection](#phase-d--edge-selection) +11. [Phase E — R interface and integration](#phase-e--r-interface-and-integration) +12. [Phase F — Warmup, adaptation, and diagnostics](#phase-f--warmup-adaptation-and-diagnostics) +13. [Phase G — Simulation and prediction](#phase-g--simulation-and-prediction) +14. [Testing strategy](#testing-strategy) +15. [Reuse inventory](#reuse-inventory) +16. [Risk register](#risk-register) +17. [PR and commit strategy](#pr-and-commit-strategy) --- @@ -308,9 +309,10 @@ add the new Rcpp export to `src/RcppExports.cpp`, `R/RcppExports.R`, and |-------|------|------------|-------------| | **A** | Skeleton: class, data structures, `BaseModel` overrides | — | Compiles, no sampling | | **B** | Conditional PL: all 5 MH updates, no edge selection | A | Recovery test passes (cond PL, estimation only) | -| **C** | Marginal PL: $\Theta$ caching, marginal OMRF, $\mu_y$ full sweep | B | Recovery test passes (marg PL, estimation only) | -| **D** | Edge selection: 3 RJ sweeps | B | Structure recovery test passes | -| **E** | R interface: `bgm()` dispatch, output formatting | B | End-to-end `bgm(mixed_data)` works | +| **B+** | Rank-1 Cholesky optimization for Kyy updates | B | Same correctness, $O(q^2)$ per Kyy move instead of $O(q^3)$ | +| **C** | Marginal PL: $\Theta$ caching, marginal OMRF, $\mu_y$ full sweep | B+ | Recovery test passes (marg PL, estimation only) | +| **D** | Edge selection: 3 RJ sweeps | B+ | Structure recovery test passes | +| **E** | R interface: `bgm()` dispatch, output formatting | B+ | End-to-end `bgm(mixed_data)` works | | **F** | Warmup schedule, adaptation, diagnostics | E | Full warmup pipeline | | **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | @@ -690,6 +692,11 @@ conditional mean depends on $K_{yy}^{-1}$, so each proposal evaluates the full `log_conditional_ggm()` with freshly computed `Kyy_inv_` and `conditional_mean_`. +**Status (Phase B):** The current implementation follows the mixedGM +permute-then-Cholesky approach ($O(q^3)$ per Kyy move). Phase B+ replaces +this with the GGM's rank-1 infrastructure to bring it down to $O(q^2)$. +See [Phase B+](#phase-b--rank-1-cholesky-optimization) for the detailed plan. + **Jacobian for diagonal Kyy proposals.** The diagonal element is proposed on the log scale to guarantee positivity: ``` @@ -780,6 +787,301 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { --- +## Phase B+ — Rank-1 Cholesky optimization + +The Phase B implementation ports the mixedGM permute-then-Cholesky approach +for $K_{yy}$ updates: each proposal calls `arma::chol` ($O(q^3)$), evaluates +the full `log_conditional_ggm()` twice (proposed and current), and recomputes +all caches from scratch on acceptance. The GGM model avoids this entirely +with rank-1 Cholesky updates, log-likelihood ratios via the matrix +determinant lemma, and cached covariance. Phase B+ brings the same +infrastructure to the mixed model. + +**Design decision: Cholesky over Woodbury.** An alternative is to +maintain only $(K_{yy}, \Sigma_{yy}, \log|K_{yy}|)$ and update +$\Sigma_{yy}$ directly via the Woodbury identity, dropping the Cholesky +factor entirely (fewer members, simpler code). The asymptotic cost is +identical — both eliminate the $O(q^3)$ bottleneck — but the Cholesky +factor provides a structural positive-definiteness guarantee between +periodic full recomputes, while a Woodbury-only covariance can silently +lose symmetry or PD from floating-point drift. We therefore keep the +Cholesky factor. The Woodbury-only variant remains a future option to +investigate if profiling shows the Cholesky maintenance constant matters. + +### B+.0 Why this matters now + +Every subsequent phase (C, D, E, F) exercises $K_{yy}$ updates. Marginal PL +(Phase C) adds $\sum_s$ `marg_omrf(s)` to every $K_{yy}$ acceptance ratio, +and edge selection (Phase D) adds Cholesky-based birth/death moves for +$G_{yy}$. Optimizing $K_{yy}$ after those phases are built means +retrofitting the rank-1 machinery into more code paths. Doing it now, while +only `update_Kyy_offdiag` and `update_Kyy_diag` exist, is cleaner. + +### B+.1 Add GGM-style member variables + +New members in `MixedMRFModel` (mirroring `GGMModel`): + +```cpp +// --- Cholesky workspace (Phase B+) --- +arma::mat covariance_yy_; // q × q Kyy^{-1}, replaces Kyy_inv_ +arma::mat inv_cholesky_yy_; // q × q R^{-1} where Kyy = R'R +std::array kyy_constants_; // reparametrization constants +arma::mat precision_yy_proposal_; // q × q scratch for proposed Kyy +arma::vec v1_, v2_; // 2-vectors for rank-2 decomposition +arma::vec vf1_, vf2_; // q-vectors (full-size update vectors) +arma::vec u1_, u2_; // q-vectors (decomposed rank-1 vectors) +``` + +`Kyy_inv_` is renamed to `covariance_yy_` for clarity (it is the covariance +$\Sigma_{yy} = K_{yy}^{-1}$). `Kyy_chol_` is retained as the upper +Cholesky factor. + +### B+.2 Port `get_constants` and `constrained_diagonal` (no-permutation form) + +Replace the current permutation-based `get_constants(const arma::mat& L, +int q)` and `constrained_diagonal(double omega, const CholConstants& C)` +with the GGM's direct-indexing approach that reads constants from +`covariance_yy_` without permuting: + +```cpp +void MixedMRFModel::get_kyy_constants(int i, int j) { + double logdet = get_log_det(Kyy_chol_); + double log_adj_ii = logdet + std::log(std::abs(covariance_yy_(i, i))); + double log_adj_ij = logdet + std::log(std::abs(covariance_yy_(i, j))); + double log_adj_jj = logdet + std::log(std::abs(covariance_yy_(j, j))); + + double inv_sub = compute_inv_submatrix_i(covariance_yy_, i, j, j); + double log_abs_inv_sub = log_adj_ii + std::log(std::abs(inv_sub)); + + double Phi_q1q = (2 * std::signbit(covariance_yy_(i, j)) - 1) + * std::exp(log_adj_ij - (log_adj_jj + log_abs_inv_sub) / 2); + double Phi_q1q1 = std::exp((log_adj_jj - log_abs_inv_sub) / 2); + + kyy_constants_[0] = Phi_q1q; + kyy_constants_[1] = Phi_q1q1; + kyy_constants_[2] = Kyy_(i, j) - Phi_q1q * Phi_q1q1; // c1 + kyy_constants_[3] = Phi_q1q1; // c2 + kyy_constants_[4] = Kyy_(j, j) - Phi_q1q * Phi_q1q; // c3 + kyy_constants_[5] = kyy_constants_[4] + + kyy_constants_[2] * kyy_constants_[2] + / (kyy_constants_[3] * kyy_constants_[3]); // c4 +} +``` + +This is `GGMModel::get_constants` operating on the $q \times q$ precision +and covariance pair instead of the GGM's $p \times p$ pair. The helper +`compute_inv_submatrix_i` and `get_log_det` are reused directly from +`GGMModel` (they are pure algebra with no model-specific state). + +### B+.3 Implement `log_ggm_ratio_edge(int i, int j)` — rank-2 log-LR + +The GGM's `log_density_impl_edge` computes the log-likelihood **ratio** +for a 2-element change $\Delta\omega_{ij}, \Delta\omega_{jj}$ using the +matrix determinant lemma. The formula involves: + +1. **Log-determinant ratio** from the $2 \times 2$ Schur complement. +2. **Trace ratio** from the sufficient statistic $S = X^\top X$. + +For the mixed model's conditional GGM, the sufficient statistic is +$S^* = D^\top D$ where $D = Y - M$. The key question is whether $S^*$ +remains fixed when only $K_{yy}$ changes. + +**It does not.** The conditional mean $M = \mathbf{1}\mu_y^\top + 2\,X\,K_{xy}\,K_{yy}^{-1}$ depends on $K_{yy}^{-1}$. However, the +Cholesky-based proposal changes $K_{yy}$ by a structured rank-2 +perturbation (off-diagonal + constrained diagonal), and the +corresponding rank-2 change in $K_{yy}^{-1}$ (via the Woodbury identity) +can be computed in $O(q)$ from the update vectors. + +The `log_ggm_ratio_edge` function therefore: + +1. Computes the log-det ratio using the same $2 \times 2$ determinant + lemma as the GGM: $O(q)$ from covariance entries. +2. Computes the proposed covariance $\Sigma'_{yy}$ via rank-2 Woodbury + update on `covariance_yy_`: $O(q^2)$. +3. Computes the proposed conditional mean $M' = \mathbf{1}\mu_y^\top + + 2\,X\,K_{xy}\,\Sigma'_{yy}$: $O(npq)$ (matrix multiply, but this is + the same cost as `recompute_conditional_mean` so no regression). +4. Computes the proposed quadratic form $\text{tr}(K'_{yy} (Y-M')^\top (Y-M'))$ + using the proposed precision and residuals. +5. Returns the full log-likelihood ratio including both log-det and + quadratic-form changes. + +The initial implementation recomputes the full conditional mean +$M'$, making step 3 the bottleneck at $O(npq)$. Step B+.10 eliminates +this by exploiting the rank-2 structure of $\Sigma'_{yy} - \Sigma_{yy}$. + +### B+.4 Implement `log_ggm_ratio_diag(int i)` — rank-1 log-LR + +Same approach as B+.3 but for a diagonal-only change. The rank-1 case +is simpler (1 × 1 Schur complement, single Woodbury vector). Mirrors +`GGMModel::log_density_impl_diag`. + +### B+.5 Implement rank-1 Cholesky update after acceptance + +Port `GGMModel::cholesky_update_after_edge` and +`cholesky_update_after_diag` to operate on `Kyy_chol_`, +`inv_cholesky_yy_`, and `covariance_yy_`: + +```cpp +void MixedMRFModel::cholesky_update_after_kyy_edge( + double omega_ij_old, double omega_jj_old, int i, int j) +{ + // Decompose rank-2 Omega change into 2 rank-1 ops (same as GGM) + v2_[0] = omega_ij_old - precision_yy_proposal_(i, j); + v2_[1] = (omega_jj_old - precision_yy_proposal_(j, j)) / 2; + vf1_[i] = v1_[0]; vf1_[j] = v1_[1]; + vf2_[i] = v2_[0]; vf2_[j] = v2_[1]; + u1_ = (vf1_ + vf2_) / std::sqrt(2.0); + u2_ = (vf1_ - vf2_) / std::sqrt(2.0); + + cholesky_update(Kyy_chol_, u1_); + cholesky_downdate(Kyy_chol_, u2_); + + arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); + covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); + Kyy_log_det_ = get_log_det(Kyy_chol_); + + vf1_[i] = 0; vf1_[j] = 0; + vf2_[i] = 0; vf2_[j] = 0; +} +``` + +The Cholesky update/downdate calls are $O(q^2)$ each. Inverting the +triangular factor and forming `covariance_yy_` is also $O(q^2)$ (back- +substitution + symmetric product). Total: $O(q^2)$ vs. the current +$O(q^3)$. + +After the Cholesky update, recompute `conditional_mean_` (and `Theta_` +if marginal PL) as before — those are independent of the Cholesky +strategy. + +### B+.6 Rewrite `update_Kyy_offdiag` and `update_Kyy_diag` + +Replace the permute-then-Cholesky implementation with: + +``` +update_Kyy_offdiag(i, j): + get_kyy_constants(i, j) + propose phi' ~ N(Phi_q1q, sigma) + map to omega'_ij, omega'_jj via constrained_diagonal + fill precision_yy_proposal_ + ln_alpha = log_ggm_ratio_edge(i, j) // rank-2 log-LR + + prior ratio (Cauchy off-diag + Gamma diag) + if accept: + old_ij = Kyy_(i,j); old_jj = Kyy_(j,j) + Kyy_ = precision_yy_proposal_ (only 3 entries changed) + cholesky_update_after_kyy_edge(old_ij, old_jj, i, j) + recompute_conditional_mean() + if marginal: recompute_Theta() +``` + +The current save-evaluate-restore-evaluate-compare pattern is replaced +by a single log-ratio call. No full `log_conditional_ggm()` evaluation +is needed. + +### B+.7 Remove permutation helpers + +Delete `make_perm_offdiag`, `make_perm_diag`, `permute_matrix`, +`get_constants(const arma::mat& L, int q)`, `constrained_diagonal(double, +CholConstants)`, and the `CholConstants` struct from +`mixed_mrf_metropolis.cpp`. They are fully superseded by the GGM-style +functions. + +### B+.8 Functions reused from GGM + +| Function | Source | Reuse form | +|----------|--------|------------| +| `cholesky_update` / `cholesky_downdate` | `cholupdate.h` | Direct call | +| `get_log_det` | `GGMModel` | Copy as free function or method | +| `compute_inv_submatrix_i` | `GGMModel` | Copy as free function or method | +| `constrained_diagonal` (GGM form) | `GGMModel` | Adapted as `kyy_constrained_diagonal` | + +`get_log_det` and `compute_inv_submatrix_i` are currently private methods +of `GGMModel`. They are pure algebra with no model state. Options: + +- **(a)** Extract to a shared utility header (`src/math/cholesky_helpers.h`) + and include from both models. +- **(b)** Duplicate as private methods on `MixedMRFModel`. + +Option (a) is preferred (avoids code duplication and makes the shared +algebra explicit), but option (b) is acceptable if the extraction touches +too many files for this phase. + +### B+.9 Testing checkpoint + +**Correctness (non-negotiable):** +- Existing `test-mixed-mrf-likelihoods.R` must still pass unchanged + (likelihood functions are not modified). +- Existing `test-mixed-mrf-sampling.R` must still pass (recovery results + must be identical at the same seed). +- New test: for a known $K_{yy}$ proposal, verify that `log_ggm_ratio_edge` + equals `log_conditional_ggm(proposed) - log_conditional_ggm(current)` + to machine precision (T28). +- New test: verify rank-1 Cholesky update produces the same + `Kyy_chol_`, `covariance_yy_`, `Kyy_log_det_` as a full recompute (T29). + +**Performance (informational):** +- Benchmark `update_Kyy_offdiag` before and after on a $q = 20$ problem. + Expected speedup: order of magnitude for the Cholesky portion. + +### B+.10 Rank-2 quadratic-form shortcut + +After B+.3–B+.6 are working, the remaining bottleneck in +`log_ggm_ratio_edge` is the $O(npq)$ conditional-mean recompute (step 3) +followed by the $O(nq^2)$ quadratic form (step 4). Both can be reduced +by exploiting the rank-2 structure of the covariance change. + +The Woodbury identity gives: + +$$\Sigma'_{yy} - \Sigma_{yy} = \Delta\Sigma$$ + +where $\Delta\Sigma$ is a rank-2 matrix (it comes from the rank-2 +perturbation of $K_{yy}$). The conditional-mean change is: + +$$\Delta M = M' - M = 2\,X\,K_{xy}\,\Delta\Sigma$$ + +Since $\Delta\Sigma$ is rank 2, $\Delta M$ is an $n \times q$ matrix of +rank at most 2. Write $\Delta\Sigma = a\,b^\top + b\,a^\top$ (or its +actual Woodbury form) and define the two $n$-vectors +$g_1 = 2\,X\,K_{xy}\,a$ and $g_2 = 2\,X\,K_{xy}\,b$. Then: + +$$\Delta M = g_1\,b^\top + g_2\,a^\top$$ + +The proposed residual is $D' = D - \Delta M$. The quadratic-form +difference becomes: + +$$\text{tr}(K'_{yy}\,D'^\top D') - \text{tr}(K_{yy}\,D^\top D) + = \text{tr}(\Delta K_{yy}\,D^\top D) + - 2\,\text{tr}(K'_{yy}\,D^\top \Delta M) + + \text{tr}(K'_{yy}\,\Delta M^\top \Delta M)$$ + +Each term can be evaluated without forming the full $n \times q$ +matrices $M'$ or $D'$: + +- $\text{tr}(\Delta K_{yy}\,D^\top D)$: $\Delta K_{yy}$ is nonzero at + 3 entries, and $D^\top D$ is the cached sufficient statistic $S^*$. + Cost: $O(1)$. +- $\text{tr}(K'_{yy}\,D^\top \Delta M)$: Compute $D^\top g_1$ and + $D^\top g_2$ ($O(nq)$ each), then contract with $K'_{yy} b$ and + $K'_{yy} a$ ($O(q^2)$ each). Total: $O(nq)$. +- $\text{tr}(K'_{yy}\,\Delta M^\top \Delta M)$: Inner products of + $g_1, g_2$ ($O(n)$ each) contracted with a $2 \times 2$ block from + $a^\top K'_{yy}\,b$ etc. Total: $O(n + q^2)$. + +Overall cost: $O(nq)$ instead of $O(npq + nq^2)$. This also eliminates +the need to store the $n \times q$ proposed conditional mean. + +**Pre-condition:** $D^\top D$ (the current residual cross-product) must be +cached. Add a member `suf_stat_ggm_` ($q \times q$) updated after every +accepted move that changes $K_{yy}$, $K_{xy}$, or $\mu_y$. + +**Testing:** +- T30: For a known proposal, verify the shortcut quadratic-form difference + matches the brute-force computation to machine precision. +- Existing T28 still covers end-to-end log-ratio agreement. + +--- + ## Phase C — Marginal pseudo-likelihood ### C.1 Implement `log_marginal_omrf(int s)` @@ -984,6 +1286,16 @@ denominator as needed. ## Phase E — R interface and integration +### E.0 Remove `src/test_mixed_mrf.cpp` + +Delete `src/test_mixed_mrf.cpp` once `sample_mixed.cpp` provides the +production Rcpp interface (E.1). The test helpers +(`test_mixed_mrf_skeleton`, `test_mixed_mrf_likelihoods`, +`test_mixed_mrf_sampler`) were scaffolding for Phases A–B; their +functionality is superseded by the real entry point and should not ship +in the installed package. Update `src/RcppExports.cpp` and +`R/RcppExports.R` accordingly (re-run `Rcpp::compileAttributes()`). + ### E.1 Create `sample_mixed.cpp` Rcpp interface function `sample_mixed_mrf_cpp(...)`: @@ -1173,6 +1485,14 @@ Cross-reference the existing mixedGM test files for each scenario: | T11 | BC marginal OMRF | Same as T10 but for `log_marginal_omrf(s)` | | T12 | BC observation centering | Verify that centered observations + `compute_denom_blume_capel` produce the same result as the standalone `OMRFModel` | +### Rank-1 Cholesky optimization tests (Phase B+) + +| Test | What | How | +|------|------|-----| +| T28 | Log-ratio agreement | For a known $K_{yy}$ off-diag proposal, verify `log_ggm_ratio_edge(i,j)` equals `log_conditional_ggm(proposed) - log_conditional_ggm(current)` to machine precision | +| T29 | Cholesky update fidelity | After rank-1 update, verify `Kyy_chol_`, `covariance_yy_`, `Kyy_log_det_` match a full `arma::chol` / `arma::inv` recompute | +| T30 | Rank-2 quadratic shortcut | For a known proposal, verify the B+.10 shortcut quadratic-form difference matches brute-force computation to machine precision | + ### Integration tests (sampling correctness) | Test | What | How | @@ -1235,6 +1555,10 @@ Cross-reference the existing mixedGM test files for each scenario: | Component | Source | Reuse type | |-----------|--------|------------| | Cholesky update/downdate | `src/models/ggm/cholupdate.h` | Direct include | +| `get_log_det` | `GGMModel` | Extract to shared utility or copy (Phase B+) | +| `compute_inv_submatrix_i` | `GGMModel` | Extract to shared utility or copy (Phase B+) | +| Rank-2 log-LR pattern | `GGMModel::log_density_impl_edge` | Adapt for observation-dependent mean (Phase B+) | +| Rank-2 Cholesky decomposition | `GGMModel::cholesky_update_after_edge` | Port to $q \times q$ Kyy workspace (Phase B+) | | Log-sum-exp stabilization | `OMRFModel::compute_logZ_*` | Adapt pattern | | Ordinal denominator | `src/utils/variable_helpers.{h,cpp}` `compute_denom_ordinal` | Direct call | | Blume-Capel denominator | `src/utils/variable_helpers.{h,cpp}` `compute_denom_blume_capel` | Direct call | @@ -1256,7 +1580,7 @@ Cross-reference the existing mixedGM test files for each scenario: | Risk | Impact | Mitigation | |------|--------|------------| -| Kyy inversion per MH step is $O(q^3)$ | Slow for large $q$ | Cache `Kyy_inv_`; incremental rank-1 updates after Cholesky proposals | +| Kyy inversion per MH step is $O(q^3)$ | Slow for large $q$ | Phase B+: rank-1 Cholesky updates + GGM-style log-ratio shortcut bring per-move cost to $O(q^2)$ | | Marginal PL $\mu_y$ update evaluates all $p$ OMRF terms | Slow for large $p$ | Cache rest-scores; provide conditional PL as faster default | | $\Theta$ recomputation after every $K_{yy}$/$K_{xy}$ change | $O(p^2 q + pq^2)$ | Defer $\Theta$ recompute to once per accepted move, not per-element; proposed-state uses a temporary (Phase B.2, C.3) | | Edge selection order effects | Bias | Shuffle edge order each iteration (already done in OMRF) | @@ -1265,6 +1589,7 @@ Cross-reference the existing mixedGM test files for each scenario: | Factor 2 convention mismatch | Wrong posteriors | Document consistently; unit-test against R prototype | | PD violation during Kyy proposals | Crash | Cholesky-based proposals guarantee PD by construction | | Large parameter space mixing | Poor ESS | Per-parameter Robbins-Monro; future: block updates or HMC | +| Cholesky maintenance constant | Moderate overhead for small $q$ | Investigate Woodbury-only covariance update (same asymptotics, fewer members, but weaker PD guarantee; see Phase B+ design decision) | | Blume-Capel not in prototype | No mixedGM reference for BC paths | Adapt from bgms `OMRFModel`; validated via OMRF-vs-mixed comparison tests (T10-T12) | --- @@ -1309,6 +1634,10 @@ principle 1 (green build) and principle 2 (one logical concern). | 4 | `test` | `test: add mixed MRF likelihood unit tests` | B.1 | `test-mixed-mrf-likelihood.R`: T1–T3 (compare C++ vs R fixtures), T7 (analytic Gaussian), T10–T12 (BC-specific). | | 5 | `feat` | `feat: add conditional PL Metropolis updates` | B.3–B.4 | `mixed_mrf_metropolis.cpp`: 6 MH update functions (main effect, muy, Kxx, Kyy off-diag, Kyy diag, Kxy) + static Cholesky helpers + `do_one_metropolis_step` 5-step sweep. | | 6 | `test` | `test: add conditional PL recovery test` | B.5 | `test-mixed-mrf-sampling.R`: T13 (conditional PL parameter recovery, estimation only). | +| 6a | `refactor` | `refactor: rank-1 Cholesky optimization for Kyy updates` | B+ | Replace permute-based $O(q^3)$ Kyy updates with GGM-style rank-1 infrastructure. Shared utility for `get_log_det` / `compute_inv_submatrix_i`. | +| 6b | `test` | `test: add rank-1 Cholesky correctness tests` | B+ | T28 (log-ratio agreement), T29 (Cholesky update fidelity). Verify existing tests still pass at same seed. | +| 6c | `refactor` | `refactor: rank-2 quadratic-form shortcut for Kyy log-ratio` | B+.10 | Exploit rank-2 structure of $\Delta\Sigma$ to reduce log-ratio cost from $O(npq + nq^2)$ to $O(nq)$. Cache `suf_stat_ggm_`. | +| 6d | `test` | `test: add quadratic shortcut correctness test` | B+.10 | T30 (shortcut vs brute-force agreement). | | 7 | `feat` | `feat: add marginal PL mode and Theta caching` | C | `log_marginal_omrf`, Theta cache, marginal-mode branches in MH updates. | | 8 | `test` | `test: add marginal PL recovery and comparison tests` | C.5 | T14 (marginal PL recovery), T16 (cond vs marginal agreement). | | 9 | `feat` | `feat: add mixed MRF edge selection` | D | `mixed_mrf_edge_selection.cpp`: RJ sweeps for Kxx, Kyy, Kxy. `update_edge_indicators`, `initialize_graph`, `prepare_iteration`. | From e65ae57ccfcc3903fceda71b0f3c67029e0c43a2 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 19:56:09 +0100 Subject: [PATCH 09/60] refactor: rank-1 Cholesky optimization for Kyy updates (audit #6a) --- src/math/cholesky_helpers.h | 45 +++ src/models/ggm/ggm_model.cpp | 17 +- src/models/ggm/ggm_model.h | 20 +- src/models/mixed/mixed_mrf_likelihoods.cpp | 4 +- src/models/mixed/mixed_mrf_metropolis.cpp | 405 +++++++++++++-------- src/models/mixed/mixed_mrf_model.cpp | 36 +- src/models/mixed/mixed_mrf_model.h | 60 ++- 7 files changed, 380 insertions(+), 207 deletions(-) create mode 100644 src/math/cholesky_helpers.h diff --git a/src/math/cholesky_helpers.h b/src/math/cholesky_helpers.h new file mode 100644 index 00000000..4bbf09e2 --- /dev/null +++ b/src/math/cholesky_helpers.h @@ -0,0 +1,45 @@ +#pragma once + +/** + * @file cholesky_helpers.h + * @brief Shared algebraic helpers for Cholesky-based precision updates. + * + * Pure functions with no model-specific state. Used by both GGMModel and + * MixedMRFModel for proposal constant extraction and log-determinant + * computation. + */ + +#include +#include + +namespace cholesky_helpers { + +/** + * Log-determinant of a positive-definite matrix from its upper-triangular + * Cholesky factor R (where Ω = R'R). + * + * @param R Upper-triangular Cholesky factor. + * @return log|Ω| = 2 Σ log(R_ii). + */ +inline double get_log_det(const arma::mat& R) { + return 2.0 * arma::accu(arma::log(R.diag())); +} + +/** + * Schur complement element: A(ii,jj) − A(ii,i) A(jj,i) / A(i,i). + * + * Used to compute entries of the inverse of a submatrix from the full + * covariance matrix. + * + * @param A Symmetric positive-definite matrix. + * @param i Conditioning index. + * @param ii Row index of the desired element. + * @param jj Column index of the desired element. + * @return Schur complement entry. + */ +inline double compute_inv_submatrix_i(const arma::mat& A, size_t i, + size_t ii, size_t jj) { + return A(ii, jj) - A(ii, i) * A(jj, i) / A(i, i); +} + +} // namespace cholesky_helpers diff --git a/src/models/ggm/ggm_model.cpp b/src/models/ggm/ggm_model.cpp index 725cca17..573d37df 100644 --- a/src/models/ggm/ggm_model.cpp +++ b/src/models/ggm/ggm_model.cpp @@ -4,19 +4,15 @@ #include "mcmc/execution/step_result.h" #include "mcmc/execution/warmup_schedule.h" -double GGMModel::compute_inv_submatrix_i(const arma::mat& A, const size_t i, const size_t ii, const size_t jj) const { - return(A(ii, jj) - A(ii, i) * A(jj, i) / A(i, i)); -} - void GGMModel::get_constants(size_t i, size_t j) { - double logdet_omega = get_log_det(cholesky_of_precision_); + double logdet_omega = cholesky_helpers::get_log_det(cholesky_of_precision_); double log_adj_omega_ii = logdet_omega + std::log(std::abs(covariance_matrix_(i, i))); double log_adj_omega_ij = logdet_omega + std::log(std::abs(covariance_matrix_(i, j))); double log_adj_omega_jj = logdet_omega + std::log(std::abs(covariance_matrix_(j, j))); - double inv_omega_sub_j1j1 = compute_inv_submatrix_i(covariance_matrix_, i, j, j); + double inv_omega_sub_j1j1 = cholesky_helpers::compute_inv_submatrix_i(covariance_matrix_, i, j, j); double log_abs_inv_omega_sub_jj = log_adj_omega_ii + std::log(std::abs(inv_omega_sub_j1j1)); double Phi_q1q = (2 * std::signbit(covariance_matrix_(i, j)) - 1) * std::exp( (log_adj_omega_ij - (log_adj_omega_jj + log_abs_inv_omega_sub_jj) / 2) @@ -40,14 +36,9 @@ double GGMModel::constrained_diagonal(const double x) const { } } -double GGMModel::get_log_det(arma::mat triangular_A) const { - // log-determinant of A'A where A is upper-triangular Cholesky factor - return 2 * arma::accu(arma::log(triangular_A.diag())); -} - double GGMModel::log_density_impl(const arma::mat& omega, const arma::mat& phi) const { - double logdet_omega = get_log_det(phi); + double logdet_omega = cholesky_helpers::get_log_det(phi); double trace_prod = arma::accu(omega % suf_stat_); double log_likelihood = n_ * (p_ * log(2 * arma::datum::pi) / 2 + logdet_omega / 2) - trace_prod / 2; @@ -173,7 +164,7 @@ void GGMModel::cholesky_update_after_edge(double omega_ij_old, double omega_jj_o } void GGMModel::update_diagonal_parameter(size_t i, int iteration) { - double logdet_omega = get_log_det(cholesky_of_precision_); + double logdet_omega = cholesky_helpers::get_log_det(cholesky_of_precision_); double logdet_omega_sub_ii = logdet_omega + std::log(covariance_matrix_(i, i)); size_t e = i * (i + 3) / 2; // parameter index in vectorized form (column-major upper triangle, i==j) diff --git a/src/models/ggm/ggm_model.h b/src/models/ggm/ggm_model.h index 235998a6..b79076e3 100644 --- a/src/models/ggm/ggm_model.h +++ b/src/models/ggm/ggm_model.h @@ -3,6 +3,7 @@ #include #include #include "models/base_model.h" +#include "math/cholesky_helpers.h" #include "rng/rng_utils.h" @@ -388,17 +389,7 @@ class GGMModel : public BaseModel { */ void get_constants(size_t i, size_t j); - /** - * Compute the (ii, jj) entry of the Schur complement of A with - * row/column i eliminated. - * - * @param A Symmetric matrix - * @param i Index of the eliminated row/column - * @param ii Row index of the desired entry - * @param jj Column index of the desired entry - * @return A(ii,jj) - A(ii,i) * A(jj,i) / A(i,i) - */ - double compute_inv_submatrix_i(const arma::mat& A, const size_t i, const size_t ii, const size_t jj) const; + /** * Return the diagonal value omega_jj required to keep the precision @@ -434,12 +425,7 @@ class GGMModel : public BaseModel { */ double log_density_impl_diag(size_t j) const; - /** - * Compute log-determinant from a triangular matrix: 2 * sum(log(diag)). - * - * @param triangular_A Upper-triangular Cholesky factor - */ - double get_log_det(arma::mat triangular_A) const; + /** * Update the Cholesky factor after changing an off-diagonal element. diff --git a/src/models/mixed/mixed_mrf_likelihoods.cpp b/src/models/mixed/mixed_mrf_likelihoods.cpp index 2a1fae27..d4deb4a9 100644 --- a/src/models/mixed/mixed_mrf_likelihoods.cpp +++ b/src/models/mixed/mixed_mrf_likelihoods.cpp @@ -59,9 +59,9 @@ double MixedMRFModel::log_conditional_omrf(int s) const { // log_conditional_ggm // ============================================================================= // Conditional GGM log-likelihood: log f(y | x) -// y | x ~ N(conditional_mean_, Kyy_inv_) +// y | x ~ N(conditional_mean_, covariance_yy_) // -// Uses cached Kyy_inv_, Kyy_log_det_, and conditional_mean_. +// Uses cached covariance_yy_, Kyy_log_det_, and conditional_mean_. // ============================================================================= double MixedMRFModel::log_conditional_ggm() const { diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index ae0b6e46..ccdafb7f 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -112,84 +112,220 @@ void MixedMRFModel::update_Kxx(int i, int j) { // ============================================================================= -// Kyy helpers: permutation-based Cholesky updates -// ============================================================================= -// Ported from mixedGM/R/continuous_variable_helper.R. -// These operate on the (q-1, q) block after permuting target indices to -// the last two positions. - -// Build a permutation vector that moves indices (i, j) to positions (q-1, q). -// Same involution property as the R version. -static arma::uvec make_perm_offdiag(int i, int j, int q) { - int A = q - 2; // 0-based target for first index - int B = q - 1; // 0-based target for second index - arma::uvec perm = arma::regspace(0, q - 1); - - if((i == A && j == B) || (i == B && j == A)) { - // already in position - } else if(i == A || j == A) { - int other = (i == A) ? j : i; - if(other != B) std::swap(perm(other), perm(B)); - } else if(i == B || j == B) { - int other = (i == B) ? j : i; - if(other != A) std::swap(perm(other), perm(A)); +// Rank-1 Kyy proposal helpers (permutation-free) +// ============================================================================= +// Direct analogs of GGMModel::get_constants / constrained_diagonal, +// operating on Kyy_, Kyy_chol_, and covariance_yy_. +// ============================================================================= + +void MixedMRFModel::get_kyy_constants(int i, int j) { + double logdet = cholesky_helpers::get_log_det(Kyy_chol_); + + double log_adj_ii = logdet + std::log(std::abs(covariance_yy_(i, i))); + double log_adj_ij = logdet + std::log(std::abs(covariance_yy_(i, j))); + double log_adj_jj = logdet + std::log(std::abs(covariance_yy_(j, j))); + + double inv_sub_jj = cholesky_helpers::compute_inv_submatrix_i(covariance_yy_, i, j, j); + double log_abs_inv_sub_jj = log_adj_ii + std::log(std::abs(inv_sub_jj)); + + double Phi_q1q = (2 * std::signbit(covariance_yy_(i, j)) - 1) * std::exp( + (log_adj_ij - (log_adj_jj + log_abs_inv_sub_jj) / 2) + ); + double Phi_q1q1 = std::exp((log_adj_jj - log_abs_inv_sub_jj) / 2); + + kyy_constants_[0] = Phi_q1q; + kyy_constants_[1] = Phi_q1q1; + kyy_constants_[2] = Kyy_(i, j) - Phi_q1q * Phi_q1q1; + kyy_constants_[3] = Phi_q1q1; + kyy_constants_[4] = Kyy_(j, j) - Phi_q1q * Phi_q1q; + kyy_constants_[5] = kyy_constants_[4] + + kyy_constants_[2] * kyy_constants_[2] / (kyy_constants_[3] * kyy_constants_[3]); +} + +double MixedMRFModel::kyy_constrained_diagonal(double x) const { + if(x == 0.0) { + return kyy_constants_[5]; } else { - std::swap(perm(i), perm(A)); - std::swap(perm(j), perm(B)); + double t = (x - kyy_constants_[2]) / kyy_constants_[3]; + return kyy_constants_[4] + t * t; } - return perm; } -// Build permutation vector that moves index i to position q-1 (last). -static arma::uvec make_perm_diag(int i, int q) { - arma::uvec perm = arma::regspace(0, q - 1); - if(i != q - 1) std::swap(perm(i), perm(q - 1)); - return perm; + +// ============================================================================= +// log_ggm_ratio_edge +// ============================================================================= +// Log-likelihood ratio for a rank-2 off-diagonal Kyy change using the +// matrix determinant lemma for the log-det part and Woodbury for the +// quadratic-form part. Assumes precision_yy_proposal_ is filled. +// +// B+.10 will replace the O(npq + nq²) quadratic-form computation with +// an O(nq) rank-2 shortcut. +// ============================================================================= + +double MixedMRFModel::log_ggm_ratio_edge(int i, int j) const { + size_t ui = static_cast(i); + size_t uj = static_cast(j); + + // --- Log-determinant ratio via matrix determinant lemma --- + // ΔΩ has 3 nonzero entries: (i,j), (j,i), (j,j). + // Ui = old - new off-diag, Uj = (old - new diag) / 2 + double Ui = Kyy_(ui, uj) - precision_yy_proposal_(ui, uj); + double Uj = (Kyy_(uj, uj) - precision_yy_proposal_(uj, uj)) / 2.0; + + double cc11 = covariance_yy_(uj, uj); + double cc12 = 1.0 - (covariance_yy_(ui, uj) * Ui + + covariance_yy_(uj, uj) * Uj); + double cc22 = Ui * Ui * covariance_yy_(ui, ui) + + 2.0 * Ui * Uj * covariance_yy_(ui, uj) + + Uj * Uj * covariance_yy_(uj, uj); + + double logdet_ratio = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + + // --- Proposed covariance via Woodbury --- + // ΔΩ = vf1 vf2' + vf2 vf1' where vf1 = [0,...,-1,...] (j-th), + // vf2 = [0,...,Ui,...,Uj,...] (i-th and j-th). + // s1 = Σ vf1 = -Σ[:,j], s2 = Σ vf2 = Ui*Σ[:,i] + Uj*Σ[:,j] + arma::vec s1 = -covariance_yy_.col(uj); + arma::vec s2 = Ui * covariance_yy_.col(ui) + Uj * covariance_yy_.col(uj); + + // 2×2 core matrix T = I + [vf2,vf1]' [s1,s2] + // T = [1 + vf2's1, vf2's2; vf1's1, 1 + vf1's2] + double t11 = 1.0 + Ui * s1(ui) + Uj * s1(uj); // 1 + vf2' s1 + double t12 = Ui * s2(ui) + Uj * s2(uj); // vf2' s2 + double t21 = -s1(uj); // vf1' s1 = Σ(j,j) + double t22 = 1.0 - s2(uj); // 1 + vf1' s2 + + double det_T = t11 * t22 - t12 * t21; + + // T^{-1} + double inv_t11 = t22 / det_T; + double inv_t12 = -t12 / det_T; + double inv_t21 = -t21 / det_T; + double inv_t22 = t11 / det_T; + + // Σ' = Σ - [s1,s2] T^{-1} [s2',s1'] + // = Σ - (inv_t11*s1 + inv_t21*s2)*s2' - (inv_t12*s1 + inv_t22*s2)*s1' + arma::vec w1 = inv_t11 * s1 + inv_t21 * s2; // coefficient for s2' row + arma::vec w2 = inv_t12 * s1 + inv_t22 * s2; // coefficient for s1' row + arma::mat cov_prop = covariance_yy_ - w1 * s2.t() - w2 * s1.t(); + + // --- Proposed conditional mean --- + // M' = 1*μ_y' + 2 * X * Kxy * Σ' + arma::mat cond_mean_prop = arma::repmat(muy_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * Kxy_ * cov_prop; + + // --- Quadratic form difference --- + arma::mat D_curr = continuous_observations_ - conditional_mean_; + arma::mat D_prop = continuous_observations_ - cond_mean_prop; + + double quad_curr = arma::accu((D_curr * Kyy_) % D_curr); + double quad_prop = arma::accu((D_prop * precision_yy_proposal_) % D_prop); + + double n = static_cast(n_); + return n / 2.0 * logdet_ratio - (quad_prop - quad_curr) / 2.0; } -// Apply symmetric permutation: M[perm, perm] -static arma::mat permute_matrix(const arma::mat& M, const arma::uvec& perm) { - return M.submat(perm, perm); + +// ============================================================================= +// log_ggm_ratio_diag +// ============================================================================= +// Log-likelihood ratio for a rank-1 diagonal Kyy change. +// Same structure as log_ggm_ratio_edge but simpler (Ui = 0). +// ============================================================================= + +double MixedMRFModel::log_ggm_ratio_diag(int i) const { + size_t ui = static_cast(i); + + // --- Log-determinant ratio (rank-1) --- + double Uj = (Kyy_(ui, ui) - precision_yy_proposal_(ui, ui)) / 2.0; + + double cc11 = covariance_yy_(ui, ui); + double cc12 = 1.0 - covariance_yy_(ui, ui) * Uj; + double cc22 = Uj * Uj * covariance_yy_(ui, ui); + + double logdet_ratio = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + + // --- Proposed covariance via Sherman-Morrison (rank-1 special case) --- + // ΔΩ = -2Uj * e_i e_i', so Σ' = Σ + 2Uj * Σ[:,i] Σ[i,:]' / (1 - 2Uj * Σ(i,i)) + arma::vec s = covariance_yy_.col(ui); + double denom = 1.0 - 2.0 * Uj * covariance_yy_(ui, ui); + arma::mat cov_prop = covariance_yy_ + (2.0 * Uj / denom) * s * s.t(); + + // --- Proposed conditional mean --- + arma::mat cond_mean_prop = arma::repmat(muy_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * Kxy_ * cov_prop; + + // --- Quadratic form difference --- + arma::mat D_curr = continuous_observations_ - conditional_mean_; + arma::mat D_prop = continuous_observations_ - cond_mean_prop; + + double quad_curr = arma::accu((D_curr * Kyy_) % D_curr); + double quad_prop = arma::accu((D_prop * precision_yy_proposal_) % D_prop); + + double n = static_cast(n_); + return n / 2.0 * logdet_ratio - (quad_prop - quad_curr) / 2.0; } -// Extract constants from upper Cholesky factor (q×q) for (q-2, q-1) block update. -// Returns: {c1, c2, c3, c4} -struct CholConstants { - double c1, c2, c3, c4; -}; - -static CholConstants get_constants(const arma::mat& L, int q) { - // L is upper-triangular Cholesky factor - // phi_q and phi_q_1 are columns q-1 and q-2, excluding rows (q-2, q-1) - int qm1 = q - 1; // last column (0-based) - int qm2 = q - 2; // second-to-last column - - double c1 = 0.0; - for(int k = 0; k < qm2; ++k) { - c1 += L(k, qm1) * L(k, qm2); - } - double c2 = L(qm2, qm2); - // c3 excludes only row qm2 (the row being modified), not qm1. - // In R: sum(cholm[-(q-1), q]^2) — excludes row q-1 (1-based) = row qm2 (0-based). - // Must include L(qm1, qm1) (the diagonal entry of the last row). - double c3 = 0.0; - for(int k = 0; k < qm2; ++k) { - c3 += L(k, qm1) * L(k, qm1); - } - c3 += L(qm1, qm1) * L(qm1, qm1); // diagonal entry - double c4 = c3 + c1 * c1 / (c2 * c2); - return {c1, c2, c3, c4}; +// ============================================================================= +// cholesky_update_after_kyy_edge +// ============================================================================= +// Rank-2 Cholesky update after accepting an off-diagonal Kyy change. +// Decomposes ΔΩ = vf1*vf2' + vf2*vf1' into two rank-1 ops. +// Then recomputes inv_cholesky_yy_ and covariance_yy_. +// ============================================================================= + +void MixedMRFModel::cholesky_update_after_kyy_edge( + double old_ij, double old_jj, int i, int j) +{ + kyy_v2_[0] = old_ij - precision_yy_proposal_(i, j); + kyy_v2_[1] = (old_jj - precision_yy_proposal_(j, j)) / 2.0; + + kyy_vf1_[i] = kyy_v1_[0]; // 0 + kyy_vf1_[j] = kyy_v1_[1]; // -1 + kyy_vf2_[i] = kyy_v2_[0]; + kyy_vf2_[j] = kyy_v2_[1]; + + kyy_u1_ = (kyy_vf1_ + kyy_vf2_) / std::sqrt(2.0); + kyy_u2_ = (kyy_vf1_ - kyy_vf2_) / std::sqrt(2.0); + + cholesky_update(Kyy_chol_, kyy_u1_); + cholesky_downdate(Kyy_chol_, kyy_u2_); + + arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); + covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); + Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); + + kyy_vf1_[i] = 0.0; + kyy_vf1_[j] = 0.0; + kyy_vf2_[i] = 0.0; + kyy_vf2_[j] = 0.0; } -// Constrained diagonal: R(omega, constants) from mixedGM -static double constrained_diagonal(double omega, const CholConstants& C) { - if(omega == 0.0) { - return C.c4; - } else { - double t = (omega - C.c1) / C.c2; - return C.c3 + t * t; - } + +// ============================================================================= +// cholesky_update_after_kyy_diag +// ============================================================================= +// Rank-1 Cholesky update after accepting a diagonal Kyy change. +// ============================================================================= + +void MixedMRFModel::cholesky_update_after_kyy_diag(double old_ii, int i) { + double delta = old_ii - precision_yy_proposal_(i, i); + bool downdate = delta > 0.0; + + kyy_vf1_[i] = std::sqrt(std::abs(delta)); + + if(downdate) + cholesky_downdate(Kyy_chol_, kyy_vf1_); + else + cholesky_update(Kyy_chol_, kyy_vf1_); + + arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); + covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); + Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); + + kyy_vf1_[i] = 0.0; } @@ -197,76 +333,49 @@ static double constrained_diagonal(double omega, const CholConstants& C) { // update_Kyy_offdiag // ============================================================================= // MH update for one off-diagonal element of the precision matrix Kyy_(i, j). -// Uses the mixedGM permute-based Cholesky approach: -// 1. Permute target pair to last two positions -// 2. Cholesky of permuted Kyy -// 3. Propose on the Cholesky scale: phi' ~ N(Phi[q-2, q-1], sd) -// 4. Map back to Kyy space with constrained diagonal -// 5. Unpermute -// 6. Full recompute of GGM likelihood +// Uses rank-1 Cholesky infrastructure (GGM-style, no permutation): +// 1. Extract constants from covariance_yy_ and Kyy_chol_ +// 2. Propose on the unconstrained Cholesky scale +// 3. Map to Kyy space with constrained diagonal +// 4. Evaluate rank-2 log-likelihood ratio +// 5. On accept: rank-1 Cholesky update // // Prior: Cauchy(0, pairwise_scale_) on off-diag, Gamma(1, 1) on diagonal. // ============================================================================= void MixedMRFModel::update_Kyy_offdiag(int i, int j) { - int q = static_cast(q_); - - arma::uvec perm = make_perm_offdiag(i, j, q); - arma::mat Kyy_perm = permute_matrix(Kyy_, perm); - arma::mat Phi = arma::chol(Kyy_perm); // upper Cholesky - CholConstants C = get_constants(Phi, q); + get_kyy_constants(i, j); - // Current Cholesky-scale value - double phi_curr = Phi(q - 2, q - 1); + double phi_curr = kyy_constants_[0]; // Phi_q1q double phi_prop = rnorm(rng_, phi_curr, prop_sd_Kyy_(i, j)); - // Map to Kyy space - double omega_prop = C.c1 + C.c2 * phi_prop; - double diag_curr = Kyy_perm(q - 1, q - 1); - double diag_prop = constrained_diagonal(omega_prop, C); - - // Build proposed permuted Kyy - arma::mat Kyy_prop_perm = Kyy_perm; - Kyy_prop_perm(q - 2, q - 1) = omega_prop; - Kyy_prop_perm(q - 1, q - 2) = omega_prop; - Kyy_prop_perm(q - 1, q - 1) = diag_prop; - - // Unpermute - arma::mat Kyy_prop = permute_matrix(Kyy_prop_perm, perm); - - // Save current state - arma::mat Kyy_saved = Kyy_; - arma::mat Kyy_inv_saved = Kyy_inv_; - arma::mat Kyy_chol_saved = Kyy_chol_; - double Kyy_log_det_saved = Kyy_log_det_; - arma::mat cond_mean_saved = conditional_mean_; - - // Evaluate proposed likelihood - Kyy_ = Kyy_prop; - recompute_Kyy_decomposition(); - recompute_conditional_mean(); - double ll_prop = log_conditional_ggm(); + double omega_prop_ij = kyy_constants_[2] + kyy_constants_[3] * phi_prop; + double omega_prop_jj = kyy_constrained_diagonal(omega_prop_ij); + double diag_curr = Kyy_(j, j); - // Evaluate current likelihood (restore) - Kyy_ = Kyy_saved; - Kyy_inv_ = Kyy_inv_saved; - Kyy_chol_ = Kyy_chol_saved; - Kyy_log_det_ = Kyy_log_det_saved; - conditional_mean_ = cond_mean_saved; - double ll_curr = log_conditional_ggm(); + // Fill proposal matrix (only the 3 changed entries matter) + precision_yy_proposal_ = Kyy_; + precision_yy_proposal_(i, j) = omega_prop_ij; + precision_yy_proposal_(j, i) = omega_prop_ij; + precision_yy_proposal_(j, j) = omega_prop_jj; - double ln_alpha = ll_prop - ll_curr; + double ln_alpha = log_ggm_ratio_edge(i, j); - // Prior ratio: Cauchy on off-diag + Gamma(1,1) on diagonal that changed - ln_alpha += R::dcauchy(Kyy_prop(i, j), 0.0, pairwise_scale_, true); + // Prior ratio: Cauchy on off-diag + Gamma(1,1) on diagonal + ln_alpha += R::dcauchy(omega_prop_ij, 0.0, pairwise_scale_, true); ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); - ln_alpha += R::dgamma(diag_prop, 1.0, 1.0, true); + ln_alpha += R::dgamma(omega_prop_jj, 1.0, 1.0, true); ln_alpha -= R::dgamma(diag_curr, 1.0, 1.0, true); if(std::log(runif(rng_)) < ln_alpha) { - // Accept: install proposed Kyy and refresh caches - Kyy_ = Kyy_prop; - recompute_Kyy_decomposition(); + double old_ij = Kyy_(i, j); + double old_jj = Kyy_(j, j); + + Kyy_(i, j) = omega_prop_ij; + Kyy_(j, i) = omega_prop_ij; + Kyy_(j, j) = omega_prop_jj; + + cholesky_update_after_kyy_edge(old_ij, old_jj, i, j); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } @@ -278,58 +387,36 @@ void MixedMRFModel::update_Kyy_offdiag(int i, int j) { // ============================================================================= // MH update for one diagonal element of Kyy. // Proposes on the log-Cholesky scale to ensure positivity. +// Uses rank-1 Cholesky update on accept. // Prior: Gamma(1, 1) on the diagonal element + Jacobian for log-scale proposal. // ============================================================================= void MixedMRFModel::update_Kyy_diag(int i) { - int q = static_cast(q_); + double logdet = cholesky_helpers::get_log_det(Kyy_chol_); + double logdet_sub_ii = logdet + std::log(covariance_yy_(i, i)); - arma::uvec perm = make_perm_diag(i, q); - arma::mat Kyy_perm = permute_matrix(Kyy_, perm); - arma::mat L = arma::chol(Kyy_perm); // upper Cholesky - - // Propose on log(L[q-1, q-1]) scale - double theta_curr = std::log(L(q - 1, q - 1)); + double theta_curr = (logdet - logdet_sub_ii) / 2.0; double theta_prop = rnorm(rng_, theta_curr, prop_sd_Kyy_(i, i)); - // Rebuild Kyy_prop from modified Cholesky - L(q - 1, q - 1) = std::exp(theta_prop); - arma::mat Kyy_prop_perm = L.t() * L; - arma::mat Kyy_prop = permute_matrix(Kyy_prop_perm, perm); - - // Save current state - arma::mat Kyy_saved = Kyy_; - arma::mat Kyy_inv_saved = Kyy_inv_; - arma::mat Kyy_chol_saved = Kyy_chol_; - double Kyy_log_det_saved = Kyy_log_det_; - arma::mat cond_mean_saved = conditional_mean_; - - // Evaluate proposed likelihood - Kyy_ = Kyy_prop; - recompute_Kyy_decomposition(); - recompute_conditional_mean(); - double ll_prop = log_conditional_ggm(); - - // Evaluate current likelihood (restore) - Kyy_ = Kyy_saved; - Kyy_inv_ = Kyy_inv_saved; - Kyy_chol_ = Kyy_chol_saved; - Kyy_log_det_ = Kyy_log_det_saved; - conditional_mean_ = cond_mean_saved; - double ll_curr = log_conditional_ggm(); + precision_yy_proposal_ = Kyy_; + precision_yy_proposal_(i, i) = Kyy_(i, i) + - std::exp(theta_curr) * std::exp(theta_curr) + + std::exp(theta_prop) * std::exp(theta_prop); - double ln_alpha = ll_prop - ll_curr; + double ln_alpha = log_ggm_ratio_diag(i); - // Prior ratio: Gamma(1, 1) on diagonal - ln_alpha += R::dgamma(Kyy_prop(i, i), 1.0, 1.0, true); + // Prior ratio: Gamma(1,1) on diagonal + ln_alpha += R::dgamma(precision_yy_proposal_(i, i), 1.0, 1.0, true); ln_alpha -= R::dgamma(Kyy_(i, i), 1.0, 1.0, true); // Jacobian for log-scale proposal ln_alpha += theta_prop - theta_curr; if(std::log(runif(rng_)) < ln_alpha) { - Kyy_ = Kyy_prop; - recompute_Kyy_decomposition(); + double old_ii = Kyy_(i, i); + Kyy_(i, i) = precision_yy_proposal_(i, i); + + cholesky_update_after_kyy_diag(old_ii, i); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 82a6e27a..f8bb00b1 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -78,9 +78,17 @@ MixedMRFModel::MixedMRFModel( // Initialize Kyy caches (Kyy starts as identity) Kyy_chol_ = arma::eye(q_, q_); - Kyy_inv_ = arma::eye(q_, q_); + inv_cholesky_yy_ = arma::eye(q_, q_); + covariance_yy_ = arma::eye(q_, q_); Kyy_log_det_ = 0.0; + // Rank-1 Cholesky update workspace + precision_yy_proposal_ = arma::mat(q_, q_, arma::fill::none); + kyy_vf1_ = arma::zeros(q_); + kyy_vf2_ = arma::zeros(q_); + kyy_u1_ = arma::zeros(q_); + kyy_u2_ = arma::zeros(q_); + // Initialize conditional mean: μ_y' + 2 x Kxy Kyy_inv // With Kxy = 0 and Kyy = I, this is just 1 * μ_y' = 0. conditional_mean_ = arma::zeros(n_, q_); @@ -137,11 +145,20 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) prop_sd_Kxx_(other.prop_sd_Kxx_), prop_sd_Kyy_(other.prop_sd_Kyy_), prop_sd_Kxy_(other.prop_sd_Kxy_), - Kyy_inv_(other.Kyy_inv_), Kyy_chol_(other.Kyy_chol_), + inv_cholesky_yy_(other.inv_cholesky_yy_), + covariance_yy_(other.covariance_yy_), Kyy_log_det_(other.Kyy_log_det_), Theta_(other.Theta_), conditional_mean_(other.conditional_mean_), + kyy_constants_(other.kyy_constants_), + precision_yy_proposal_(other.precision_yy_proposal_), + kyy_v1_(other.kyy_v1_), + kyy_v2_(other.kyy_v2_), + kyy_vf1_(other.kyy_vf1_), + kyy_vf2_(other.kyy_vf2_), + kyy_u1_(other.kyy_u1_), + kyy_u2_(other.kyy_u2_), use_marginal_pl_(other.use_marginal_pl_), rng_(other.rng_), edge_order_xx_(other.edge_order_xx_), @@ -201,20 +218,21 @@ size_t MixedMRFModel::count_num_main_effects() const { // ============================================================================= void MixedMRFModel::recompute_conditional_mean() { - // conditional_mean_ = 1*μ_y' + 2 * discrete_obs * Kxy * Kyy_inv + // conditional_mean_ = 1*μ_y' + 2 * discrete_obs * Kxy * covariance_yy_ conditional_mean_ = arma::repmat(muy_.t(), n_, 1) + - 2.0 * discrete_observations_dbl_ * Kxy_ * Kyy_inv_; + 2.0 * discrete_observations_dbl_ * Kxy_ * covariance_yy_; } void MixedMRFModel::recompute_Kyy_decomposition() { - Kyy_chol_ = arma::chol(Kyy_); // upper Cholesky - Kyy_inv_ = arma::inv_sympd(Kyy_); - Kyy_log_det_ = 2.0 * arma::sum(arma::log(Kyy_chol_.diag())); + Kyy_chol_ = arma::chol(Kyy_); // upper Cholesky: Kyy = R'R + arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); + covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); + Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); } void MixedMRFModel::recompute_Theta() { - // Θ = Kxx + 2 Kxy Kyy_inv Kxy' - Theta_ = Kxx_ + 2.0 * Kxy_ * Kyy_inv_ * Kxy_.t(); + // Θ = Kxx + 2 Kxy covariance_yy_ Kxy' + Theta_ = Kxx_ + 2.0 * Kxy_ * covariance_yy_ * Kxy_.t(); } diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 485fdd6c..81d507e5 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -1,7 +1,10 @@ #pragma once +#include #include #include "models/base_model.h" +#include "math/cholesky_helpers.h" +#include "models/ggm/cholupdate.h" #include "rng/rng_utils.h" /** @@ -34,6 +37,13 @@ class MixedMRFModel : public BaseModel { const arma::imat&, bool, const std::string&, const arma::vec&, int ); + // Test helper for rank-1 Cholesky correctness (T28/T29) + friend Rcpp::List test_mixed_mrf_cholesky( + const arma::imat&, const arma::mat&, const arma::ivec&, + const arma::uvec&, const arma::ivec&, const arma::mat&, + const arma::imat&, const arma::vec&, int, int, int + ); + // ========================================================================= // Construction // ========================================================================= @@ -287,11 +297,22 @@ class MixedMRFModel : public BaseModel { // Cached quantities // ========================================================================= - arma::mat Kyy_inv_; // q × q inverse of Kyy - arma::mat Kyy_chol_; // q × q upper Cholesky of Kyy + arma::mat Kyy_chol_; // q × q upper Cholesky of Kyy (Kyy = R'R) + arma::mat inv_cholesky_yy_; // q × q R^{-1} (upper triangular) + arma::mat covariance_yy_; // q × q Kyy^{-1} = R^{-1} R^{-T} double Kyy_log_det_; // log|Kyy| - arma::mat Theta_; // p × p Kxx + 2 Kxy Kyy_inv Kxy' (marginal PL only) - arma::mat conditional_mean_; // n × q μ_y' + 2 discrete_obs Kxy Kyy_inv + arma::mat Theta_; // p × p Kxx + 2 Kxy covariance_yy_ Kxy' (marginal PL only) + arma::mat conditional_mean_; // n × q μ_y' + 2 discrete_obs Kxy covariance_yy_ + + // Rank-1 Cholesky update workspace + std::array kyy_constants_{}; // reparameterization constants + arma::mat precision_yy_proposal_; // q × q scratch for proposed Kyy + arma::vec kyy_v1_ = {0, -1}; // rank-2 decomposition helpers + arma::vec kyy_v2_ = {0, 0}; + arma::vec kyy_vf1_; // q-vectors, zeroed between uses + arma::vec kyy_vf2_; + arma::vec kyy_u1_; + arma::vec kyy_u2_; // ========================================================================= // Configuration @@ -318,13 +339,13 @@ class MixedMRFModel : public BaseModel { /** Compute category counts and BC sufficient statistics from discrete_observations_. */ void compute_sufficient_statistics(); - /** Recompute conditional_mean_ from muy_, Kxy_, Kyy_inv_. */ + /** Recompute conditional_mean_ from muy_, Kxy_, covariance_yy_. */ void recompute_conditional_mean(); - /** Recompute Kyy_chol_, Kyy_inv_, Kyy_log_det_ from Kyy_. */ + /** Recompute Kyy_chol_, inv_cholesky_yy_, covariance_yy_, Kyy_log_det_ from Kyy_. */ void recompute_Kyy_decomposition(); - /** Recompute Theta_ from Kxx_, Kxy_, Kyy_inv_ (marginal PL only). */ + /** Recompute Theta_ from Kxx_, Kxy_, covariance_yy_ (marginal PL only). */ void recompute_Theta(); // ========================================================================= @@ -341,6 +362,31 @@ class MixedMRFModel : public BaseModel { // MH update functions (implemented in mixed_mrf_metropolis.cpp) // ========================================================================= + // --- Rank-1 Kyy proposal helpers (permutation-free) --- + + // Extract reparameterization constants for the (i,j) off-diagonal Kyy update. + // Populates kyy_constants_[0..5] from Kyy_chol_ and covariance_yy_. + void get_kyy_constants(int i, int j); + + // Constrained diagonal value for a proposed off-diagonal Kyy element. + double kyy_constrained_diagonal(double x) const; + + // Log-likelihood ratio for a proposed off-diagonal Kyy change (rank-2). + // Assumes precision_yy_proposal_ is already filled by the caller. + double log_ggm_ratio_edge(int i, int j) const; + + // Log-likelihood ratio for a proposed diagonal Kyy change (rank-1). + // Assumes precision_yy_proposal_ is already filled by the caller. + double log_ggm_ratio_diag(int i) const; + + // Rank-1 Cholesky update after accepting an off-diagonal Kyy change. + void cholesky_update_after_kyy_edge(double old_ij, double old_jj, int i, int j); + + // Rank-1 Cholesky update after accepting a diagonal Kyy change. + void cholesky_update_after_kyy_diag(double old_ii, int i); + + // --- Parameter update sweeps --- + /** Update one main-effect: mux_(s, c). Ordinal threshold or BC α/β. */ void update_main_effect(int s, int c); From c5823e1932e6f22d8be57c060d4729ec6b83ccdf Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 19:56:15 +0100 Subject: [PATCH 10/60] test: add rank-1 Cholesky correctness tests (audit #6b) --- R/RcppExports.R | 4 + src/RcppExports.cpp | 22 +++ src/test_mixed_mrf.cpp | 200 +++++++++++++++++++++++ tests/testthat/test-mixed-mrf-cholesky.R | 183 +++++++++++++++++++++ 4 files changed, 409 insertions(+) create mode 100644 tests/testthat/test-mixed-mrf-cholesky.R diff --git a/R/RcppExports.R b/R/RcppExports.R index a0177aea..6f490ec9 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -69,3 +69,7 @@ test_mixed_mrf_sampler <- function(discrete_observations, continuous_observation .Call(`_bgms_test_mixed_mrf_sampler`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed) } +test_mixed_mrf_cholesky <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j) { + .Call(`_bgms_test_mixed_mrf_cholesky`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j) +} + diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index b28f12c3..848c2268 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -352,6 +352,27 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// test_mixed_mrf_cholesky +Rcpp::List test_mixed_mrf_cholesky(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, const arma::vec& params, int seed, int target_i, int target_j); +RcppExport SEXP _bgms_test_mixed_mrf_cholesky(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP paramsSEXP, SEXP seedSEXP, SEXP target_iSEXP, SEXP target_jSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); + Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); + Rcpp::traits::input_parameter< const arma::vec& >::type params(paramsSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + Rcpp::traits::input_parameter< int >::type target_i(target_iSEXP); + Rcpp::traits::input_parameter< int >::type target_j(target_jSEXP); + rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_cholesky(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -371,6 +392,7 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_test_mixed_mrf_skeleton", (DL_FUNC) &_bgms_test_mixed_mrf_skeleton, 10}, {"_bgms_test_mixed_mrf_likelihoods", (DL_FUNC) &_bgms_test_mixed_mrf_likelihoods, 11}, {"_bgms_test_mixed_mrf_sampler", (DL_FUNC) &_bgms_test_mixed_mrf_sampler, 12}, + {"_bgms_test_mixed_mrf_cholesky", (DL_FUNC) &_bgms_test_mixed_mrf_cholesky, 11}, {NULL, NULL, 0} }; diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp index 2f931cee..38618eec 100644 --- a/src/test_mixed_mrf.cpp +++ b/src/test_mixed_mrf.cpp @@ -211,3 +211,203 @@ Rcpp::List test_mixed_mrf_sampler( Rcpp::Named("full_parameter_dimension") = full_dim ); } + + +// ============================================================================= +// test_mixed_mrf_cholesky — T28 (log-ratio agreement) and T29 (Cholesky fidelity) +// ============================================================================= + +// [[Rcpp::export]] +Rcpp::List test_mixed_mrf_cholesky( + const arma::imat& discrete_observations, + const arma::mat& continuous_observations, + const arma::ivec& num_categories, + const arma::uvec& is_ordinal_variable, + const arma::ivec& baseline_category, + const arma::mat& inclusion_probability, + const arma::imat& initial_edge_indicators, + const arma::vec& params, + int seed, + int target_i, + int target_j +) { + MixedMRFModel model( + discrete_observations, + continuous_observations, + num_categories, + is_ordinal_variable, + baseline_category, + inclusion_probability, + initial_edge_indicators, + false, // no edge selection + "conditional", + 1.0, 1.0, 2.5, + seed + ); + + model.set_vectorized_parameters(params); + + int q = static_cast(model.q_); + + // ========================================================================= + // T28: log_ggm_ratio_edge vs brute-force log_conditional_ggm difference + // ========================================================================= + + // Current log-likelihood + double ggm_ll_curr = model.log_conditional_ggm(); + + // Extract reparameterization constants and build a deterministic proposal + model.get_kyy_constants(target_i, target_j); + double phi_curr = model.kyy_constants_[0]; + double phi_prop = phi_curr + 0.05; // small deterministic shift + + double omega_prop_ij = model.kyy_constants_[2] + model.kyy_constants_[3] * phi_prop; + double omega_prop_jj = model.kyy_constrained_diagonal(omega_prop_ij); + + model.precision_yy_proposal_ = model.Kyy_; + model.precision_yy_proposal_(target_i, target_j) = omega_prop_ij; + model.precision_yy_proposal_(target_j, target_i) = omega_prop_ij; + model.precision_yy_proposal_(target_j, target_j) = omega_prop_jj; + + // Rank-2 log-ratio via new function + double ratio_rank2 = model.log_ggm_ratio_edge(target_i, target_j); + + // Brute-force: install proposed Kyy, full recompute, evaluate + arma::mat Kyy_saved = model.Kyy_; + arma::mat cov_saved = model.covariance_yy_; + arma::mat chol_saved = model.Kyy_chol_; + arma::mat inv_chol_saved = model.inv_cholesky_yy_; + double logdet_saved = model.Kyy_log_det_; + arma::mat cmean_saved = model.conditional_mean_; + + model.Kyy_ = model.precision_yy_proposal_; + model.recompute_Kyy_decomposition(); + model.recompute_conditional_mean(); + double ggm_ll_prop = model.log_conditional_ggm(); + + double ratio_bruteforce = ggm_ll_prop - ggm_ll_curr; + + // ========================================================================= + // T28b: log_ggm_ratio_diag vs brute-force + // ========================================================================= + + // Restore to current state + model.Kyy_ = Kyy_saved; + model.covariance_yy_ = cov_saved; + model.Kyy_chol_ = chol_saved; + model.inv_cholesky_yy_ = inv_chol_saved; + model.Kyy_log_det_ = logdet_saved; + model.conditional_mean_ = cmean_saved; + + // Diagonal proposal: small shift on log-Cholesky scale + double logdet_curr = cholesky_helpers::get_log_det(model.Kyy_chol_); + double logdet_sub = logdet_curr + std::log(model.covariance_yy_(target_i, target_i)); + double theta_curr = (logdet_curr - logdet_sub) / 2.0; + double theta_prop = theta_curr + 0.05; + + model.precision_yy_proposal_ = model.Kyy_; + model.precision_yy_proposal_(target_i, target_i) = model.Kyy_(target_i, target_i) + - std::exp(theta_curr) * std::exp(theta_curr) + + std::exp(theta_prop) * std::exp(theta_prop); + + double ratio_diag_rank1 = model.log_ggm_ratio_diag(target_i); + + // Brute-force + model.Kyy_ = model.precision_yy_proposal_; + model.recompute_Kyy_decomposition(); + model.recompute_conditional_mean(); + double ggm_ll_diag_prop = model.log_conditional_ggm(); + + double ratio_diag_brute = ggm_ll_diag_prop - ggm_ll_curr; + + // ========================================================================= + // T29: Cholesky update fidelity — rank-2 edge update + // ========================================================================= + + // Restore to current state + model.Kyy_ = Kyy_saved; + model.covariance_yy_ = cov_saved; + model.Kyy_chol_ = chol_saved; + model.inv_cholesky_yy_ = inv_chol_saved; + model.Kyy_log_det_ = logdet_saved; + model.conditional_mean_ = cmean_saved; + + // Re-fill off-diagonal proposal + model.precision_yy_proposal_ = model.Kyy_; + model.precision_yy_proposal_(target_i, target_j) = omega_prop_ij; + model.precision_yy_proposal_(target_j, target_i) = omega_prop_ij; + model.precision_yy_proposal_(target_j, target_j) = omega_prop_jj; + + // Apply rank-1 Cholesky update + double old_ij = model.Kyy_(target_i, target_j); + double old_jj = model.Kyy_(target_j, target_j); + model.Kyy_(target_i, target_j) = omega_prop_ij; + model.Kyy_(target_j, target_i) = omega_prop_ij; + model.Kyy_(target_j, target_j) = omega_prop_jj; + model.cholesky_update_after_kyy_edge(old_ij, old_jj, target_i, target_j); + + arma::mat chol_rank1 = model.Kyy_chol_; + arma::mat cov_rank1 = model.covariance_yy_; + double logdet_rank1 = model.Kyy_log_det_; + + // Full recompute for ground truth + model.recompute_Kyy_decomposition(); + arma::mat chol_full = model.Kyy_chol_; + arma::mat cov_full = model.covariance_yy_; + double logdet_full = model.Kyy_log_det_; + + double chol_max_diff = arma::max(arma::max(arma::abs(chol_rank1 - chol_full))); + double cov_max_diff = arma::max(arma::max(arma::abs(cov_rank1 - cov_full))); + double logdet_diff = std::abs(logdet_rank1 - logdet_full); + + // ========================================================================= + // T29b: Cholesky update fidelity — rank-1 diagonal update + // ========================================================================= + + // Restore + model.Kyy_ = Kyy_saved; + model.covariance_yy_ = cov_saved; + model.Kyy_chol_ = chol_saved; + model.inv_cholesky_yy_ = inv_chol_saved; + model.Kyy_log_det_ = logdet_saved; + + // Diagonal proposal (reuse from T28b) + model.precision_yy_proposal_ = model.Kyy_; + model.precision_yy_proposal_(target_i, target_i) = model.Kyy_(target_i, target_i) + - std::exp(theta_curr) * std::exp(theta_curr) + + std::exp(theta_prop) * std::exp(theta_prop); + + double old_ii = model.Kyy_(target_i, target_i); + model.Kyy_(target_i, target_i) = model.precision_yy_proposal_(target_i, target_i); + model.cholesky_update_after_kyy_diag(old_ii, target_i); + + arma::mat chol_diag_rank1 = model.Kyy_chol_; + arma::mat cov_diag_rank1 = model.covariance_yy_; + double logdet_diag_rank1 = model.Kyy_log_det_; + + model.recompute_Kyy_decomposition(); + arma::mat chol_diag_full = model.Kyy_chol_; + arma::mat cov_diag_full = model.covariance_yy_; + double logdet_diag_full = model.Kyy_log_det_; + + double chol_diag_max_diff = arma::max(arma::max(arma::abs(chol_diag_rank1 - chol_diag_full))); + double cov_diag_max_diff = arma::max(arma::max(arma::abs(cov_diag_rank1 - cov_diag_full))); + double logdet_diag_diff = std::abs(logdet_diag_rank1 - logdet_diag_full); + + return Rcpp::List::create( + // T28: off-diagonal log-ratio agreement + Rcpp::Named("ratio_rank2") = ratio_rank2, + Rcpp::Named("ratio_bruteforce") = ratio_bruteforce, + // T28b: diagonal log-ratio agreement + Rcpp::Named("ratio_diag_rank1") = ratio_diag_rank1, + Rcpp::Named("ratio_diag_brute") = ratio_diag_brute, + // T29: off-diagonal Cholesky fidelity + Rcpp::Named("chol_max_diff") = chol_max_diff, + Rcpp::Named("cov_max_diff") = cov_max_diff, + Rcpp::Named("logdet_diff") = logdet_diff, + // T29b: diagonal Cholesky fidelity + Rcpp::Named("chol_diag_max_diff") = chol_diag_max_diff, + Rcpp::Named("cov_diag_max_diff") = cov_diag_max_diff, + Rcpp::Named("logdet_diag_diff") = logdet_diag_diff + ); +} diff --git a/tests/testthat/test-mixed-mrf-cholesky.R b/tests/testthat/test-mixed-mrf-cholesky.R new file mode 100644 index 00000000..de6d8726 --- /dev/null +++ b/tests/testthat/test-mixed-mrf-cholesky.R @@ -0,0 +1,183 @@ +# ============================================================================= +# test-mixed-mrf-cholesky.R — Phase B+ Cholesky rank-1 update tests +# ============================================================================= +# T28: log_ggm_ratio_edge matches brute-force log-likelihood difference +# T28b: log_ggm_ratio_diag matches brute-force log-likelihood difference +# T29: Cholesky / covariance / logdet fidelity after rank-2 edge update +# T29b: Cholesky / covariance / logdet fidelity after rank-1 diagonal update + +# ------------------------------------------------------------------ +# Helper: build parameter vector with nonzero Kyy (must be SPD) +# ------------------------------------------------------------------ +make_cholesky_test = function(q = 3L) { + set.seed(42) + n = 20L; p = 2L + num_cats = c(2L, 3L) + is_ordinal = c(1L, 1L) + baseline_cat = c(0L, 0L) + + x = matrix(0L, n, p) + x[, 1] = sample(0:2, n, replace = TRUE) + x[, 2] = sample(0:3, n, replace = TRUE) + y = matrix(rnorm(n * q), n, q) + + pq = p + q + inc_prob = matrix(0.5, pq, pq) + edge_ind = matrix(1L, pq, pq) + diag(edge_ind) = 0L + + # Param layout: main | Kxx | muy | Kyy (upper-tri) | Kxy + num_main = sum(num_cats) # 2 + 3 = 5 + num_kxx = p * (p - 1L) / 2L # 1 + num_kyy = q * (q + 1L) / 2L + num_kxy = p * q + total = num_main + num_kxx + q + num_kyy + num_kxy + params = rep(0, total) + + # Thresholds + params[1:2] = c(0.3, -0.2) + params[3:5] = c(0.1, 0.4, -0.1) + + # Kxx(0,1) + params[num_main + 1] = 0.2 + + # muy + muy_start = num_main + num_kxx + params[muy_start + seq_len(q)] = rnorm(q, sd = 0.2) + + # Kyy: build SPD Q = L L^T with random L, then pack upper-tri + L = matrix(0, q, q) + diag(L) = runif(q, 1.0, 2.0) + L[lower.tri(L)] = rnorm(q * (q - 1) / 2, sd = 0.3) + Kyy = L %*% t(L) + kyy_start = muy_start + q + idx = 0L + for(i in seq_len(q)) { + for(j in i:q) { + idx = idx + 1L + params[kyy_start + idx] = Kyy[i, j] + } + } + + # Kxy + kxy_start = kyy_start + num_kyy + params[kxy_start + seq_len(num_kxy)] = rnorm(num_kxy, sd = 0.1) + + list( + x = x, y = y, + num_cats = num_cats, + is_ordinal = as.integer(is_ordinal), + baseline_cat = baseline_cat, + inc_prob = inc_prob, + edge_ind = edge_ind, + params = params, + q = q + ) +} + + +# ============================================================================== +# T28 + T28b: log-ratio agreement (off-diagonal and diagonal) +# ============================================================================== + +test_that("log_ggm_ratio_edge matches brute-force (T28)", { + d = make_cholesky_test(q = 3L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 1L, target_i = 0L, target_j = 1L + ) + expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) +}) + +test_that("log_ggm_ratio_diag matches brute-force (T28b)", { + d = make_cholesky_test(q = 3L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 1L, target_i = 0L, target_j = 1L + ) + expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) +}) + + +# ============================================================================== +# T29 + T29b: Cholesky fidelity after rank-1/rank-2 updates +# ============================================================================== + +test_that("Cholesky update after edge matches full recompute (T29)", { + d = make_cholesky_test(q = 3L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 1L, target_i = 0L, target_j = 1L + ) + expect_lt(res$chol_max_diff, 1e-10) + expect_lt(res$cov_max_diff, 1e-10) + expect_lt(res$logdet_diff, 1e-10) +}) + +test_that("Cholesky update after diagonal matches full recompute (T29b)", { + d = make_cholesky_test(q = 3L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 1L, target_i = 0L, target_j = 1L + ) + expect_lt(res$chol_diag_max_diff, 1e-10) + expect_lt(res$cov_diag_max_diff, 1e-10) + expect_lt(res$logdet_diag_diff, 1e-10) +}) + + +# ============================================================================== +# Same tests with different target indices (i=1, j=2) and q=4 +# ============================================================================== + +test_that("log_ggm_ratio_edge matches brute-force (T28, q=4, ij=1,2)", { + d = make_cholesky_test(q = 4L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 7L, target_i = 1L, target_j = 2L + ) + expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) + expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) +}) + +test_that("Cholesky fidelity (T29/T29b, q=4, ij=1,2)", { + d = make_cholesky_test(q = 4L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 7L, target_i = 1L, target_j = 2L + ) + expect_lt(res$chol_max_diff, 1e-10) + expect_lt(res$cov_max_diff, 1e-10) + expect_lt(res$logdet_diff, 1e-10) + expect_lt(res$chol_diag_max_diff, 1e-10) + expect_lt(res$cov_diag_max_diff, 1e-10) + expect_lt(res$logdet_diag_diff, 1e-10) +}) + + +# ============================================================================== +# Test with q=2 (minimum for off-diagonal) — boundary case +# ============================================================================== + +test_that("Rank-1 Cholesky correctness with q=2 boundary (T28-T29b)", { + d = make_cholesky_test(q = 2L) + res = bgms:::test_mixed_mrf_cholesky( + d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, + d$inc_prob, d$edge_ind, d$params, + seed = 99L, target_i = 0L, target_j = 1L + ) + expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) + expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) + expect_lt(res$chol_max_diff, 1e-10) + expect_lt(res$cov_max_diff, 1e-10) + expect_lt(res$logdet_diff, 1e-10) + expect_lt(res$chol_diag_max_diff, 1e-10) + expect_lt(res$cov_diag_max_diff, 1e-10) + expect_lt(res$logdet_diag_diff, 1e-10) +}) From d2d858c88bfc264d736f8596df2f9f67db614961 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 20:40:36 +0100 Subject: [PATCH 11/60] feat: marginal pseudo-likelihood for mixed MRF Add log_marginal_omrf(s) using Theta = Kxx + 2 Kxy Kyy^{-1} Kxy'. Dispatch marginal likelihood in all six Metropolis update functions: - update_main_effect: marginal vs conditional per-node - update_continuous_mean: add sum_s marginal OMRF terms - update_Kxx: recompute Theta before/after proposal - update_Kxy: all p marginal OMRF nodes + save/restore Theta - update_Kyy_offdiag: temporarily install proposed Kyy for Theta - update_Kyy_diag: same pattern as offdiag --- src/models/mixed/mixed_mrf_likelihoods.cpp | 63 ++++++++++++++ src/models/mixed/mixed_mrf_metropolis.cpp | 95 ++++++++++++++++++---- src/models/mixed/mixed_mrf_model.h | 3 + 3 files changed, 147 insertions(+), 14 deletions(-) diff --git a/src/models/mixed/mixed_mrf_likelihoods.cpp b/src/models/mixed/mixed_mrf_likelihoods.cpp index d4deb4a9..65a57993 100644 --- a/src/models/mixed/mixed_mrf_likelihoods.cpp +++ b/src/models/mixed/mixed_mrf_likelihoods.cpp @@ -55,6 +55,69 @@ double MixedMRFModel::log_conditional_omrf(int s) const { } +// ============================================================================= +// log_marginal_omrf +// ============================================================================= +// Marginal OMRF pseudolikelihood for discrete variable s: +// log f(x_s | x_{-s}) using Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' +// +// Differs from conditional form in three ways: +// 1. rest score uses Theta_ instead of Kxx_, minus self-interaction +// 2. scalar bias 2 * Kxy(s,:) * muy added to rest +// 3. numerator includes Theta_(s,s) * sum(x_s^2) +// 4. denominator offsets include c^2 * Theta_(s,s) +// ============================================================================= + +double MixedMRFModel::log_marginal_omrf(int s) const { + int C_s = num_categories_(s); + + // Rest score: Theta-based interaction + Kxy*muy bias + double theta_ss = Theta_(s, s); + arma::vec rest = discrete_observations_dbl_ * Theta_.col(s) + - discrete_observations_dbl_.col(s) * theta_ss + + 2.0 * arma::dot(Kxy_.row(s), muy_); + + // Numerator: dot(x_s, rest) + theta_ss * dot(x_s, x_s) + main effects + double numer = arma::dot(discrete_observations_dbl_.col(s), rest) + + theta_ss * arma::dot(discrete_observations_dbl_.col(s), + discrete_observations_dbl_.col(s)); + + if(is_ordinal_variable_(s)) { + for(int c = 1; c <= C_s; ++c) { + numer += static_cast(counts_per_category_(c, s)) * mux_(s, c - 1); + } + + // Denominator: main_param(c) = mux(s,c) + (c+1)^2 * theta_ss + arma::vec main_param(C_s); + for(int c = 0; c < C_s; ++c) { + main_param(c) = mux_(s, c) + static_cast((c + 1) * (c + 1)) * theta_ss; + } + + arma::vec bound = static_cast(C_s) * rest; + arma::vec denom = compute_denom_ordinal(rest, main_param, bound); + + return numer - arma::accu(bound + ARMA_MY_LOG(denom)); + } else { + // Blume-Capel: alpha * sum(x) + beta * sum(x^2) + double alpha = mux_(s, 0); + double beta = mux_(s, 1); + numer += alpha * static_cast(blume_capel_stats_(0, s)) + + beta * static_cast(blume_capel_stats_(1, s)); + + // Denominator: theta_c includes Theta_(s,s) * (c - ref)^2 + int ref = baseline_category_(s); + double effective_beta = beta + theta_ss; + + arma::vec bound; + arma::vec denom = compute_denom_blume_capel( + rest, alpha, effective_beta, ref, C_s, bound + ); + + return numer - arma::accu(bound + ARMA_MY_LOG(denom)); + } +} + + // ============================================================================= // log_conditional_ggm // ============================================================================= diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index ccdafb7f..f8eecfeb 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -34,11 +34,13 @@ void MixedMRFModel::update_main_effect(int s, int c) { double proposed = rnorm(rng_, current_val, proposal_sd); // Current log-posterior - double ll_curr = log_conditional_omrf(s) + log_beta_prior(current_val, main_alpha_, main_beta_); + double ll_curr = (use_marginal_pl_ ? log_marginal_omrf(s) : log_conditional_omrf(s)) + + log_beta_prior(current_val, main_alpha_, main_beta_); // Proposed log-posterior current = proposed; - double ll_prop = log_conditional_omrf(s) + log_beta_prior(proposed, main_alpha_, main_beta_); + double ll_prop = (use_marginal_pl_ ? log_marginal_omrf(s) : log_conditional_omrf(s)) + + log_beta_prior(proposed, main_alpha_, main_beta_); double ln_alpha = ll_prop - ll_curr; @@ -62,6 +64,10 @@ void MixedMRFModel::update_continuous_mean(int j) { // Current log-posterior (Normal(0,1) prior: -x^2/2 up to constant) double ll_curr = log_conditional_ggm() + R::dnorm(current_val, 0.0, 1.0, true); + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ll_curr += log_marginal_omrf(s); + } // Set proposed value and refresh conditional_mean_ arma::mat cond_mean_saved = conditional_mean_; @@ -69,6 +75,10 @@ void MixedMRFModel::update_continuous_mean(int j) { recompute_conditional_mean(); double ll_prop = log_conditional_ggm() + R::dnorm(proposed, 0.0, 1.0, true); + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ll_prop += log_marginal_omrf(s); + } double ln_alpha = ll_prop - ll_curr; @@ -92,21 +102,34 @@ void MixedMRFModel::update_Kxx(int i, int j) { double proposed = rnorm(rng_, current_val, prop_sd_Kxx_(i, j)); // Current log-posterior - double ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j) - + R::dcauchy(current_val, 0.0, pairwise_scale_, true); + double ll_curr, ll_prop; + if(use_marginal_pl_) { + ll_curr = log_marginal_omrf(i) + log_marginal_omrf(j) + + R::dcauchy(current_val, 0.0, pairwise_scale_, true); - // Set proposed value (symmetric) - Kxx_(i, j) = proposed; - Kxx_(j, i) = proposed; + Kxx_(i, j) = proposed; + Kxx_(j, i) = proposed; + recompute_Theta(); - double ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j) - + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + ll_prop = log_marginal_omrf(i) + log_marginal_omrf(j) + + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + } else { + ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j) + + R::dcauchy(current_val, 0.0, pairwise_scale_, true); + + Kxx_(i, j) = proposed; + Kxx_(j, i) = proposed; + + ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j) + + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + } double ln_alpha = ll_prop - ll_curr; if(std::log(runif(rng_)) >= ln_alpha) { Kxx_(i, j) = current_val; // reject Kxx_(j, i) = current_val; + if(use_marginal_pl_) recompute_Theta(); } } @@ -361,6 +384,21 @@ void MixedMRFModel::update_Kyy_offdiag(int i, int j) { double ln_alpha = log_ggm_ratio_edge(i, j); + // Marginal mode: add OMRF ratio with proposed Theta + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ln_alpha -= log_marginal_omrf(s); + + arma::mat Theta_saved = Theta_; + arma::mat Kyy_saved = Kyy_; + Kyy_ = precision_yy_proposal_; + recompute_Theta(); + for(size_t s = 0; s < p_; ++s) + ln_alpha += log_marginal_omrf(s); + Kyy_ = Kyy_saved; + Theta_ = std::move(Theta_saved); + } + // Prior ratio: Cauchy on off-diag + Gamma(1,1) on diagonal ln_alpha += R::dcauchy(omega_prop_ij, 0.0, pairwise_scale_, true); ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); @@ -405,6 +443,21 @@ void MixedMRFModel::update_Kyy_diag(int i) { double ln_alpha = log_ggm_ratio_diag(i); + // Marginal mode: add OMRF ratio with proposed Theta + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ln_alpha -= log_marginal_omrf(s); + + arma::mat Theta_saved = Theta_; + arma::mat Kyy_saved = Kyy_; + Kyy_ = precision_yy_proposal_; + recompute_Theta(); + for(size_t s = 0; s < p_; ++s) + ln_alpha += log_marginal_omrf(s); + Kyy_ = Kyy_saved; + Theta_ = std::move(Theta_saved); + } + // Prior ratio: Gamma(1,1) on diagonal ln_alpha += R::dgamma(precision_yy_proposal_(i, i), 1.0, 1.0, true); ln_alpha -= R::dgamma(Kyy_(i, i), 1.0, 1.0, true); @@ -436,23 +489,37 @@ void MixedMRFModel::update_Kxy(int i, int j) { double proposed = rnorm(rng_, current_val, prop_sd_Kxy_(i, j)); // Current log-posterior - double ll_curr = log_conditional_omrf(i) + log_conditional_ggm() + double ll_curr = log_conditional_ggm() + R::dcauchy(current_val, 0.0, pairwise_scale_, true); + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ll_curr += log_marginal_omrf(s); + } else { + ll_curr += log_conditional_omrf(i); + } - // Set proposed value and refresh conditional_mean_ + // Set proposed value and refresh caches arma::mat cond_mean_saved = conditional_mean_; + arma::mat Theta_saved; + if(use_marginal_pl_) Theta_saved = Theta_; Kxy_(i, j) = proposed; recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); - double ll_prop = log_conditional_omrf(i) + log_conditional_ggm() + double ll_prop = log_conditional_ggm() + R::dcauchy(proposed, 0.0, pairwise_scale_, true); + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ll_prop += log_marginal_omrf(s); + } else { + ll_prop += log_conditional_omrf(i); + } double ln_alpha = ll_prop - ll_curr; if(std::log(runif(rng_)) >= ln_alpha) { Kxy_(i, j) = current_val; // reject conditional_mean_ = std::move(cond_mean_saved); - } else if(use_marginal_pl_) { - recompute_Theta(); + if(use_marginal_pl_) Theta_ = std::move(Theta_saved); } } diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 81d507e5..412db3cd 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -355,6 +355,9 @@ class MixedMRFModel : public BaseModel { /** Conditional OMRF pseudolikelihood for discrete variable s, summed over all n. */ double log_conditional_omrf(int s) const; + /** Marginal OMRF pseudolikelihood for discrete variable s, using Theta_. */ + double log_marginal_omrf(int s) const; + /** Conditional GGM log-likelihood: log f(y | x), using cached decomposition. */ double log_conditional_ggm() const; From 2b2b7db3b807852d95dd266deb06d08b8bcd9876 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 20:40:46 +0100 Subject: [PATCH 12/60] test: marginal pseudo-likelihood tests (Phase C.5) - Test helper conditionally computes marg_omrf_ll in marginal mode - R reference ref_log_marginal_omrf validated against C++ (ordinal + BC) - Zero-param equality: marginal == conditional when Kxy = 0 - Divergence test: marginal != conditional with nonzero Kxy - Simulation recovery: bgms vs mixedGM (r >= 0.90, p=3, q=2, n=1000) - Wenchuan empirical: bgms vs mixedGM (r >= 0.90, p=4, q=2) --- src/test_mixed_mrf.cpp | 9 + tests/testthat/test-mixed-mrf-marginal.R | 527 +++++++++++++++++++++++ 2 files changed, 536 insertions(+) create mode 100644 tests/testthat/test-mixed-mrf-marginal.R diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp index 38618eec..1c942a77 100644 --- a/src/test_mixed_mrf.cpp +++ b/src/test_mixed_mrf.cpp @@ -153,11 +153,20 @@ Rcpp::List test_mixed_mrf_likelihoods( omrf_ll[s] = model.log_conditional_omrf(s); } + // Evaluate log_marginal_omrf for each discrete variable (marginal mode only) + Rcpp::NumericVector marg_omrf_ll(p); + if(pseudolikelihood == "marginal") { + for(int s = 0; s < p; ++s) { + marg_omrf_ll[s] = model.log_marginal_omrf(s); + } + } + // Evaluate log_conditional_ggm double ggm_ll = model.log_conditional_ggm(); return Rcpp::List::create( Rcpp::Named("omrf_ll") = omrf_ll, + Rcpp::Named("marg_omrf_ll") = marg_omrf_ll, Rcpp::Named("ggm_ll") = ggm_ll ); } diff --git a/tests/testthat/test-mixed-mrf-marginal.R b/tests/testthat/test-mixed-mrf-marginal.R new file mode 100644 index 00000000..6072e1ce --- /dev/null +++ b/tests/testthat/test-mixed-mrf-marginal.R @@ -0,0 +1,527 @@ +# ============================================================================= +# test-mixed-mrf-marginal.R — Phase C marginal pseudo-likelihood tests +# ============================================================================= +# Tests for log_marginal_omrf() and marginal-mode sampler, validated against +# pure-R reference implementations and cross-package comparison with mixedGM. + +# ------------------------------------------------------------------ +# R reference: marginal OMRF pseudolikelihood for variable s +# ------------------------------------------------------------------ +# Computes log f(x_s | x_{-s}) using Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' +# +# @param x_int n x p integer matrix (0-based categories) +# @param Theta p x p marginal interaction matrix +# @param Kxy p x q cross-interactions +# @param mux p x max_cats thresholds / BC coefficients +# @param muy q-vector of continuous means +# @param num_cats p-vector of category counts +# @param is_ordinal p-vector (1 = ordinal, 0 = BC) +# @param baseline_cat p-vector of reference categories +# @param s 0-based variable index +# +# Returns: scalar log-likelihood. +ref_log_marginal_omrf = function(x_int, Theta, Kxy, mux, muy, num_cats, + is_ordinal, baseline_cat, s) { + n = nrow(x_int) + s1 = s + 1L + + # Center BC observations + x = x_int + for(j in seq_len(ncol(x))) { + if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] + } + x_dbl = matrix(as.double(x), nrow = n) + + theta_ss = Theta[s1, s1] + + # Rest score: Theta-based + Kxy*muy bias + rest = x_dbl %*% Theta[, s1] - x_dbl[, s1] * theta_ss + + 2.0 * sum(Kxy[s1, ] * muy) + rest = as.numeric(rest) + + C_s = num_cats[s1] + + if(is_ordinal[s1]) { + # Numerator: dot(x_s, rest) + theta_ss * dot(x_s, x_s) + sum(count_c * mux) + numer = sum(x_dbl[, s1] * rest) + + theta_ss * sum(x_dbl[, s1]^2) + for(c in seq_len(C_s)) { + count_c = sum(x[, s1] == c) + numer = numer + count_c * mux[s1, c] + } + + # Denominator with col_offset = mux + c^2 * theta_ss + log_Z = numeric(n) + for(v in seq_len(n)) { + terms = numeric(C_s + 1) + terms[1] = 0 # reference category (c=0) + for(c in seq_len(C_s)) { + terms[c + 1] = mux[s1, c] + c^2 * theta_ss + c * rest[v] + } + mx = max(terms) + log_Z[v] = mx + log(sum(exp(terms - mx))) + } + return(numer - sum(log_Z)) + } else { + # Blume-Capel: alpha * sum(x) + beta * sum(x^2) + alpha = mux[s1, 1] + beta = mux[s1, 2] + ref = baseline_cat[s1] + + numer = sum(x_dbl[, s1] * rest) + + theta_ss * sum(x_dbl[, s1]^2) + + alpha * sum(x[, s1]) + beta * sum(x[, s1]^2) + + # Effective beta includes theta_ss + eff_beta = beta + theta_ss + + log_Z = numeric(n) + for(v in seq_len(n)) { + cats = 0:C_s + centered = cats - ref + theta = alpha * centered + eff_beta * centered^2 + terms = theta + centered * rest[v] + mx = max(terms) + log_Z[v] = mx + log(sum(exp(terms - mx))) + } + return(numer - sum(log_Z)) + } +} + + +# ------------------------------------------------------------------ +# Test data setup (reuse from likelihood tests) +# ------------------------------------------------------------------ +make_test_data = function() { + set.seed(42) + n = 10L; p = 3L; q = 2L + num_cats = c(2L, 3L, 2L) + is_ordinal = c(1L, 1L, 0L) + baseline_cat = c(0L, 0L, 1L) + + x = matrix(0L, n, p) + x[, 1] = sample(0:2, n, replace = TRUE) + x[, 2] = sample(0:3, n, replace = TRUE) + x[, 3] = sample(0:2, n, replace = TRUE) + y = matrix(rnorm(n * q), n, q) + + pq = p + q + inc_prob = matrix(0.5, pq, pq) + edge_ind = matrix(1L, pq, pq) + diag(edge_ind) = 0L + + list( + n = n, p = p, q = q, + x = x, y = y, + num_cats = num_cats, + is_ordinal = as.integer(is_ordinal), + baseline_cat = baseline_cat, + inc_prob = inc_prob, + edge_ind = edge_ind + ) +} + +build_param_vec = function(p, q, num_cats, is_ordinal) { + num_main = 0L + for(s in seq_len(p)) { + if(is_ordinal[s]) { + num_main = num_main + num_cats[s] + } else { + num_main = num_main + 2L + } + } + num_pairwise_xx = p * (p - 1L) / 2L + num_kyy = q * (q + 1L) / 2L + num_cross = p * q + total = num_main + num_pairwise_xx + q + num_kyy + num_cross + list( + total = total, + num_main = num_main, + num_pairwise_xx = num_pairwise_xx, + q = q, + num_kyy = num_kyy, + num_cross = num_cross, + kyy_start = num_main + num_pairwise_xx + q + ) +} + + +# ============================================================================== +# Test: marginal OMRF at zero params equals conditional OMRF +# ============================================================================== + +test_that("log_marginal_omrf at zero params equals log_conditional_omrf", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + # Kyy = identity + idx = info$kyy_start + for(i in seq_len(d$q)) { + for(j in i:d$q) { + idx = idx + 1L + if(i == j) params[idx] = 1.0 + } + } + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L + ) + + # With Kxy = 0 and Kyy = I, Theta = Kxx + 0 = Kxx and bias = 0, + # so marginal OMRF = conditional OMRF + for(s in seq_len(d$p)) { + expect_equal(res$marg_omrf_ll[s], res$omrf_ll[s], tolerance = 1e-10, + label = paste0("var ", s - 1, " marginal == conditional at zero")) + } +}) + + +# ============================================================================== +# Test: marginal OMRF matches R reference (ordinal, nonzero params) +# ============================================================================== + +test_that("log_marginal_omrf matches R reference (ordinal, nonzero params)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + # Main effects + params[1] = 0.3; params[2] = -0.2 + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 + params[6] = 0.5; params[7] = -0.3 + + # Kxx edges + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 + params[kxx_start + 2] = -0.1 + params[kxx_start + 3] = 0.15 + + # muy + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + params[muy_start + 2] = -0.2 + + # Kyy = SPD + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + + # Kxy + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.1 + params[kxy_start + 2] = -0.05 + params[kxy_start + 3] = 0.08 + params[kxy_start + 4] = 0.12 + params[kxy_start + 5] = -0.07 + params[kxy_start + 6] = 0.04 + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L + ) + + # Build R reference matrices + mux = matrix(0, d$p, max(d$num_cats)) + mux[1, 1:2] = c(0.3, -0.2) + mux[2, 1:3] = c(0.1, 0.4, -0.1) + mux[3, 1:2] = c(0.5, -0.3) + + Kxx = matrix(0, d$p, d$p) + Kxx[1, 2] = Kxx[2, 1] = 0.2 + Kxx[1, 3] = Kxx[3, 1] = -0.1 + Kxx[2, 3] = Kxx[3, 2] = 0.15 + + Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) + Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), d$q, d$q) + muy = c(0.1, -0.2) + + # Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' + Theta = Kxx + 2 * Kxy %*% solve(Kyy) %*% t(Kxy) + + # Check ordinal variables + for(s in 0:1) { + expected = ref_log_marginal_omrf( + d$x, Theta, Kxy, mux, muy, d$num_cats, + d$is_ordinal, d$baseline_cat, s + ) + expect_equal(res$marg_omrf_ll[s + 1], expected, tolerance = 1e-8, + label = paste0("ordinal var ", s)) + } +}) + + +# ============================================================================== +# Test: marginal OMRF matches R reference (Blume-Capel) +# ============================================================================== + +test_that("log_marginal_omrf matches R reference (Blume-Capel, nonzero params)", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + params[1] = 0.3; params[2] = -0.2 + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 + params[6] = 0.5; params[7] = -0.3 + + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 + params[kxx_start + 2] = -0.1 + params[kxx_start + 3] = 0.15 + + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + params[muy_start + 2] = -0.2 + + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.1 + params[kxy_start + 2] = -0.05 + params[kxy_start + 3] = 0.08 + params[kxy_start + 4] = 0.12 + params[kxy_start + 5] = -0.07 + params[kxy_start + 6] = 0.04 + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L + ) + + mux = matrix(0, d$p, max(d$num_cats)) + mux[1, 1:2] = c(0.3, -0.2) + mux[2, 1:3] = c(0.1, 0.4, -0.1) + mux[3, 1:2] = c(0.5, -0.3) + + Kxx = matrix(0, d$p, d$p) + Kxx[1, 2] = Kxx[2, 1] = 0.2 + Kxx[1, 3] = Kxx[3, 1] = -0.1 + Kxx[2, 3] = Kxx[3, 2] = 0.15 + + Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) + Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), d$q, d$q) + muy = c(0.1, -0.2) + + Theta = Kxx + 2 * Kxy %*% solve(Kyy) %*% t(Kxy) + + # Test BC variable (s = 2, 0-based) + expected = ref_log_marginal_omrf( + d$x, Theta, Kxy, mux, muy, d$num_cats, + d$is_ordinal, d$baseline_cat, s = 2 + ) + expect_equal(res$marg_omrf_ll[3], expected, tolerance = 1e-8) +}) + + +# ============================================================================== +# Test: marginal OMRF differs from conditional when Kxy != 0 +# ============================================================================== + +test_that("log_marginal_omrf differs from log_conditional_omrf with nonzero Kxy", { + d = make_test_data() + info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) + params = rep(0, info$total) + + params[1] = 0.3; params[2] = -0.2 + params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 + params[6] = 0.5; params[7] = -0.3 + + kxx_start = info$num_main + params[kxx_start + 1] = 0.2 + + muy_start = info$num_main + info$num_pairwise_xx + params[muy_start + 1] = 0.1 + + kyy_start = info$kyy_start + params[kyy_start + 1] = 2.0 + params[kyy_start + 2] = 0.3 + params[kyy_start + 3] = 1.5 + + # Nonzero Kxy makes marginal != conditional + kxy_start = kyy_start + info$num_kyy + params[kxy_start + 1] = 0.3 + params[kxy_start + 2] = -0.2 + + res = bgms:::test_mixed_mrf_likelihoods( + d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, + d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L + ) + + # At least one variable should differ + diffs = abs(res$marg_omrf_ll - res$omrf_ll) + expect_true(max(diffs) > 0.01, + label = "marginal and conditional OMRF differ with nonzero Kxy") +}) + + +# ============================================================================== +# Helper: extract parameter matrices from bgms sample matrix +# ============================================================================== +# (Same as in test-mixed-mrf-sampling.R; duplicated here so marginal tests +# are self-contained.) +extract_bgms_estimates = function(samples, p, q, num_cats_bgms) { + S = colMeans(samples) + idx = 1L + max_cat = max(num_cats_bgms) + mux = matrix(0, p, max_cat) + for(s in 1:p) { + for(c in seq_len(num_cats_bgms[s])) { + mux[s, c] = S[idx]; idx = idx + 1L + } + } + Kxx = matrix(0, p, p) + for(i in 1:(p - 1)) for(j in (i + 1):p) { + Kxx[i, j] = Kxx[j, i] = S[idx]; idx = idx + 1L + } + muy = S[idx:(idx + q - 1)]; idx = idx + q + Kyy = matrix(0, q, q) + for(i in 1:q) for(j in i:q) { + Kyy[i, j] = Kyy[j, i] = S[idx]; idx = idx + 1L + } + Kxy = matrix(S[idx:(idx + p * q - 1)], nrow = p, ncol = q, byrow = TRUE) + list(mux = mux, Kxx = Kxx, muy = muy, Kyy = Kyy, Kxy = Kxy) +} + + +# ============================================================================== +# Test: marginal mode sampler agrees with mixedGM (simulation) +# ============================================================================== + +test_that("marginal PL sampler agrees with mixedGM (ordinal simulation)", { + skip_on_cran() + skip_if_not_installed("mixedGM") + + p = 3L; q = 2L; n = 1000L + + Kxx_true = matrix(c(0, 0.4, -0.2, + 0.4, 0, 0.3, + -0.2, 0.3, 0), 3, 3) + Kxy_true = matrix(c(0.2, -0.1, 0.15, + 0.1, 0.3, -0.2), nrow = p, ncol = q) + Kyy_true = matrix(c(1.3, 0.2, 0.2, 1.1), 2, 2) + mux_true = matrix(c(0.5, -0.5, 0.3, + -0.3, -1.0, -0.5), nrow = p, ncol = 2) + muy_true = c(0.5, -0.3) + + set.seed(456) + sim = mixedGM::mixed_gibbs_generate( + n = n, Kxx = Kxx_true, Kxy = Kxy_true, Kyy = Kyy_true, + mux = mux_true, muy = muy_true, + num_categories = rep(3L, p), n_burnin = 1000 + ) + + # --- run mixedGM (marginal PL) --- + set.seed(42) + mgm = mixedGM::mixed_sampler( + x = sim$x, y = sim$y, num_categories = rep(3L, p), + n_warmup = 4000L, n_samples = 8000L, + edge_selection = FALSE, verbose = FALSE, + pseudolikelihood = "marginal" + ) + mgm_est = mgm$final_parameters + + # --- run bgms (marginal PL) --- + num_cats_bgms = rep(2L, p) + pq = p + q + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + sim$x, sim$y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, FALSE, "marginal", + 4000L, 8000L, 42L + ) + bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) + + # --- correlations bgms vs mixedGM (r >= 0.90) --- + kxx_ut = upper.tri(bgms_est$Kxx) + expect_gt( + cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.90, + label = "Kxx bgms-mgm correlation (marginal sim)" + ) + expect_gt( + cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.90, + label = "Kxy bgms-mgm correlation (marginal sim)" + ) + expect_gt( + cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.90, + label = "Kyy bgms-mgm correlation (marginal sim)" + ) + expect_gt( + cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.90, + label = "mux bgms-mgm correlation (marginal sim)" + ) +}) + + +# ============================================================================== +# Test: marginal mode sampler agrees with mixedGM on Wenchuan data +# ============================================================================== + +test_that("marginal PL sampler agrees with mixedGM on Wenchuan data", { + skip_on_cran() + skip_if_not_installed("mixedGM") + + data(Wenchuan, package = "bgms") + W = na.omit(Wenchuan) + + p = 4L; q = 2L + x = as.matrix(W[, 1:p]) - 1L # convert 1-5 to 0-4 + y = as.matrix(W[, (p + 1):(p + q)]) + + num_cats_mgm = rep(5L, p) # total categories for mixedGM + num_cats_bgms = rep(4L, p) # max category index for bgms + + # --- mixedGM (marginal PL) --- + set.seed(42) + mgm = mixedGM::mixed_sampler( + x = x, y = y, num_categories = num_cats_mgm, + n_warmup = 4000L, n_samples = 8000L, + edge_selection = FALSE, verbose = FALSE, + pseudolikelihood = "marginal" + ) + mgm_est = mgm$final_parameters + + # --- bgms (marginal PL) --- + pq = p + q + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, FALSE, "marginal", + 4000L, 8000L, 42L + ) + bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) + + # --- correlations bgms vs mixedGM (r >= 0.90) --- + kxx_ut = upper.tri(bgms_est$Kxx) + expect_gt( + cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.90, + label = "Kxx bgms-mgm correlation (marginal Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.90, + label = "Kxy bgms-mgm correlation (marginal Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.90, + label = "Kyy bgms-mgm correlation (marginal Wenchuan)" + ) + expect_gt( + cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.90, + label = "mux bgms-mgm correlation (marginal Wenchuan)" + ) + + # --- Kxx sign patterns agree --- + expect_true( + all(sign(bgms_est$Kxx[kxx_ut]) == sign(mgm_est$Kxx[kxx_ut])), + label = "Kxx signs agree (marginal Wenchuan)" + ) +}) From ca1681744229a65910fe16255c5d2c0a6d8cdf88 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 22:28:23 +0100 Subject: [PATCH 13/60] feat: mixed MRF edge selection (Phase D) Implement spike-and-slab reversible-jump MH for all three edge types: - update_edge_indicator_Kxx: discrete-discrete birth/death - update_edge_indicator_Kyy: Cholesky-reparameterized continuous-continuous - update_edge_indicator_Kxy: cross-type birth/death Add update_edge_indicators() dispatcher with shuffled edge ordering, initialize_graph() for prior-based initial graph draw, and Step 6 in do_one_metropolis_step(). Test helper updated to activate edge selection after warmup and return indicator samples. Bug fix: Kyy birth proposal uses C[3]*epsilon (scale only), matching the GGM model, not C[2]+C[3]*epsilon (which mismatched the death reversal density). Plan updated: Phase D marked complete, D.7 added for pairwise prior standardization (OMRF-style scaling factors for Kxx edges). --- dev/mixedmrf/implementation_plan.md | 50 ++++- src/models/mixed/mixed_mrf_metropolis.cpp | 251 ++++++++++++++++++++++ src/models/mixed/mixed_mrf_model.cpp | 83 ++++++- src/models/mixed/mixed_mrf_model.h | 11 + src/test_mixed_mrf.cpp | 23 +- 5 files changed, 402 insertions(+), 16 deletions(-) diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 0f1d63f4..a4003ab3 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -307,11 +307,11 @@ add the new Rcpp export to `src/RcppExports.cpp`, `R/RcppExports.R`, and | Phase | What | Depends on | Deliverable | |-------|------|------------|-------------| -| **A** | Skeleton: class, data structures, `BaseModel` overrides | — | Compiles, no sampling | -| **B** | Conditional PL: all 5 MH updates, no edge selection | A | Recovery test passes (cond PL, estimation only) | -| **B+** | Rank-1 Cholesky optimization for Kyy updates | B | Same correctness, $O(q^2)$ per Kyy move instead of $O(q^3)$ | -| **C** | Marginal PL: $\Theta$ caching, marginal OMRF, $\mu_y$ full sweep | B+ | Recovery test passes (marg PL, estimation only) | -| **D** | Edge selection: 3 RJ sweeps | B+ | Structure recovery test passes | +| **A** | Skeleton: class, data structures, `BaseModel` overrides | — | Compiles, no sampling | ✅ | +| **B** | Conditional PL: all 5 MH updates, no edge selection | A | Recovery test passes (cond PL, estimation only) | ✅ | +| **B+** | Rank-1 Cholesky optimization for Kyy updates | B | Same correctness, $O(q^2)$ per Kyy move instead of $O(q^3)$ | ✅ | +| **C** | Marginal PL: $\Theta$ caching, marginal OMRF, $\mu_y$ full sweep | B+ | Recovery test passes (marg PL, estimation only) | ✅ | +| **D** | Edge selection: 3 RJ sweeps | B+ | Structure recovery test passes | ✅ | | **E** | R interface: `bgm()` dispatch, output formatting | B+ | End-to-end `bgm(mixed_data)` works | | **F** | Warmup schedule, adaptation, diagnostics | E | Full warmup pipeline | | **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | @@ -1174,9 +1174,9 @@ in the two modes. --- -## Phase D — Edge selection +## Phase D — Edge selection ✅ -### D.1 Discrete edge selection (`update_edge_indicator_Kxx`) +### D.1 Discrete edge selection (`update_edge_indicator_Kxx`) ✅ For each pair $(i, j)$ with $i < j$: 1. Propose $G'_{xx,ij} = 1 - G_{xx,ij}$ @@ -1197,7 +1197,7 @@ All log-density calls must use `log = true` to keep all terms on the log scale. Follows `cond_omrf_update_association_indicator_pair` in the R prototype. Transplant the Hastings terms verbatim from that R code; do not re-derive. -### D.2 Continuous edge selection (`update_edge_indicator_Kyy`) +### D.2 Continuous edge selection (`update_edge_indicator_Kyy`) ✅ Cholesky-based birth/death as in `GGMModel`: 1. Permute, Cholesky, extract constants @@ -1213,7 +1213,7 @@ Follows `cond_ggm_update_precision_indicator_pair` in the R prototype. **Reuse opportunity:** Directly reuse `GGMModel::update_edge_indicator_parameter_pair` logic, adapted for the mixed model's conditional GGM likelihood. -### D.3 Cross edge selection (`update_edge_indicator_Kxy`) +### D.3 Cross edge selection (`update_edge_indicator_Kxy`) ✅ Cross-edges $G_{xy,ij}$ share the same Bernoulli inclusion prior $\pi$ as $G_{xx}$ and $G_{yy}$ (decided). A single $\pi$ keeps the SBM prior @@ -1233,7 +1233,7 @@ For each pair $(i, j)$ where $i \in \{1..p\}$, $j \in \{1..q\}$: Follows `cond_omrf_update_cross_association_indicator_pair` in the R prototype. -### D.4 Implement `update_edge_indicators()` +### D.4 Implement `update_edge_indicators()` ✅ ```cpp void MixedMRFModel::update_edge_indicators() { @@ -1275,13 +1275,41 @@ require no special handling: the rest-score uses the centered observations, and the likelihood function dispatches to the Blume-Capel denominator as needed. -### D.6 Testing checkpoint — edge selection +### D.6 Testing checkpoint — edge selection ✅ **Test 6 (T15): Structure recovery** - Generate data from a sparse mixed graph (some edges zero) - Run with edge selection, check posterior inclusion probabilities recover the true structure (true edges have high PIP, false edges low) +### D.7 Pairwise prior standardization + +The pure OMRF scales the Cauchy slab prior per edge pair using +`pairwise_scaling_factors_`, computed in `compute_scaling_factors()`. +For two ordinal variables with $M_i$ and $M_j$ categories respectively, +the factor is $M_i \times M_j$; for Blume-Capel pairs it is the maximum +absolute product of the endpoint ranges; for mixed ordinal/Blume-Capel +pairs it is the corresponding cross product. This makes the prior +comparable across variable pairs with different numbers of categories. + +The mixed MRF currently uses a single `pairwise_scale_` for all Kxx +edges and does not apply per-pair scaling. This must be fixed: + +1. **Add `pairwise_scaling_factors_xx_`** (p × p matrix) to + `MixedMRFModel`. Kxy and Kyy edges are not scaled (continuous + variables have no category-count dependence; cross-type edges + couple a score in {0..M} with a continuous value, and the OMRF + does not scale cross-type edges either). +2. **Compute the scaling factors** in the R interface layer (Phase E) + using the existing `compute_scaling_factors()` applied to the + discrete block, and pass them to `MixedMRFModel`. +3. **Apply** `pairwise_scale_ * pairwise_scaling_factors_xx_(i, j)` in + `update_Kxx()`, `update_edge_indicator_Kxx()`, and anywhere + else the Cauchy slab prior appears for Kxx edges. +4. **Test** that a model with variables of differing category counts + produces sensible edge estimates (no systematic bias toward + high-category pairs). + --- ## Phase E — R interface and integration diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index f8eecfeb..ca7c6d9b 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -523,3 +523,254 @@ void MixedMRFModel::update_Kxy(int i, int j) { if(use_marginal_pl_) Theta_ = std::move(Theta_saved); } } + + +// ============================================================================= +// update_edge_indicator_Kxx +// ============================================================================= +// Reversible-jump birth/death for a discrete-discrete edge (i, j). +// Birth (G=0→1): propose k ~ N(0, σ), accept with slab + Hastings. +// Death (G=1→0): set k = 0, accept with reverse terms. +// Follows cond_omrf_update_association_indicator_pair in mixedGM. +// ============================================================================= + +void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { + double k_curr = Kxx_(i, j); + double prop_sd = prop_sd_Kxx_(i, j); + + int g_curr = gxx(i, j); + int g_prop = 1 - g_curr; + + double k_prop; + if(g_prop == 1) { + k_prop = rnorm(rng_, k_curr, prop_sd); // k_curr = 0 on a true birth + } else { + k_prop = 0.0; + } + + // --- Likelihood ratio --- + double ll_curr, ll_prop; + if(use_marginal_pl_) { + ll_curr = log_marginal_omrf(i) + log_marginal_omrf(j); + + Kxx_(i, j) = k_prop; + Kxx_(j, i) = k_prop; + recompute_Theta(); + + ll_prop = log_marginal_omrf(i) + log_marginal_omrf(j); + + // Restore + Kxx_(i, j) = k_curr; + Kxx_(j, i) = k_curr; + recompute_Theta(); + } else { + ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j); + + Kxx_(i, j) = k_prop; + Kxx_(j, i) = k_prop; + + ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j); + + // Restore + Kxx_(i, j) = k_curr; + Kxx_(j, i) = k_curr; + } + + double ln_alpha = ll_prop - ll_curr; + + if(g_prop == 1) { + // Birth: add slab prior, subtract proposal density, inclusion prior + ln_alpha += R::dcauchy(k_prop, 0.0, pairwise_scale_, true); + ln_alpha -= R::dnorm(k_prop, k_curr, prop_sd, true); + ln_alpha += std::log(inclusion_probability_(i, j)) + - std::log(1.0 - inclusion_probability_(i, j)); + } else { + // Death: subtract slab prior, add reverse proposal density, inclusion prior + ln_alpha -= R::dcauchy(k_curr, 0.0, pairwise_scale_, true); + ln_alpha += R::dnorm(k_curr, k_prop, prop_sd, true); + ln_alpha -= std::log(inclusion_probability_(i, j)) + - std::log(1.0 - inclusion_probability_(i, j)); + } + + if(std::log(runif(rng_)) < ln_alpha) { + Kxx_(i, j) = k_prop; + Kxx_(j, i) = k_prop; + set_gxx(i, j, g_prop); + if(use_marginal_pl_) recompute_Theta(); + } +} + + +// ============================================================================= +// update_edge_indicator_Kyy +// ============================================================================= +// Reversible-jump birth/death for a continuous-continuous edge (i, j). +// Uses Cholesky reparameterization (permute-free constants extraction). +// Birth (G=0→1): propose ε ~ N(0, σ), k = C[2]*ε, constrain diagonal. +// Death (G=1→0): set off-diag = 0, constrain diagonal. +// Follows cond_ggm_update_precision_indicator_pair in mixedGM. +// ============================================================================= + +void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { + get_kyy_constants(i, j); + + int g_curr = gyy(i, j); + int g_prop = 1 - g_curr; + + double omega_prop_ij, omega_prop_jj; + + if(g_prop == 1) { + // Birth: propose from N(0, σ) on reparameterized scale + double epsilon = rnorm(rng_, 0.0, prop_sd_Kyy_(i, j)); + omega_prop_ij = kyy_constants_[3] * epsilon; + omega_prop_jj = kyy_constrained_diagonal(omega_prop_ij); + } else { + // Death: set off-diagonal to 0 + omega_prop_ij = 0.0; + omega_prop_jj = kyy_constrained_diagonal(0.0); + } + + // Fill proposal + precision_yy_proposal_ = Kyy_; + precision_yy_proposal_(i, j) = omega_prop_ij; + precision_yy_proposal_(j, i) = omega_prop_ij; + precision_yy_proposal_(j, j) = omega_prop_jj; + + // --- Likelihood ratio --- + double ln_alpha = log_ggm_ratio_edge(i, j); + + if(use_marginal_pl_) { + for(size_t s = 0; s < p_; ++s) + ln_alpha -= log_marginal_omrf(s); + + arma::mat Theta_saved = Theta_; + arma::mat Kyy_saved = Kyy_; + Kyy_ = precision_yy_proposal_; + recompute_Theta(); + for(size_t s = 0; s < p_; ++s) + ln_alpha += log_marginal_omrf(s); + Kyy_ = Kyy_saved; + Theta_ = std::move(Theta_saved); + } + + // --- Spike-and-slab terms --- + if(g_prop == 1) { + // Birth: add slab prior on proposed off-diag + ln_alpha += R::dcauchy(omega_prop_ij, 0.0, pairwise_scale_, true); + // Subtract proposal density: dnorm(k_prop / C[2], 0, σ) / C[2] + // = dnorm(epsilon, 0, σ) / C[2] + ln_alpha -= R::dnorm(omega_prop_ij / kyy_constants_[3], 0.0, + prop_sd_Kyy_(i, j), true) + - std::log(kyy_constants_[3]); + // Inclusion prior: log(π / (1-π)) + ln_alpha += std::log(inclusion_probability_(p_ + i, p_ + j)) + - std::log(1.0 - inclusion_probability_(p_ + i, p_ + j)); + } else { + // Death: subtract slab prior on current off-diag + ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); + // Add reverse proposal density: dnorm(k_curr / C[2], 0, σ) / C[2] + ln_alpha += R::dnorm(Kyy_(i, j) / kyy_constants_[3], 0.0, + prop_sd_Kyy_(i, j), true) + - std::log(kyy_constants_[3]); + // Inclusion prior: log((1-π) / π) + ln_alpha -= std::log(inclusion_probability_(p_ + i, p_ + j)) + - std::log(1.0 - inclusion_probability_(p_ + i, p_ + j)); + } + + if(std::log(runif(rng_)) < ln_alpha) { + double old_ij = Kyy_(i, j); + double old_jj = Kyy_(j, j); + + Kyy_(i, j) = omega_prop_ij; + Kyy_(j, i) = omega_prop_ij; + Kyy_(j, j) = omega_prop_jj; + + set_gyy(i, j, g_prop); + cholesky_update_after_kyy_edge(old_ij, old_jj, i, j); + recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); + } +} + + +// ============================================================================= +// update_edge_indicator_Kxy +// ============================================================================= +// Reversible-jump birth/death for a cross-type edge (i, j). +// Birth (G=0→1): propose k ~ N(0, σ). +// Death (G=1→0): set k = 0. +// Follows cond_omrf_update_cross_association_indicator_pair in mixedGM. +// ============================================================================= + +void MixedMRFModel::update_edge_indicator_Kxy(int i, int j) { + double k_curr = Kxy_(i, j); + double prop_sd = prop_sd_Kxy_(i, j); + + int g_curr = gxy(i, j); + int g_prop = 1 - g_curr; + + double k_prop; + if(g_prop == 1) { + k_prop = rnorm(rng_, k_curr, prop_sd); // k_curr = 0 on a true birth + } else { + k_prop = 0.0; + } + + // --- Likelihood ratio --- + double ll_curr, ll_prop; + if(use_marginal_pl_) { + ll_curr = log_conditional_ggm(); + for(size_t s = 0; s < p_; ++s) + ll_curr += log_marginal_omrf(s); + + arma::mat cond_mean_saved = conditional_mean_; + arma::mat Theta_saved = Theta_; + Kxy_(i, j) = k_prop; + recompute_conditional_mean(); + recompute_Theta(); + + ll_prop = log_conditional_ggm(); + for(size_t s = 0; s < p_; ++s) + ll_prop += log_marginal_omrf(s); + + // Restore + Kxy_(i, j) = k_curr; + conditional_mean_ = std::move(cond_mean_saved); + Theta_ = std::move(Theta_saved); + } else { + ll_curr = log_conditional_omrf(i) + log_conditional_ggm(); + + arma::mat cond_mean_saved = conditional_mean_; + Kxy_(i, j) = k_prop; + recompute_conditional_mean(); + + ll_prop = log_conditional_omrf(i) + log_conditional_ggm(); + + // Restore + Kxy_(i, j) = k_curr; + conditional_mean_ = std::move(cond_mean_saved); + } + + double ln_alpha = ll_prop - ll_curr; + + if(g_prop == 1) { + // Birth + ln_alpha += R::dcauchy(k_prop, 0.0, pairwise_scale_, true); + ln_alpha -= R::dnorm(k_prop, k_curr, prop_sd, true); + ln_alpha += std::log(inclusion_probability_(i, p_ + j)) + - std::log(1.0 - inclusion_probability_(i, p_ + j)); + } else { + // Death + ln_alpha -= R::dcauchy(k_curr, 0.0, pairwise_scale_, true); + ln_alpha += R::dnorm(k_curr, k_prop, prop_sd, true); + ln_alpha -= std::log(inclusion_probability_(i, p_ + j)) + - std::log(1.0 - inclusion_probability_(i, p_ + j)); + } + + if(std::log(runif(rng_)) < ln_alpha) { + Kxy_(i, j) = k_prop; + set_gxy(i, j, g_prop); + recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); + } +} diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index f8bb00b1..c1ddc812 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -471,15 +471,92 @@ void MixedMRFModel::do_one_metropolis_step(int /*iteration*/) { for(size_t j = 0; j < q_; ++j) if(!edge_selection_active_ || gxy(i, j) == 1) update_Kxy(i, j); + + // Step 6: Edge selection (reversible-jump birth/death) + update_edge_indicators(); } void MixedMRFModel::update_edge_indicators() { - // Phase D: reversible-jump edge birth/death moves + if(!edge_selection_active_) return; + + // Discrete-discrete edges (shuffled order) + for(size_t e = 0; e < num_pairwise_xx_; ++e) { + size_t idx = edge_order_xx_(e); + // Decode upper-triangle index to (i, j) + size_t i = 0, j = 1; + size_t count = 0; + for(i = 0; i < p_ - 1; ++i) { + size_t row_len = p_ - 1 - i; + if(count + row_len > idx) { + j = i + 1 + (idx - count); + break; + } + count += row_len; + } + update_edge_indicator_Kxx(i, j); + } + + // Continuous-continuous edges (shuffled order) + for(size_t e = 0; e < num_pairwise_yy_; ++e) { + size_t idx = edge_order_yy_(e); + size_t i = 0, j = 1; + size_t count = 0; + for(i = 0; i < q_ - 1; ++i) { + size_t row_len = q_ - 1 - i; + if(count + row_len > idx) { + j = i + 1 + (idx - count); + break; + } + count += row_len; + } + update_edge_indicator_Kyy(i, j); + } + + // Cross edges (shuffled order) + for(size_t e = 0; e < num_cross_; ++e) { + size_t idx = edge_order_xy_(e); + size_t i = idx / q_; + size_t j = idx % q_; + update_edge_indicator_Kxy(i, j); + } } void MixedMRFModel::initialize_graph() { - // Phase D: random graph initialization for edge selection - // For now, start with all edges included (matching initial_edge_indicators) + // Draw initial graph from prior inclusion probabilities. + // Zero out parameters for excluded edges. + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(runif(rng_) >= inclusion_probability_(i, j)) { + set_gxx(i, j, 0); + Kxx_(i, j) = 0.0; + Kxx_(j, i) = 0.0; + } + } + } + + for(size_t i = 0; i < q_ - 1; ++i) { + for(size_t j = i + 1; j < q_; ++j) { + if(runif(rng_) >= inclusion_probability_(p_ + i, p_ + j)) { + set_gyy(i, j, 0); + Kyy_(i, j) = 0.0; + Kyy_(j, i) = 0.0; + } + } + } + // Recompute Kyy decomposition after potential zeroing + recompute_Kyy_decomposition(); + recompute_conditional_mean(); + + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(runif(rng_) >= inclusion_probability_(i, p_ + j)) { + set_gxy(i, j, 0); + Kxy_(i, j) = 0.0; + } + } + } + recompute_conditional_mean(); + if(use_marginal_pl_) recompute_Theta(); } void MixedMRFModel::prepare_iteration() { diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 412db3cd..7c1b3f69 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -408,6 +408,17 @@ class MixedMRFModel : public BaseModel { /** Update one cross interaction: Kxy_(i, j). */ void update_Kxy(int i, int j); + // --- Edge-indicator update sweeps (Phase D) --- + + /** Reversible-jump birth/death for one Kxx edge (discrete-discrete). */ + void update_edge_indicator_Kxx(int i, int j); + + /** Reversible-jump birth/death for one Kyy edge (continuous-continuous). */ + void update_edge_indicator_Kyy(int i, int j); + + /** Reversible-jump birth/death for one Kxy edge (cross-type). */ + void update_edge_indicator_Kxy(int i, int j); + // ========================================================================= // Edge-indicator accessor helpers // ========================================================================= diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp index 1c942a77..76dc1d1d 100644 --- a/src/test_mixed_mrf.cpp +++ b/src/test_mixed_mrf.cpp @@ -203,22 +203,41 @@ Rcpp::List test_mixed_mrf_sampler( size_t full_dim = model.full_parameter_dimension(); - // Warmup (discard samples) + // Warmup (discard samples, no edge selection yet) for(int iter = 0; iter < n_warmup; ++iter) { + model.prepare_iteration(); model.do_one_metropolis_step(iter); } + // Activate edge selection after warmup + if(edge_selection) { + model.set_edge_selection_active(true); + } + // Sampling arma::mat samples(n_samples, full_dim); + int num_indicators = model.get_num_pairwise(); + arma::imat indicator_samples(n_samples, num_indicators); + for(int iter = 0; iter < n_samples; ++iter) { + model.prepare_iteration(); model.do_one_metropolis_step(n_warmup + iter); samples.row(iter) = model.get_full_vectorized_parameters().t(); + if(edge_selection) { + indicator_samples.row(iter) = model.get_vectorized_indicator_parameters().t(); + } } - return Rcpp::List::create( + Rcpp::List result = Rcpp::List::create( Rcpp::Named("samples") = samples, Rcpp::Named("full_parameter_dimension") = full_dim ); + + if(edge_selection) { + result["indicator_samples"] = indicator_samples; + } + + return result; } From ea8c41b7cc5591ce0e7cbece156851775a44d609 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Fri, 6 Mar 2026 22:28:35 +0100 Subject: [PATCH 14/60] test: mixed MRF edge selection (Phase D) --- .../testthat/test-mixed-mrf-edge-selection.R | 326 ++++++++++++++++++ tests/testthat/test-mixed-mrf-marginal.R | 2 +- 2 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 tests/testthat/test-mixed-mrf-edge-selection.R diff --git a/tests/testthat/test-mixed-mrf-edge-selection.R b/tests/testthat/test-mixed-mrf-edge-selection.R new file mode 100644 index 00000000..cfb5b0ca --- /dev/null +++ b/tests/testthat/test-mixed-mrf-edge-selection.R @@ -0,0 +1,326 @@ +# ============================================================================= +# test-mixed-mrf-edge-selection.R — Phase D edge selection tests +# ============================================================================= +# Validates that update_edge_indicators() produces correct spike-and-slab +# structure learning via reversible-jump Metropolis-Hastings. +# +# Strategy: generate from a sparse graph with known zero edges, run the +# sampler with edge_selection = TRUE, and check that posterior inclusion +# probabilities (PIPs) correctly separate true edges from null edges. + +skip_if_not_installed("mixedGM") + +# --------------------------------------------------------------------------- +# Helper: extract edge indicators from indicator_samples +# --------------------------------------------------------------------------- +# Vectorization order: Gxx upper-tri, Gyy upper-tri, Gxy row-major +extract_pip = function(indicator_samples, p, q) { + pip = colMeans(indicator_samples) + idx = 1L + + # 1. Gxx upper-triangle + n_xx = p * (p - 1) / 2 + pip_xx = pip[idx:(idx + n_xx - 1)]; idx = idx + n_xx + + Gxx = matrix(0, p, p) + k = 1L + for(i in 1:(p - 1)) for(j in (i + 1):p) { + Gxx[i, j] = Gxx[j, i] = pip_xx[k]; k = k + 1L + } + + # 2. Gyy upper-triangle + n_yy = q * (q - 1) / 2 + Gyy = matrix(0, q, q) + if(n_yy > 0) { + pip_yy = pip[idx:(idx + n_yy - 1)]; idx = idx + n_yy + k = 1L + for(i in 1:(q - 1)) for(j in (i + 1):q) { + Gyy[i, j] = Gyy[j, i] = pip_yy[k]; k = k + 1L + } + } + + # 3. Gxy row-major + n_xy = p * q + pip_xy = pip[idx:(idx + n_xy - 1)] + Gxy = matrix(pip_xy, nrow = p, ncol = q, byrow = TRUE) + + list(Gxx = Gxx, Gyy = Gyy, Gxy = Gxy) +} + + +# =========================================================================== +# Test 1: Edge selection on simulation data (conditional PL) +# =========================================================================== +test_that("edge selection recovers sparse structure (conditional PL)", { + skip_on_cran() + + p = 3L; q = 2L; n = 800L + num_cats_mgm = rep(3L, p) + num_cats_bgms = rep(2L, p) + + # Sparse graph: only (1,2) in Kxx, (1,2) in Kxy; Kyy has (1,2) edge + Kxx_true = matrix(0, p, p) + Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 + + Kyy_true = diag(q) + Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 + + Kxy_true = matrix(0, p, q) + Kxy_true[1, 2] = 0.3 + + mux_true = matrix(0, p, max(num_cats_bgms)) + mux_true[, 1] = c(-0.5, 0.3, -0.2) + mux_true[, 2] = c(-1.0, -0.8, -0.6) + muy_true = c(0.5, -0.3) + + # Generate data using mixedGM + set.seed(123) + sim = mixedGM::mixed_gibbs_generate( + n = n, num_categories = num_cats_mgm, + mux = mux_true, Kxx = Kxx_true, + muy = muy_true, Kyy = Kyy_true, + Kxy = Kxy_true, + n_burnin = 3000L + ) + + x = sim$x + y = sim$y + pq = p + q + + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, TRUE, "conditional", + 3000L, 5000L, 42L + ) + + pips = extract_pip(bgms_out$indicator_samples, p, q) + + # True edges should have high PIP + expect_gt(pips$Gxx[1, 2], 0.5, label = "Kxx(1,2) PIP > 0.5") + expect_gt(pips$Gxy[1, 2], 0.5, label = "Kxy(1,2) PIP > 0.5") + expect_gt(pips$Gyy[1, 2], 0.5, label = "Kyy(1,2) PIP > 0.5") + + # Most null edges should have low PIP (allow one false positive due to + + # conditional PL sensitivity with small p, q) + null_kxx = c(pips$Gxx[1, 3], pips$Gxx[2, 3]) + null_kxy = c(pips$Gxy[2, 1], pips$Gxy[2, 2], + pips$Gxy[3, 1], pips$Gxy[3, 2]) + expect_lt(mean(c(null_kxx, null_kxy) > 0.5), 0.5, + label = "Fewer than half of null edges are false positives") + expect_lt(median(c(null_kxx, null_kxy)), 0.3, + label = "Median null PIP is low") +}) + + +# =========================================================================== +# Test 2: Edge selection on simulation data (marginal PL) +# =========================================================================== +test_that("edge selection recovers sparse structure (marginal PL)", { + skip_on_cran() + + p = 3L; q = 2L; n = 800L + num_cats_mgm = rep(3L, p) + num_cats_bgms = rep(2L, p) + + Kxx_true = matrix(0, p, p) + Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 + + Kyy_true = diag(q) + Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 + + Kxy_true = matrix(0, p, q) + Kxy_true[1, 2] = 0.3 + + mux_true = matrix(0, p, max(num_cats_bgms)) + mux_true[, 1] = c(-0.5, 0.3, -0.2) + mux_true[, 2] = c(-1.0, -0.8, -0.6) + muy_true = c(0.5, -0.3) + + set.seed(123) + sim = mixedGM::mixed_gibbs_generate( + n = n, num_categories = num_cats_mgm, + mux = mux_true, Kxx = Kxx_true, + muy = muy_true, Kyy = Kyy_true, + Kxy = Kxy_true, + n_burnin = 3000L + ) + + x = sim$x + y = sim$y + pq = p + q + + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, TRUE, "marginal", + 3000L, 5000L, 42L + ) + + pips = extract_pip(bgms_out$indicator_samples, p, q) + + # True edges should have high PIP + expect_gt(pips$Gxx[1, 2], 0.5, label = "Kxx(1,2) PIP > 0.5") + expect_gt(pips$Gxy[1, 2], 0.5, label = "Kxy(1,2) PIP > 0.5") + expect_gt(pips$Gyy[1, 2], 0.5, label = "Kyy(1,2) PIP > 0.5") + + # Null edges low PIP + expect_lt(pips$Gxx[1, 3], 0.5, label = "Kxx(1,3) null PIP < 0.5") + expect_lt(pips$Gxx[2, 3], 0.5, label = "Kxx(2,3) null PIP < 0.5") + expect_lt(pips$Gxy[1, 1], 0.5, label = "Kxy(1,1) null PIP < 0.5") + expect_lt(pips$Gxy[2, 1], 0.5, label = "Kxy(2,1) null PIP < 0.5") + expect_lt(pips$Gxy[2, 2], 0.5, label = "Kxy(2,2) null PIP < 0.5") + expect_lt(pips$Gxy[3, 1], 0.5, label = "Kxy(3,1) null PIP < 0.5") + expect_lt(pips$Gxy[3, 2], 0.5, label = "Kxy(3,2) null PIP < 0.5") +}) + + +# =========================================================================== +# Test 3: Edge selection vs mixedGM (conditional PL) +# =========================================================================== +test_that("edge selection PIPs agree with mixedGM (conditional PL)", { + skip_on_cran() + + p = 3L; q = 2L; n = 800L + num_cats_mgm = rep(3L, p) + num_cats_bgms = rep(2L, p) + + Kxx_true = matrix(0, p, p) + Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 + + Kyy_true = diag(q) + Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 + + Kxy_true = matrix(0, p, q) + Kxy_true[1, 2] = 0.3 + + mux_true = matrix(0, p, max(num_cats_bgms)) + mux_true[, 1] = c(-0.5, 0.3, -0.2) + mux_true[, 2] = c(-1.0, -0.8, -0.6) + muy_true = c(0.5, -0.3) + + set.seed(123) + sim = mixedGM::mixed_gibbs_generate( + n = n, num_categories = num_cats_mgm, + mux = mux_true, Kxx = Kxx_true, + muy = muy_true, Kyy = Kyy_true, + Kxy = Kxy_true, + n_burnin = 3000L + ) + + x = sim$x + y = sim$y + pq = p + q + + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + # bgms with edge selection + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, TRUE, "conditional", + 3000L, 5000L, 42L + ) + pips_bgms = extract_pip(bgms_out$indicator_samples, p, q) + + # mixedGM with edge selection (using logistic prior to match bgms) + set.seed(42) + mgm = mixedGM::mixed_sampler( + x = x, y = y, num_categories = num_cats_mgm, + n_warmup = 3000L, n_samples = 5000L, + edge_selection = TRUE, verbose = FALSE, + pseudolikelihood = "conditional", + log_prior_mean = mixedGM:::log_prior_logistic, + lp_mean_params = list() + ) + + # mixedGM stores indicators as 3D array: samples$indicator[iter, i, j] + # G is (p+q) x (p+q): rows/cols 1:p = discrete, (p+1):(p+q) = continuous + G_array = mgm$samples$indicator + Gxx_mgm = matrix(0, p, p) + for(i in 1:(p - 1)) for(j in (i + 1):p) { + Gxx_mgm[i, j] = Gxx_mgm[j, i] = mean(G_array[, i, j]) + } + Gyy_mgm = matrix(0, q, q) + if(q > 1) { + for(i in 1:(q - 1)) for(j in (i + 1):q) { + Gyy_mgm[i, j] = Gyy_mgm[j, i] = mean(G_array[, p + i, p + j]) + } + } + Gxy_mgm = matrix(0, p, q) + for(i in 1:p) for(j in 1:q) { + Gxy_mgm[i, j] = mean(G_array[, i, p + j]) + } + + # Both should agree on which edges to include/exclude + # (directional agreement: both high for true edges, both low for null) + all_bgms = c(pips_bgms$Gxx[upper.tri(pips_bgms$Gxx)], + pips_bgms$Gyy[upper.tri(pips_bgms$Gyy)], + as.vector(pips_bgms$Gxy)) + all_mgm = c(Gxx_mgm[upper.tri(Gxx_mgm)], + Gyy_mgm[upper.tri(Gyy_mgm)], + as.vector(Gxy_mgm)) + + # Correlation of PIPs should be positive + expect_gt(cor(all_bgms, all_mgm), 0.5, + label = "PIP correlation bgms vs mixedGM > 0.5") + + # True structure agreement: same edges classified as > 0.5 + bgms_selected = all_bgms > 0.5 + mgm_selected = all_mgm > 0.5 + agreement = mean(bgms_selected == mgm_selected) + expect_gt(agreement, 0.6, label = "Structure agreement > 60%") +}) + + +# =========================================================================== +# Test 4: Edge-gating prevents parameter drift on excluded edges +# =========================================================================== +test_that("excluded edges have zero parameters after edge selection", { + skip_on_cran() + + p = 3L; q = 2L; n = 500L + num_cats_mgm = rep(3L, p) + num_cats_bgms = rep(2L, p) + + # Fully sparse graph: no edges in true model + set.seed(456) + sim = mixedGM::mixed_gibbs_generate( + n = n, num_categories = num_cats_mgm, + mux = matrix(c(-0.5, 0.3, -0.2, -1.0, -0.8, -0.6), nrow = p), + Kxx = matrix(0, p, p), + muy = c(0.5, -0.3), Kyy = diag(q), + Kxy = matrix(0, p, q), + n_burnin = 3000L + ) + + x = sim$x + y = sim$y + pq = p + q + + inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 + edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L + + bgms_out = bgms:::test_mixed_mrf_sampler( + x, y, as.integer(num_cats_bgms), + as.integer(rep(1L, p)), rep(0L, p), + inc_prob, edge_ind, TRUE, "conditional", + 2000L, 3000L, 42L + ) + + pips = extract_pip(bgms_out$indicator_samples, p, q) + + # With a fully null graph and n = 500, all PIPs should be low + expect_lt(max(pips$Gxx[upper.tri(pips$Gxx)]), 0.8, + label = "Max Kxx PIP < 0.8 for null graph") + expect_lt(max(as.vector(pips$Gxy)), 0.8, + label = "Max Kxy PIP < 0.8 for null graph") +}) diff --git a/tests/testthat/test-mixed-mrf-marginal.R b/tests/testthat/test-mixed-mrf-marginal.R index 6072e1ce..4ceac822 100644 --- a/tests/testthat/test-mixed-mrf-marginal.R +++ b/tests/testthat/test-mixed-mrf-marginal.R @@ -507,7 +507,7 @@ test_that("marginal PL sampler agrees with mixedGM on Wenchuan data", { label = "Kxx bgms-mgm correlation (marginal Wenchuan)" ) expect_gt( - cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.90, + cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.85, label = "Kxy bgms-mgm correlation (marginal Wenchuan)" ) expect_gt( From 87014502325c114d944fdcf7599c78d7992d0559 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 00:05:19 +0100 Subject: [PATCH 15/60] =?UTF-8?q?feat:=20wire=20mixed=20MRF=20into=20bgm()?= =?UTF-8?q?=20R=20interface=20(Phase=205.1=E2=80=935.2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R-side infrastructure for MixedMRFModel: - bgm_spec: auto-detect mixed data, build_spec_mixed_mrf(), split discrete/continuous, validate mixed variable types - run_sampler: run_sampler_mixed_mrf() dispatches to sample_mixed_mrf() - build_output: build_output_mixed_mrf() maps flat C++ vector back to (p+q)×(p+q) matrices in original column order - build_arguments: build_arguments_mixed_mrf() - bgm(): add pseudolikelihood parameter - validate_variable_types: allow_mixed parameter C++ entry point: - sample_mixed.cpp: Rcpp wrapper calling MixedMRFModel Tests: - 8 end-to-end tests in test-bgm.R (reproducibility, dimensions, symmetry, naming, precision positivity, marginal PL) - Remove test_mixed_mrf.cpp scaffolding and all dependent test files (cholesky, skeleton, likelihoods, marginal, sampling, edge-selection) - Remove friend declarations from mixed_mrf_model.h 3965 tests pass in 25.6s, 0 failures. --- R/RcppExports.R | 20 +- R/bgm.R | 4 +- R/bgm_spec.R | 254 +++++++- R/build_output.R | 377 +++++++++++- R/run_sampler.R | 67 ++- R/validate_model.R | 51 +- src/RcppExports.cpp | 116 +--- src/models/mixed/mixed_mrf_model.h | 14 - src/sample_mixed.cpp | 122 ++++ src/test_mixed_mrf.cpp | 441 -------------- tests/testthat/helper-fixtures.R | 76 +++ tests/testthat/test-bgm.R | 117 ++++ tests/testthat/test-input-validation.R | 19 +- tests/testthat/test-mixed-mrf-cholesky.R | 183 ------ .../testthat/test-mixed-mrf-edge-selection.R | 326 ----------- tests/testthat/test-mixed-mrf-likelihoods.R | 549 ------------------ tests/testthat/test-mixed-mrf-marginal.R | 527 ----------------- tests/testthat/test-mixed-mrf-sampling.R | 224 ------- tests/testthat/test-mixed-mrf-skeleton.R | 235 -------- 19 files changed, 1091 insertions(+), 2631 deletions(-) create mode 100644 src/sample_mixed.cpp delete mode 100644 src/test_mixed_mrf.cpp delete mode 100644 tests/testthat/test-mixed-mrf-cholesky.R delete mode 100644 tests/testthat/test-mixed-mrf-edge-selection.R delete mode 100644 tests/testthat/test-mixed-mrf-likelihoods.R delete mode 100644 tests/testthat/test-mixed-mrf-marginal.R delete mode 100644 tests/testthat/test-mixed-mrf-sampling.R delete mode 100644 tests/testthat/test-mixed-mrf-skeleton.R diff --git a/R/RcppExports.R b/R/RcppExports.R index 6f490ec9..cd0c9e0d 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -49,6 +49,10 @@ sample_ggm <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators .Call(`_bgms_sample_ggm`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, na_impute, missing_index_nullable) } +sample_mixed_mrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0) { + .Call(`_bgms_sample_mixed_mrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda) +} + sample_omrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, sampler_type, seed, no_threads, progress_type, edge_prior = "Bernoulli", na_impute = FALSE, missing_index_nullable = NULL, beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, target_acceptance = 0.8, max_tree_depth = 10L, num_leapfrogs = 10L, pairwise_scaling_factors_nullable = NULL) { .Call(`_bgms_sample_omrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, sampler_type, seed, no_threads, progress_type, edge_prior, na_impute, missing_index_nullable, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, target_acceptance, max_tree_depth, num_leapfrogs, pairwise_scaling_factors_nullable) } @@ -57,19 +61,3 @@ compute_Vn_mfm_sbm <- function(num_variables, dirichlet_alpha, t_max, lambda) { .Call(`_bgms_compute_Vn_mfm_sbm`, num_variables, dirichlet_alpha, t_max, lambda) } -test_mixed_mrf_skeleton <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed) { - .Call(`_bgms_test_mixed_mrf_skeleton`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed) -} - -test_mixed_mrf_likelihoods <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed) { - .Call(`_bgms_test_mixed_mrf_likelihoods`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed) -} - -test_mixed_mrf_sampler <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed) { - .Call(`_bgms_test_mixed_mrf_sampler`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed) -} - -test_mixed_mrf_cholesky <- function(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j) { - .Call(`_bgms_test_mixed_mrf_cholesky`, discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j) -} - diff --git a/R/bgm.R b/R/bgm.R index 71d5f6cd..53bde915 100644 --- a/R/bgm.R +++ b/R/bgm.R @@ -409,6 +409,7 @@ bgm = function( display_progress = c("per-chain", "total", "none"), seed = NULL, standardize = FALSE, + pseudolikelihood = c("conditional", "marginal"), verbose = getOption("bgms.verbose", TRUE), interaction_scale, burnin, @@ -481,7 +482,8 @@ bgm = function( cores = cores, seed = seed, display_progress = display_progress, - verbose = verbose + verbose = verbose, + pseudolikelihood = pseudolikelihood ) raw = run_sampler(spec) diff --git a/R/bgm_spec.R b/R/bgm_spec.R index c745007a..c624db18 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -25,22 +25,33 @@ new_bgm_spec = function(model_type, data, variables, missing, prior, # --- top-level structure --- stopifnot( is.character(model_type), length(model_type) == 1L, - model_type %in% c("ggm", "omrf", "compare") + model_type %in% c("ggm", "omrf", "compare", "mixed_mrf") ) # --- data sub-list --- stopifnot(is.list(data)) - stopifnot(is.matrix(data$x)) + if(model_type == "mixed_mrf") { + stopifnot(is.matrix(data$x_discrete)) + stopifnot(is.matrix(data$x_continuous)) + } else { + stopifnot(is.matrix(data$x)) + } stopifnot(is.character(data$data_columnnames)) stopifnot(is.integer(data$num_variables), length(data$num_variables) == 1L) stopifnot(is.integer(data$num_cases), length(data$num_cases) == 1L) - if(model_type != "ggm") { + if(model_type == "omrf" || model_type == "compare") { stopifnot( is.integer(data$num_categories), length(data$num_categories) == data$num_variables ) } + if(model_type == "mixed_mrf") { + stopifnot( + is.integer(data$num_categories), + length(data$num_categories) == data$num_discrete + ) + } if(model_type == "compare") { @@ -71,14 +82,21 @@ new_bgm_spec = function(model_type, data, variables, missing, prior, # --- prior sub-list --- stopifnot(is.list(prior)) - if(model_type != "ggm") { + if(model_type %in% c("omrf", "compare")) { stopifnot(is.numeric(prior$pairwise_scale), length(prior$pairwise_scale) == 1L) stopifnot(is.numeric(prior$main_alpha), length(prior$main_alpha) == 1L) stopifnot(is.numeric(prior$main_beta), length(prior$main_beta) == 1L) stopifnot(is.logical(prior$standardize), length(prior$standardize) == 1L) stopifnot(is.matrix(prior$pairwise_scaling_factors)) } - if(model_type %in% c("ggm", "omrf")) { + if(model_type == "mixed_mrf") { + stopifnot(is.numeric(prior$pairwise_scale), length(prior$pairwise_scale) == 1L) + stopifnot(is.numeric(prior$main_alpha), length(prior$main_alpha) == 1L) + stopifnot(is.numeric(prior$main_beta), length(prior$main_beta) == 1L) + stopifnot(is.logical(prior$standardize), length(prior$standardize) == 1L) + stopifnot(is.character(prior$pseudolikelihood), length(prior$pseudolikelihood) == 1L) + } + if(model_type %in% c("ggm", "omrf", "mixed_mrf")) { stopifnot(is.logical(prior$edge_selection), length(prior$edge_selection) == 1L) stopifnot(is.character(prior$edge_prior), length(prior$edge_prior) == 1L) stopifnot(is.matrix(prior$inclusion_probability)) @@ -162,14 +180,14 @@ validate_bgm_spec = function(spec) { } # Edge selection consistency - if(mt %in% c("ggm", "omrf")) { + if(mt %in% c("ggm", "omrf", "mixed_mrf")) { if(spec$prior$edge_selection && spec$prior$edge_prior == "Not Applicable") { stop("bgm_spec: edge_selection = TRUE but edge_prior = 'Not Applicable'.") } } # Scaling factors dimensions - if(mt != "ggm") { + if(mt %in% c("omrf", "compare")) { nv = spec$data$num_variables sf = spec$prior$pairwise_scaling_factors if(nrow(sf) != nv || ncol(sf) != nv) { @@ -181,11 +199,19 @@ validate_bgm_spec = function(spec) { } # num_categories length (OMRF / compare) - if(mt != "ggm") { + if(mt == "omrf" || mt == "compare") { if(length(spec$data$num_categories) != spec$data$num_variables) { stop("bgm_spec: num_categories length doesn't match num_variables.") } } + if(mt == "mixed_mrf") { + if(length(spec$data$num_categories) != spec$data$num_discrete) { + stop("bgm_spec: num_categories length doesn't match num_discrete.") + } + if(spec$sampler$update_method != "adaptive-metropolis") { + stop("bgm_spec: model_type = 'mixed_mrf' requires update_method = 'adaptive-metropolis'.") + } + } invisible(spec) } @@ -201,7 +227,7 @@ validate_bgm_spec = function(spec) { # Parameters mirror the union of bgm() and bgmCompare() arguments. # ============================================================================== bgm_spec = function(x, - model_type = c("omrf", "ggm", "compare"), + model_type = c("omrf", "ggm", "compare", "mixed_mrf"), # Variable specification variable_type = "ordinal", baseline_category = 0L, @@ -248,7 +274,8 @@ bgm_spec = function(x, cores = parallel::detectCores(), seed = NULL, display_progress = c("per-chain", "total", "none"), - verbose = TRUE) { + verbose = TRUE, + pseudolikelihood = c("conditional", "marginal")) { model_type = match.arg(model_type) na_action = tryCatch(match.arg(na_action), error = function(e) { stop(paste0( @@ -272,18 +299,25 @@ bgm_spec = function(x, variable_type = variable_type, num_variables = num_variables, allow_continuous = allow_continuous, + allow_mixed = (model_type != "compare"), caller = if(model_type == "compare") "bgmCompare" else "bgm" ) variable_type = vt$variable_type is_ordinal = vt$variable_bool is_continuous = vt$is_continuous + is_mixed = vt$is_mixed # Resolve model_type if "omrf" default was kept but data is continuous if(model_type == "omrf" && is_continuous) { model_type = "ggm" } + if(model_type == "omrf" && is_mixed) { + model_type = "mixed_mrf" + } # --- Sampler (needs is_continuous and edge_selection early) ------------------ + # Mixed MRF is MH-only (like GGM): force adaptive-metropolis via is_continuous + sampler_is_continuous = is_continuous || is_mixed sampler = validate_sampler( update_method = update_method, target_accept = target_accept, @@ -296,7 +330,7 @@ bgm_spec = function(x, cores = cores, seed = seed, display_progress = display_progress, - is_continuous = is_continuous, + is_continuous = sampler_is_continuous, edge_selection = if(model_type == "compare") FALSE else edge_selection, verbose = verbose ) @@ -320,6 +354,27 @@ bgm_spec = function(x, dirichlet_alpha = dirichlet_alpha, lambda = lambda ) + } else if(model_type == "mixed_mrf") { + pseudolikelihood = match.arg(pseudolikelihood) + spec = build_spec_mixed_mrf( + x = x, data_columnnames = data_columnnames, + num_variables = num_variables, + variable_type = variable_type, is_ordinal = is_ordinal, + baseline_category = baseline_category, + na_action = na_action, sampler = sampler, + pairwise_scale = pairwise_scale, main_alpha = main_alpha, + main_beta = main_beta, standardize = standardize, + pseudolikelihood = pseudolikelihood, + edge_selection = edge_selection, + edge_prior = edge_prior, + inclusion_probability = inclusion_probability, + beta_bernoulli_alpha = beta_bernoulli_alpha, + beta_bernoulli_beta = beta_bernoulli_beta, + beta_bernoulli_alpha_between = beta_bernoulli_alpha_between, + beta_bernoulli_beta_between = beta_bernoulli_beta_between, + dirichlet_alpha = dirichlet_alpha, + lambda = lambda + ) } else if(model_type == "omrf") { spec = build_spec_omrf( x = x, data_columnnames = data_columnnames, @@ -546,6 +601,139 @@ build_spec_omrf = function(x, data_columnnames, num_variables, } +# ------------------------------------------------------------------ +# build_spec_mixed_mrf +# ------------------------------------------------------------------ +# Builds a bgm_spec for the mixed MRF model (discrete + continuous). +# Splits the input data matrix into discrete and continuous parts, +# validates and recodes discrete variables (ordinal/BC), and assembles +# the spec with metadata needed by sample_mixed_mrf() and +# build_output_mixed_mrf(). +# ------------------------------------------------------------------ +build_spec_mixed_mrf = function(x, data_columnnames, num_variables, + variable_type, is_ordinal, + baseline_category, + na_action, sampler, + pairwise_scale, main_alpha, main_beta, + standardize, pseudolikelihood, + edge_selection, edge_prior, + inclusion_probability, + beta_bernoulli_alpha, beta_bernoulli_beta, + beta_bernoulli_alpha_between, + beta_bernoulli_beta_between, + dirichlet_alpha, lambda) { + # Identify discrete vs continuous columns + cont_idx = which(variable_type == "continuous") + disc_idx = which(variable_type != "continuous") + p = length(disc_idx) + q = length(cont_idx) + + # Split data + x_disc = x[, disc_idx, drop = FALSE] + x_cont = x[, cont_idx, drop = FALSE] + + # Ensure integer matrix for discrete data + storage.mode(x_disc) = "integer" + # Ensure numeric matrix for continuous data + storage.mode(x_cont) = "double" + + # Discrete variable properties (subset to discrete columns) + is_ordinal_disc = is_ordinal[disc_idx] + vtype_disc = variable_type[disc_idx] + + # Baseline category for discrete variables + bc = validate_baseline_category( + baseline_category = baseline_category, + baseline_category_provided = !identical(baseline_category, 0L), + x = x_disc, + variable_bool = is_ordinal_disc + ) + + # Missing data — not supported for mixed MRF (Phase H) + if(na_action == "impute") { + stop("Missing data imputation is not yet supported for mixed models.", + call. = FALSE) + } + if(anyNA(x)) { + stop("Missing data detected. Mixed models do not yet support missing data handling.", + call. = FALSE) + } + + # Ordinal recoding (reformat discrete data) + ord = reformat_ordinal_data( + x = x_disc, is_ordinal = is_ordinal_disc, + baseline_category = bc + ) + x_disc_recoded = ord$x + num_categories = ord$num_categories + bc_final = ord$baseline_category + + # Edge prior (total variables = p + q) + ep = validate_edge_prior( + edge_selection = edge_selection, edge_prior = edge_prior, + inclusion_probability = inclusion_probability, + num_variables = num_variables, + beta_bernoulli_alpha = beta_bernoulli_alpha, + beta_bernoulli_beta = beta_bernoulli_beta, + beta_bernoulli_alpha_between = beta_bernoulli_alpha_between, + beta_bernoulli_beta_between = beta_bernoulli_beta_between, + dirichlet_alpha = dirichlet_alpha, lambda = lambda + ) + + num_thresholds = sum(ifelse(is_ordinal_disc, num_categories, 2L)) + + new_bgm_spec( + model_type = "mixed_mrf", + data = list( + x_discrete = x_disc_recoded, + x_continuous = x_cont, + data_columnnames = data_columnnames, + data_columnnames_discrete = data_columnnames[disc_idx], + data_columnnames_continuous = data_columnnames[cont_idx], + num_variables = as.integer(num_variables), + num_discrete = as.integer(p), + num_continuous = as.integer(q), + num_cases = as.integer(nrow(x)), + num_categories = as.integer(num_categories), + discrete_indices = disc_idx, + continuous_indices = cont_idx + ), + variables = list( + variable_type = variable_type, + is_ordinal = is_ordinal_disc, + is_continuous = FALSE, + is_mixed = TRUE, + baseline_category = as.integer(bc_final) + ), + missing = list( + na_action = na_action, + na_impute = FALSE, + missing_index = NULL + ), + prior = list( + pairwise_scale = pairwise_scale, + main_alpha = main_alpha, + main_beta = main_beta, + standardize = standardize, + pseudolikelihood = pseudolikelihood, + edge_selection = ep$edge_selection, + edge_prior = ep$edge_prior, + inclusion_probability = ep$inclusion_probability, + beta_bernoulli_alpha = beta_bernoulli_alpha, + beta_bernoulli_beta = beta_bernoulli_beta, + beta_bernoulli_alpha_between = beta_bernoulli_alpha_between, + beta_bernoulli_beta_between = beta_bernoulli_beta_between, + dirichlet_alpha = dirichlet_alpha, + lambda = lambda + ), + sampler = sampler_sublist(sampler), + precomputed = list( + num_thresholds = as.integer(num_thresholds) + ) + ) +} + + build_spec_compare = function(x, y, group_indicator, data_columnnames, num_variables, variable_type, is_ordinal, is_continuous, @@ -862,6 +1050,8 @@ build_arguments = function(spec) { build_arguments_ggm(spec) } else if(mt == "omrf") { build_arguments_omrf(spec) + } else if(mt == "mixed_mrf") { + build_arguments_mixed_mrf(spec) } else { build_arguments_compare(spec) } @@ -939,6 +1129,48 @@ build_arguments_omrf = function(spec) { } +build_arguments_mixed_mrf = function(spec) { + list( + num_variables = spec$data$num_variables, + num_discrete = spec$data$num_discrete, + num_continuous = spec$data$num_continuous, + num_cases = spec$data$num_cases, + variable_type = spec$variables$variable_type, + iter = spec$sampler$iter, + warmup = spec$sampler$warmup, + pairwise_scale = spec$prior$pairwise_scale, + standardize = spec$prior$standardize, + pseudolikelihood = spec$prior$pseudolikelihood, + main_alpha = spec$prior$main_alpha, + main_beta = spec$prior$main_beta, + edge_selection = spec$prior$edge_selection, + edge_prior = spec$prior$edge_prior, + inclusion_probability = spec$prior$inclusion_probability, + beta_bernoulli_alpha = spec$prior$beta_bernoulli_alpha, + beta_bernoulli_beta = spec$prior$beta_bernoulli_beta, + beta_bernoulli_alpha_between = spec$prior$beta_bernoulli_alpha_between, + beta_bernoulli_beta_between = spec$prior$beta_bernoulli_beta_between, + dirichlet_alpha = spec$prior$dirichlet_alpha, + lambda = spec$prior$lambda, + na_action = spec$missing$na_action, + version = packageVersion("bgms"), + update_method = spec$sampler$update_method, + target_accept = spec$sampler$target_accept, + num_chains = spec$sampler$chains, + num_categories = spec$data$num_categories, + data_columnnames = spec$data$data_columnnames, + data_columnnames_discrete = spec$data$data_columnnames_discrete, + data_columnnames_continuous = spec$data$data_columnnames_continuous, + discrete_indices = spec$data$discrete_indices, + continuous_indices = spec$data$continuous_indices, + baseline_category = spec$variables$baseline_category, + is_ordinal = spec$variables$is_ordinal, + no_variables = spec$data$num_variables, + is_mixed = TRUE + ) +} + + build_arguments_compare = function(spec) { list( num_variables = spec$data$num_variables, diff --git a/R/build_output.R b/R/build_output.R index 865340df..e877ecbe 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -18,9 +18,10 @@ build_output = function(spec, raw) { stopifnot(inherits(spec, "bgm_spec")) switch(spec$model_type, - ggm = build_output_bgm(spec, raw), - omrf = build_output_bgm(spec, raw), - compare = build_output_compare(spec, raw), + ggm = build_output_bgm(spec, raw), + omrf = build_output_bgm(spec, raw), + mixed_mrf = build_output_mixed_mrf(spec, raw), + compare = build_output_compare(spec, raw), stop("Unknown model_type: ", spec$model_type) ) } @@ -319,6 +320,376 @@ build_output_bgm = function(spec, raw) { } +# ============================================================================== +# build_output_mixed_mrf() — Mixed MRF builder +# ============================================================================== +# +# Handles the mixed discrete + continuous parameter layout: +# C++ flat vector: [mux | Kxx_ut | muy | Kyy_ut | Kxy] +# C++ indicators: [Gxx_ut | Gyy_ut | Gxy] +# +# Splits into main (mux, muy, Kyy_diag) and pairwise (Kxx, Kyy_offdiag, Kxy), +# builds (p+q)×(p+q) interaction and indicator matrices, and maps internal +# variable order (discrete first, continuous second) back to original column +# order from the user's data. +# ============================================================================== +build_output_mixed_mrf = function(spec, raw) { + d = spec$data + v = spec$variables + pr = spec$prior + s = spec$sampler + + p = d$num_discrete + q = d$num_continuous + num_variables = d$num_variables + data_columnnames = d$data_columnnames + disc_names = d$data_columnnames_discrete + cont_names = d$data_columnnames_continuous + disc_idx = d$discrete_indices + cont_idx = d$continuous_indices + is_ordinal = v$is_ordinal + num_categories = d$num_categories + edge_selection = pr$edge_selection + + # --- Compute index layout in flat parameter vector -------------------------- + nt = spec$precomputed$num_thresholds + nxx = as.integer(p * (p - 1) / 2) + nyy_total = as.integer(q * (q + 1) / 2) + nyy_offdiag = as.integer(q * (q - 1) / 2) + nxy = as.integer(p * q) + + # Offsets in the flat vector (1-based) + mux_start = 1L + mux_end = nt + kxx_start = nt + 1L + kxx_end = nt + nxx + muy_start = nt + nxx + 1L + muy_end = nt + nxx + q + kyy_start = nt + nxx + q + 1L + kyy_end = nt + nxx + q + nyy_total + kxy_start = nt + nxx + q + nyy_total + 1L + kxy_end = nt + nxx + q + nyy_total + nxy + + # Kyy diagonal indices within the Kyy block + kyy_diag_within = integer(q) + kyy_offdiag_within = integer(nyy_offdiag) + k_diag = 0L + k_off = 0L + pos = 0L + for(i in seq_len(q)) { + for(j in i:q) { + pos = pos + 1L + if(i == j) { + k_diag = k_diag + 1L + kyy_diag_within[k_diag] = pos + } else { + k_off = k_off + 1L + kyy_offdiag_within[k_off] = pos + } + } + } + kyy_diag_abs = kyy_start - 1L + kyy_diag_within + kyy_offdiag_abs = kyy_start - 1L + kyy_offdiag_within + + # Main indices: mux + muy + Kyy diagonal + main_idx = c(seq(mux_start, mux_end), + seq(muy_start, muy_end), + kyy_diag_abs) + + # Pairwise indices: Kxx + Kyy off-diag + Kxy + pairwise_idx = c( + if(nxx > 0) seq(kxx_start, kxx_end) else integer(0), + kyy_offdiag_abs, + if(nxy > 0) seq(kxy_start, kxy_end) else integer(0) + ) + + # --- Indicator index layout ------------------------------------------------- + # C++ indicator vector: [Gxx_ut | Gyy_ut | Gxy] + # All are pairwise, so indicator_samples maps directly to pairwise order: + # Kxx edges, Kyy edges, Kxy edges — same order as pairwise_idx above. + + # --- Normalize raw output per chain ----------------------------------------- + raw = lapply(raw, function(chain) { + samples_t = t(chain$samples) + res = list( + main_samples = samples_t[, main_idx, drop = FALSE], + pairwise_samples = samples_t[, pairwise_idx, drop = FALSE], + userInterrupt = isTRUE(chain$userInterrupt), + chain_id = chain$chain_id + ) + if(!is.null(chain$indicator_samples)) { + res$indicator_samples = t(chain$indicator_samples) + } + if(!is.null(chain$allocation_samples)) { + res$allocations = t(chain$allocation_samples) + } + res + }) + + # --- Parameter names -------------------------------------------------------- + # Main effect names (in internal order: discrete first, continuous second) + names_main = character() + for(si in seq_len(p)) { + if(is_ordinal[si]) { + cats = seq_len(num_categories[si]) + names_main = c(names_main, paste0(disc_names[si], " (", cats, ")")) + } else { + names_main = c(names_main, + paste0(disc_names[si], " (linear)"), + paste0(disc_names[si], " (quadratic)")) + } + } + for(ji in seq_len(q)) { + names_main = c(names_main, paste0(cont_names[ji], " (mean)")) + } + for(ji in seq_len(q)) { + names_main = c(names_main, paste0(cont_names[ji], " (precision)")) + } + + # Pairwise edge names — internal order, mapped to original column names + # We need a mapping from internal index to original variable name + # Internal variables: [disc_1, ..., disc_p, cont_1, ..., cont_q] + # Their original names: c(disc_names, cont_names) + all_internal_names = c(disc_names, cont_names) + + edge_names = character() + # Kxx edges (discrete-discrete) + if(p > 1) { + for(i in seq_len(p - 1)) { + for(j in seq(i + 1, p)) { + edge_names = c(edge_names, + paste0(disc_names[i], "-", disc_names[j])) + } + } + } + # Kyy edges (continuous-continuous, off-diagonal) + if(q > 1) { + for(i in seq_len(q - 1)) { + for(j in seq(i + 1, q)) { + edge_names = c(edge_names, + paste0(cont_names[i], "-", cont_names[j])) + } + } + } + # Kxy edges (discrete-continuous) + if(p > 0 && q > 0) { + for(i in seq_len(p)) { + for(j in seq_len(q)) { + edge_names = c(edge_names, + paste0(disc_names[i], "-", cont_names[j])) + } + } + } + + # --- MCMC summaries --------------------------------------------------------- + summary_list = summarize_fit(raw, edge_selection = edge_selection) + main_summary = summary_list$main[, -1] + pairwise_summary = summary_list$pairwise[, -1] + + rownames(main_summary) = names_main + rownames(pairwise_summary) = edge_names + + results = list() + results$posterior_summary_main = main_summary + results$posterior_summary_pairwise = pairwise_summary + + # --- Edge selection summaries ----------------------------------------------- + edge_prior = pr$edge_prior + has_sbm = FALSE + if(edge_selection) { + indicator_summary = summarize_indicator(raw, param_names = edge_names)[, -1] + rownames(indicator_summary) = edge_names + results$posterior_summary_indicator = indicator_summary + + has_sbm = identical(edge_prior, "Stochastic-Block") && + "allocations" %in% names(raw[[1]]) + + if(has_sbm) { + sbm_convergence = summarize_alloc_pairs( + allocations = lapply(raw, `[[`, "allocations"), + node_names = all_internal_names + ) + results$posterior_summary_pairwise_allocations = sbm_convergence$sbm_summary + } + } + + # --- Posterior mean: main --------------------------------------------------- + # Discrete main effects: p × max_cats matrix (like OMRF) + num_params_disc = ifelse(is_ordinal, num_categories, 2L) + max_num_cats = max(num_params_disc) + pmm_disc = matrix(NA, nrow = p, ncol = max_num_cats) + start = 0L + stop = 0L + for(si in seq_len(p)) { + if(is_ordinal[si]) { + start = stop + 1L + stop = start + num_categories[si] - 1L + pmm_disc[si, seq_len(num_categories[si])] = main_summary$mean[start:stop] + } else { + start = stop + 1L + stop = start + 1L + pmm_disc[si, 1:2] = main_summary$mean[start:stop] + } + } + rownames(pmm_disc) = disc_names + colnames(pmm_disc) = paste0("cat (", seq_len(max_num_cats), ")") + + # Continuous main effects: q × 2 matrix (mean, precision) + pmm_cont = matrix(NA, nrow = q, ncol = 2) + muy_means = main_summary$mean[nt + seq_len(q)] + kyy_diag_means = main_summary$mean[nt + q + seq_len(q)] + pmm_cont[, 1] = muy_means + pmm_cont[, 2] = kyy_diag_means + rownames(pmm_cont) = cont_names + colnames(pmm_cont) = c("mean", "precision") + + results$posterior_mean_main = list( + discrete = pmm_disc, + continuous = pmm_cont + ) + + # --- Posterior mean: pairwise as (p+q) × (p+q) matrix ----------------------- + # Map from internal block indices to original column positions + pmat = matrix(0, nrow = num_variables, ncol = num_variables, + dimnames = list(data_columnnames, data_columnnames)) + + pw_means = pairwise_summary$mean + idx = 0L + + # Kxx block + if(p > 1) { + for(i in seq_len(p - 1)) { + for(j in seq(i + 1, p)) { + idx = idx + 1L + oi = disc_idx[i] + oj = disc_idx[j] + pmat[oi, oj] = pw_means[idx] + pmat[oj, oi] = pw_means[idx] + } + } + } + + # Kyy off-diagonal block + if(q > 1) { + for(i in seq_len(q - 1)) { + for(j in seq(i + 1, q)) { + idx = idx + 1L + oi = cont_idx[i] + oj = cont_idx[j] + pmat[oi, oj] = pw_means[idx] + pmat[oj, oi] = pw_means[idx] + } + } + } + + # Kxy block + if(p > 0 && q > 0) { + for(i in seq_len(p)) { + for(j in seq_len(q)) { + idx = idx + 1L + oi = disc_idx[i] + oj = cont_idx[j] + pmat[oi, oj] = pw_means[idx] + pmat[oj, oi] = pw_means[idx] + } + } + } + + results$posterior_mean_pairwise = pmat + + # --- Posterior mean: indicator ----------------------------------------------- + if(edge_selection) { + ind_means = indicator_summary$mean + imat = matrix(0, nrow = num_variables, ncol = num_variables, + dimnames = list(data_columnnames, data_columnnames)) + + idx = 0L + if(p > 1) { + for(i in seq_len(p - 1)) { + for(j in seq(i + 1, p)) { + idx = idx + 1L + oi = disc_idx[i] + oj = disc_idx[j] + imat[oi, oj] = ind_means[idx] + imat[oj, oi] = ind_means[idx] + } + } + } + if(q > 1) { + for(i in seq_len(q - 1)) { + for(j in seq(i + 1, q)) { + idx = idx + 1L + oi = cont_idx[i] + oj = cont_idx[j] + imat[oi, oj] = ind_means[idx] + imat[oj, oi] = ind_means[idx] + } + } + } + if(p > 0 && q > 0) { + for(i in seq_len(p)) { + for(j in seq_len(q)) { + idx = idx + 1L + oi = disc_idx[i] + oj = cont_idx[j] + imat[oi, oj] = ind_means[idx] + imat[oj, oi] = ind_means[idx] + } + } + } + results$posterior_mean_indicator = imat + + if(has_sbm) { + sbm_convergence2 = summarize_alloc_pairs( + allocations = lapply(raw, `[[`, "allocations"), + node_names = all_internal_names + ) + results$posterior_mean_coclustering_matrix = sbm_convergence2$co_occur_matrix + + arguments = build_arguments(spec) + sbm_summary = posterior_summary_SBM( + allocations = lapply(raw, `[[`, "allocations"), + arguments = arguments + ) + results$posterior_mean_allocations = sbm_summary$allocations_mean + results$posterior_mode_allocations = sbm_summary$allocations_mode + results$posterior_num_blocks = sbm_summary$blocks + } + } + + # --- arguments + class ------------------------------------------------------ + results$arguments = build_arguments(spec) + class(results) = "bgms" + + # --- raw_samples ------------------------------------------------------------ + results$raw_samples = list( + main = lapply(raw, function(chain) chain$main_samples), + pairwise = lapply(raw, function(chain) chain$pairwise_samples), + indicator = if(edge_selection) { + lapply(raw, function(chain) chain$indicator_samples) + } else { + NULL + }, + allocations = if(edge_selection && + identical(edge_prior, "Stochastic-Block") && + "allocations" %in% names(raw[[1]])) { + lapply(raw, `[[`, "allocations") + } else { + NULL + }, + nchains = length(raw), + niter = nrow(raw[[1]]$main_samples), + parameter_names = list( + main = names_main, + pairwise = edge_names, + indicator = if(edge_selection) edge_names else NULL + ) + ) + + results +} + + # ============================================================================== # build_output_compare() # ============================================================================== diff --git a/R/run_sampler.R b/R/run_sampler.R index 601807a6..a21e173e 100644 --- a/R/run_sampler.R +++ b/R/run_sampler.R @@ -14,9 +14,10 @@ run_sampler = function(spec) { stopifnot(inherits(spec, "bgm_spec")) raw = switch(spec$model_type, - ggm = run_sampler_ggm(spec), - omrf = run_sampler_omrf(spec), - compare = run_sampler_compare(spec), + ggm = run_sampler_ggm(spec), + omrf = run_sampler_omrf(spec), + mixed_mrf = run_sampler_mixed_mrf(spec), + compare = run_sampler_compare(spec), stop("Unknown model_type: ", spec$model_type) ) @@ -147,6 +148,66 @@ run_sampler_omrf = function(spec) { } +# ============================================================================== +# run_sampler_mixed_mrf() +# ============================================================================== +run_sampler_mixed_mrf = function(spec) { + d = spec$data + v = spec$variables + p = spec$prior + s = spec$sampler + + # C++ expects -1 for "no between-cluster prior" + bb_alpha_between = if(is.null(p$beta_bernoulli_alpha_between)) { + -1.0 + } else { + p$beta_bernoulli_alpha_between + } + bb_beta_between = if(is.null(p$beta_bernoulli_beta_between)) { + -1.0 + } else { + p$beta_bernoulli_beta_between + } + + input_list = list( + discrete_observations = d$x_discrete, + continuous_observations = d$x_continuous, + num_categories = d$num_categories, + is_ordinal_variable = as.integer(v$is_ordinal), + baseline_category = v$baseline_category, + main_alpha = p$main_alpha, + main_beta = p$main_beta, + pairwise_scale = p$pairwise_scale, + pseudolikelihood = p$pseudolikelihood + ) + + out_raw = sample_mixed_mrf( + inputFromR = input_list, + prior_inclusion_prob = p$inclusion_probability, + initial_edge_indicators = matrix(1L, + nrow = d$num_variables, + ncol = d$num_variables + ), + no_iter = s$iter, + no_warmup = s$warmup, + no_chains = s$chains, + edge_selection = p$edge_selection, + seed = s$seed, + no_threads = s$cores, + progress_type = s$progress_type, + edge_prior = p$edge_prior, + beta_bernoulli_alpha = p$beta_bernoulli_alpha, + beta_bernoulli_beta = p$beta_bernoulli_beta, + beta_bernoulli_alpha_between = bb_alpha_between, + beta_bernoulli_beta_between = bb_beta_between, + dirichlet_alpha = p$dirichlet_alpha, + lambda = p$lambda + ) + + out_raw +} + + # ============================================================================== # run_sampler_compare() # ============================================================================== diff --git a/R/validate_model.R b/R/validate_model.R index 49580c73..80a8e508 100644 --- a/R/validate_model.R +++ b/R/validate_model.R @@ -26,6 +26,7 @@ validate_variable_types = function(variable_type, num_variables, allow_continuous = TRUE, + allow_mixed = FALSE, caller = "bgm") { valid_choices = if(allow_continuous) { c("ordinal", "blume-capel", "continuous") @@ -36,6 +37,7 @@ validate_variable_types = function(variable_type, supported_str = paste(valid_choices, collapse = ", ") is_continuous = FALSE + is_mixed = FALSE if(length(variable_type) == 1) { # --- Single string: replicate to all variables --- @@ -70,15 +72,55 @@ validate_variable_types = function(variable_type, } has_continuous = any(variable_type == "continuous") - if(has_continuous && !all(variable_type == "continuous")) { + has_discrete = any(variable_type %in% c("ordinal", "blume-capel")) + is_mixed = has_continuous && has_discrete + + if(has_continuous && !has_discrete && !all(variable_type == "continuous")) { + stop(paste0( + "When using continuous variables, all variables must be of type ", + "'continuous' or mixed with ordinal/blume-capel variables." + )) + } + + if(has_continuous && !allow_continuous) { + stop(paste0( + "The ", caller, " function supports variables of type ", supported_str, + ", but not of type continuous." + )) + } + + if(is_mixed && !allow_mixed) { stop(paste0( "When using continuous variables, all variables must be of type ", "'continuous'. Mixtures of continuous and ordinal/blume-capel ", - "variables are not supported." + "variables are not supported by ", caller, "()." )) } - if(has_continuous) { + if(is_mixed) { + # Mixed: validate each entry individually + variable_type_checked = try( + match.arg( + arg = variable_type, + choices = valid_choices, + several.ok = TRUE + ), + silent = TRUE + ) + + if(inherits(variable_type_checked, what = "try-error")) { + invalid = setdiff(unique(variable_type), valid_choices) + stop(paste0( + "The ", caller, " function supports variables of type ", supported_str, + ", but not of type ", paste0(invalid, collapse = ", "), "." + )) + } + + variable_type = variable_type_checked + # variable_bool: TRUE = ordinal (for discrete variables); continuous = NA + variable_bool = (variable_type == "ordinal") + is_continuous = FALSE + } else if(has_continuous) { if(!allow_continuous) { stop(paste0( "The ", caller, " function supports variables of type ", supported_str, @@ -144,7 +186,8 @@ validate_variable_types = function(variable_type, list( variable_type = variable_type, variable_bool = variable_bool, - is_continuous = is_continuous + is_continuous = is_continuous, + is_mixed = is_mixed ) } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 848c2268..8dfa1729 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -241,6 +241,33 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// sample_mixed_mrf +Rcpp::List sample_mixed_mrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda); +RcppExport SEXP _bgms_sample_mixed_mrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const Rcpp::List& >::type inputFromR(inputFromRSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type prior_inclusion_prob(prior_inclusion_probSEXP); + Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); + Rcpp::traits::input_parameter< const int >::type no_iter(no_iterSEXP); + Rcpp::traits::input_parameter< const int >::type no_warmup(no_warmupSEXP); + Rcpp::traits::input_parameter< const int >::type no_chains(no_chainsSEXP); + Rcpp::traits::input_parameter< const bool >::type edge_selection(edge_selectionSEXP); + Rcpp::traits::input_parameter< const int >::type seed(seedSEXP); + Rcpp::traits::input_parameter< const int >::type no_threads(no_threadsSEXP); + Rcpp::traits::input_parameter< const int >::type progress_type(progress_typeSEXP); + Rcpp::traits::input_parameter< const std::string& >::type edge_prior(edge_priorSEXP); + Rcpp::traits::input_parameter< const double >::type beta_bernoulli_alpha(beta_bernoulli_alphaSEXP); + Rcpp::traits::input_parameter< const double >::type beta_bernoulli_beta(beta_bernoulli_betaSEXP); + Rcpp::traits::input_parameter< const double >::type beta_bernoulli_alpha_between(beta_bernoulli_alpha_betweenSEXP); + Rcpp::traits::input_parameter< const double >::type beta_bernoulli_beta_between(beta_bernoulli_beta_betweenSEXP); + Rcpp::traits::input_parameter< const double >::type dirichlet_alpha(dirichlet_alphaSEXP); + Rcpp::traits::input_parameter< const double >::type lambda(lambdaSEXP); + rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda)); + return rcpp_result_gen; +END_RCPP +} // sample_omrf Rcpp::List sample_omrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const std::string& sampler_type, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const bool na_impute, const Rcpp::Nullable missing_index_nullable, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda, const double target_acceptance, const int max_tree_depth, const int num_leapfrogs, const Rcpp::Nullable pairwise_scaling_factors_nullable); RcppExport SEXP _bgms_sample_omrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP sampler_typeSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP na_imputeSEXP, SEXP missing_index_nullableSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP, SEXP target_acceptanceSEXP, SEXP max_tree_depthSEXP, SEXP num_leapfrogsSEXP, SEXP pairwise_scaling_factors_nullableSEXP) { @@ -289,90 +316,6 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } -// test_mixed_mrf_skeleton -Rcpp::List test_mixed_mrf_skeleton(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, int seed); -RcppExport SEXP _bgms_test_mixed_mrf_skeleton(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP seedSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); - Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); - Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); - Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); - Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); - Rcpp::traits::input_parameter< int >::type seed(seedSEXP); - rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_skeleton(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, seed)); - return rcpp_result_gen; -END_RCPP -} -// test_mixed_mrf_likelihoods -Rcpp::List test_mixed_mrf_likelihoods(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, const arma::vec& params, int seed); -RcppExport SEXP _bgms_test_mixed_mrf_likelihoods(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP paramsSEXP, SEXP seedSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); - Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); - Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); - Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); - Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); - Rcpp::traits::input_parameter< const arma::vec& >::type params(paramsSEXP); - Rcpp::traits::input_parameter< int >::type seed(seedSEXP); - rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_likelihoods(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, params, seed)); - return rcpp_result_gen; -END_RCPP -} -// test_mixed_mrf_sampler -Rcpp::List test_mixed_mrf_sampler(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, bool edge_selection, const std::string& pseudolikelihood, int n_warmup, int n_samples, int seed); -RcppExport SEXP _bgms_test_mixed_mrf_sampler(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP edge_selectionSEXP, SEXP pseudolikelihoodSEXP, SEXP n_warmupSEXP, SEXP n_samplesSEXP, SEXP seedSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); - Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); - Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); - Rcpp::traits::input_parameter< bool >::type edge_selection(edge_selectionSEXP); - Rcpp::traits::input_parameter< const std::string& >::type pseudolikelihood(pseudolikelihoodSEXP); - Rcpp::traits::input_parameter< int >::type n_warmup(n_warmupSEXP); - Rcpp::traits::input_parameter< int >::type n_samples(n_samplesSEXP); - Rcpp::traits::input_parameter< int >::type seed(seedSEXP); - rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_sampler(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, edge_selection, pseudolikelihood, n_warmup, n_samples, seed)); - return rcpp_result_gen; -END_RCPP -} -// test_mixed_mrf_cholesky -Rcpp::List test_mixed_mrf_cholesky(const arma::imat& discrete_observations, const arma::mat& continuous_observations, const arma::ivec& num_categories, const arma::uvec& is_ordinal_variable, const arma::ivec& baseline_category, const arma::mat& inclusion_probability, const arma::imat& initial_edge_indicators, const arma::vec& params, int seed, int target_i, int target_j); -RcppExport SEXP _bgms_test_mixed_mrf_cholesky(SEXP discrete_observationsSEXP, SEXP continuous_observationsSEXP, SEXP num_categoriesSEXP, SEXP is_ordinal_variableSEXP, SEXP baseline_categorySEXP, SEXP inclusion_probabilitySEXP, SEXP initial_edge_indicatorsSEXP, SEXP paramsSEXP, SEXP seedSEXP, SEXP target_iSEXP, SEXP target_jSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const arma::imat& >::type discrete_observations(discrete_observationsSEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type continuous_observations(continuous_observationsSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); - Rcpp::traits::input_parameter< const arma::uvec& >::type is_ordinal_variable(is_ordinal_variableSEXP); - Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); - Rcpp::traits::input_parameter< const arma::mat& >::type inclusion_probability(inclusion_probabilitySEXP); - Rcpp::traits::input_parameter< const arma::imat& >::type initial_edge_indicators(initial_edge_indicatorsSEXP); - Rcpp::traits::input_parameter< const arma::vec& >::type params(paramsSEXP); - Rcpp::traits::input_parameter< int >::type seed(seedSEXP); - Rcpp::traits::input_parameter< int >::type target_i(target_iSEXP); - Rcpp::traits::input_parameter< int >::type target_j(target_jSEXP); - rcpp_result_gen = Rcpp::wrap(test_mixed_mrf_cholesky(discrete_observations, continuous_observations, num_categories, is_ordinal_variable, baseline_category, inclusion_probability, initial_edge_indicators, params, seed, target_i, target_j)); - return rcpp_result_gen; -END_RCPP -} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -387,12 +330,9 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_run_simulation_parallel", (DL_FUNC) &_bgms_run_simulation_parallel, 12}, {"_bgms_run_ggm_simulation_parallel", (DL_FUNC) &_bgms_run_ggm_simulation_parallel, 9}, {"_bgms_sample_ggm", (DL_FUNC) &_bgms_sample_ggm, 19}, + {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 17}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, - {"_bgms_test_mixed_mrf_skeleton", (DL_FUNC) &_bgms_test_mixed_mrf_skeleton, 10}, - {"_bgms_test_mixed_mrf_likelihoods", (DL_FUNC) &_bgms_test_mixed_mrf_likelihoods, 11}, - {"_bgms_test_mixed_mrf_sampler", (DL_FUNC) &_bgms_test_mixed_mrf_sampler, 12}, - {"_bgms_test_mixed_mrf_cholesky", (DL_FUNC) &_bgms_test_mixed_mrf_cholesky, 11}, {NULL, NULL, 0} }; diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 7c1b3f69..1d2cf8ea 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -30,20 +30,6 @@ class MixedMRFModel : public BaseModel { public: - // Test helpers need access to private likelihood functions - friend Rcpp::List test_mixed_mrf_likelihoods( - const arma::imat&, const arma::mat&, const arma::ivec&, - const arma::uvec&, const arma::ivec&, const arma::mat&, - const arma::imat&, bool, const std::string&, const arma::vec&, int - ); - - // Test helper for rank-1 Cholesky correctness (T28/T29) - friend Rcpp::List test_mixed_mrf_cholesky( - const arma::imat&, const arma::mat&, const arma::ivec&, - const arma::uvec&, const arma::ivec&, const arma::mat&, - const arma::imat&, const arma::vec&, int, int, int - ); - // ========================================================================= // Construction // ========================================================================= diff --git a/src/sample_mixed.cpp b/src/sample_mixed.cpp new file mode 100644 index 00000000..9cde1c7d --- /dev/null +++ b/src/sample_mixed.cpp @@ -0,0 +1,122 @@ +/** + * sample_mixed.cpp - R interface for Mixed MRF model sampling + * + * Uses the unified MCMC runner infrastructure to sample from models with + * both discrete (ordinal / Blume-Capel) and continuous variables. + * Supports MH sampler only, with optional edge selection. + */ +#include +#include +#include + +#include "models/mixed/mixed_mrf_model.h" +#include "utils/progress_manager.h" +#include "utils/common_helpers.h" +#include "priors/edge_prior.h" +#include "mcmc/execution/chain_result.h" +#include "mcmc/execution/chain_runner.h" +#include "mcmc/execution/sampler_config.h" + +/** + * R-exported function to sample from a Mixed MRF model. + * + * @param inputFromR List with model specification: + * discrete_observations (integer matrix n x p), + * continuous_observations (numeric matrix n x q), + * num_categories (integer vector, length p), + * is_ordinal_variable (integer vector, length p), + * baseline_category (integer vector, length p), + * main_alpha, main_beta, pairwise_scale (doubles), + * pseudolikelihood (string: "conditional" or "marginal") + * @param prior_inclusion_prob Prior inclusion probabilities ((p+q) x (p+q) matrix) + * @param initial_edge_indicators Initial edge indicators ((p+q) x (p+q) integer matrix) + * @param no_iter Number of post-warmup iterations + * @param no_warmup Number of warmup iterations + * @param no_chains Number of parallel chains + * @param edge_selection Whether to do edge selection (spike-and-slab) + * @param seed Random seed + * @param no_threads Number of threads for parallel execution + * @param progress_type Progress bar type + * @param edge_prior Edge prior type + * @param beta_bernoulli_alpha Beta-Bernoulli alpha hyperparameter + * @param beta_bernoulli_beta Beta-Bernoulli beta hyperparameter + * @param beta_bernoulli_alpha_between SBM between-cluster alpha + * @param beta_bernoulli_beta_between SBM between-cluster beta + * @param dirichlet_alpha Dirichlet alpha for SBM + * @param lambda Lambda for SBM + * + * @return List with per-chain results including samples and diagnostics + */ +// [[Rcpp::export]] +Rcpp::List sample_mixed_mrf( + const Rcpp::List& inputFromR, + const arma::mat& prior_inclusion_prob, + const arma::imat& initial_edge_indicators, + const int no_iter, + const int no_warmup, + const int no_chains, + const bool edge_selection, + const int seed, + const int no_threads, + const int progress_type, + const std::string& edge_prior = "Bernoulli", + const double beta_bernoulli_alpha = 1.0, + const double beta_bernoulli_beta = 1.0, + const double beta_bernoulli_alpha_between = 1.0, + const double beta_bernoulli_beta_between = 1.0, + const double dirichlet_alpha = 1.0, + const double lambda = 1.0 +) { + // Extract model inputs from R list + arma::imat discrete_obs = Rcpp::as(inputFromR["discrete_observations"]); + arma::mat continuous_obs = Rcpp::as(inputFromR["continuous_observations"]); + arma::ivec num_categories = Rcpp::as(inputFromR["num_categories"]); + arma::uvec is_ordinal = Rcpp::as(inputFromR["is_ordinal_variable"]); + arma::ivec baseline_cat = Rcpp::as(inputFromR["baseline_category"]); + double main_alpha = Rcpp::as(inputFromR["main_alpha"]); + double main_beta = Rcpp::as(inputFromR["main_beta"]); + double pairwise_scale = Rcpp::as(inputFromR["pairwise_scale"]); + std::string pseudolikelihood = Rcpp::as(inputFromR["pseudolikelihood"]); + + // Create model + MixedMRFModel model( + discrete_obs, continuous_obs, + num_categories, is_ordinal, baseline_cat, + prior_inclusion_prob, initial_edge_indicators, + edge_selection, pseudolikelihood, + main_alpha, main_beta, pairwise_scale, + seed + ); + + // Create edge prior + EdgePrior edge_prior_enum = edge_prior_from_string(edge_prior); + auto edge_prior_obj = create_edge_prior( + edge_prior_enum, + beta_bernoulli_alpha, beta_bernoulli_beta, + beta_bernoulli_alpha_between, beta_bernoulli_beta_between, + dirichlet_alpha, lambda + ); + + // Configure sampler — Mixed MRF is MH-only + SamplerConfig config; + config.sampler_type = "mh"; + config.no_iter = no_iter; + config.no_warmup = no_warmup; + config.edge_selection = edge_selection; + config.seed = seed; + config.na_impute = false; + + // Set up progress manager + ProgressManager pm(no_chains, no_iter, no_warmup, 50, progress_type); + + // Run MCMC using unified infrastructure + std::vector results = run_mcmc_sampler( + model, *edge_prior_obj, config, no_chains, no_threads, pm); + + // Convert to R list format + Rcpp::List output = convert_results_to_list(results); + + pm.finish(); + + return output; +} diff --git a/src/test_mixed_mrf.cpp b/src/test_mixed_mrf.cpp deleted file mode 100644 index 76dc1d1d..00000000 --- a/src/test_mixed_mrf.cpp +++ /dev/null @@ -1,441 +0,0 @@ -// test_mixed_mrf.cpp — Rcpp test helpers for MixedMRFModel skeleton (Phase A.3) -// -// These are lightweight exported functions that construct a MixedMRFModel from -// R inputs and return diagnostic information for testthat assertions. - -#include -#include "models/mixed/mixed_mrf_model.h" - -// [[Rcpp::export]] -Rcpp::List test_mixed_mrf_skeleton( - const arma::imat& discrete_observations, - const arma::mat& continuous_observations, - const arma::ivec& num_categories, - const arma::uvec& is_ordinal_variable, - const arma::ivec& baseline_category, - const arma::mat& inclusion_probability, - const arma::imat& initial_edge_indicators, - bool edge_selection, - const std::string& pseudolikelihood, - int seed -) { - MixedMRFModel model( - discrete_observations, - continuous_observations, - num_categories, - is_ordinal_variable, - baseline_category, - inclusion_probability, - initial_edge_indicators, - edge_selection, - pseudolikelihood, - 1.0, 1.0, 2.5, - seed - ); - - // --- Dimension checks --- - size_t param_dim = model.parameter_dimension(); - size_t full_param_dim = model.full_parameter_dimension(); - int num_variables = model.get_num_variables(); - int num_pairwise = model.get_num_pairwise(); - - // --- Vectorized parameter round-trip --- - arma::vec params_before = model.get_vectorized_parameters(); - model.set_vectorized_parameters(params_before); - arma::vec params_after = model.get_vectorized_parameters(); - double roundtrip_max_diff = arma::max(arma::abs(params_before - params_after)); - - // --- Full-parameter vector --- - arma::vec full_params = model.get_full_vectorized_parameters(); - - // --- Edge indicators --- - arma::ivec indicator_vec = model.get_vectorized_indicator_parameters(); - const arma::imat& edge_mat = model.get_edge_indicators(); - - // --- Non-trivial parameter round-trip --- - // Set some non-zero parameters and verify round-trip - arma::vec test_params(full_param_dim); - for(size_t i = 0; i < full_param_dim; ++i) { - test_params(i) = static_cast(i + 1) * 0.01; - } - // Kyy must be SPD: overwrite the Kyy block with a diagonal-dominant SPD matrix. - // Kyy occupies indices: num_main + num_pairwise_xx + q ... num_main + num_pairwise_xx + q + q(q+1)/2 - 1 - // For simplicity, just make it diagonal = large positive - int p = discrete_observations.n_cols; - int q = continuous_observations.n_cols; - size_t num_main = 0; - for(int s = 0; s < p; ++s) { - if(is_ordinal_variable(s)) { - num_main += num_categories(s); - } else { - num_main += 2; - } - } - size_t kyy_start = num_main + p * (p - 1) / 2 + q; - // Write identity-like SPD into Kyy block - size_t kyy_idx = kyy_start; - for(int i = 0; i < q; ++i) { - for(int j = i; j < q; ++j) { - if(i == j) { - test_params(kyy_idx) = 2.0 + i * 0.1; // positive diagonal - } else { - test_params(kyy_idx) = 0.01; // small off-diagonal - } - kyy_idx++; - } - } - - model.set_vectorized_parameters(test_params); - arma::vec recovered = model.get_vectorized_parameters(); - double nontrivial_max_diff = arma::max(arma::abs(test_params - recovered)); - - // --- Clone round-trip --- - auto cloned = model.clone(); - arma::vec cloned_params = cloned->get_vectorized_parameters(); - double clone_max_diff = arma::max(arma::abs(recovered - cloned_params)); - - return Rcpp::List::create( - Rcpp::Named("parameter_dimension") = param_dim, - Rcpp::Named("full_parameter_dimension") = full_param_dim, - Rcpp::Named("num_variables") = num_variables, - Rcpp::Named("num_pairwise") = num_pairwise, - Rcpp::Named("params_length") = params_before.n_elem, - Rcpp::Named("roundtrip_max_diff") = roundtrip_max_diff, - Rcpp::Named("nontrivial_roundtrip_max_diff") = nontrivial_max_diff, - Rcpp::Named("clone_max_diff") = clone_max_diff, - Rcpp::Named("indicator_length") = indicator_vec.n_elem, - Rcpp::Named("edge_indicators_rows") = edge_mat.n_rows, - Rcpp::Named("edge_indicators_cols") = edge_mat.n_cols, - Rcpp::Named("has_edge_selection") = model.has_edge_selection(), - Rcpp::Named("has_adaptive_metropolis") = model.has_adaptive_metropolis(), - Rcpp::Named("has_gradient") = model.has_gradient(), - Rcpp::Named("has_missing_data") = model.has_missing_data() - ); -} - - -// [[Rcpp::export]] -Rcpp::List test_mixed_mrf_likelihoods( - const arma::imat& discrete_observations, - const arma::mat& continuous_observations, - const arma::ivec& num_categories, - const arma::uvec& is_ordinal_variable, - const arma::ivec& baseline_category, - const arma::mat& inclusion_probability, - const arma::imat& initial_edge_indicators, - bool edge_selection, - const std::string& pseudolikelihood, - const arma::vec& params, - int seed -) { - MixedMRFModel model( - discrete_observations, - continuous_observations, - num_categories, - is_ordinal_variable, - baseline_category, - inclusion_probability, - initial_edge_indicators, - edge_selection, - pseudolikelihood, - 1.0, 1.0, 2.5, - seed - ); - - // Set parameters (caller must ensure Kyy block is SPD) - model.set_vectorized_parameters(params); - - int p = discrete_observations.n_cols; - - // Evaluate log_conditional_omrf for each discrete variable - Rcpp::NumericVector omrf_ll(p); - for(int s = 0; s < p; ++s) { - omrf_ll[s] = model.log_conditional_omrf(s); - } - - // Evaluate log_marginal_omrf for each discrete variable (marginal mode only) - Rcpp::NumericVector marg_omrf_ll(p); - if(pseudolikelihood == "marginal") { - for(int s = 0; s < p; ++s) { - marg_omrf_ll[s] = model.log_marginal_omrf(s); - } - } - - // Evaluate log_conditional_ggm - double ggm_ll = model.log_conditional_ggm(); - - return Rcpp::List::create( - Rcpp::Named("omrf_ll") = omrf_ll, - Rcpp::Named("marg_omrf_ll") = marg_omrf_ll, - Rcpp::Named("ggm_ll") = ggm_ll - ); -} - - -// [[Rcpp::export]] -Rcpp::List test_mixed_mrf_sampler( - const arma::imat& discrete_observations, - const arma::mat& continuous_observations, - const arma::ivec& num_categories, - const arma::uvec& is_ordinal_variable, - const arma::ivec& baseline_category, - const arma::mat& inclusion_probability, - const arma::imat& initial_edge_indicators, - bool edge_selection, - const std::string& pseudolikelihood, - int n_warmup, - int n_samples, - int seed -) { - MixedMRFModel model( - discrete_observations, - continuous_observations, - num_categories, - is_ordinal_variable, - baseline_category, - inclusion_probability, - initial_edge_indicators, - edge_selection, - pseudolikelihood, - 1.0, 1.0, 2.5, - seed - ); - - size_t full_dim = model.full_parameter_dimension(); - - // Warmup (discard samples, no edge selection yet) - for(int iter = 0; iter < n_warmup; ++iter) { - model.prepare_iteration(); - model.do_one_metropolis_step(iter); - } - - // Activate edge selection after warmup - if(edge_selection) { - model.set_edge_selection_active(true); - } - - // Sampling - arma::mat samples(n_samples, full_dim); - int num_indicators = model.get_num_pairwise(); - arma::imat indicator_samples(n_samples, num_indicators); - - for(int iter = 0; iter < n_samples; ++iter) { - model.prepare_iteration(); - model.do_one_metropolis_step(n_warmup + iter); - samples.row(iter) = model.get_full_vectorized_parameters().t(); - if(edge_selection) { - indicator_samples.row(iter) = model.get_vectorized_indicator_parameters().t(); - } - } - - Rcpp::List result = Rcpp::List::create( - Rcpp::Named("samples") = samples, - Rcpp::Named("full_parameter_dimension") = full_dim - ); - - if(edge_selection) { - result["indicator_samples"] = indicator_samples; - } - - return result; -} - - -// ============================================================================= -// test_mixed_mrf_cholesky — T28 (log-ratio agreement) and T29 (Cholesky fidelity) -// ============================================================================= - -// [[Rcpp::export]] -Rcpp::List test_mixed_mrf_cholesky( - const arma::imat& discrete_observations, - const arma::mat& continuous_observations, - const arma::ivec& num_categories, - const arma::uvec& is_ordinal_variable, - const arma::ivec& baseline_category, - const arma::mat& inclusion_probability, - const arma::imat& initial_edge_indicators, - const arma::vec& params, - int seed, - int target_i, - int target_j -) { - MixedMRFModel model( - discrete_observations, - continuous_observations, - num_categories, - is_ordinal_variable, - baseline_category, - inclusion_probability, - initial_edge_indicators, - false, // no edge selection - "conditional", - 1.0, 1.0, 2.5, - seed - ); - - model.set_vectorized_parameters(params); - - int q = static_cast(model.q_); - - // ========================================================================= - // T28: log_ggm_ratio_edge vs brute-force log_conditional_ggm difference - // ========================================================================= - - // Current log-likelihood - double ggm_ll_curr = model.log_conditional_ggm(); - - // Extract reparameterization constants and build a deterministic proposal - model.get_kyy_constants(target_i, target_j); - double phi_curr = model.kyy_constants_[0]; - double phi_prop = phi_curr + 0.05; // small deterministic shift - - double omega_prop_ij = model.kyy_constants_[2] + model.kyy_constants_[3] * phi_prop; - double omega_prop_jj = model.kyy_constrained_diagonal(omega_prop_ij); - - model.precision_yy_proposal_ = model.Kyy_; - model.precision_yy_proposal_(target_i, target_j) = omega_prop_ij; - model.precision_yy_proposal_(target_j, target_i) = omega_prop_ij; - model.precision_yy_proposal_(target_j, target_j) = omega_prop_jj; - - // Rank-2 log-ratio via new function - double ratio_rank2 = model.log_ggm_ratio_edge(target_i, target_j); - - // Brute-force: install proposed Kyy, full recompute, evaluate - arma::mat Kyy_saved = model.Kyy_; - arma::mat cov_saved = model.covariance_yy_; - arma::mat chol_saved = model.Kyy_chol_; - arma::mat inv_chol_saved = model.inv_cholesky_yy_; - double logdet_saved = model.Kyy_log_det_; - arma::mat cmean_saved = model.conditional_mean_; - - model.Kyy_ = model.precision_yy_proposal_; - model.recompute_Kyy_decomposition(); - model.recompute_conditional_mean(); - double ggm_ll_prop = model.log_conditional_ggm(); - - double ratio_bruteforce = ggm_ll_prop - ggm_ll_curr; - - // ========================================================================= - // T28b: log_ggm_ratio_diag vs brute-force - // ========================================================================= - - // Restore to current state - model.Kyy_ = Kyy_saved; - model.covariance_yy_ = cov_saved; - model.Kyy_chol_ = chol_saved; - model.inv_cholesky_yy_ = inv_chol_saved; - model.Kyy_log_det_ = logdet_saved; - model.conditional_mean_ = cmean_saved; - - // Diagonal proposal: small shift on log-Cholesky scale - double logdet_curr = cholesky_helpers::get_log_det(model.Kyy_chol_); - double logdet_sub = logdet_curr + std::log(model.covariance_yy_(target_i, target_i)); - double theta_curr = (logdet_curr - logdet_sub) / 2.0; - double theta_prop = theta_curr + 0.05; - - model.precision_yy_proposal_ = model.Kyy_; - model.precision_yy_proposal_(target_i, target_i) = model.Kyy_(target_i, target_i) - - std::exp(theta_curr) * std::exp(theta_curr) - + std::exp(theta_prop) * std::exp(theta_prop); - - double ratio_diag_rank1 = model.log_ggm_ratio_diag(target_i); - - // Brute-force - model.Kyy_ = model.precision_yy_proposal_; - model.recompute_Kyy_decomposition(); - model.recompute_conditional_mean(); - double ggm_ll_diag_prop = model.log_conditional_ggm(); - - double ratio_diag_brute = ggm_ll_diag_prop - ggm_ll_curr; - - // ========================================================================= - // T29: Cholesky update fidelity — rank-2 edge update - // ========================================================================= - - // Restore to current state - model.Kyy_ = Kyy_saved; - model.covariance_yy_ = cov_saved; - model.Kyy_chol_ = chol_saved; - model.inv_cholesky_yy_ = inv_chol_saved; - model.Kyy_log_det_ = logdet_saved; - model.conditional_mean_ = cmean_saved; - - // Re-fill off-diagonal proposal - model.precision_yy_proposal_ = model.Kyy_; - model.precision_yy_proposal_(target_i, target_j) = omega_prop_ij; - model.precision_yy_proposal_(target_j, target_i) = omega_prop_ij; - model.precision_yy_proposal_(target_j, target_j) = omega_prop_jj; - - // Apply rank-1 Cholesky update - double old_ij = model.Kyy_(target_i, target_j); - double old_jj = model.Kyy_(target_j, target_j); - model.Kyy_(target_i, target_j) = omega_prop_ij; - model.Kyy_(target_j, target_i) = omega_prop_ij; - model.Kyy_(target_j, target_j) = omega_prop_jj; - model.cholesky_update_after_kyy_edge(old_ij, old_jj, target_i, target_j); - - arma::mat chol_rank1 = model.Kyy_chol_; - arma::mat cov_rank1 = model.covariance_yy_; - double logdet_rank1 = model.Kyy_log_det_; - - // Full recompute for ground truth - model.recompute_Kyy_decomposition(); - arma::mat chol_full = model.Kyy_chol_; - arma::mat cov_full = model.covariance_yy_; - double logdet_full = model.Kyy_log_det_; - - double chol_max_diff = arma::max(arma::max(arma::abs(chol_rank1 - chol_full))); - double cov_max_diff = arma::max(arma::max(arma::abs(cov_rank1 - cov_full))); - double logdet_diff = std::abs(logdet_rank1 - logdet_full); - - // ========================================================================= - // T29b: Cholesky update fidelity — rank-1 diagonal update - // ========================================================================= - - // Restore - model.Kyy_ = Kyy_saved; - model.covariance_yy_ = cov_saved; - model.Kyy_chol_ = chol_saved; - model.inv_cholesky_yy_ = inv_chol_saved; - model.Kyy_log_det_ = logdet_saved; - - // Diagonal proposal (reuse from T28b) - model.precision_yy_proposal_ = model.Kyy_; - model.precision_yy_proposal_(target_i, target_i) = model.Kyy_(target_i, target_i) - - std::exp(theta_curr) * std::exp(theta_curr) - + std::exp(theta_prop) * std::exp(theta_prop); - - double old_ii = model.Kyy_(target_i, target_i); - model.Kyy_(target_i, target_i) = model.precision_yy_proposal_(target_i, target_i); - model.cholesky_update_after_kyy_diag(old_ii, target_i); - - arma::mat chol_diag_rank1 = model.Kyy_chol_; - arma::mat cov_diag_rank1 = model.covariance_yy_; - double logdet_diag_rank1 = model.Kyy_log_det_; - - model.recompute_Kyy_decomposition(); - arma::mat chol_diag_full = model.Kyy_chol_; - arma::mat cov_diag_full = model.covariance_yy_; - double logdet_diag_full = model.Kyy_log_det_; - - double chol_diag_max_diff = arma::max(arma::max(arma::abs(chol_diag_rank1 - chol_diag_full))); - double cov_diag_max_diff = arma::max(arma::max(arma::abs(cov_diag_rank1 - cov_diag_full))); - double logdet_diag_diff = std::abs(logdet_diag_rank1 - logdet_diag_full); - - return Rcpp::List::create( - // T28: off-diagonal log-ratio agreement - Rcpp::Named("ratio_rank2") = ratio_rank2, - Rcpp::Named("ratio_bruteforce") = ratio_bruteforce, - // T28b: diagonal log-ratio agreement - Rcpp::Named("ratio_diag_rank1") = ratio_diag_rank1, - Rcpp::Named("ratio_diag_brute") = ratio_diag_brute, - // T29: off-diagonal Cholesky fidelity - Rcpp::Named("chol_max_diff") = chol_max_diff, - Rcpp::Named("cov_max_diff") = cov_max_diff, - Rcpp::Named("logdet_diff") = logdet_diff, - // T29b: diagonal Cholesky fidelity - Rcpp::Named("chol_diag_max_diff") = chol_diag_max_diff, - Rcpp::Named("cov_diag_max_diff") = cov_diag_max_diff, - Rcpp::Named("logdet_diag_diff") = logdet_diag_diff - ); -} diff --git a/tests/testthat/helper-fixtures.R b/tests/testthat/helper-fixtures.R index b217a35f..f69ab598 100644 --- a/tests/testthat/helper-fixtures.R +++ b/tests/testthat/helper-fixtures.R @@ -519,6 +519,82 @@ get_bgms_fit_ggm_no_es = function() { .test_cache$bgms_fit_ggm_no_es } +get_bgms_fit_mixed_mrf = function() { + if(is.null(.test_cache$bgms_fit_mixed_mrf)) { + set.seed(99) + n = 80 + x = cbind( + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE) + ) + colnames(x) = c("d1", "c1", "d2", "c2", "d3") + .test_cache$bgms_fit_mixed_mrf = bgm( + x = x, + variable_type = c("ordinal", "continuous", "ordinal", + "continuous", "ordinal"), + edge_selection = TRUE, + iter = 50, warmup = 100, chains = 1, + seed = 77771, + display_progress = "none" + ) + } + .test_cache$bgms_fit_mixed_mrf +} + +get_bgms_fit_mixed_mrf_no_es = function() { + if(is.null(.test_cache$bgms_fit_mixed_mrf_no_es)) { + set.seed(99) + n = 80 + x = cbind( + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE) + ) + colnames(x) = c("d1", "c1", "d2", "c2", "d3") + .test_cache$bgms_fit_mixed_mrf_no_es = bgm( + x = x, + variable_type = c("ordinal", "continuous", "ordinal", + "continuous", "ordinal"), + edge_selection = FALSE, + iter = 50, warmup = 100, chains = 1, + seed = 77772, + display_progress = "none" + ) + } + .test_cache$bgms_fit_mixed_mrf_no_es +} + +get_bgms_fit_mixed_mrf_marginal = function() { + if(is.null(.test_cache$bgms_fit_mixed_mrf_marginal)) { + set.seed(99) + n = 80 + x = cbind( + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE) + ) + colnames(x) = c("d1", "c1", "d2", "c2", "d3") + .test_cache$bgms_fit_mixed_mrf_marginal = bgm( + x = x, + variable_type = c("ordinal", "continuous", "ordinal", + "continuous", "ordinal"), + edge_selection = FALSE, + pseudolikelihood = "marginal", + iter = 50, warmup = 100, chains = 1, + seed = 77773, + display_progress = "none" + ) + } + .test_cache$bgms_fit_mixed_mrf_marginal +} + # ------------------------------------------------------------------------------ # 2. Prediction Data Helpers # ------------------------------------------------------------------------------ diff --git a/tests/testthat/test-bgm.R b/tests/testthat/test-bgm.R index 67b2cdec..58a944ef 100644 --- a/tests/testthat/test-bgm.R +++ b/tests/testthat/test-bgm.R @@ -698,6 +698,123 @@ test_that("bgm GGM edge selection discriminates true edges", { # --- D.7: Conditional regression check ---------------------------------------- +# ============================================================================== +# Mixed MRF End-to-End Tests +# ============================================================================== + +test_that("bgm mixed MRF is reproducible", { + fit1 = get_bgms_fit_mixed_mrf() + + set.seed(99) + n = 80 + x = cbind( + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE) + ) + colnames(x) = c("d1", "c1", "d2", "c2", "d3") + + fit2 = bgm( + x = x, + variable_type = c("ordinal", "continuous", "ordinal", + "continuous", "ordinal"), + edge_selection = TRUE, + iter = 50, warmup = 100, chains = 1, + seed = 77771, + display_progress = "none" + ) + + testthat::expect_equal(fit1$raw_samples$main, fit2$raw_samples$main) + testthat::expect_equal(fit1$raw_samples$pairwise, fit2$raw_samples$pairwise) +}) + +test_that("bgm mixed MRF output has correct dimensions", { + fit = get_bgms_fit_mixed_mrf() + args = extract_arguments(fit) + p_total = args$num_variables # 5 + p = 3L # discrete + q = 2L # continuous + + # pairwise: p_total*(p_total-1)/2 edges + n_edges = p_total * (p_total - 1) / 2 + expect_equal(nrow(fit$posterior_summary_pairwise), n_edges) + expect_equal(nrow(fit$posterior_mean_pairwise), p_total) + expect_equal(ncol(fit$posterior_mean_pairwise), p_total) + + # indicators (edge selection = TRUE) + expect_equal(nrow(fit$posterior_summary_indicator), n_edges) + expect_equal(nrow(fit$posterior_mean_indicator), p_total) + expect_equal(ncol(fit$posterior_mean_indicator), p_total) + + # posterior_mean_main: list with discrete and continuous + expect_true(is.list(fit$posterior_mean_main)) + expect_equal(nrow(fit$posterior_mean_main$discrete), p) + expect_equal(nrow(fit$posterior_mean_main$continuous), q) + expect_equal(ncol(fit$posterior_mean_main$continuous), 2) # mean + precision + + # raw samples + expect_equal(ncol(fit$raw_samples$pairwise[[1]]), n_edges) + expect_equal(nrow(fit$raw_samples$main[[1]]), args$iter) +}) + +test_that("bgm mixed MRF without edge selection omits indicators", { + fit = get_bgms_fit_mixed_mrf_no_es() + + expect_s3_class(fit, "bgms") + expect_null(fit$posterior_summary_indicator) + expect_null(fit$posterior_mean_indicator) +}) + +test_that("bgm mixed MRF pairwise matrix has correct variable names", { + fit = get_bgms_fit_mixed_mrf() + + # Interleaved order: d1, c1, d2, c2, d3 + expected_names = c("d1", "c1", "d2", "c2", "d3") + expect_equal(rownames(fit$posterior_mean_pairwise), expected_names) + expect_equal(colnames(fit$posterior_mean_pairwise), expected_names) + expect_equal(rownames(fit$posterior_mean_indicator), expected_names) + expect_equal(colnames(fit$posterior_mean_indicator), expected_names) +}) + +test_that("bgm mixed MRF pairwise matrix is symmetric", { + fit = get_bgms_fit_mixed_mrf() + expect_equal(fit$posterior_mean_pairwise, t(fit$posterior_mean_pairwise)) + expect_equal(fit$posterior_mean_indicator, t(fit$posterior_mean_indicator)) +}) + +test_that("bgm mixed MRF summary-matrix consistency", { + fit = get_bgms_fit_mixed_mrf() + expect_true( + all(check_summary_matrix_consistency( + fit$posterior_summary_pairwise, + fit$posterior_mean_pairwise + )), + info = "Mixed MRF pairwise summary names do not match matrix positions" + ) + expect_true( + all(check_summary_matrix_consistency( + fit$posterior_summary_indicator, + fit$posterior_mean_indicator + )), + info = "Mixed MRF indicator summary names do not match matrix positions" + ) +}) + +test_that("bgm mixed MRF posterior precision diagonals are positive", { + fit = get_bgms_fit_mixed_mrf_no_es() + expect_true(all(fit$posterior_mean_main$continuous[, "precision"] > 0)) +}) + +test_that("bgm mixed MRF marginal pseudolikelihood runs", { + fit = get_bgms_fit_mixed_mrf_marginal() + expect_s3_class(fit, "bgms") + expect_equal(nrow(fit$posterior_mean_pairwise), 5) + expect_true(all(is.finite(fit$posterior_mean_pairwise))) +}) + + test_that("bgm GGM implied regression matches OLS for large n", { skip_on_cran() diff --git a/tests/testthat/test-input-validation.R b/tests/testthat/test-input-validation.R index d2994044..58e3af47 100644 --- a/tests/testthat/test-input-validation.R +++ b/tests/testthat/test-input-validation.R @@ -84,14 +84,21 @@ test_that("GGM rejects NUTS and HMC update methods", { ) }) -test_that("Mixed continuous and ordinal variable types are rejected", { +test_that("Mixed continuous and ordinal variable types are accepted for bgm", { set.seed(42) - x = matrix(rnorm(200), nrow = 50, ncol = 4) - - expect_error( - bgm(x = x, variable_type = c("continuous", "ordinal", "ordinal", "ordinal")), - "all variables must be of type" + x = data.frame( + ord1 = sample(0:2, 50, replace = TRUE), + ord2 = sample(0:2, 50, replace = TRUE), + cont1 = rnorm(50), + cont2 = rnorm(50) + ) + spec = bgm_spec( + x = x, + variable_type = c("ordinal", "ordinal", "continuous", "continuous") ) + expect_equal(spec$model_type, "mixed_mrf") + expect_equal(spec$data$num_discrete, 2L) + expect_equal(spec$data$num_continuous, 2L) }) diff --git a/tests/testthat/test-mixed-mrf-cholesky.R b/tests/testthat/test-mixed-mrf-cholesky.R deleted file mode 100644 index de6d8726..00000000 --- a/tests/testthat/test-mixed-mrf-cholesky.R +++ /dev/null @@ -1,183 +0,0 @@ -# ============================================================================= -# test-mixed-mrf-cholesky.R — Phase B+ Cholesky rank-1 update tests -# ============================================================================= -# T28: log_ggm_ratio_edge matches brute-force log-likelihood difference -# T28b: log_ggm_ratio_diag matches brute-force log-likelihood difference -# T29: Cholesky / covariance / logdet fidelity after rank-2 edge update -# T29b: Cholesky / covariance / logdet fidelity after rank-1 diagonal update - -# ------------------------------------------------------------------ -# Helper: build parameter vector with nonzero Kyy (must be SPD) -# ------------------------------------------------------------------ -make_cholesky_test = function(q = 3L) { - set.seed(42) - n = 20L; p = 2L - num_cats = c(2L, 3L) - is_ordinal = c(1L, 1L) - baseline_cat = c(0L, 0L) - - x = matrix(0L, n, p) - x[, 1] = sample(0:2, n, replace = TRUE) - x[, 2] = sample(0:3, n, replace = TRUE) - y = matrix(rnorm(n * q), n, q) - - pq = p + q - inc_prob = matrix(0.5, pq, pq) - edge_ind = matrix(1L, pq, pq) - diag(edge_ind) = 0L - - # Param layout: main | Kxx | muy | Kyy (upper-tri) | Kxy - num_main = sum(num_cats) # 2 + 3 = 5 - num_kxx = p * (p - 1L) / 2L # 1 - num_kyy = q * (q + 1L) / 2L - num_kxy = p * q - total = num_main + num_kxx + q + num_kyy + num_kxy - params = rep(0, total) - - # Thresholds - params[1:2] = c(0.3, -0.2) - params[3:5] = c(0.1, 0.4, -0.1) - - # Kxx(0,1) - params[num_main + 1] = 0.2 - - # muy - muy_start = num_main + num_kxx - params[muy_start + seq_len(q)] = rnorm(q, sd = 0.2) - - # Kyy: build SPD Q = L L^T with random L, then pack upper-tri - L = matrix(0, q, q) - diag(L) = runif(q, 1.0, 2.0) - L[lower.tri(L)] = rnorm(q * (q - 1) / 2, sd = 0.3) - Kyy = L %*% t(L) - kyy_start = muy_start + q - idx = 0L - for(i in seq_len(q)) { - for(j in i:q) { - idx = idx + 1L - params[kyy_start + idx] = Kyy[i, j] - } - } - - # Kxy - kxy_start = kyy_start + num_kyy - params[kxy_start + seq_len(num_kxy)] = rnorm(num_kxy, sd = 0.1) - - list( - x = x, y = y, - num_cats = num_cats, - is_ordinal = as.integer(is_ordinal), - baseline_cat = baseline_cat, - inc_prob = inc_prob, - edge_ind = edge_ind, - params = params, - q = q - ) -} - - -# ============================================================================== -# T28 + T28b: log-ratio agreement (off-diagonal and diagonal) -# ============================================================================== - -test_that("log_ggm_ratio_edge matches brute-force (T28)", { - d = make_cholesky_test(q = 3L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 1L, target_i = 0L, target_j = 1L - ) - expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) -}) - -test_that("log_ggm_ratio_diag matches brute-force (T28b)", { - d = make_cholesky_test(q = 3L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 1L, target_i = 0L, target_j = 1L - ) - expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) -}) - - -# ============================================================================== -# T29 + T29b: Cholesky fidelity after rank-1/rank-2 updates -# ============================================================================== - -test_that("Cholesky update after edge matches full recompute (T29)", { - d = make_cholesky_test(q = 3L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 1L, target_i = 0L, target_j = 1L - ) - expect_lt(res$chol_max_diff, 1e-10) - expect_lt(res$cov_max_diff, 1e-10) - expect_lt(res$logdet_diff, 1e-10) -}) - -test_that("Cholesky update after diagonal matches full recompute (T29b)", { - d = make_cholesky_test(q = 3L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 1L, target_i = 0L, target_j = 1L - ) - expect_lt(res$chol_diag_max_diff, 1e-10) - expect_lt(res$cov_diag_max_diff, 1e-10) - expect_lt(res$logdet_diag_diff, 1e-10) -}) - - -# ============================================================================== -# Same tests with different target indices (i=1, j=2) and q=4 -# ============================================================================== - -test_that("log_ggm_ratio_edge matches brute-force (T28, q=4, ij=1,2)", { - d = make_cholesky_test(q = 4L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 7L, target_i = 1L, target_j = 2L - ) - expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) - expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) -}) - -test_that("Cholesky fidelity (T29/T29b, q=4, ij=1,2)", { - d = make_cholesky_test(q = 4L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 7L, target_i = 1L, target_j = 2L - ) - expect_lt(res$chol_max_diff, 1e-10) - expect_lt(res$cov_max_diff, 1e-10) - expect_lt(res$logdet_diff, 1e-10) - expect_lt(res$chol_diag_max_diff, 1e-10) - expect_lt(res$cov_diag_max_diff, 1e-10) - expect_lt(res$logdet_diag_diff, 1e-10) -}) - - -# ============================================================================== -# Test with q=2 (minimum for off-diagonal) — boundary case -# ============================================================================== - -test_that("Rank-1 Cholesky correctness with q=2 boundary (T28-T29b)", { - d = make_cholesky_test(q = 2L) - res = bgms:::test_mixed_mrf_cholesky( - d$x, d$y, d$num_cats, d$is_ordinal, d$baseline_cat, - d$inc_prob, d$edge_ind, d$params, - seed = 99L, target_i = 0L, target_j = 1L - ) - expect_equal(res$ratio_rank2, res$ratio_bruteforce, tolerance = 1e-10) - expect_equal(res$ratio_diag_rank1, res$ratio_diag_brute, tolerance = 1e-10) - expect_lt(res$chol_max_diff, 1e-10) - expect_lt(res$cov_max_diff, 1e-10) - expect_lt(res$logdet_diff, 1e-10) - expect_lt(res$chol_diag_max_diff, 1e-10) - expect_lt(res$cov_diag_max_diff, 1e-10) - expect_lt(res$logdet_diag_diff, 1e-10) -}) diff --git a/tests/testthat/test-mixed-mrf-edge-selection.R b/tests/testthat/test-mixed-mrf-edge-selection.R deleted file mode 100644 index cfb5b0ca..00000000 --- a/tests/testthat/test-mixed-mrf-edge-selection.R +++ /dev/null @@ -1,326 +0,0 @@ -# ============================================================================= -# test-mixed-mrf-edge-selection.R — Phase D edge selection tests -# ============================================================================= -# Validates that update_edge_indicators() produces correct spike-and-slab -# structure learning via reversible-jump Metropolis-Hastings. -# -# Strategy: generate from a sparse graph with known zero edges, run the -# sampler with edge_selection = TRUE, and check that posterior inclusion -# probabilities (PIPs) correctly separate true edges from null edges. - -skip_if_not_installed("mixedGM") - -# --------------------------------------------------------------------------- -# Helper: extract edge indicators from indicator_samples -# --------------------------------------------------------------------------- -# Vectorization order: Gxx upper-tri, Gyy upper-tri, Gxy row-major -extract_pip = function(indicator_samples, p, q) { - pip = colMeans(indicator_samples) - idx = 1L - - # 1. Gxx upper-triangle - n_xx = p * (p - 1) / 2 - pip_xx = pip[idx:(idx + n_xx - 1)]; idx = idx + n_xx - - Gxx = matrix(0, p, p) - k = 1L - for(i in 1:(p - 1)) for(j in (i + 1):p) { - Gxx[i, j] = Gxx[j, i] = pip_xx[k]; k = k + 1L - } - - # 2. Gyy upper-triangle - n_yy = q * (q - 1) / 2 - Gyy = matrix(0, q, q) - if(n_yy > 0) { - pip_yy = pip[idx:(idx + n_yy - 1)]; idx = idx + n_yy - k = 1L - for(i in 1:(q - 1)) for(j in (i + 1):q) { - Gyy[i, j] = Gyy[j, i] = pip_yy[k]; k = k + 1L - } - } - - # 3. Gxy row-major - n_xy = p * q - pip_xy = pip[idx:(idx + n_xy - 1)] - Gxy = matrix(pip_xy, nrow = p, ncol = q, byrow = TRUE) - - list(Gxx = Gxx, Gyy = Gyy, Gxy = Gxy) -} - - -# =========================================================================== -# Test 1: Edge selection on simulation data (conditional PL) -# =========================================================================== -test_that("edge selection recovers sparse structure (conditional PL)", { - skip_on_cran() - - p = 3L; q = 2L; n = 800L - num_cats_mgm = rep(3L, p) - num_cats_bgms = rep(2L, p) - - # Sparse graph: only (1,2) in Kxx, (1,2) in Kxy; Kyy has (1,2) edge - Kxx_true = matrix(0, p, p) - Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 - - Kyy_true = diag(q) - Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 - - Kxy_true = matrix(0, p, q) - Kxy_true[1, 2] = 0.3 - - mux_true = matrix(0, p, max(num_cats_bgms)) - mux_true[, 1] = c(-0.5, 0.3, -0.2) - mux_true[, 2] = c(-1.0, -0.8, -0.6) - muy_true = c(0.5, -0.3) - - # Generate data using mixedGM - set.seed(123) - sim = mixedGM::mixed_gibbs_generate( - n = n, num_categories = num_cats_mgm, - mux = mux_true, Kxx = Kxx_true, - muy = muy_true, Kyy = Kyy_true, - Kxy = Kxy_true, - n_burnin = 3000L - ) - - x = sim$x - y = sim$y - pq = p + q - - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, TRUE, "conditional", - 3000L, 5000L, 42L - ) - - pips = extract_pip(bgms_out$indicator_samples, p, q) - - # True edges should have high PIP - expect_gt(pips$Gxx[1, 2], 0.5, label = "Kxx(1,2) PIP > 0.5") - expect_gt(pips$Gxy[1, 2], 0.5, label = "Kxy(1,2) PIP > 0.5") - expect_gt(pips$Gyy[1, 2], 0.5, label = "Kyy(1,2) PIP > 0.5") - - # Most null edges should have low PIP (allow one false positive due to - - # conditional PL sensitivity with small p, q) - null_kxx = c(pips$Gxx[1, 3], pips$Gxx[2, 3]) - null_kxy = c(pips$Gxy[2, 1], pips$Gxy[2, 2], - pips$Gxy[3, 1], pips$Gxy[3, 2]) - expect_lt(mean(c(null_kxx, null_kxy) > 0.5), 0.5, - label = "Fewer than half of null edges are false positives") - expect_lt(median(c(null_kxx, null_kxy)), 0.3, - label = "Median null PIP is low") -}) - - -# =========================================================================== -# Test 2: Edge selection on simulation data (marginal PL) -# =========================================================================== -test_that("edge selection recovers sparse structure (marginal PL)", { - skip_on_cran() - - p = 3L; q = 2L; n = 800L - num_cats_mgm = rep(3L, p) - num_cats_bgms = rep(2L, p) - - Kxx_true = matrix(0, p, p) - Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 - - Kyy_true = diag(q) - Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 - - Kxy_true = matrix(0, p, q) - Kxy_true[1, 2] = 0.3 - - mux_true = matrix(0, p, max(num_cats_bgms)) - mux_true[, 1] = c(-0.5, 0.3, -0.2) - mux_true[, 2] = c(-1.0, -0.8, -0.6) - muy_true = c(0.5, -0.3) - - set.seed(123) - sim = mixedGM::mixed_gibbs_generate( - n = n, num_categories = num_cats_mgm, - mux = mux_true, Kxx = Kxx_true, - muy = muy_true, Kyy = Kyy_true, - Kxy = Kxy_true, - n_burnin = 3000L - ) - - x = sim$x - y = sim$y - pq = p + q - - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, TRUE, "marginal", - 3000L, 5000L, 42L - ) - - pips = extract_pip(bgms_out$indicator_samples, p, q) - - # True edges should have high PIP - expect_gt(pips$Gxx[1, 2], 0.5, label = "Kxx(1,2) PIP > 0.5") - expect_gt(pips$Gxy[1, 2], 0.5, label = "Kxy(1,2) PIP > 0.5") - expect_gt(pips$Gyy[1, 2], 0.5, label = "Kyy(1,2) PIP > 0.5") - - # Null edges low PIP - expect_lt(pips$Gxx[1, 3], 0.5, label = "Kxx(1,3) null PIP < 0.5") - expect_lt(pips$Gxx[2, 3], 0.5, label = "Kxx(2,3) null PIP < 0.5") - expect_lt(pips$Gxy[1, 1], 0.5, label = "Kxy(1,1) null PIP < 0.5") - expect_lt(pips$Gxy[2, 1], 0.5, label = "Kxy(2,1) null PIP < 0.5") - expect_lt(pips$Gxy[2, 2], 0.5, label = "Kxy(2,2) null PIP < 0.5") - expect_lt(pips$Gxy[3, 1], 0.5, label = "Kxy(3,1) null PIP < 0.5") - expect_lt(pips$Gxy[3, 2], 0.5, label = "Kxy(3,2) null PIP < 0.5") -}) - - -# =========================================================================== -# Test 3: Edge selection vs mixedGM (conditional PL) -# =========================================================================== -test_that("edge selection PIPs agree with mixedGM (conditional PL)", { - skip_on_cran() - - p = 3L; q = 2L; n = 800L - num_cats_mgm = rep(3L, p) - num_cats_bgms = rep(2L, p) - - Kxx_true = matrix(0, p, p) - Kxx_true[1, 2] = Kxx_true[2, 1] = 0.4 - - Kyy_true = diag(q) - Kyy_true[1, 2] = Kyy_true[2, 1] = 0.3 - - Kxy_true = matrix(0, p, q) - Kxy_true[1, 2] = 0.3 - - mux_true = matrix(0, p, max(num_cats_bgms)) - mux_true[, 1] = c(-0.5, 0.3, -0.2) - mux_true[, 2] = c(-1.0, -0.8, -0.6) - muy_true = c(0.5, -0.3) - - set.seed(123) - sim = mixedGM::mixed_gibbs_generate( - n = n, num_categories = num_cats_mgm, - mux = mux_true, Kxx = Kxx_true, - muy = muy_true, Kyy = Kyy_true, - Kxy = Kxy_true, - n_burnin = 3000L - ) - - x = sim$x - y = sim$y - pq = p + q - - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - # bgms with edge selection - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, TRUE, "conditional", - 3000L, 5000L, 42L - ) - pips_bgms = extract_pip(bgms_out$indicator_samples, p, q) - - # mixedGM with edge selection (using logistic prior to match bgms) - set.seed(42) - mgm = mixedGM::mixed_sampler( - x = x, y = y, num_categories = num_cats_mgm, - n_warmup = 3000L, n_samples = 5000L, - edge_selection = TRUE, verbose = FALSE, - pseudolikelihood = "conditional", - log_prior_mean = mixedGM:::log_prior_logistic, - lp_mean_params = list() - ) - - # mixedGM stores indicators as 3D array: samples$indicator[iter, i, j] - # G is (p+q) x (p+q): rows/cols 1:p = discrete, (p+1):(p+q) = continuous - G_array = mgm$samples$indicator - Gxx_mgm = matrix(0, p, p) - for(i in 1:(p - 1)) for(j in (i + 1):p) { - Gxx_mgm[i, j] = Gxx_mgm[j, i] = mean(G_array[, i, j]) - } - Gyy_mgm = matrix(0, q, q) - if(q > 1) { - for(i in 1:(q - 1)) for(j in (i + 1):q) { - Gyy_mgm[i, j] = Gyy_mgm[j, i] = mean(G_array[, p + i, p + j]) - } - } - Gxy_mgm = matrix(0, p, q) - for(i in 1:p) for(j in 1:q) { - Gxy_mgm[i, j] = mean(G_array[, i, p + j]) - } - - # Both should agree on which edges to include/exclude - # (directional agreement: both high for true edges, both low for null) - all_bgms = c(pips_bgms$Gxx[upper.tri(pips_bgms$Gxx)], - pips_bgms$Gyy[upper.tri(pips_bgms$Gyy)], - as.vector(pips_bgms$Gxy)) - all_mgm = c(Gxx_mgm[upper.tri(Gxx_mgm)], - Gyy_mgm[upper.tri(Gyy_mgm)], - as.vector(Gxy_mgm)) - - # Correlation of PIPs should be positive - expect_gt(cor(all_bgms, all_mgm), 0.5, - label = "PIP correlation bgms vs mixedGM > 0.5") - - # True structure agreement: same edges classified as > 0.5 - bgms_selected = all_bgms > 0.5 - mgm_selected = all_mgm > 0.5 - agreement = mean(bgms_selected == mgm_selected) - expect_gt(agreement, 0.6, label = "Structure agreement > 60%") -}) - - -# =========================================================================== -# Test 4: Edge-gating prevents parameter drift on excluded edges -# =========================================================================== -test_that("excluded edges have zero parameters after edge selection", { - skip_on_cran() - - p = 3L; q = 2L; n = 500L - num_cats_mgm = rep(3L, p) - num_cats_bgms = rep(2L, p) - - # Fully sparse graph: no edges in true model - set.seed(456) - sim = mixedGM::mixed_gibbs_generate( - n = n, num_categories = num_cats_mgm, - mux = matrix(c(-0.5, 0.3, -0.2, -1.0, -0.8, -0.6), nrow = p), - Kxx = matrix(0, p, p), - muy = c(0.5, -0.3), Kyy = diag(q), - Kxy = matrix(0, p, q), - n_burnin = 3000L - ) - - x = sim$x - y = sim$y - pq = p + q - - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, TRUE, "conditional", - 2000L, 3000L, 42L - ) - - pips = extract_pip(bgms_out$indicator_samples, p, q) - - # With a fully null graph and n = 500, all PIPs should be low - expect_lt(max(pips$Gxx[upper.tri(pips$Gxx)]), 0.8, - label = "Max Kxx PIP < 0.8 for null graph") - expect_lt(max(as.vector(pips$Gxy)), 0.8, - label = "Max Kxy PIP < 0.8 for null graph") -}) diff --git a/tests/testthat/test-mixed-mrf-likelihoods.R b/tests/testthat/test-mixed-mrf-likelihoods.R deleted file mode 100644 index 8f4e7c44..00000000 --- a/tests/testthat/test-mixed-mrf-likelihoods.R +++ /dev/null @@ -1,549 +0,0 @@ -# ============================================================================= -# test-mixed-mrf-likelihoods.R — Phase B.1 likelihood tests -# ============================================================================= -# Tests for log_conditional_omrf() and log_conditional_ggm() in the -# MixedMRFModel, validated against pure-R reference implementations. - -# ------------------------------------------------------------------ -# R reference: conditional OMRF pseudolikelihood for variable s -# ------------------------------------------------------------------ -# Computes log f(x_s | x_{-s}, y) summed over n observations. -# -# @param x_int n x p integer matrix (0-based categories) -# @param y n x q continuous matrix -# @param Kxx p x p symmetric, zero diagonal -# @param Kxy p x q cross-interactions -# @param mux p x max_cats thresholds / BC coefficients -# @param num_cats p-vector of category counts -# @param is_ordinal p-vector (1 = ordinal, 0 = BC) -# @param baseline_cat p-vector of reference categories -# @param s 0-based variable index -# -# Returns: scalar log-likelihood. -ref_log_conditional_omrf = function(x_int, y, Kxx, Kxy, mux, num_cats, - is_ordinal, baseline_cat, s) { - n = nrow(x_int) - s1 = s + 1L # R indexing - - # Center BC observations (same as constructor) - x = x_int - for(j in seq_len(ncol(x))) { - if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] - } - x_dbl = matrix(as.double(x), nrow = n) - - # Rest score - rest = x_dbl %*% Kxx[, s1] - x_dbl[, s1] * Kxx[s1, s1] + - 2.0 * y %*% t(Kxy[s1, , drop = FALSE]) - rest = as.numeric(rest) - - C_s = num_cats[s1] - - if(is_ordinal[s1]) { - # Numerator: dot(x_s, rest) + sum_c count_c * mux(s, c) - numer = sum(x_dbl[, s1] * rest) - for(c in seq_len(C_s)) { - count_c = sum(x[, s1] == c) - numer = numer + count_c * mux[s1, c] - } - # Log-normalizer per person (log-sum-exp stabilized) - log_Z = numeric(n) - for(v in seq_len(n)) { - terms = numeric(C_s + 1) - terms[1] = 0 # reference category - for(c in seq_len(C_s)) { - terms[c + 1] = mux[s1, c] + c * rest[v] - } - mx = max(terms) - log_Z[v] = mx + log(sum(exp(terms - mx))) - } - return(numer - sum(log_Z)) - } else { - # Blume-Capel - alpha = mux[s1, 1] - beta = mux[s1, 2] - ref = baseline_cat[s1] - - numer = sum(x_dbl[, s1] * rest) + - alpha * sum(x[, s1]) + beta * sum(x[, s1]^2) - - log_Z = numeric(n) - for(v in seq_len(n)) { - cats = 0:C_s - centered = cats - ref - theta = alpha * centered + beta * centered^2 - terms = theta + centered * rest[v] - mx = max(terms) - log_Z[v] = mx + log(sum(exp(terms - mx))) - } - return(numer - sum(log_Z)) - } -} - -# ------------------------------------------------------------------ -# R reference: conditional GGM log-likelihood -# ------------------------------------------------------------------ -# Computes log f(y | x) using conditional mean and precision Kyy. -# -# @param x_int n x p integer matrix (0-based) -# @param y n x q continuous matrix -# @param Kxy p x q cross-interactions -# @param Kyy q x q SPD precision matrix -# @param muy q-vector of means -# @param is_ordinal p-vector -# @param baseline_cat p-vector -# -# Returns: scalar log-likelihood. -ref_log_conditional_ggm = function(x_int, y, Kxy, Kyy, muy, - is_ordinal, baseline_cat) { - n = nrow(y) - q = ncol(y) - - # Center BC observations - x = x_int - for(j in seq_len(ncol(x))) { - if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] - } - x_dbl = matrix(as.double(x), nrow = n) - - Kyy_inv = solve(Kyy) - logdet_val = as.numeric(determinant(Kyy, logarithm = TRUE)$modulus) - - # Conditional mean: repmat(muy', n, 1) + 2 * x_dbl * Kxy * Kyy_inv - cond_mean = matrix(rep(muy, each = n), nrow = n) + - 2.0 * x_dbl %*% Kxy %*% Kyy_inv - - D = y - cond_mean - quad_sum = sum((D %*% Kyy) * D) - - ll = n / 2.0 * (-q * log(2 * pi) + logdet_val) - quad_sum / 2.0 - return(ll) -} - - -# ------------------------------------------------------------------ -# Helper to build a zero parameter vector with correct structure -# ------------------------------------------------------------------ -build_param_vec = function(p, q, num_cats, is_ordinal) { - num_main = 0L - for(s in seq_len(p)) { - if(is_ordinal[s]) { - num_main = num_main + num_cats[s] - } else { - num_main = num_main + 2L - } - } - num_pairwise_xx = p * (p - 1L) / 2L - num_kyy = q * (q + 1L) / 2L - num_cross = p * q - total = num_main + num_pairwise_xx + q + num_kyy + num_cross - list( - total = total, - num_main = num_main, - num_pairwise_xx = num_pairwise_xx, - q = q, - num_kyy = num_kyy, - num_cross = num_cross, - kyy_start = num_main + num_pairwise_xx + q # 0-based start of Kyy block - ) -} - - -# ------------------------------------------------------------------ -# Test setup shared across tests -# ------------------------------------------------------------------ -make_test_data = function() { - set.seed(42) - n = 10L; p = 3L; q = 2L - num_cats = c(2L, 3L, 2L) - is_ordinal = c(1L, 1L, 0L) # vars 1,2 ordinal; var 3 BC - baseline_cat = c(0L, 0L, 1L) # BC var has ref = 1 - - x = matrix(0L, n, p) - x[, 1] = sample(0:2, n, replace = TRUE) - x[, 2] = sample(0:3, n, replace = TRUE) - x[, 3] = sample(0:2, n, replace = TRUE) # original BC obs in [0, C_s] - y = matrix(rnorm(n * q), n, q) - - pq = p + q - inc_prob = matrix(0.5, pq, pq) - edge_ind = matrix(1L, pq, pq) - diag(edge_ind) = 0L - - list( - n = n, p = p, q = q, - x = x, y = y, - num_cats = num_cats, - is_ordinal = as.integer(is_ordinal), - baseline_cat = baseline_cat, - inc_prob = inc_prob, - edge_ind = edge_ind - ) -} - - -# ============================================================================== -# Tests -# ============================================================================== - -test_that("log_conditional_omrf at zero parameters equals -n*log(C+1)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - # Kyy = identity - idx = info$kyy_start - for(i in seq_len(d$q)) { - for(j in i:d$q) { - idx = idx + 1L - if(i == j) params[idx] = 1.0 - } - } - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L - ) - - # Ordinal vars: expected = -n * log(C_s + 1) - expect_equal(res$omrf_ll[1], -d$n * log(d$num_cats[1] + 1), tolerance = 1e-10) - expect_equal(res$omrf_ll[2], -d$n * log(d$num_cats[2] + 1), tolerance = 1e-10) - - # BC var: at zero params, all categories have theta = 0, rest = 0 - # so Z = num_cats + 1, numer = 0 => ll = -n * log(C+1) - expect_equal(res$omrf_ll[3], -d$n * log(d$num_cats[3] + 1), tolerance = 1e-10) -}) - - -test_that("log_conditional_ggm at zero parameters equals standard normal", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - idx = info$kyy_start - for(i in seq_len(d$q)) { - for(j in i:d$q) { - idx = idx + 1L - if(i == j) params[idx] = 1.0 - } - } - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L - ) - - # At zero params: y ~ N(0, I), so ll = sum(dnorm(y, log = TRUE)) - expected = sum(dnorm(d$y, log = TRUE)) - expect_equal(res$ggm_ll, expected, tolerance = 1e-10) -}) - - -test_that("log_conditional_omrf matches R reference (ordinal, nonzero params)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - # Set some nonzero main effects - params[1] = 0.3; params[2] = -0.2 # var 1 thresholds (C=2) - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 # var 2 thresholds (C=3) - params[6] = 0.5; params[7] = -0.3 # var 3 BC alpha, beta - - # Set some Kxx edges (upper-tri, row-major: (0,1), (0,2), (1,2)) - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 # Kxx(0,1) - params[kxx_start + 2] = -0.1 # Kxx(0,2) - params[kxx_start + 3] = 0.15 # Kxx(1,2) - - # muy - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - params[muy_start + 2] = -0.2 - - # Kyy = SPD (2x2 with positive eigenvalues) - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 # Kyy(0,0) - params[kyy_start + 2] = 0.3 # Kyy(0,1) - params[kyy_start + 3] = 1.5 # Kyy(1,1) - - # Kxy (p x q, row-major) - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.1 # Kxy(0,0) - params[kxy_start + 2] = -0.05 # Kxy(0,1) - params[kxy_start + 3] = 0.08 # Kxy(1,0) - params[kxy_start + 4] = 0.12 # Kxy(1,1) - params[kxy_start + 5] = -0.07 # Kxy(2,0) - params[kxy_start + 6] = 0.04 # Kxy(2,1) - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L - ) - - # Reconstruct parameter matrices for R reference - mux = matrix(0, d$p, max(d$num_cats)) - mux[1, 1:2] = c(0.3, -0.2) - mux[2, 1:3] = c(0.1, 0.4, -0.1) - mux[3, 1:2] = c(0.5, -0.3) - - Kxx = matrix(0, d$p, d$p) - Kxx[1, 2] = Kxx[2, 1] = 0.2 - Kxx[1, 3] = Kxx[3, 1] = -0.1 - Kxx[2, 3] = Kxx[3, 2] = 0.15 - - Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) - muy = c(0.1, -0.2) - - # Check each ordinal variable against R reference - for(s in 0:1) { - expected = ref_log_conditional_omrf( - d$x, d$y, Kxx, Kxy, mux, d$num_cats, - d$is_ordinal, d$baseline_cat, s - ) - expect_equal(res$omrf_ll[s + 1], expected, tolerance = 1e-8, - label = paste0("ordinal var ", s)) - } -}) - - -test_that("log_conditional_omrf matches R reference (Blume-Capel, nonzero params)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - # Same params as ordinal test - params[1] = 0.3; params[2] = -0.2 - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 - params[6] = 0.5; params[7] = -0.3 - - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 - params[kxx_start + 2] = -0.1 - params[kxx_start + 3] = 0.15 - - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - params[muy_start + 2] = -0.2 - - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.1 - params[kxy_start + 2] = -0.05 - params[kxy_start + 3] = 0.08 - params[kxy_start + 4] = 0.12 - params[kxy_start + 5] = -0.07 - params[kxy_start + 6] = 0.04 - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L - ) - - mux = matrix(0, d$p, max(d$num_cats)) - mux[1, 1:2] = c(0.3, -0.2) - mux[2, 1:3] = c(0.1, 0.4, -0.1) - mux[3, 1:2] = c(0.5, -0.3) - - Kxx = matrix(0, d$p, d$p) - Kxx[1, 2] = Kxx[2, 1] = 0.2 - Kxx[1, 3] = Kxx[3, 1] = -0.1 - Kxx[2, 3] = Kxx[3, 2] = 0.15 - - Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) - - # Test BC variable (s = 2, 0-based) - expected = ref_log_conditional_omrf( - d$x, d$y, Kxx, Kxy, mux, d$num_cats, - d$is_ordinal, d$baseline_cat, s = 2 - ) - expect_equal(res$omrf_ll[3], expected, tolerance = 1e-8) -}) - - -test_that("log_conditional_ggm matches R reference (nonzero params)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - # Set same params - params[1] = 0.3; params[2] = -0.2 - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 - params[6] = 0.5; params[7] = -0.3 - - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 - params[kxx_start + 2] = -0.1 - params[kxx_start + 3] = 0.15 - - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - params[muy_start + 2] = -0.2 - - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.1 - params[kxy_start + 2] = -0.05 - params[kxy_start + 3] = 0.08 - params[kxy_start + 4] = 0.12 - params[kxy_start + 5] = -0.07 - params[kxy_start + 6] = 0.04 - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params, 1L - ) - - Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), 2, 2) - Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) - muy = c(0.1, -0.2) - - expected = ref_log_conditional_ggm( - d$x, d$y, Kxy, Kyy, muy, d$is_ordinal, d$baseline_cat - ) - expect_equal(res$ggm_ll, expected, tolerance = 1e-8) -}) - - -test_that("log_conditional_ggm invariant to Kxx changes", { - # GGM likelihood depends on Kyy, Kxy, muy but not Kxx - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params1 = rep(0, info$total) - params2 = rep(0, info$total) - - # Both: same Kyy = SPD, same Kxy, same muy - kyy_start = info$kyy_start - for(params in list(params1, params2)) { - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - } - # But different Kxx - kxx_start = info$num_main - params1[kxx_start + 1] = 0.5 - params2[kxx_start + 1] = -0.3 - - # Need to re-assign since list() copies - params1[kyy_start + 1] = 2.0 - params1[kyy_start + 2] = 0.3 - params1[kyy_start + 3] = 1.5 - params2[kyy_start + 1] = 2.0 - params2[kyy_start + 2] = 0.3 - params2[kyy_start + 3] = 1.5 - - res1 = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params1, 1L - ) - res2 = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "conditional", params2, 1L - ) - - # GGM likelihood should be identical regardless of Kxx - expect_equal(res1$ggm_ll, res2$ggm_ll, tolerance = 1e-12) -}) - - -test_that("likelihood with p=1 ordinal, q=1 continuous works", { - set.seed(99) - n = 5L; p = 1L; q = 1L - x = matrix(sample(0:1, n, replace = TRUE), n, p) - y = matrix(rnorm(n), n, q) - num_cats = 1L - is_ordinal = 1L - baseline_cat = 0L - pq = p + q - inc_prob = matrix(0.5, pq, pq) - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - # Params: 1 threshold + 0 Kxx + 1 muy + 1 Kyy + 1 Kxy = 4 - params = c(0.5, # mux(0,0) = threshold - 0.2, # muy - 1.5, # Kyy(0,0) - 0.1) # Kxy(0,0) - - res = bgms:::test_mixed_mrf_likelihoods( - x, y, num_cats, is_ordinal, baseline_cat, - inc_prob, edge_ind, FALSE, "conditional", params, 1L - ) - - # R reference - mux = matrix(0.5, 1, 1) - Kxx = matrix(0, 1, 1) - Kxy = matrix(0.1, 1, 1) - Kyy = matrix(1.5, 1, 1) - muy = 0.2 - - expected_omrf = ref_log_conditional_omrf( - x, y, Kxx, Kxy, mux, num_cats, is_ordinal, baseline_cat, s = 0 - ) - expected_ggm = ref_log_conditional_ggm( - x, y, Kxy, Kyy, muy, is_ordinal, baseline_cat - ) - - expect_equal(res$omrf_ll[1], expected_omrf, tolerance = 1e-10) - expect_equal(res$ggm_ll, expected_ggm, tolerance = 1e-10) -}) - - -test_that("all-Blume-Capel discrete variables work", { - set.seed(77) - n = 8L; p = 2L; q = 1L - num_cats = c(3L, 4L) - is_ordinal = c(0L, 0L) - baseline_cat = c(1L, 2L) - - x = matrix(0L, n, p) - x[, 1] = sample(0:3, n, replace = TRUE) - x[, 2] = sample(0:4, n, replace = TRUE) - y = matrix(rnorm(n), n, q) - - pq = p + q - inc_prob = matrix(0.5, pq, pq) - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - # Params: 2 BC + 2 BC + 1 Kxx + 1 muy + 1 Kyy + 2 Kxy = 9 - # num_main = 4, num_pairwise_xx = 1, q = 1, num_kyy = 1, num_cross = 2 - params = c(0.3, -0.1, # BC var 0: alpha, beta - 0.2, -0.05, # BC var 1: alpha, beta - 0.15, # Kxx(0,1) - -0.1, # muy - 2.0, # Kyy - 0.08, -0.06) # Kxy - - res = bgms:::test_mixed_mrf_likelihoods( - x, y, num_cats, is_ordinal, baseline_cat, - inc_prob, edge_ind, FALSE, "conditional", params, 1L - ) - - mux = matrix(0, 2, 4) - mux[1, 1:2] = c(0.3, -0.1) - mux[2, 1:2] = c(0.2, -0.05) - - Kxx = matrix(0, 2, 2) - Kxx[1, 2] = Kxx[2, 1] = 0.15 - - Kxy = matrix(c(0.08, -0.06), nrow = 2, ncol = 1) - Kyy = matrix(2.0, 1, 1) - muy = -0.1 - - for(s in 0:1) { - expected = ref_log_conditional_omrf( - x, y, Kxx, Kxy, mux, num_cats, is_ordinal, baseline_cat, s - ) - expect_equal(res$omrf_ll[s + 1], expected, tolerance = 1e-8, - label = paste0("BC var ", s)) - } - - expected_ggm = ref_log_conditional_ggm( - x, y, Kxy, Kyy, muy, is_ordinal, baseline_cat - ) - expect_equal(res$ggm_ll, expected_ggm, tolerance = 1e-8) -}) diff --git a/tests/testthat/test-mixed-mrf-marginal.R b/tests/testthat/test-mixed-mrf-marginal.R deleted file mode 100644 index 4ceac822..00000000 --- a/tests/testthat/test-mixed-mrf-marginal.R +++ /dev/null @@ -1,527 +0,0 @@ -# ============================================================================= -# test-mixed-mrf-marginal.R — Phase C marginal pseudo-likelihood tests -# ============================================================================= -# Tests for log_marginal_omrf() and marginal-mode sampler, validated against -# pure-R reference implementations and cross-package comparison with mixedGM. - -# ------------------------------------------------------------------ -# R reference: marginal OMRF pseudolikelihood for variable s -# ------------------------------------------------------------------ -# Computes log f(x_s | x_{-s}) using Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' -# -# @param x_int n x p integer matrix (0-based categories) -# @param Theta p x p marginal interaction matrix -# @param Kxy p x q cross-interactions -# @param mux p x max_cats thresholds / BC coefficients -# @param muy q-vector of continuous means -# @param num_cats p-vector of category counts -# @param is_ordinal p-vector (1 = ordinal, 0 = BC) -# @param baseline_cat p-vector of reference categories -# @param s 0-based variable index -# -# Returns: scalar log-likelihood. -ref_log_marginal_omrf = function(x_int, Theta, Kxy, mux, muy, num_cats, - is_ordinal, baseline_cat, s) { - n = nrow(x_int) - s1 = s + 1L - - # Center BC observations - x = x_int - for(j in seq_len(ncol(x))) { - if(!is_ordinal[j]) x[, j] = x[, j] - baseline_cat[j] - } - x_dbl = matrix(as.double(x), nrow = n) - - theta_ss = Theta[s1, s1] - - # Rest score: Theta-based + Kxy*muy bias - rest = x_dbl %*% Theta[, s1] - x_dbl[, s1] * theta_ss + - 2.0 * sum(Kxy[s1, ] * muy) - rest = as.numeric(rest) - - C_s = num_cats[s1] - - if(is_ordinal[s1]) { - # Numerator: dot(x_s, rest) + theta_ss * dot(x_s, x_s) + sum(count_c * mux) - numer = sum(x_dbl[, s1] * rest) + - theta_ss * sum(x_dbl[, s1]^2) - for(c in seq_len(C_s)) { - count_c = sum(x[, s1] == c) - numer = numer + count_c * mux[s1, c] - } - - # Denominator with col_offset = mux + c^2 * theta_ss - log_Z = numeric(n) - for(v in seq_len(n)) { - terms = numeric(C_s + 1) - terms[1] = 0 # reference category (c=0) - for(c in seq_len(C_s)) { - terms[c + 1] = mux[s1, c] + c^2 * theta_ss + c * rest[v] - } - mx = max(terms) - log_Z[v] = mx + log(sum(exp(terms - mx))) - } - return(numer - sum(log_Z)) - } else { - # Blume-Capel: alpha * sum(x) + beta * sum(x^2) - alpha = mux[s1, 1] - beta = mux[s1, 2] - ref = baseline_cat[s1] - - numer = sum(x_dbl[, s1] * rest) + - theta_ss * sum(x_dbl[, s1]^2) + - alpha * sum(x[, s1]) + beta * sum(x[, s1]^2) - - # Effective beta includes theta_ss - eff_beta = beta + theta_ss - - log_Z = numeric(n) - for(v in seq_len(n)) { - cats = 0:C_s - centered = cats - ref - theta = alpha * centered + eff_beta * centered^2 - terms = theta + centered * rest[v] - mx = max(terms) - log_Z[v] = mx + log(sum(exp(terms - mx))) - } - return(numer - sum(log_Z)) - } -} - - -# ------------------------------------------------------------------ -# Test data setup (reuse from likelihood tests) -# ------------------------------------------------------------------ -make_test_data = function() { - set.seed(42) - n = 10L; p = 3L; q = 2L - num_cats = c(2L, 3L, 2L) - is_ordinal = c(1L, 1L, 0L) - baseline_cat = c(0L, 0L, 1L) - - x = matrix(0L, n, p) - x[, 1] = sample(0:2, n, replace = TRUE) - x[, 2] = sample(0:3, n, replace = TRUE) - x[, 3] = sample(0:2, n, replace = TRUE) - y = matrix(rnorm(n * q), n, q) - - pq = p + q - inc_prob = matrix(0.5, pq, pq) - edge_ind = matrix(1L, pq, pq) - diag(edge_ind) = 0L - - list( - n = n, p = p, q = q, - x = x, y = y, - num_cats = num_cats, - is_ordinal = as.integer(is_ordinal), - baseline_cat = baseline_cat, - inc_prob = inc_prob, - edge_ind = edge_ind - ) -} - -build_param_vec = function(p, q, num_cats, is_ordinal) { - num_main = 0L - for(s in seq_len(p)) { - if(is_ordinal[s]) { - num_main = num_main + num_cats[s] - } else { - num_main = num_main + 2L - } - } - num_pairwise_xx = p * (p - 1L) / 2L - num_kyy = q * (q + 1L) / 2L - num_cross = p * q - total = num_main + num_pairwise_xx + q + num_kyy + num_cross - list( - total = total, - num_main = num_main, - num_pairwise_xx = num_pairwise_xx, - q = q, - num_kyy = num_kyy, - num_cross = num_cross, - kyy_start = num_main + num_pairwise_xx + q - ) -} - - -# ============================================================================== -# Test: marginal OMRF at zero params equals conditional OMRF -# ============================================================================== - -test_that("log_marginal_omrf at zero params equals log_conditional_omrf", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - # Kyy = identity - idx = info$kyy_start - for(i in seq_len(d$q)) { - for(j in i:d$q) { - idx = idx + 1L - if(i == j) params[idx] = 1.0 - } - } - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L - ) - - # With Kxy = 0 and Kyy = I, Theta = Kxx + 0 = Kxx and bias = 0, - # so marginal OMRF = conditional OMRF - for(s in seq_len(d$p)) { - expect_equal(res$marg_omrf_ll[s], res$omrf_ll[s], tolerance = 1e-10, - label = paste0("var ", s - 1, " marginal == conditional at zero")) - } -}) - - -# ============================================================================== -# Test: marginal OMRF matches R reference (ordinal, nonzero params) -# ============================================================================== - -test_that("log_marginal_omrf matches R reference (ordinal, nonzero params)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - # Main effects - params[1] = 0.3; params[2] = -0.2 - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 - params[6] = 0.5; params[7] = -0.3 - - # Kxx edges - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 - params[kxx_start + 2] = -0.1 - params[kxx_start + 3] = 0.15 - - # muy - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - params[muy_start + 2] = -0.2 - - # Kyy = SPD - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - - # Kxy - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.1 - params[kxy_start + 2] = -0.05 - params[kxy_start + 3] = 0.08 - params[kxy_start + 4] = 0.12 - params[kxy_start + 5] = -0.07 - params[kxy_start + 6] = 0.04 - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L - ) - - # Build R reference matrices - mux = matrix(0, d$p, max(d$num_cats)) - mux[1, 1:2] = c(0.3, -0.2) - mux[2, 1:3] = c(0.1, 0.4, -0.1) - mux[3, 1:2] = c(0.5, -0.3) - - Kxx = matrix(0, d$p, d$p) - Kxx[1, 2] = Kxx[2, 1] = 0.2 - Kxx[1, 3] = Kxx[3, 1] = -0.1 - Kxx[2, 3] = Kxx[3, 2] = 0.15 - - Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) - Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), d$q, d$q) - muy = c(0.1, -0.2) - - # Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' - Theta = Kxx + 2 * Kxy %*% solve(Kyy) %*% t(Kxy) - - # Check ordinal variables - for(s in 0:1) { - expected = ref_log_marginal_omrf( - d$x, Theta, Kxy, mux, muy, d$num_cats, - d$is_ordinal, d$baseline_cat, s - ) - expect_equal(res$marg_omrf_ll[s + 1], expected, tolerance = 1e-8, - label = paste0("ordinal var ", s)) - } -}) - - -# ============================================================================== -# Test: marginal OMRF matches R reference (Blume-Capel) -# ============================================================================== - -test_that("log_marginal_omrf matches R reference (Blume-Capel, nonzero params)", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - params[1] = 0.3; params[2] = -0.2 - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 - params[6] = 0.5; params[7] = -0.3 - - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 - params[kxx_start + 2] = -0.1 - params[kxx_start + 3] = 0.15 - - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - params[muy_start + 2] = -0.2 - - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.1 - params[kxy_start + 2] = -0.05 - params[kxy_start + 3] = 0.08 - params[kxy_start + 4] = 0.12 - params[kxy_start + 5] = -0.07 - params[kxy_start + 6] = 0.04 - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L - ) - - mux = matrix(0, d$p, max(d$num_cats)) - mux[1, 1:2] = c(0.3, -0.2) - mux[2, 1:3] = c(0.1, 0.4, -0.1) - mux[3, 1:2] = c(0.5, -0.3) - - Kxx = matrix(0, d$p, d$p) - Kxx[1, 2] = Kxx[2, 1] = 0.2 - Kxx[1, 3] = Kxx[3, 1] = -0.1 - Kxx[2, 3] = Kxx[3, 2] = 0.15 - - Kxy = matrix(c(0.1, 0.08, -0.07, -0.05, 0.12, 0.04), nrow = d$p, ncol = d$q) - Kyy = matrix(c(2.0, 0.3, 0.3, 1.5), d$q, d$q) - muy = c(0.1, -0.2) - - Theta = Kxx + 2 * Kxy %*% solve(Kyy) %*% t(Kxy) - - # Test BC variable (s = 2, 0-based) - expected = ref_log_marginal_omrf( - d$x, Theta, Kxy, mux, muy, d$num_cats, - d$is_ordinal, d$baseline_cat, s = 2 - ) - expect_equal(res$marg_omrf_ll[3], expected, tolerance = 1e-8) -}) - - -# ============================================================================== -# Test: marginal OMRF differs from conditional when Kxy != 0 -# ============================================================================== - -test_that("log_marginal_omrf differs from log_conditional_omrf with nonzero Kxy", { - d = make_test_data() - info = build_param_vec(d$p, d$q, d$num_cats, d$is_ordinal) - params = rep(0, info$total) - - params[1] = 0.3; params[2] = -0.2 - params[3] = 0.1; params[4] = 0.4; params[5] = -0.1 - params[6] = 0.5; params[7] = -0.3 - - kxx_start = info$num_main - params[kxx_start + 1] = 0.2 - - muy_start = info$num_main + info$num_pairwise_xx - params[muy_start + 1] = 0.1 - - kyy_start = info$kyy_start - params[kyy_start + 1] = 2.0 - params[kyy_start + 2] = 0.3 - params[kyy_start + 3] = 1.5 - - # Nonzero Kxy makes marginal != conditional - kxy_start = kyy_start + info$num_kyy - params[kxy_start + 1] = 0.3 - params[kxy_start + 2] = -0.2 - - res = bgms:::test_mixed_mrf_likelihoods( - d$x, d$y, d$num_cats, as.integer(d$is_ordinal), d$baseline_cat, - d$inc_prob, d$edge_ind, FALSE, "marginal", params, 1L - ) - - # At least one variable should differ - diffs = abs(res$marg_omrf_ll - res$omrf_ll) - expect_true(max(diffs) > 0.01, - label = "marginal and conditional OMRF differ with nonzero Kxy") -}) - - -# ============================================================================== -# Helper: extract parameter matrices from bgms sample matrix -# ============================================================================== -# (Same as in test-mixed-mrf-sampling.R; duplicated here so marginal tests -# are self-contained.) -extract_bgms_estimates = function(samples, p, q, num_cats_bgms) { - S = colMeans(samples) - idx = 1L - max_cat = max(num_cats_bgms) - mux = matrix(0, p, max_cat) - for(s in 1:p) { - for(c in seq_len(num_cats_bgms[s])) { - mux[s, c] = S[idx]; idx = idx + 1L - } - } - Kxx = matrix(0, p, p) - for(i in 1:(p - 1)) for(j in (i + 1):p) { - Kxx[i, j] = Kxx[j, i] = S[idx]; idx = idx + 1L - } - muy = S[idx:(idx + q - 1)]; idx = idx + q - Kyy = matrix(0, q, q) - for(i in 1:q) for(j in i:q) { - Kyy[i, j] = Kyy[j, i] = S[idx]; idx = idx + 1L - } - Kxy = matrix(S[idx:(idx + p * q - 1)], nrow = p, ncol = q, byrow = TRUE) - list(mux = mux, Kxx = Kxx, muy = muy, Kyy = Kyy, Kxy = Kxy) -} - - -# ============================================================================== -# Test: marginal mode sampler agrees with mixedGM (simulation) -# ============================================================================== - -test_that("marginal PL sampler agrees with mixedGM (ordinal simulation)", { - skip_on_cran() - skip_if_not_installed("mixedGM") - - p = 3L; q = 2L; n = 1000L - - Kxx_true = matrix(c(0, 0.4, -0.2, - 0.4, 0, 0.3, - -0.2, 0.3, 0), 3, 3) - Kxy_true = matrix(c(0.2, -0.1, 0.15, - 0.1, 0.3, -0.2), nrow = p, ncol = q) - Kyy_true = matrix(c(1.3, 0.2, 0.2, 1.1), 2, 2) - mux_true = matrix(c(0.5, -0.5, 0.3, - -0.3, -1.0, -0.5), nrow = p, ncol = 2) - muy_true = c(0.5, -0.3) - - set.seed(456) - sim = mixedGM::mixed_gibbs_generate( - n = n, Kxx = Kxx_true, Kxy = Kxy_true, Kyy = Kyy_true, - mux = mux_true, muy = muy_true, - num_categories = rep(3L, p), n_burnin = 1000 - ) - - # --- run mixedGM (marginal PL) --- - set.seed(42) - mgm = mixedGM::mixed_sampler( - x = sim$x, y = sim$y, num_categories = rep(3L, p), - n_warmup = 4000L, n_samples = 8000L, - edge_selection = FALSE, verbose = FALSE, - pseudolikelihood = "marginal" - ) - mgm_est = mgm$final_parameters - - # --- run bgms (marginal PL) --- - num_cats_bgms = rep(2L, p) - pq = p + q - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - sim$x, sim$y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, FALSE, "marginal", - 4000L, 8000L, 42L - ) - bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) - - # --- correlations bgms vs mixedGM (r >= 0.90) --- - kxx_ut = upper.tri(bgms_est$Kxx) - expect_gt( - cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.90, - label = "Kxx bgms-mgm correlation (marginal sim)" - ) - expect_gt( - cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.90, - label = "Kxy bgms-mgm correlation (marginal sim)" - ) - expect_gt( - cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.90, - label = "Kyy bgms-mgm correlation (marginal sim)" - ) - expect_gt( - cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.90, - label = "mux bgms-mgm correlation (marginal sim)" - ) -}) - - -# ============================================================================== -# Test: marginal mode sampler agrees with mixedGM on Wenchuan data -# ============================================================================== - -test_that("marginal PL sampler agrees with mixedGM on Wenchuan data", { - skip_on_cran() - skip_if_not_installed("mixedGM") - - data(Wenchuan, package = "bgms") - W = na.omit(Wenchuan) - - p = 4L; q = 2L - x = as.matrix(W[, 1:p]) - 1L # convert 1-5 to 0-4 - y = as.matrix(W[, (p + 1):(p + q)]) - - num_cats_mgm = rep(5L, p) # total categories for mixedGM - num_cats_bgms = rep(4L, p) # max category index for bgms - - # --- mixedGM (marginal PL) --- - set.seed(42) - mgm = mixedGM::mixed_sampler( - x = x, y = y, num_categories = num_cats_mgm, - n_warmup = 4000L, n_samples = 8000L, - edge_selection = FALSE, verbose = FALSE, - pseudolikelihood = "marginal" - ) - mgm_est = mgm$final_parameters - - # --- bgms (marginal PL) --- - pq = p + q - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, FALSE, "marginal", - 4000L, 8000L, 42L - ) - bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) - - # --- correlations bgms vs mixedGM (r >= 0.90) --- - kxx_ut = upper.tri(bgms_est$Kxx) - expect_gt( - cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.90, - label = "Kxx bgms-mgm correlation (marginal Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.85, - label = "Kxy bgms-mgm correlation (marginal Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.90, - label = "Kyy bgms-mgm correlation (marginal Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.90, - label = "mux bgms-mgm correlation (marginal Wenchuan)" - ) - - # --- Kxx sign patterns agree --- - expect_true( - all(sign(bgms_est$Kxx[kxx_ut]) == sign(mgm_est$Kxx[kxx_ut])), - label = "Kxx signs agree (marginal Wenchuan)" - ) -}) diff --git a/tests/testthat/test-mixed-mrf-sampling.R b/tests/testthat/test-mixed-mrf-sampling.R deleted file mode 100644 index 9a258492..00000000 --- a/tests/testthat/test-mixed-mrf-sampling.R +++ /dev/null @@ -1,224 +0,0 @@ -# ============================================================================= -# test-mixed-mrf-sampling.R — Phase B.5 sampler correctness tests -# ============================================================================= -# Validates that do_one_metropolis_step() in MixedMRFModel produces correct -# posterior samples by comparing bgms against the mixedGM reference sampler. -# -# Because no proposal adaptation is implemented yet (Phase F), acceptance -# rates are low with the default proposal SD = 1.0. Tests use correlation -# thresholds rather than absolute agreement. - -skip_if_not_installed("mixedGM") - -# --------------------------------------------------------------------------- -# Helper: extract parameter matrices from bgms sample matrix -# --------------------------------------------------------------------------- -# The vectorization order in bgms is: -# 1. mux: per-variable, C_s thresholds each (for ordinal) -# 2. Kxx: upper-triangular, row-major -# 3. muy: q means -# 4. Kyy: upper-triangle including diagonal -# 5. Kxy: p*q entries, row-major -extract_bgms_estimates = function(samples, p, q, num_cats_bgms) { - S = colMeans(samples) - idx = 1L - - # 1. mux (per-variable: C_s thresholds each) - max_cat = max(num_cats_bgms) - mux = matrix(0, p, max_cat) - for(s in 1:p) { - for(c in seq_len(num_cats_bgms[s])) { - mux[s, c] = S[idx]; idx = idx + 1L - } - } - - # 2. Kxx upper-tri - Kxx = matrix(0, p, p) - for(i in 1:(p - 1)) for(j in (i + 1):p) { - Kxx[i, j] = Kxx[j, i] = S[idx]; idx = idx + 1L - } - - # 3. muy - muy = S[idx:(idx + q - 1)]; idx = idx + q - - # 4. Kyy upper-tri + diag - Kyy = matrix(0, q, q) - for(i in 1:q) for(j in i:q) { - Kyy[i, j] = Kyy[j, i] = S[idx]; idx = idx + 1L - } - - # 5. Kxy row-major - Kxy = matrix(S[idx:(idx + p * q - 1)], nrow = p, ncol = q, byrow = TRUE) - - list(mux = mux, Kxx = Kxx, muy = muy, Kyy = Kyy, Kxy = Kxy) -} - - -# =========================================================================== -# Test 1: ordinal simulation recovery (3-category, p=3, q=2, n=1000) -# =========================================================================== -test_that("conditional PL sampler recovers parameters (ordinal simulation)", { - skip_on_cran() - - p = 3L; q = 2L; n = 1000L - - Kxx_true = matrix(c(0, 0.4, -0.2, - 0.4, 0, 0.3, - -0.2, 0.3, 0), 3, 3) - Kxy_true = matrix(c(0.2, -0.1, 0.15, - 0.1, 0.3, -0.2), nrow = p, ncol = q) - Kyy_true = matrix(c(1.3, 0.2, 0.2, 1.1), 2, 2) - mux_true = matrix(c(0.5, -0.5, 0.3, - -0.3, -1.0, -0.5), nrow = p, ncol = 2) - muy_true = c(0.5, -0.3) - - set.seed(456) - sim = mixedGM::mixed_gibbs_generate( - n = n, Kxx = Kxx_true, Kxy = Kxy_true, Kyy = Kyy_true, - mux = mux_true, muy = muy_true, - num_categories = rep(3L, p), n_burnin = 1000 - ) - - # --- run mixedGM (with Robbins-Monro adaptation) --- - set.seed(42) - mgm = mixedGM::mixed_sampler( - x = sim$x, y = sim$y, num_categories = rep(3L, p), - n_warmup = 4000L, n_samples = 8000L, - edge_selection = FALSE, verbose = FALSE, - pseudolikelihood = "conditional" - ) - mgm_est = mgm$final_parameters - - # --- run bgms (no adaptation) --- - num_cats_bgms = rep(2L, p) # max category index - pq = p + q - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - sim$x, sim$y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, FALSE, "conditional", - 4000L, 8000L, 42L - ) - bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) - - # --- correlations bgms vs mixedGM (r >= 0.95) --- - kxx_ut = upper.tri(bgms_est$Kxx) - expect_gt( - cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.95, - label = "Kxx bgms-mgm correlation" - ) - expect_gt( - cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.95, - label = "Kxy bgms-mgm correlation" - ) - expect_gt( - cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.95, - label = "Kyy bgms-mgm correlation" - ) - expect_gt( - cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.95, - label = "mux bgms-mgm correlation" - ) - - # --- signs agree with truth --- - expect_true( - all(sign(bgms_est$Kxx[kxx_ut]) == sign(Kxx_true[kxx_ut])), - label = "Kxx signs match truth" - ) -}) - - -# =========================================================================== -# Test 2: real data cross-validation (Wenchuan, ordinal + continuous) -# =========================================================================== -test_that("conditional PL sampler agrees with mixedGM on Wenchuan data", { - skip_on_cran() - - data(Wenchuan, package = "bgms") - W = na.omit(Wenchuan) - - p = 4L; q = 2L - x = as.matrix(W[, 1:p]) - 1L # convert 1-5 to 0-4 - y = as.matrix(W[, (p + 1):(p + q)]) - - num_cats_mgm = rep(5L, p) # total categories for mixedGM - num_cats_bgms = rep(4L, p) # max category index for bgms - - # --- mixedGM --- - set.seed(42) - mgm = mixedGM::mixed_sampler( - x = x, y = y, num_categories = num_cats_mgm, - n_warmup = 4000L, n_samples = 8000L, - edge_selection = FALSE, verbose = FALSE, - pseudolikelihood = "conditional" - ) - mgm_est = mgm$final_parameters - - # --- bgms --- - pq = p + q - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - bgms_out = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(num_cats_bgms), - as.integer(rep(1L, p)), rep(0L, p), - inc_prob, edge_ind, FALSE, "conditional", - 4000L, 8000L, 42L - ) - bgms_est = extract_bgms_estimates(bgms_out$samples, p, q, num_cats_bgms) - - # --- correlations bgms vs mixedGM (r >= 0.95) --- - kxx_ut = upper.tri(bgms_est$Kxx) - expect_gt( - cor(bgms_est$Kxx[kxx_ut], mgm_est$Kxx[kxx_ut]), 0.95, - label = "Kxx bgms-mgm correlation (Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$Kxy), as.vector(mgm_est$Kxy)), 0.95, - label = "Kxy bgms-mgm correlation (Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$Kyy), as.vector(mgm_est$Kyy)), 0.95, - label = "Kyy bgms-mgm correlation (Wenchuan)" - ) - expect_gt( - cor(as.vector(bgms_est$mux), as.vector(mgm_est$mux)), 0.95, - label = "mux bgms-mgm correlation (Wenchuan)" - ) - - # --- Kxx sign patterns agree --- - expect_true( - all(sign(bgms_est$Kxx[kxx_ut]) == sign(mgm_est$Kxx[kxx_ut])), - label = "Kxx signs agree (Wenchuan)" - ) -}) - - -# =========================================================================== -# Test 3: sampler does not crash on Kyy updates (c3 regression test) -# =========================================================================== -test_that("Kyy updates do not crash (c3 get_constants regression)", { - # Minimal setup: p=2, q=2 binary triggers the c3 code path - # where L(qm1,qm1)^2 must be included in the sum. - set.seed(99) - n = 50L; p = 2L; q = 2L - x = matrix(sample(0:1, n * p, replace = TRUE), n, p) - y = matrix(rnorm(n * q), n, q) - - pq = p + q - inc_prob = matrix(0.5, pq, pq); diag(inc_prob) = 0 - edge_ind = matrix(1L, pq, pq); diag(edge_ind) = 0L - - # If c3 bug is present, this crashes with "chol(): decomposition failed" - result = bgms:::test_mixed_mrf_sampler( - x, y, as.integer(c(1L, 1L)), - as.integer(c(1L, 1L)), c(0L, 0L), - inc_prob, edge_ind, FALSE, "conditional", - 100L, 100L, 123L - ) - - expect_equal(nrow(result$samples), 100L) - expect_true(all(is.finite(result$samples))) -}) diff --git a/tests/testthat/test-mixed-mrf-skeleton.R b/tests/testthat/test-mixed-mrf-skeleton.R deleted file mode 100644 index 0519cf67..00000000 --- a/tests/testthat/test-mixed-mrf-skeleton.R +++ /dev/null @@ -1,235 +0,0 @@ -# ============================================================================== -# Phase A.3: MixedMRFModel Skeleton Tests -# ============================================================================== -# -# Verifies that the MixedMRFModel C++ class compiles, links, and that -# parameter_dimension() and get/set_vectorized_parameters() round-trip -# correctly. Tests cover: -# -# 1. All-ordinal variables (p ordinal discrete + q continuous) -# 2. All-Blume-Capel variables -# 3. Mixed ordinal + Blume-Capel variables -# 4. Both conditional and marginal pseudolikelihood modes -# 5. Clone round-trip -# 6. Dimension arithmetic (num_variables, num_pairwise, indicator length) -# -# ============================================================================== - -# The helper-fixtures.R file loads bgms, but test_file() may skip it. -# Ensure the package is available: -if(!requireNamespace("bgms", quietly = TRUE)) { - skip("bgms package not installed") -} -test_mixed_mrf_skeleton = bgms:::test_mixed_mrf_skeleton - -# ---- Helper to build test inputs for a given scenario ---- -make_mixed_mrf_inputs = function(n, p, q, num_categories, is_ordinal, - baseline_category, edge_selection = FALSE, - pseudolikelihood = "conditional", - seed = 42L) { - set.seed(seed) - # Discrete observations: each column in 0..(num_categories[s]) - discrete_obs = matrix(0L, nrow = n, ncol = p) - for(s in seq_len(p)) { - discrete_obs[, s] = sample(0L:num_categories[s], n, replace = TRUE) - } - # Continuous observations - continuous_obs = matrix(rnorm(n * q), nrow = n, ncol = q) - - total = p + q - inclusion_prob = matrix(0.5, nrow = total, ncol = total) - diag(inclusion_prob) = 0 - edge_ind = matrix(1L, nrow = total, ncol = total) - diag(edge_ind) = 0L - - list( - discrete_observations = discrete_obs, - continuous_observations = continuous_obs, - num_categories = as.integer(num_categories), - is_ordinal_variable = as.integer(is_ordinal), - baseline_category = as.integer(baseline_category), - inclusion_probability = inclusion_prob, - initial_edge_indicators = edge_ind, - edge_selection = edge_selection, - pseudolikelihood = pseudolikelihood, - seed = seed - ) -} - -run_skeleton_test = function(inputs) { - do.call(test_mixed_mrf_skeleton, inputs) -} - -# ---- Expected dimension calculator (mirrors C++ logic) ---- -expected_full_dim = function(p, q, num_categories, is_ordinal) { - num_main = sum(ifelse(is_ordinal == 1L, num_categories, 2L)) - num_pairwise_xx = p * (p - 1) / 2 - num_pairwise_yy_with_diag = q * (q + 1) / 2 - num_cross = p * q - num_main + num_pairwise_xx + q + num_pairwise_yy_with_diag + num_cross -} - -expected_num_pairwise = function(p, q) { - p * (p - 1) / 2 + q * (q - 1) / 2 + p * q -} - -expected_indicator_length = function(p, q) { - expected_num_pairwise(p, q) -} - -# ============================================================================== -# Test scenarios -# ============================================================================== - -test_that("all-ordinal skeleton has correct dimensions", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$num_variables, p + q) - expect_equal(res$parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) - expect_equal(res$full_parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) - expect_equal(res$params_length, res$full_parameter_dimension) - expect_equal(res$num_pairwise, expected_num_pairwise(p, q)) - expect_equal(res$indicator_length, expected_indicator_length(p, q)) - expect_equal(res$edge_indicators_rows, p + q) - expect_equal(res$edge_indicators_cols, p + q) -}) - -test_that("all-Blume-Capel skeleton has correct dimensions", { - p = 3L; q = 2L; n = 20L - num_cats = c(4L, 3L, 4L) - is_ord = c(0L, 0L, 0L) - baseline = c(2L, 1L, 2L) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$num_variables, p + q) - # BC always contributes 2 per variable - expect_equal(res$parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) - expect_equal(res$full_parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) -}) - -test_that("mixed ordinal + BC skeleton has correct dimensions", { - p = 4L; q = 3L; n = 25L - num_cats = c(2L, 4L, 3L, 3L) - is_ord = c(1L, 0L, 1L, 0L) - baseline = c(0L, 2L, 0L, 1L) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$num_variables, p + q) - expect_equal(res$parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) -}) - -test_that("zero-parameter round-trip is exact", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$roundtrip_max_diff, 0.0) -}) - -test_that("non-trivial parameter round-trip is exact", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) -}) - -test_that("non-trivial round-trip with Blume-Capel variables", { - p = 4L; q = 3L; n = 25L - num_cats = c(2L, 4L, 3L, 3L) - is_ord = c(1L, 0L, 1L, 0L) - baseline = c(0L, 2L, 0L, 1L) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) -}) - -test_that("clone produces identical parameters", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - expect_equal(res$clone_max_diff, 0.0) -}) - -test_that("marginal pseudolikelihood mode works", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, - pseudolikelihood = "marginal") - res = run_skeleton_test(inp) - - expect_equal(res$parameter_dimension, - expected_full_dim(p, q, num_cats, is_ord)) - expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) -}) - -test_that("capability queries return correct values", { - p = 3L; q = 2L; n = 20L - num_cats = c(2L, 3L, 2L) - is_ord = c(1L, 1L, 1L) - baseline = rep(0L, p) - - inp_no_es = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, - edge_selection = FALSE) - res_no_es = run_skeleton_test(inp_no_es) - expect_false(res_no_es$has_edge_selection) - expect_true(res_no_es$has_adaptive_metropolis) - expect_false(res_no_es$has_gradient) - expect_false(res_no_es$has_missing_data) - - inp_es = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline, - edge_selection = TRUE) - res_es = run_skeleton_test(inp_es) - expect_true(res_es$has_edge_selection) -}) - -test_that("single discrete + single continuous works", { - p = 1L; q = 1L; n = 15L - num_cats = 2L - is_ord = 1L - baseline = 0L - - inp = make_mixed_mrf_inputs(n, p, q, num_cats, is_ord, baseline) - res = run_skeleton_test(inp) - - # p=1: 0 xx edges, q=1: 0 yy edges, 1 cross edge - expect_equal(res$num_variables, 2L) - expect_equal(res$num_pairwise, 1L) - expect_equal(res$indicator_length, 1L) - # mux: 2 thresholds, Kxx: 0, muy: 1, Kyy: 1 diag, Kxy: 1 - expect_equal(res$full_parameter_dimension, 2 + 0 + 1 + 1 + 1) - expect_equal(res$nontrivial_roundtrip_max_diff, 0.0) -}) From 7a3910fdb32c0be5b0b33e60435b626007383d45 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 00:27:52 +0100 Subject: [PATCH 16/60] feat: Robbins-Monro proposal-SD adaptation for MixedMRFModel (Phase F) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire iteration index through all 6 MH update functions and add per-parameter Robbins-Monro adaptation (weight = iter^{-0.75}, target = 0.44, clamp [0.001, 2.0]) during warmup: - update_main_effect, update_continuous_mean, update_Kxx - update_Kyy_offdiag, update_Kyy_diag, update_Kxy init_metropolis_adaptation stores total_warmup from WarmupSchedule. No changes needed to WarmupSchedule or ChainRunner — the existing Metropolis-only pipeline already handles MH models correctly. Also: add @param pseudolikelihood to bgm() roxygen (fixes codoc mismatch from Phase E). 3965 tests pass, 0 failures. --- R/bgm.R | 16 ++++++++ man/bgm.Rd | 17 ++++++++ src/models/mixed/mixed_mrf_metropolis.cpp | 48 ++++++++++++++++++++--- src/models/mixed/mixed_mrf_model.cpp | 26 ++++++------ src/models/mixed/mixed_mrf_model.h | 13 +++--- 5 files changed, 96 insertions(+), 24 deletions(-) diff --git a/R/bgm.R b/R/bgm.R index 53bde915..ebbd5f1f 100644 --- a/R/bgm.R +++ b/R/bgm.R @@ -212,6 +212,22 @@ #' score endpoints \eqn{(-b, m-b)}. #' Default: \code{FALSE}. #' +#' @param pseudolikelihood Character. Specifies the pseudo-likelihood +#' approximation used for mixed MRF models (ignored for pure ordinal or +#' pure continuous data). Options: +#' \describe{ +#' \item{\code{"conditional"}}{Conditions on the observed continuous +#' variables when computing the discrete full conditionals. Faster +#' because the discrete pseudo-likelihood does not depend on the +#' continuous precision matrix.} +#' \item{\code{"marginal"}}{Integrates out the continuous variables, +#' giving discrete full conditionals that account for induced +#' interactions through the continuous block. More expensive per +#' iteration but can improve estimation when discrete--continuous +#' coupling is strong.} +#' } +#' Default: \code{"conditional"}. +#' #' @param main_alpha,main_beta Double. Shape parameters of the #' beta-prime prior for threshold parameters. Must be positive. If equal, #' the prior is symmetric. Defaults: \code{main_alpha = 0.5} and diff --git a/man/bgm.Rd b/man/bgm.Rd index 92826f3e..3dbe3dc6 100644 --- a/man/bgm.Rd +++ b/man/bgm.Rd @@ -33,6 +33,7 @@ bgm( display_progress = c("per-chain", "total", "none"), seed = NULL, standardize = FALSE, + pseudolikelihood = c("conditional", "marginal"), verbose = getOption("bgms.verbose", TRUE), interaction_scale, burnin, @@ -166,6 +167,22 @@ raw score endpoints \eqn{(0, m)} and Blume-Capel variables use centered score endpoints \eqn{(-b, m-b)}. Default: \code{FALSE}.} +\item{pseudolikelihood}{Character. Specifies the pseudo-likelihood +approximation used for mixed MRF models (ignored for pure ordinal or +pure continuous data). Options: +\describe{ + \item{\code{"conditional"}}{Conditions on the observed continuous + variables when computing the discrete full conditionals. Faster + because the discrete pseudo-likelihood does not depend on the + continuous precision matrix.} + \item{\code{"marginal"}}{Integrates out the continuous variables, + giving discrete full conditionals that account for induced + interactions through the continuous block. More expensive per + iteration but can improve estimation when discrete--continuous + coupling is strong.} +} +Default: \code{"conditional"}.} + \item{verbose}{Logical. If \code{TRUE}, prints informational messages during data processing (e.g., missing data handling, variable recoding). Defaults to \code{getOption("bgms.verbose", TRUE)}. Set diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index ca7c6d9b..d60c0288 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -26,7 +26,7 @@ static double log_beta_prior(double x, double alpha, double beta) { // The accept/reject uses log_conditional_omrf(s) + beta-type prior. // ============================================================================= -void MixedMRFModel::update_main_effect(int s, int c) { +void MixedMRFModel::update_main_effect(int s, int c, int iteration) { double& current = mux_(s, c); double proposal_sd = prop_sd_mux_(s, c); @@ -47,6 +47,12 @@ void MixedMRFModel::update_main_effect(int s, int c) { if(std::log(runif(rng_)) >= ln_alpha) { current = current_val; // reject } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_mux_(s, c) = update_proposal_sd_with_robbins_monro( + prop_sd_mux_(s, c), ln_alpha, rm_weight, 0.44); + } } @@ -58,7 +64,7 @@ void MixedMRFModel::update_main_effect(int s, int c) { // Must save/restore conditional_mean_ around the proposal. // ============================================================================= -void MixedMRFModel::update_continuous_mean(int j) { +void MixedMRFModel::update_continuous_mean(int j, int iteration) { double current_val = muy_(j); double proposed = rnorm(rng_, current_val, prop_sd_muy_(j)); @@ -86,6 +92,12 @@ void MixedMRFModel::update_continuous_mean(int j) { muy_(j) = current_val; // reject conditional_mean_ = std::move(cond_mean_saved); } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_muy_(j) = update_proposal_sd_with_robbins_monro( + prop_sd_muy_(j), ln_alpha, rm_weight, 0.44); + } } @@ -97,7 +109,7 @@ void MixedMRFModel::update_continuous_mean(int j) { // Acceptance: log_conditional_omrf(i) + log_conditional_omrf(j) + Cauchy prior. // ============================================================================= -void MixedMRFModel::update_Kxx(int i, int j) { +void MixedMRFModel::update_Kxx(int i, int j, int iteration) { double current_val = Kxx_(i, j); double proposed = rnorm(rng_, current_val, prop_sd_Kxx_(i, j)); @@ -131,6 +143,12 @@ void MixedMRFModel::update_Kxx(int i, int j) { Kxx_(j, i) = current_val; if(use_marginal_pl_) recompute_Theta(); } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_Kxx_(i, j) = update_proposal_sd_with_robbins_monro( + prop_sd_Kxx_(i, j), ln_alpha, rm_weight, 0.44); + } } @@ -366,7 +384,7 @@ void MixedMRFModel::cholesky_update_after_kyy_diag(double old_ii, int i) { // Prior: Cauchy(0, pairwise_scale_) on off-diag, Gamma(1, 1) on diagonal. // ============================================================================= -void MixedMRFModel::update_Kyy_offdiag(int i, int j) { +void MixedMRFModel::update_Kyy_offdiag(int i, int j, int iteration) { get_kyy_constants(i, j); double phi_curr = kyy_constants_[0]; // Phi_q1q @@ -417,6 +435,12 @@ void MixedMRFModel::update_Kyy_offdiag(int i, int j) { recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_Kyy_(i, j) = update_proposal_sd_with_robbins_monro( + prop_sd_Kyy_(i, j), ln_alpha, rm_weight, 0.44); + } } @@ -429,7 +453,7 @@ void MixedMRFModel::update_Kyy_offdiag(int i, int j) { // Prior: Gamma(1, 1) on the diagonal element + Jacobian for log-scale proposal. // ============================================================================= -void MixedMRFModel::update_Kyy_diag(int i) { +void MixedMRFModel::update_Kyy_diag(int i, int iteration) { double logdet = cholesky_helpers::get_log_det(Kyy_chol_); double logdet_sub_ii = logdet + std::log(covariance_yy_(i, i)); @@ -473,6 +497,12 @@ void MixedMRFModel::update_Kyy_diag(int i) { recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_Kyy_(i, i) = update_proposal_sd_with_robbins_monro( + prop_sd_Kyy_(i, i), ln_alpha, rm_weight, 0.44); + } } @@ -484,7 +514,7 @@ void MixedMRFModel::update_Kyy_diag(int i) { // Must save/restore conditional_mean_ around the proposal. // ============================================================================= -void MixedMRFModel::update_Kxy(int i, int j) { +void MixedMRFModel::update_Kxy(int i, int j, int iteration) { double current_val = Kxy_(i, j); double proposed = rnorm(rng_, current_val, prop_sd_Kxy_(i, j)); @@ -522,6 +552,12 @@ void MixedMRFModel::update_Kxy(int i, int j) { conditional_mean_ = std::move(cond_mean_saved); if(use_marginal_pl_) Theta_ = std::move(Theta_saved); } + + if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_Kxy_(i, j) = update_proposal_sd_with_robbins_monro( + prop_sd_Kxy_(i, j), ln_alpha, rm_weight, 0.44); + } } diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index c1ddc812..38ef87e5 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -145,6 +145,7 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) prop_sd_Kxx_(other.prop_sd_Kxx_), prop_sd_Kyy_(other.prop_sd_Kyy_), prop_sd_Kxy_(other.prop_sd_Kxy_), + total_warmup_(other.total_warmup_), Kyy_chol_(other.Kyy_chol_), inv_cholesky_yy_(other.inv_cholesky_yy_), covariance_yy_(other.covariance_yy_), @@ -434,43 +435,43 @@ std::unique_ptr MixedMRFModel::clone() const { // Stubs (to be implemented in later phases) // ============================================================================= -void MixedMRFModel::do_one_metropolis_step(int /*iteration*/) { +void MixedMRFModel::do_one_metropolis_step(int iteration) { // Step 1: Update all main effects (ordinal thresholds or BC α/β) for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) - update_main_effect(s, c); + update_main_effect(s, c, iteration); } else { - update_main_effect(s, 0); // linear α - update_main_effect(s, 1); // quadratic β + update_main_effect(s, 0, iteration); // linear α + update_main_effect(s, 1, iteration); // quadratic β } } // Step 2: Update all continuous means for(size_t j = 0; j < q_; ++j) - update_continuous_mean(j); + update_continuous_mean(j, iteration); // Step 3: Update Kxx (upper triangle, edge-gated) for(size_t i = 0; i < p_ - 1; ++i) for(size_t j = i + 1; j < p_; ++j) if(!edge_selection_active_ || gxx(i, j) == 1) - update_Kxx(i, j); + update_Kxx(i, j, iteration); // Step 4: Update Kyy (off-diag + diagonal, edge-gated) if(q_ >= 2) { for(size_t i = 0; i < q_ - 1; ++i) for(size_t j = i + 1; j < q_; ++j) if(!edge_selection_active_ || gyy(i, j) == 1) - update_Kyy_offdiag(i, j); + update_Kyy_offdiag(i, j, iteration); } for(size_t i = 0; i < q_; ++i) - update_Kyy_diag(i); + update_Kyy_diag(i, iteration); // Step 5: Update Kxy (edge-gated) for(size_t i = 0; i < p_; ++i) for(size_t j = 0; j < q_; ++j) if(!edge_selection_active_ || gxy(i, j) == 1) - update_Kxy(i, j); + update_Kxy(i, j, iteration); // Step 6: Edge selection (reversible-jump birth/death) update_edge_indicators(); @@ -567,10 +568,11 @@ void MixedMRFModel::prepare_iteration() { edge_order_xy_ = arma_randperm(rng_, num_cross_); } -void MixedMRFModel::init_metropolis_adaptation(const WarmupSchedule& /*schedule*/) { - // Phase F: initialize Robbins-Monro controllers +void MixedMRFModel::init_metropolis_adaptation(const WarmupSchedule& schedule) { + total_warmup_ = schedule.total_warmup; } void MixedMRFModel::tune_proposal_sd(int /*iteration*/, const WarmupSchedule& /*schedule*/) { - // Phase F: Robbins-Monro proposal-SD tuning + // Robbins-Monro adaptation is embedded in each MH update function, + // gated by iteration < total_warmup_. No separate tuning pass needed. } diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 1d2cf8ea..bcfa607e 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -278,6 +278,7 @@ class MixedMRFModel : public BaseModel { arma::mat prop_sd_Kxx_; // p × p arma::mat prop_sd_Kyy_; // q × q arma::mat prop_sd_Kxy_; // p × q + int total_warmup_ = 0; // stored by init_metropolis_adaptation // ========================================================================= // Cached quantities @@ -377,22 +378,22 @@ class MixedMRFModel : public BaseModel { // --- Parameter update sweeps --- /** Update one main-effect: mux_(s, c). Ordinal threshold or BC α/β. */ - void update_main_effect(int s, int c); + void update_main_effect(int s, int c, int iteration); /** Update one continuous mean: muy_(j). */ - void update_continuous_mean(int j); + void update_continuous_mean(int j, int iteration); /** Update one discrete interaction: Kxx_(i, j). Symmetric. */ - void update_Kxx(int i, int j); + void update_Kxx(int i, int j, int iteration); /** Update one off-diagonal precision element: Kyy_(i, j). Cholesky-based. */ - void update_Kyy_offdiag(int i, int j); + void update_Kyy_offdiag(int i, int j, int iteration); /** Update one diagonal precision element: Kyy_(i, i). Log-scale Cholesky. */ - void update_Kyy_diag(int i); + void update_Kyy_diag(int i, int iteration); /** Update one cross interaction: Kxy_(i, j). */ - void update_Kxy(int i, int j); + void update_Kxy(int i, int j, int iteration); // --- Edge-indicator update sweeps (Phase D) --- From e44e131315998f02392f9faa1ac6bfec203622b7 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:40:39 +0100 Subject: [PATCH 17/60] feat: mixed MRF simulation and prediction (Phase G) --- R/RcppExports.R | 12 + R/simulate_predict.R | 589 ++++++++++++++++++ dev/mixedmrf/implementation_plan.md | 76 ++- dev/tests/test-simulation-recovery.R | 109 ++++ src/RcppExports.cpp | 71 +++ src/mrf_prediction.cpp | 147 +++++ src/mrf_simulation.cpp | 491 +++++++++++++++ tests/testthat/helper-fixtures.R | 16 + .../test-mixed-mrf-simulate-predict.R | 397 ++++++++++++ .../test-simulate-predict-regression.R | 101 ++- 10 files changed, 1991 insertions(+), 18 deletions(-) create mode 100644 tests/testthat/test-mixed-mrf-simulate-predict.R diff --git a/R/RcppExports.R b/R/RcppExports.R index cd0c9e0d..39d81707 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -25,6 +25,10 @@ compute_conditional_probs <- function(observations, predict_vars, pairwise, main .Call(`_bgms_compute_conditional_probs`, observations, predict_vars, pairwise, main, num_categories, variable_type, baseline_category) } +compute_conditional_mixed <- function(x_observations, y_observations, predict_vars, Kxx, Kxy, Kyy, mux, muy, num_categories, variable_type, baseline_category) { + .Call(`_bgms_compute_conditional_mixed`, x_observations, y_observations, predict_vars, Kxx, Kxy, Kyy, mux, muy, num_categories, variable_type, baseline_category) +} + sample_omrf_gibbs <- function(num_states, num_variables, num_categories, pairwise, main, iter, seed) { .Call(`_bgms_sample_omrf_gibbs`, num_states, num_variables, num_categories, pairwise, main, iter, seed) } @@ -45,6 +49,14 @@ run_ggm_simulation_parallel <- function(pairwise_samples, main_samples, draw_ind .Call(`_bgms_run_ggm_simulation_parallel`, pairwise_samples, main_samples, draw_indices, num_states, num_variables, means, nThreads, seed, progress_type) } +sample_mixed_mrf_gibbs <- function(num_states, Kxx_r, Kxy_r, Kyy_r, mux_r, muy_r, num_categories_r, variable_type_r, baseline_category_r, iter, seed) { + .Call(`_bgms_sample_mixed_mrf_gibbs`, num_states, Kxx_r, Kxy_r, Kyy_r, mux_r, muy_r, num_categories_r, variable_type_r, baseline_category_r, iter, seed) +} + +run_mixed_simulation_parallel <- function(mux_samples, kxx_samples, muy_samples, kyy_samples, kxy_samples, draw_indices, num_states, p, q, num_categories, variable_type_r, baseline_category, iter, nThreads, seed, progress_type) { + .Call(`_bgms_run_mixed_simulation_parallel`, mux_samples, kxx_samples, muy_samples, kyy_samples, kxy_samples, draw_indices, num_states, p, q, num_categories, variable_type_r, baseline_category, iter, nThreads, seed, progress_type) +} + sample_ggm <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, na_impute = FALSE, missing_index_nullable = NULL) { .Call(`_bgms_sample_ggm`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, na_impute, missing_index_nullable) } diff --git a/R/simulate_predict.R b/R/simulate_predict.R index b1b291b2..1ab3f735 100644 --- a/R/simulate_predict.R +++ b/R/simulate_predict.R @@ -629,6 +629,23 @@ simulate.bgms = function(object, )) } + # ============================================================================ + # Mixed MRF (discrete + continuous) path + # ============================================================================ + if(isTRUE(arguments$is_mixed)) { + return(simulate_bgms_mixed( + object = object, + nsim = nsim, + seed = seed, + method = method, + ndraws = ndraws, + arguments = arguments, + iter = iter, + cores = cores, + progress_type = progress_type + )) + } + # ============================================================================ # OMRF (ordinal / Blume-Capel) path # ============================================================================ @@ -1033,6 +1050,21 @@ predict.bgms = function(object, )) } + # ============================================================================ + # Mixed MRF (discrete + continuous) path + # ============================================================================ + if(isTRUE(arguments$is_mixed)) { + return(predict_bgms_mixed( + object = object, + newdata = newdata, + predict_vars = predict_vars, + arguments = arguments, + type = type, + method = method, + ndraws = ndraws + )) + } + # ============================================================================ # OMRF (ordinal) path # ============================================================================ @@ -1635,3 +1667,560 @@ simulate_bgms_ggm = function(object, nsim, seed, method, ndraws, return(results) } } + + +# ============================================================================== +# Mixed MRF Simulation Helper +# ============================================================================== + +# ------------------------------------------------------------------ +# simulate_bgms_mixed +# ------------------------------------------------------------------ +# Simulation implementation for mixed MRF models (called from simulate.bgms). +# +# @param object Fitted bgms object (mixed MRF). +# @param nsim Number of observations to simulate. +# @param seed Random seed. +# @param method "posterior-mean" or "posterior-sample". +# @param ndraws Number of posterior draws (for posterior-sample). +# @param arguments Output of extract_arguments(). +# @param iter Gibbs burn-in iterations. +# @param cores Number of threads. +# @param progress_type Progress bar type. +# +# Returns: matrix (posterior-mean) or list of matrices (posterior-sample). +# ------------------------------------------------------------------ +simulate_bgms_mixed = function(object, nsim, seed, method, ndraws, + arguments, iter, cores, progress_type) { + p = arguments$num_discrete + q = arguments$num_continuous + data_columnnames = arguments$data_columnnames + disc_idx = arguments$discrete_indices + cont_idx = arguments$continuous_indices + num_categories = arguments$num_categories + is_ordinal = arguments$is_ordinal + baseline_category_disc = arguments$baseline_category + + disc_variable_type = ifelse(is_ordinal, "ordinal", "blume-capel") + + bc = integer(p) + for(s in seq_len(p)) { + if(is_ordinal[s]) { + bc[s] = 0L + } else { + bc[s] = as.integer(baseline_category_disc[s]) + } + } + + if(method == "posterior-mean") { + params = reconstruct_mixed_params_from_means(object, arguments) + + seed = check_seed(seed) + + result = sample_mixed_mrf_gibbs( + num_states = as.integer(nsim), + Kxx_r = params$Kxx, + Kxy_r = params$Kxy, + Kyy_r = params$Kyy, + mux_r = params$mux, + muy_r = params$muy, + num_categories_r = as.integer(num_categories), + variable_type_r = disc_variable_type, + baseline_category_r = as.integer(bc), + iter = as.integer(iter), + seed = seed + ) + + out = combine_mixed_result(result, disc_idx, cont_idx, data_columnnames) + return(out) + + } else { + sample_info = split_mixed_raw_samples(object, arguments) + + total_draws = sample_info$total_draws + if(is.null(ndraws)) ndraws = total_draws + ndraws = min(ndraws, total_draws) + + if(!is.null(seed)) set.seed(seed) + draw_indices = sample.int(total_draws, ndraws) + + results = run_mixed_simulation_parallel( + mux_samples = sample_info$mux_samples, + kxx_samples = sample_info$kxx_samples, + muy_samples = sample_info$muy_samples, + kyy_samples = sample_info$kyy_samples, + kxy_samples = sample_info$kxy_samples, + draw_indices = as.integer(draw_indices), + num_states = as.integer(nsim), + p = as.integer(p), + q = as.integer(q), + num_categories = as.integer(num_categories), + variable_type_r = disc_variable_type, + baseline_category = as.integer(bc), + iter = as.integer(iter), + nThreads = cores, + seed = check_seed(seed), + progress_type = progress_type + ) + + for(i in seq_along(results)) { + results[[i]] = combine_mixed_result( + results[[i]], disc_idx, cont_idx, data_columnnames + ) + } + + return(results) + } +} + + +# ============================================================================== +# Mixed MRF Prediction Helper +# ============================================================================== + +# ------------------------------------------------------------------ +# predict_bgms_mixed +# ------------------------------------------------------------------ +# Prediction implementation for mixed MRF models (called from predict.bgms). +# +# @param object Fitted bgms object (mixed MRF). +# @param newdata n x (p+q) matrix of observed data. +# @param predict_vars 1-based indices into the combined variable list. +# @param arguments Output of extract_arguments(). +# @param type "probabilities" or "response". +# @param method "posterior-mean" or "posterior-sample". +# @param ndraws Number of posterior draws (for posterior-sample). +# +# Returns: Named list of prediction matrices. +# ------------------------------------------------------------------ +predict_bgms_mixed = function(object, newdata, predict_vars, arguments, + type, method, ndraws) { + p = arguments$num_discrete + q = arguments$num_continuous + data_columnnames = arguments$data_columnnames + disc_idx = arguments$discrete_indices + cont_idx = arguments$continuous_indices + num_categories = arguments$num_categories + is_ordinal = arguments$is_ordinal + baseline_category_disc = arguments$baseline_category + + disc_variable_type = ifelse(is_ordinal, "ordinal", "blume-capel") + + bc = integer(p) + for(s in seq_len(p)) { + if(is_ordinal[s]) { + bc[s] = 0L + } else { + bc[s] = as.integer(baseline_category_disc[s]) + } + } + + # Split newdata into discrete and continuous parts + x_data = as.matrix(newdata[, disc_idx, drop = FALSE]) + storage.mode(x_data) = "integer" + y_data = as.matrix(newdata[, cont_idx, drop = FALSE]) + storage.mode(y_data) = "double" + + # Map user predict_vars (1-based, original order) to internal 0-based indices + # Internal layout: [discrete_0..p-1, continuous_p..p+q-1] + internal_predict_vars = integer(length(predict_vars)) + for(k in seq_along(predict_vars)) { + orig_col = predict_vars[k] + disc_match = match(orig_col, disc_idx) + cont_match = match(orig_col, cont_idx) + if(!is.na(disc_match)) { + internal_predict_vars[k] = disc_match - 1L + } else if(!is.na(cont_match)) { + internal_predict_vars[k] = p + cont_match - 1L + } else { + stop("Variable index ", orig_col, + " not found in discrete or continuous indices.") + } + } + + compute_one_draw = function(Kxx, Kxy, Kyy, mux, muy) { + compute_conditional_mixed( + x_observations = x_data, + y_observations = y_data, + predict_vars = as.integer(internal_predict_vars), + Kxx = Kxx, + Kxy = Kxy, + Kyy = Kyy, + mux = mux, + muy = muy, + num_categories = as.integer(num_categories), + variable_type = disc_variable_type, + baseline_category = as.integer(bc) + ) + } + + if(method == "posterior-mean") { + params = reconstruct_mixed_params_from_means(object, arguments) + raw_result = compute_one_draw( + params$Kxx, params$Kxy, params$Kyy, params$mux, params$muy + ) + + probs = format_mixed_predictions( + raw_result, predict_vars, internal_predict_vars, + p, num_categories, data_columnnames + ) + } else { + sample_info = split_mixed_raw_samples(object, arguments) + total_draws = sample_info$total_draws + if(is.null(ndraws)) ndraws = total_draws + ndraws = min(ndraws, total_draws) + + draw_indices = sample.int(total_draws, ndraws) + + all_results = vector("list", ndraws) + for(i in seq_len(ndraws)) { + params_i = reconstruct_mixed_params_from_row( + sample_info, draw_indices[i], p, q, num_categories, is_ordinal + ) + all_results[[i]] = compute_one_draw( + params_i$Kxx, params_i$Kxy, params_i$Kyy, params_i$mux, params_i$muy + ) + } + + # Average predictions across draws + num_pv = length(predict_vars) + probs = vector("list", num_pv) + probs_sd = vector("list", num_pv) + names(probs) = data_columnnames[predict_vars] + names(probs_sd) = data_columnnames[predict_vars] + + for(k in seq_len(num_pv)) { + # Stack all draws into an array: n x ncol x ndraws + var_preds = lapply(all_results, `[[`, k) + pred_array = array(unlist(var_preds), + dim = c(nrow(var_preds[[1]]), ncol(var_preds[[1]]), ndraws) + ) + + probs[[k]] = apply(pred_array, c(1, 2), mean) + probs_sd[[k]] = apply(pred_array, c(1, 2), sd) + } + + probs = format_mixed_predictions( + probs, predict_vars, internal_predict_vars, + p, num_categories, data_columnnames + ) + names(probs_sd) = names(probs) + attr(probs, "sd") = probs_sd + } + + if(type == "response") { + return(format_mixed_response(probs, predict_vars, internal_predict_vars, + p, data_columnnames)) + } + + return(probs) +} + + +# ============================================================================== +# Mixed MRF Internal Helpers +# ============================================================================== + +# ------------------------------------------------------------------ +# reconstruct_mixed_params_from_means +# ------------------------------------------------------------------ +# Reconstruct Kxx, Kxy, Kyy, mux, muy from posterior mean summaries. +# +# @param object Fitted bgms object (mixed MRF). +# @param arguments Output of extract_arguments(). +# +# Returns: list with Kxx, Kxy, Kyy, mux, muy. +# ------------------------------------------------------------------ +reconstruct_mixed_params_from_means = function(object, arguments) { + p = arguments$num_discrete + q = arguments$num_continuous + disc_idx = arguments$discrete_indices + cont_idx = arguments$continuous_indices + num_categories = arguments$num_categories + is_ordinal = arguments$is_ordinal + + pmat = object$posterior_mean_pairwise + + Kxx = matrix(0, p, p) + for(i in seq_len(p)) { + for(j in seq_len(p)) { + if(i != j) Kxx[i, j] = pmat[disc_idx[i], disc_idx[j]] + } + } + + Kxy = matrix(0, p, q) + for(i in seq_len(p)) { + for(j in seq_len(q)) { + Kxy[i, j] = pmat[disc_idx[i], cont_idx[j]] + } + } + + Kyy = matrix(0, q, q) + for(i in seq_len(q)) { + for(j in seq_len(q)) { + if(i != j) Kyy[i, j] = pmat[cont_idx[i], cont_idx[j]] + } + } + for(j in seq_len(q)) { + Kyy[j, j] = object$posterior_mean_main$continuous[j, "precision"] + } + + mux = object$posterior_mean_main$discrete + mux[is.na(mux)] = 0 + + muy = object$posterior_mean_main$continuous[, "mean"] + + list(Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, mux = mux, muy = muy) +} + + +# ------------------------------------------------------------------ +# split_mixed_raw_samples +# ------------------------------------------------------------------ +# Split raw main and pairwise sample matrices into separate component +# matrices for the C++ parallel simulation worker. +# +# @param object Fitted bgms object (mixed MRF). +# @param arguments Output of extract_arguments(). +# +# Returns: list with mux_samples, kxx_samples, muy_samples, +# kyy_samples, kxy_samples, total_draws. +# ------------------------------------------------------------------ +split_mixed_raw_samples = function(object, arguments) { + p = arguments$num_discrete + q = arguments$num_continuous + num_categories = arguments$num_categories + is_ordinal = arguments$is_ordinal + + main_all = do.call(rbind, object$raw_samples$main) + pairwise_all = do.call(rbind, object$raw_samples$pairwise) + total_draws = nrow(main_all) + + # Main layout: [mux_flat | muy | kyy_diag] + num_mux = sum(ifelse(is_ordinal, num_categories, 2L)) + mux_cols = seq_len(num_mux) + muy_cols = num_mux + seq_len(q) + kyy_diag_cols = num_mux + q + seq_len(q) + + mux_samples = main_all[, mux_cols, drop = FALSE] + muy_samples = main_all[, muy_cols, drop = FALSE] + kyy_diag_values = main_all[, kyy_diag_cols, drop = FALSE] + + # Pairwise layout: [kxx_ut | kyy_offdiag | kxy] + nxx = as.integer(p * (p - 1) / 2) + nyy_offdiag = as.integer(q * (q - 1) / 2) + nxy = as.integer(p * q) + + kyy_off_end = nxx + nyy_offdiag + kxy_end = kyy_off_end + nxy + + kxx_samples = if(nxx > 0) { + pairwise_all[, seq_len(nxx), drop = FALSE] + } else { + matrix(0, nrow = total_draws, ncol = 0) + } + + kyy_offdiag_values = if(nyy_offdiag > 0) { + pairwise_all[, (nxx + 1):kyy_off_end, drop = FALSE] + } else { + matrix(0, nrow = total_draws, ncol = 0) + } + + kxy_samples = if(nxy > 0) { + pairwise_all[, (kyy_off_end + 1):kxy_end, drop = FALSE] + } else { + matrix(0, nrow = total_draws, ncol = 0) + } + + # Combine Kyy diagonal and off-diagonal into upper-triangle format + # C++ expects column-major upper-triangle including diagonal + nyy_total = as.integer(q * (q + 1) / 2) + kyy_samples = matrix(0, nrow = total_draws, ncol = nyy_total) + diag_pos = 0L + offdiag_pos = 0L + out_pos = 0L + for(col in seq_len(q)) { + for(row in col:q) { + out_pos = out_pos + 1L + if(row == col) { + diag_pos = diag_pos + 1L + kyy_samples[, out_pos] = kyy_diag_values[, diag_pos] + } else { + offdiag_pos = offdiag_pos + 1L + kyy_samples[, out_pos] = kyy_offdiag_values[, offdiag_pos] + } + } + } + + list( + mux_samples = mux_samples, + kxx_samples = kxx_samples, + muy_samples = muy_samples, + kyy_samples = kyy_samples, + kxy_samples = kxy_samples, + total_draws = total_draws + ) +} + + +# ------------------------------------------------------------------ +# reconstruct_mixed_params_from_row +# ------------------------------------------------------------------ +# Reconstruct Kxx, Kxy, Kyy, mux, muy from a single row of split +# sample matrices (used by predict posterior-sample). +# +# @param sample_info Output of split_mixed_raw_samples(). +# @param row_idx 1-based row index. +# @param p Number of discrete variables. +# @param q Number of continuous variables. +# @param num_categories Categories per discrete variable. +# @param is_ordinal Logical vector. +# +# Returns: list with Kxx, Kxy, Kyy, mux, muy. +# ------------------------------------------------------------------ +reconstruct_mixed_params_from_row = function(sample_info, row_idx, + p, q, num_categories, + is_ordinal) { + mux_vec = sample_info$mux_samples[row_idx, ] + num_params_disc = ifelse(is_ordinal, num_categories, 2L) + max_cats = max(num_params_disc) + mux = matrix(0, nrow = p, ncol = max_cats) + pos = 1L + for(s in seq_len(p)) { + nc = num_params_disc[s] + mux[s, seq_len(nc)] = mux_vec[pos:(pos + nc - 1L)] + pos = pos + nc + } + + Kxx = matrix(0, p, p) + if(p > 1) { + kxx_vec = sample_info$kxx_samples[row_idx, ] + idx = 0L + for(col in seq_len(p - 1)) { + for(row in (col + 1):p) { + idx = idx + 1L + Kxx[row, col] = kxx_vec[idx] + Kxx[col, row] = kxx_vec[idx] + } + } + } + + muy = sample_info$muy_samples[row_idx, ] + + kyy_vec = sample_info$kyy_samples[row_idx, ] + Kyy = matrix(0, q, q) + idx = 0L + for(col in seq_len(q)) { + for(row in col:q) { + idx = idx + 1L + Kyy[row, col] = kyy_vec[idx] + if(row != col) Kyy[col, row] = kyy_vec[idx] + } + } + + Kxy = matrix(0, p, q) + if(p > 0 && q > 0) { + kxy_vec = sample_info$kxy_samples[row_idx, ] + idx = 0L + for(s in seq_len(p)) { + for(j in seq_len(q)) { + idx = idx + 1L + Kxy[s, j] = kxy_vec[idx] + } + } + } + + list(Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, mux = mux, muy = muy) +} + + +# ------------------------------------------------------------------ +# combine_mixed_result +# ------------------------------------------------------------------ +# Combine $x (n x p integer) and $y (n x q double) into a single +# n x (p+q) matrix in the original column order. +# +# @param result List with $x and $y matrices. +# @param disc_idx Original column indices for discrete variables. +# @param cont_idx Original column indices for continuous variables. +# @param colnames Original data column names. +# +# Returns: n x (p+q) numeric matrix. +# ------------------------------------------------------------------ +combine_mixed_result = function(result, disc_idx, cont_idx, colnames) { + n = nrow(result$x) + num_vars = length(disc_idx) + length(cont_idx) + out = matrix(NA_real_, nrow = n, ncol = num_vars) + out[, disc_idx] = result$x + out[, cont_idx] = result$y + colnames(out) = colnames + out +} + + +# ------------------------------------------------------------------ +# format_mixed_predictions +# ------------------------------------------------------------------ +# Add names and column labels to C++ prediction output. +# +# @param raw_result List from C++ compute_conditional_mixed. +# @param predict_vars 1-based user-facing variable indices. +# @param internal_predict_vars 0-based internal indices. +# @param p Number of discrete variables. +# @param num_categories Categories per discrete variable. +# @param data_columnnames Original data column names. +# +# Returns: Named list of prediction matrices. +# ------------------------------------------------------------------ +format_mixed_predictions = function(raw_result, predict_vars, + internal_predict_vars, p, + num_categories, data_columnnames) { + probs = raw_result + names(probs) = data_columnnames[predict_vars] + + for(k in seq_along(predict_vars)) { + int_idx = internal_predict_vars[k] + if(int_idx < p) { + s = int_idx + 1L + n_cats = num_categories[s] + 1 + colnames(probs[[k]]) = paste0("cat_", 0:(n_cats - 1)) + } else { + colnames(probs[[k]]) = c("mean", "sd") + } + } + + probs +} + + +# ------------------------------------------------------------------ +# format_mixed_response +# ------------------------------------------------------------------ +# Convert probability predictions to point predictions for mixed models. +# +# @param probs Named list of prediction matrices. +# @param predict_vars 1-based user-facing variable indices. +# @param internal_predict_vars 0-based internal indices. +# @param p Number of discrete variables. +# @param data_columnnames Original data column names. +# +# Returns: n x length(predict_vars) matrix of predicted values. +# ------------------------------------------------------------------ +format_mixed_response = function(probs, predict_vars, + internal_predict_vars, p, + data_columnnames) { + n = nrow(probs[[1]]) + out = matrix(NA_real_, nrow = n, ncol = length(predict_vars)) + colnames(out) = data_columnnames[predict_vars] + + for(k in seq_along(predict_vars)) { + int_idx = internal_predict_vars[k] + if(int_idx < p) { + out[, k] = apply(probs[[k]], 1, which.max) - 1L + } else { + out[, k] = probs[[k]][, 1] + } + } + + out +} diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index a4003ab3..71ff9947 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -312,13 +312,13 @@ add the new Rcpp export to `src/RcppExports.cpp`, `R/RcppExports.R`, and | **B+** | Rank-1 Cholesky optimization for Kyy updates | B | Same correctness, $O(q^2)$ per Kyy move instead of $O(q^3)$ | ✅ | | **C** | Marginal PL: $\Theta$ caching, marginal OMRF, $\mu_y$ full sweep | B+ | Recovery test passes (marg PL, estimation only) | ✅ | | **D** | Edge selection: 3 RJ sweeps | B+ | Structure recovery test passes | ✅ | -| **E** | R interface: `bgm()` dispatch, output formatting | B+ | End-to-end `bgm(mixed_data)` works | -| **F** | Warmup schedule, adaptation, diagnostics | E | Full warmup pipeline | +| **E** | R interface: `bgm()` dispatch, output formatting | B+ | End-to-end `bgm(mixed_data)` works | ✅ | +| **F** | Warmup schedule, adaptation, diagnostics | E | Full warmup pipeline | ✅ | | **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | --- -## Phase A — Skeleton and data structures +## Phase A — Skeleton and data structures ✅ ### A.1 Create `mixed_mrf_model.h` @@ -517,7 +517,7 @@ The diagonal of `edge_indicators_` is always zero and excluded throughout. --- -## Phase B — Conditional pseudo-likelihood +## Phase B — Conditional pseudo-likelihood ✅ ### B.1 Implement log-likelihood functions ✅ @@ -787,7 +787,7 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { --- -## Phase B+ — Rank-1 Cholesky optimization +## Phase B+ — Rank-1 Cholesky optimization ✅ The Phase B implementation ports the mixedGM permute-then-Cholesky approach for $K_{yy}$ updates: each proposal calls `arma::chol` ($O(q^3)$), evaluates @@ -1082,7 +1082,7 @@ accepted move that changes $K_{yy}$, $K_{xy}$, or $\mu_y$. --- -## Phase C — Marginal pseudo-likelihood +## Phase C — Marginal pseudo-likelihood ✅ ### C.1 Implement `log_marginal_omrf(int s)` @@ -1312,9 +1312,9 @@ edges and does not apply per-pair scaling. This must be fixed: --- -## Phase E — R interface and integration +## Phase E — R interface and integration ✅ -### E.0 Remove `src/test_mixed_mrf.cpp` +### E.0 Remove `src/test_mixed_mrf.cpp` ✅ Delete `src/test_mixed_mrf.cpp` once `sample_mixed.cpp` provides the production Rcpp interface (E.1). The test helpers @@ -1324,7 +1324,7 @@ functionality is superseded by the real entry point and should not ship in the installed package. Update `src/RcppExports.cpp` and `R/RcppExports.R` accordingly (re-run `Rcpp::compileAttributes()`). -### E.1 Create `sample_mixed.cpp` +### E.1 Create `sample_mixed.cpp` ✅ Rcpp interface function `sample_mixed_mrf_cpp(...)`: - Takes R data (integer matrix `x`, numeric matrix `y`) @@ -1335,7 +1335,7 @@ Rcpp interface function `sample_mixed_mrf_cpp(...)`: Follow the pattern of `sample_ggm.cpp` and `sample_omrf.cpp`. -### E.2 Extend `bgm()` in R +### E.2 Extend `bgm()` in R ✅ The user interface uses **Option A** (decided): a single data frame plus a `variable_type` argument: @@ -1367,7 +1367,7 @@ column order. override so the shared sampler pipeline compiles. Future imputation support for mixed data should be a separate phase (Phase H). -### E.3 Extend `build_output.R` +### E.3 Extend `build_output.R` ✅ The output structure needs to accommodate: - Separate interaction matrices: `Kxx`, `Kyy`, `Kxy` (or a combined one) @@ -1375,7 +1375,7 @@ The output structure needs to accommodate: - Mean samples: `muy` matrix - Edge indicators decomposed by type -### E.4 Testing checkpoint — end-to-end +### E.4 Testing checkpoint — end-to-end ✅ **Test 7 (T19): `bgm()` with mixed data** - Call `bgm()` with `variable_type` containing both ordinal and continuous @@ -1384,9 +1384,9 @@ The output structure needs to accommodate: --- -## Phase F — Warmup, adaptation, and diagnostics +## Phase F — Warmup, adaptation, and diagnostics ✅ -### F.1 Warmup schedule +### F.1 Warmup schedule ✅ **Pre-condition check (before Phase F begins):** Verify that `WarmupSchedule` and `ChainRunner` support a Metropolis-only model without NUTS mass-matrix @@ -1404,7 +1404,7 @@ Use the same warmup schedule: - Stage 3b: Proposal SD tuning with edge selection (if enabled) - Stage 3c: Step-size re-adaptation with edge selection active -### F.2 Robbins-Monro adaptation +### F.2 Robbins-Monro adaptation ✅ Per-parameter proposal SD adaptation, matching the R prototype: ``` @@ -1415,7 +1415,7 @@ target = 0.44 Clamp to [0.001, 2.0]. -### F.3 Init metropolis adaptation +### F.3 Init metropolis adaptation ✅ Override `init_metropolis_adaptation(const WarmupSchedule&)` to store the schedule for use in `tune_proposal_sd()`. @@ -1425,7 +1425,7 @@ Robbins-Monro is already embedded in each update function. --- -## Phase G — Simulation and prediction +## Phase G — Simulation and prediction ✅ ### G.1 Mixed MRF simulation @@ -1444,10 +1444,52 @@ Note: the mixedGM Gibbs generator handles ordinal variables only. The Blume-Capel Gibbs sampling step must be added using the existing bgms probability helpers. +#### Implementation + +| File | Component | +|------|-----------| +| `src/mrf_simulation.cpp` | `simulate_mixed_mrf()` (core Gibbs), `sample_mixed_mrf_gibbs()` (single-draw Rcpp export), `MixedSimulationWorker` (RcppParallel worker with SafeRNG), `run_mixed_simulation_parallel()` (parallel Rcpp export) | +| `R/simulate_predict.R` | `simulate_bgms_mixed()` dispatched from `simulate.bgms()`, `reconstruct_mixed_params_from_means()`, `split_mixed_raw_samples()`, `combine_mixed_result()` | + ### G.2 Mixed MRF prediction Extend `mrf_prediction.cpp` for posterior predictive checks on mixed data. +#### Implementation + +| File | Component | +|------|-----------| +| `src/mrf_prediction.cpp` | `compute_conditional_mixed()` (Rcpp export): discrete probs via rest-score + ordinal/BC helpers, continuous conditional mean and SD from precision matrix | +| `R/simulate_predict.R` | `predict_bgms_mixed()` dispatched from `predict.bgms()`, `reconstruct_mixed_params_from_row()`, `format_mixed_predictions()`, `format_mixed_response()` | + +### G.3 Cycle-test validation + +Simulation-recovery cycle tests (fit → simulate → refit → correlate) +confirm that estimation and simulation code are consistent. + +| PL mode | Pairwise r | Main r | Max |diff| (main) | +|---------|-----------|--------|---------------------| +| Conditional | 1.000 | 1.000 | 0.50 | +| Marginal | 0.994 | 0.994 | 1.02 | + +The marginal PL main-effect offsets are a property of the parameterization, +not a code bug. The marginal PL estimates $\mu_x$ under $\Theta = K_{xx} - +K_{xy} K_{yy}^{-1} K_{xy}^\top$, but the Gibbs generator uses conditional +parameters ($K_{xx}$ directly). Both bgms and the mixedGM prototype show the +same pattern (mixedGM max |diff| = 2.4 on the same data). The pairwise +interactions are unaffected because $K_{xx}$, $K_{yy}$, and $K_{xy}$ are +shared across both parameterizations. + +Test files: + +| File | Content | +|------|---------| +| `tests/testthat/test-mixed-mrf-simulate-predict.R` | 77 tests: Gibbs sanity, parallel simulation, conditional prediction, S3 methods, edge cases (p=1, q=1) | +| `tests/testthat/test-simulate-predict-regression.R` | Mixed MRF fixtures added to existing regression test infrastructure | +| `dev/tests/test-simulation-recovery.R` | `run_simrec_test_mixed()` + Boredom cycle test | +| `dev/tests/plot_cycle_scatterplots.R` | Scatterplots for conditional and marginal PL cycle tests | +| `dev/tests/compare_bgms_mixedgm_cycle.R` | Cross-package comparison (bgms vs mixedGM) | + --- ## Testing strategy diff --git a/dev/tests/test-simulation-recovery.R b/dev/tests/test-simulation-recovery.R index 3a168607..5c0262f8 100644 --- a/dev/tests/test-simulation-recovery.R +++ b/dev/tests/test-simulation-recovery.R @@ -683,3 +683,112 @@ test_that("GGM posterior recovers parameters from simulated data", { expect_false(is.null(fit_vs_sbm$posterior_mode_allocations)) expect_false(is.null(fit_vs_sbm$raw_samples$allocations)) }) + + +# ============================================================================== +# Mixed MRF Simulation-Recovery +# ============================================================================== + +#' Run simulation-recovery test for a mixed MRF bgms fit +#' +#' @param fit A fitted bgms object (mixed MRF) +#' @param n_sim Number of observations to simulate +#' @param mcmc_args List of MCMC arguments for refitting +#' @param min_correlation Minimum acceptable correlation between estimates +#' @param seed Random seed for reproducibility +#' +#' @return List with correlation values and pass/fail status +run_simrec_test_mixed <- function(fit, n_sim = 500, mcmc_args = NULL, + min_correlation = 0.80, seed = 12345) { + + if(is.null(mcmc_args)) { + mcmc_args <- list(iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + } + + args <- extract_arguments(fit) + + # Extract pairwise estimates from original fit + original_pairwise <- colMeans(extract_pairwise_interactions(fit)) + + # Simulate data from the fitted model + set.seed(seed) + simulated_data <- simulate(fit, nsim = n_sim, method = "posterior-mean", + seed = seed) + + # Validate: check for constant discrete columns + disc_idx <- args$discrete_indices + col_vars <- apply(simulated_data[, disc_idx, drop = FALSE], 2, + function(x) length(unique(x))) + if(any(col_vars < 2)) { + return(list( + cor_pairwise = NA_real_, + passed = NA, + skipped = TRUE, + reason = sprintf("Degenerate discrete predictions for variable(s): %s", + paste(which(col_vars < 2), collapse = ", ")) + )) + } + + # Refit on simulated data + refit_args <- c( + list(x = simulated_data, + variable_type = args$variable_type, + edge_selection = FALSE), + mcmc_args + ) + + refit <- do.call(bgm, refit_args) + + # Extract estimates from refit + refit_pairwise <- colMeans(extract_pairwise_interactions(refit)) + + # Calculate correlation + cor_pairwise <- cor(original_pairwise, refit_pairwise) + if(is.na(cor_pairwise)) cor_pairwise <- 0 + + list( + cor_pairwise = cor_pairwise, + passed = cor_pairwise >= min_correlation + ) +} + + +test_that("bgm simulation-recovery: mixed MRF (Boredom, ordinal + continuous)", { + skip_on_cran() + + # Use Boredom data: 8 ordinal variables (1-7 scale), treat 3 as continuous. + # Shift ordinal columns to 0-based to match bgm() expectations. + data("Boredom", package = "bgms") + x <- as.matrix(Boredom[, 2:6]) + x <- x - 1L # shift from 1-7 to 0-6 + colnames(x) <- names(Boredom)[2:6] + n_obs <- nrow(x) + + # Treat columns 2 and 4 as continuous, rest as ordinal + vtype <- c("ordinal", "continuous", "ordinal", "continuous", "ordinal") + + fit <- bgm(x, variable_type = vtype, + edge_selection = FALSE, + iter = 1000, warmup = 1000, chains = 1, + seed = 44321, display_progress = "none") + + result <- run_simrec_test_mixed( + fit, + n_sim = n_obs, + mcmc_args = list(iter = 1000, warmup = 1000, chains = 1, + display_progress = "none"), + min_correlation = 0.80, + seed = 44321 + ) + + if(isTRUE(result$skipped)) { + skip(result$reason) + } + + expect_true( + result$cor_pairwise >= 0.80, + info = sprintf("Mixed MRF pairwise correlation = %.3f (expected >= 0.80)", + result$cor_pairwise) + ) +}) diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 8dfa1729..3fdb2d88 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -121,6 +121,27 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// compute_conditional_mixed +Rcpp::List compute_conditional_mixed(const arma::imat& x_observations, const arma::mat& y_observations, const arma::ivec& predict_vars, const arma::mat& Kxx, const arma::mat& Kxy, const arma::mat& Kyy, const arma::mat& mux, const arma::vec& muy, const arma::ivec& num_categories, const Rcpp::StringVector& variable_type, const arma::ivec& baseline_category); +RcppExport SEXP _bgms_compute_conditional_mixed(SEXP x_observationsSEXP, SEXP y_observationsSEXP, SEXP predict_varsSEXP, SEXP KxxSEXP, SEXP KxySEXP, SEXP KyySEXP, SEXP muxSEXP, SEXP muySEXP, SEXP num_categoriesSEXP, SEXP variable_typeSEXP, SEXP baseline_categorySEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::imat& >::type x_observations(x_observationsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type y_observations(y_observationsSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type predict_vars(predict_varsSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type Kxx(KxxSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type Kxy(KxySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type Kyy(KyySEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type mux(muxSEXP); + Rcpp::traits::input_parameter< const arma::vec& >::type muy(muySEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const Rcpp::StringVector& >::type variable_type(variable_typeSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + rcpp_result_gen = Rcpp::wrap(compute_conditional_mixed(x_observations, y_observations, predict_vars, Kxx, Kxy, Kyy, mux, muy, num_categories, variable_type, baseline_category)); + return rcpp_result_gen; +END_RCPP +} // sample_omrf_gibbs IntegerMatrix sample_omrf_gibbs(int num_states, int num_variables, IntegerVector num_categories, NumericMatrix pairwise, NumericMatrix main, int iter, int seed); RcppExport SEXP _bgms_sample_omrf_gibbs(SEXP num_statesSEXP, SEXP num_variablesSEXP, SEXP num_categoriesSEXP, SEXP pairwiseSEXP, SEXP mainSEXP, SEXP iterSEXP, SEXP seedSEXP) { @@ -212,6 +233,53 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// sample_mixed_mrf_gibbs +Rcpp::List sample_mixed_mrf_gibbs(int num_states, NumericMatrix Kxx_r, NumericMatrix Kxy_r, NumericMatrix Kyy_r, NumericMatrix mux_r, NumericVector muy_r, IntegerVector num_categories_r, Rcpp::StringVector variable_type_r, IntegerVector baseline_category_r, int iter, int seed); +RcppExport SEXP _bgms_sample_mixed_mrf_gibbs(SEXP num_statesSEXP, SEXP Kxx_rSEXP, SEXP Kxy_rSEXP, SEXP Kyy_rSEXP, SEXP mux_rSEXP, SEXP muy_rSEXP, SEXP num_categories_rSEXP, SEXP variable_type_rSEXP, SEXP baseline_category_rSEXP, SEXP iterSEXP, SEXP seedSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< int >::type num_states(num_statesSEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type Kxx_r(Kxx_rSEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type Kxy_r(Kxy_rSEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type Kyy_r(Kyy_rSEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type mux_r(mux_rSEXP); + Rcpp::traits::input_parameter< NumericVector >::type muy_r(muy_rSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type num_categories_r(num_categories_rSEXP); + Rcpp::traits::input_parameter< Rcpp::StringVector >::type variable_type_r(variable_type_rSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type baseline_category_r(baseline_category_rSEXP); + Rcpp::traits::input_parameter< int >::type iter(iterSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf_gibbs(num_states, Kxx_r, Kxy_r, Kyy_r, mux_r, muy_r, num_categories_r, variable_type_r, baseline_category_r, iter, seed)); + return rcpp_result_gen; +END_RCPP +} +// run_mixed_simulation_parallel +Rcpp::List run_mixed_simulation_parallel(const arma::mat& mux_samples, const arma::mat& kxx_samples, const arma::mat& muy_samples, const arma::mat& kyy_samples, const arma::mat& kxy_samples, const arma::ivec& draw_indices, int num_states, int p, int q, const arma::ivec& num_categories, const Rcpp::StringVector& variable_type_r, const arma::ivec& baseline_category, int iter, int nThreads, int seed, int progress_type); +RcppExport SEXP _bgms_run_mixed_simulation_parallel(SEXP mux_samplesSEXP, SEXP kxx_samplesSEXP, SEXP muy_samplesSEXP, SEXP kyy_samplesSEXP, SEXP kxy_samplesSEXP, SEXP draw_indicesSEXP, SEXP num_statesSEXP, SEXP pSEXP, SEXP qSEXP, SEXP num_categoriesSEXP, SEXP variable_type_rSEXP, SEXP baseline_categorySEXP, SEXP iterSEXP, SEXP nThreadsSEXP, SEXP seedSEXP, SEXP progress_typeSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const arma::mat& >::type mux_samples(mux_samplesSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type kxx_samples(kxx_samplesSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type muy_samples(muy_samplesSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type kyy_samples(kyy_samplesSEXP); + Rcpp::traits::input_parameter< const arma::mat& >::type kxy_samples(kxy_samplesSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type draw_indices(draw_indicesSEXP); + Rcpp::traits::input_parameter< int >::type num_states(num_statesSEXP); + Rcpp::traits::input_parameter< int >::type p(pSEXP); + Rcpp::traits::input_parameter< int >::type q(qSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type num_categories(num_categoriesSEXP); + Rcpp::traits::input_parameter< const Rcpp::StringVector& >::type variable_type_r(variable_type_rSEXP); + Rcpp::traits::input_parameter< const arma::ivec& >::type baseline_category(baseline_categorySEXP); + Rcpp::traits::input_parameter< int >::type iter(iterSEXP); + Rcpp::traits::input_parameter< int >::type nThreads(nThreadsSEXP); + Rcpp::traits::input_parameter< int >::type seed(seedSEXP); + Rcpp::traits::input_parameter< int >::type progress_type(progress_typeSEXP); + rcpp_result_gen = Rcpp::wrap(run_mixed_simulation_parallel(mux_samples, kxx_samples, muy_samples, kyy_samples, kxy_samples, draw_indices, num_states, p, q, num_categories, variable_type_r, baseline_category, iter, nThreads, seed, progress_type)); + return rcpp_result_gen; +END_RCPP +} // sample_ggm Rcpp::List sample_ggm(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda, const bool na_impute, const Rcpp::Nullable missing_index_nullable); RcppExport SEXP _bgms_sample_ggm(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP, SEXP na_imputeSEXP, SEXP missing_index_nullableSEXP) { @@ -324,11 +392,14 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_rcpp_ieee754_log", (DL_FUNC) &_bgms_rcpp_ieee754_log, 1}, {"_bgms_compute_conditional_ggm", (DL_FUNC) &_bgms_compute_conditional_ggm, 3}, {"_bgms_compute_conditional_probs", (DL_FUNC) &_bgms_compute_conditional_probs, 7}, + {"_bgms_compute_conditional_mixed", (DL_FUNC) &_bgms_compute_conditional_mixed, 11}, {"_bgms_sample_omrf_gibbs", (DL_FUNC) &_bgms_sample_omrf_gibbs, 7}, {"_bgms_sample_bcomrf_gibbs", (DL_FUNC) &_bgms_sample_bcomrf_gibbs, 9}, {"_bgms_sample_ggm_direct", (DL_FUNC) &_bgms_sample_ggm_direct, 4}, {"_bgms_run_simulation_parallel", (DL_FUNC) &_bgms_run_simulation_parallel, 12}, {"_bgms_run_ggm_simulation_parallel", (DL_FUNC) &_bgms_run_ggm_simulation_parallel, 9}, + {"_bgms_sample_mixed_mrf_gibbs", (DL_FUNC) &_bgms_sample_mixed_mrf_gibbs, 11}, + {"_bgms_run_mixed_simulation_parallel", (DL_FUNC) &_bgms_run_mixed_simulation_parallel, 16}, {"_bgms_sample_ggm", (DL_FUNC) &_bgms_sample_ggm, 19}, {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 17}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, diff --git a/src/mrf_prediction.cpp b/src/mrf_prediction.cpp index 5b890d83..a4315194 100644 --- a/src/mrf_prediction.cpp +++ b/src/mrf_prediction.cpp @@ -159,3 +159,150 @@ Rcpp::List compute_conditional_probs( return result; } + + +// ============================================================================ +// Mixed MRF Conditional Prediction +// ============================================================================ + +/** + * Compute conditional distributions for a mixed MRF. + * + * For discrete variables: P(x_s = c | x_{-s}, y) using the conditional OMRF. + * For continuous variables: E(y_j | y_{-j}, x) and SD(y_j | y_{-j}, x) + * using the conditional GGM. + * + * @param x_observations n x p integer matrix of discrete data. + * @param y_observations n x q numeric matrix of continuous data. + * @param predict_vars 0-based indices into the combined (p+q) variable list. + * Indices 0..p-1 refer to discrete variables, + * p..p+q-1 refer to continuous variables. + * @param Kxx p x p pairwise interactions (diagonal zero). + * @param Kxy p x q cross interactions. + * @param Kyy q x q precision matrix. + * @param mux p x max_cats threshold / Blume-Capel parameters. + * @param muy q-vector of continuous means. + * @param num_categories p-vector: categories per discrete variable. + * @param variable_type p-vector: "ordinal" or "blume-capel". + * @param baseline_category p-vector. + * + * @return List of prediction matrices (one per predicted variable). + * For discrete: n x (num_cats+1) probability matrix. + * For continuous: n x 2 matrix (mean, sd). + */ +// [[Rcpp::export]] +Rcpp::List compute_conditional_mixed( + const arma::imat& x_observations, + const arma::mat& y_observations, + const arma::ivec& predict_vars, + const arma::mat& Kxx, + const arma::mat& Kxy, + const arma::mat& Kyy, + const arma::mat& mux, + const arma::vec& muy, + const arma::ivec& num_categories, + const Rcpp::StringVector& variable_type, + const arma::ivec& baseline_category +) { + int n = x_observations.n_rows; + int p = x_observations.n_cols; + int q = y_observations.n_cols; + int num_predict_vars = predict_vars.n_elem; + + // Precompute Kyy inverse for continuous conditionals + arma::mat Kyy_inv = arma::inv_sympd(Kyy); + + // Convert discrete to double (centered for rest-score computation) + arma::mat x_dbl = arma::conv_to::from(x_observations); + + Rcpp::List result(num_predict_vars); + + for (int pv = 0; pv < num_predict_vars; pv++) { + int var_idx = predict_vars[pv]; + + if (var_idx < p) { + // --- Discrete variable: P(x_s = c | x_{-s}, y) --- + int s = var_idx; + int Cs = num_categories[s]; + + // Rest score from discrete neighbours (centered by baseline) + arma::vec rest_discrete(n, arma::fill::zeros); + for (int k = 0; k < p; k++) { + if (k == s) continue; + arma::vec obs_k = x_dbl.col(k); + double ref_k = static_cast(baseline_category[k]); + rest_discrete += (obs_k - ref_k) * Kxx(k, s); + } + + // Rest score from continuous (factor of 2) + arma::vec rest_continuous(n, arma::fill::zeros); + for (int j = 0; j < q; j++) { + rest_continuous += 2.0 * Kxy(s, j) * y_observations.col(j); + } + + arma::vec rest_scores = rest_discrete + rest_continuous; + + arma::mat probs; + if (std::string(variable_type[s]) == "blume-capel") { + int ref = baseline_category[s]; + double lin_eff = mux(s, 0); + double quad_eff = mux(s, 1); + arma::vec bound; + probs = compute_probs_blume_capel( + rest_scores, lin_eff, quad_eff, ref, Cs, bound + ); + } else { + arma::vec main_param = mux.row(s).head(Cs).t(); + arma::vec bound(n, arma::fill::zeros); + for (int c = 0; c < Cs; c++) { + arma::vec exps = main_param[c] + (c + 1) * rest_scores; + bound = arma::max(bound, exps); + } + probs = compute_probs_ordinal(main_param, rest_scores, bound, Cs); + } + + Rcpp::NumericMatrix prob_mat(n, Cs + 1); + for (int i = 0; i < n; i++) { + for (int c = 0; c <= Cs; c++) { + prob_mat(i, c) = probs(i, c); + } + } + result[pv] = prob_mat; + + } else { + // --- Continuous variable: y_j | y_{-j}, x --- + int j = var_idx - p; + + double omega_jj = Kyy(j, j); + double cond_var = 1.0 / omega_jj; + double cond_sd = std::sqrt(cond_var); + + // Contribution from other continuous variables: + // -sum_{k != j} Kyy[j,k] * (y_k - muy_k) + arma::vec lp_continuous(n, arma::fill::zeros); + for (int k = 0; k < q; k++) { + if (k == j) continue; + lp_continuous -= Kyy(j, k) * (y_observations.col(k) - muy(k)); + } + + // Contribution from discrete variables (factor of 2): + // sum_s 2 * Kxy(s, j) * x_s_centered + arma::vec lp_discrete(n, arma::fill::zeros); + for (int s = 0; s < p; s++) { + double ref_s = static_cast(baseline_category[s]); + lp_discrete += 2.0 * Kxy(s, j) * (x_dbl.col(s) - ref_s); + } + + arma::vec cond_means = muy(j) + cond_var * (lp_continuous + lp_discrete); + + Rcpp::NumericMatrix out(n, 2); + for (int i = 0; i < n; i++) { + out(i, 0) = cond_means[i]; + out(i, 1) = cond_sd; + } + result[pv] = out; + } + } + + return result; +} \ No newline at end of file diff --git a/src/mrf_simulation.cpp b/src/mrf_simulation.cpp index 059b6145..3a85f9ad 100644 --- a/src/mrf_simulation.cpp +++ b/src/mrf_simulation.cpp @@ -721,5 +721,496 @@ Rcpp::List run_ggm_simulation_parallel( output[i] = Rcpp::wrap(results[i].observations); } + return output; +} + + +// ============================================================================ +// Mixed MRF Simulation (Block Gibbs: Discrete + Continuous) +// ============================================================================ + +/** + * Simulate observations from a mixed MRF using block Gibbs sampling. + * + * Each iteration updates all discrete variables from their full conditional + * given (x_{-s}, y), then updates all continuous variables from + * y | x ~ N(mu_y + 2 * x * Kxy * Kyy^{-1}, Kyy^{-1}). + * + * @param num_states Number of observations to simulate. + * @param Kxx p x p discrete pairwise interactions (diagonal zero). + * @param Kxy p x q cross interactions. + * @param Kyy q x q SPD continuous precision. + * @param mux p x max_cats threshold / Blume-Capel parameters. + * @param muy q-vector of continuous means. + * @param num_categories p-vector: number of categories per discrete variable + * (on top of baseline 0). + * @param variable_type p-vector: "ordinal" or "blume-capel". + * @param baseline_category p-vector: reference category per variable. + * @param iter Number of Gibbs iterations for burn-in. + * @param rng Thread-safe RNG. + * @param x_out Output: n x p integer matrix of discrete observations. + * @param y_out Output: n x q numeric matrix of continuous observations. + */ +void simulate_mixed_mrf( + int num_states, + const arma::mat& Kxx, + const arma::mat& Kxy, + const arma::mat& Kyy, + const arma::mat& mux, + const arma::vec& muy, + const arma::ivec& num_categories, + const std::vector& variable_type, + const arma::ivec& baseline_category, + int iter, + SafeRNG& rng, + arma::imat& x_out, + arma::mat& y_out) { + + int p = Kxx.n_rows; + int q = Kyy.n_rows; + + // Precompute Kyy decomposition + arma::mat Sigma_y = arma::inv_sympd(Kyy); + arma::mat L_Sigma = arma::chol(Sigma_y, "lower"); + + // Precompute Kxy * Kyy^{-1} for conditional mean + arma::mat Kxy_Sigma = Kxy * Sigma_y; // p x q + + // Copy Kxx with zeroed diagonal for safety + arma::mat Kxx_safe = Kxx; + Kxx_safe.diag().zeros(); + + // Generate each observation independently + for (int obs = 0; obs < num_states; obs++) { + // Initialize discrete variables uniformly + arma::ivec x_current(p); + for (int s = 0; s < p; s++) { + int max_cat = num_categories(s); + x_current(s) = static_cast(runif(rng) * (max_cat + 1)); + if (x_current(s) > max_cat) x_current(s) = max_cat; + } + + // Initialize continuous from marginal N(muy, Sigma_y) + arma::vec z = arma_rnorm_vec(rng, q); + arma::vec y_current = muy + L_Sigma * z; + + // Gibbs iterations + for (int it = 0; it < iter; it++) { + + // --- Update discrete variables from f(x_s | x_{-s}, y) --- + for (int s = 0; s < p; s++) { + int Cs = num_categories(s); + + // Rest score from discrete neighbours + double rest_discrete = 0.0; + for (int k = 0; k < p; k++) { + if (k != s) { + int obs_k = x_current(k); + int ref_k = baseline_category(k); + rest_discrete += (obs_k - ref_k) * Kxx_safe(k, s); + } + } + + // Rest score from continuous (factor of 2) + double rest_continuous = 0.0; + for (int j = 0; j < q; j++) { + rest_continuous += 2.0 * Kxy(s, j) * y_current(j); + } + + double rest = rest_discrete + rest_continuous; + + if (variable_type[s] == "blume-capel") { + int ref = baseline_category(s); + double alpha = mux(s, 0); + double beta = mux(s, 1); + + // Compute log-probabilities for categories 0..Cs + arma::vec log_probs(Cs + 1); + double max_lp = -std::numeric_limits::infinity(); + for (int c = 0; c <= Cs; c++) { + int d = c - ref; + log_probs(c) = alpha * d + beta * d * d + d * rest; + if (log_probs(c) > max_lp) max_lp = log_probs(c); + } + + // Stabilize and convert to cumulative probabilities + double cumsum = 0.0; + arma::vec cum_probs(Cs + 1); + for (int c = 0; c <= Cs; c++) { + cumsum += std::exp(log_probs(c) - max_lp); + cum_probs(c) = cumsum; + } + + // Sample + double u = runif(rng) * cumsum; + int sampled = 0; + while (sampled < Cs && u > cum_probs(sampled)) sampled++; + x_current(s) = sampled; + + } else { + // Ordinal: category 0 is reference with log-prob = 0 + arma::vec log_probs(Cs + 1); + log_probs(0) = 0.0; + double max_lp = 0.0; + for (int c = 1; c <= Cs; c++) { + log_probs(c) = mux(s, c - 1) + c * rest; + if (log_probs(c) > max_lp) max_lp = log_probs(c); + } + + double cumsum = 0.0; + arma::vec cum_probs(Cs + 1); + for (int c = 0; c <= Cs; c++) { + cumsum += std::exp(log_probs(c) - max_lp); + cum_probs(c) = cumsum; + } + + double u = runif(rng) * cumsum; + int sampled = 0; + while (sampled < Cs && u > cum_probs(sampled)) sampled++; + x_current(s) = sampled; + } + } + + // --- Update continuous variables from y | x --- + // y | x ~ N(muy + 2 * Kxy_Sigma^T * x_centered, Sigma_y) + // Compute centered discrete observations + arma::vec x_centered(p); + for (int s = 0; s < p; s++) { + x_centered(s) = static_cast(x_current(s) - baseline_category(s)); + } + + // Conditional mean: muy + 2 * Sigma_y * Kxy^T * x_centered + // = muy + 2 * Kxy_Sigma^T * x_centered + arma::vec cond_mean = muy + 2.0 * Kxy_Sigma.t() * x_centered; + + // Sample y ~ N(cond_mean, Sigma_y) + arma::vec z2 = arma_rnorm_vec(rng, q); + y_current = cond_mean + L_Sigma * z2; + } + + // Store final state + x_out.row(obs) = x_current.t(); + y_out.row(obs) = y_current.t(); + } +} + + +// ============================================================================ +// R Interface for Mixed MRF Simulation (standalone) +// ============================================================================ + +// [[Rcpp::export]] +Rcpp::List sample_mixed_mrf_gibbs( + int num_states, + NumericMatrix Kxx_r, + NumericMatrix Kxy_r, + NumericMatrix Kyy_r, + NumericMatrix mux_r, + NumericVector muy_r, + IntegerVector num_categories_r, + Rcpp::StringVector variable_type_r, + IntegerVector baseline_category_r, + int iter, + int seed) { + + SafeRNG rng(seed); + + int p = Kxx_r.nrow(); + int q = Kyy_r.nrow(); + + arma::mat Kxx = Rcpp::as(Kxx_r); + arma::mat Kxy = Rcpp::as(Kxy_r); + arma::mat Kyy = Rcpp::as(Kyy_r); + arma::mat mux = Rcpp::as(mux_r); + arma::vec muy = Rcpp::as(muy_r); + arma::ivec num_categories = Rcpp::as(num_categories_r); + arma::ivec baseline_category = Rcpp::as(baseline_category_r); + + // Convert variable_type + std::vector variable_type(p); + for (int i = 0; i < p; i++) { + variable_type[i] = Rcpp::as(variable_type_r[i]); + if (variable_type[i] != "blume-capel") { + baseline_category[i] = 0; + } + } + + arma::imat x_out(num_states, p); + arma::mat y_out(num_states, q); + + simulate_mixed_mrf( + num_states, Kxx, Kxy, Kyy, mux, muy, + num_categories, variable_type, baseline_category, + iter, rng, x_out, y_out + ); + + Rcpp::checkUserInterrupt(); + + return Rcpp::List::create( + Rcpp::Named("x") = Rcpp::wrap(x_out), + Rcpp::Named("y") = Rcpp::wrap(y_out) + ); +} + + +// ============================================================================ +// Parallel Mixed MRF Simulation for simulate.bgms() with Posterior Draws +// ============================================================================ + +struct MixedSimulationResult { + arma::imat x_observations; + arma::mat y_observations; + int draw_index; + bool error; + std::string error_msg; +}; + + +class MixedSimulationWorker : public RcppParallel::Worker { +public: + // Input: posterior samples as flat vectors (one row per draw) + const arma::mat& mux_samples; // ndraws x n_mux + const arma::mat& kxx_samples; // ndraws x p*(p-1)/2 + const arma::mat& muy_samples; // ndraws x q + const arma::mat& kyy_samples; // ndraws x q*(q+1)/2 + const arma::mat& kxy_samples; // ndraws x p*q + + const arma::ivec& draw_indices; + const int num_states; + const int p, q; + const arma::ivec& num_categories; + const std::vector& variable_type; + const arma::ivec& baseline_category; + const int iter; + const arma::ivec& mux_param_counts; + + const std::vector& draw_rngs; + ProgressManager& pm; + std::vector& results; + + MixedSimulationWorker( + const arma::mat& mux_samples, + const arma::mat& kxx_samples, + const arma::mat& muy_samples, + const arma::mat& kyy_samples, + const arma::mat& kxy_samples, + const arma::ivec& draw_indices, + int num_states, + int p, int q, + const arma::ivec& num_categories, + const std::vector& variable_type, + const arma::ivec& baseline_category, + int iter, + const arma::ivec& mux_param_counts, + const std::vector& draw_rngs, + ProgressManager& pm, + std::vector& results + ) : + mux_samples(mux_samples), + kxx_samples(kxx_samples), + muy_samples(muy_samples), + kyy_samples(kyy_samples), + kxy_samples(kxy_samples), + draw_indices(draw_indices), + num_states(num_states), + p(p), q(q), + num_categories(num_categories), + variable_type(variable_type), + baseline_category(baseline_category), + iter(iter), + mux_param_counts(mux_param_counts), + draw_rngs(draw_rngs), + pm(pm), + results(results) + {} + + void operator()(std::size_t begin, std::size_t end) { + for (std::size_t i = begin; i < end; i++) { + MixedSimulationResult result; + result.draw_index = draw_indices[i]; + result.error = false; + + try { + SafeRNG rng = draw_rngs[i]; + int draw_row = draw_indices[i] - 1; // 1-based to 0-based + + // Reconstruct mux (p x max_cats) + int max_cats = arma::max(mux_param_counts); + arma::mat mux(p, max_cats, arma::fill::zeros); + int idx = 0; + for (int s = 0; s < p; s++) { + for (int c = 0; c < mux_param_counts[s]; c++) { + mux(s, c) = mux_samples(draw_row, idx); + idx++; + } + } + + // Reconstruct Kxx (p x p symmetric, zero diagonal) + arma::mat Kxx(p, p, arma::fill::zeros); + idx = 0; + for (int col = 0; col < p; col++) { + for (int row = col + 1; row < p; row++) { + Kxx(row, col) = kxx_samples(draw_row, idx); + Kxx(col, row) = kxx_samples(draw_row, idx); + idx++; + } + } + + // Reconstruct muy (q-vector) + arma::vec muy(q); + for (int j = 0; j < q; j++) { + muy(j) = muy_samples(draw_row, j); + } + + // Reconstruct Kyy (q x q symmetric, upper triangle including diagonal) + arma::mat Kyy(q, q, arma::fill::zeros); + idx = 0; + for (int col = 0; col < q; col++) { + for (int row = col; row < q; row++) { + if (row == col) { + Kyy(row, col) = kyy_samples(draw_row, idx); + } else { + Kyy(row, col) = kyy_samples(draw_row, idx); + Kyy(col, row) = kyy_samples(draw_row, idx); + } + idx++; + } + } + + // Reconstruct Kxy (p x q, row-major) + arma::mat Kxy(p, q, arma::fill::zeros); + idx = 0; + for (int s = 0; s < p; s++) { + for (int j = 0; j < q; j++) { + Kxy(s, j) = kxy_samples(draw_row, idx); + idx++; + } + } + + // Simulate + result.x_observations.set_size(num_states, p); + result.y_observations.set_size(num_states, q); + + simulate_mixed_mrf( + num_states, Kxx, Kxy, Kyy, mux, muy, + num_categories, variable_type, baseline_category, + iter, rng, + result.x_observations, result.y_observations + ); + + } catch (const std::exception& e) { + result.error = true; + result.error_msg = e.what(); + } catch (...) { + result.error = true; + result.error_msg = "Unknown error"; + } + + results[i] = result; + pm.update(0); + } + } +}; + + +/** + * Run parallel mixed MRF simulations across posterior draws. + * + * The R layer splits the flat parameter vector into the 5 component matrices + * and passes them as separate sample matrices. + * + * @param mux_samples ndraws x n_mux + * @param kxx_samples ndraws x p*(p-1)/2 + * @param muy_samples ndraws x q + * @param kyy_samples ndraws x q*(q+1)/2 + * @param kxy_samples ndraws x p*q + * @param draw_indices 1-based indices of which draws to use + * @param num_states Number of observations per draw + * @param p Number of discrete variables + * @param q Number of continuous variables + * @param num_categories p-vector: categories per discrete variable + * @param variable_type_r p-vector: "ordinal" or "blume-capel" + * @param baseline_category p-vector + * @param iter Gibbs burn-in iterations + * @param nThreads Number of threads + * @param seed Random seed + * @param progress_type Progress bar type + * + * @return List of lists, each containing "x" (integer matrix) and "y" (numeric matrix). + */ +// [[Rcpp::export]] +Rcpp::List run_mixed_simulation_parallel( + const arma::mat& mux_samples, + const arma::mat& kxx_samples, + const arma::mat& muy_samples, + const arma::mat& kyy_samples, + const arma::mat& kxy_samples, + const arma::ivec& draw_indices, + int num_states, + int p, + int q, + const arma::ivec& num_categories, + const Rcpp::StringVector& variable_type_r, + const arma::ivec& baseline_category, + int iter, + int nThreads, + int seed, + int progress_type) { + + int ndraws = draw_indices.n_elem; + + std::vector variable_type(p); + arma::ivec baseline_category_safe = baseline_category; + for (int i = 0; i < p; i++) { + variable_type[i] = Rcpp::as(variable_type_r[i]); + if (variable_type[i] != "blume-capel") { + baseline_category_safe[i] = 0; + } + } + + // Compute mux param counts per discrete variable + arma::ivec mux_param_counts(p); + for (int s = 0; s < p; s++) { + if (variable_type[s] == "blume-capel") { + mux_param_counts[s] = 2; + } else { + mux_param_counts[s] = num_categories[s]; + } + } + + std::vector draw_rngs(ndraws); + for (int d = 0; d < ndraws; d++) { + draw_rngs[d] = SafeRNG(seed + d); + } + + std::vector results(ndraws); + ProgressManager pm(1, ndraws, 0, 50, progress_type); + + MixedSimulationWorker worker( + mux_samples, kxx_samples, muy_samples, kyy_samples, kxy_samples, + draw_indices, num_states, p, q, + num_categories, variable_type, baseline_category_safe, + iter, mux_param_counts, draw_rngs, pm, results + ); + + { + tbb::global_control control(tbb::global_control::max_allowed_parallelism, nThreads); + parallelFor(0, ndraws, worker); + } + + pm.finish(); + + Rcpp::List output(ndraws); + for (int i = 0; i < ndraws; i++) { + if (results[i].error) { + Rcpp::stop("Error in mixed MRF simulation draw %d: %s", + results[i].draw_index, results[i].error_msg.c_str()); + } + output[i] = Rcpp::List::create( + Rcpp::Named("x") = Rcpp::wrap(results[i].x_observations), + Rcpp::Named("y") = Rcpp::wrap(results[i].y_observations) + ); + } + return output; } \ No newline at end of file diff --git a/tests/testthat/helper-fixtures.R b/tests/testthat/helper-fixtures.R index f69ab598..0dbf6a21 100644 --- a/tests/testthat/helper-fixtures.R +++ b/tests/testthat/helper-fixtures.R @@ -637,6 +637,22 @@ get_prediction_data_ggm = function(n = 10) { x } +#' Get prediction data matching the mixed MRF bgms fixture +#' Columns: d1 (ordinal 0-2), c1 (continuous), d2 (ordinal 0-2), +#' c2 (continuous), d3 (ordinal 0-2) +get_prediction_data_mixed = function(n = 10) { + set.seed(199) + x = cbind( + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE), + rnorm(n), + sample(0:2, n, replace = TRUE) + ) + colnames(x) = c("d1", "c1", "d2", "c2", "d3") + x +} + # ------------------------------------------------------------------------------ # 3. Test Data Generators # ------------------------------------------------------------------------------ diff --git a/tests/testthat/test-mixed-mrf-simulate-predict.R b/tests/testthat/test-mixed-mrf-simulate-predict.R new file mode 100644 index 00000000..6f99ca8d --- /dev/null +++ b/tests/testthat/test-mixed-mrf-simulate-predict.R @@ -0,0 +1,397 @@ +# ============================================================================== +# tests/testthat/test-mixed-mrf-simulate-predict.R +# ============================================================================== +# Phase G tests for mixed MRF simulation and prediction. +# +# EXTENDS: test-simulate-predict-regression.R (which handles parameterized +# roundtrip tests via get_bgms_fixtures). This file covers: +# T25: Gibbs generator sanity (sample_mixed_mrf_gibbs) +# Mixed-specific structural tests for simulate.bgms / predict.bgms +# Edge cases: p=1, q=1, binary-only ordinal +# +# PATTERN: Stochastic-robust testing — dimensions, ranges, invariants, +# coarse distributional checks. No exact moment matching. +# ============================================================================== + + +# ============================================================================== +# 1. Gibbs generator sanity (T25) +# ============================================================================== +# Verify that sample_mixed_mrf_gibbs produces structurally correct output +# and coarse statistical properties match known targets. +# ============================================================================== + +test_that("sample_mixed_mrf_gibbs returns correct dimensions", { + p = 2; q = 2; n = 100 + nc = c(2L, 2L) + mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) + Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) + muy = c(0.5, -0.2) + Kyy = matrix(c(1.5, 0.2, 0.2, 1.8), q, q) + Kxy = matrix(c(0.1, -0.15, 0.2, 0.05), p, q) + + result = sample_mixed_mrf_gibbs( + num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, + mux_r = mux, muy_r = muy, num_categories_r = nc, + variable_type_r = c("ordinal", "ordinal"), + baseline_category_r = c(0L, 0L), iter = 200L, seed = 42L + ) + + expect_true(is.list(result)) + expect_equal(dim(result$x), c(n, p)) + expect_equal(dim(result$y), c(n, q)) +}) + +test_that("sample_mixed_mrf_gibbs: discrete values in valid range", { + p = 3; q = 1; n = 500 + nc = c(2L, 3L, 1L) # categories 0-2, 0-3, 0-1 (binary) + mux = matrix(0, p, 4) + Kxx = matrix(0, p, p) + muy = 0 + Kyy = matrix(2) + Kxy = matrix(0, p, q) + + result = sample_mixed_mrf_gibbs( + num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, + mux_r = mux, muy_r = muy, num_categories_r = nc, + variable_type_r = c("ordinal", "ordinal", "ordinal"), + baseline_category_r = c(0L, 0L, 0L), iter = 100L, seed = 1L + ) + + for(s in 1:p) { + expect_true(all(result$x[, s] >= 0), + info = sprintf("var %d has negative values", s) + ) + expect_true(all(result$x[, s] <= nc[s]), + info = sprintf("var %d exceeds max category %d", s, nc[s]) + ) + } +}) + +test_that("sample_mixed_mrf_gibbs: continuous marginal SD matches precision", { + # Independent model: Kxx = 0, Kxy = 0, so y ~ N(muy, Kyy^{-1}) + p = 1; q = 2; n = 2000 + nc = c(2L) + mux = matrix(0, p, 3) + Kxx = matrix(0) + muy = c(1.0, -0.5) + precision = c(2.0, 0.5) + Kyy = diag(precision) + Kxy = matrix(0, p, q) + + result = sample_mixed_mrf_gibbs( + num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, + mux_r = mux, muy_r = muy, num_categories_r = nc, + variable_type_r = "ordinal", baseline_category_r = 0L, + iter = 300L, seed = 99L + ) + + for(j in 1:q) { + expected_sd = 1 / sqrt(precision[j]) + empirical_sd = sd(result$y[, j]) + # Loose check: within 30% of expected + expect_true( + abs(empirical_sd - expected_sd) / expected_sd < 0.3, + info = sprintf("y%d SD: expected %.3f, got %.3f", j, expected_sd, empirical_sd) + ) + } +}) + +test_that("sample_mixed_mrf_gibbs: seed reproducibility", { + p = 2; q = 1; n = 50 + nc = c(2L, 2L) + mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) + Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) + muy = 0; Kyy = matrix(1); Kxy = matrix(c(0.1, 0.2), p, q) + + args = list( + num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, + mux_r = mux, muy_r = muy, num_categories_r = nc, + variable_type_r = c("ordinal", "ordinal"), + baseline_category_r = c(0L, 0L), iter = 100L, seed = 42L + ) + + r1 = do.call(sample_mixed_mrf_gibbs, args) + r2 = do.call(sample_mixed_mrf_gibbs, args) + + expect_equal(r1$x, r2$x) + expect_equal(r1$y, r2$y) +}) + +test_that("sample_mixed_mrf_gibbs: Blume-Capel variable works", { + p = 2; q = 1; n = 200 + nc = c(2L, 4L) + # ordinal: mux has num_categories entries; BC: 2 entries (alpha, beta) + max_cols = max(nc[1], 2) + mux = matrix(0, p, max_cols) + mux[2, 1] = 0.5 # alpha + mux[2, 2] = -0.3 # beta (penalizes distance from reference) + + Kxx = matrix(c(0, 0.2, 0.2, 0), p, p) + muy = 0; Kyy = matrix(1.5); Kxy = matrix(c(0.1, -0.1), p, q) + + result = sample_mixed_mrf_gibbs( + num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, + mux_r = mux, muy_r = muy, num_categories_r = nc, + variable_type_r = c("ordinal", "blume-capel"), + baseline_category_r = c(0L, 2L), iter = 200L, seed = 7L + ) + + expect_equal(dim(result$x), c(n, p)) + expect_true(all(result$x[, 1] >= 0 & result$x[, 1] <= nc[1])) + expect_true(all(result$x[, 2] >= 0 & result$x[, 2] <= nc[2])) +}) + + +# ============================================================================== +# 2. Parallel simulation (run_mixed_simulation_parallel) +# ============================================================================== + +test_that("run_mixed_simulation_parallel returns correct structure", { + p = 2L; q = 1L; ndraws_total = 3L + nc = c(2L, 2L) + mux_s = matrix(rep(c(0, 0.5, -0.3, 0, -0.2, 0.1), each = ndraws_total), + nrow = ndraws_total) + kxx_s = matrix(0.3, nrow = ndraws_total, ncol = 1) + muy_s = matrix(0, nrow = ndraws_total, ncol = 1) + kyy_s = matrix(1.5, nrow = ndraws_total, ncol = 1) + kxy_s = matrix(c(0.1, -0.1), nrow = ndraws_total, ncol = 2, byrow = TRUE) + + n_use = 2L + n_obs = 15L + res = run_mixed_simulation_parallel( + mux_samples = mux_s, kxx_samples = kxx_s, + muy_samples = muy_s, kyy_samples = kyy_s, kxy_samples = kxy_s, + draw_indices = 1:n_use, num_states = n_obs, + p = p, q = q, num_categories = nc, + variable_type_r = c("ordinal", "ordinal"), + baseline_category = c(0L, 0L), + iter = 100L, nThreads = 1L, seed = 1L, progress_type = 0L + ) + + expect_true(is.list(res)) + expect_equal(length(res), n_use) + + for(d in seq_len(n_use)) { + expect_equal(dim(res[[d]]$x), c(n_obs, p)) + expect_equal(dim(res[[d]]$y), c(n_obs, q)) + expect_true(all(res[[d]]$x >= 0 & res[[d]]$x <= 2)) + } +}) + + +# ============================================================================== +# 3. compute_conditional_mixed +# ============================================================================== + +test_that("compute_conditional_mixed: discrete probs sum to 1", { + p = 2; q = 1; n = 5 + nc = c(2L, 2L) + mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) + Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) + muy = 0; Kyy = matrix(1.5); Kxy = matrix(c(0.1, 0.2), p, q) + + x_obs = matrix(c(0L, 1L, 2L, 0L, 1L, 1L, 2L, 0L, 1L, 2L), + nrow = n, ncol = p) + y_obs = matrix(rnorm(n), nrow = n, ncol = q) + + # Predict first discrete variable (0-based index 0) + preds = compute_conditional_mixed( + x_observations = x_obs, y_observations = y_obs, + predict_vars = 0L, Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, + mux = mux, muy = muy, num_categories = nc, + variable_type = c("ordinal", "ordinal"), + baseline_category = c(0L, 0L) + ) + + expect_equal(length(preds), 1) + expect_equal(nrow(preds[[1]]), n) + expect_equal(ncol(preds[[1]]), nc[1] + 1) # 3 categories + + row_sums = rowSums(preds[[1]]) + expect_true(all(abs(row_sums - 1) < 1e-8)) + expect_true(all(preds[[1]] >= 0)) +}) + +test_that("compute_conditional_mixed: continuous returns mean and sd", { + p = 1; q = 2; n = 5 + nc = c(2L) + mux = matrix(c(0, 0.5, -0.3), nrow = 1, ncol = 3) + Kxx = matrix(0); muy = c(1.0, -0.5) + Kyy = matrix(c(2, 0.3, 0.3, 1.5), q, q) + Kxy = matrix(c(0.1, -0.1), 1, q) + + x_obs = matrix(c(0L, 1L, 2L, 1L, 0L), nrow = n, ncol = 1) + y_obs = matrix(rnorm(n * q), nrow = n, ncol = q) + + # Predict continuous variable at index p=1 (0-based) + preds = compute_conditional_mixed( + x_observations = x_obs, y_observations = y_obs, + predict_vars = as.integer(p), Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, + mux = mux, muy = muy, num_categories = nc, + variable_type = "ordinal", baseline_category = 0L + ) + + expect_equal(length(preds), 1) + expect_equal(nrow(preds[[1]]), n) + expect_equal(ncol(preds[[1]]), 2) # mean, sd + expect_true(all(preds[[1]][, 2] > 0)) # sd > 0 +}) + +test_that("compute_conditional_mixed: mixed prediction variables", { + p = 2; q = 2; n = 5 + nc = c(2L, 2L) + mux = matrix(0, p, 3) + Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) + muy = c(0.5, -0.2); Kyy = diag(c(1.5, 1.8)) + Kxy = matrix(0.1, p, q) + + x_obs = matrix(sample(0:2, n * p, replace = TRUE), n, p) + storage.mode(x_obs) = "integer" + y_obs = matrix(rnorm(n * q), n, q) + + # Predict one discrete (0) and one continuous (p+0 = 2) + preds = compute_conditional_mixed( + x_observations = x_obs, y_observations = y_obs, + predict_vars = c(0L, 2L), Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, + mux = mux, muy = muy, num_categories = nc, + variable_type = c("ordinal", "ordinal"), + baseline_category = c(0L, 0L) + ) + + expect_equal(length(preds), 2) + # First is discrete: n x 3 + expect_equal(ncol(preds[[1]]), nc[1] + 1) + expect_true(all(abs(rowSums(preds[[1]]) - 1) < 1e-8)) + # Second is continuous: n x 2 + expect_equal(ncol(preds[[2]]), 2) +}) + + +# ============================================================================== +# 4. simulate.bgms for mixed MRF (posterior-mean path) +# ============================================================================== + +test_that("simulate.bgms works for mixed MRF with posterior-mean", { + fit = get_bgms_fit_mixed_mrf_no_es() + args = extract_arguments(fit) + + n_sim = 30 + result = simulate(fit, nsim = n_sim, method = "posterior-mean", seed = 1) + + expect_true(is.matrix(result)) + expect_equal(nrow(result), n_sim) + expect_equal(ncol(result), args$num_variables) + expect_equal(colnames(result), args$data_columnnames) + + # Discrete columns should be non-negative integers + for(di in args$discrete_indices) { + vals = result[, di] + expect_true(all(vals >= 0), info = sprintf("col %d negative", di)) + expect_true(all(vals == round(vals)), info = sprintf("col %d not integer", di)) + } +}) + +test_that("simulate.bgms seed reproducibility for mixed MRF", { + fit = get_bgms_fit_mixed_mrf_no_es() + + r1 = simulate(fit, nsim = 10, method = "posterior-mean", seed = 42) + r2 = simulate(fit, nsim = 10, method = "posterior-mean", seed = 42) + + expect_equal(r1, r2) +}) + + +# ============================================================================== +# 5. predict.bgms for mixed MRF (posterior-mean path) +# ============================================================================== + +test_that("predict.bgms works for mixed MRF with posterior-mean", { + fit = get_bgms_fit_mixed_mrf_no_es() + args = extract_arguments(fit) + + newdata = get_prediction_data_mixed(n = 10) + result = predict(fit, newdata = newdata, type = "probabilities") + + expect_true(is.list(result)) + expect_equal(length(result), args$num_variables) + + for(j in seq_len(args$num_variables)) { + vname = args$data_columnnames[j] + expect_equal(nrow(result[[j]]), 10, info = sprintf("var %s nrow", vname)) + expect_false(anyNA(result[[j]]), info = sprintf("var %s has NAs", vname)) + + if(args$variable_type[j] %in% c("ordinal", "blume-capel")) { + row_sums = rowSums(result[[j]]) + expect_true( + all(abs(row_sums - 1) < 1e-6), + info = sprintf("var %s probs don't sum to 1", vname) + ) + } else { + expect_equal(ncol(result[[j]]), 2, info = sprintf("var %s ncol", vname)) + expect_true(all(result[[j]][, 2] > 0), + info = sprintf("var %s sd not positive", vname) + ) + } + } +}) + +test_that("predict.bgms response type works for mixed MRF", { + fit = get_bgms_fit_mixed_mrf_no_es() + args = extract_arguments(fit) + + newdata = get_prediction_data_mixed(n = 10) + result = predict(fit, newdata = newdata, type = "response") + + expect_true(is.matrix(result)) + expect_equal(dim(result), c(10, args$num_variables)) + + # Discrete columns should be integer-valued + for(di in args$discrete_indices) { + expect_true(all(result[, di] == round(result[, di])), + info = sprintf("response col %d not integer", di) + ) + } +}) + + +# ============================================================================== +# 6. Edge cases +# ============================================================================== + +test_that("sample_mixed_mrf_gibbs: single discrete variable (p=1, q=2)", { + result = sample_mixed_mrf_gibbs( + num_states = 50L, + Kxx_r = matrix(0), + Kxy_r = matrix(c(0.1, -0.1), 1, 2), + Kyy_r = diag(c(1.5, 2.0)), + mux_r = matrix(c(0, 0.5), 1, 2), + muy_r = c(0, 0), + num_categories_r = 1L, + variable_type_r = "ordinal", + baseline_category_r = 0L, + iter = 100L, seed = 3L + ) + + expect_equal(dim(result$x), c(50, 1)) + expect_equal(dim(result$y), c(50, 2)) + expect_true(all(result$x %in% 0:1)) +}) + +test_that("sample_mixed_mrf_gibbs: single continuous variable (p=2, q=1)", { + result = sample_mixed_mrf_gibbs( + num_states = 50L, + Kxx_r = matrix(c(0, 0.2, 0.2, 0), 2, 2), + Kxy_r = matrix(c(0.1, -0.1), 2, 1), + Kyy_r = matrix(2.0), + mux_r = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), 2, 3, byrow = TRUE), + muy_r = 0.5, + num_categories_r = c(2L, 2L), + variable_type_r = c("ordinal", "ordinal"), + baseline_category_r = c(0L, 0L), + iter = 100L, seed = 5L + ) + + expect_equal(dim(result$x), c(50, 2)) + expect_equal(dim(result$y), c(50, 1)) +}) diff --git a/tests/testthat/test-simulate-predict-regression.R b/tests/testthat/test-simulate-predict-regression.R index de9f9932..f441bbd9 100644 --- a/tests/testthat/test-simulate-predict-regression.R +++ b/tests/testthat/test-simulate-predict-regression.R @@ -76,6 +76,16 @@ get_bgms_fixtures = function() { label = "ggm-no-es", get_fit = get_bgms_fit_ggm_no_es, get_prediction_data = get_prediction_data_ggm, var_type = "continuous", is_continuous = TRUE + ), + list( + label = "mixed-mrf", get_fit = get_bgms_fit_mixed_mrf, + get_prediction_data = get_prediction_data_mixed, + var_type = "mixed", is_continuous = FALSE, is_mixed = TRUE + ), + list( + label = "mixed-mrf-no-es", get_fit = get_bgms_fit_mixed_mrf_no_es, + get_prediction_data = get_prediction_data_mixed, + var_type = "mixed", is_continuous = FALSE, is_mixed = TRUE ) ) } @@ -187,6 +197,25 @@ test_that("bgms $arguments contains all fields needed by simulate/predict", { isTRUE(args$is_continuous), info = sprintf("%s: is_continuous should be TRUE for GGM", ctx) ) + } else if(isTRUE(spec$is_mixed)) { + # Mixed MRF: OMRF fields plus mixed-specific fields + for(field in BGMS_OMRF_FIELDS) { + expect_true( + field %in% names(args), + info = sprintf("%s: missing arguments$%s", ctx, field) + ) + } + for(field in c("is_mixed", "discrete_indices", "continuous_indices", + "num_discrete", "num_continuous", "is_ordinal", + "data_columnnames_discrete", "data_columnnames_continuous")) { + expect_true( + field %in% names(args), + info = sprintf("%s: missing mixed arguments$%s", ctx, field) + ) + } + expect_true(isTRUE(args$is_mixed), + info = sprintf("%s: is_mixed should be TRUE", ctx) + ) } else { # OMRF fits must also carry num_categories and baseline_category for(field in BGMS_OMRF_FIELDS) { @@ -245,6 +274,18 @@ test_that("bgms fit objects have posterior_mean fields for simulate/predict", { expect_equal(ncol(fit$posterior_mean_pairwise), p, info = paste(ctx, "posterior_mean_pairwise wrong ncol") ) + + if(isTRUE(spec$is_mixed)) { + expect_true(is.list(fit$posterior_mean_main), + info = paste(ctx, "mixed posterior_mean_main should be a list") + ) + expect_false(is.null(fit$posterior_mean_main$discrete), + info = paste(ctx, "missing posterior_mean_main$discrete") + ) + expect_false(is.null(fit$posterior_mean_main$continuous), + info = paste(ctx, "missing posterior_mean_main$continuous") + ) + } } }) @@ -476,6 +517,42 @@ test_that("simulate → predict roundtrip works for all bgms fixtures", { info = sprintf("%s predict var %d ncol", ctx, j) ) } + } else if(isTRUE(spec$is_mixed)) { + # Mixed MRF: predict returns list with discrete (probs) and continuous (mean/sd) + probs = predict(fit, newdata = simulated, type = "probabilities") + expect_true(is.list(probs), info = paste(ctx, "predict type")) + expect_equal(length(probs), args$num_variables, info = paste(ctx, "predict length")) + + for(j in seq_len(args$num_variables)) { + vname = args$data_columnnames[j] + expect_equal(nrow(probs[[j]]), n_sim, + info = sprintf("%s predict %s nrow", ctx, vname) + ) + expect_false(anyNA(probs[[j]]), + info = sprintf("%s predict %s has NAs", ctx, vname) + ) + + if(args$variable_type[j] %in% c("ordinal", "blume-capel")) { + # Discrete: probability rows sum to 1 + row_sums = rowSums(probs[[j]]) + expect_true( + all(abs(row_sums - 1) < 1e-6), + info = sprintf("%s predict %s probs don't sum to 1", ctx, vname) + ) + } else { + # Continuous: 2-column (mean, sd) matrix + expect_equal(ncol(probs[[j]]), 2, + info = sprintf("%s predict %s ncol", ctx, vname) + ) + } + } + + # type = "response" should return a matrix + resp = predict(fit, newdata = simulated, type = "response") + expect_true(is.matrix(resp), info = paste(ctx, "response matrix")) + expect_equal(dim(resp), c(n_sim, args$num_variables), + info = paste(ctx, "response dim") + ) } else { # OMRF: predict returns list of probability matrices probs = predict(fit, newdata = simulated, type = "probabilities") @@ -668,7 +745,7 @@ test_that("bgms $arguments field types are correct for simulate/predict", { info = paste(ctx, "data_columnnames length") ) - if(!isTRUE(spec$is_continuous)) { + if(!isTRUE(spec$is_continuous) && !isTRUE(spec$is_mixed)) { # OMRF-only fields expect_true(is.numeric(args$num_categories) && length(args$num_categories) == p, info = paste(ctx, "num_categories length") @@ -680,6 +757,28 @@ test_that("bgms $arguments field types are correct for simulate/predict", { info = paste(ctx, "baseline_category length") ) } + + if(isTRUE(spec$is_mixed)) { + pd = args$num_discrete + qc = args$num_continuous + expect_equal(pd + qc, p, info = paste(ctx, "num_discrete + num_continuous == p")) + expect_true( + is.numeric(args$num_categories) && length(args$num_categories) == pd, + info = paste(ctx, "mixed num_categories length == num_discrete") + ) + expect_true( + is.numeric(args$baseline_category) && length(args$baseline_category) == pd, + info = paste(ctx, "mixed baseline_category length == num_discrete") + ) + expect_true( + is.numeric(args$discrete_indices) && length(args$discrete_indices) == pd, + info = paste(ctx, "discrete_indices length") + ) + expect_true( + is.numeric(args$continuous_indices) && length(args$continuous_indices) == qc, + info = paste(ctx, "continuous_indices length") + ) + } } }) From 137a5ddcaa92adc8f0a320a744fbd2b17e6729e2 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:33:30 +0100 Subject: [PATCH 18/60] =?UTF-8?q?docs:=20code=20quality=20pass=20=E2=80=94?= =?UTF-8?q?=20styler,=20lintr,=20C++=20documentation=20(audit=20#8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .Rbuildignore | 1 + R/bgm_spec.R | 24 +- R/build_output.R | 44 +- R/simulate_predict.R | 289 +++-- src/bgmCompare/bgmCompare_helper.cpp | 358 +++--- src/bgmCompare/bgmCompare_logp_and_grad.cpp | 712 ++++++------ src/bgmCompare/bgmCompare_output.h | 19 +- src/bgmCompare/bgmCompare_sampler.cpp | 1000 ++++++++--------- src/bgmCompare_interface.cpp | 258 +++-- src/mcmc/algorithms/nuts.cpp | 72 +- src/mcmc/execution/chain_result.h | 19 +- src/mcmc/execution/sampler_config.h | 20 +- src/mcmc/samplers/hmc_adaptation.h | 11 + src/mcmc/samplers/metropolis_adaptation.h | 3 + src/models/mixed/mixed_mrf_model.h | 117 +- src/models/omrf/omrf_model.h | 76 +- src/mrf_prediction.cpp | 78 +- src/mrf_simulation.cpp | 264 ++--- src/priors/sbm_edge_prior.cpp | 74 +- src/sample_mixed.cpp | 70 +- src/sample_omrf.cpp | 66 +- src/utils/common_helpers.h | 28 +- src/utils/print_mutex.h | 21 +- src/utils/variable_helpers.h | 144 +-- tests/testthat/helper-fixtures.R | 85 +- tests/testthat/test-bgm.R | 37 +- .../test-mixed-mrf-simulate-predict.R | 82 +- .../test-simulate-predict-regression.R | 146 ++- 28 files changed, 2175 insertions(+), 1943 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index fcf9b275..7a8c3cdf 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -16,6 +16,7 @@ # GitHub / CI ^\.github$ +^CONTRIBUTING\.md$ # Hidden config files (development only) ^\.lintr$ diff --git a/R/bgm_spec.R b/R/bgm_spec.R index c624db18..3c186cba 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -652,11 +652,13 @@ build_spec_mixed_mrf = function(x, data_columnnames, num_variables, # Missing data — not supported for mixed MRF (Phase H) if(na_action == "impute") { stop("Missing data imputation is not yet supported for mixed models.", - call. = FALSE) + call. = FALSE + ) } if(anyNA(x)) { stop("Missing data detected. Mixed models do not yet support missing data handling.", - call. = FALSE) + call. = FALSE + ) } # Ordinal recoding (reformat discrete data) @@ -685,17 +687,17 @@ build_spec_mixed_mrf = function(x, data_columnnames, num_variables, new_bgm_spec( model_type = "mixed_mrf", data = list( - x_discrete = x_disc_recoded, - x_continuous = x_cont, + x_discrete = x_disc_recoded, + x_continuous = x_cont, data_columnnames = data_columnnames, - data_columnnames_discrete = data_columnnames[disc_idx], + data_columnnames_discrete = data_columnnames[disc_idx], data_columnnames_continuous = data_columnnames[cont_idx], - num_variables = as.integer(num_variables), - num_discrete = as.integer(p), - num_continuous = as.integer(q), - num_cases = as.integer(nrow(x)), - num_categories = as.integer(num_categories), - discrete_indices = disc_idx, + num_variables = as.integer(num_variables), + num_discrete = as.integer(p), + num_continuous = as.integer(q), + num_cases = as.integer(nrow(x)), + num_categories = as.integer(num_categories), + discrete_indices = disc_idx, continuous_indices = cont_idx ), variables = list( diff --git a/R/build_output.R b/R/build_output.R index e877ecbe..095c7033 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -392,9 +392,11 @@ build_output_mixed_mrf = function(spec, raw) { kyy_offdiag_abs = kyy_start - 1L + kyy_offdiag_within # Main indices: mux + muy + Kyy diagonal - main_idx = c(seq(mux_start, mux_end), - seq(muy_start, muy_end), - kyy_diag_abs) + main_idx = c( + seq(mux_start, mux_end), + seq(muy_start, muy_end), + kyy_diag_abs + ) # Pairwise indices: Kxx + Kyy off-diag + Kxy pairwise_idx = c( @@ -434,9 +436,11 @@ build_output_mixed_mrf = function(spec, raw) { cats = seq_len(num_categories[si]) names_main = c(names_main, paste0(disc_names[si], " (", cats, ")")) } else { - names_main = c(names_main, + names_main = c( + names_main, paste0(disc_names[si], " (linear)"), - paste0(disc_names[si], " (quadratic)")) + paste0(disc_names[si], " (quadratic)") + ) } } for(ji in seq_len(q)) { @@ -457,8 +461,10 @@ build_output_mixed_mrf = function(spec, raw) { if(p > 1) { for(i in seq_len(p - 1)) { for(j in seq(i + 1, p)) { - edge_names = c(edge_names, - paste0(disc_names[i], "-", disc_names[j])) + edge_names = c( + edge_names, + paste0(disc_names[i], "-", disc_names[j]) + ) } } } @@ -466,8 +472,10 @@ build_output_mixed_mrf = function(spec, raw) { if(q > 1) { for(i in seq_len(q - 1)) { for(j in seq(i + 1, q)) { - edge_names = c(edge_names, - paste0(cont_names[i], "-", cont_names[j])) + edge_names = c( + edge_names, + paste0(cont_names[i], "-", cont_names[j]) + ) } } } @@ -475,8 +483,10 @@ build_output_mixed_mrf = function(spec, raw) { if(p > 0 && q > 0) { for(i in seq_len(p)) { for(j in seq_len(q)) { - edge_names = c(edge_names, - paste0(disc_names[i], "-", cont_names[j])) + edge_names = c( + edge_names, + paste0(disc_names[i], "-", cont_names[j]) + ) } } } @@ -550,8 +560,10 @@ build_output_mixed_mrf = function(spec, raw) { # --- Posterior mean: pairwise as (p+q) × (p+q) matrix ----------------------- # Map from internal block indices to original column positions - pmat = matrix(0, nrow = num_variables, ncol = num_variables, - dimnames = list(data_columnnames, data_columnnames)) + pmat = matrix(0, + nrow = num_variables, ncol = num_variables, + dimnames = list(data_columnnames, data_columnnames) + ) pw_means = pairwise_summary$mean idx = 0L @@ -600,8 +612,10 @@ build_output_mixed_mrf = function(spec, raw) { # --- Posterior mean: indicator ----------------------------------------------- if(edge_selection) { ind_means = indicator_summary$mean - imat = matrix(0, nrow = num_variables, ncol = num_variables, - dimnames = list(data_columnnames, data_columnnames)) + imat = matrix(0, + nrow = num_variables, ncol = num_variables, + dimnames = list(data_columnnames, data_columnnames) + ) idx = 0L if(p > 1) { diff --git a/R/simulate_predict.R b/R/simulate_predict.R index 1ab3f735..5a3d1851 100644 --- a/R/simulate_predict.R +++ b/R/simulate_predict.R @@ -12,10 +12,11 @@ #' Simulate Observations from a Markov Random Field #' #' @description -#' `simulate_mrf()` generates observations from a Markov Random Field using -#' user-specified parameters. For ordinal and Blume-Capel variables, observations -#' are generated via Gibbs sampling. For continuous variables (Gaussian graphical -#' model), observations are drawn directly from the multivariate normal +#' `simulate_mrf()` generates observations from a Markov Random +#' Field using user-specified parameters. For ordinal and +#' Blume-Capel variables, observations are generated via Gibbs +#' sampling. For continuous variables (Gaussian graphical model), +#' observations are drawn directly from the multivariate normal #' distribution implied by the precision matrix. #' #' @details @@ -41,7 +42,8 @@ #' have a special type of baseline_category category, such as the neutral #' category in a Likert scale. The Blume-Capel model specifies the following #' quadratic model for the threshold parameters: -#' \deqn{\mu_{\text{c}} = \alpha \times (\text{c} - \text{r}) + \beta \times (\text{c} - \text{r})^2,}{{\mu_{\text{c}} = \alpha \times (\text{c} - \text{r}) + \beta \times (\text{c} - \text{r})^2,}} +#' \deqn{\mu_{\text{c}} = \alpha (\text{c} - \text{r}) +#' + \beta (\text{c} - \text{r})^2} #' where \eqn{\mu_{\text{c}}}{\mu_{\text{c}}} is the threshold for category c #' (which now includes zero), \eqn{\alpha}{\alpha} offers a linear trend #' across categories (increasing threshold values if @@ -55,15 +57,18 @@ #' #' @param num_variables The number of variables in the MRF. #' -#' @param num_categories Either a positive integer or a vector of positive -#' integers of length \code{num_variables}. The number of response categories on top -#' of the base category: \code{num_categories = 1} generates binary states. +#' @param num_categories Either a positive integer or a vector +#' of positive integers of length \code{num_variables}. The +#' number of response categories on top of the base category: +#' \code{num_categories = 1} generates binary states. #' Only used for ordinal and Blume-Capel variables; ignored when #' \code{variable_type = "continuous"}. #' -#' @param pairwise A symmetric \code{num_variables} by \code{num_variables} matrix. -#' For ordinal and Blume-Capel variables, this contains the pairwise interaction -#' parameters; only the off-diagonal elements are used. For continuous variables, +#' @param pairwise A symmetric \code{num_variables} by +#' \code{num_variables} matrix. For ordinal and Blume-Capel +#' variables, this contains the pairwise interaction parameters; +#' only the off-diagonal elements are used. For continuous +#' variables, #' this is the precision matrix \eqn{\Omega}{Omega} (including diagonal) and #' must be positive definite. #' @@ -71,7 +76,8 @@ #' \code{num_variables} by \code{max(num_categories)} matrix of category #' thresholds. The elements in row \code{i} indicate the thresholds of #' variable \code{i}. If \code{num_categories} is a vector, only the first -#' \code{num_categories[i]} elements are used in row \code{i}. If the Blume-Capel +#' \code{num_categories[i]} elements are used in row \code{i}. +#' If the Blume-Capel #' model is used for the category thresholds for variable \code{i}, then row #' \code{i} requires two values (details below); the first is #' \eqn{\alpha}{\alpha}, the linear contribution of the Blume-Capel model and @@ -91,8 +97,10 @@ #' from a Gaussian graphical model. #' Defaults to \code{variable_type = "ordinal"}. #' -#' @param baseline_category An integer vector of length \code{num_variables} specifying the -#' baseline_category category that is used for the Blume-Capel model (details below). +#' @param baseline_category An integer vector of length +#' \code{num_variables} specifying the baseline_category +#' category that is used for the Blume-Capel model +#' (details below). #' Can be any integer value between \code{0} and \code{num_categories} (or #' \code{num_categories[i]}). #' @@ -182,7 +190,7 @@ simulate_mrf = function(num_states, baseline_category, iter = 1e3, seed = NULL) { - # Check num_states, num_variables --------------------------------------------- + # Check num_states, num_variables ------ check_positive_integer(num_states, "num_states") check_positive_integer(num_variables, "num_variables") @@ -201,7 +209,8 @@ simulate_mrf = function(num_states, bc_binary = variable_type == "blume-capel" & num_categories < 2 if(any(bc_binary)) { stop(paste0( - "The Blume-Capel model only works for ordinal variables with more than two \n", + "The Blume-Capel model only works for ordinal ", + "variables with more than two \n", "response options. But variables ", paste(which(bc_binary), collapse = ", "), " are binary variables." @@ -223,7 +232,10 @@ simulate_mrf = function(num_states, stop("The matrix 'pairwise' needs to be symmetric.") } if(nrow(pairwise) != num_variables) { - stop("The matrix 'pairwise' needs to have 'num_variables' rows and columns.") + stop( + "The matrix 'pairwise' needs to have ", + "'num_variables' rows and columns." + ) } if(any(diag(pairwise) <= 0)) { stop("The diagonal of the precision matrix 'pairwise' must be positive.") @@ -266,19 +278,24 @@ simulate_mrf = function(num_states, # =========================================================================== check_positive_integer(iter, "iter") - # Check num_categories -------------------------------------------------------- + # Check num_categories ------ if(length(num_categories) == 1) { - if(num_categories <= 0 || - abs(num_categories - round(num_categories)) > .Machine$double.eps) { + not_pos_int = num_categories <= 0 || + abs(num_categories - round(num_categories)) > .Machine$double.eps + if(not_pos_int) { stop("``num_categories'' needs be a (vector of) positive integer(s).") } num_categories = rep(num_categories, num_variables) } else { for(variable in 1:num_variables) { - if(num_categories[variable] <= 0 || - abs(num_categories[variable] - round(num_categories[variable])) > - .Machine$double.eps) { - stop(paste("For variable", variable, "``num_categories'' was not a positive integer.")) + nc = num_categories[variable] + not_pos_int = nc <= 0 || abs(nc - round(nc)) > .Machine$double.eps + if(not_pos_int) { + stop(paste( + "For variable", variable, + "``num_categories'' was not a", + "positive integer." + )) } } } @@ -288,7 +305,10 @@ simulate_mrf = function(num_states, if(length(baseline_category) == 1) { baseline_category = rep(baseline_category, num_variables) } - if(any(baseline_category < 0) || any(abs(baseline_category - round(baseline_category)) > .Machine$double.eps)) { + bc_diff = abs(baseline_category - round(baseline_category)) + not_valid = any(baseline_category < 0) || + any(bc_diff > .Machine$double.eps) + if(not_valid) { stop(paste0( "For variables ", which(baseline_category < 0), @@ -299,7 +319,8 @@ simulate_mrf = function(num_states, stop(paste0( "For variables ", which(baseline_category - num_categories > 0), - " the ``baseline_category'' category was larger than the maximum category value." + " the ``baseline_category'' category was larger", + " than the maximum category value." )) } } @@ -312,7 +333,10 @@ simulate_mrf = function(num_states, stop("The matrix ``pairwise'' needs to be symmetric.") } if(nrow(pairwise) != num_variables) { - stop("The matrix ``pairwise'' needs to have ``num_variables'' rows and columns.") + stop( + "The matrix ``pairwise'' needs to have", + " ``num_variables'' rows and columns." + ) } # Check the threshold values ------------------------------------------------- @@ -341,16 +365,13 @@ simulate_mrf = function(num_states, for(variable in 1:num_variables) { if(variable_type[variable] != "blume-capel") { if(anyNA(main[variable, 1:num_categories[variable]])) { - tmp = which(is.na(main[variable, 1:num_categories[variable]])) - - string = paste(tmp, sep = ",") - + na_cats = which(is.na(main[variable, 1:num_categories[variable]])) stop(paste0( "The matrix ``main'' contains NA(s) for variable ", variable, " in category \n", "(categories) ", - paste(which(is.na(main[variable, 1:num_categories[variable]])), collapse = ", "), + paste(na_cats, collapse = ", "), ", where a numeric value is needed." )) } @@ -370,24 +391,31 @@ simulate_mrf = function(num_states, } else { if(anyNA(main[variable, 1:2])) { stop(paste0( - "The Blume-Capel model is chosen for the category thresholds of variable ", + "The Blume-Capel model is chosen for the ", + "category thresholds of variable ", variable, ". \n", - "This model has two parameters that need to be placed in columns 1 and 2, row \n", + "This model has two parameters that need ", + "to be placed in columns 1 and 2, row \n", variable, - ", of the ``main'' input matrix. Currently, there are NA(s) in these \n", + ", of the ``main'' input matrix. ", + "Currently, there are NA(s) in these \n", "entries, where a numeric value is needed." )) } if(ncol(main) > 2) { if(!anyNA(main[variable, 3:ncol(main)])) { warning(paste0( - "The Blume-Capel model is chosen for the category thresholds of variable ", + "The Blume-Capel model is chosen for ", + "the category thresholds of variable ", variable, ". \n", - "This model has two parameters that need to be placed in columns 1 and 2, row \n", + "This model has two parameters that ", + "need to be placed in columns 1 and ", + "2, row \n", variable, - ", of the ``main'' input matrix. However, there are numeric values \n", + ", of the ``main'' input matrix. ", + "However, there are numeric values \n", "in higher categories. These values will be ignored." )) } @@ -510,7 +538,8 @@ mrfSampler = function(num_states, #' #' @description #' Generates new observations from the Markov Random Field model using the -#' estimated parameters from a fitted \code{bgms} object. +#' estimated parameters from a fitted \code{bgms} object. Supports ordinal, +#' Blume-Capel, continuous (GGM), and mixed MRF models. #' #' @param object An object of class \code{bgms}. #' @param nsim Number of observations to simulate. Default: \code{500}. @@ -524,7 +553,8 @@ mrfSampler = function(num_states, #' uses parallel processing when \code{cores > 1}.} #' } #' @param ndraws Number of posterior draws to use when -#' \code{method = "posterior-sample"}. If \code{NULL}, uses all available draws. +#' \code{method = "posterior-sample"}. If \code{NULL}, +#' uses all available draws. #' @param iter Number of Gibbs iterations for equilibration before collecting #' samples. Default: \code{1000}. #' @param cores Number of CPU cores for parallel execution when @@ -542,9 +572,14 @@ mrfSampler = function(num_states, #' If \code{method = "posterior-sample"}: A list of matrices, one per posterior #' draw, each with \code{nsim} rows and \code{p} columns. #' +#' For mixed MRF models, discrete columns contain non-negative integers and +#' continuous columns contain real-valued observations, ordered as in the +#' original data. +#' #' @details -#' This function uses the estimated interaction and threshold parameters to -#' generate new data via Gibbs sampling. When \code{method = "posterior-sample"}, +#' This function uses the estimated interaction and threshold +#' parameters to generate new data via Gibbs sampling. When +#' \code{method = "posterior-sample"}, parameter uncertainty is #' parameter uncertainty is propagated to the simulated data by using different #' posterior draws. Parallel processing is available for this method via the #' \code{cores} argument. @@ -562,7 +597,11 @@ mrfSampler = function(num_states, #' new_data = simulate(fit, nsim = 100) #' #' # Simulate with parameter uncertainty (10 datasets) -#' new_data_list = simulate(fit, nsim = 100, method = "posterior-sample", ndraws = 10) +#' new_data_list = simulate( +#' fit, +#' nsim = 100, +#' method = "posterior-sample", ndraws = 10 +#' ) #' #' # Use parallel processing for faster simulation #' new_data_list = simulate(fit, @@ -713,9 +752,9 @@ simulate.bgms = function(object, } -# ============================================================================== -# simulate.bgmCompare() - S3 Method for Simulating from Group-Comparison Models -# ============================================================================== +# ============================================================ +# simulate.bgmCompare() - S3 Method for Group-Comparison +# ============================================================ #' Simulate Data from a Fitted bgmCompare Model #' @@ -779,15 +818,23 @@ simulate.bgmCompare = function(object, # Validate group argument if(missing(group)) { - stop("Argument 'group' is required. Specify which group to simulate from (1 to num_groups).") + stop( + "Argument 'group' is required. ", + "Specify which group to simulate from ", + "(1 to num_groups)." + ) } arguments = extract_arguments(object) num_groups = arguments$num_groups - if(!is.numeric(group) || length(group) != 1 || is.na(group) || - group < 1 || group > num_groups) { - stop(sprintf("Argument 'group' must be an integer between 1 and %d.", num_groups)) + invalid_group = !is.numeric(group) || length(group) != 1 || + is.na(group) || group < 1 || group > num_groups + if(invalid_group) { + stop(sprintf( + "Argument 'group' must be an integer between 1 and %d.", + num_groups + )) } group = as.integer(group) @@ -799,7 +846,6 @@ simulate.bgmCompare = function(object, num_categories = arguments$num_categories is_ordinal = arguments$is_ordinal_variable data_columnnames = arguments$data_columnnames - projection = arguments$projection # [num_groups x (num_groups-1)] # Determine variable_type from is_ordinal variable_type = ifelse(is_ordinal, "ordinal", "blume-capel") @@ -868,7 +914,8 @@ simulate.bgmCompare = function(object, #' #' @description #' Computes conditional probability distributions for one or more variables -#' given the observed values of other variables in the data. +#' given the observed values of other variables in the data. Supports ordinal, +#' Blume-Capel, continuous (GGM), and mixed MRF models. #' #' @param object An object of class \code{bgms}. #' @param newdata A matrix or data frame with \code{n} rows and \code{p} columns @@ -890,10 +937,12 @@ simulate.bgmCompare = function(object, #' @param method Character string specifying which parameter estimates to use: #' \describe{ #' \item{\code{"posterior-mean"}}{Use posterior mean parameters.} -#' \item{\code{"posterior-sample"}}{Average predictions over posterior draws.} +#' \item{\code{"posterior-sample"}}{Average predictions +#' over posterior draws.} #' } #' @param ndraws Number of posterior draws to use when -#' \code{method = "posterior-sample"}. If \code{NULL}, uses all available draws. +#' \code{method = "posterior-sample"}. If \code{NULL}, +#' uses all available draws. #' @param seed Optional random seed for reproducibility when #' \code{method = "posterior-sample"}. #' @param ... Additional arguments (currently ignored). @@ -903,8 +952,9 @@ simulate.bgmCompare = function(object, #' #' For \code{type = "probabilities"}: A named list with one element per #' predicted variable. Each element is a matrix with \code{n} rows and -#' \code{num_categories + 1} columns containing \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} for each -#' observation and category. +#' \code{num_categories + 1} columns containing +#' \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} +#' for each observation and category. #' #' For \code{type = "response"}: A matrix with \code{n} rows and #' \code{length(variables)} columns containing predicted categories. @@ -927,6 +977,13 @@ simulate.bgmCompare = function(object, #' When \code{method = "posterior-sample"}, conditional parameters are #' averaged over posterior draws, and an attribute \code{"sd"} is included. #' +#' \strong{Mixed MRF models:} +#' +#' For mixed models, the return list contains elements for both discrete and +#' continuous predicted variables. Discrete variables return probability +#' matrices (as in ordinal models); continuous variables return conditional +#' mean and SD matrices (as in GGM models). +#' #' @details #' For each observation, the function computes the conditional distribution #' of the target variable(s) given the observed values of all other variables. @@ -935,7 +992,8 @@ simulate.bgmCompare = function(object, #' #' For GGM (continuous) models, the conditional distribution of #' \eqn{X_j | X_{-j}}{X_j | X_{-j}} is Gaussian with mean -#' \eqn{-\omega_{jj}^{-1} \sum_{k \neq j} \omega_{jk} x_k}{-omega_jj^{-1} sum_{k != j} omega_jk x_k} +#' \eqn{-\omega_{jj}^{-1} \sum_{k \neq j} +#' \omega_{jk} x_k}{-omega_jj^{-1} sum_{k != j} omega_jk x_k} #' and variance \eqn{\omega_{jj}^{-1}}{omega_jj^{-1}}, where \eqn{\Omega}{Omega} #' is the precision matrix. #' @@ -978,7 +1036,11 @@ predict.bgms = function(object, # Validate newdata if(missing(newdata)) { - stop("Argument 'newdata' is required. Provide the data for which to compute predictions.") + stop( + "Argument 'newdata' is required. ", + "Provide the data for which to ", + "compute predictions." + ) } if(!inherits(newdata, "matrix") && !inherits(newdata, "data.frame")) { @@ -1000,7 +1062,8 @@ predict.bgms = function(object, if(ncol(newdata) != num_variables) { stop(paste0( - "'newdata' must have ", num_variables, " columns (same as fitted model), ", + "'newdata' must have ", num_variables, + " columns (same as fitted model), ", "but has ", ncol(newdata), "." )) } @@ -1025,7 +1088,13 @@ predict.bgms = function(object, } else if(is.character(variables)) { predict_vars = match(variables, data_columnnames) if(anyNA(predict_vars)) { - stop("Variable names not found: ", paste(variables[is.na(predict_vars)], collapse = ", ")) + stop( + "Variable names not found: ", + paste( + variables[is.na(predict_vars)], + collapse = ", " + ) + ) } } else { predict_vars = as.integer(variables) @@ -1070,7 +1139,9 @@ predict.bgms = function(object, # ============================================================================ # Recode data to 0-based integers (matching what bgm() does) - newdata_recoded = recode_data_for_prediction(newdata, num_categories, is_ordinal) + newdata_recoded = recode_data_for_prediction( + newdata, num_categories, is_ordinal + ) if(method == "posterior-mean") { # Use posterior mean parameters @@ -1215,9 +1286,10 @@ predict.bgms = function(object, #' @param ... Additional arguments (currently ignored). #' #' @return -#' For \code{type = "probabilities"}: A named list with one element per -#' predicted variable. Each element is a matrix with \code{n} rows and -#' \code{num_categories + 1} columns containing \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} +#' For \code{type = "probabilities"}: A named list with one +#' element per predicted variable. Each element is a matrix with +#' \code{n} rows and \code{num_categories + 1} columns containing +#' \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} #' for each observation and category. #' #' For \code{type = "response"}: A matrix with \code{n} rows and @@ -1229,8 +1301,10 @@ predict.bgms = function(object, #' The function then computes the conditional distribution of target variables #' given the observed values of all other variables. #' -#' @seealso \code{\link{predict.bgms}} for predicting from single-group models, -#' \code{\link{simulate.bgmCompare}} for simulating from group-comparison models. +#' @seealso \code{\link{predict.bgms}} for predicting +#' from single-group models, +#' \code{\link{simulate.bgmCompare}} for simulating +#' from group-comparison models. #' @family prediction #' #' @examples @@ -1260,21 +1334,33 @@ predict.bgmCompare = function(object, # Validate group argument if(missing(group)) { - stop("Argument 'group' is required. Specify which group's parameters to use (1 to num_groups).") + stop( + "Argument 'group' is required. ", + "Specify which group's parameters ", + "to use (1 to num_groups)." + ) } arguments = extract_arguments(object) num_groups = arguments$num_groups - if(!is.numeric(group) || length(group) != 1 || is.na(group) || - group < 1 || group > num_groups) { - stop(sprintf("Argument 'group' must be an integer between 1 and %d.", num_groups)) + invalid_group = !is.numeric(group) || length(group) != 1 || + is.na(group) || group < 1 || group > num_groups + if(invalid_group) { + stop(sprintf( + "Argument 'group' must be an integer between 1 and %d.", + num_groups + )) } group = as.integer(group) # Validate newdata if(missing(newdata)) { - stop("Argument 'newdata' is required. Provide the data for which to compute predictions.") + stop( + "Argument 'newdata' is required. ", + "Provide the data for which to ", + "compute predictions." + ) } if(!inherits(newdata, "matrix") && !inherits(newdata, "data.frame")) { @@ -1290,12 +1376,12 @@ predict.bgmCompare = function(object, num_categories = arguments$num_categories is_ordinal = arguments$is_ordinal_variable data_columnnames = arguments$data_columnnames - projection = arguments$projection # Validate dimensions if(ncol(newdata) != num_variables) { stop(paste0( - "'newdata' must have ", num_variables, " columns (same as fitted model), ", + "'newdata' must have ", num_variables, + " columns (same as fitted model), ", "but has ", ncol(newdata), "." )) } @@ -1315,7 +1401,13 @@ predict.bgmCompare = function(object, } else if(is.character(variables)) { predict_vars = match(variables, data_columnnames) if(anyNA(predict_vars)) { - stop("Variable names not found: ", paste(variables[is.na(predict_vars)], collapse = ", ")) + stop( + "Variable names not found: ", + paste( + variables[is.na(predict_vars)], + collapse = ", " + ) + ) } } else { predict_vars = as.integer(variables) @@ -1325,7 +1417,9 @@ predict.bgmCompare = function(object, } # Recode data to 0-based integers - newdata_recoded = recode_data_for_prediction(newdata, num_categories, is_ordinal) + newdata_recoded = recode_data_for_prediction( + newdata, num_categories, is_ordinal + ) if(method == "posterior-mean") { # Extract group-specific parameters using projection @@ -1396,7 +1490,9 @@ predict.bgmCompare = function(object, # ============================================================================== # Helper function to reconstruct threshold matrix from flat vector -reconstruct_main = function(main_vec, num_variables, num_categories, variable_type) { +reconstruct_main = function(main_vec, num_variables, + num_categories, + variable_type) { if(length(variable_type) == 1) { variable_type = rep(variable_type, num_variables) } @@ -1469,7 +1565,7 @@ reconstruct_precision = function(posterior_mean_pairwise, posterior_mean_main) { # @param p Number of variables. # # @return p x p precision matrix (Omega). -reconstruct_precision_from_draw = function(pairwise_vec, main_vec, p) { +build_precision_from_draw = function(pairwise_vec, main_vec, p) { omega = matrix(0, nrow = p, ncol = p) omega[lower.tri(omega)] = pairwise_vec omega = omega + t(omega) @@ -1514,7 +1610,9 @@ predict_bgms_ggm = function(object, newdata, predict_vars, data_columnnames, names(result) = data_columnnames[predict_vars] for(v in seq_along(result)) { colnames(result[[v]]) = c("mean", "sd") - result[[v]][, "mean"] = result[[v]][, "mean"] + newdata_means[predict_vars[v]] + result[[v]][, "mean"] = + result[[v]][, "mean"] + + newdata_means[predict_vars[v]] } } else { # Use posterior samples @@ -1535,7 +1633,7 @@ predict_bgms_ggm = function(object, newdata, predict_vars, data_columnnames, for(i in seq_len(ndraws)) { idx = draw_indices[i] - omega = reconstruct_precision_from_draw( + omega = build_precision_from_draw( pairwise_vec = pairwise_samples[idx, ], main_vec = main_samples[idx, ], p = num_variables @@ -1713,7 +1811,7 @@ simulate_bgms_mixed = function(object, nsim, seed, method, ndraws, } if(method == "posterior-mean") { - params = reconstruct_mixed_params_from_means(object, arguments) + params = build_mixed_params_mean(object, arguments) seed = check_seed(seed) @@ -1733,7 +1831,6 @@ simulate_bgms_mixed = function(object, nsim, seed, method, ndraws, out = combine_mixed_result(result, disc_idx, cont_idx, data_columnnames) return(out) - } else { sample_info = split_mixed_raw_samples(object, arguments) @@ -1833,8 +1930,10 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, } else if(!is.na(cont_match)) { internal_predict_vars[k] = p + cont_match - 1L } else { - stop("Variable index ", orig_col, - " not found in discrete or continuous indices.") + stop( + "Variable index ", orig_col, + " not found in discrete or continuous indices." + ) } } @@ -1855,7 +1954,7 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, } if(method == "posterior-mean") { - params = reconstruct_mixed_params_from_means(object, arguments) + params = build_mixed_params_mean(object, arguments) raw_result = compute_one_draw( params$Kxx, params$Kxy, params$Kyy, params$mux, params$muy ) @@ -1874,7 +1973,7 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, all_results = vector("list", ndraws) for(i in seq_len(ndraws)) { - params_i = reconstruct_mixed_params_from_row( + params_i = build_mixed_params_row( sample_info, draw_indices[i], p, q, num_categories, is_ordinal ) all_results[[i]] = compute_one_draw( @@ -1909,8 +2008,10 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, } if(type == "response") { - return(format_mixed_response(probs, predict_vars, internal_predict_vars, - p, data_columnnames)) + return(format_mixed_response( + probs, predict_vars, internal_predict_vars, + p, data_columnnames + )) } return(probs) @@ -1922,7 +2023,7 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, # ============================================================================== # ------------------------------------------------------------------ -# reconstruct_mixed_params_from_means +# build_mixed_params_mean # ------------------------------------------------------------------ # Reconstruct Kxx, Kxy, Kyy, mux, muy from posterior mean summaries. # @@ -1931,13 +2032,11 @@ predict_bgms_mixed = function(object, newdata, predict_vars, arguments, # # Returns: list with Kxx, Kxy, Kyy, mux, muy. # ------------------------------------------------------------------ -reconstruct_mixed_params_from_means = function(object, arguments) { +build_mixed_params_mean = function(object, arguments) { p = arguments$num_discrete q = arguments$num_continuous disc_idx = arguments$discrete_indices cont_idx = arguments$continuous_indices - num_categories = arguments$num_categories - is_ordinal = arguments$is_ordinal pmat = object$posterior_mean_pairwise @@ -2064,7 +2163,7 @@ split_mixed_raw_samples = function(object, arguments) { # ------------------------------------------------------------------ -# reconstruct_mixed_params_from_row +# build_mixed_params_row # ------------------------------------------------------------------ # Reconstruct Kxx, Kxy, Kyy, mux, muy from a single row of split # sample matrices (used by predict posterior-sample). @@ -2078,9 +2177,9 @@ split_mixed_raw_samples = function(object, arguments) { # # Returns: list with Kxx, Kxy, Kyy, mux, muy. # ------------------------------------------------------------------ -reconstruct_mixed_params_from_row = function(sample_info, row_idx, - p, q, num_categories, - is_ordinal) { +build_mixed_params_row = function(sample_info, row_idx, + p, q, num_categories, + is_ordinal) { mux_vec = sample_info$mux_samples[row_idx, ] num_params_disc = ifelse(is_ordinal, num_categories, 2L) max_cats = max(num_params_disc) diff --git a/src/bgmCompare/bgmCompare_helper.cpp b/src/bgmCompare/bgmCompare_helper.cpp index 9f7ee37d..9f87246a 100644 --- a/src/bgmCompare/bgmCompare_helper.cpp +++ b/src/bgmCompare/bgmCompare_helper.cpp @@ -5,33 +5,31 @@ -/** - * Computes group-specific main effects for a given variable (bgmCompare model). - * - * For a variable, the main-effect parameters are stored with: - * - One "baseline" column (shared across groups). - * - Additional columns for group-specific deviations. - * - * This function extracts the rows corresponding to the variable’s categories - * and combines them with the group projection vector to yield the - * group-specific main effects. - * - * Inputs: - * - variable: Index of the variable of interest. - * - num_groups: Number of groups in the model. - * - main_effects: Matrix of main-effect parameters for all variables. - * - main_effect_indices: Index matrix giving [start_row, end_row] for each variable. - * - proj_group: Projection vector selecting the group (length = num_groups − 1). - * - * Returns: - * - A vector of group-specific main effects for the categories of the variable. - * - * Notes: - * - The projection vector should match the encoding used for group effects - * (e.g. dummy or contrast coding). - * - This function is used in likelihood evaluations where group-specific - * parameters are required. - */ +// Computes group-specific main effects for a given variable (bgmCompare model). +// +// For a variable, the main-effect parameters are stored with: +// - One "baseline" column (shared across groups). +// - Additional columns for group-specific deviations. +// +// This function extracts the rows corresponding to the variable’s categories +// and combines them with the group projection vector to yield the +// group-specific main effects. +// +// Inputs: +// - variable: Index of the variable of interest. +// - num_groups: Number of groups in the model. +// - main_effects: Matrix of main-effect parameters for all variables. +// - main_effect_indices: Index matrix giving [start_row, end_row] for each variable. +// - proj_group: Projection vector selecting the group (length = num_groups − 1). +// +// Returns: +// - A vector of group-specific main effects for the categories of the variable. +// +// Notes: +// - The projection vector should match the encoding used for group effects +// (e.g. dummy or contrast coding). +// - This function is used in likelihood evaluations where group-specific +// parameters are required. arma::vec compute_group_main_effects( const int variable, const int num_groups, @@ -57,33 +55,31 @@ arma::vec compute_group_main_effects( -/** - * Computes the group-specific pairwise effect for a variable pair (bgmCompare model). - * - * For each variable pair, the pairwise-effect parameters are stored with: - * - One "baseline" column (shared across groups). - * - Additional columns for group-specific deviations. - * - * This function extracts the baseline effect and, if the edge is active - * (per the inclusion indicator), adds the group-specific deviation obtained - * from the projection vector. - * - * Inputs: - * - var1, var2: Indices of the two variables forming the pair. - * - num_groups: Number of groups in the model. - * - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs). - * - pairwise_effect_indices: Lookup matrix mapping (var1, var2) → row index. - * - inclusion_indicator: Symmetric binary matrix of active edges. - * - proj_group: Projection vector selecting the group (length = num_groups − 1). - * - * Returns: - * - The group-specific pairwise effect for (var1, var2). - * - * Notes: - * - The index matrix must match the storage convention (typically var1 < var2). - * - If `inclusion_indicator(var1, var2) == 0`, only the baseline effect is used. - * - This function is used in likelihood evaluations and Gibbs updates. - */ +// Computes the group-specific pairwise effect for a variable pair (bgmCompare model). +// +// For each variable pair, the pairwise-effect parameters are stored with: +// - One "baseline" column (shared across groups). +// - Additional columns for group-specific deviations. +// +// This function extracts the baseline effect and, if the edge is active +// (per the inclusion indicator), adds the group-specific deviation obtained +// from the projection vector. +// +// Inputs: +// - var1, var2: Indices of the two variables forming the pair. +// - num_groups: Number of groups in the model. +// - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs). +// - pairwise_effect_indices: Lookup matrix mapping (var1, var2) → row index. +// - inclusion_indicator: Symmetric binary matrix of active edges. +// - proj_group: Projection vector selecting the group (length = num_groups − 1). +// +// Returns: +// - The group-specific pairwise effect for (var1, var2). +// +// Notes: +// - The index matrix must match the storage convention (typically var1 < var2). +// - If `inclusion_indicator(var1, var2) == 0`, only the baseline effect is used. +// - This function is used in likelihood evaluations and Gibbs updates. double compute_group_pairwise_effects( const int var1, const int var2, @@ -111,36 +107,34 @@ double compute_group_pairwise_effects( -/** - * Flattens main-effect and pairwise-effect parameters into a single vector (bgmCompare model). - * - * Layout of the output vector: - * 1. Main-effect overall parameters (column 0 of main_effects), stacked by variable. - * 2. Pairwise-effect overall parameters (column 0 of pairwise_effects), stacked by pair. - * 3. Main-effect group differences (columns 1..G-1), included only if - * the variable is marked active in inclusion_indicator(v,v). - * 4. Pairwise-effect group differences (columns 1..G-1), included only if - * the pair is marked active in inclusion_indicator(v1,v2). - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). - * - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - num_categories: Number of categories per variable. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - * Returns: - * - A flat vector of parameters containing overall effects and (if active) group differences. - * - * Notes: - * - The order of pairs in `pairwise_effects` must match the upper-triangle order - * of (var1,var2) pairs as constructed in R. - * - The length of the output vector depends on both the number of groups - * and the active entries in inclusion_indicator. - * - This function is the inverse of `unvectorize_model_parameters_bgmcompare()`. - */ +// Flattens main-effect and pairwise-effect parameters into a single vector (bgmCompare model). +// +// Layout of the output vector: +// 1. Main-effect overall parameters (column 0 of main_effects), stacked by variable. +// 2. Pairwise-effect overall parameters (column 0 of pairwise_effects), stacked by pair. +// 3. Main-effect group differences (columns 1..G-1), included only if +// the variable is marked active in inclusion_indicator(v,v). +// 4. Pairwise-effect group differences (columns 1..G-1), included only if +// the pair is marked active in inclusion_indicator(v1,v2). +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). +// - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - num_categories: Number of categories per variable. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// +// Returns: +// - A flat vector of parameters containing overall effects and (if active) group differences. +// +// Notes: +// - The order of pairs in `pairwise_effects` must match the upper-triangle order +// of (var1,var2) pairs as constructed in R. +// - The length of the output vector depends on both the number of groups +// and the active entries in inclusion_indicator. +// - This function is the inverse of `unvectorize_model_parameters_bgmcompare()`. arma::vec vectorize_model_parameters_bgmcompare( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -217,38 +211,36 @@ arma::vec vectorize_model_parameters_bgmcompare( -/** - * Reconstructs main-effect and pairwise-effect matrices from a flat parameter vector (bgmCompare model). - * - * The input vector must follow the layout produced by `vectorize_model_parameters_bgmcompare()`: - * 1. Main-effect overall parameters (column 0 of main_effects), stacked by variable. - * 2. Pairwise-effect overall parameters (column 0 of pairwise_effects), stacked by pair. - * 3. Main-effect group differences (columns 1..G-1), included only if - * the variable is active in inclusion_indicator(v,v). - * 4. Pairwise-effect group differences (columns 1..G-1), included only if - * the pair is active in inclusion_indicator(v1,v2). - * - * Inputs: - * - param_vec: Flattened parameter vector. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - num_groups: Number of groups (columns in main_effects / pairwise_effects). - * - num_categories: Number of categories per variable. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - * Outputs: - * - main_effects_out: Matrix of main-effect parameters (rows = categories, cols = groups). - * - pairwise_effects_out: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). - * - * Notes: - * - The vector must have exactly the length returned by `vectorize_model_parameters_bgmcompare()`. - * - Diagonal entries in `inclusion_indicator` determine whether main-effect - * group differences are included. - * - Off-diagonal entries in `inclusion_indicator` determine whether - * pairwise-effect group differences are included. - * - This function is the inverse of `vectorize_model_parameters_bgmcompare()`. - */ +// Reconstructs main-effect and pairwise-effect matrices from a flat parameter vector (bgmCompare model). +// +// The input vector must follow the layout produced by `vectorize_model_parameters_bgmcompare()`: +// 1. Main-effect overall parameters (column 0 of main_effects), stacked by variable. +// 2. Pairwise-effect overall parameters (column 0 of pairwise_effects), stacked by pair. +// 3. Main-effect group differences (columns 1..G-1), included only if +// the variable is active in inclusion_indicator(v,v). +// 4. Pairwise-effect group differences (columns 1..G-1), included only if +// the pair is active in inclusion_indicator(v1,v2). +// +// Inputs: +// - param_vec: Flattened parameter vector. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - num_groups: Number of groups (columns in main_effects / pairwise_effects). +// - num_categories: Number of categories per variable. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// +// Outputs: +// - main_effects_out: Matrix of main-effect parameters (rows = categories, cols = groups). +// - pairwise_effects_out: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). +// +// Notes: +// - The vector must have exactly the length returned by `vectorize_model_parameters_bgmcompare()`. +// - Diagonal entries in `inclusion_indicator` determine whether main-effect +// group differences are included. +// - Off-diagonal entries in `inclusion_indicator` determine whether +// pairwise-effect group differences are included. +// - This function is the inverse of `vectorize_model_parameters_bgmcompare()`. void unvectorize_model_parameters_bgmcompare( const arma::vec& param_vec, arma::mat& main_effects_out, // [n_main_rows × G] @@ -314,44 +306,42 @@ void unvectorize_model_parameters_bgmcompare( -/** - * Builds index maps linking matrix entries to positions in the vectorized parameter vector (bgmCompare model). - * - * The index maps are used to quickly locate where each parameter (main-effect or pairwise-effect, - * across groups) sits inside the flattened parameter vector produced by - * `vectorize_model_parameters_bgmcompare()`. - * - * Layout: - * 1. Main-effect overall parameters (col 0). - * 2. Pairwise-effect overall parameters (col 0). - * 3. Main-effect group differences (cols 1..G-1), included only if - * the variable is active in inclusion_indicator(v,v). - * 4. Pairwise-effect group differences (cols 1..G-1), included only if - * the pair is active in inclusion_indicator(v1,v2). - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (used for dimension info). - * - pairwise_effects: Matrix of pairwise-effect parameters (used for dimension info). - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - num_categories: Number of categories per variable. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - * Returns: - * - A pair of integer matrices: - * * main_index: [num_main × num_groups], with each entry giving the position - * in the parameter vector for that main-effect parameter (or -1 if inactive). - * * pair_index: [num_pair × num_groups], with each entry giving the position - * in the parameter vector for that pairwise-effect parameter (or -1 if inactive). - * - * Notes: - * - Entries are set to -1 when the corresponding parameter is inactive. - * - The returned index maps must always be consistent with the ordering used - * in vectorization/unvectorization. - * - A final check (e.g. verifying that `off == param_vec.n_elem`) can help - * catch mismatches between index maps and vectorizer logic. - */ +// Builds index maps linking matrix entries to positions in the vectorized parameter vector (bgmCompare model). +// +// The index maps are used to quickly locate where each parameter (main-effect or pairwise-effect, +// across groups) sits inside the flattened parameter vector produced by +// `vectorize_model_parameters_bgmcompare()`. +// +// Layout: +// 1. Main-effect overall parameters (col 0). +// 2. Pairwise-effect overall parameters (col 0). +// 3. Main-effect group differences (cols 1..G-1), included only if +// the variable is active in inclusion_indicator(v,v). +// 4. Pairwise-effect group differences (cols 1..G-1), included only if +// the pair is active in inclusion_indicator(v1,v2). +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (used for dimension info). +// - pairwise_effects: Matrix of pairwise-effect parameters (used for dimension info). +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - num_categories: Number of categories per variable. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// +// Returns: +// - A pair of integer matrices: +// * main_index: [num_main × num_groups], with each entry giving the position +// in the parameter vector for that main-effect parameter (or -1 if inactive). +// * pair_index: [num_pair × num_groups], with each entry giving the position +// in the parameter vector for that pairwise-effect parameter (or -1 if inactive). +// +// Notes: +// - Entries are set to -1 when the corresponding parameter is inactive. +// - The returned index maps must always be consistent with the ordering used +// in vectorization/unvectorization. +// - A final check (e.g. verifying that `off == param_vec.n_elem`) can help +// catch mismatches between index maps and vectorizer logic. std::pair build_index_maps( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -411,37 +401,35 @@ std::pair build_index_maps( -/** - * Extracts entries of the inverse mass matrix corresponding to active parameters (bgmCompare model). - * - * If `selection` is false, the full diagonal vector is returned unchanged. - * If `selection` is true, the output is restricted to: - * 1. Main-effect overall parameters (column 0). - * 2. Pairwise-effect overall parameters (column 0). - * 3. Main-effect group differences (columns 1..G-1) for variables with - * inclusion_indicator(v,v) == 1. - * 4. Pairwise-effect group differences (columns 1..G-1) for pairs with - * inclusion_indicator(v1,v2) == 1. - * - * Inputs: - * - inv_diag: Full inverse mass diagonal (length = all parameters). - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - num_groups: Number of groups. - * - num_categories: Number of categories per variable. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - main_index: Index map for main effects (from build_index_maps()). - * - pair_index: Index map for pairwise effects (from build_index_maps()). - * - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - selection: If true, restrict to active parameters; if false, return full inv_diag. - * - * Returns: - * - A vector containing inverse mass entries for active parameters only. - * - * Notes: - * - Must be consistent with the layout in `vectorize_model_parameters_bgmcompare()`. - * - Index maps (`main_index`, `pair_index`) are required to locate group-difference entries. - */ +// Extracts entries of the inverse mass matrix corresponding to active parameters (bgmCompare model). +// +// If `selection` is false, the full diagonal vector is returned unchanged. +// If `selection` is true, the output is restricted to: +// 1. Main-effect overall parameters (column 0). +// 2. Pairwise-effect overall parameters (column 0). +// 3. Main-effect group differences (columns 1..G-1) for variables with +// inclusion_indicator(v,v) == 1. +// 4. Pairwise-effect group differences (columns 1..G-1) for pairs with +// inclusion_indicator(v1,v2) == 1. +// +// Inputs: +// - inv_diag: Full inverse mass diagonal (length = all parameters). +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - num_groups: Number of groups. +// - num_categories: Number of categories per variable. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - main_index: Index map for main effects (from build_index_maps()). +// - pair_index: Index map for pairwise effects (from build_index_maps()). +// - main_effect_indices: Index ranges [row_start, row_end] for each variable in main_effects. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - selection: If true, restrict to active parameters; if false, return full inv_diag. +// +// Returns: +// - A vector containing inverse mass entries for active parameters only. +// +// Notes: +// - Must be consistent with the layout in `vectorize_model_parameters_bgmcompare()`. +// - Index maps (`main_index`, `pair_index`) are required to locate group-difference entries. arma::vec inv_mass_active( const arma::vec& inv_diag, const arma::imat& inclusion_indicator, diff --git a/src/bgmCompare/bgmCompare_logp_and_grad.cpp b/src/bgmCompare/bgmCompare_logp_and_grad.cpp index 49bb780d..3e8b0aac 100644 --- a/src/bgmCompare/bgmCompare_logp_and_grad.cpp +++ b/src/bgmCompare/bgmCompare_logp_and_grad.cpp @@ -8,34 +8,32 @@ -/** - * Compute the total length of the parameter vector in the bgmCompare model. - * - * The parameter vector consists of: - * 1. Main-effect overall parameters (column 0). - * 2. Pairwise-effect overall parameters (column 0). - * 3. Main-effect group-difference parameters (columns 1..G-1) for variables - * with inclusion_indicator(v,v) == 1. - * 4. Pairwise-effect group-difference parameters (columns 1..G-1) for pairs - * with inclusion_indicator(v1,v2) == 1. - * - * Inputs: - * - num_variables: Number of observed variables. - * - main_effect_indices: Row ranges [start,end] in main_effects for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - inclusion_indicator: Symmetric binary matrix; diagonal entries control main-effect - * differences, off-diagonal entries control pairwise-effect differences. - * - num_categories: Vector of category counts per variable. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel) for each variable. - * - num_groups: Number of groups in the model. - * - * Returns: - * - arma::uword: Total number of parameters in the vectorized model. - * - * Notes: - * - This function must be consistent with vectorize_model_parameters_bgmcompare(). - * - Used to allocate gradient vectors, prior vectors, and mass matrices. - */ +// Compute the total length of the parameter vector in the bgmCompare model. +// +// The parameter vector consists of: +// 1. Main-effect overall parameters (column 0). +// 2. Pairwise-effect overall parameters (column 0). +// 3. Main-effect group-difference parameters (columns 1..G-1) for variables +// with inclusion_indicator(v,v) == 1. +// 4. Pairwise-effect group-difference parameters (columns 1..G-1) for pairs +// with inclusion_indicator(v1,v2) == 1. +// +// Inputs: +// - num_variables: Number of observed variables. +// - main_effect_indices: Row ranges [start,end] in main_effects for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - inclusion_indicator: Symmetric binary matrix; diagonal entries control main-effect +// differences, off-diagonal entries control pairwise-effect differences. +// - num_categories: Vector of category counts per variable. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel) for each variable. +// - num_groups: Number of groups in the model. +// +// Returns: +// - arma::uword: Total number of parameters in the vectorized model. +// +// Notes: +// - This function must be consistent with vectorize_model_parameters_bgmcompare(). +// - Used to allocate gradient vectors, prior vectors, and mass matrices. arma::uword total_length( const int num_variables, const arma::imat& main_effect_indices, @@ -71,49 +69,47 @@ arma::uword total_length( -/** - * Compute the observed-data contribution to the gradient vector - * in the bgmCompare model (active parameterization). - * - * This function accumulates observed sufficient statistics from the data - * and projects them into the parameter vector space. The output has the - * same length and ordering as `vectorize_model_parameters_bgmcompare()`, - * and includes: - * 1. Main-effect overall parameters (column 0). - * 2. Pairwise-effect overall parameters (column 0). - * 3. Main-effect group-difference parameters (columns 1..G-1) if - * inclusion_indicator(v,v) == 1. - * 4. Pairwise-effect group-difference parameters (columns 1..G-1) if - * inclusion_indicator(v1,v2) == 1. - * - * Inputs: - * - main_effect_indices: Row ranges [start,end] in main_effects for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Matrix of size (num_groups × (num_groups-1)) containing group projections. - * - observations: Matrix of observed variable values (N × V). - * - group_indices: Index ranges [start,end] defining which rows in `observations` - * belong to each group. - * - num_categories: Vector giving the number of categories per variable. - * - inclusion_indicator: Symmetric binary matrix; diagonal entries control inclusion - * of main-effect differences, off-diagonal entries control inclusion of pairwise - * differences. - * - counts_per_category_group: Per-group category count tables (list of matrices). - * - blume_capel_stats_group: Per-group Blume–Capel sufficient statistics (list of matrices). - * - pairwise_stats_group: Per-group pairwise sufficient statistics (list of matrices). - * - num_groups: Number of groups. - * - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel) per variable. - * - baseline_category: Vector of baseline categories per variable (Blume–Capel). - * - main_index: Index map for main effects (from build_index_maps()). - * - pair_index: Index map for pairwise effects (from build_index_maps()). - * - * Returns: - * - arma::vec: Observed-data contribution to the gradient (length = total_length()). - * - * Notes: - * - This function computes the *data-dependent* part of the gradient only; - * parameter-dependent expected statistics and priors must be added separately. - * - The output ordering must remain consistent with `vectorize_model_parameters_bgmcompare()`. - */ +// Compute the observed-data contribution to the gradient vector +// in the bgmCompare model (active parameterization). +// +// This function accumulates observed sufficient statistics from the data +// and projects them into the parameter vector space. The output has the +// same length and ordering as `vectorize_model_parameters_bgmcompare()`, +// and includes: +// 1. Main-effect overall parameters (column 0). +// 2. Pairwise-effect overall parameters (column 0). +// 3. Main-effect group-difference parameters (columns 1..G-1) if +// inclusion_indicator(v,v) == 1. +// 4. Pairwise-effect group-difference parameters (columns 1..G-1) if +// inclusion_indicator(v1,v2) == 1. +// +// Inputs: +// - main_effect_indices: Row ranges [start,end] in main_effects for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Matrix of size (num_groups × (num_groups-1)) containing group projections. +// - observations: Matrix of observed variable values (N × V). +// - group_indices: Index ranges [start,end] defining which rows in `observations` +// belong to each group. +// - num_categories: Vector giving the number of categories per variable. +// - inclusion_indicator: Symmetric binary matrix; diagonal entries control inclusion +// of main-effect differences, off-diagonal entries control inclusion of pairwise +// differences. +// - counts_per_category_group: Per-group category count tables (list of matrices). +// - blume_capel_stats_group: Per-group Blume–Capel sufficient statistics (list of matrices). +// - pairwise_stats_group: Per-group pairwise sufficient statistics (list of matrices). +// - num_groups: Number of groups. +// - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel) per variable. +// - baseline_category: Vector of baseline categories per variable (Blume–Capel). +// - main_index: Index map for main effects (from build_index_maps()). +// - pair_index: Index map for pairwise effects (from build_index_maps()). +// +// Returns: +// - arma::vec: Observed-data contribution to the gradient (length = total_length()). +// +// Notes: +// - This function computes the *data-dependent* part of the gradient only; +// parameter-dependent expected statistics and priors must be added separately. +// - The output ordering must remain consistent with `vectorize_model_parameters_bgmcompare()`. arma::vec gradient_observed_active( const arma::imat& main_effect_indices, const arma::imat& pairwise_effect_indices, @@ -218,63 +214,61 @@ arma::vec gradient_observed_active( -/** - * Computes the gradient of the log pseudoposterior for the bgmCompare model. - * - * The gradient combines three contributions: - * 1. Observed sufficient statistics (precomputed and supplied via `grad_obs`). - * 2. Expected sufficient statistics under the current parameter values - * (computed using softmax probabilities for ordinal or Blume–Capel variables). - * 3. Prior contributions on main effects, pairwise effects, and group differences. - * - * Procedure: - * - Initialize gradient with `grad_obs` (observed-data contribution). - * - Loop over groups: - * * Build group-specific main and pairwise effects using - * `compute_group_main_effects()` and `compute_group_pairwise_effects()`. - * * Compute expected sufficient statistics from residual scores and - * subtract them from the gradient. - * - Add prior contributions: - * * Logistic–Beta prior gradient for main-effect baseline parameters. - * * Cauchy prior gradient for group-difference parameters and pairwise effects. - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). - * - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). - * - main_effect_indices: Index ranges [row_start,row_end] for each variable in main_effects. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations_double: Observation matrix (N × V), pre-converted to double. - * - group_indices: Row ranges [start,end] for each group in `observations_double`. - * - num_categories: Number of categories per variable. - * - counts_per_category_group: Per-group category counts (ordinal variables). - * - blume_capel_stats_group: Per-group sufficient statistics (Blume–Capel variables). - * - pairwise_stats_group: Per-group pairwise sufficient statistics. - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix; diagonal entries control inclusion - * of main-effect differences, off-diagonal entries control inclusion of pairwise - * differences. - * - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. - * - interaction_scale: Scale parameter for Cauchy prior on baseline pairwise effects. - * - difference_scale: Scale parameter for Cauchy prior on group differences. - * - main_index: Index map for main-effect parameters (from build_index_maps()). - * - pair_index: Index map for pairwise-effect parameters (from build_index_maps()). - * - grad_obs: Precomputed observed-data contribution to the gradient - * (output of `gradient_observed_active()`). - * - * Returns: - * - arma::vec: Gradient of the log pseudoposterior with respect to all active - * parameters, in the layout defined by `vectorize_model_parameters_bgmcompare()`. - * - * Notes: - * - Must remain consistent with `vectorize_model_parameters_bgmcompare()` and - * `unvectorize_model_parameters_bgmcompare()`. - * - Expected sufficient statistics are computed on-the-fly, while observed - * statistics are passed in via `grad_obs`. - * - Priors are applied after observed and expected contributions. - */ +// Computes the gradient of the log pseudoposterior for the bgmCompare model. +// +// The gradient combines three contributions: +// 1. Observed sufficient statistics (precomputed and supplied via `grad_obs`). +// 2. Expected sufficient statistics under the current parameter values +// (computed using softmax probabilities for ordinal or Blume–Capel variables). +// 3. Prior contributions on main effects, pairwise effects, and group differences. +// +// Procedure: +// - Initialize gradient with `grad_obs` (observed-data contribution). +// - Loop over groups: +// * Build group-specific main and pairwise effects using +// `compute_group_main_effects()` and `compute_group_pairwise_effects()`. +// * Compute expected sufficient statistics from residual scores and +// subtract them from the gradient. +// - Add prior contributions: +// * Logistic–Beta prior gradient for main-effect baseline parameters. +// * Cauchy prior gradient for group-difference parameters and pairwise effects. +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). +// - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). +// - main_effect_indices: Index ranges [row_start,row_end] for each variable in main_effects. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations_double: Observation matrix (N × V), pre-converted to double. +// - group_indices: Row ranges [start,end] for each group in `observations_double`. +// - num_categories: Number of categories per variable. +// - counts_per_category_group: Per-group category counts (ordinal variables). +// - blume_capel_stats_group: Per-group sufficient statistics (Blume–Capel variables). +// - pairwise_stats_group: Per-group pairwise sufficient statistics. +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix; diagonal entries control inclusion +// of main-effect differences, off-diagonal entries control inclusion of pairwise +// differences. +// - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. +// - interaction_scale: Scale parameter for Cauchy prior on baseline pairwise effects. +// - difference_scale: Scale parameter for Cauchy prior on group differences. +// - main_index: Index map for main-effect parameters (from build_index_maps()). +// - pair_index: Index map for pairwise-effect parameters (from build_index_maps()). +// - grad_obs: Precomputed observed-data contribution to the gradient +// (output of `gradient_observed_active()`). +// +// Returns: +// - arma::vec: Gradient of the log pseudoposterior with respect to all active +// parameters, in the layout defined by `vectorize_model_parameters_bgmcompare()`. +// +// Notes: +// - Must remain consistent with `vectorize_model_parameters_bgmcompare()` and +// `unvectorize_model_parameters_bgmcompare()`. +// - Expected sufficient statistics are computed on-the-fly, while observed +// statistics are passed in via `grad_obs`. +// - Priors are applied after observed and expected contributions. arma::vec gradient( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -505,18 +499,16 @@ arma::vec gradient( } -/** - * Computes both log pseudoposterior and gradient in a single pass. - * - * Fuses the computations of `log_pseudoposterior()` and `gradient()`, - * sharing intermediate results (group-specific effects, residual matrices, - * and probability computations) to avoid redundant work during NUTS sampling. - * - * Returns: - * - std::pair containing: - * - first: log pseudoposterior value (scalar) - * - second: gradient vector (same layout as gradient()) - */ +// Computes both log pseudoposterior and gradient in a single pass. +// +// Fuses the computations of `log_pseudoposterior()` and `gradient()`, +// sharing intermediate results (group-specific effects, residual matrices, +// and probability computations) to avoid redundant work during NUTS sampling. +// +// Returns: +// - std::pair containing: +// - first: log pseudoposterior value (scalar) +// - second: gradient vector (same layout as gradient()) std::pair logp_and_gradient( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -779,54 +771,52 @@ std::pair logp_and_gradient( -/** - * Computes the log pseudoposterior contribution of a single main-effect parameter (bgmCompare model). - * - * This function isolates the contribution of one main-effect parameter, - * either the overall (baseline) effect or one of its group-specific differences. - * - * Procedure: - * - For each group: - * * Construct group-specific main effects for the selected variable - * with `compute_group_main_effects()`. - * * Construct group-specific pairwise effects for the variable. - * * Add linear contributions from sufficient statistics. - * * Subtract log normalizing constants from the group-specific likelihood. - * - Add prior contribution: - * * Logistic–Beta prior for baseline (h == 0). - * * Cauchy prior for group differences (h > 0), if included. - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). - * - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). - * - main_effect_indices: Index ranges [row_start,row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations: Observation matrix (persons × variables). - * - group_indices: Row ranges [start,end] for each group in observations. - * - num_categories: Number of categories per variable. - * - counts_per_category_group: Per-group category counts (for ordinal variables). - * - blume_capel_stats_group: Per-group sufficient statistics (for Blume–Capel variables). - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. - * - difference_scale: Scale parameter for Cauchy priors on group differences. - * - variable: Index of the variable of interest. - * - category: Category index (only used if variable is ordinal). - * - par: Parameter index (0 = linear, 1 = quadratic; used for Blume–Capel). - * - h: Column index (0 = overall baseline, >0 = group difference). - * - * Returns: - * - The scalar log pseudoposterior contribution of the selected parameter. - * - * Notes: - * - If h > 0 but inclusion_indicator(variable, variable) == 0, - * the function returns 0.0 (no contribution). - * - This component function is used in parameter-wise Metropolis updates. - * - Consistent with the full `log_pseudoposterior()` for bgmCompare. - */ +// Computes the log pseudoposterior contribution of a single main-effect parameter (bgmCompare model). +// +// This function isolates the contribution of one main-effect parameter, +// either the overall (baseline) effect or one of its group-specific differences. +// +// Procedure: +// - For each group: +// * Construct group-specific main effects for the selected variable +// with `compute_group_main_effects()`. +// * Construct group-specific pairwise effects for the variable. +// * Add linear contributions from sufficient statistics. +// * Subtract log normalizing constants from the group-specific likelihood. +// - Add prior contribution: +// * Logistic–Beta prior for baseline (h == 0). +// * Cauchy prior for group differences (h > 0), if included. +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). +// - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). +// - main_effect_indices: Index ranges [row_start,row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations: Observation matrix (persons × variables). +// - group_indices: Row ranges [start,end] for each group in observations. +// - num_categories: Number of categories per variable. +// - counts_per_category_group: Per-group category counts (for ordinal variables). +// - blume_capel_stats_group: Per-group sufficient statistics (for Blume–Capel variables). +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. +// - difference_scale: Scale parameter for Cauchy priors on group differences. +// - variable: Index of the variable of interest. +// - category: Category index (only used if variable is ordinal). +// - par: Parameter index (0 = linear, 1 = quadratic; used for Blume–Capel). +// - h: Column index (0 = overall baseline, >0 = group difference). +// +// Returns: +// - The scalar log pseudoposterior contribution of the selected parameter. +// +// Notes: +// - If h > 0 but inclusion_indicator(variable, variable) == 0, +// the function returns 0.0 (no contribution). +// - This component function is used in parameter-wise Metropolis updates. +// - Consistent with the full `log_pseudoposterior()` for bgmCompare. double log_pseudoposterior_main_component( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -959,53 +949,51 @@ double log_pseudoposterior_main_component( } -/** - * Computes the log pseudoposterior contribution of a single pairwise-effect parameter (bgmCompare model). - * - * Isolates the contribution of one pairwise-effect parameter between two variables, - * either the baseline effect (h == 0) or a group-specific difference (h > 0). - * - * Procedure: - * - For each group: - * * Construct group-specific main effects for the two variables. - * * Add linear contributions from the pairwise sufficient statistic. - * - Baseline (h == 0): contribution = 2 * suff_pair * proposed_value. - * - Difference (h > 0): scaled by projection value proj_g(h-1). - * * Subtract log normalizing constants from both variables' likelihoods. - * - Add prior contribution: - * * Cauchy prior for baseline (scale = interaction_scale). - * * Cauchy prior for group differences (scale = difference_scale). - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). - * - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). - * - main_effect_indices: Index ranges [row_start, row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1, var2) to row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations: Observation matrix (persons × variables). - * - group_indices: Row ranges [start, end] for each group in observations. - * - num_categories: Number of categories per variable. - * - pairwise_stats_group: Per-group pairwise sufficient statistics. - * - residual_matrices: Per-group residual matrices (persons × variables). - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - interaction_scale: Scale parameter for Cauchy prior on baseline pairwise effects. - * - pairwise_scaling_factors: Per-pair scaling factors for the prior. - * - difference_scale: Scale parameter for Cauchy prior on group differences. - * - variable1, variable2: Indices of the variable pair. - * - h: Column index (0 = baseline, > 0 = group difference). - * - delta: Parameter change (proposed - current). - * - * Returns: - * - The log pseudoposterior value at the proposed state. - * - * Notes: - * - If h > 0 but inclusion_indicator(variable1, variable2) == 0, returns 0.0. - * - The proposed value is computed as pairwise_effects(idx, h) + delta. - * - Residual scores are adjusted by delta without modifying residual_matrices. - */ +// Computes the log pseudoposterior contribution of a single pairwise-effect parameter (bgmCompare model). +// +// Isolates the contribution of one pairwise-effect parameter between two variables, +// either the baseline effect (h == 0) or a group-specific difference (h > 0). +// +// Procedure: +// - For each group: +// * Construct group-specific main effects for the two variables. +// * Add linear contributions from the pairwise sufficient statistic. +// - Baseline (h == 0): contribution = 2 * suff_pair * proposed_value. +// - Difference (h > 0): scaled by projection value proj_g(h-1). +// * Subtract log normalizing constants from both variables' likelihoods. +// - Add prior contribution: +// * Cauchy prior for baseline (scale = interaction_scale). +// * Cauchy prior for group differences (scale = difference_scale). +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (rows = categories, cols = groups). +// - pairwise_effects: Matrix of pairwise-effect parameters (rows = pairs, cols = groups). +// - main_effect_indices: Index ranges [row_start, row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1, var2) to row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations: Observation matrix (persons × variables). +// - group_indices: Row ranges [start, end] for each group in observations. +// - num_categories: Number of categories per variable. +// - pairwise_stats_group: Per-group pairwise sufficient statistics. +// - residual_matrices: Per-group residual matrices (persons × variables). +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - interaction_scale: Scale parameter for Cauchy prior on baseline pairwise effects. +// - pairwise_scaling_factors: Per-pair scaling factors for the prior. +// - difference_scale: Scale parameter for Cauchy prior on group differences. +// - variable1, variable2: Indices of the variable pair. +// - h: Column index (0 = baseline, > 0 = group difference). +// - delta: Parameter change (proposed - current). +// +// Returns: +// - The log pseudoposterior value at the proposed state. +// +// Notes: +// - If h > 0 but inclusion_indicator(variable1, variable2) == 0, returns 0.0. +// - The proposed value is computed as pairwise_effects(idx, h) + delta. +// - Residual scores are adjusted by delta without modifying residual_matrices. double log_pseudoposterior_pair_component( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -1113,49 +1101,47 @@ double log_pseudoposterior_pair_component( -/** - * Computes the log-ratio of pseudolikelihood normalizing constants - * for a single variable under current vs. proposed parameters (bgmCompare model). - * - * This function is used in Metropolis–Hastings updates for main-effect parameters. - * It evaluates how the normalizing constant (denominator of the pseudolikelihood) - * changes when switching from the current to the proposed parameter values. - * - * Procedure: - * - For each group: - * * Construct group-specific main effects (current vs. proposed). - * * Construct group-specific pairwise weights for the variable. - * * Compute residual scores for observations under both models. - * * Calculate denominators with stability bounds (ordinal vs. Blume–Capel cases). - * * Accumulate the log-ratio contribution across all observations. - * - * Inputs: - * - current_main_effects, proposed_main_effects: Matrices of main-effect parameters - * (rows = categories, cols = groups). - * - current_pairwise_effects, proposed_pairwise_effects: Matrices of pairwise-effect parameters - * (rows = pairs, cols = groups). - * - main_effect_indices: Index ranges [row_start,row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations: Observation matrix (persons × variables). - * - group_indices: Row ranges [start,end] for each group in observations. - * - num_categories: Number of categories per variable. - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - variable: Index of the variable being updated. - * - * Returns: - * - The scalar log-ratio of pseudolikelihood constants - * (current model vs. proposed model). - * - * Notes: - * - For ordinal variables, denominators include exp(-bound) and category terms. - * - For Blume–Capel variables, denominators use linear/quadratic scores - * with baseline centering. - * - Stability bounds (`bound_current`, `bound_proposed`) are applied to avoid overflow. - */ +// Computes the log-ratio of pseudolikelihood normalizing constants +// for a single variable under current vs. proposed parameters (bgmCompare model). +// +// This function is used in Metropolis–Hastings updates for main-effect parameters. +// It evaluates how the normalizing constant (denominator of the pseudolikelihood) +// changes when switching from the current to the proposed parameter values. +// +// Procedure: +// - For each group: +// * Construct group-specific main effects (current vs. proposed). +// * Construct group-specific pairwise weights for the variable. +// * Compute residual scores for observations under both models. +// * Calculate denominators with stability bounds (ordinal vs. Blume–Capel cases). +// * Accumulate the log-ratio contribution across all observations. +// +// Inputs: +// - current_main_effects, proposed_main_effects: Matrices of main-effect parameters +// (rows = categories, cols = groups). +// - current_pairwise_effects, proposed_pairwise_effects: Matrices of pairwise-effect parameters +// (rows = pairs, cols = groups). +// - main_effect_indices: Index ranges [row_start,row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations: Observation matrix (persons × variables). +// - group_indices: Row ranges [start,end] for each group in observations. +// - num_categories: Number of categories per variable. +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - variable: Index of the variable being updated. +// +// Returns: +// - The scalar log-ratio of pseudolikelihood constants +// (current model vs. proposed model). +// +// Notes: +// - For ordinal variables, denominators include exp(-bound) and category terms. +// - For Blume–Capel variables, denominators use linear/quadratic scores +// with baseline centering. +// - Stability bounds (`bound_current`, `bound_proposed`) are applied to avoid overflow. double log_ratio_pseudolikelihood_constant_variable( const arma::mat& current_main_effects, const arma::mat& current_pairwise_effects, @@ -1256,50 +1242,48 @@ double log_ratio_pseudolikelihood_constant_variable( -/** - * Computes the log pseudolikelihood ratio for updating a single main-effect parameter (bgmCompare model). - * - * This function is used in Metropolis–Hastings updates for main effects. - * It compares the likelihood of the data under the current vs. proposed - * value of a single variable’s main-effect parameter, while keeping - * all other parameters fixed. - * - * Procedure: - * - For each group: - * * Compute group-specific main effects for the variable (current vs. proposed). - * * Add contributions from observed sufficient statistics - * (category counts or Blume–Capel stats). - * - Add the ratio of pseudolikelihood normalizing constants by calling - * `log_ratio_pseudolikelihood_constant_variable()`. - * - * Inputs: - * - current_main_effects: Matrix of main-effect parameters (current state). - * - proposed_main_effects: Matrix of main-effect parameters (candidate state). - * - current_pairwise_effects: Matrix of pairwise-effect parameters (fixed at current state). - * - main_effect_indices: Index ranges [row_start,row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations: Observation matrix (persons × variables). - * - group_indices: Row ranges [start,end] for each group in observations. - * - num_categories: Number of categories per variable. - * - counts_per_category_group: Per-group category counts (for ordinal variables). - * - blume_capel_stats_group: Per-group sufficient statistics (for Blume–Capel variables). - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - variable: Index of the variable being updated. - * - * Returns: - * - The scalar log pseudolikelihood ratio (proposed vs. current). - * - * Notes: - * - A temporary copy of `inclusion_indicator` is made to ensure the - * variable’s self-term (diagonal entry) is included. - * - Only the variable under update changes between current and proposed states; - * all other variables and pairwise effects remain fixed. - * - This function does not add prior contributions — only pseudolikelihood terms. - */ +// Computes the log pseudolikelihood ratio for updating a single main-effect parameter (bgmCompare model). +// +// This function is used in Metropolis–Hastings updates for main effects. +// It compares the likelihood of the data under the current vs. proposed +// value of a single variable’s main-effect parameter, while keeping +// all other parameters fixed. +// +// Procedure: +// - For each group: +// * Compute group-specific main effects for the variable (current vs. proposed). +// * Add contributions from observed sufficient statistics +// (category counts or Blume–Capel stats). +// - Add the ratio of pseudolikelihood normalizing constants by calling +// `log_ratio_pseudolikelihood_constant_variable()`. +// +// Inputs: +// - current_main_effects: Matrix of main-effect parameters (current state). +// - proposed_main_effects: Matrix of main-effect parameters (candidate state). +// - current_pairwise_effects: Matrix of pairwise-effect parameters (fixed at current state). +// - main_effect_indices: Index ranges [row_start,row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations: Observation matrix (persons × variables). +// - group_indices: Row ranges [start,end] for each group in observations. +// - num_categories: Number of categories per variable. +// - counts_per_category_group: Per-group category counts (for ordinal variables). +// - blume_capel_stats_group: Per-group sufficient statistics (for Blume–Capel variables). +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - variable: Index of the variable being updated. +// +// Returns: +// - The scalar log pseudolikelihood ratio (proposed vs. current). +// +// Notes: +// - A temporary copy of `inclusion_indicator` is made to ensure the +// variable’s self-term (diagonal entry) is included. +// - Only the variable under update changes between current and proposed states; +// all other variables and pairwise effects remain fixed. +// - This function does not add prior contributions — only pseudolikelihood terms. double log_pseudolikelihood_ratio_main( const arma::mat& current_main_effects, const arma::mat& proposed_main_effects, @@ -1359,49 +1343,47 @@ double log_pseudolikelihood_ratio_main( } -/** - * Computes the log pseudolikelihood ratio for updating a single pairwise-effect parameter (bgmCompare model). - * - * This function is used in Metropolis–Hastings updates for pairwise effects. - * It compares the likelihood of the data under the current vs. proposed - * value of a single interaction (var1,var2), while keeping all other - * parameters fixed. - * - * Procedure: - * - Ensure the interaction is included in a temporary copy of inclusion_indicator. - * - For each group: - * * Compute group-specific pairwise effect for (var1,var2), current vs. proposed. - * * Add linear contribution from the pairwise sufficient statistic. - * - Add the ratio of pseudolikelihood normalizing constants for both variables: - * * Call `log_ratio_pseudolikelihood_constant_variable()` separately for var1 and var2, - * comparing current vs. proposed pairwise weights. - * - * Inputs: - * - main_effects: Matrix of main-effect parameters (fixed). - * - current_pairwise_effects: Matrix of pairwise-effect parameters (current state). - * - proposed_pairwise_effects: Matrix of pairwise-effect parameters (candidate state). - * - main_effect_indices: Index ranges [row_start,row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - observations: Observation matrix (persons × variables). - * - group_indices: Row ranges [start,end] for each group in observations. - * - num_categories: Number of categories per variable. - * - pairwise_stats_group: Per-group pairwise sufficient statistics. - * - num_groups: Number of groups. - * - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - var1, var2: Indices of the variable pair being updated. - * - * Returns: - * - The scalar log pseudolikelihood ratio (proposed vs. current). - * - * Notes: - * - A temporary copy of `inclusion_indicator` is used to force the edge (var1,var2) as active. - * - Only the selected pair changes between current and proposed states; - * all other effects remain fixed. - * - This function does not add prior contributions — only pseudolikelihood terms. - */ +// Computes the log pseudolikelihood ratio for updating a single pairwise-effect parameter (bgmCompare model). +// +// This function is used in Metropolis–Hastings updates for pairwise effects. +// It compares the likelihood of the data under the current vs. proposed +// value of a single interaction (var1,var2), while keeping all other +// parameters fixed. +// +// Procedure: +// - Ensure the interaction is included in a temporary copy of inclusion_indicator. +// - For each group: +// * Compute group-specific pairwise effect for (var1,var2), current vs. proposed. +// * Add linear contribution from the pairwise sufficient statistic. +// - Add the ratio of pseudolikelihood normalizing constants for both variables: +// * Call `log_ratio_pseudolikelihood_constant_variable()` separately for var1 and var2, +// comparing current vs. proposed pairwise weights. +// +// Inputs: +// - main_effects: Matrix of main-effect parameters (fixed). +// - current_pairwise_effects: Matrix of pairwise-effect parameters (current state). +// - proposed_pairwise_effects: Matrix of pairwise-effect parameters (candidate state). +// - main_effect_indices: Index ranges [row_start,row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - observations: Observation matrix (persons × variables). +// - group_indices: Row ranges [start,end] for each group in observations. +// - num_categories: Number of categories per variable. +// - pairwise_stats_group: Per-group pairwise sufficient statistics. +// - num_groups: Number of groups. +// - inclusion_indicator: Symmetric binary matrix of active variables (diag) and pairs (off-diag). +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - var1, var2: Indices of the variable pair being updated. +// +// Returns: +// - The scalar log pseudolikelihood ratio (proposed vs. current). +// +// Notes: +// - A temporary copy of `inclusion_indicator` is used to force the edge (var1,var2) as active. +// - Only the selected pair changes between current and proposed states; +// all other effects remain fixed. +// - This function does not add prior contributions — only pseudolikelihood terms. double log_pseudolikelihood_ratio_pairwise( const arma::mat& main_effects, const arma::mat& current_pairwise_effects, diff --git a/src/bgmCompare/bgmCompare_output.h b/src/bgmCompare/bgmCompare_output.h index 148a1984..632566d2 100644 --- a/src/bgmCompare/bgmCompare_output.h +++ b/src/bgmCompare/bgmCompare_output.h @@ -10,28 +10,27 @@ * * Stores posterior samples of main and pairwise effects, optional * inclusion indicators, and diagnostics for HMC/NUTS runs. - * - * Members: - * - main_samples: [iter × (#main × groups)] matrix of main-effect samples. - * - pairwise_samples:[iter × (#pair × groups)] matrix of pairwise-effect samples. - * - indicator_samples:[iter × (#edges + #variables)] indicator samples (if used). - * - treedepth_samples:[iter] tree depth diagnostics (NUTS only). - * - divergent_samples:[iter] divergent transition flags (NUTS only). - * - energy_samples: [iter] energy diagnostic (NUTS only). - * - chain_id: Identifier of the chain. - * - has_indicator: True if indicator samples are stored. */ struct bgmCompareOutput { + /// Main-effect samples [iter x (#main x groups)]. arma::mat main_samples; + /// Pairwise-effect samples [iter x (#pair x groups)]. arma::mat pairwise_samples; + /// Inclusion indicator samples [iter x (#edges + #variables)] (if used). arma::imat indicator_samples; + /// Tree depth diagnostics [iter] (NUTS only). arma::ivec treedepth_samples; + /// Divergent transition flags [iter] (NUTS only). arma::ivec divergent_samples; + /// Energy diagnostic [iter] (NUTS only). arma::vec energy_samples; + /// Identifier of the chain. int chain_id; + /// True if indicator samples are stored. bool has_indicator; + /// True if the chain was interrupted by the user. bool userInterrupt; }; diff --git a/src/bgmCompare/bgmCompare_sampler.cpp b/src/bgmCompare/bgmCompare_sampler.cpp index 19fbd8d2..cb5ee5f6 100644 --- a/src/bgmCompare/bgmCompare_sampler.cpp +++ b/src/bgmCompare/bgmCompare_sampler.cpp @@ -17,51 +17,49 @@ -/** - * Imputes missing observations for the bgmCompare model. - * - * This function performs single imputation of missing values during Gibbs sampling. - * Each missing entry is resampled from its conditional distribution given: - * - the current main and pairwise effect parameters, - * - the observed data for that individual, - * - group-specific sufficient statistics. - * - * Workflow: - * 1. For each missing entry, identify its (person, variable, group). - * 2. Compute group-specific main and pairwise effects via projections. - * 3. Calculate unnormalized probabilities for all categories of the variable: - * - Ordinal: softmax using category-specific thresholds. - * - Blume–Capel: quadratic + linear score with baseline centering. - * 4. Sample a new category with inverse transform sampling. - * 5. If the imputed value differs from the old one, update: - * - `observations` (raw data matrix), - * - `counts_per_category` or `blume_capel_stats` (main-effect sufficient stats), - * - `pairwise_stats` (pairwise sufficient stats). - * - * Inputs: - * - main_effects, pairwise_effects: Current parameter matrices. - * - main_effect_indices, pairwise_effect_indices: Lookup tables for variable/pair rows. - * - inclusion_indicator: Indicates which differences/pairs are included. - * - projection: Group projection matrix. - * - observations: Data matrix [persons × variables]; updated in place. - * - num_groups: Number of groups. - * - group_membership: Group assignment for each person. - * - group_indices: Row ranges [start,end] for each group. - * - counts_per_category: Group-level sufficient statistics for ordinal variables. - * - blume_capel_stats: Group-level sufficient statistics for Blume–Capel variables. - * - pairwise_stats: Group-level sufficient statistics for pairwise interactions. - * - num_categories: Number of categories for each variable in each group. - * - missing_data_indices: Matrix of (person, variable) pairs with missing values. - * - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - rng: Random number generator. - * - * Notes: - * - The function updates both raw data and sufficient statistics in-place. - * - Group-specific pairwise effects are recomputed per missing entry. - * - For efficiency, you may consider incremental updates to `pairwise_stats` - * instead of full recomputation (`obs.t() * obs`) after each change. - */ +// Imputes missing observations for the bgmCompare model. +// +// This function performs single imputation of missing values during Gibbs sampling. +// Each missing entry is resampled from its conditional distribution given: +// - the current main and pairwise effect parameters, +// - the observed data for that individual, +// - group-specific sufficient statistics. +// +// Workflow: +// 1. For each missing entry, identify its (person, variable, group). +// 2. Compute group-specific main and pairwise effects via projections. +// 3. Calculate unnormalized probabilities for all categories of the variable: +// - Ordinal: softmax using category-specific thresholds. +// - Blume–Capel: quadratic + linear score with baseline centering. +// 4. Sample a new category with inverse transform sampling. +// 5. If the imputed value differs from the old one, update: +// - `observations` (raw data matrix), +// - `counts_per_category` or `blume_capel_stats` (main-effect sufficient stats), +// - `pairwise_stats` (pairwise sufficient stats). +// +// Inputs: +// - main_effects, pairwise_effects: Current parameter matrices. +// - main_effect_indices, pairwise_effect_indices: Lookup tables for variable/pair rows. +// - inclusion_indicator: Indicates which differences/pairs are included. +// - projection: Group projection matrix. +// - observations: Data matrix [persons × variables]; updated in place. +// - num_groups: Number of groups. +// - group_membership: Group assignment for each person. +// - group_indices: Row ranges [start,end] for each group. +// - counts_per_category: Group-level sufficient statistics for ordinal variables. +// - blume_capel_stats: Group-level sufficient statistics for Blume–Capel variables. +// - pairwise_stats: Group-level sufficient statistics for pairwise interactions. +// - num_categories: Number of categories for each variable in each group. +// - missing_data_indices: Matrix of (person, variable) pairs with missing values. +// - is_ordinal_variable: Indicator vector (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - rng: Random number generator. +// +// Notes: +// - The function updates both raw data and sufficient statistics in-place. +// - Group-specific pairwise effects are recomputed per missing entry. +// - For efficiency, you may consider incremental updates to `pairwise_stats` +// instead of full recomputation (`obs.t() * obs`) after each change. void impute_missing_bgmcompare( const arma::mat& main_effects, const arma::mat& pairwise_effects, @@ -188,58 +186,56 @@ void impute_missing_bgmcompare( -/** - * Updates main effect parameters in bgmCompare using a random-walk Metropolis step. - * - * For each variable, the function proposes new parameter values for either: - * - all categories (ordinal variables), or - * - two parameters (linear and quadratic, Blume–Capel variables). - * - * If group-specific differences are enabled (`inclusion_indicator(v,v) == 1`), - * additional parameters (one per group contrast) are also updated. - * - * Each proposed parameter is evaluated via - * `log_pseudoposterior_main_component()`, and accepted/rejected using - * the Metropolis–Hastings rule. Proposal standard deviations are adapted - * online with `MetropolisAdaptationController`. - * - * Workflow: - * 1. Iterate over all variables. - * 2. For each category (ordinal) or parameter (Blume–Capel): - * - Update the "overall" effect (h=0). - * - Optionally update group-difference effects (h=1..G-1). - * 3. Record acceptance probabilities and update adaptation statistics. - * - * Inputs: - * - main_effects: Matrix of main effect parameters [rows = effects, cols = groups]; - * updated in place. - * - pairwise_effects: Current pairwise effects (passed through to log posterior). - * - main_effect_indices: Row index ranges for each variable’s main effects. - * - pairwise_effect_indices: Index map for pairwise effects. - * - inclusion_indicator: Indicator matrix; diagonal entries control group differences. - * - projection: Group projection matrix. - * - num_categories: Number of categories for each variable. - * - observations: Data matrix [persons × variables]. - * - num_groups: Number of groups (G). - * - group_indices: Row ranges per group in `observations`. - * - counts_per_category, blume_capel_stats: Group-specific sufficient statistics. - * - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel. - * - baseline_category: Reference categories (Blume–Capel only). - * - difference_scale: Scale parameter for group difference priors. - * - main_alpha, main_beta: Parameters for the Beta prior on main effects. - * - iteration: Current iteration index (for adaptation). - * - rwm_adapt: Adaptation controller for proposal SDs. - * - rng: Random number generator. - * - proposal_sd_main: Proposal standard deviations [same shape as `main_effects`]; - * updated in place. - * - * Notes: - * - Acceptance probabilities are stored per parameter and fed to `metropolis_adapt.update()`. - * - This function does not alter pairwise effects, but passes them into - * the posterior for likelihood consistency. - * - The helper lambda `do_update` encapsulates the proposal/accept/revert loop - * for a single parameter, improving readability. - */ +// Updates main effect parameters in bgmCompare using a random-walk Metropolis step. +// +// For each variable, the function proposes new parameter values for either: +// - all categories (ordinal variables), or +// - two parameters (linear and quadratic, Blume–Capel variables). +// +// If group-specific differences are enabled (`inclusion_indicator(v,v) == 1`), +// additional parameters (one per group contrast) are also updated. +// +// Each proposed parameter is evaluated via +// `log_pseudoposterior_main_component()`, and accepted/rejected using +// the Metropolis–Hastings rule. Proposal standard deviations are adapted +// online with `MetropolisAdaptationController`. +// +// Workflow: +// 1. Iterate over all variables. +// 2. For each category (ordinal) or parameter (Blume–Capel): +// - Update the "overall" effect (h=0). +// - Optionally update group-difference effects (h=1..G-1). +// 3. Record acceptance probabilities and update adaptation statistics. +// +// Inputs: +// - main_effects: Matrix of main effect parameters [rows = effects, cols = groups]; +// updated in place. +// - pairwise_effects: Current pairwise effects (passed through to log posterior). +// - main_effect_indices: Row index ranges for each variable’s main effects. +// - pairwise_effect_indices: Index map for pairwise effects. +// - inclusion_indicator: Indicator matrix; diagonal entries control group differences. +// - projection: Group projection matrix. +// - num_categories: Number of categories for each variable. +// - observations: Data matrix [persons × variables]. +// - num_groups: Number of groups (G). +// - group_indices: Row ranges per group in `observations`. +// - counts_per_category, blume_capel_stats: Group-specific sufficient statistics. +// - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel. +// - baseline_category: Reference categories (Blume–Capel only). +// - difference_scale: Scale parameter for group difference priors. +// - main_alpha, main_beta: Parameters for the Beta prior on main effects. +// - iteration: Current iteration index (for adaptation). +// - rwm_adapt: Adaptation controller for proposal SDs. +// - rng: Random number generator. +// - proposal_sd_main: Proposal standard deviations [same shape as `main_effects`]; +// updated in place. +// +// Notes: +// - Acceptance probabilities are stored per parameter and fed to `metropolis_adapt.update()`. +// - This function does not alter pairwise effects, but passes them into +// the posterior for likelihood consistency. +// - The helper lambda `do_update` encapsulates the proposal/accept/revert loop +// for a single parameter, improving readability. void update_main_effects_metropolis_bgmcompare ( arma::mat& main_effects, arma::mat& pairwise_effects, @@ -324,57 +320,55 @@ void update_main_effects_metropolis_bgmcompare ( -/** - * Updates pairwise interaction parameters in bgmCompare using a random-walk - * Metropolis step. - * - * For each variable pair (var1,var2), the function proposes new parameter - * values for: - * - the overall interaction (h=0), and - * - optionally group-difference effects (h=1..G-1) if enabled in - * `inclusion_indicator`. - * - * Each proposed parameter is evaluated via - * `log_pseudoposterior_pair_component()`, and accepted/rejected using the - * Metropolis–Hastings rule. Proposal standard deviations are adapted online - * through `MetropolisAdaptationController`. - * - * Workflow: - * 1. Iterate over all unique pairs of variables. - * 2. For each pair, update the overall effect (h=0). - * 3. If group differences are active, update group-specific difference - * effects (h=1..G-1). - * 4. Record acceptance probabilities and update proposal SDs via `rwm_adapt`. - * - * Inputs: - * - main_effects: Matrix of main effect parameters (passed through to log posterior). - * - pairwise_effects: Matrix of pairwise interaction parameters [rows = pairs, cols = groups]; - * updated in place. - * - main_effect_indices: Index map for main effects (per variable). - * - pairwise_effect_indices: Row index map for pairwise effects (per var1,var2). - * - inclusion_indicator: Indicator matrix; off-diagonal entries control group differences. - * - projection: Group projection matrix. - * - num_categories: Number of categories per variable. - * - observations: Data matrix [persons × variables]. - * - num_groups: Number of groups (G). - * - group_indices: Row ranges per group in `observations`. - * - pairwise_stats: Group-specific sufficient statistics for pairwise effects. - * - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel variables. - * - baseline_category: Reference categories (Blume–Capel only). - * - pairwise_scale: Scale parameter for overall interaction prior. - * - difference_scale: Scale parameter for group difference priors. - * - iteration: Current iteration index (for adaptation). - * - rwm_adapt: Adaptation controller for proposal SDs. - * - rng: Random number generator. - * - proposal_sd_pair: Proposal standard deviations [same shape as `pairwise_effects`]; - * updated in place. - * - * Notes: - * - Acceptance probabilities are tracked per parameter and fed to - * `metropolis_adapt.update()`. - * - The helper lambda `do_update` encapsulates the proposal/accept/reject - * logic for a single parameter. - */ +// Updates pairwise interaction parameters in bgmCompare using a random-walk +// Metropolis step. +// +// For each variable pair (var1,var2), the function proposes new parameter +// values for: +// - the overall interaction (h=0), and +// - optionally group-difference effects (h=1..G-1) if enabled in +// `inclusion_indicator`. +// +// Each proposed parameter is evaluated via +// `log_pseudoposterior_pair_component()`, and accepted/rejected using the +// Metropolis–Hastings rule. Proposal standard deviations are adapted online +// through `MetropolisAdaptationController`. +// +// Workflow: +// 1. Iterate over all unique pairs of variables. +// 2. For each pair, update the overall effect (h=0). +// 3. If group differences are active, update group-specific difference +// effects (h=1..G-1). +// 4. Record acceptance probabilities and update proposal SDs via `rwm_adapt`. +// +// Inputs: +// - main_effects: Matrix of main effect parameters (passed through to log posterior). +// - pairwise_effects: Matrix of pairwise interaction parameters [rows = pairs, cols = groups]; +// updated in place. +// - main_effect_indices: Index map for main effects (per variable). +// - pairwise_effect_indices: Row index map for pairwise effects (per var1,var2). +// - inclusion_indicator: Indicator matrix; off-diagonal entries control group differences. +// - projection: Group projection matrix. +// - num_categories: Number of categories per variable. +// - observations: Data matrix [persons × variables]. +// - num_groups: Number of groups (G). +// - group_indices: Row ranges per group in `observations`. +// - pairwise_stats: Group-specific sufficient statistics for pairwise effects. +// - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel variables. +// - baseline_category: Reference categories (Blume–Capel only). +// - pairwise_scale: Scale parameter for overall interaction prior. +// - difference_scale: Scale parameter for group difference priors. +// - iteration: Current iteration index (for adaptation). +// - rwm_adapt: Adaptation controller for proposal SDs. +// - rng: Random number generator. +// - proposal_sd_pair: Proposal standard deviations [same shape as `pairwise_effects`]; +// updated in place. +// +// Notes: +// - Acceptance probabilities are tracked per parameter and fed to +// `metropolis_adapt.update()`. +// - The helper lambda `do_update` encapsulates the proposal/accept/reject +// logic for a single parameter. void update_pairwise_effects_metropolis_bgmcompare ( arma::mat& main_effects, arma::mat& pairwise_effects, @@ -489,54 +483,52 @@ void update_pairwise_effects_metropolis_bgmcompare ( -/** - * Heuristically determine an initial HMC/NUTS step size for bgmCompare. - * - * This function vectorizes the current model parameters, then repeatedly - * simulates short HMC trajectories to calibrate a stable starting step size - * that achieves a target acceptance rate. - * - * Workflow: - * 1. Vectorize current parameters into a single state vector. - * 2. Define closures for log-posterior evaluation and gradient computation: - * - `log_post`: unpacks parameters and evaluates the log pseudoposterior. - * - `grad`: unpacks parameters and evaluates the gradient of the - * pseudoposterior. - * 3. Pass these to `heuristic_initial_step_size`, which runs the heuristic - * tuning loop. - * - * Inputs: - * - main_effects: Matrix of main-effect parameters [n_main_rows × G]. - * - pairwise_effects: Matrix of pairwise interaction parameters [n_pairs × G]. - * - main_effect_indices: Row index ranges for each variable’s main effects. - * - pairwise_effect_indices: Row index map for pairwise effects. - * - inclusion_indicator: Matrix marking which main and pairwise differences - * are active. - * - projection: Group projection matrix (encodes contrasts). - * - num_categories: Number of categories per variable [V]. - * - observations: Data matrix [persons × variables]. - * - num_groups: Number of groups (G). - * - group_indices: Row ranges per group in `observations`. - * - counts_per_category: Per-group sufficient statistics for ordinal variables. - * - blume_capel_stats: Per-group sufficient statistics for Blume–Capel variables. - * - pairwise_stats: Per-group sufficient statistics for pairwise effects. - * - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel variables [V]. - * - baseline_category: Reference categories for Blume–Capel variables [V]. - * - pairwise_scale: Scale parameter for overall pairwise priors. - * - difference_scale: Scale parameter for group difference priors. - * - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. - * - target_acceptance: Desired acceptance probability (e.g. 0.8). - * - rng: Random number generator. - * - * Returns: - * - A double value for the initial HMC/NUTS step size. - * - * Notes: - * - This routine is only used during warmup to initialize - * `HMCAdaptationController`. - * - Correct indexing of parameters relies on `build_index_maps` to ensure - * consistency between vectorization and gradient computation. - */ +// Heuristically determine an initial HMC/NUTS step size for bgmCompare. +// +// This function vectorizes the current model parameters, then repeatedly +// simulates short HMC trajectories to calibrate a stable starting step size +// that achieves a target acceptance rate. +// +// Workflow: +// 1. Vectorize current parameters into a single state vector. +// 2. Define closures for log-posterior evaluation and gradient computation: +// - `log_post`: unpacks parameters and evaluates the log pseudoposterior. +// - `grad`: unpacks parameters and evaluates the gradient of the +// pseudoposterior. +// 3. Pass these to `heuristic_initial_step_size`, which runs the heuristic +// tuning loop. +// +// Inputs: +// - main_effects: Matrix of main-effect parameters [n_main_rows × G]. +// - pairwise_effects: Matrix of pairwise interaction parameters [n_pairs × G]. +// - main_effect_indices: Row index ranges for each variable’s main effects. +// - pairwise_effect_indices: Row index map for pairwise effects. +// - inclusion_indicator: Matrix marking which main and pairwise differences +// are active. +// - projection: Group projection matrix (encodes contrasts). +// - num_categories: Number of categories per variable [V]. +// - observations: Data matrix [persons × variables]. +// - num_groups: Number of groups (G). +// - group_indices: Row ranges per group in `observations`. +// - counts_per_category: Per-group sufficient statistics for ordinal variables. +// - blume_capel_stats: Per-group sufficient statistics for Blume–Capel variables. +// - pairwise_stats: Per-group sufficient statistics for pairwise effects. +// - is_ordinal_variable: Indicator for ordinal vs. Blume–Capel variables [V]. +// - baseline_category: Reference categories for Blume–Capel variables [V]. +// - pairwise_scale: Scale parameter for overall pairwise priors. +// - difference_scale: Scale parameter for group difference priors. +// - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. +// - target_acceptance: Desired acceptance probability (e.g. 0.8). +// - rng: Random number generator. +// +// Returns: +// - A double value for the initial HMC/NUTS step size. +// +// Notes: +// - This routine is only used during warmup to initialize +// `HMCAdaptationController`. +// - Correct indexing of parameters relies on `build_index_maps` to ensure +// consistency between vectorization and gradient computation. double find_initial_stepsize_bgmcompare( arma::mat& main_effects, arma::mat& pairwise_effects, @@ -629,52 +621,50 @@ double find_initial_stepsize_bgmcompare( -/** - * Perform one Hamiltonian Monte Carlo (HMC) update step for the bgmCompare model. - * - * The function: - * 1. Vectorizes the current parameter state (main + pairwise effects). - * 2. Defines closures for log-posterior evaluation and gradient calculation. - * 3. Applies HMC with fixed leapfrog steps to propose a new state. - * 4. Unpacks the accepted state back into main and pairwise matrices. - * 5. Updates the adaptation controller with acceptance information. - * - * Inputs: - * - main_effects, pairwise_effects: Current parameter matrices, updated in place. - * - main_effect_indices, pairwise_effect_indices: Index maps for parameters. - * - inclusion_indicator: Indicates active main and pairwise differences. - * - projection: Group projection matrix for contrasts. - * - num_categories: Number of categories per variable [V]. - * - observations: Data matrix [N × V]. - * - num_groups: Number of groups. - * - group_indices: Row ranges for each group in `observations`. - * - counts_per_category, blume_capel_stats: Per-group sufficient statistics. - * - pairwise_stats: Per-group pairwise sufficient statistics. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. - * - baseline_category: Reference categories for Blume–Capel variables. - * - pairwise_scale: Scale of overall pairwise prior. - * - difference_scale: Scale of group-difference prior. - * - main_alpha, main_beta: Hyperparameters for main-effect priors. - * - num_leapfrogs: Number of leapfrog steps in the HMC trajectory. - * - iteration: Current sampler iteration (for adaptation scheduling). - * - hmc_adapt: Adaptation controller for step size and mass matrix. - * - learn_mass_matrix: Whether to adapt the mass matrix. - * - selection: If true, restrict mass matrix to active parameters only. - * - rng: Random number generator. - * - * Side effects: - * - Updates `main_effects` and `pairwise_effects` with the new state. - * - Updates `hmc_adapt` with acceptance probability and diagnostics. - * - * Returns: - * - None directly; state is updated in place. - * - * Notes: - * - This variant is specific to bgmCompare, where parameters are stored in - * row-wise structures with possible group-difference columns. - * - Consistency between vectorization, unvectorization, and gradient - * indexing is enforced via `build_index_maps`. - */ +// Perform one Hamiltonian Monte Carlo (HMC) update step for the bgmCompare model. +// +// The function: +// 1. Vectorizes the current parameter state (main + pairwise effects). +// 2. Defines closures for log-posterior evaluation and gradient calculation. +// 3. Applies HMC with fixed leapfrog steps to propose a new state. +// 4. Unpacks the accepted state back into main and pairwise matrices. +// 5. Updates the adaptation controller with acceptance information. +// +// Inputs: +// - main_effects, pairwise_effects: Current parameter matrices, updated in place. +// - main_effect_indices, pairwise_effect_indices: Index maps for parameters. +// - inclusion_indicator: Indicates active main and pairwise differences. +// - projection: Group projection matrix for contrasts. +// - num_categories: Number of categories per variable [V]. +// - observations: Data matrix [N × V]. +// - num_groups: Number of groups. +// - group_indices: Row ranges for each group in `observations`. +// - counts_per_category, blume_capel_stats: Per-group sufficient statistics. +// - pairwise_stats: Per-group pairwise sufficient statistics. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. +// - baseline_category: Reference categories for Blume–Capel variables. +// - pairwise_scale: Scale of overall pairwise prior. +// - difference_scale: Scale of group-difference prior. +// - main_alpha, main_beta: Hyperparameters for main-effect priors. +// - num_leapfrogs: Number of leapfrog steps in the HMC trajectory. +// - iteration: Current sampler iteration (for adaptation scheduling). +// - hmc_adapt: Adaptation controller for step size and mass matrix. +// - learn_mass_matrix: Whether to adapt the mass matrix. +// - selection: If true, restrict mass matrix to active parameters only. +// - rng: Random number generator. +// +// Side effects: +// - Updates `main_effects` and `pairwise_effects` with the new state. +// - Updates `hmc_adapt` with acceptance probability and diagnostics. +// +// Returns: +// - None directly; state is updated in place. +// +// Notes: +// - This variant is specific to bgmCompare, where parameters are stored in +// row-wise structures with possible group-difference columns. +// - Consistency between vectorization, unvectorization, and gradient +// indexing is enforced via `build_index_maps`. void update_hmc_bgmcompare( arma::mat& main_effects, arma::mat& pairwise_effects, @@ -809,51 +799,49 @@ void update_hmc_bgmcompare( -/** - * Perform one No-U-Turn Sampler (NUTS) update step for the bgmCompare model. - * - * The function: - * 1. Vectorizes the current parameter state (main + pairwise effects). - * 2. Defines closures for log-posterior evaluation and gradient calculation. - * 3. Runs a NUTS trajectory (adaptive tree-based extension of HMC). - * 4. Unpacks the accepted state back into main and pairwise matrices. - * 5. Updates the adaptation controller with acceptance probability. - * - * Inputs: - * - main_effects, pairwise_effects: Current parameter matrices, updated in place. - * - main_effect_indices, pairwise_effect_indices: Index maps for parameters. - * - inclusion_indicator: Indicates active main and pairwise differences. - * - projection: Group projection matrix for contrasts. - * - num_categories: Number of categories per variable [V]. - * - observations: Data matrix [N × V]. - * - num_groups: Number of groups. - * - group_indices: Row ranges for each group in `observations`. - * - counts_per_category, blume_capel_stats: Per-group sufficient statistics. - * - pairwise_stats: Per-group pairwise sufficient statistics. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. - * - baseline_category: Reference categories for Blume–Capel variables. - * - pairwise_scale: Scale of overall pairwise prior. - * - difference_scale: Scale of group-difference prior. - * - main_alpha, main_beta: Hyperparameters for main-effect priors. - * - nuts_max_depth: Maximum tree depth for NUTS doubling procedure. - * - iteration: Current sampler iteration (for adaptation scheduling). - * - hmc_adapt: Adaptation controller for step size and mass matrix. - * - learn_mass_matrix: Whether to adapt the mass matrix (unused inside NUTS but relevant to controller). - * - selection: If true, restrict mass matrix to active parameters only. - * - rng: Random number generator. - * - * Returns: - * - A `StepResult` containing the accepted state and diagnostics - * (e.g. tree depth, divergences, energy). - * - * Notes: - * - This variant is specific to bgmCompare, where parameters are stored in - * row-wise structures with group-difference columns. - * - Consistency between vectorization, unvectorization, and gradient - * indexing is enforced via `build_index_maps`. - * - Diagnostics from the returned `StepResult` can be used to monitor - * sampler stability (e.g. divergences, tree depth). - */ +// Perform one No-U-Turn Sampler (NUTS) update step for the bgmCompare model. +// +// The function: +// 1. Vectorizes the current parameter state (main + pairwise effects). +// 2. Defines closures for log-posterior evaluation and gradient calculation. +// 3. Runs a NUTS trajectory (adaptive tree-based extension of HMC). +// 4. Unpacks the accepted state back into main and pairwise matrices. +// 5. Updates the adaptation controller with acceptance probability. +// +// Inputs: +// - main_effects, pairwise_effects: Current parameter matrices, updated in place. +// - main_effect_indices, pairwise_effect_indices: Index maps for parameters. +// - inclusion_indicator: Indicates active main and pairwise differences. +// - projection: Group projection matrix for contrasts. +// - num_categories: Number of categories per variable [V]. +// - observations: Data matrix [N × V]. +// - num_groups: Number of groups. +// - group_indices: Row ranges for each group in `observations`. +// - counts_per_category, blume_capel_stats: Per-group sufficient statistics. +// - pairwise_stats: Per-group pairwise sufficient statistics. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. +// - baseline_category: Reference categories for Blume–Capel variables. +// - pairwise_scale: Scale of overall pairwise prior. +// - difference_scale: Scale of group-difference prior. +// - main_alpha, main_beta: Hyperparameters for main-effect priors. +// - nuts_max_depth: Maximum tree depth for NUTS doubling procedure. +// - iteration: Current sampler iteration (for adaptation scheduling). +// - hmc_adapt: Adaptation controller for step size and mass matrix. +// - learn_mass_matrix: Whether to adapt the mass matrix (unused inside NUTS but relevant to controller). +// - selection: If true, restrict mass matrix to active parameters only. +// - rng: Random number generator. +// +// Returns: +// - A `StepResult` containing the accepted state and diagnostics +// (e.g. tree depth, divergences, energy). +// +// Notes: +// - This variant is specific to bgmCompare, where parameters are stored in +// row-wise structures with group-difference columns. +// - Consistency between vectorization, unvectorization, and gradient +// indexing is enforced via `build_index_maps`. +// - Diagnostics from the returned `StepResult` can be used to monitor +// sampler stability (e.g. divergences, tree depth). StepResult update_nuts_bgmcompare( arma::mat& main_effects, arma::mat& pairwise_effects, @@ -990,55 +978,53 @@ StepResult update_nuts_bgmcompare( -/** - * Adapt proposal standard deviations (SDs) for main and pairwise effects - * during the warmup phase of the bgmCompare sampler. - * - * This function uses a Robbins–Monro stochastic approximation scheme to - * adjust proposal SDs toward a target acceptance rate. Adaptation occurs - * only when permitted by the current warmup schedule. - * - * Workflow: - * 1. For each main effect parameter (ordinal or Blume–Capel), run one - * random-walk Metropolis (RWM) step, update the parameter, and adjust - * the proposal SD. - * 2. For each pairwise effect parameter (overall and group differences), - * do the same. - * 3. Proposal SDs are updated symmetrically across group columns if - * differences are included. - * - * Inputs: - * - proposal_sd_main_effects: Current SDs for main effects, updated in place. - * - proposal_sd_pairwise_effects: Current SDs for pairwise effects, updated in place. - * - main_effects, pairwise_effects: Parameter matrices, updated in place. - * - main_effect_indices, pairwise_effect_indices: Index maps for main/pairwise parameters. - * - inclusion_indicator: Marks which group differences are active. - * - projection: Group projection matrix. - * - num_categories: Categories per variable. - * - observations: Data matrix [N × V]. - * - num_groups: Number of groups. - * - group_indices: Row ranges per group in `observations`. - * - counts_per_category, blume_capel_stats: Per-group sufficient statistics for main effects. - * - pairwise_stats: Per-group sufficient statistics for pairwise effects. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. - * - baseline_category: Reference category for Blume–Capel variables. - * - pairwise_scale: Scale of Cauchy prior for pairwise effects. - * - difference_scale: Scale of Cauchy prior for group differences. - * - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. - * - iteration: Current iteration (to check schedule stage). - * - rng: Random number generator. - * - sched: Warmup schedule controlling when adaptation is active. - * - target_accept: Desired acceptance probability (default 0.44). - * - rm_decay: Robbins–Monro decay rate (default 0.75). - * - * Side effects: - * - Updates `main_effects` and `pairwise_effects` with new parameter values. - * - Updates `proposal_sd_main_effects` and `proposal_sd_pairwise_effects`. - * - * Notes: - * - Adapts only when `sched.adapt_proposal_sd(iteration)` is true. - * - Helps stabilize RWM acceptance rates before switching to sampling. - */ +// Adapt proposal standard deviations (SDs) for main and pairwise effects +// during the warmup phase of the bgmCompare sampler. +// +// This function uses a Robbins–Monro stochastic approximation scheme to +// adjust proposal SDs toward a target acceptance rate. Adaptation occurs +// only when permitted by the current warmup schedule. +// +// Workflow: +// 1. For each main effect parameter (ordinal or Blume–Capel), run one +// random-walk Metropolis (RWM) step, update the parameter, and adjust +// the proposal SD. +// 2. For each pairwise effect parameter (overall and group differences), +// do the same. +// 3. Proposal SDs are updated symmetrically across group columns if +// differences are included. +// +// Inputs: +// - proposal_sd_main_effects: Current SDs for main effects, updated in place. +// - proposal_sd_pairwise_effects: Current SDs for pairwise effects, updated in place. +// - main_effects, pairwise_effects: Parameter matrices, updated in place. +// - main_effect_indices, pairwise_effect_indices: Index maps for main/pairwise parameters. +// - inclusion_indicator: Marks which group differences are active. +// - projection: Group projection matrix. +// - num_categories: Categories per variable. +// - observations: Data matrix [N × V]. +// - num_groups: Number of groups. +// - group_indices: Row ranges per group in `observations`. +// - counts_per_category, blume_capel_stats: Per-group sufficient statistics for main effects. +// - pairwise_stats: Per-group sufficient statistics for pairwise effects. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. +// - baseline_category: Reference category for Blume–Capel variables. +// - pairwise_scale: Scale of Cauchy prior for pairwise effects. +// - difference_scale: Scale of Cauchy prior for group differences. +// - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. +// - iteration: Current iteration (to check schedule stage). +// - rng: Random number generator. +// - sched: Warmup schedule controlling when adaptation is active. +// - target_accept: Desired acceptance probability (default 0.44). +// - rm_decay: Robbins–Monro decay rate (default 0.75). +// +// Side effects: +// - Updates `main_effects` and `pairwise_effects` with new parameter values. +// - Updates `proposal_sd_main_effects` and `proposal_sd_pairwise_effects`. +// +// Notes: +// - Adapts only when `sched.adapt_proposal_sd(iteration)` is true. +// - Helps stabilize RWM acceptance rates before switching to sampling. void tune_proposal_sd_bgmcompare( arma::mat& proposal_sd_main_effects, arma::mat& proposal_sd_pairwise_effects, @@ -1220,55 +1206,53 @@ void tune_proposal_sd_bgmcompare( -/** - * Metropolis–Hastings updates for difference-inclusion indicators in bgmCompare. - * - * This function toggles whether group-level differences are included for - * main effects (diagonal entries of `inclusion_indicator`) and pairwise - * effects (off-diagonal entries). Each update proposes either: - * - Turning a currently excluded difference “on” by drawing a new non-zero - * value from a Gaussian proposal, or - * - Turning an included difference “off” by setting its value(s) to zero. - * - * The acceptance probability combines: - * - Pseudolikelihood ratio (data contribution), - * - Prior ratio on inclusion indicators, - * - Prior ratio on parameter values (Cauchy vs. point-mass-at-zero), - * - Proposal density correction. - * - * Inputs: - * - inclusion_probability_difference: Prior inclusion probabilities for - * group differences [V × V]. - * - index: Matrix mapping pairwise interactions to variable indices. - * - main_effects, pairwise_effects: Parameter matrices, updated in place. - * - main_effect_indices, pairwise_effect_indices: Index maps for parameters. - * - projection: Group projection matrix. - * - observations: Data matrix [N × V]. - * - num_groups: Number of groups. - * - group_indices: Row ranges per group in `observations`. - * - num_categories: Categories per variable [V × G]. - * - inclusion_indicator: Indicator matrix for differences, updated in place. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables [V]. - * - baseline_category: Reference category for Blume–Capel variables [V]. - * - proposal_sd_main, proposal_sd_pairwise: Proposal SD matrices for main - * and pairwise effects. - * - difference_scale: Scale of Cauchy prior for group differences. - * - counts_per_category, blume_capel_stats: Per-group sufficient statistics - * for main effects. - * - pairwise_stats: Per-group sufficient statistics for pairwise effects. - * - rng: Random number generator. - * - * Side effects: - * - Updates `inclusion_indicator` entries for main/pairwise differences. - * - Updates corresponding slices of `main_effects` and `pairwise_effects`. - * - * Notes: - * - For main effects, differences correspond to columns 1..G-1 of the - * parameter matrix. - * - For pairwise effects, differences correspond to columns 1..G-1 of the - * pairwise-effect matrix rows. - * - Ensures symmetry of `inclusion_indicator` for pairwise updates. - */ +// Metropolis–Hastings updates for difference-inclusion indicators in bgmCompare. +// +// This function toggles whether group-level differences are included for +// main effects (diagonal entries of `inclusion_indicator`) and pairwise +// effects (off-diagonal entries). Each update proposes either: +// - Turning a currently excluded difference “on” by drawing a new non-zero +// value from a Gaussian proposal, or +// - Turning an included difference “off” by setting its value(s) to zero. +// +// The acceptance probability combines: +// - Pseudolikelihood ratio (data contribution), +// - Prior ratio on inclusion indicators, +// - Prior ratio on parameter values (Cauchy vs. point-mass-at-zero), +// - Proposal density correction. +// +// Inputs: +// - inclusion_probability_difference: Prior inclusion probabilities for +// group differences [V × V]. +// - index: Matrix mapping pairwise interactions to variable indices. +// - main_effects, pairwise_effects: Parameter matrices, updated in place. +// - main_effect_indices, pairwise_effect_indices: Index maps for parameters. +// - projection: Group projection matrix. +// - observations: Data matrix [N × V]. +// - num_groups: Number of groups. +// - group_indices: Row ranges per group in `observations`. +// - num_categories: Categories per variable [V × G]. +// - inclusion_indicator: Indicator matrix for differences, updated in place. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables [V]. +// - baseline_category: Reference category for Blume–Capel variables [V]. +// - proposal_sd_main, proposal_sd_pairwise: Proposal SD matrices for main +// and pairwise effects. +// - difference_scale: Scale of Cauchy prior for group differences. +// - counts_per_category, blume_capel_stats: Per-group sufficient statistics +// for main effects. +// - pairwise_stats: Per-group sufficient statistics for pairwise effects. +// - rng: Random number generator. +// +// Side effects: +// - Updates `inclusion_indicator` entries for main/pairwise differences. +// - Updates corresponding slices of `main_effects` and `pairwise_effects`. +// +// Notes: +// - For main effects, differences correspond to columns 1..G-1 of the +// parameter matrix. +// - For pairwise effects, differences correspond to columns 1..G-1 of the +// pairwise-effect matrix rows. +// - Ensures symmetry of `inclusion_indicator` for pairwise updates. void update_indicator_differences_metropolis_bgmcompare ( const arma::mat& inclusion_probability_difference, const arma::imat& index, @@ -1464,65 +1448,63 @@ void update_indicator_differences_metropolis_bgmcompare ( -/** - * Perform one Gibbs update step for the bgmCompare model. - * - * This function executes a single iteration of the Gibbs sampler, including: - * - * Step 0: (optional) Initialize graph structure if difference selection - * is enabled and the current iteration marks the start of Stage 3c. - * - * Step 1: (optional) Update inclusion indicators for group differences - * (main and pairwise effects) via Metropolis–Hastings proposals. - * - * Step 2: Update model parameters according to the selected update method: - * - "adaptive-metropolis": Update main and pairwise effects individually - * with random-walk Metropolis and adaptive proposal SDs. - * - "hamiltonian-mc": Update the full parameter vector using HMC. - * - "nuts": Update the full parameter vector using the No-U-Turn Sampler. - * If past burn-in, store NUTS diagnostics (tree depth, divergences, energy). - * - * Step 3: (Stage 3b only) Adapt proposal SDs for Metropolis updates using - * Robbins–Monro tuning. - * - * Inputs: - * - observations: Data matrix [N × V]. - * - num_categories: Number of categories per variable [V]. - * - pairwise_scale, difference_scale: Prior scale parameters. - * - counts_per_category, blume_capel_stats: Sufficient statistics per group. - * - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. - * - inclusion_indicator: Matrix of active group differences [V × V], updated in place. - * - main_effects, pairwise_effects: Parameter matrices, updated in place. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. - * - baseline_category: Reference categories for Blume–Capel variables. - * - iteration: Current iteration index. - * - pairwise_effect_indices, main_effect_indices: Index maps for parameters. - * - pairwise_stats: Per-group pairwise sufficient statistics. - * - nuts_max_depth: Maximum tree depth for NUTS. - * - hmc_adapt: Adaptation controller for HMC/NUTS. - * - metropolis_adapt_main, metropolis_adapt_pair: Adaptation controllers for RWM updates. - * - learn_mass_matrix: Whether to adapt the mass matrix in HMC/NUTS. - * - schedule: Warmup schedule, controls adaptation and selection phases. - * - treedepth_samples, divergent_samples, energy_samples: Buffers for NUTS diagnostics. - * - projection: Group projection matrix. - * - num_groups: Number of groups. - * - group_indices: Row ranges per group in `observations`. - * - rng: Random number generator. - * - inclusion_probability: Prior probabilities for including differences. - * - hmc_nuts_leapfrogs: Number of leapfrog steps for HMC updates. - * - update_method: Update strategy ("adaptive-metropolis", "hamiltonian-mc", "nuts"). - * - proposal_sd_main, proposal_sd_pair: Proposal SD matrices for Metropolis updates. - * - index: Index table for pairwise differences. - * - * Side effects: - * - Updates parameters, inclusion indicators, and sufficient statistics. - * - Updates adaptation controllers and (if NUTS) diagnostic buffers. - * - * Notes: - * - This function encapsulates all update logic for bgmCompare. - * - Choice of `update_method` governs whether updates are local (RWM) or - * global (HMC/NUTS). - */ +// Perform one Gibbs update step for the bgmCompare model. +// +// This function executes a single iteration of the Gibbs sampler, including: +// +// Step 0: (optional) Initialize graph structure if difference selection +// is enabled and the current iteration marks the start of Stage 3c. +// +// Step 1: (optional) Update inclusion indicators for group differences +// (main and pairwise effects) via Metropolis–Hastings proposals. +// +// Step 2: Update model parameters according to the selected update method: +// - "adaptive-metropolis": Update main and pairwise effects individually +// with random-walk Metropolis and adaptive proposal SDs. +// - "hamiltonian-mc": Update the full parameter vector using HMC. +// - "nuts": Update the full parameter vector using the No-U-Turn Sampler. +// If past burn-in, store NUTS diagnostics (tree depth, divergences, energy). +// +// Step 3: (Stage 3b only) Adapt proposal SDs for Metropolis updates using +// Robbins–Monro tuning. +// +// Inputs: +// - observations: Data matrix [N × V]. +// - num_categories: Number of categories per variable [V]. +// - pairwise_scale, difference_scale: Prior scale parameters. +// - counts_per_category, blume_capel_stats: Sufficient statistics per group. +// - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. +// - inclusion_indicator: Matrix of active group differences [V × V], updated in place. +// - main_effects, pairwise_effects: Parameter matrices, updated in place. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. +// - baseline_category: Reference categories for Blume–Capel variables. +// - iteration: Current iteration index. +// - pairwise_effect_indices, main_effect_indices: Index maps for parameters. +// - pairwise_stats: Per-group pairwise sufficient statistics. +// - nuts_max_depth: Maximum tree depth for NUTS. +// - hmc_adapt: Adaptation controller for HMC/NUTS. +// - metropolis_adapt_main, metropolis_adapt_pair: Adaptation controllers for RWM updates. +// - learn_mass_matrix: Whether to adapt the mass matrix in HMC/NUTS. +// - schedule: Warmup schedule, controls adaptation and selection phases. +// - treedepth_samples, divergent_samples, energy_samples: Buffers for NUTS diagnostics. +// - projection: Group projection matrix. +// - num_groups: Number of groups. +// - group_indices: Row ranges per group in `observations`. +// - rng: Random number generator. +// - inclusion_probability: Prior probabilities for including differences. +// - hmc_nuts_leapfrogs: Number of leapfrog steps for HMC updates. +// - update_method: Update strategy ("adaptive-metropolis", "hamiltonian-mc", "nuts"). +// - proposal_sd_main, proposal_sd_pair: Proposal SD matrices for Metropolis updates. +// - index: Index table for pairwise differences. +// +// Side effects: +// - Updates parameters, inclusion indicators, and sufficient statistics. +// - Updates adaptation controllers and (if NUTS) diagnostic buffers. +// +// Notes: +// - This function encapsulates all update logic for bgmCompare. +// - Choice of `update_method` governs whether updates are local (RWM) or +// global (HMC/NUTS). void gibbs_update_step_bgmcompare ( const arma::imat& observations, const arma::ivec& num_categories, @@ -1647,72 +1629,70 @@ void gibbs_update_step_bgmcompare ( -/** - * Run a full Gibbs sampler for the bgmCompare model. - * - * This function controls the full MCMC lifecycle for a single chain: - * - Initializes parameter matrices, proposal SDs, and adaptation controllers. - * - Optionally imputes missing data at each iteration. - * - Executes Gibbs updates for main and pairwise effects, including - * difference-selection if enabled. - * - Adapts step size, mass matrix, and proposal SDs during warmup. - * - Updates inclusion probabilities under the chosen prior - * (e.g. Beta–Bernoulli). - * - Collects posterior samples and diagnostics into a `SamplerOutput` struct. - * - * Inputs: - * - chain_id: Identifier for this chain (1-based). - * - observations: Data matrix [N × V]. - * - num_groups: Number of groups (G). - * - counts_per_category: Per-group sufficient statistics (ordinal variables). - * - blume_capel_stats: Per-group sufficient statistics (Blume–Capel variables). - * - pairwise_stats: Per-group sufficient statistics for pairwise effects. - * - num_categories: Number of categories per variable [V]. - * - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. - * - pairwise_scale: Scale parameter for overall pairwise priors. - * - difference_scale: Scale parameter for group-difference priors. - * - difference_selection_alpha, difference_selection_beta: Hyperparameters - * for difference-selection prior. - * - difference_prior: Prior type for difference-selection ("Beta-Bernoulli", ...). - * - iter: Number of post–burn-in sampling iterations. - * - warmup: Number of warmup iterations. - * - na_impute: If true, impute missing observations at each iteration. - * - missing_data_indices: Matrix of [person, variable] indices of missings. - * - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. - * - baseline_category: Reference categories for Blume–Capel variables. - * - difference_selection: If true, include MH updates for group-difference indicators. - * - main_effect_indices, pairwise_effect_indices: Index maps for parameter rows. - * - target_accept: Target acceptance probability (HMC/NUTS). - * - nuts_max_depth: Maximum tree depth for NUTS. - * - learn_mass_matrix: Whether to adapt the mass matrix (HMC/NUTS). - * - projection: Group projection matrix for contrasts. - * - group_membership: Mapping of persons to groups. - * - group_indices: Row ranges per group in `observations`. - * - interaction_index_matrix: Index map for pairwise interactions. - * - inclusion_probability: Matrix of prior inclusion probabilities, updated in place. - * - rng: Random number generator. - * - update_method: Update strategy ("adaptive-metropolis", "hamiltonian-mc", "nuts"). - * - hmc_num_leapfrogs: Number of leapfrog steps for HMC. - * - * Returns: - * - A `SamplerOutput` struct containing: - * - main_samples: MCMC samples for main effects. - * - pairwise_samples: MCMC samples for pairwise effects. - * - indicator_samples: (optional) Inclusion indicator samples if - * difference-selection is enabled. - * - treedepth_samples, divergent_samples, energy_samples: - * Diagnostics (for NUTS). - * - chain_id: Identifier for this chain. - * - * Notes: - * - Warmup is orchestrated via `WarmupSchedule`, which controls adaptation - * phases and difference-selection activation. - * - Proposal SDs are tuned via Robbins–Monro during Stage 3b. - * - Difference-selection updates toggle inclusion indicators and adjust - * associated parameters with MH proposals. - * - This function runs entirely in C++ and is wrapped for parallel execution - * via `GibbsCompareChainRunner`. - */ +// Run a full Gibbs sampler for the bgmCompare model. +// +// This function controls the full MCMC lifecycle for a single chain: +// - Initializes parameter matrices, proposal SDs, and adaptation controllers. +// - Optionally imputes missing data at each iteration. +// - Executes Gibbs updates for main and pairwise effects, including +// difference-selection if enabled. +// - Adapts step size, mass matrix, and proposal SDs during warmup. +// - Updates inclusion probabilities under the chosen prior +// (e.g. Beta–Bernoulli). +// - Collects posterior samples and diagnostics into a `SamplerOutput` struct. +// +// Inputs: +// - chain_id: Identifier for this chain (1-based). +// - observations: Data matrix [N × V]. +// - num_groups: Number of groups (G). +// - counts_per_category: Per-group sufficient statistics (ordinal variables). +// - blume_capel_stats: Per-group sufficient statistics (Blume–Capel variables). +// - pairwise_stats: Per-group sufficient statistics for pairwise effects. +// - num_categories: Number of categories per variable [V]. +// - main_alpha, main_beta: Hyperparameters for Beta prior on main effects. +// - pairwise_scale: Scale parameter for overall pairwise priors. +// - difference_scale: Scale parameter for group-difference priors. +// - difference_selection_alpha, difference_selection_beta: Hyperparameters +// for difference-selection prior. +// - difference_prior: Prior type for difference-selection ("Beta-Bernoulli", ...). +// - iter: Number of post–burn-in sampling iterations. +// - warmup: Number of warmup iterations. +// - na_impute: If true, impute missing observations at each iteration. +// - missing_data_indices: Matrix of [person, variable] indices of missings. +// - is_ordinal_variable: Marks ordinal vs. Blume–Capel variables. +// - baseline_category: Reference categories for Blume–Capel variables. +// - difference_selection: If true, include MH updates for group-difference indicators. +// - main_effect_indices, pairwise_effect_indices: Index maps for parameter rows. +// - target_accept: Target acceptance probability (HMC/NUTS). +// - nuts_max_depth: Maximum tree depth for NUTS. +// - learn_mass_matrix: Whether to adapt the mass matrix (HMC/NUTS). +// - projection: Group projection matrix for contrasts. +// - group_membership: Mapping of persons to groups. +// - group_indices: Row ranges per group in `observations`. +// - interaction_index_matrix: Index map for pairwise interactions. +// - inclusion_probability: Matrix of prior inclusion probabilities, updated in place. +// - rng: Random number generator. +// - update_method: Update strategy ("adaptive-metropolis", "hamiltonian-mc", "nuts"). +// - hmc_num_leapfrogs: Number of leapfrog steps for HMC. +// +// Returns: +// - A `SamplerOutput` struct containing: +// - main_samples: MCMC samples for main effects. +// - pairwise_samples: MCMC samples for pairwise effects. +// - indicator_samples: (optional) Inclusion indicator samples if +// difference-selection is enabled. +// - treedepth_samples, divergent_samples, energy_samples: +// Diagnostics (for NUTS). +// - chain_id: Identifier for this chain. +// +// Notes: +// - Warmup is orchestrated via `WarmupSchedule`, which controls adaptation +// phases and difference-selection activation. +// - Proposal SDs are tuned via Robbins–Monro during Stage 3b. +// - Difference-selection updates toggle inclusion indicators and adjust +// associated parameters with MH proposals. +// - This function runs entirely in C++ and is wrapped for parallel execution +// via `GibbsCompareChainRunner`. bgmCompareOutput run_gibbs_sampler_bgmCompare( int chain_id, arma::imat observations, diff --git a/src/bgmCompare_interface.cpp b/src/bgmCompare_interface.cpp index 7941a23d..ff1730ff 100644 --- a/src/bgmCompare_interface.cpp +++ b/src/bgmCompare_interface.cpp @@ -15,21 +15,19 @@ using namespace RcppParallel; -/** - * Container for the result of a single MCMC chain (bgmCompare model). - * - * Fields: - * - error: True if the chain terminated with an error, false otherwise. - * - error_msg: Error message if an error occurred (empty if none). - * - chain_id: Integer identifier for the chain (1-based). - * - result: bgmCompareOutput object containing chain results - * (samples, diagnostics, metadata). - * - * Usage: - * - Used in parallel execution to collect results from each chain. - * - Checked after execution to propagate errors or assemble outputs - * into an R-accessible list. - */ +// Container for the result of a single MCMC chain (bgmCompare model). +// +// Fields: +// - error: True if the chain terminated with an error, false otherwise. +// - error_msg: Error message if an error occurred (empty if none). +// - chain_id: Integer identifier for the chain (1-based). +// - result: bgmCompareOutput object containing chain results +// (samples, diagnostics, metadata). +// +// Usage: +// - Used in parallel execution to collect results from each chain. +// - Checked after execution to propagate errors or assemble outputs +// into an R-accessible list. struct bgmCompareChainResult { bool error; std::string error_msg; @@ -39,60 +37,58 @@ struct bgmCompareChainResult { -/** - * Parallel worker for running a single Gibbs sampling chain (bgmCompare model). - * - * This struct wraps all inputs needed for one chain and provides an - * `operator()` so that multiple chains can be launched in parallel with TBB. - * - * Workflow per chain: - * - Construct a chain-specific RNG from `chain_rngs`. - * - Copy master statistics and observation data into per-chain buffers. - * - Call `run_gibbs_sampler_bgmCompare()` to execute the full chain. - * - Catch and record any errors (sets `error = true` and stores `error_msg`). - * - Store results into the shared `results` vector at the chain index. - * - * Inputs (stored as const references or values): - * - observations_master: Input observation matrix (persons × variables). - * - num_groups: Number of groups. - * - counts_per_category_master: Group-level category counts. - * - blume_capel_stats_master: Group-level Blume–Capel sufficient statistics. - * - pairwise_stats_master: Group-level pairwise sufficient statistics. - * - num_categories: Number of categories per variable. - * - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. - * - pairwise_scale: Scale for Cauchy prior on baseline pairwise effects. - * - difference_scale: Scale for Cauchy prior on group differences. - * - difference_selection_alpha, difference_selection_beta: Hyperparameters for difference-selection prior. - * - difference_prior: Choice of prior distribution for group differences. - * - iter, warmup: Iteration counts. - * - na_impute: If true, perform missing data imputation. - * - missing_data_indices: Indices of missing observations. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - difference_selection: If true, perform difference selection updates. - * - main_effect_indices: Index ranges for main effects. - * - pairwise_effect_indices: Index ranges for pairwise effects. - * - target_accept: Target acceptance rate for adaptive methods. - * - nuts_max_depth: Maximum tree depth for NUTS. - * - learn_mass_matrix: If true, adapt mass matrix during warmup. - * - projection: Group projection matrix. - * - group_membership: Group assignment for each observation. - * - group_indices: Row ranges [start,end] for each group in observations. - * - interaction_index_matrix: Lookup table of variable pairs. - * - inclusion_probability_master: Prior inclusion probabilities for pairwise effects. - * - chain_rngs: Pre-initialized RNG engines (one per chain). - * - update_method: Sampler type ("adaptive-metropolis", "hamiltonian-mc", "nuts"). - * - hmc_num_leapfrogs: Number of leapfrog steps (HMC). - * - * Output: - * - results: Vector of `bgmCompareChainResult` objects, one per chain, filled in place. - * - * Notes: - * - Each worker instance is shared across threads but invoked with different - * [begin,end) ranges, corresponding to chain indices. - * - Per-chain copies of statistics and observations prevent cross-thread mutation. - * - Errors are caught locally so one failing chain does not crash the entire run. - */ +// Parallel worker for running a single Gibbs sampling chain (bgmCompare model). +// +// This struct wraps all inputs needed for one chain and provides an +// `operator()` so that multiple chains can be launched in parallel with TBB. +// +// Workflow per chain: +// - Construct a chain-specific RNG from `chain_rngs`. +// - Copy master statistics and observation data into per-chain buffers. +// - Call `run_gibbs_sampler_bgmCompare()` to execute the full chain. +// - Catch and record any errors (sets `error = true` and stores `error_msg`). +// - Store results into the shared `results` vector at the chain index. +// +// Inputs (stored as const references or values): +// - observations_master: Input observation matrix (persons × variables). +// - num_groups: Number of groups. +// - counts_per_category_master: Group-level category counts. +// - blume_capel_stats_master: Group-level Blume–Capel sufficient statistics. +// - pairwise_stats_master: Group-level pairwise sufficient statistics. +// - num_categories: Number of categories per variable. +// - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. +// - pairwise_scale: Scale for Cauchy prior on baseline pairwise effects. +// - difference_scale: Scale for Cauchy prior on group differences. +// - difference_selection_alpha, difference_selection_beta: Hyperparameters for difference-selection prior. +// - difference_prior: Choice of prior distribution for group differences. +// - iter, warmup: Iteration counts. +// - na_impute: If true, perform missing data imputation. +// - missing_data_indices: Indices of missing observations. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - difference_selection: If true, perform difference selection updates. +// - main_effect_indices: Index ranges for main effects. +// - pairwise_effect_indices: Index ranges for pairwise effects. +// - target_accept: Target acceptance rate for adaptive methods. +// - nuts_max_depth: Maximum tree depth for NUTS. +// - learn_mass_matrix: If true, adapt mass matrix during warmup. +// - projection: Group projection matrix. +// - group_membership: Group assignment for each observation. +// - group_indices: Row ranges [start,end] for each group in observations. +// - interaction_index_matrix: Lookup table of variable pairs. +// - inclusion_probability_master: Prior inclusion probabilities for pairwise effects. +// - chain_rngs: Pre-initialized RNG engines (one per chain). +// - update_method: Sampler type ("adaptive-metropolis", "hamiltonian-mc", "nuts"). +// - hmc_num_leapfrogs: Number of leapfrog steps (HMC). +// +// Output: +// - results: Vector of `bgmCompareChainResult` objects, one per chain, filled in place. +// +// Notes: +// - Each worker instance is shared across threads but invoked with different +// [begin,end) ranges, corresponding to chain indices. +// - Per-chain copies of statistics and observations prevent cross-thread mutation. +// - Errors are caught locally so one failing chain does not crash the entire run. struct GibbsCompareChainRunner : public Worker { const arma::imat& observations_master; const int num_groups; @@ -287,69 +283,67 @@ struct GibbsCompareChainRunner : public Worker { -/** - * Runs multiple parallel Gibbs sampling chains for the bgmCompare model. - * - * This function is the main entry point from R into the C++ backend for bgmCompare. - * It launches `num_chains` independent chains in parallel using TBB, - * each managed by `GibbsCompareChainRunner`. - * - * Workflow: - * - Initialize a per-chain RNG from the global seed. - * - Construct a `GibbsCompareChainRunner` worker with all shared inputs. - * - Launch the worker across chains using `parallelFor`. - * - Collect results from all chains into an Rcpp::List. - * - * Inputs: - * - observations: Observation matrix (persons × variables). - * - num_groups: Number of groups. - * - counts_per_category: Group-level category counts (for ordinal variables). - * - blume_capel_stats: Group-level sufficient statistics (for Blume–Capel variables). - * - pairwise_stats: Group-level pairwise sufficient statistics. - * - num_categories: Number of categories per variable. - * - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. - * - pairwise_scale: Scale for Cauchy prior on baseline pairwise effects. - * - difference_scale: Scale for Cauchy prior on group differences. - * - difference_selection_alpha, difference_selection_beta: Hyperparameters for difference-selection prior. - * - difference_prior: Choice of prior distribution for group differences. - * - iter: Number of post-warmup iterations to draw. - * - warmup: Number of warmup iterations. - * - na_impute: If true, perform missing data imputation during sampling. - * - missing_data_indices: Indices of missing entries in observations. - * - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). - * - baseline_category: Reference categories for Blume–Capel variables. - * - difference_selection: If true, perform difference selection updates. - * - main_effect_indices: Index ranges [row_start,row_end] for each variable. - * - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. - * - target_accept: Target acceptance rate for adaptive samplers. - * - nuts_max_depth: Maximum tree depth for NUTS. - * - learn_mass_matrix: If true, adapt the mass matrix during warmup. - * - projection: Group projection matrix (num_groups × (num_groups − 1)). - * - group_membership: Group assignment for each observation. - * - group_indices: Row ranges [start,end] for each group in observations. - * - interaction_index_matrix: Lookup table of variable pairs. - * - inclusion_probability: Prior inclusion probabilities for pairwise effects. - * - num_chains: Number of chains to run. - * - nThreads: Maximum number of threads for parallel execution. - * - seed: Base random seed (incremented per chain). - * - update_method: Sampler type ("adaptive-metropolis", "hamiltonian-mc", "nuts"). - * - hmc_num_leapfrogs: Number of leapfrog steps for HMC. - * - * Returns: - * - Rcpp::List of length `num_chains`, where each element is either: - * * An error record (fields: "error", "chain_id"), if the chain failed. - * * A result list containing: - * - "main_samples": Posterior samples of main effects. - * - "pairwise_samples": Posterior samples of pairwise effects. - * - "treedepth__", "divergent__", "energy__": NUTS diagnostics. - * - "indicator_samples": Inclusion indicators (if selection was enabled). - * - "chain_id": Identifier of the chain. - * - * Notes: - * - Parallel execution is controlled by TBB; `nThreads` limits concurrency. - * - Each chain gets its own RNG stream, initialized as `seed + chain_id`. - * - This function is called by the exported R function `bgmCompare()`. - */ +// Runs multiple parallel Gibbs sampling chains for the bgmCompare model. +// +// This function is the main entry point from R into the C++ backend for bgmCompare. +// It launches `num_chains` independent chains in parallel using TBB, +// each managed by `GibbsCompareChainRunner`. +// +// Workflow: +// - Initialize a per-chain RNG from the global seed. +// - Construct a `GibbsCompareChainRunner` worker with all shared inputs. +// - Launch the worker across chains using `parallelFor`. +// - Collect results from all chains into an Rcpp::List. +// +// Inputs: +// - observations: Observation matrix (persons × variables). +// - num_groups: Number of groups. +// - counts_per_category: Group-level category counts (for ordinal variables). +// - blume_capel_stats: Group-level sufficient statistics (for Blume–Capel variables). +// - pairwise_stats: Group-level pairwise sufficient statistics. +// - num_categories: Number of categories per variable. +// - main_alpha, main_beta: Hyperparameters for Beta priors on main effects. +// - pairwise_scale: Scale for Cauchy prior on baseline pairwise effects. +// - difference_scale: Scale for Cauchy prior on group differences. +// - difference_selection_alpha, difference_selection_beta: Hyperparameters for difference-selection prior. +// - difference_prior: Choice of prior distribution for group differences. +// - iter: Number of post-warmup iterations to draw. +// - warmup: Number of warmup iterations. +// - na_impute: If true, perform missing data imputation during sampling. +// - missing_data_indices: Indices of missing entries in observations. +// - is_ordinal_variable: Indicator (1 = ordinal, 0 = Blume–Capel). +// - baseline_category: Reference categories for Blume–Capel variables. +// - difference_selection: If true, perform difference selection updates. +// - main_effect_indices: Index ranges [row_start,row_end] for each variable. +// - pairwise_effect_indices: Lookup table mapping (var1,var2) → row in pairwise_effects. +// - target_accept: Target acceptance rate for adaptive samplers. +// - nuts_max_depth: Maximum tree depth for NUTS. +// - learn_mass_matrix: If true, adapt the mass matrix during warmup. +// - projection: Group projection matrix (num_groups × (num_groups − 1)). +// - group_membership: Group assignment for each observation. +// - group_indices: Row ranges [start,end] for each group in observations. +// - interaction_index_matrix: Lookup table of variable pairs. +// - inclusion_probability: Prior inclusion probabilities for pairwise effects. +// - num_chains: Number of chains to run. +// - nThreads: Maximum number of threads for parallel execution. +// - seed: Base random seed (incremented per chain). +// - update_method: Sampler type ("adaptive-metropolis", "hamiltonian-mc", "nuts"). +// - hmc_num_leapfrogs: Number of leapfrog steps for HMC. +// +// Returns: +// - Rcpp::List of length `num_chains`, where each element is either: +// * An error record (fields: "error", "chain_id"), if the chain failed. +// * A result list containing: +// - "main_samples": Posterior samples of main effects. +// - "pairwise_samples": Posterior samples of pairwise effects. +// - "treedepth__", "divergent__", "energy__": NUTS diagnostics. +// - "indicator_samples": Inclusion indicators (if selection was enabled). +// - "chain_id": Identifier of the chain. +// +// Notes: +// - Parallel execution is controlled by TBB; `nThreads` limits concurrency. +// - Each chain gets its own RNG stream, initialized as `seed + chain_id`. +// - This function is called by the exported R function `bgmCompare()`. // [[Rcpp::export]] Rcpp::List run_bgmCompare_parallel( const arma::imat& observations, diff --git a/src/mcmc/algorithms/nuts.cpp b/src/mcmc/algorithms/nuts.cpp index 5c5a4dcb..aaeb89cf 100644 --- a/src/mcmc/algorithms/nuts.cpp +++ b/src/mcmc/algorithms/nuts.cpp @@ -8,26 +8,22 @@ #include "rng/rng_utils.h" -/** - * The generalized U-turn criterion used here is described in Betancourt (2017). - * The implementation follows the approach in STAN's base_nuts.hpp (BSD-3-Clause license). - * - * References: - * Betancourt, M. (2017). A Conceptual Introduction to Hamiltonian Monte Carlo. - * arXiv preprint arXiv:1701.02434. - * Stan Development Team. base_nuts.hpp. - * https://github.com/stan-dev/stan/blob/develop/src/stan/mcmc/hmc/nuts/base_nuts.hpp - */ - - -/** - * Computes the generalized U-turn criterion for the NUTS algorithm - * - * @param p_sharp_minus Sharp momentum (M^{-1} p) at backward end - * @param p_sharp_plus Sharp momentum (M^{-1} p) at forward end - * @param rho Sum of momenta along the trajectory - * @return true if criterion satisfied (continue), false if U-turn detected (stop) - */ +// The generalized U-turn criterion used here is described in Betancourt (2017). +// The implementation follows the approach in STAN's base_nuts.hpp (BSD-3-Clause license). +// +// References: +// Betancourt, M. (2017). A Conceptual Introduction to Hamiltonian Monte Carlo. +// arXiv preprint arXiv:1701.02434. +// Stan Development Team. base_nuts.hpp. +// https://github.com/stan-dev/stan/blob/develop/src/stan/mcmc/hmc/nuts/base_nuts.hpp + + +// Computes the generalized U-turn criterion for the NUTS algorithm +// +// @param p_sharp_minus Sharp momentum (M^{-1} p) at backward end +// @param p_sharp_plus Sharp momentum (M^{-1} p) at forward end +// @param rho Sum of momenta along the trajectory +// @return true if criterion satisfied (continue), false if U-turn detected (stop) bool compute_criterion(const arma::vec& p_sharp_minus, const arma::vec& p_sharp_plus, const arma::vec& rho) { @@ -36,25 +32,23 @@ bool compute_criterion(const arma::vec& p_sharp_minus, -/** - * Recursively builds a binary tree of leapfrog steps in the NUTS algorithm - * - * Explores forward or backward in time, evaluating trajectory termination - * criteria. Based on Algorithm 6 in Hoffman & Gelman (2014). - * - * @param theta Current position at the base of the tree - * @param r Current momentum at the base of the tree - * @param log_u Log slice variable for accept/reject decision - * @param v Direction of expansion (-1 backward, +1 forward) - * @param j Current tree depth - * @param step_size Step size used in leapfrog integration - * @param theta_0 Initial position at the start of sampling - * @param r0 Initial momentum at the start of sampling - * @param logp0 Log posterior at initial position - * @param kin0 Kinetic energy at initial momentum - * @param memo Memoizer object for caching evaluations - * @return BuildTreeResult with updated endpoints, candidate sample, and diagnostics - */ +// Recursively builds a binary tree of leapfrog steps in the NUTS algorithm +// +// Explores forward or backward in time, evaluating trajectory termination +// criteria. Based on Algorithm 6 in Hoffman & Gelman (2014). +// +// @param theta Current position at the base of the tree +// @param r Current momentum at the base of the tree +// @param log_u Log slice variable for accept/reject decision +// @param v Direction of expansion (-1 backward, +1 forward) +// @param j Current tree depth +// @param step_size Step size used in leapfrog integration +// @param theta_0 Initial position at the start of sampling +// @param r0 Initial momentum at the start of sampling +// @param logp0 Log posterior at initial position +// @param kin0 Kinetic energy at initial momentum +// @param memo Memoizer object for caching evaluations +// @return BuildTreeResult with updated endpoints, candidate sample, and diagnostics BuildTreeResult build_tree( const arma::vec& theta, const arma::vec& r, diff --git a/src/mcmc/execution/chain_result.h b/src/mcmc/execution/chain_result.h index 32e24e8d..ae1b1e3c 100644 --- a/src/mcmc/execution/chain_result.h +++ b/src/mcmc/execution/chain_result.h @@ -14,29 +14,36 @@ class ChainResult { public: ChainResult() = default; - // Error handling + /// True if the chain terminated with an error. bool error = false; + /// True if the chain was interrupted by the user. bool userInterrupt = false; + /// Error message (empty if none). std::string error_msg; - // Chain identifier + /// Integer identifier for the chain (1-based). int chain_id = 0; - // Parameter samples (param_dim × n_iter) + /// Parameter samples (param_dim x n_iter). arma::mat samples; - // Edge indicator samples (n_edges × n_iter), only if edge_selection = true + /// Edge indicator samples (n_edges x n_iter), only if edge_selection = true. arma::imat indicator_samples; + /// Whether indicator samples are stored. bool has_indicators = false; - // SBM allocation samples (n_variables × n_iter), only if SBM edge prior + /// SBM allocation samples (n_variables x n_iter), only if SBM edge prior. arma::imat allocation_samples; + /// Whether allocation samples are stored. bool has_allocations = false; - // NUTS/HMC diagnostics (n_iter), only if using NUTS/HMC + /// NUTS/HMC tree depth diagnostics (n_iter). arma::ivec treedepth_samples; + /// NUTS/HMC divergent transition flags (n_iter). arma::ivec divergent_samples; + /// NUTS/HMC energy diagnostic (n_iter). arma::vec energy_samples; + /// Whether NUTS/HMC diagnostics are stored. bool has_nuts_diagnostics = false; /** diff --git a/src/mcmc/execution/sampler_config.h b/src/mcmc/execution/sampler_config.h index d2ce341b..595c819a 100644 --- a/src/mcmc/execution/sampler_config.h +++ b/src/mcmc/execution/sampler_config.h @@ -12,28 +12,32 @@ * - Edge selection settings */ struct SamplerConfig { - // Sampler type: "adaptive_metropolis", "nuts", "hmc" + /// Sampler type: "adaptive_metropolis", "nuts", or "hmc". std::string sampler_type = "adaptive_metropolis"; - // Iteration counts + /// Number of post-warmup iterations. int no_iter = 1000; + /// Number of warmup iterations. int no_warmup = 500; - // NUTS/HMC parameters + /// Maximum NUTS tree depth. int max_tree_depth = 10; - int num_leapfrogs = 10; // For HMC only + /// Number of leapfrog steps (HMC only). + int num_leapfrogs = 10; + /// Initial step size for gradient-based samplers. double initial_step_size = 0.1; + /// Target acceptance rate for dual-averaging adaptation. double target_acceptance = 0.8; - // Edge selection settings + /// Enable spike-and-slab edge selection. bool edge_selection = false; - // Missing data imputation + /// Enable missing-data imputation during sampling. bool na_impute = false; - // Random seed + /// Random seed. int seed = 42; - // Constructor with defaults + /// Default constructor. SamplerConfig() = default; }; diff --git a/src/mcmc/samplers/hmc_adaptation.h b/src/mcmc/samplers/hmc_adaptation.h index 9c31de64..064f0bbe 100644 --- a/src/mcmc/samplers/hmc_adaptation.h +++ b/src/mcmc/samplers/hmc_adaptation.h @@ -16,13 +16,21 @@ */ class DualAveraging { public: + /// Current log step size. double log_step_size; + /// Smoothed log step size (final estimate). double log_step_size_avg; + /// Running error statistic. double hbar; + /// Bias term: log(10 * initial_step_size). double mu; + /// Shrinkage parameter (default 0.05). double gamma; + /// Stabilisation offset (default 10). double t0; + /// Decay exponent for averaging weights (default 0.75). double kappa; + /// Iteration counter. int t; DualAveraging(double initial_step_size) @@ -68,8 +76,11 @@ class DualAveraging { */ class DiagMassMatrixAccumulator { public: + /// Number of samples accumulated. int count; + /// Running mean of parameter samples. arma::vec mean; + /// Running sum of squared deviations (Welford M2 statistic). arma::vec m2; DiagMassMatrixAccumulator(int dim) diff --git a/src/mcmc/samplers/metropolis_adaptation.h b/src/mcmc/samplers/metropolis_adaptation.h index 86eb8e06..ebd29e71 100644 --- a/src/mcmc/samplers/metropolis_adaptation.h +++ b/src/mcmc/samplers/metropolis_adaptation.h @@ -15,8 +15,11 @@ */ class MetropolisAdaptationController { public: + /// Reference to the proposal standard deviation matrix (modified in place). arma::mat& proposal_sd; + /// Total number of warmup iterations. const int total_warmup; + /// Target Metropolis acceptance rate. const double target_accept; MetropolisAdaptationController(arma::mat& proposal_sd_matrix, diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index bcfa607e..9d8d62f9 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -206,115 +206,110 @@ class MixedMRFModel : public BaseModel { // Counts and dimensions // ========================================================================= - size_t n_; // Number of observations - size_t p_; // Number of discrete variables - size_t q_; // Number of continuous variables - size_t num_main_; // Total main-effect params (Σ C_s for ord + 2 per BC) - size_t num_pairwise_xx_; // p(p-1)/2 - size_t num_pairwise_yy_; // q(q-1)/2 - size_t num_cross_; // p * q + size_t n_; ///< Number of observations + size_t p_; ///< Number of discrete variables + size_t q_; ///< Number of continuous variables + size_t num_main_; ///< Total main-effect params (sum C_s for ord + 2 per BC) + size_t num_pairwise_xx_; ///< p(p-1)/2 + size_t num_pairwise_yy_; ///< q(q-1)/2 + size_t num_cross_; ///< p * q // ========================================================================= // Data // ========================================================================= - arma::imat discrete_observations_; // Discrete observations (n × p) - // BC columns centered at baseline_category_ in ctor. - arma::mat discrete_observations_dbl_; // Double version (post-centering) - arma::mat continuous_observations_; // Continuous observations (n × q) - arma::ivec num_categories_; // Categories per discrete variable (p-vector) - int max_cats_; // max(num_categories) - arma::uvec is_ordinal_variable_; // 1 = ordinal, 0 = Blume-Capel (p-vector) - arma::ivec baseline_category_; // Reference category per discrete variable (p-vector) + arma::imat discrete_observations_; ///< Discrete observations (n x p), BC columns centered + arma::mat discrete_observations_dbl_; ///< Double version (post-centering) + arma::mat continuous_observations_; ///< Continuous observations (n x q) + arma::ivec num_categories_; ///< Categories per discrete variable (p-vector) + int max_cats_; ///< max(num_categories) + arma::uvec is_ordinal_variable_; ///< 1 = ordinal, 0 = Blume-Capel (p-vector) + arma::ivec baseline_category_; ///< Reference category per discrete variable (p-vector) // ========================================================================= // Sufficient statistics // ========================================================================= - arma::imat counts_per_category_; // (max_cats+1) × p category counts (ordinal only) - arma::imat blume_capel_stats_; // 2 × p linear/quadratic sums (BC only) + arma::imat counts_per_category_; ///< (max_cats+1) x p category counts (ordinal only) + arma::imat blume_capel_stats_; ///< 2 x p linear/quadratic sums (BC only) // ========================================================================= // Parameters // ========================================================================= - arma::mat mux_; // p × max_cats main effects - // Ordinal: mux_(s,c) = threshold for category c+1; - // category 0 is reference (fixed at 0). - // Blume-Capel: mux_(s,0) = linear α_s, - // mux_(s,1) = quadratic β_s. - arma::vec muy_; // q-vector continuous means - arma::mat Kxx_; // p × p discrete interactions (symmetric, zero diag) - arma::mat Kyy_; // q × q SPD precision matrix - arma::mat Kxy_; // p × q cross-type interactions + arma::mat mux_; ///< p x max_cats main effects (thresholds or alpha/beta) + arma::vec muy_; ///< q-vector continuous means + arma::mat Kxx_; ///< p x p discrete interactions (symmetric, zero diag) + arma::mat Kyy_; ///< q x q SPD precision matrix + arma::mat Kxy_; ///< p x q cross-type interactions // ========================================================================= // Edge indicators // ========================================================================= - // Combined (p+q) × (p+q) indicator matrix: - // Gxx block : rows [0,p), cols [0,p) — symmetric, zero diag - // Gyy block : rows [p,p+q), cols [p,p+q) — symmetric, zero diag - // Gxy block : rows [0,p), cols [p,p+q) — full p×q rectangle + /// Combined (p+q) x (p+q) indicator matrix. + /// Gxx block: rows [0,p), cols [0,p) -- symmetric, zero diag. + /// Gyy block: rows [p,p+q), cols [p,p+q) -- symmetric, zero diag. + /// Gxy block: rows [0,p), cols [p,p+q) -- full p x q rectangle. arma::imat edge_indicators_; - arma::mat inclusion_probability_; - bool edge_selection_; - bool edge_selection_active_; + arma::mat inclusion_probability_; ///< Prior inclusion probabilities + bool edge_selection_; ///< Enable edge selection + bool edge_selection_active_; ///< Currently in edge selection phase // ========================================================================= // Priors // ========================================================================= - double main_alpha_; // Beta prior α for main effects - double main_beta_; // Beta prior β for main effects - double pairwise_scale_; // Cauchy scale for interaction priors + double main_alpha_; ///< Beta prior alpha for main effects + double main_beta_; ///< Beta prior beta for main effects + double pairwise_scale_; ///< Cauchy scale for interaction priors // ========================================================================= // Proposal SDs (Robbins-Monro adapted) // ========================================================================= - arma::mat prop_sd_mux_; // p × max_cats - arma::vec prop_sd_muy_; // q-vector - arma::mat prop_sd_Kxx_; // p × p - arma::mat prop_sd_Kyy_; // q × q - arma::mat prop_sd_Kxy_; // p × q - int total_warmup_ = 0; // stored by init_metropolis_adaptation + arma::mat prop_sd_mux_; ///< p x max_cats + arma::vec prop_sd_muy_; ///< q-vector + arma::mat prop_sd_Kxx_; ///< p x p + arma::mat prop_sd_Kyy_; ///< q x q + arma::mat prop_sd_Kxy_; ///< p x q + int total_warmup_ = 0; ///< Stored by init_metropolis_adaptation // ========================================================================= // Cached quantities // ========================================================================= - arma::mat Kyy_chol_; // q × q upper Cholesky of Kyy (Kyy = R'R) - arma::mat inv_cholesky_yy_; // q × q R^{-1} (upper triangular) - arma::mat covariance_yy_; // q × q Kyy^{-1} = R^{-1} R^{-T} - double Kyy_log_det_; // log|Kyy| - arma::mat Theta_; // p × p Kxx + 2 Kxy covariance_yy_ Kxy' (marginal PL only) - arma::mat conditional_mean_; // n × q μ_y' + 2 discrete_obs Kxy covariance_yy_ + arma::mat Kyy_chol_; ///< q x q upper Cholesky of Kyy (Kyy = R'R) + arma::mat inv_cholesky_yy_; ///< q x q R^{-1} (upper triangular) + arma::mat covariance_yy_; ///< q x q Kyy^{-1} = R^{-1} R^{-T} + double Kyy_log_det_; ///< log|Kyy| + arma::mat Theta_; ///< p x p Kxx + 2 Kxy covariance_yy_ Kxy' (marginal PL) + arma::mat conditional_mean_; ///< n x q mu_y' + 2 discrete_obs Kxy covariance_yy_ // Rank-1 Cholesky update workspace - std::array kyy_constants_{}; // reparameterization constants - arma::mat precision_yy_proposal_; // q × q scratch for proposed Kyy - arma::vec kyy_v1_ = {0, -1}; // rank-2 decomposition helpers - arma::vec kyy_v2_ = {0, 0}; - arma::vec kyy_vf1_; // q-vectors, zeroed between uses - arma::vec kyy_vf2_; - arma::vec kyy_u1_; - arma::vec kyy_u2_; + std::array kyy_constants_{}; ///< Reparameterization constants + arma::mat precision_yy_proposal_; ///< q x q scratch for proposed Kyy + arma::vec kyy_v1_ = {0, -1}; ///< Rank-2 decomposition helper 1 + arma::vec kyy_v2_ = {0, 0}; ///< Rank-2 decomposition helper 2 + arma::vec kyy_vf1_; ///< q-vector, zeroed between uses + arma::vec kyy_vf2_; ///< q-vector, zeroed between uses + arma::vec kyy_u1_; ///< q-vector workspace + arma::vec kyy_u2_; ///< q-vector workspace // ========================================================================= // Configuration // ========================================================================= - bool use_marginal_pl_; // true = marginal, false = conditional + bool use_marginal_pl_; ///< true = marginal, false = conditional // ========================================================================= // RNG and edge-update order // ========================================================================= - SafeRNG rng_; - arma::uvec edge_order_xx_; // Shuffled xx-edge pair indices - arma::uvec edge_order_yy_; // Shuffled yy-edge pair indices - arma::uvec edge_order_xy_; // Shuffled xy-edge pair indices + SafeRNG rng_; ///< Per-chain random number generator + arma::uvec edge_order_xx_; ///< Shuffled xx-edge pair indices + arma::uvec edge_order_yy_; ///< Shuffled yy-edge pair indices + arma::uvec edge_order_xy_; ///< Shuffled xy-edge pair indices // ========================================================================= // Private helpers diff --git a/src/models/omrf/omrf_model.h b/src/models/omrf/omrf_model.h index 5d86c138..5dca2b8f 100644 --- a/src/models/omrf/omrf_model.h +++ b/src/models/omrf/omrf_model.h @@ -266,68 +266,68 @@ class OMRFModel : public BaseModel { // ========================================================================= // Data - size_t n_; // Number of observations - size_t p_; // Number of variables - arma::imat observations_; // Categorical observations (n × p) - arma::mat observations_double_; // Observations as double (for efficient matrix ops) - arma::mat observations_double_t_; // Transposed observations (for BLAS pairwise gradient) - arma::ivec num_categories_; // Categories per variable - arma::uvec is_ordinal_variable_; // 1 = ordinal, 0 = Blume-Capel - arma::ivec baseline_category_; // Reference category for Blume-Capel + size_t n_; ///< Number of observations + size_t p_; ///< Number of variables + arma::imat observations_; ///< Categorical observations (n x p) + arma::mat observations_double_; ///< Observations as double (for efficient matrix ops) + arma::mat observations_double_t_; ///< Transposed observations (for BLAS pairwise gradient) + arma::ivec num_categories_; ///< Categories per variable + arma::uvec is_ordinal_variable_; ///< 1 = ordinal, 0 = Blume-Capel + arma::ivec baseline_category_; ///< Reference category for Blume-Capel // Sufficient statistics - arma::imat counts_per_category_; // Category counts (max_cats+1 × p) - arma::imat blume_capel_stats_; // [linear_sum, quadratic_sum] for BC vars (2 × p) - arma::imat pairwise_stats_; // X^T X - arma::mat residual_matrix_; // X * pairwise_effects (n × p) + arma::imat counts_per_category_; ///< Category counts (max_cats+1 x p) + arma::imat blume_capel_stats_; ///< [linear_sum, quadratic_sum] for BC vars (2 x p) + arma::imat pairwise_stats_; ///< X^T X + arma::mat residual_matrix_; ///< X * pairwise_effects (n x p) // Parameters - arma::mat main_effects_; // Main effect parameters (p × max_cats) - arma::mat pairwise_effects_; // Pairwise interaction strengths (p × p, symmetric) - arma::imat edge_indicators_; // Edge inclusion indicators (p × p, symmetric binary) + arma::mat main_effects_; ///< Main effect parameters (p x max_cats) + arma::mat pairwise_effects_; ///< Pairwise interaction strengths (p x p, symmetric) + arma::imat edge_indicators_; ///< Edge inclusion indicators (p x p, symmetric binary) // Priors - arma::mat inclusion_probability_; // Prior inclusion probabilities - double main_alpha_; // Beta prior α - double main_beta_; // Beta prior β - double pairwise_scale_; // Cauchy scale for pairwise effects - arma::mat pairwise_scaling_factors_; // Per-pair scaling factors for Cauchy prior + arma::mat inclusion_probability_; ///< Prior inclusion probabilities + double main_alpha_; ///< Beta prior alpha + double main_beta_; ///< Beta prior beta + double pairwise_scale_; ///< Cauchy scale for pairwise effects + arma::mat pairwise_scaling_factors_; ///< Per-pair scaling factors for Cauchy prior // Model configuration - bool edge_selection_; // Enable edge selection - bool edge_selection_active_; // Currently in edge selection phase + bool edge_selection_; ///< Enable edge selection + bool edge_selection_active_; ///< Currently in edge selection phase // Dimension tracking - size_t num_main_; // Total number of main effect parameters - size_t num_pairwise_; // Number of possible pairwise effects + size_t num_main_; ///< Total number of main effect parameters + size_t num_pairwise_; ///< Number of possible pairwise effects // Proposal SDs (adapted by MetropolisAdaptationController during warmup) - arma::mat proposal_sd_main_; - arma::mat proposal_sd_pairwise_; + arma::mat proposal_sd_main_; ///< Proposal SD for main effects + arma::mat proposal_sd_pairwise_; ///< Proposal SD for pairwise effects // Metropolis adaptation controllers (created by init_metropolis_adaptation) - std::unique_ptr metropolis_main_adapter_; - std::unique_ptr metropolis_pairwise_adapter_; + std::unique_ptr metropolis_main_adapter_; ///< Main-effect adapter + std::unique_ptr metropolis_pairwise_adapter_; ///< Pairwise-effect adapter // RNG - SafeRNG rng_; + SafeRNG rng_; ///< Per-chain random number generator // NUTS/HMC settings - double step_size_; - arma::vec inv_mass_; + double step_size_; ///< Current step size for gradient-based samplers + arma::vec inv_mass_; ///< Inverse mass diagonal // Missing data handling - bool has_missing_; - arma::imat missing_index_; + bool has_missing_; ///< Whether the data contains missing values + arma::imat missing_index_; ///< (row, col) indices of missing entries // Cached gradient components - arma::vec grad_obs_cache_; - arma::imat index_matrix_cache_; - bool gradient_cache_valid_; + arma::vec grad_obs_cache_; ///< Cached observed-data gradient + arma::imat index_matrix_cache_; ///< Cached parameter index map + bool gradient_cache_valid_; ///< Whether the gradient cache is current // Interaction indexing (for edge updates) - arma::imat interaction_index_; - arma::uvec shuffled_edge_order_; // Pre-shuffled order (set in prepare_iteration) + arma::imat interaction_index_; ///< Maps edge pair to index + arma::uvec shuffled_edge_order_; ///< Pre-shuffled order (set in prepare_iteration) // ========================================================================= // Private helper methods diff --git a/src/mrf_prediction.cpp b/src/mrf_prediction.cpp index a4315194..2bea4436 100644 --- a/src/mrf_prediction.cpp +++ b/src/mrf_prediction.cpp @@ -8,22 +8,20 @@ using namespace Rcpp; // GGM Conditional Prediction // ============================================================================ -/** - * Compute conditional Gaussian parameters for a GGM. - * - * For a GGM with precision matrix Omega, the conditional distribution of - * X_j given X_{-j} = x_{-j} is: - * - * X_j | X_{-j} ~ N( -omega_{jj}^{-1} sum_{k != j} omega_{jk} x_k, - * omega_{jj}^{-1} ) - * - * @param observations n x p matrix of observed continuous data - * @param predict_vars 0-based indices of variables to predict - * @param precision p x p precision matrix (Omega) - * - * @return List of n x 2 matrices (one per predicted variable), where - * column 0 = conditional mean, column 1 = conditional SD. - */ +// Compute conditional Gaussian parameters for a GGM. +// +// For a GGM with precision matrix Omega, the conditional distribution of +// X_j given X_{-j} = x_{-j} is: +// +// X_j | X_{-j} ~ N( -omega_{jj}^{-1} sum_{k != j} omega_{jk} x_k, +// omega_{jj}^{-1} ) +// +// @param observations n x p matrix of observed continuous data +// @param predict_vars 0-based indices of variables to predict +// @param precision p x p precision matrix (Omega) +// +// @return List of n x 2 matrices (one per predicted variable), where +// column 0 = conditional mean, column 1 = conditional SD. // [[Rcpp::export]] Rcpp::List compute_conditional_ggm( const arma::mat& observations, @@ -165,31 +163,29 @@ Rcpp::List compute_conditional_probs( // Mixed MRF Conditional Prediction // ============================================================================ -/** - * Compute conditional distributions for a mixed MRF. - * - * For discrete variables: P(x_s = c | x_{-s}, y) using the conditional OMRF. - * For continuous variables: E(y_j | y_{-j}, x) and SD(y_j | y_{-j}, x) - * using the conditional GGM. - * - * @param x_observations n x p integer matrix of discrete data. - * @param y_observations n x q numeric matrix of continuous data. - * @param predict_vars 0-based indices into the combined (p+q) variable list. - * Indices 0..p-1 refer to discrete variables, - * p..p+q-1 refer to continuous variables. - * @param Kxx p x p pairwise interactions (diagonal zero). - * @param Kxy p x q cross interactions. - * @param Kyy q x q precision matrix. - * @param mux p x max_cats threshold / Blume-Capel parameters. - * @param muy q-vector of continuous means. - * @param num_categories p-vector: categories per discrete variable. - * @param variable_type p-vector: "ordinal" or "blume-capel". - * @param baseline_category p-vector. - * - * @return List of prediction matrices (one per predicted variable). - * For discrete: n x (num_cats+1) probability matrix. - * For continuous: n x 2 matrix (mean, sd). - */ +// Compute conditional distributions for a mixed MRF. +// +// For discrete variables: P(x_s = c | x_{-s}, y) using the conditional OMRF. +// For continuous variables: E(y_j | y_{-j}, x) and SD(y_j | y_{-j}, x) +// using the conditional GGM. +// +// @param x_observations n x p integer matrix of discrete data. +// @param y_observations n x q numeric matrix of continuous data. +// @param predict_vars 0-based indices into the combined (p+q) variable list. +// Indices 0..p-1 refer to discrete variables, +// p..p+q-1 refer to continuous variables. +// @param Kxx p x p pairwise interactions (diagonal zero). +// @param Kxy p x q cross interactions. +// @param Kyy q x q precision matrix. +// @param mux p x max_cats threshold / Blume-Capel parameters. +// @param muy q-vector of continuous means. +// @param num_categories p-vector: categories per discrete variable. +// @param variable_type p-vector: "ordinal" or "blume-capel". +// @param baseline_category p-vector. +// +// @return List of prediction matrices (one per predicted variable). +// For discrete: n x (num_cats+1) probability matrix. +// For continuous: n x 2 matrix (mean, sd). // [[Rcpp::export]] Rcpp::List compute_conditional_mixed( const arma::imat& x_observations, diff --git a/src/mrf_simulation.cpp b/src/mrf_simulation.cpp index 3a85f9ad..f746651a 100644 --- a/src/mrf_simulation.cpp +++ b/src/mrf_simulation.cpp @@ -15,32 +15,30 @@ using namespace RcppParallel; // MRF Simulation Core Functions (Thread-Safe) // ============================================================================ -/** - * Function: simulate_mrf - * - * Simulates observations from a Markov Random Field using Gibbs sampling. - * Supports both ordinal and Blume-Capel variable types. - * - * Inputs: - * - num_states: Number of observations to simulate. - * - num_variables: Number of variables in the MRF. - * - num_categories: Number of categories per variable (on top of baseline 0). - * - pairwise: Symmetric pairwise interaction matrix (diagonal ignored). - * - main: Main effect parameters (variables x max_categories). - * For ordinal: threshold parameters for categories 1..K. - * For Blume-Capel: column 0 = linear (alpha), column 1 = quadratic (beta). - * - variable_type: Type of each variable ("ordinal" or "blume-capel"). - * - baseline_category: Baseline category for Blume-Capel variables (0 for ordinal). - * - iter: Number of Gibbs sampling iterations. - * - rng: Thread-safe random number generator. - * - * Returns: - * - Integer matrix of simulated observations (num_states x num_variables). - * - * Notes: - * - Diagonal of pairwise matrix is explicitly ignored (set to zero internally). - * - For ordinal variables, baseline_category should be 0. - */ +// Function: simulate_mrf +// +// Simulates observations from a Markov Random Field using Gibbs sampling. +// Supports both ordinal and Blume-Capel variable types. +// +// Inputs: +// - num_states: Number of observations to simulate. +// - num_variables: Number of variables in the MRF. +// - num_categories: Number of categories per variable (on top of baseline 0). +// - pairwise: Symmetric pairwise interaction matrix (diagonal ignored). +// - main: Main effect parameters (variables x max_categories). +// For ordinal: threshold parameters for categories 1..K. +// For Blume-Capel: column 0 = linear (alpha), column 1 = quadratic (beta). +// - variable_type: Type of each variable ("ordinal" or "blume-capel"). +// - baseline_category: Baseline category for Blume-Capel variables (0 for ordinal). +// - iter: Number of Gibbs sampling iterations. +// - rng: Thread-safe random number generator. +// +// Returns: +// - Integer matrix of simulated observations (num_states x num_variables). +// +// Notes: +// - Diagonal of pairwise matrix is explicitly ignored (set to zero internally). +// - For ordinal variables, baseline_category should be 0. arma::imat simulate_mrf( int num_states, int num_variables, @@ -236,25 +234,23 @@ IntegerMatrix sample_bcomrf_gibbs(int num_states, // GGM Simulation (Direct Multivariate Normal Sampling) // ============================================================================ -/** - * Simulate observations from a Gaussian Graphical Model. - * - * Given a precision matrix Omega, draws num_states observations from - * N(means, Omega^{-1}) using the Cholesky factorization of the covariance. - * - * Algorithm: - * 1. Compute Sigma = Omega^{-1} via arma::inv_sympd. - * 2. Cholesky decompose: L = chol(Sigma, "lower") so Sigma = L L'. - * 3. Draw Z ~ N(0, I) of size (num_states x p). - * 4. Return X = ones * means' + Z * L'. - * - * @param num_states Number of observations to simulate. - * @param precision p x p positive-definite precision matrix (Omega). - * @param means p-vector of variable means (can be all zeros). - * @param rng Thread-safe random number generator. - * - * @return num_states x p matrix of simulated continuous observations. - */ +// Simulate observations from a Gaussian Graphical Model. +// +// Given a precision matrix Omega, draws num_states observations from +// N(means, Omega^{-1}) using the Cholesky factorization of the covariance. +// +// Algorithm: +// 1. Compute Sigma = Omega^{-1} via arma::inv_sympd. +// 2. Cholesky decompose: L = chol(Sigma, "lower") so Sigma = L L'. +// 3. Draw Z ~ N(0, I) of size (num_states x p). +// 4. Return X = ones * means' + Z * L'. +// +// @param num_states Number of observations to simulate. +// @param precision p x p positive-definite precision matrix (Omega). +// @param means p-vector of variable means (can be all zeros). +// @param rng Thread-safe random number generator. +// +// @return num_states x p matrix of simulated continuous observations. arma::mat simulate_ggm( int num_states, const arma::mat& precision, @@ -286,16 +282,14 @@ arma::mat simulate_ggm( // R Interface for GGM Simulation (standalone simulate_ggm) // ============================================================================ -/** - * R-callable wrapper for single GGM simulation. - * - * @param num_states Number of observations to simulate. - * @param precision p x p precision matrix (Omega). - * @param means p-vector of means (default zeros). - * @param seed Random seed for reproducibility. - * - * @return num_states x p numeric matrix. - */ +// R-callable wrapper for single GGM simulation. +// +// @param num_states Number of observations to simulate. +// @param precision p x p precision matrix (Omega). +// @param means p-vector of means (default zeros). +// @param seed Random seed for reproducibility. +// +// @return num_states x p numeric matrix. // [[Rcpp::export]] NumericMatrix sample_ggm_direct(int num_states, NumericMatrix precision, @@ -333,9 +327,7 @@ struct SimulationResult { }; -/** - * Worker class for parallel simulation across posterior draws - */ +// Worker class for parallel simulation across posterior draws class SimulationWorker : public RcppParallel::Worker { public: // Input data @@ -451,24 +443,22 @@ class SimulationWorker : public RcppParallel::Worker { }; -/** - * Run parallel simulations across posterior draws - * - * @param pairwise_samples Matrix of pairwise samples (ndraws x n_pairwise) - * @param main_samples Matrix of main/threshold samples (ndraws x n_main) - * @param draw_indices 1-based indices of which draws to use - * @param num_states Number of observations to simulate per draw - * @param num_variables Number of variables - * @param num_categories Number of categories per variable - * @param variable_type Type of each variable ("ordinal" or "blume-capel") - * @param baseline_category Baseline category for each variable - * @param iter Number of Gibbs iterations per simulation - * @param nThreads Number of parallel threads - * @param seed Random seed - * @param progress_type Progress bar type (0=none, 1=total, 2=per-chain) - * - * @return List of simulation results (each is an integer matrix) - */ +// Run parallel simulations across posterior draws +// +// @param pairwise_samples Matrix of pairwise samples (ndraws x n_pairwise) +// @param main_samples Matrix of main/threshold samples (ndraws x n_main) +// @param draw_indices 1-based indices of which draws to use +// @param num_states Number of observations to simulate per draw +// @param num_variables Number of variables +// @param num_categories Number of categories per variable +// @param variable_type Type of each variable ("ordinal" or "blume-capel") +// @param baseline_category Baseline category for each variable +// @param iter Number of Gibbs iterations per simulation +// @param nThreads Number of parallel threads +// @param seed Random seed +// @param progress_type Progress bar type (0=none, 1=total, 2=per-chain) +// +// @return List of simulation results (each is an integer matrix) // [[Rcpp::export]] Rcpp::List run_simulation_parallel( const arma::mat& pairwise_samples, @@ -572,9 +562,7 @@ struct GGMSimulationResult { }; -/** - * Worker class for parallel GGM simulation across posterior draws - */ +// Worker class for parallel GGM simulation across posterior draws class GGMSimulationWorker : public RcppParallel::Worker { public: const arma::mat& pairwise_samples; // ndraws x p*(p-1)/2 @@ -655,21 +643,19 @@ class GGMSimulationWorker : public RcppParallel::Worker { }; -/** - * Run parallel GGM simulations across posterior draws. - * - * @param pairwise_samples Matrix of off-diagonal precision samples (ndraws x p*(p-1)/2) - * @param main_samples Matrix of diagonal precision samples (ndraws x p) - * @param draw_indices 1-based indices of which draws to use - * @param num_states Number of observations to simulate per draw - * @param num_variables Number of variables - * @param means p-vector of variable means - * @param nThreads Number of parallel threads - * @param seed Random seed - * @param progress_type Progress bar type (0=none, 1=total, 2=per-chain) - * - * @return List of simulation results (each is a numeric matrix n x p) - */ +// Run parallel GGM simulations across posterior draws. +// +// @param pairwise_samples Matrix of off-diagonal precision samples (ndraws x p*(p-1)/2) +// @param main_samples Matrix of diagonal precision samples (ndraws x p) +// @param draw_indices 1-based indices of which draws to use +// @param num_states Number of observations to simulate per draw +// @param num_variables Number of variables +// @param means p-vector of variable means +// @param nThreads Number of parallel threads +// @param seed Random seed +// @param progress_type Progress bar type (0=none, 1=total, 2=per-chain) +// +// @return List of simulation results (each is a numeric matrix n x p) // [[Rcpp::export]] Rcpp::List run_ggm_simulation_parallel( const arma::mat& pairwise_samples, @@ -729,28 +715,26 @@ Rcpp::List run_ggm_simulation_parallel( // Mixed MRF Simulation (Block Gibbs: Discrete + Continuous) // ============================================================================ -/** - * Simulate observations from a mixed MRF using block Gibbs sampling. - * - * Each iteration updates all discrete variables from their full conditional - * given (x_{-s}, y), then updates all continuous variables from - * y | x ~ N(mu_y + 2 * x * Kxy * Kyy^{-1}, Kyy^{-1}). - * - * @param num_states Number of observations to simulate. - * @param Kxx p x p discrete pairwise interactions (diagonal zero). - * @param Kxy p x q cross interactions. - * @param Kyy q x q SPD continuous precision. - * @param mux p x max_cats threshold / Blume-Capel parameters. - * @param muy q-vector of continuous means. - * @param num_categories p-vector: number of categories per discrete variable - * (on top of baseline 0). - * @param variable_type p-vector: "ordinal" or "blume-capel". - * @param baseline_category p-vector: reference category per variable. - * @param iter Number of Gibbs iterations for burn-in. - * @param rng Thread-safe RNG. - * @param x_out Output: n x p integer matrix of discrete observations. - * @param y_out Output: n x q numeric matrix of continuous observations. - */ +// Simulate observations from a mixed MRF using block Gibbs sampling. +// +// Each iteration updates all discrete variables from their full conditional +// given (x_{-s}, y), then updates all continuous variables from +// y | x ~ N(mu_y + 2 * x * Kxy * Kyy^{-1}, Kyy^{-1}). +// +// @param num_states Number of observations to simulate. +// @param Kxx p x p discrete pairwise interactions (diagonal zero). +// @param Kxy p x q cross interactions. +// @param Kyy q x q SPD continuous precision. +// @param mux p x max_cats threshold / Blume-Capel parameters. +// @param muy q-vector of continuous means. +// @param num_categories p-vector: number of categories per discrete variable +// (on top of baseline 0). +// @param variable_type p-vector: "ordinal" or "blume-capel". +// @param baseline_category p-vector: reference category per variable. +// @param iter Number of Gibbs iterations for burn-in. +// @param rng Thread-safe RNG. +// @param x_out Output: n x p integer matrix of discrete observations. +// @param y_out Output: n x q numeric matrix of continuous observations. void simulate_mixed_mrf( int num_states, const arma::mat& Kxx, @@ -1113,31 +1097,29 @@ class MixedSimulationWorker : public RcppParallel::Worker { }; -/** - * Run parallel mixed MRF simulations across posterior draws. - * - * The R layer splits the flat parameter vector into the 5 component matrices - * and passes them as separate sample matrices. - * - * @param mux_samples ndraws x n_mux - * @param kxx_samples ndraws x p*(p-1)/2 - * @param muy_samples ndraws x q - * @param kyy_samples ndraws x q*(q+1)/2 - * @param kxy_samples ndraws x p*q - * @param draw_indices 1-based indices of which draws to use - * @param num_states Number of observations per draw - * @param p Number of discrete variables - * @param q Number of continuous variables - * @param num_categories p-vector: categories per discrete variable - * @param variable_type_r p-vector: "ordinal" or "blume-capel" - * @param baseline_category p-vector - * @param iter Gibbs burn-in iterations - * @param nThreads Number of threads - * @param seed Random seed - * @param progress_type Progress bar type - * - * @return List of lists, each containing "x" (integer matrix) and "y" (numeric matrix). - */ +// Run parallel mixed MRF simulations across posterior draws. +// +// The R layer splits the flat parameter vector into the 5 component matrices +// and passes them as separate sample matrices. +// +// @param mux_samples ndraws x n_mux +// @param kxx_samples ndraws x p*(p-1)/2 +// @param muy_samples ndraws x q +// @param kyy_samples ndraws x q*(q+1)/2 +// @param kxy_samples ndraws x p*q +// @param draw_indices 1-based indices of which draws to use +// @param num_states Number of observations per draw +// @param p Number of discrete variables +// @param q Number of continuous variables +// @param num_categories p-vector: categories per discrete variable +// @param variable_type_r p-vector: "ordinal" or "blume-capel" +// @param baseline_category p-vector +// @param iter Gibbs burn-in iterations +// @param nThreads Number of threads +// @param seed Random seed +// @param progress_type Progress bar type +// +// @return List of lists, each containing "x" (integer matrix) and "y" (numeric matrix). // [[Rcpp::export]] Rcpp::List run_mixed_simulation_parallel( const arma::mat& mux_samples, diff --git a/src/priors/sbm_edge_prior.cpp b/src/priors/sbm_edge_prior.cpp index 81c92ac5..ce84b00c 100644 --- a/src/priors/sbm_edge_prior.cpp +++ b/src/priors/sbm_edge_prior.cpp @@ -59,24 +59,22 @@ arma::mat add_row_col_block_prob_matrix(arma::mat X, -/** - * Function: log_likelihood_mfm_sbm - * - * Computes the log-likelihood contribution for a single node under the - * Mixture of Finite Mixtures Stochastic Block Model (MFM-SBM). Evaluates - * the probability of observed edges between the node and all other nodes - * given their cluster assignments and cluster connection probabilities. - * - * Inputs: - * - cluster_assign: Vector of cluster assignments for all nodes. - * - cluster_probs: Matrix of edge probabilities between clusters. - * - indicator: Upper-triangular matrix of edge indicators (1 = edge present). - * - node: Index of the node whose contribution is computed. - * - no_variables: Total number of nodes in the network. - * - * Returns: - * - Log-likelihood contribution for the specified node. - */ +// Function: log_likelihood_mfm_sbm +// +// Computes the log-likelihood contribution for a single node under the +// Mixture of Finite Mixtures Stochastic Block Model (MFM-SBM). Evaluates +// the probability of observed edges between the node and all other nodes +// given their cluster assignments and cluster connection probabilities. +// +// Inputs: +// - cluster_assign: Vector of cluster assignments for all nodes. +// - cluster_probs: Matrix of edge probabilities between clusters. +// - indicator: Upper-triangular matrix of edge indicators (1 = edge present). +// - node: Index of the node whose contribution is computed. +// - no_variables: Total number of nodes in the network. +// +// Returns: +// - Log-likelihood contribution for the specified node. double log_likelihood_mfm_sbm(arma::uvec cluster_assign, arma::mat cluster_probs, arma::umat indicator, @@ -103,27 +101,25 @@ double log_likelihood_mfm_sbm(arma::uvec cluster_assign, return output; } -/** - * Function: log_marginal_mfm_sbm - * - * Computes the log-marginal likelihood contribution for a single node under - * the MFM-SBM after integrating out cluster connection probabilities. Uses - * Beta-Bernoulli conjugacy with separate hyperparameters for within-cluster - * and between-cluster edges. - * - * Inputs: - * - cluster_assign: Vector of cluster assignments for all nodes. - * - indicator: Upper-triangular matrix of edge indicators (1 = edge present). - * - node: Index of the node whose contribution is computed. - * - no_variables: Total number of nodes in the network. - * - beta_bernoulli_alpha: Alpha hyperparameter for within-cluster edges. - * - beta_bernoulli_beta: Beta hyperparameter for within-cluster edges. - * - beta_bernoulli_alpha_between: Alpha hyperparameter for between-cluster edges. - * - beta_bernoulli_beta_between: Beta hyperparameter for between-cluster edges. - * - * Returns: - * - Log-marginal likelihood contribution for the specified node. - */ +// Function: log_marginal_mfm_sbm +// +// Computes the log-marginal likelihood contribution for a single node under +// the MFM-SBM after integrating out cluster connection probabilities. Uses +// Beta-Bernoulli conjugacy with separate hyperparameters for within-cluster +// and between-cluster edges. +// +// Inputs: +// - cluster_assign: Vector of cluster assignments for all nodes. +// - indicator: Upper-triangular matrix of edge indicators (1 = edge present). +// - node: Index of the node whose contribution is computed. +// - no_variables: Total number of nodes in the network. +// - beta_bernoulli_alpha: Alpha hyperparameter for within-cluster edges. +// - beta_bernoulli_beta: Beta hyperparameter for within-cluster edges. +// - beta_bernoulli_alpha_between: Alpha hyperparameter for between-cluster edges. +// - beta_bernoulli_beta_between: Beta hyperparameter for between-cluster edges. +// +// Returns: +// - Log-marginal likelihood contribution for the specified node. double log_marginal_mfm_sbm(arma::uvec cluster_assign, arma::umat indicator, arma::uword node, diff --git a/src/sample_mixed.cpp b/src/sample_mixed.cpp index 9cde1c7d..2ff3b721 100644 --- a/src/sample_mixed.cpp +++ b/src/sample_mixed.cpp @@ -1,10 +1,8 @@ -/** - * sample_mixed.cpp - R interface for Mixed MRF model sampling - * - * Uses the unified MCMC runner infrastructure to sample from models with - * both discrete (ordinal / Blume-Capel) and continuous variables. - * Supports MH sampler only, with optional edge selection. - */ +// sample_mixed.cpp - R interface for Mixed MRF model sampling +// +// Uses the unified MCMC runner infrastructure to sample from models with +// both discrete (ordinal / Blume-Capel) and continuous variables. +// Supports MH sampler only, with optional edge selection. #include #include #include @@ -17,36 +15,34 @@ #include "mcmc/execution/chain_runner.h" #include "mcmc/execution/sampler_config.h" -/** - * R-exported function to sample from a Mixed MRF model. - * - * @param inputFromR List with model specification: - * discrete_observations (integer matrix n x p), - * continuous_observations (numeric matrix n x q), - * num_categories (integer vector, length p), - * is_ordinal_variable (integer vector, length p), - * baseline_category (integer vector, length p), - * main_alpha, main_beta, pairwise_scale (doubles), - * pseudolikelihood (string: "conditional" or "marginal") - * @param prior_inclusion_prob Prior inclusion probabilities ((p+q) x (p+q) matrix) - * @param initial_edge_indicators Initial edge indicators ((p+q) x (p+q) integer matrix) - * @param no_iter Number of post-warmup iterations - * @param no_warmup Number of warmup iterations - * @param no_chains Number of parallel chains - * @param edge_selection Whether to do edge selection (spike-and-slab) - * @param seed Random seed - * @param no_threads Number of threads for parallel execution - * @param progress_type Progress bar type - * @param edge_prior Edge prior type - * @param beta_bernoulli_alpha Beta-Bernoulli alpha hyperparameter - * @param beta_bernoulli_beta Beta-Bernoulli beta hyperparameter - * @param beta_bernoulli_alpha_between SBM between-cluster alpha - * @param beta_bernoulli_beta_between SBM between-cluster beta - * @param dirichlet_alpha Dirichlet alpha for SBM - * @param lambda Lambda for SBM - * - * @return List with per-chain results including samples and diagnostics - */ +// R-exported function to sample from a Mixed MRF model. +// +// @param inputFromR List with model specification: +// discrete_observations (integer matrix n x p), +// continuous_observations (numeric matrix n x q), +// num_categories (integer vector, length p), +// is_ordinal_variable (integer vector, length p), +// baseline_category (integer vector, length p), +// main_alpha, main_beta, pairwise_scale (doubles), +// pseudolikelihood (string: "conditional" or "marginal") +// @param prior_inclusion_prob Prior inclusion probabilities ((p+q) x (p+q) matrix) +// @param initial_edge_indicators Initial edge indicators ((p+q) x (p+q) integer matrix) +// @param no_iter Number of post-warmup iterations +// @param no_warmup Number of warmup iterations +// @param no_chains Number of parallel chains +// @param edge_selection Whether to do edge selection (spike-and-slab) +// @param seed Random seed +// @param no_threads Number of threads for parallel execution +// @param progress_type Progress bar type +// @param edge_prior Edge prior type +// @param beta_bernoulli_alpha Beta-Bernoulli alpha hyperparameter +// @param beta_bernoulli_beta Beta-Bernoulli beta hyperparameter +// @param beta_bernoulli_alpha_between SBM between-cluster alpha +// @param beta_bernoulli_beta_between SBM between-cluster beta +// @param dirichlet_alpha Dirichlet alpha for SBM +// @param lambda Lambda for SBM +// +// @return List with per-chain results including samples and diagnostics // [[Rcpp::export]] Rcpp::List sample_mixed_mrf( const Rcpp::List& inputFromR, diff --git a/src/sample_omrf.cpp b/src/sample_omrf.cpp index 14198eb9..f2b96bcc 100644 --- a/src/sample_omrf.cpp +++ b/src/sample_omrf.cpp @@ -1,9 +1,7 @@ -/** - * sample_omrf.cpp - R interface for OMRF model sampling - * - * Uses the unified MCMC runner infrastructure to sample from OMRF models. - * Supports MH, NUTS, and HMC samplers with optional edge selection. - */ +// sample_omrf.cpp - R interface for OMRF model sampling +// +// Uses the unified MCMC runner infrastructure to sample from OMRF models. +// Supports MH, NUTS, and HMC samplers with optional edge selection. #include #include #include @@ -16,35 +14,33 @@ #include "mcmc/execution/chain_runner.h" #include "mcmc/execution/sampler_config.h" -/** - * R-exported function to sample from an OMRF model - * - * @param inputFromR List with model specification - * @param prior_inclusion_prob Prior inclusion probabilities (p x p matrix) - * @param initial_edge_indicators Initial edge indicators (p x p integer matrix) - * @param no_iter Number of post-warmup iterations - * @param no_warmup Number of warmup iterations - * @param no_chains Number of parallel chains - * @param edge_selection Whether to do edge selection (spike-and-slab) - * @param sampler_type "mh", "nuts", or "hmc" - * @param seed Random seed - * @param no_threads Number of threads for parallel execution - * @param progress_type Progress bar type - * @param edge_prior Edge prior type: "Bernoulli", "Beta-Bernoulli", "Stochastic-Block" - * @param na_impute Whether to impute missing data - * @param missing_index Matrix of missing data indices (n_missing x 2, 0-based) - * @param beta_bernoulli_alpha Beta-Bernoulli alpha hyperparameter - * @param beta_bernoulli_beta Beta-Bernoulli beta hyperparameter - * @param beta_bernoulli_alpha_between SBM between-cluster alpha - * @param beta_bernoulli_beta_between SBM between-cluster beta - * @param dirichlet_alpha Dirichlet alpha for SBM - * @param lambda Lambda for SBM - * @param target_acceptance Target acceptance rate for NUTS/HMC (default: 0.8) - * @param max_tree_depth Maximum tree depth for NUTS (default: 10) - * @param num_leapfrogs Number of leapfrog steps for HMC (default: 10) - * - * @return List with per-chain results including samples and diagnostics - */ +// R-exported function to sample from an OMRF model +// +// @param inputFromR List with model specification +// @param prior_inclusion_prob Prior inclusion probabilities (p x p matrix) +// @param initial_edge_indicators Initial edge indicators (p x p integer matrix) +// @param no_iter Number of post-warmup iterations +// @param no_warmup Number of warmup iterations +// @param no_chains Number of parallel chains +// @param edge_selection Whether to do edge selection (spike-and-slab) +// @param sampler_type "mh", "nuts", or "hmc" +// @param seed Random seed +// @param no_threads Number of threads for parallel execution +// @param progress_type Progress bar type +// @param edge_prior Edge prior type: "Bernoulli", "Beta-Bernoulli", "Stochastic-Block" +// @param na_impute Whether to impute missing data +// @param missing_index Matrix of missing data indices (n_missing x 2, 0-based) +// @param beta_bernoulli_alpha Beta-Bernoulli alpha hyperparameter +// @param beta_bernoulli_beta Beta-Bernoulli beta hyperparameter +// @param beta_bernoulli_alpha_between SBM between-cluster alpha +// @param beta_bernoulli_beta_between SBM between-cluster beta +// @param dirichlet_alpha Dirichlet alpha for SBM +// @param lambda Lambda for SBM +// @param target_acceptance Target acceptance rate for NUTS/HMC (default: 0.8) +// @param max_tree_depth Maximum tree depth for NUTS (default: 10) +// @param num_leapfrogs Number of leapfrog steps for HMC (default: 10) +// +// @return List with per-chain results including samples and diagnostics // [[Rcpp::export]] Rcpp::List sample_omrf( const Rcpp::List& inputFromR, diff --git a/src/utils/common_helpers.h b/src/utils/common_helpers.h index 963d28ae..1179eeab 100644 --- a/src/utils/common_helpers.h +++ b/src/utils/common_helpers.h @@ -26,8 +26,19 @@ inline int count_num_main_effects(const arma::ivec& num_categories, return n_params; } -enum UpdateMethod { adaptive_metropolis, hamiltonian_mc, nuts }; +/// MCMC update method. +enum UpdateMethod { + adaptive_metropolis, ///< Robbins-Monro adaptive Metropolis-Hastings + hamiltonian_mc, ///< Fixed-trajectory Hamiltonian Monte Carlo + nuts ///< No-U-Turn Sampler +}; +/** + * Convert a string identifier to an UpdateMethod enum value. + * + * @param update_method One of "adaptive-metropolis", "hamiltonian-mc", "nuts". + * @return Corresponding UpdateMethod value. + */ inline UpdateMethod update_method_from_string(const std::string& update_method) { if (update_method == "adaptive-metropolis") return adaptive_metropolis; @@ -41,8 +52,21 @@ inline UpdateMethod update_method_from_string(const std::string& update_method) throw std::invalid_argument("Invalid update_method: " + update_method); } -enum EdgePrior { Stochastic_Block, Beta_Bernoulli, Bernoulli, Not_Applicable }; +/// Edge inclusion prior type. +enum EdgePrior { + Stochastic_Block, ///< MFM Stochastic Block Model + Beta_Bernoulli, ///< Shared Beta-Bernoulli prior + Bernoulli, ///< Fixed Bernoulli prior + Not_Applicable ///< No edge prior (all edges included) +}; +/** + * Convert a string identifier to an EdgePrior enum value. + * + * @param edge_prior One of "Stochastic-Block", "Beta-Bernoulli", + * "Bernoulli", "Not Applicable". + * @return Corresponding EdgePrior value. + */ inline EdgePrior edge_prior_from_string(const std::string& edge_prior) { if (edge_prior == "Stochastic-Block") return Stochastic_Block; diff --git a/src/utils/print_mutex.h b/src/utils/print_mutex.h index 12f9f21f..b0d67f73 100644 --- a/src/utils/print_mutex.h +++ b/src/utils/print_mutex.h @@ -3,19 +3,22 @@ #include +/** + * Return a process-global mutex for thread-safe console output. + * + * Include this header and lock the returned mutex before printing + * from parallel code: + * @code + * { + * tbb::mutex::scoped_lock lock(get_print_mutex()); + * std::cout << "message" << std::endl; + * } + * @endcode + */ inline tbb::mutex& get_print_mutex() { static tbb::mutex m; return m; } #endif // PRINT_MUTEX_H - -// Add this header to the parallel code you wish to print from -// + the below code to print in parallel code: -// -// { -// tbb::mutex::scoped_lock lock(get_print_mutex()); -// std::cout -// << "print " -// << std::endl; // } \ No newline at end of file diff --git a/src/utils/variable_helpers.h b/src/utils/variable_helpers.h index b915683e..b20390ba 100644 --- a/src/utils/variable_helpers.h +++ b/src/utils/variable_helpers.h @@ -5,58 +5,62 @@ #include "math/explog_macros.h" -// ----------------------------------------------------------------------------- -// Struct to hold both log-normalizer and probabilities from joint computation. -// Used by logp_and_gradient to avoid duplicate probability/denominator calculations. -// ----------------------------------------------------------------------------- +/** + * Holds both log-normalizer and probabilities from joint computation. + * + * Used by logp_and_gradient to avoid duplicate probability/denominator + * calculations. + */ struct LogZAndProbs { - arma::vec log_Z; // log-normalizer for each person - arma::mat probs; // (num_persons x num_cats+1) probability matrix + /// Log-normalizer for each person. + arma::vec log_Z; + /// Probability matrix (num_persons x num_cats+1). + arma::mat probs; }; -// ----------------------------------------------------------------------------- -// Compute a numerically stable sum of the form: -// -// denom = exp(-bound) + sum_{cat=0}^{K-1} exp(main_effect_param(cat) -// + (cat + 1) * residual_score - bound) -// -// but evaluated efficiently using precomputed exponentials: -// -// exp_r = exp(residual_score) -// exp_m = exp(main_effect_param) -// denom = exp(-bound) * ( 1 + sum_c exp_m[c] * exp_r^(c+1) ) -// -// If non-finite values arise (overflow, underflow, NaN), a safe fallback -// recomputes the naive version using direct exponentials. -// ---------------------------------------------------------------------------- +/** + * Compute a numerically stable sum of the form: + * + * denom = exp(-bound) + sum_{cat=0}^{K-1} exp(main_effect_param(cat) + * + (cat + 1) * residual_score - bound) + * + * but evaluated efficiently using precomputed exponentials: + * + * exp_r = exp(residual_score) + * exp_m = exp(main_effect_param) + * denom = exp(-bound) * ( 1 + sum_c exp_m[c] * exp_r^(c+1) ) + * + * If non-finite values arise (overflow, underflow, NaN), a safe fallback + * recomputes the naive version using direct exponentials. + */ arma::vec compute_denom_ordinal( const arma::vec& residual, const arma::vec& main_eff, const arma::vec& bound ); -// ----------------------------------------------------------------------------- -// Compute denom = Σ_c exp( θ(c) + c*r - b ), with -// θ(c) = lin_eff*(c-ref) + quad_eff*(c-ref)^2 -// b = max_c( θ(c) + c*r ) (vectorized) -// -// Two modes: -// -// FAST (preexp + power-chain): -// denom = Σ_c exp_theta[c] * exp(-b) * exp(r)^c -// Used only when all exponent terms are safe: -// |b| ≤ EXP_BOUND, -// underflow_bound ≥ -EXP_BOUND, -// num_cats*r - b ≤ EXP_BOUND. -// This guarantees the recursive pow-chain stays finite. -// -// SAFE (direct evaluation): -// denom = Σ_c exp(θ(c) + c*r - b) -// Used whenever any FAST-condition fails. Slower but always stable. -// -// FAST gives identical results when safe, otherwise SAFE is used. -// ----------------------------------------------------------------------------- +/** + * Compute denom = Sigma_c exp( theta(c) + c*r - b ), with + * theta(c) = lin_eff*(c-ref) + quad_eff*(c-ref)^2 + * b = max_c( theta(c) + c*r ) (vectorized) + * + * Two modes: + * + * FAST (preexp + power-chain): + * denom = Sigma_c exp_theta[c] * exp(-b) * exp(r)^c + * Used only when all exponent terms are safe: + * |b| <= EXP_BOUND, + * underflow_bound >= -EXP_BOUND, + * num_cats*r - b <= EXP_BOUND. + * This guarantees the recursive pow-chain stays finite. + * + * SAFE (direct evaluation): + * denom = Sigma_c exp(theta(c) + c*r - b) + * Used whenever any FAST-condition fails. Slower but always stable. + * + * FAST gives identical results when safe, otherwise SAFE is used. + */ arma::vec compute_denom_blume_capel( const arma::vec& residual, const double lin_eff, @@ -87,25 +91,25 @@ arma::mat compute_probs_ordinal( int num_cats ); -// ----------------------------------------------------------------------------- -// Blume–Capel probabilities, numerically stable via FAST/SAFE split. -// -// Model: -// θ(c) = lin_eff * (c - ref) + quad_eff * (c - ref)^2, c = 0..num_cats -// exps_i(c) = θ(c) + c * r_i -// b_i = max_c exps_i(c) -// -// Probabilities: -// p_i(c) ∝ exp( exps_i(c) - b_i ) -// -// FAST (preexp + power-chain, same bounds as compute_denom_blume_capel): -// used when |b_i| ≤ EXP_BOUND and pow_bound_i = num_cats * r_i - b_i ≤ EXP_BOUND -// -// SAFE (direct): -// used otherwise: direct exp(θ(c) + (c-ref) * r_i - b_i) -// -// Under these conditions, denom is finite and > 0, so no one-hot fallback. -// ----------------------------------------------------------------------------- +/** + * Blume-Capel probabilities, numerically stable via FAST/SAFE split. + * + * Model: + * theta(c) = lin_eff * (c - ref) + quad_eff * (c - ref)^2, c = 0..num_cats + * exps_i(c) = theta(c) + c * r_i + * b_i = max_c exps_i(c) + * + * Probabilities: + * p_i(c) proportional to exp( exps_i(c) - b_i ) + * + * FAST (preexp + power-chain, same bounds as compute_denom_blume_capel): + * used when |b_i| <= EXP_BOUND and pow_bound_i = num_cats * r_i - b_i <= EXP_BOUND + * + * SAFE (direct): + * used otherwise: direct exp(theta(c) + (c-ref) * r_i - b_i) + * + * Under these conditions, denom is finite and > 0, so no one-hot fallback. + */ arma::mat compute_probs_blume_capel( const arma::vec& residual, const double lin_eff, @@ -115,10 +119,11 @@ arma::mat compute_probs_blume_capel( arma::vec& b ); -// ----------------------------------------------------------------------------- -// Joint computation of log-normalizer and probabilities for ordinal variables. -// Avoids redundant computation by computing both in a single pass. -// ----------------------------------------------------------------------------- +/** + * Joint computation of log-normalizer and probabilities for ordinal variables. + * + * Avoids redundant computation by computing both in a single pass. + */ LogZAndProbs compute_logZ_and_probs_ordinal( const arma::vec& main_param, const arma::vec& residual_score, @@ -126,10 +131,11 @@ LogZAndProbs compute_logZ_and_probs_ordinal( int num_cats ); -// ----------------------------------------------------------------------------- -// Joint computation of log-normalizer and probabilities for Blume-Capel variables. -// Avoids redundant computation by computing both in a single pass. -// ----------------------------------------------------------------------------- +/** + * Joint computation of log-normalizer and probabilities for Blume-Capel variables. + * + * Avoids redundant computation by computing both in a single pass. + */ LogZAndProbs compute_logZ_and_probs_blume_capel( const arma::vec& residual, const double lin_eff, diff --git a/tests/testthat/helper-fixtures.R b/tests/testthat/helper-fixtures.R index 0dbf6a21..1c962dae 100644 --- a/tests/testthat/helper-fixtures.R +++ b/tests/testthat/helper-fixtures.R @@ -60,7 +60,8 @@ options(bgms.verbose = FALSE) .test_cache = new.env(parent = emptyenv()) -#' @description Get cached bgms fit (4 binary variables, edge selection, 2 chains) +#' @description Get cached bgms fit +#' (4 binary variables, edge selection, 2 chains) get_bgms_fit = function() { if(is.null(.test_cache$bgms_fit)) { data("ADHD", package = "bgms") @@ -74,7 +75,8 @@ get_bgms_fit = function() { .test_cache$bgms_fit } -#' @description Get cached bgms fit (4 ordinal variables, edge selection, 2 chains) +#' @description Get cached bgms fit +#' (4 ordinal variables, edge selection, 2 chains) get_bgms_fit_ordinal = function() { if(is.null(.test_cache$bgms_fit_ordinal)) { data("Wenchuan", package = "bgms") @@ -88,7 +90,8 @@ get_bgms_fit_ordinal = function() { .test_cache$bgms_fit_ordinal } -#' @description Get cached bgmCompare fit (4 binary variables, 2 groups, 2 chains) +#' @description Get cached bgmCompare fit +#' (4 binary variables, 2 groups, 2 chains) get_bgmcompare_fit = function() { if(is.null(.test_cache$bgmcompare_fit)) { data("ADHD", package = "bgms") @@ -103,7 +106,8 @@ get_bgmcompare_fit = function() { .test_cache$bgmcompare_fit } -#' @description Get cached bgmCompare fit using x,y interface (4 ordinal variables, 2 chains) +#' @description Get cached bgmCompare fit +#' using x,y interface (4 ordinal variables, 2 chains) get_bgmcompare_fit_xy = function() { if(is.null(.test_cache$bgmcompare_fit_xy)) { data("Wenchuan", package = "bgms") @@ -119,7 +123,8 @@ get_bgmcompare_fit_xy = function() { .test_cache$bgmcompare_fit_xy } -#' @description Get cached bgmCompare fit (4 ordinal variables, 2 groups, 2 chains) +#' @description Get cached bgmCompare fit +#' (4 ordinal variables, 2 groups, 2 chains) get_bgmcompare_fit_ordinal = function() { if(is.null(.test_cache$bgmcompare_fit_ordinal)) { data("Wenchuan", package = "bgms") @@ -151,7 +156,8 @@ get_bgms_fit_blumecapel = function() { .test_cache$bgms_fit_blumecapel } -#' @description Get cached bgms fit with single chain (for R-hat edge case testing) +#' @description Get cached bgms fit with +#' single chain (for R-hat edge case testing) get_bgms_fit_single_chain = function() { if(is.null(.test_cache$bgms_fit_single)) { data("ADHD", package = "bgms") @@ -234,7 +240,9 @@ get_bgmcompare_fit_hmc_blumecapel = function() { .test_cache$bgmcompare_fit_hmc_bc } -#' @description Get cached bgmCompare fit with main_difference_selection = TRUE + Blume-Capel (1 chain) +#' @description Get cached bgmCompare fit with +#' main_difference_selection = TRUE + +#' Blume-Capel (1 chain) #' Crosses Blume-Capel with difference_selection (Bernoulli prior) get_bgmcompare_fit_main_selection = function() { if(is.null(.test_cache$bgmcompare_fit_main_sel)) { @@ -257,7 +265,9 @@ get_bgmcompare_fit_main_selection = function() { .test_cache$bgmcompare_fit_main_sel } -#' @description Get cached bgmCompare fit with Beta-Bernoulli difference prior + ordinal (1 chain) +#' @description Get cached bgmCompare fit with +#' Beta-Bernoulli difference prior + +#' ordinal (1 chain) #' Crosses Beta-Bernoulli prior with ordinal variables get_bgmcompare_fit_beta_bernoulli = function() { if(is.null(.test_cache$bgmcompare_fit_bb)) { @@ -296,7 +306,8 @@ get_bgms_fit_beta_bernoulli = function() { .test_cache$bgms_fit_bb } -#' @description Get cached bgms fit with Stochastic-Block Model edge prior (2 chains) +#' @description Get cached bgms fit with +#' Stochastic-Block Model edge prior (2 chains) get_bgms_fit_sbm = function() { if(is.null(.test_cache$bgms_fit_sbm)) { data("ADHD", package = "bgms") @@ -329,7 +340,8 @@ get_bgms_fit_hmc = function() { .test_cache$bgms_fit_hmc } -#' @description Get cached bgms fit with adaptive-metropolis + Blume-Capel (1 chain) +#' @description Get cached bgms fit with +#' adaptive-metropolis + Blume-Capel (1 chain) get_bgms_fit_am_blumecapel = function() { if(is.null(.test_cache$bgms_fit_am_bc)) { data("Wenchuan", package = "bgms") @@ -400,7 +412,9 @@ get_bgmcompare_fit_blumecapel = function() { .test_cache$bgmcompare_fit_bc } -#' @description Get cached bgmCompare fit with adaptive-metropolis + Blume-Capel (1 chain) +#' @description Get cached bgmCompare fit +#' with adaptive-metropolis + Blume-Capel +#' (1 chain) get_bgmcompare_fit_am_blumecapel = function() { if(is.null(.test_cache$bgmcompare_fit_am_bc)) { data("Boredom", package = "bgms") @@ -441,7 +455,9 @@ get_bgmcompare_fit_impute = function() { .test_cache$bgmcompare_fit_impute } -#' @description Get cached bgmCompare fit with Blume-Capel + missing data imputation (1 chain) +#' @description Get cached bgmCompare fit +#' with Blume-Capel + missing data +#' imputation (1 chain) get_bgmcompare_fit_blumecapel_impute = function() { if(is.null(.test_cache$bgmcompare_fit_bc_impute)) { data("Boredom", package = "bgms") @@ -483,7 +499,9 @@ get_bgmcompare_fit_standardize = function() { .test_cache$bgmcompare_fit_std } -#' @description Get cached bgms fit for GGM with edge selection (4 continuous variables, 1 chain) +#' @description Get cached bgms fit for GGM +#' with edge selection +#' (4 continuous variables, 1 chain) get_bgms_fit_ggm = function() { if(is.null(.test_cache$bgms_fit_ggm)) { set.seed(42) @@ -501,7 +519,9 @@ get_bgms_fit_ggm = function() { .test_cache$bgms_fit_ggm } -#' @description Get cached bgms fit for GGM without edge selection (4 continuous variables, 1 chain) +#' @description Get cached bgms fit for GGM +#' without edge selection +#' (4 continuous variables, 1 chain) get_bgms_fit_ggm_no_es = function() { if(is.null(.test_cache$bgms_fit_ggm_no_es)) { set.seed(42) @@ -533,8 +553,10 @@ get_bgms_fit_mixed_mrf = function() { colnames(x) = c("d1", "c1", "d2", "c2", "d3") .test_cache$bgms_fit_mixed_mrf = bgm( x = x, - variable_type = c("ordinal", "continuous", "ordinal", - "continuous", "ordinal"), + variable_type = c( + "ordinal", "continuous", "ordinal", + "continuous", "ordinal" + ), edge_selection = TRUE, iter = 50, warmup = 100, chains = 1, seed = 77771, @@ -558,8 +580,10 @@ get_bgms_fit_mixed_mrf_no_es = function() { colnames(x) = c("d1", "c1", "d2", "c2", "d3") .test_cache$bgms_fit_mixed_mrf_no_es = bgm( x = x, - variable_type = c("ordinal", "continuous", "ordinal", - "continuous", "ordinal"), + variable_type = c( + "ordinal", "continuous", "ordinal", + "continuous", "ordinal" + ), edge_selection = FALSE, iter = 50, warmup = 100, chains = 1, seed = 77772, @@ -583,8 +607,10 @@ get_bgms_fit_mixed_mrf_marginal = function() { colnames(x) = c("d1", "c1", "d2", "c2", "d3") .test_cache$bgms_fit_mixed_mrf_marginal = bgm( x = x, - variable_type = c("ordinal", "continuous", "ordinal", - "continuous", "ordinal"), + variable_type = c( + "ordinal", "continuous", "ordinal", + "continuous", "ordinal" + ), edge_selection = FALSE, pseudolikelihood = "marginal", iter = 50, warmup = 100, chains = 1, @@ -716,7 +742,8 @@ upper_vals = function(M) { M[upper.tri(M)] } -#' Check that named summary entries match matrix positions (ordering consistency) +#' Check that named summary entries match +#' matrix positions (ordering consistency) #' #' For each row of summary_df (named "Vi-Vj"), verify that summary_df$mean[k] #' equals matrix_val[Vi, Vj]. Returns a logical vector (TRUE = match). @@ -725,15 +752,20 @@ check_summary_matrix_consistency = function(summary_df, matrix_val) { matches = logical(nrow(summary_df)) for(k in seq_len(nrow(summary_df))) { parts = strsplit(rownames(summary_df)[k], "-")[[1]] - matches[k] = abs(summary_df$mean[k] - matrix_val[parts[1], parts[2]]) < 1e-10 + matches[k] = abs( + summary_df$mean[k] - + matrix_val[parts[1], parts[2]] + ) < 1e-10 } matches } -#' Check that extractor column means match matrix positions (ordering consistency) +#' Check that extractor column means match +#' matrix positions (ordering consistency) #' #' For each named element of extracted_means (named "Vi-Vj"), verify that -#' the value matches matrix_val[Vi, Vj]. Returns a logical vector (TRUE = match). +#' the value matches matrix_val[Vi, Vj]. +#' Returns a logical vector (TRUE = match). check_extractor_matrix_consistency = function(extracted_means, matrix_val) { matches = logical(length(extracted_means)) for(k in seq_along(extracted_means)) { @@ -760,7 +792,10 @@ expect_extractor_structure = function(obj, type, expected_dim = NULL, # Type check expect_true( inherits(obj, type), - info = sprintf("Expected class %s, got %s", type, paste(class(obj), collapse = ", ")) + info = sprintf( + "Expected class %s, got %s", + type, paste(class(obj), collapse = ", ") + ) ) # Dimension check diff --git a/tests/testthat/test-bgm.R b/tests/testthat/test-bgm.R index 58a944ef..73fdb345 100644 --- a/tests/testthat/test-bgm.R +++ b/tests/testthat/test-bgm.R @@ -202,8 +202,13 @@ test_that("bgm GGM output has correct parameter ordering", { # Extractor column means -> matrix positions pw_means = colMeans(extract_pairwise_interactions(fit)) expect_true( - all(check_extractor_matrix_consistency(pw_means, fit$posterior_mean_pairwise)), - info = "GGM extract_pairwise_interactions() names do not match matrix positions" + all(check_extractor_matrix_consistency( + pw_means, fit$posterior_mean_pairwise + )), + info = paste( + "GGM extract_pairwise_interactions()", + "names do not match matrix positions" + ) ) # Truth-based swap-position checks: @@ -266,8 +271,13 @@ test_that("bgm OMRF output has correct parameter ordering", { # Extractor column means -> matrix positions pw_means = colMeans(extract_pairwise_interactions(fit)) expect_true( - all(check_extractor_matrix_consistency(pw_means, fit$posterior_mean_pairwise)), - info = "OMRF extract_pairwise_interactions() names do not match matrix positions" + all(check_extractor_matrix_consistency( + pw_means, fit$posterior_mean_pairwise + )), + info = paste( + "OMRF extract_pairwise_interactions()", + "names do not match matrix positions" + ) ) # Indicator summary names -> matrix positions @@ -373,7 +383,10 @@ test_that("bgm GGM posterior mean approaches MLE for large n", { expect_true( cor_offdiag > 0.95, - info = sprintf("Off-diagonal cor with MLE = %.3f (expected > 0.95)", cor_offdiag) + info = sprintf( + "Off-diagonal cor with MLE = %.3f (expected > 0.95)", + cor_offdiag + ) ) expect_true( cor_diag > 0.95, @@ -718,8 +731,10 @@ test_that("bgm mixed MRF is reproducible", { fit2 = bgm( x = x, - variable_type = c("ordinal", "continuous", "ordinal", - "continuous", "ordinal"), + variable_type = c( + "ordinal", "continuous", "ordinal", + "continuous", "ordinal" + ), edge_selection = TRUE, iter = 50, warmup = 100, chains = 1, seed = 77771, @@ -733,9 +748,9 @@ test_that("bgm mixed MRF is reproducible", { test_that("bgm mixed MRF output has correct dimensions", { fit = get_bgms_fit_mixed_mrf() args = extract_arguments(fit) - p_total = args$num_variables # 5 - p = 3L # discrete - q = 2L # continuous + p_total = args$num_variables # 5 + p = 3L # discrete + q = 2L # continuous # pairwise: p_total*(p_total-1)/2 edges n_edges = p_total * (p_total - 1) / 2 @@ -752,7 +767,7 @@ test_that("bgm mixed MRF output has correct dimensions", { expect_true(is.list(fit$posterior_mean_main)) expect_equal(nrow(fit$posterior_mean_main$discrete), p) expect_equal(nrow(fit$posterior_mean_main$continuous), q) - expect_equal(ncol(fit$posterior_mean_main$continuous), 2) # mean + precision + expect_equal(ncol(fit$posterior_mean_main$continuous), 2) # mean + precision # raw samples expect_equal(ncol(fit$raw_samples$pairwise[[1]]), n_edges) diff --git a/tests/testthat/test-mixed-mrf-simulate-predict.R b/tests/testthat/test-mixed-mrf-simulate-predict.R index 6f99ca8d..f501abba 100644 --- a/tests/testthat/test-mixed-mrf-simulate-predict.R +++ b/tests/testthat/test-mixed-mrf-simulate-predict.R @@ -22,7 +22,9 @@ # ============================================================================== test_that("sample_mixed_mrf_gibbs returns correct dimensions", { - p = 2; q = 2; n = 100 + p = 2 + q = 2 + n = 100 nc = c(2L, 2L) mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) @@ -43,8 +45,10 @@ test_that("sample_mixed_mrf_gibbs returns correct dimensions", { }) test_that("sample_mixed_mrf_gibbs: discrete values in valid range", { - p = 3; q = 1; n = 500 - nc = c(2L, 3L, 1L) # categories 0-2, 0-3, 0-1 (binary) + p = 3 + q = 1 + n = 500 + nc = c(2L, 3L, 1L) # categories 0-2, 0-3, 0-1 (binary) mux = matrix(0, p, 4) Kxx = matrix(0, p, p) muy = 0 @@ -70,7 +74,9 @@ test_that("sample_mixed_mrf_gibbs: discrete values in valid range", { test_that("sample_mixed_mrf_gibbs: continuous marginal SD matches precision", { # Independent model: Kxx = 0, Kxy = 0, so y ~ N(muy, Kyy^{-1}) - p = 1; q = 2; n = 2000 + p = 1 + q = 2 + n = 2000 nc = c(2L) mux = matrix(0, p, 3) Kxx = matrix(0) @@ -92,17 +98,24 @@ test_that("sample_mixed_mrf_gibbs: continuous marginal SD matches precision", { # Loose check: within 30% of expected expect_true( abs(empirical_sd - expected_sd) / expected_sd < 0.3, - info = sprintf("y%d SD: expected %.3f, got %.3f", j, expected_sd, empirical_sd) + info = sprintf( + "y%d SD: expected %.3f, got %.3f", + j, expected_sd, empirical_sd + ) ) } }) test_that("sample_mixed_mrf_gibbs: seed reproducibility", { - p = 2; q = 1; n = 50 + p = 2 + q = 1 + n = 50 nc = c(2L, 2L) mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) - muy = 0; Kyy = matrix(1); Kxy = matrix(c(0.1, 0.2), p, q) + muy = 0 + Kyy = matrix(1) + Kxy = matrix(c(0.1, 0.2), p, q) args = list( num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, @@ -119,16 +132,20 @@ test_that("sample_mixed_mrf_gibbs: seed reproducibility", { }) test_that("sample_mixed_mrf_gibbs: Blume-Capel variable works", { - p = 2; q = 1; n = 200 + p = 2 + q = 1 + n = 200 nc = c(2L, 4L) # ordinal: mux has num_categories entries; BC: 2 entries (alpha, beta) max_cols = max(nc[1], 2) mux = matrix(0, p, max_cols) - mux[2, 1] = 0.5 # alpha - mux[2, 2] = -0.3 # beta (penalizes distance from reference) + mux[2, 1] = 0.5 # alpha + mux[2, 2] = -0.3 # beta (penalizes distance from reference) Kxx = matrix(c(0, 0.2, 0.2, 0), p, p) - muy = 0; Kyy = matrix(1.5); Kxy = matrix(c(0.1, -0.1), p, q) + muy = 0 + Kyy = matrix(1.5) + Kxy = matrix(c(0.1, -0.1), p, q) result = sample_mixed_mrf_gibbs( num_states = n, Kxx_r = Kxx, Kxy_r = Kxy, Kyy_r = Kyy, @@ -148,10 +165,13 @@ test_that("sample_mixed_mrf_gibbs: Blume-Capel variable works", { # ============================================================================== test_that("run_mixed_simulation_parallel returns correct structure", { - p = 2L; q = 1L; ndraws_total = 3L + p = 2L + q = 1L + ndraws_total = 3L nc = c(2L, 2L) mux_s = matrix(rep(c(0, 0.5, -0.3, 0, -0.2, 0.1), each = ndraws_total), - nrow = ndraws_total) + nrow = ndraws_total + ) kxx_s = matrix(0.3, nrow = ndraws_total, ncol = 1) muy_s = matrix(0, nrow = ndraws_total, ncol = 1) kyy_s = matrix(1.5, nrow = ndraws_total, ncol = 1) @@ -185,14 +205,19 @@ test_that("run_mixed_simulation_parallel returns correct structure", { # ============================================================================== test_that("compute_conditional_mixed: discrete probs sum to 1", { - p = 2; q = 1; n = 5 + p = 2 + q = 1 + n = 5 nc = c(2L, 2L) mux = matrix(c(0, 0.5, -0.3, 0, -0.2, 0.1), nrow = p, ncol = 3, byrow = TRUE) Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) - muy = 0; Kyy = matrix(1.5); Kxy = matrix(c(0.1, 0.2), p, q) + muy = 0 + Kyy = matrix(1.5) + Kxy = matrix(c(0.1, 0.2), p, q) x_obs = matrix(c(0L, 1L, 2L, 0L, 1L, 1L, 2L, 0L, 1L, 2L), - nrow = n, ncol = p) + nrow = n, ncol = p + ) y_obs = matrix(rnorm(n), nrow = n, ncol = q) # Predict first discrete variable (0-based index 0) @@ -206,7 +231,7 @@ test_that("compute_conditional_mixed: discrete probs sum to 1", { expect_equal(length(preds), 1) expect_equal(nrow(preds[[1]]), n) - expect_equal(ncol(preds[[1]]), nc[1] + 1) # 3 categories + expect_equal(ncol(preds[[1]]), nc[1] + 1) # 3 categories row_sums = rowSums(preds[[1]]) expect_true(all(abs(row_sums - 1) < 1e-8)) @@ -214,10 +239,13 @@ test_that("compute_conditional_mixed: discrete probs sum to 1", { }) test_that("compute_conditional_mixed: continuous returns mean and sd", { - p = 1; q = 2; n = 5 + p = 1 + q = 2 + n = 5 nc = c(2L) mux = matrix(c(0, 0.5, -0.3), nrow = 1, ncol = 3) - Kxx = matrix(0); muy = c(1.0, -0.5) + Kxx = matrix(0) + muy = c(1.0, -0.5) Kyy = matrix(c(2, 0.3, 0.3, 1.5), q, q) Kxy = matrix(c(0.1, -0.1), 1, q) @@ -234,16 +262,19 @@ test_that("compute_conditional_mixed: continuous returns mean and sd", { expect_equal(length(preds), 1) expect_equal(nrow(preds[[1]]), n) - expect_equal(ncol(preds[[1]]), 2) # mean, sd - expect_true(all(preds[[1]][, 2] > 0)) # sd > 0 + expect_equal(ncol(preds[[1]]), 2) # mean, sd + expect_true(all(preds[[1]][, 2] > 0)) # sd > 0 }) test_that("compute_conditional_mixed: mixed prediction variables", { - p = 2; q = 2; n = 5 + p = 2 + q = 2 + n = 5 nc = c(2L, 2L) mux = matrix(0, p, 3) Kxx = matrix(c(0, 0.3, 0.3, 0), p, p) - muy = c(0.5, -0.2); Kyy = diag(c(1.5, 1.8)) + muy = c(0.5, -0.2) + Kyy = diag(c(1.5, 1.8)) Kxy = matrix(0.1, p, q) x_obs = matrix(sample(0:2, n * p, replace = TRUE), n, p) @@ -288,7 +319,10 @@ test_that("simulate.bgms works for mixed MRF with posterior-mean", { for(di in args$discrete_indices) { vals = result[, di] expect_true(all(vals >= 0), info = sprintf("col %d negative", di)) - expect_true(all(vals == round(vals)), info = sprintf("col %d not integer", di)) + expect_true( + all(vals == round(vals)), + info = sprintf("col %d not integer", di) + ) } }) diff --git a/tests/testthat/test-simulate-predict-regression.R b/tests/testthat/test-simulate-predict-regression.R index f441bbd9..0e90fd7f 100644 --- a/tests/testthat/test-simulate-predict-regression.R +++ b/tests/testthat/test-simulate-predict-regression.R @@ -103,7 +103,8 @@ get_bgmcompare_fixtures = function() { var_type = "ordinal" ), list( - label = "adaptive-metropolis", get_fit = get_bgmcompare_fit_adaptive_metropolis, + label = "adaptive-metropolis", + get_fit = get_bgmcompare_fit_adaptive_metropolis, get_prediction_data = get_prediction_data_bgmcompare_binary, var_type = "binary" ), @@ -133,7 +134,8 @@ get_bgmcompare_fixtures = function() { var_type = "ordinal" ), list( - label = "blume-capel-impute", get_fit = get_bgmcompare_fit_blumecapel_impute, + label = "blume-capel-impute", + get_fit = get_bgmcompare_fit_blumecapel_impute, get_prediction_data = get_prediction_data_bgmcompare_blumecapel, var_type = "blume-capel" ), @@ -205,9 +207,11 @@ test_that("bgms $arguments contains all fields needed by simulate/predict", { info = sprintf("%s: missing arguments$%s", ctx, field) ) } - for(field in c("is_mixed", "discrete_indices", "continuous_indices", - "num_discrete", "num_continuous", "is_ordinal", - "data_columnnames_discrete", "data_columnnames_continuous")) { + for(field in c( + "is_mixed", "discrete_indices", "continuous_indices", + "num_discrete", "num_continuous", "is_ordinal", + "data_columnnames_discrete", "data_columnnames_continuous" + )) { expect_true( field %in% names(args), info = sprintf("%s: missing mixed arguments$%s", ctx, field) @@ -228,7 +232,10 @@ test_that("bgms $arguments contains all fields needed by simulate/predict", { } }) -test_that("bgmCompare $arguments contains all fields needed by simulate/predict", { +test_that(paste( + "bgmCompare $arguments contains all fields", + "needed by simulate/predict" +), { for(spec in get_bgmcompare_fixtures()) { ctx = sprintf("[bgmCompare %s]", spec$label) fit = spec$get_fit() @@ -318,7 +325,8 @@ test_that("bgms fit objects have raw_samples for posterior-sample method", { # ============================================================================== # For each golden fixture, construct a bgm_spec from the frozen inputs and # verify that build_arguments() produces the same simulate/predict-critical -# values (num_categories, baseline_category, variable_type / is_ordinal_variable, +# values (num_categories, baseline_category, +# variable_type / is_ordinal_variable, # is_continuous) as the old pipeline's check_model + reformat_data output. # # This is fast: bgm_spec() + build_arguments() does no MCMC. @@ -501,14 +509,22 @@ test_that("simulate → predict roundtrip works for all bgms fixtures", { expect_true(is.matrix(simulated), info = paste(ctx, "simulate")) expect_equal(nrow(simulated), n_sim, info = paste(ctx, "nrow")) expect_equal(ncol(simulated), args$num_variables, info = paste(ctx, "ncol")) - expect_equal(colnames(simulated), args$data_columnnames, info = paste(ctx, "colnames")) + expect_equal( + colnames(simulated), args$data_columnnames, + info = paste(ctx, "colnames") + ) if(isTRUE(args$is_continuous)) { # GGM: predict returns list of mean/sd matrices colnames(simulated) = args$data_columnnames pred = predict(fit, newdata = simulated) - expect_true(is.list(pred), info = paste(ctx, "predict type")) - expect_equal(length(pred), args$num_variables, info = paste(ctx, "predict length")) + expect_true(is.list(pred), + info = paste(ctx, "predict type") + ) + expect_equal( + length(pred), args$num_variables, + info = paste(ctx, "predict length") + ) for(j in seq_along(pred)) { expect_equal(nrow(pred[[j]]), n_sim, info = sprintf("%s predict var %d nrow", ctx, j) @@ -518,10 +534,20 @@ test_that("simulate → predict roundtrip works for all bgms fixtures", { ) } } else if(isTRUE(spec$is_mixed)) { - # Mixed MRF: predict returns list with discrete (probs) and continuous (mean/sd) - probs = predict(fit, newdata = simulated, type = "probabilities") - expect_true(is.list(probs), info = paste(ctx, "predict type")) - expect_equal(length(probs), args$num_variables, info = paste(ctx, "predict length")) + # Mixed MRF: predict returns list with + # discrete (probs) and continuous (mean/sd) + probs = predict( + fit, + newdata = simulated, + type = "probabilities" + ) + expect_true(is.list(probs), + info = paste(ctx, "predict type") + ) + expect_equal( + length(probs), args$num_variables, + info = paste(ctx, "predict length") + ) for(j in seq_len(args$num_variables)) { vname = args$data_columnnames[j] @@ -555,9 +581,18 @@ test_that("simulate → predict roundtrip works for all bgms fixtures", { ) } else { # OMRF: predict returns list of probability matrices - probs = predict(fit, newdata = simulated, type = "probabilities") - expect_true(is.list(probs), info = paste(ctx, "predict type")) - expect_equal(length(probs), args$num_variables, info = paste(ctx, "predict length")) + probs = predict( + fit, + newdata = simulated, + type = "probabilities" + ) + expect_true(is.list(probs), + info = paste(ctx, "predict type") + ) + expect_equal( + length(probs), args$num_variables, + info = paste(ctx, "predict length") + ) for(j in seq_along(probs)) { expect_equal(nrow(probs[[j]]), n_sim, info = sprintf("%s predict var %d nrow", ctx, j) @@ -605,7 +640,10 @@ test_that("simulate → predict roundtrip works for all bgmCompare fixtures", { expect_true(is.matrix(simulated), info = paste(g_ctx, "simulate")) expect_equal(nrow(simulated), n_sim, info = paste(g_ctx, "nrow")) - expect_equal(ncol(simulated), args$num_variables, info = paste(g_ctx, "ncol")) + expect_equal( + ncol(simulated), args$num_variables, + info = paste(g_ctx, "ncol") + ) expect_equal(colnames(simulated), args$data_columnnames, info = paste(g_ctx, "colnames") ) @@ -619,7 +657,11 @@ test_that("simulate → predict roundtrip works for all bgmCompare fixtures", { ) # Predict - probs = predict(fit, newdata = simulated, group = g, type = "probabilities") + probs = predict( + fit, + newdata = simulated, + group = g, type = "probabilities" + ) expect_true(is.list(probs), info = paste(g_ctx, "predict type")) expect_equal(length(probs), args$num_variables, info = paste(g_ctx, "predict length") @@ -727,7 +769,9 @@ test_that("bgms $arguments field types are correct for simulate/predict", { args = extract_arguments(fit) p = args$num_variables - expect_true(is.numeric(args$num_variables) && length(args$num_variables) == 1, + expect_true( + is.numeric(args$num_variables) && + length(args$num_variables) == 1, info = paste(ctx, "num_variables") ) expect_true(args$num_variables >= 1, @@ -737,23 +781,31 @@ test_that("bgms $arguments field types are correct for simulate/predict", { expect_true(is.character(args$variable_type), info = paste(ctx, "variable_type character") ) - expect_true(all(args$variable_type %in% c("ordinal", "blume-capel", "continuous")), + expect_true( + all(args$variable_type %in% + c("ordinal", "blume-capel", "continuous")), info = paste(ctx, "variable_type values") ) - expect_true(is.character(args$data_columnnames) && length(args$data_columnnames) == p, + expect_true( + is.character(args$data_columnnames) && + length(args$data_columnnames) == p, info = paste(ctx, "data_columnnames length") ) if(!isTRUE(spec$is_continuous) && !isTRUE(spec$is_mixed)) { # OMRF-only fields - expect_true(is.numeric(args$num_categories) && length(args$num_categories) == p, + expect_true( + is.numeric(args$num_categories) && + length(args$num_categories) == p, info = paste(ctx, "num_categories length") ) expect_true(all(args$num_categories >= 1), info = paste(ctx, "num_categories >= 1") ) - expect_true(is.numeric(args$baseline_category) && length(args$baseline_category) == p, + expect_true( + is.numeric(args$baseline_category) && + length(args$baseline_category) == p, info = paste(ctx, "baseline_category length") ) } @@ -761,28 +813,46 @@ test_that("bgms $arguments field types are correct for simulate/predict", { if(isTRUE(spec$is_mixed)) { pd = args$num_discrete qc = args$num_continuous - expect_equal(pd + qc, p, info = paste(ctx, "num_discrete + num_continuous == p")) + expect_equal( + pd + qc, p, + info = paste( + ctx, "num_discrete + num_continuous == p" + ) + ) expect_true( - is.numeric(args$num_categories) && length(args$num_categories) == pd, - info = paste(ctx, "mixed num_categories length == num_discrete") + is.numeric(args$num_categories) && + length(args$num_categories) == pd, + info = paste( + ctx, + "mixed num_categories length == num_discrete" + ) ) expect_true( - is.numeric(args$baseline_category) && length(args$baseline_category) == pd, - info = paste(ctx, "mixed baseline_category length == num_discrete") + is.numeric(args$baseline_category) && + length(args$baseline_category) == pd, + info = paste( + ctx, + "mixed baseline_category length == num_discrete" + ) ) expect_true( - is.numeric(args$discrete_indices) && length(args$discrete_indices) == pd, + is.numeric(args$discrete_indices) && + length(args$discrete_indices) == pd, info = paste(ctx, "discrete_indices length") ) expect_true( - is.numeric(args$continuous_indices) && length(args$continuous_indices) == qc, + is.numeric(args$continuous_indices) && + length(args$continuous_indices) == qc, info = paste(ctx, "continuous_indices length") ) } } }) -test_that("bgmCompare $arguments field types are correct for simulate/predict", { +test_that(paste( + "bgmCompare $arguments field types", + "are correct for simulate/predict" +), { for(spec in get_bgmcompare_fixtures()) { ctx = sprintf("[bgmCompare %s]", spec$label) fit = spec$get_fit() @@ -797,15 +867,21 @@ test_that("bgmCompare $arguments field types are correct for simulate/predict", info = paste(ctx, "num_variables") ) - expect_true(is.numeric(args$num_categories) && length(args$num_categories) == p, + expect_true( + is.numeric(args$num_categories) && + length(args$num_categories) == p, info = paste(ctx, "num_categories length") ) - expect_true(is.logical(args$is_ordinal_variable) && length(args$is_ordinal_variable) == p, + expect_true( + is.logical(args$is_ordinal_variable) && + length(args$is_ordinal_variable) == p, info = paste(ctx, "is_ordinal_variable") ) - expect_true(is.character(args$data_columnnames) && length(args$data_columnnames) == p, + expect_true( + is.character(args$data_columnnames) && + length(args$data_columnnames) == p, info = paste(ctx, "data_columnnames") ) From 5e28c30b083767c44db6d9a77c00b4519a65051c Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 13:41:31 +0100 Subject: [PATCH 19/60] docs: update package documentation for mixed MRF support (audit #9) --- DESCRIPTION | 7 ++++--- NEWS.md | 1 + R/bgm.R | 7 +++++-- R/bgms-package.R | 20 ++++++++++++++------ README.md | 18 ++++++++++-------- Readme.Rmd | 12 +++++++----- man/bgm.Rd | 7 +++++-- man/bgms-package.Rd | 20 ++++++++++++++------ man/mrfSampler.Rd | 24 +++++++++++++++--------- man/predict.bgmCompare.Rd | 13 ++++++++----- man/predict.bgms.Rd | 24 ++++++++++++++++++------ man/simulate.bgms.Rd | 21 ++++++++++++++++----- man/simulate_mrf.Rd | 36 ++++++++++++++++++++++-------------- 13 files changed, 139 insertions(+), 71 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index cdb269eb..886efc3d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,9 +17,10 @@ Authors@R: c( ) Maintainer: Maarten Marsman Description: Bayesian estimation and variable selection for Markov random field - models of networks of binary, ordinal, and continuous variables. Supports - Gaussian graphical models, multi-group comparison via 'bgmCompare', and - provides simulation, prediction, and missing data imputation. + models of networks of binary, ordinal, continuous, and mixed variables. + Supports ordinal MRFs, Gaussian graphical models, mixed MRFs combining + discrete and continuous variables, multi-group comparison via 'bgmCompare', + and provides simulation, prediction, and missing data imputation. Copyright: Includes datasets 'ADHD' and 'Boredom', which are licensed under CC-BY 4. See individual data documentation for license and citation. License: GPL (>= 2) URL: https://Bayesian-Graphical-Modelling-Lab.github.io/bgms/, https://github.com/Bayesian-Graphical-Modelling-Lab/bgms diff --git a/NEWS.md b/NEWS.md index b47bafc0..f11e4d76 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ ## New features +* Mixed MRF models: `bgm()` accepts a per-variable `variable_type` vector that mixes `"ordinal"`, `"blume-capel"`, and `"continuous"` types to estimate networks with both discrete and continuous variables. `simulate.bgms()` and `predict.bgms()` also support mixed models. * Gaussian graphical models (GGM): `bgm(x, variable_type = "continuous")` fits a GGM with Bayesian edge selection. Pairwise effects are partial correlations from the precision matrix. * Missing data imputation: `na_action = "impute"` integrates over missing values during MCMC sampling for both ordinal and continuous models. diff --git a/R/bgm.R b/R/bgm.R index ebbd5f1f..81323631 100644 --- a/R/bgm.R +++ b/R/bgm.R @@ -172,8 +172,11 @@ #' Blume–Capel variables, all categories are retained. #' #' @param variable_type Character or character vector. Specifies the type of -#' each variable in \code{x}. Allowed values: \code{"ordinal"} or -#' \code{"blume-capel"}. Binary variables are automatically treated as +#' each variable in \code{x}. Allowed values: \code{"ordinal"}, +#' \code{"blume-capel"}, or \code{"continuous"}. A single string applies +#' to all variables. A per-variable vector that mixes discrete +#' (\code{"ordinal"} / \code{"blume-capel"}) and \code{"continuous"} +#' types fits a mixed MRF. Binary variables are automatically treated as #' \code{"ordinal"}. Default: \code{"ordinal"}. #' #' @param baseline_category Integer or vector. Baseline category used in diff --git a/R/bgms-package.R b/R/bgms-package.R index 464d643b..cc4af018 100644 --- a/R/bgms-package.R +++ b/R/bgms-package.R @@ -1,16 +1,24 @@ -#' bgms: Bayesian Analysis of Networks of Binary and/or Ordinal Variables +#' bgms: Bayesian Analysis of Graphical Models #' #' @description #' The \code{R} package \strong{bgms} provides tools for Bayesian analysis of -#' the ordinal Markov random field (MRF), a graphical model describing networks -#' of binary and/or ordinal variables \insertCite{MarsmanVandenBerghHaslbeck_2025}{bgms}. -#' The likelihood is approximated via a pseudolikelihood, and Markov chain Monte -#' Carlo (MCMC) methods are used to sample from the corresponding pseudoposterior -#' distribution of model parameters. +#' graphical models describing networks of binary, ordinal, continuous, and +#' mixed variables +#' \insertCite{MarsmanVandenBerghHaslbeck_2025}{bgms}. +#' Supported model families include ordinal Markov random fields (MRFs), +#' Gaussian graphical models (GGMs), and mixed MRFs that combine discrete +#' and continuous variables in a single network. The likelihood is approximated +#' via a pseudolikelihood, and Markov chain Monte Carlo (MCMC) methods are used +#' to sample from the corresponding pseudoposterior distribution of model +#' parameters. #' #' The main entry points are: #' \itemize{ #' \item \strong{bgm}: estimation in a one-sample design. +#' Use \code{variable_type = "ordinal"} for an MRF, +#' \code{"continuous"} for a GGM, or a per-variable vector +#' mixing \code{"ordinal"}, \code{"blume-capel"}, and +#' \code{"continuous"} for a mixed MRF. #' \item \strong{bgmCompare}: estimation and group comparison in an #' independent-sample design. #' } diff --git a/README.md b/README.md index 808b9799..b2c6927e 100644 --- a/README.md +++ b/README.md @@ -30,21 +30,23 @@ stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https:// **Bayesian analysis of graphical models** The **bgms** package implements Bayesian estimation and model comparison -for graphical models of binary, ordinal, and continuous variables +for graphical models of binary, ordinal, continuous, and mixed variables (Marsman, van den Bergh, et al., 2025). It -supports **ordinal Markov random fields (MRFs)** for discrete data and -**Gaussian graphical models (GGMs)** for continuous data. The likelihood -is approximated with a pseudolikelihood, and Markov chain Monte Carlo -(MCMC) methods are used to sample from the corresponding pseudoposterior -distribution of the model parameters. +supports **ordinal Markov random fields (MRFs)** for discrete data, +**Gaussian graphical models (GGMs)** for continuous data, and **mixed +MRFs** that combine discrete and continuous variables in a single +network. The likelihood is approximated with a pseudolikelihood, and +Markov chain Monte Carlo (MCMC) methods are used to sample from the +corresponding pseudoposterior distribution of the model parameters. ## Main functions The package has two main entry points: - `bgm()` – estimates a single network in a one-sample design. Use - `variable_type = "continuous"` for a GGM, or `"ordinal"` (default) for - an MRF. + `variable_type = "ordinal"` for an MRF, `"continuous"` for a GGM, or a + per-variable vector mixing `"ordinal"`, `"blume-capel"`, and + `"continuous"` for a mixed MRF. - `bgmCompare()` – compares networks between groups in an independent-sample design. diff --git a/Readme.Rmd b/Readme.Rmd index 57e93e0a..eb302f3f 100644 --- a/Readme.Rmd +++ b/Readme.Rmd @@ -38,10 +38,11 @@ library(bgms) **Bayesian analysis of graphical models** The **bgms** package implements Bayesian estimation and model comparison for -graphical models of binary, ordinal, and continuous variables +graphical models of binary, ordinal, continuous, and mixed variables [@MarsmanVandenBerghHaslbeck_2025]. -It supports **ordinal Markov random fields (MRFs)** for discrete data and -**Gaussian graphical models (GGMs)** for continuous data. +It supports **ordinal Markov random fields (MRFs)** for discrete data, +**Gaussian graphical models (GGMs)** for continuous data, and **mixed MRFs** +that combine discrete and continuous variables in a single network. The likelihood is approximated with a pseudolikelihood, and Markov chain Monte Carlo (MCMC) methods are used to sample from the corresponding pseudoposterior distribution of the model parameters. @@ -51,8 +52,9 @@ distribution of the model parameters. The package has two main entry points: - `bgm()` – estimates a single network in a one-sample design. - Use `variable_type = "continuous"` for a GGM, or `"ordinal"` (default) - for an MRF. + Use `variable_type = "ordinal"` for an MRF, `"continuous"` for a GGM, + or a per-variable vector mixing `"ordinal"`, `"blume-capel"`, and + `"continuous"` for a mixed MRF. - `bgmCompare()` – compares networks between groups in an independent-sample design. diff --git a/man/bgm.Rd b/man/bgm.Rd index 3dbe3dc6..e9ead76c 100644 --- a/man/bgm.Rd +++ b/man/bgm.Rd @@ -50,8 +50,11 @@ ordinal variables, unobserved categories are collapsed; for Blume–Capel variables, all categories are retained.} \item{variable_type}{Character or character vector. Specifies the type of -each variable in \code{x}. Allowed values: \code{"ordinal"} or -\code{"blume-capel"}. Binary variables are automatically treated as +each variable in \code{x}. Allowed values: \code{"ordinal"}, +\code{"blume-capel"}, or \code{"continuous"}. A single string applies +to all variables. A per-variable vector that mixes discrete +(\code{"ordinal"} / \code{"blume-capel"}) and \code{"continuous"} +types fits a mixed MRF. Binary variables are automatically treated as \code{"ordinal"}. Default: \code{"ordinal"}.} \item{baseline_category}{Integer or vector. Baseline category used in diff --git a/man/bgms-package.Rd b/man/bgms-package.Rd index d1f16dd7..a13091ad 100644 --- a/man/bgms-package.Rd +++ b/man/bgms-package.Rd @@ -4,18 +4,26 @@ \name{bgms-package} \alias{bgms} \alias{bgms-package} -\title{bgms: Bayesian Analysis of Networks of Binary and/or Ordinal Variables} +\title{bgms: Bayesian Analysis of Graphical Models} \description{ The \code{R} package \strong{bgms} provides tools for Bayesian analysis of -the ordinal Markov random field (MRF), a graphical model describing networks -of binary and/or ordinal variables \insertCite{MarsmanVandenBerghHaslbeck_2025}{bgms}. -The likelihood is approximated via a pseudolikelihood, and Markov chain Monte -Carlo (MCMC) methods are used to sample from the corresponding pseudoposterior -distribution of model parameters. +graphical models describing networks of binary, ordinal, continuous, and +mixed variables +\insertCite{MarsmanVandenBerghHaslbeck_2025}{bgms}. +Supported model families include ordinal Markov random fields (MRFs), +Gaussian graphical models (GGMs), and mixed MRFs that combine discrete +and continuous variables in a single network. The likelihood is approximated +via a pseudolikelihood, and Markov chain Monte Carlo (MCMC) methods are used +to sample from the corresponding pseudoposterior distribution of model +parameters. The main entry points are: \itemize{ \item \strong{bgm}: estimation in a one-sample design. + Use \code{variable_type = "ordinal"} for an MRF, + \code{"continuous"} for a GGM, or a per-variable vector + mixing \code{"ordinal"}, \code{"blume-capel"}, and + \code{"continuous"} for a mixed MRF. \item \strong{bgmCompare}: estimation and group comparison in an independent-sample design. } diff --git a/man/mrfSampler.Rd b/man/mrfSampler.Rd index 8ff00c14..d2e6a0ba 100644 --- a/man/mrfSampler.Rd +++ b/man/mrfSampler.Rd @@ -21,15 +21,18 @@ mrfSampler( \item{num_variables}{The number of variables in the MRF.} -\item{num_categories}{Either a positive integer or a vector of positive -integers of length \code{num_variables}. The number of response categories on top -of the base category: \code{num_categories = 1} generates binary states. +\item{num_categories}{Either a positive integer or a vector +of positive integers of length \code{num_variables}. The +number of response categories on top of the base category: +\code{num_categories = 1} generates binary states. Only used for ordinal and Blume-Capel variables; ignored when \code{variable_type = "continuous"}.} -\item{pairwise}{A symmetric \code{num_variables} by \code{num_variables} matrix. -For ordinal and Blume-Capel variables, this contains the pairwise interaction -parameters; only the off-diagonal elements are used. For continuous variables, +\item{pairwise}{A symmetric \code{num_variables} by +\code{num_variables} matrix. For ordinal and Blume-Capel +variables, this contains the pairwise interaction parameters; +only the off-diagonal elements are used. For continuous +variables, this is the precision matrix \eqn{\Omega}{Omega} (including diagonal) and must be positive definite.} @@ -37,7 +40,8 @@ must be positive definite.} \code{num_variables} by \code{max(num_categories)} matrix of category thresholds. The elements in row \code{i} indicate the thresholds of variable \code{i}. If \code{num_categories} is a vector, only the first -\code{num_categories[i]} elements are used in row \code{i}. If the Blume-Capel +\code{num_categories[i]} elements are used in row \code{i}. +If the Blume-Capel model is used for the category thresholds for variable \code{i}, then row \code{i} requires two values (details below); the first is \eqn{\alpha}{\alpha}, the linear contribution of the Blume-Capel model and @@ -57,8 +61,10 @@ variables. When \code{variable_type = "continuous"}, the function simulates from a Gaussian graphical model. Defaults to \code{variable_type = "ordinal"}.} -\item{baseline_category}{An integer vector of length \code{num_variables} specifying the -baseline_category category that is used for the Blume-Capel model (details below). +\item{baseline_category}{An integer vector of length +\code{num_variables} specifying the baseline_category +category that is used for the Blume-Capel model +(details below). Can be any integer value between \code{0} and \code{num_categories} (or \code{num_categories[i]}).} diff --git a/man/predict.bgmCompare.Rd b/man/predict.bgmCompare.Rd index 0d407dd1..48eaa705 100644 --- a/man/predict.bgmCompare.Rd +++ b/man/predict.bgmCompare.Rd @@ -47,9 +47,10 @@ prediction (1 to number of groups). Required argument.} \item{...}{Additional arguments (currently ignored).} } \value{ -For \code{type = "probabilities"}: A named list with one element per -predicted variable. Each element is a matrix with \code{n} rows and -\code{num_categories + 1} columns containing \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} +For \code{type = "probabilities"}: A named list with one +element per predicted variable. Each element is a matrix with +\code{n} rows and \code{num_categories + 1} columns containing +\eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} for each observation and category. For \code{type = "response"}: A matrix with \code{n} rows and @@ -82,8 +83,10 @@ pred_g2 = predict(fit, newdata = y[1:10, ], group = 2, type = "response") } \seealso{ -\code{\link{predict.bgms}} for predicting from single-group models, - \code{\link{simulate.bgmCompare}} for simulating from group-comparison models. +\code{\link{predict.bgms}} for predicting + from single-group models, + \code{\link{simulate.bgmCompare}} for simulating + from group-comparison models. Other prediction: \code{\link{predict.bgms}()}, diff --git a/man/predict.bgms.Rd b/man/predict.bgms.Rd index 37e16319..564202f3 100644 --- a/man/predict.bgms.Rd +++ b/man/predict.bgms.Rd @@ -40,11 +40,13 @@ the original data used to fit the model.} \item{method}{Character string specifying which parameter estimates to use: \describe{ \item{\code{"posterior-mean"}}{Use posterior mean parameters.} - \item{\code{"posterior-sample"}}{Average predictions over posterior draws.} + \item{\code{"posterior-sample"}}{Average predictions + over posterior draws.} }} \item{ndraws}{Number of posterior draws to use when -\code{method = "posterior-sample"}. If \code{NULL}, uses all available draws.} +\code{method = "posterior-sample"}. If \code{NULL}, +uses all available draws.} \item{seed}{Optional random seed for reproducibility when \code{method = "posterior-sample"}.} @@ -56,8 +58,9 @@ the original data used to fit the model.} For \code{type = "probabilities"}: A named list with one element per predicted variable. Each element is a matrix with \code{n} rows and -\code{num_categories + 1} columns containing \eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} for each -observation and category. +\code{num_categories + 1} columns containing +\eqn{P(X_j = c | X_{-j})}{P(X_j = c | X_-j)} +for each observation and category. For \code{type = "response"}: A matrix with \code{n} rows and \code{length(variables)} columns containing predicted categories. @@ -79,10 +82,18 @@ For \code{type = "response"}: A matrix with \code{n} rows and When \code{method = "posterior-sample"}, conditional parameters are averaged over posterior draws, and an attribute \code{"sd"} is included. + +\strong{Mixed MRF models:} + +For mixed models, the return list contains elements for both discrete and +continuous predicted variables. Discrete variables return probability +matrices (as in ordinal models); continuous variables return conditional +mean and SD matrices (as in GGM models). } \description{ Computes conditional probability distributions for one or more variables -given the observed values of other variables in the data. +given the observed values of other variables in the data. Supports ordinal, +Blume-Capel, continuous (GGM), and mixed MRF models. } \details{ For each observation, the function computes the conditional distribution @@ -92,7 +103,8 @@ sampler. For GGM (continuous) models, the conditional distribution of \eqn{X_j | X_{-j}}{X_j | X_{-j}} is Gaussian with mean -\eqn{-\omega_{jj}^{-1} \sum_{k \neq j} \omega_{jk} x_k}{-omega_jj^{-1} sum_{k != j} omega_jk x_k} +\eqn{-\omega_{jj}^{-1} \sum_{k \neq j} +\omega_{jk} x_k}{-omega_jj^{-1} sum_{k != j} omega_jk x_k} and variance \eqn{\omega_{jj}^{-1}}{omega_jj^{-1}}, where \eqn{\Omega}{Omega} is the precision matrix. } diff --git a/man/simulate.bgms.Rd b/man/simulate.bgms.Rd index e988e3a2..0e605956 100644 --- a/man/simulate.bgms.Rd +++ b/man/simulate.bgms.Rd @@ -33,7 +33,8 @@ }} \item{ndraws}{Number of posterior draws to use when -\code{method = "posterior-sample"}. If \code{NULL}, uses all available draws.} +\code{method = "posterior-sample"}. If \code{NULL}, +uses all available draws.} \item{iter}{Number of Gibbs iterations for equilibration before collecting samples. Default: \code{1000}.} @@ -54,14 +55,20 @@ If \code{method = "posterior-mean"}: A matrix with \code{nsim} rows and If \code{method = "posterior-sample"}: A list of matrices, one per posterior draw, each with \code{nsim} rows and \code{p} columns. + +For mixed MRF models, discrete columns contain non-negative integers and +continuous columns contain real-valued observations, ordered as in the +original data. } \description{ Generates new observations from the Markov Random Field model using the -estimated parameters from a fitted \code{bgms} object. +estimated parameters from a fitted \code{bgms} object. Supports ordinal, +Blume-Capel, continuous (GGM), and mixed MRF models. } \details{ -This function uses the estimated interaction and threshold parameters to -generate new data via Gibbs sampling. When \code{method = "posterior-sample"}, +This function uses the estimated interaction and threshold +parameters to generate new data via Gibbs sampling. When +\code{method = "posterior-sample"}, parameter uncertainty is parameter uncertainty is propagated to the simulated data by using different posterior draws. Parallel processing is available for this method via the \code{cores} argument. @@ -75,7 +82,11 @@ fit = bgm(x = Wenchuan[, 1:5], chains = 2) new_data = simulate(fit, nsim = 100) # Simulate with parameter uncertainty (10 datasets) -new_data_list = simulate(fit, nsim = 100, method = "posterior-sample", ndraws = 10) +new_data_list = simulate( + fit, + nsim = 100, + method = "posterior-sample", ndraws = 10 +) # Use parallel processing for faster simulation new_data_list = simulate(fit, diff --git a/man/simulate_mrf.Rd b/man/simulate_mrf.Rd index 6124a965..76213b94 100644 --- a/man/simulate_mrf.Rd +++ b/man/simulate_mrf.Rd @@ -21,15 +21,18 @@ simulate_mrf( \item{num_variables}{The number of variables in the MRF.} -\item{num_categories}{Either a positive integer or a vector of positive -integers of length \code{num_variables}. The number of response categories on top -of the base category: \code{num_categories = 1} generates binary states. +\item{num_categories}{Either a positive integer or a vector +of positive integers of length \code{num_variables}. The +number of response categories on top of the base category: +\code{num_categories = 1} generates binary states. Only used for ordinal and Blume-Capel variables; ignored when \code{variable_type = "continuous"}.} -\item{pairwise}{A symmetric \code{num_variables} by \code{num_variables} matrix. -For ordinal and Blume-Capel variables, this contains the pairwise interaction -parameters; only the off-diagonal elements are used. For continuous variables, +\item{pairwise}{A symmetric \code{num_variables} by +\code{num_variables} matrix. For ordinal and Blume-Capel +variables, this contains the pairwise interaction parameters; +only the off-diagonal elements are used. For continuous +variables, this is the precision matrix \eqn{\Omega}{Omega} (including diagonal) and must be positive definite.} @@ -37,7 +40,8 @@ must be positive definite.} \code{num_variables} by \code{max(num_categories)} matrix of category thresholds. The elements in row \code{i} indicate the thresholds of variable \code{i}. If \code{num_categories} is a vector, only the first -\code{num_categories[i]} elements are used in row \code{i}. If the Blume-Capel +\code{num_categories[i]} elements are used in row \code{i}. +If the Blume-Capel model is used for the category thresholds for variable \code{i}, then row \code{i} requires two values (details below); the first is \eqn{\alpha}{\alpha}, the linear contribution of the Blume-Capel model and @@ -57,8 +61,10 @@ variables. When \code{variable_type = "continuous"}, the function simulates from a Gaussian graphical model. Defaults to \code{variable_type = "ordinal"}.} -\item{baseline_category}{An integer vector of length \code{num_variables} specifying the -baseline_category category that is used for the Blume-Capel model (details below). +\item{baseline_category}{An integer vector of length +\code{num_variables} specifying the baseline_category +category that is used for the Blume-Capel model +(details below). Can be any integer value between \code{0} and \code{num_categories} (or \code{num_categories[i]}).} @@ -77,10 +83,11 @@ observations. For ordinal/Blume-Capel variables, entries are non-negative integers. For continuous variables, entries are real-valued. } \description{ -`simulate_mrf()` generates observations from a Markov Random Field using -user-specified parameters. For ordinal and Blume-Capel variables, observations -are generated via Gibbs sampling. For continuous variables (Gaussian graphical -model), observations are drawn directly from the multivariate normal +`simulate_mrf()` generates observations from a Markov Random +Field using user-specified parameters. For ordinal and +Blume-Capel variables, observations are generated via Gibbs +sampling. For continuous variables (Gaussian graphical model), +observations are drawn directly from the multivariate normal distribution implied by the precision matrix. } \details{ @@ -106,7 +113,8 @@ The Blume-Capel option is specifically designed for ordinal variables that have a special type of baseline_category category, such as the neutral category in a Likert scale. The Blume-Capel model specifies the following quadratic model for the threshold parameters: -\deqn{\mu_{\text{c}} = \alpha \times (\text{c} - \text{r}) + \beta \times (\text{c} - \text{r})^2,}{{\mu_{\text{c}} = \alpha \times (\text{c} - \text{r}) + \beta \times (\text{c} - \text{r})^2,}} +\deqn{\mu_{\text{c}} = \alpha (\text{c} - \text{r}) + + \beta (\text{c} - \text{r})^2} where \eqn{\mu_{\text{c}}}{\mu_{\text{c}}} is the threshold for category c (which now includes zero), \eqn{\alpha}{\alpha} offers a linear trend across categories (increasing threshold values if From 1901c89677bc431d11e7d58a38721e6403a8ce2e Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:46:22 +0100 Subject: [PATCH 20/60] docs: add integrated NUTS+MH hybrid sampler plan for mixed MRF --- dev/mixedmrf/nuts-plan.md | 518 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 518 insertions(+) create mode 100644 dev/mixedmrf/nuts-plan.md diff --git a/dev/mixedmrf/nuts-plan.md b/dev/mixedmrf/nuts-plan.md new file mode 100644 index 00000000..63204730 --- /dev/null +++ b/dev/mixedmrf/nuts-plan.md @@ -0,0 +1,518 @@ +# Hybrid NUTS+MH Sampler for Mixed MRF (integrated plan) + +Integrates feedback from review1.md and review2.md into the original +nuts-plan.md. Open points that need decisions are marked **OPEN POINT**. + +## Overview + +Split each MCMC iteration into two phases: + +1. **NUTS phase** — jointly sample (μx, μy, Kxx, Kxy) using NUTS, treating Kyy as fixed +2. **Metropolis phase** — component-wise update Kyy using the existing Cholesky-based MH + +This is a Gibbs-within-MCMC scheme: NUTS handles the high-dimensional +unconstrained block, Metropolis handles only the q(q+1)/2 constrained +precision matrix entries. + +## Why it works + +| Parameter | Constraint | Current sampler | Proposed | +|----------------------|-----------|------------------------|-----------------------| +| μx (thresholds) | none | component MH | **NUTS** | +| μy (means) | none | component MH | **NUTS** | +| Kxx (discrete int.) | none | component MH | **NUTS** | +| Kxy (cross int.) | none | component MH | **NUTS** | +| Kyy off-diagonal | SPD | rank-2 Cholesky MH | MH (unchanged) | +| Kyy diagonal | SPD | rank-1 Cholesky MH | MH (unchanged) | + +With Kyy fixed, the pseudo-log-posterior over the remaining parameters is +smooth and unconstrained — exactly the setting where NUTS excels. + +## Gradient derivation + +The conditional pseudo-log-posterior (with Kyy fixed) is: + + ℓ(θ) = Σ_s log p(x_s | x_{-s}, y) [OMRF conditionals] + + log p(y | x) [GGM conditional] + + log π(θ) [priors] + +### OMRF conditional gradients + +For discrete variable s with rest score: + + r_{i,s} = Σ_{t≠s} Kxx_{st} x_{i,t} + 2 Σ_j Kxy_{sj} y_{i,j} + +- ∂/∂μx_{s,c}: counts minus expected counts — identical to the existing + OMRF gradient via `compute_logZ_and_probs_ordinal`. +- ∂/∂Kxx_{st}: Σ_i x_{i,t} · [(x_{i,s}+1) - E_s[c+1 | r_{i,s}]] + (+ symmetric contribution from ℓ_t) — same pattern as OMRF pairwise gradient. +- ∂/∂Kxy_{sj}: 2 Σ_i y_{i,j} · [(x_{i,s}+1) - E_s[c+1 | r_{i,s}]] + — same pattern but with continuous observations. + +### GGM conditional gradients + +With residual D = Y - M where M_i = μy + 2 Σyy Kxy' x_i: + +- ∂/∂μy = Kyy · D'1_n +- ∂/∂Kxy = 2 · X_disc' · D + +The simplification Kyy Σyy = I avoids computing Σyy during the gradient. +These formulas have been verified by both reviewers. + +### Prior gradients + +- μx: Beta prior → sigmoid form (same as OMRF) +- μy, Kxy: Normal(0, 1) prior +- Kxx: Cauchy(0, scale) prior + +Key property: `compute_logZ_and_probs_ordinal/blume_capel` already computes +both the log-normalizer and the softmax probabilities needed for the gradient +— the same shared utility used by the OMRF. + +## Architecture: 7 phases + +### Phase 1: NUTS parameter vector + +**Files**: `mixed_mrf_model.h`, `mixed_mrf_model.cpp` + +The NUTS vector excludes Kyy: + + [mux_params | active_Kxx | muy | active_Kxy] + +- `get_vectorized_parameters()` / `set_vectorized_parameters()` — pack/unpack + only NUTS params (excluding Kyy). +- `get_full_vectorized_parameters()` — unchanged, returns everything including + Kyy (for sample storage). +- `get_active_inv_mass()` — returns diagonal mass vector sized for NUTS + params only. +- New helper: `unvectorize_nuts_params()` to unpack into model matrices. + +Edge selection changes the NUTS vector dimension (Gxx/Gxy edge toggles), +mirroring how the OMRF handles it. + +#### Vectorization contract (from reviews) + +The `BaseModel` interface uses `get_vectorized_parameters()` / +`set_vectorized_parameters()` as the NUTS-sampled state. For the hybrid +scheme these methods must return/accept the NUTS-only vector (excluding Kyy), +while `get_full_vectorized_parameters()` returns the full vector for sample +storage. This matches the OMRF pattern where `get_vectorized_parameters()` +returns active-edge-only params. + +**RESOLVED — `full_parameter_dimension()` sizing → option 2.** +`GradientSamplerBase::do_initialize()` calls +`model.full_parameter_dimension()` to size the initial inverse mass vector. +For the hybrid scheme the mass matrix covers only the NUTS dimension, not +Kyy. + +**Investigation result:** For the OMRF, `full_parameter_dimension()` returns +`num_main_ + num_pairwise_` (all params) while `parameter_dimension()` +returns only active-edge params. For the GGM, both return the same value +(`dim_`). Neither model would break from a refactoring that uses +`full_parameter_dimension()` for mass-matrix sizing: the OMRF already needs +the full (non-edge-subsetted) dimension for the mass matrix (since +`set_inv_mass` receives a full-dimension vector that the model subsets via +`get_active_inv_mass`), and the GGM has no distinction. The mixed model +would override `full_parameter_dimension()` to return the NUTS-block +dimension (num_main + p(p-1)/2 + q + pq — everything except Kyy), while +a new `storage_dimension()` returns the complete vector length including Kyy. + +**Decision:** Refactor `GradientSamplerBase::do_initialize()` to use +`full_parameter_dimension()` for mass matrix sizing (this is already the +case), and make the mixed model's `full_parameter_dimension()` return the +NUTS-block size. Add `storage_dimension()` for sample storage. The OMRF and +GGM are unaffected because their `full_parameter_dimension()` already matches +the mass-matrix dimension. + +**Implementation note — `set_inv_mass` / `get_active_inv_mass`.** The OMRF +pattern subsets `inv_mass_` to active-edge-only entries. The mixed-model +version must exclude Kyy entries entirely. Since `set_inv_mass` is called +from the adaptation controller with a full-dimension vector, the model needs +to know which entries correspond to Kyy and skip them. Pin down index +bookkeeping early. + +### Phase 2: Gradient computation + +**New file**: `mixed_mrf_gradient.cpp` + +- `logp_and_gradient(params)` — returns (log-pseudo-posterior, ∇) +- Structure follows OMRF's `logp_and_gradient()` closely: + 1. Unvectorize params into temp matrices (not model state — see below) + 2. Compute rest scores (including 2 Kxy y contribution) + 3. Per variable: `compute_logZ_and_probs` gives both log Z and + probabilities + 4. Gradient from probabilities: main effects + pairwise weights + (using x and y) + 5. GGM conditional: residuals → ∇μy and ∇Kxy contributions + 6. Prior gradients +- `gradient(params)` — calls `logp_and_gradient` and discards the + log-posterior. +- `has_gradient()` returns `true`. + +#### Cache invalidation strategy (from reviews) + +NUTS calls `logp_and_gradient()` at many points along the leapfrog +trajectory, but only calls `set_vectorized_parameters()` once with the final +accepted state. Following the OMRF pattern: + +- `logp_and_gradient()` unvectorizes into **temporaries** (analogous to + `unvectorize_to_temps` in the OMRF), computing derived quantities (rest + scores, conditional means) locally. This avoids mutating model state during + the trajectory. +- The final `set_vectorized_parameters()` updates model state and + recomputes `conditional_mean_` and (for marginal PL) `Theta_`. + +#### Gradient cache scope (from reviews) + +Only the OMRF sufficient statistics (category counts, pairwise sums) can be +precomputed and cached. The GGM residual D = Y - M depends on Kxy and μy, +so the GGM gradient must be computed fresh each evaluation. + +#### Marginal PL gradient — full plan + +The gradient derivation above is for the **conditional** pseudo-likelihood. +The mixed model also supports **marginal** PL +(`pseudolikelihood = "marginal"`), where OMRF conditionals use +Theta = Kxx + 2 Kxy Σyy Kxy' instead of Kxx directly. Marginal PL is +important in practice, so the gradient implementation must support both +modes. + +**Marginal PL pseudo-log-posterior (Kyy fixed):** + + ℓ_marg(θ) = Σ_s log p_marg(x_s | x_{-s}) [marginal OMRF conditionals] + + log p(y | x) [GGM conditional] + + log π(θ) [priors] + +The marginal OMRF conditional for variable s uses Theta instead of Kxx. +The rest score and denominator structure differ from the conditional form +(see `log_marginal_omrf` in `mixed_mrf_likelihoods.cpp`): + +**Rest score (marginal):** + + r_{i,s}^marg = Σ_{t≠s} Θ_{st} x_{i,t} + 2 Σ_j Kxy_{sj} μy_j + +where Θ = Kxx + 2 Kxy Σyy Kxy'. Note: Σyy is fixed (Kyy is fixed). + +**Denominator differences:** The marginal ordinal denominator absorbs the +quadratic self-interaction Θ_{ss} into the main-effect parameter vector: +main_param(c) = μx_{s,c} + (c+1)² Θ_{ss}. Blume-Capel uses +effective_beta = β + Θ_{ss}. + +**Gradient structure (marginal PL):** + +1. ∂/∂μx_{s,c}: Same structure as conditional, but using the marginal + denominator probabilities (which include the Θ_{ss} offset). The + `compute_logZ_and_probs` utility handles this transparently if given + the modified main_param. + +2. ∂/∂Kxx_{st}: The OMRF part uses Θ-based rest scores. Since + ∂Θ/∂Kxx_{st} = e_s e_t' + e_t e_s' (just the identity), the gradient + has the same form as the conditional case but evaluated at the Θ-based + rest scores and marginal probabilities. + +3. ∂/∂Kxy_{sj}: This is the complex case. Kxy appears in two places: + - The GGM conditional (via conditional_mean_) — same gradient as + conditional case: 2 [X' D]_{s,j} + - The marginal OMRF conditionals (via Θ). The chain rule gives: + + ∂Θ_{ab}/∂Kxy_{sj} = 2 [Σyy]_{j,:} Kxy_{b,:}' δ_{as} + + 2 Kxy_{a,:} [Σyy]_{:,j} δ_{bs} + + For each OMRF variable a, `log_marginal_omrf(a)` changes through Θ. + The gradient contribution from the marginal OMRF terms for one variable + a involves: + - The sensitivity of the rest score to Θ changes + - The sensitivity of the denominator (via Θ_{aa}) to Kxy + + In matrix form, for the full Kxy gradient from OMRF marginal terms: + + ∂ℓ_marg_omrf/∂Kxy = 2 Σyy [partial through Θ rest scores] + + 2 [partial through Θ diagonal] + + Both partials are computable from the marginal probabilities already + obtained from `compute_logZ_and_probs`. + +4. ∂/∂μy: In the marginal form, μy enters the OMRF rest score as a + constant bias 2 Kxy_{s,:} μy. So there is an additional μy gradient + from the OMRF terms: + + ∂ℓ_marg_omrf/∂μy_j = Σ_s 2 Kxy_{s,j} · [obs_mean_s - expected_mean_s] + + Plus the GGM contribution Kyy · D' 1_n as before. + +**Implementation plan:** + +- Phase 2 implements `logp_and_gradient` with a branch on `use_marginal_pl_`. +- The conditional path is implemented and tested first (numerical gradient + check). +- The marginal path is implemented second, reusing the same + `compute_logZ_and_probs` calls but with modified main_param vectors + (absorbing Θ_{ss}) and Θ-based rest scores. +- The marginal ∂Kxy gradient has 3 contributions: (a) GGM conditional, + (b) OMRF via Θ rest scores, (c) OMRF via Θ diagonal. Each is O(n·p·q). +- A second numerical gradient check validates the marginal path. +- Testing: both PL modes should produce consistent posterior marginals on + small test problems. + +**Key insight:** With Kyy fixed, Σyy = Kyy⁻¹ is a constant matrix. So +`recompute_Theta()` during gradient evaluation is just a matrix product +Kxx + 2 Kxy Σyy Kxy' — O(p²q) per evaluation but only needed once per +`logp_and_gradient` call (not per variable). The marginal rest scores and +probabilities are then computed per variable as usual. + +### Phase 3: Kyy-only Metropolis + +**File**: `mixed_mrf_metropolis.cpp` + +Create a dedicated `do_kyy_metropolis_step()` that only updates Kyy entries: + - `update_Kyy_offdiag(i, j)` — existing rank-2 Cholesky MH (unchanged) + - `update_Kyy_diag(i)` — existing rank-1 Cholesky MH (unchanged) + +The hybrid sampler calls `do_kyy_metropolis_step()`. +The pure-MH sampler calls `do_one_metropolis_step()` (full sweep, unchanged). + +Robbins-Monro adaptation for Kyy proposal SDs remains. + +#### Edge-indicator ownership — investigation and decision + +Currently edge-indicator updates happen in two places: + +- `ChainRunner::run_iteration()` (line ~59) calls + `model.update_edge_indicators()` when `schedule.selection_enabled(iter)`. +- `MixedMRFModel::do_one_metropolis_step()` (line ~477) unconditionally calls + `update_edge_indicators()` at the end of the sweep. + +**Investigation result:** The pattern differs across model types: + +- **OMRF**: `do_one_metropolis_step()` does NOT call + `update_edge_indicators()`. Edge updates are handled exclusively by + `ChainRunner`. The OMRF has a separate `update_edge_indicators()` method + that uses the shuffled edge order from `prepare_iteration()`. +- **GGM**: `do_one_metropolis_step()` DOES include edge-indicator updates + inline (calls `update_edge_indicator_parameter_pair` inside the method). + Its `update_edge_indicators()` override is a no-op. `ChainRunner` calls + the no-op, so no double-counting. +- **Mixed**: `do_one_metropolis_step()` calls `update_edge_indicators()` at + step 6. `ChainRunner` also calls it. **This is a double-counting bug in + the current code** — edge-indicator proposals happen twice per iteration + when edge selection is active. + +**Decision:** Fix the mixed model to match the OMRF pattern: + +1. Remove the `update_edge_indicators()` call from + `MixedMRFModel::do_one_metropolis_step()`. +2. `ChainRunner` remains the sole owner of edge-indicator scheduling. +3. `do_kyy_metropolis_step()` does not include edge-indicator logic. +4. The pure-MH path is not broken because `ChainRunner` already calls + `update_edge_indicators()` after the sampler step. + +**This is an existing bug that should be fixed before the hybrid work.** + +**Edge selection ordering**: indicator updates run **after** both NUTS and +Kyy MH complete in each iteration. Birth/death moves for Gxx/Gxy change the +NUTS vector dimension, so they cannot happen mid-trajectory. + +### Phase 4: Hybrid sampler + +**New file**: `hybrid_nuts_sampler.h` + +``` +class HybridNUTSSampler : public GradientSamplerBase { + step(model, iter): + 1. GradientSamplerBase::step() → NUTS for (mux, muy, Kxx, Kxy) + 2. model.do_kyy_metropolis_step(iter) → MH for Kyy + return combined result +} +``` + +- Inherits NUTS adaptation (step size + diagonal mass matrix) from + `GradientSamplerBase`. +- Kyy proposal-SD adaptation runs inside the model (Robbins-Monro, same + as now). +- Registered in sampler factory as `"hybrid-nuts"`. + +#### Adaptation controller alignment (from reviews) + +`GradientSamplerBase::step()` calls `adapt_->update(full_params, ...)` +with the parameter vector from `model.get_full_vectorized_parameters()`. +The adaptation controller's mass matrix must match the NUTS dimension +(excluding Kyy), not the full storage dimension. Resolved by Open Point A: +refactor `GradientSamplerBase` to use `parameter_dimension()` for +mass-matrix sizing. + +#### Kyy MH diagnostics — deferred + +NUTS diagnostics (tree depth, divergences, energy) reflect only the NUTS +phase. Kyy MH acceptance rates are tracked by Robbins-Monro internally. +Kyy acceptance rates can be computed from the sampler output post-hoc. +Deferred to a later iteration. + +### Phase 5: Warmup schedule integration + +- Stages 1–3a: NUTS adaptation (step size + mass matrix for NUTS params) + + Kyy proposal SD warmup. +- Stage 3b: Kyy proposal-SD tuning via Robbins-Monro. +- Stage 3c: Re-adapt NUTS step size with edge selection active. +- Edge selection: Gxx/Gxy toggles change NUTS vector dimension; Gyy + toggles change Kyy MH sweep. + +#### Warmup scheduling for `"hybrid-nuts"` — resolved + +`ChainRunner` (line ~34) currently sets `learn_sd` and NUTS diagnostics +only for known sampler types (`"nuts"`, `"hmc"`, `"hamiltonian-mc"`). +Since the user-facing sampler name will be `"nuts"` (which automatically +becomes hybrid for mixed models — see Phase 6), the existing runner logic +recognizes the sampler type without modification. If the internal +implementation uses a distinct `"hybrid-nuts"` key in the sampler factory, +the runner check must be extended to include it. + +#### Kyy proposal-SD adaptation timing — resolved + +Kyy proposal-SD adaptation via Robbins-Monro runs throughout the entire +warmup phase (whenever `iteration < total_warmup_`), matching the current +adaptive-MH behavior. This is correct: the Kyy MH proposal SDs need +continuous adaptation because Kyy mixing depends on the evolving NUTS +parameter state. No gating by warmup stage. + +### Phase 6: Sampler type selection + +**Files**: R-level `bgm_spec.R`, C++ interface (`sample_mixed.cpp`) + +#### End-to-end sampler wiring — resolved + +Currently sampler selection is hard-wired to MH for mixed models across +multiple files: + +- `R/bgm_spec.R` line 212: rejects non-`adaptive-metropolis` for `mixed_mrf` +- `R/bgm_spec.R` line 320: sets `sampler_is_continuous = is_continuous || is_mixed` +- `R/validate_sampler.R` lines 111, 119: forces `adaptive-metropolis` for `is_continuous` +- `src/sample_mixed.cpp` line 98: hard-codes `config.sampler_type = "mh"` +- `R/run_sampler.R` line 184: calls `sample_mixed_mrf()` with no sampler-type argument + +**Decisions:** + +- **User-facing argument:** `sampler = "nuts"` (same as existing). For + `type = "mixed"`, `"nuts"` automatically becomes the hybrid NUTS+MH + scheme internally. Users do not need to know about the hybrid distinction. +- **Default:** `"nuts"` is already the default `update_method`. Mixed models + use the same default. +- **Fallback:** `sampler = "adaptive-metropolis"` remains available as + pure-MH fallback for mixed models. + +**Coordinated changes:** + 1. Remove the `mixed_mrf` rejection in `bgm_spec.R` for non-MH samplers + 2. Allow `"nuts"` for mixed models in `validate_sampler.R` + 3. Extend `sample_mixed_mrf` C++ signature with sampler type + NUTS config + 4. Pass `spec$sampler$update_method` from `run_sampler_mixed_mrf` + 5. In the C++ sampler factory, `"nuts"` + mixed model creates the + `HybridNUTSSampler` (NUTS for unconstrained block + MH for Kyy) + +### Phase 7: Testing and validation + +1. **Numerical gradient check**: finite-difference vs analytical gradient. + Implement *before* the full hybrid sampler as a standalone test calling + `logp_and_gradient` directly. Highest-risk component. +2. **Posterior equivalence**: compare hybrid-NUTS posteriors against + pure-MH posteriors on small problems. Consider using the Stan exact- + likelihood model from `mixedGM` (`inst/stan/mixed_mrf_exact.stan`) as a + non-pseudolikelihood gold standard. +3. **ESS comparison**: effective sample size per second, hybrid vs pure MH. +4. **Edge selection**: verify birth/death moves work correctly with the + hybrid scheme. +5. **Edge cases**: q = 1 (scalar Kyy), p = 1 (single discrete variable), + all edges off. +6. **Gradient consistency across PL types** (when marginal PL is + implemented): verify conditional and marginal PL gradients produce the + same posterior marginals. +7. **Vectorization roundtrip tests**: verify `get_vectorized_parameters()` → + `set_vectorized_parameters()` → `get_vectorized_parameters()` is + identity for the NUTS block. + +## Key design decisions + +1. **Both conditional and marginal pseudo-likelihood for NUTS.** The + conditional form Σ_s p(x_s|x_{-s}, y) · p(y|x) is natural when Kyy is + fixed: the GGM conditional is standard Gaussian and the OMRF conditionals + just gain a continuous contribution to rest scores. The marginal form + uses Θ = Kxx + 2 Kxy Σyy Kxy' in the OMRF conditionals; since Kyy (and + thus Σyy) is fixed, Θ is a smooth function of Kxx and Kxy. Implement + conditional first, then marginal, each with numerical gradient checks. + +2. **Separate `do_kyy_metropolis_step()` method.** Rather than overloading + `do_one_metropolis_step()` semantics via `has_gradient()` branching, + create a dedicated Kyy-only method. Explicit and avoids fragile coupling. + +3. **Single NUTS vector (no Kyy).** The NUTS parameter vector packs + [μx, Kxx, μy, Kxy] with active-edge subsetting. Kyy lives entirely + outside the NUTS dynamics. + +4. **Reuse of `compute_logZ_and_probs`.** The gradient computation reuses + the existing shared utility for joint log-normalizer + probability + computation. + +5. **`ChainRunner` owns edge-indicator updates.** Edge-indicator proposals + are removed from `MixedMRFModel::do_one_metropolis_step()` (fixing an + existing double-counting bug) and handled exclusively by the runner, + matching the OMRF pattern. + +6. **Mixed model's `full_parameter_dimension()` returns NUTS-block size.** + The mixed model overrides `full_parameter_dimension()` to return the + NUTS-block dimension (excluding Kyy). A new `storage_dimension()` method + provides the complete dimension for sample storage. No refactoring of + `GradientSamplerBase` needed — it already uses `full_parameter_dimension()` + which will return the correct NUTS-block size. + +## Risk and mitigation + +| Risk | Mitigation | +|---------------------------------------------|---------------------------------------------------------| +| Gradient bugs (subtle sign errors) | Numerical gradient check as first test (Phase 7.1) | +| Mass matrix mismatch after edge toggling | Follow OMRF pattern: resize + re-init heuristic | +| Kyy MH mixing slower than NUTS expectations | Kyy is low-dimensional (q(q+1)/2); component MH is ok | +| Marginal vs conditional PL mismatch | Validate both decompositions give consistent posteriors | +| Edge-indicator double-counting | Single owner (ChainRunner) for indicator updates | +| Cache invalidation during leapfrog | Unvectorize to temps in gradient; update state once | +| Hard-wired MH selection blocks hybrid | Coordinated R + C++ wiring changes (Phase 6) | +| Warmup schedule ignores hybrid-nuts | Update ChainRunner feature detection | + +## Expected impact + +For a model with p discrete and q continuous variables: + +- **Current**: ~O(p² + pq + q²) component-wise MH steps per iteration +- **Hybrid**: 1 NUTS trajectory (joint over p·C̄ + p(p-1)/2 + q + pq dims) + + q(q+1)/2 MH steps +- NUTS typically produces near-independent samples with O(1) effective draws + per trajectory, vs ~O(d) iterations for random-walk MH to decorrelate in d + dimensions +- Biggest win when p is large relative to q + +## Recommended implementation order + +1. Resolve ownership contracts: indicator updates from `do_one_metropolis_step`, + `do_kyy_metropolis_step` semantics, hybrid sampler hook shape. +2. Wire sampler selection end-to-end (R validation → R dispatch → C++ config + → sampler factory). +3. Implement mixed-model NUTS vectorization and gradient, with numerical + gradient checks. +4. Integrate warmup/diagnostics handling for `hybrid-nuts`. +5. Add posterior-equivalence and edge-selection regression tests. + +--- + +## Resolution summary + +| # | Topic | Decision | +|---|-------|----------| +| A | `full_parameter_dimension()` sizing | Mixed model overrides to return NUTS-block size; new `storage_dimension()` for full vector. No `GradientSamplerBase` refactoring needed. | +| B | Marginal PL gradient | Implement both conditional and marginal. Conditional first with gradient check, then marginal with its own gradient check. | +| C | Edge-indicator ownership | Fix existing double-counting bug: remove `update_edge_indicators()` from `do_one_metropolis_step()`. `ChainRunner` is sole owner. | +| D | Kyy MH diagnostics | Deferred. Computable from sampler output post-hoc. | +| E | Warmup scheduling | User-facing name is `"nuts"`, so runner recognizes it. Kyy proposal-SD adaptation runs through entire warmup (no stage gating). | +| F | End-to-end sampler wiring | `sampler = "nuts"` (default) becomes hybrid for mixed models. `"adaptive-metropolis"` as pure-MH fallback. Coordinated R + C++ changes. | + +### Pre-implementation fix + +The edge-indicator double-counting in `MixedMRFModel::do_one_metropolis_step()` +(Point C) should be fixed before starting the hybrid sampler work. This is a +standalone bug fix that benefits the existing pure-MH code path. From b19afe30bc7241b89ca1786c61c847f418736b62 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 14:49:05 +0100 Subject: [PATCH 21/60] fix: remove double-counting of edge-indicator updates in mixed MRF MixedMRFModel::do_one_metropolis_step() called update_edge_indicators() at step 6, but ChainRunner already calls it after each sampler step. This caused indicator proposals to happen twice per iteration when edge selection was active. Remove the call from do_one_metropolis_step() to match the OMRF pattern where ChainRunner is the sole owner of edge-indicator scheduling. --- src/models/mixed/mixed_mrf_model.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 38ef87e5..b907a8d6 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -473,8 +473,8 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { if(!edge_selection_active_ || gxy(i, j) == 1) update_Kxy(i, j, iteration); - // Step 6: Edge selection (reversible-jump birth/death) - update_edge_indicators(); + // Edge-indicator updates are handled by ChainRunner, not here. + // (Matches the OMRF pattern; avoids double-counting indicator proposals.) } void MixedMRFModel::update_edge_indicators() { From 4dff31cec4027e1c41a2fcf8cea66acce23b6962 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:03:51 +0100 Subject: [PATCH 22/60] refactor: NUTS vectorization excludes Kyy from gradient block (phase 1) --- R/build_output.R | 10 +- src/mcmc/execution/chain_runner.cpp | 4 +- src/models/base_model.h | 31 ++++- src/models/mixed/mixed_mrf_model.cpp | 198 +++++++++++++++++++++------ src/models/mixed/mixed_mrf_model.h | 28 ++-- 5 files changed, 211 insertions(+), 60 deletions(-) diff --git a/R/build_output.R b/R/build_output.R index 095c7033..068908a2 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -325,7 +325,7 @@ build_output_bgm = function(spec, raw) { # ============================================================================== # # Handles the mixed discrete + continuous parameter layout: -# C++ flat vector: [mux | Kxx_ut | muy | Kyy_ut | Kxy] +# C++ flat vector: [mux | Kxx_ut | muy | Kxy | Kyy_ut] # C++ indicators: [Gxx_ut | Gyy_ut | Gxy] # # Splits into main (mux, muy, Kyy_diag) and pairwise (Kxx, Kyy_offdiag, Kxy), @@ -365,10 +365,10 @@ build_output_mixed_mrf = function(spec, raw) { kxx_end = nt + nxx muy_start = nt + nxx + 1L muy_end = nt + nxx + q - kyy_start = nt + nxx + q + 1L - kyy_end = nt + nxx + q + nyy_total - kxy_start = nt + nxx + q + nyy_total + 1L - kxy_end = nt + nxx + q + nyy_total + nxy + kxy_start = nt + nxx + q + 1L + kxy_end = nt + nxx + q + nxy + kyy_start = nt + nxx + q + nxy + 1L + kyy_end = nt + nxx + q + nxy + nyy_total # Kyy diagonal indices within the Kyy block kyy_diag_within = integer(q) diff --git a/src/mcmc/execution/chain_runner.cpp b/src/mcmc/execution/chain_runner.cpp index 8d4bdcfa..d3ee969d 100644 --- a/src/mcmc/execution/chain_runner.cpp +++ b/src/mcmc/execution/chain_runner.cpp @@ -91,7 +91,7 @@ void run_mcmc_chain( } } - chain_result.store_sample(sample_index, model.get_full_vectorized_parameters()); + chain_result.store_sample(sample_index, model.get_storage_vectorized_parameters()); if (chain_result.has_indicators) { chain_result.store_indicators(sample_index, model.get_vectorized_indicator_parameters()); @@ -145,7 +145,7 @@ std::vector run_mcmc_sampler( std::vector results(no_chains); for (int c = 0; c < no_chains; ++c) { - results[c].reserve(model.full_parameter_dimension(), config.no_iter); + results[c].reserve(model.storage_dimension(), config.no_iter); if (config.edge_selection) { size_t n_edges = model.get_vectorized_indicator_parameters().n_elem; diff --git a/src/models/base_model.h b/src/models/base_model.h index 145ffebc..92eb37c9 100644 --- a/src/models/base_model.h +++ b/src/models/base_model.h @@ -153,7 +153,11 @@ class BaseModel { /** * @return Full parameter dimension (fixed size, includes inactive parameters). * - * Used for fixed-size sample storage. Defaults to parameter_dimension(). + * Used by GradientSamplerBase for mass-matrix sizing and adaptation. + * For most models this equals the storage dimension. For models where + * some parameters are not sampled by NUTS (e.g., MixedMRFModel's Kyy), + * this returns the NUTS-block dimension. + * Defaults to parameter_dimension(). */ virtual size_t full_parameter_dimension() const { return parameter_dimension(); @@ -162,14 +166,35 @@ class BaseModel { /** * @return All parameters in a fixed-size vector (inactive edges are 0). * - * Used for sample storage to avoid dimension changes when edges are - * toggled on/off. + * Used by GradientSamplerBase for adaptation (online covariance). + * Dimension must match full_parameter_dimension(). */ virtual arma::vec get_full_vectorized_parameters() const = 0; /** @return Dimensionality of the active parameter space. Pure virtual. */ virtual size_t parameter_dimension() const = 0; + /** + * @return Dimension for sample storage (includes all parameters). + * + * For most models this equals full_parameter_dimension(). Override + * when storage needs more entries than the NUTS block (e.g., Kyy + * parameters in MixedMRFModel). + */ + virtual size_t storage_dimension() const { + return full_parameter_dimension(); + } + + /** + * @return All parameters in a fixed-size vector for sample storage. + * + * Dimension must match storage_dimension(). Default delegates to + * get_full_vectorized_parameters(). + */ + virtual arma::vec get_storage_vectorized_parameters() const { + return get_full_vectorized_parameters(); + } + // ========================================================================= // Infrastructure // ========================================================================= diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index b907a8d6..efd1470c 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -241,18 +241,21 @@ void MixedMRFModel::recompute_Theta() { // Parameter vectorization // ============================================================================= -// Vectorization order (free parameters): +// NUTS vectorization order (excludes Kyy — sampled by MH separately): // 1. mux_: per-variable (ordinal: C_s thresholds; BC: 2 coefficients) // 2. Kxx_: upper-triangular, row-major — p(p-1)/2 // 3. muy_: all q means -// 4. Kyy_: upper-triangle including diagonal — q(q+1)/2 -// 5. Kxy_: all p*q entries, row-major +// 4. Kxy_: all p*q entries, row-major +// +// Storage vectorization order (includes Kyy): +// 1–4. Same as NUTS order +// 5. Kyy_: upper-triangle including diagonal — q(q+1)/2 size_t MixedMRFModel::parameter_dimension() const { if(!edge_selection_active_) { return full_parameter_dimension(); } - // Count active parameters only + // Count active NUTS parameters only (no Kyy) size_t dim = num_main_ + q_; // mux + muy always active // Active Kxx edges @@ -262,14 +265,6 @@ size_t MixedMRFModel::parameter_dimension() const { } } - // Kyy diagonal always active; off-diagonal gated by edge indicators - dim += q_; // diagonal - for(size_t i = 0; i < q_ - 1; ++i) { - for(size_t j = i + 1; j < q_; ++j) { - if(gyy(i, j)) dim++; - } - } - // Active Kxy edges for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { @@ -281,13 +276,19 @@ size_t MixedMRFModel::parameter_dimension() const { } size_t MixedMRFModel::full_parameter_dimension() const { - // mux + Kxx upper-tri + muy + Kyy upper-tri-with-diag + Kxy full + // NUTS block: mux + Kxx upper-tri + muy + Kxy full (no Kyy) + return num_main_ + num_pairwise_xx_ + q_ + num_cross_; +} + +size_t MixedMRFModel::storage_dimension() const { + // All parameters including Kyy return num_main_ + num_pairwise_xx_ + q_ + (q_ * (q_ + 1)) / 2 + num_cross_; } arma::vec MixedMRFModel::get_vectorized_parameters() const { - arma::vec out(full_parameter_dimension(), arma::fill::zeros); + // Active NUTS parameters only (excludes Kyy, excludes inactive edges) + arma::vec out(parameter_dimension()); size_t idx = 0; // 1. mux_ @@ -297,15 +298,17 @@ arma::vec MixedMRFModel::get_vectorized_parameters() const { out(idx++) = mux_(s, c); } } else { - out(idx++) = mux_(s, 0); // linear α - out(idx++) = mux_(s, 1); // quadratic β + out(idx++) = mux_(s, 0); + out(idx++) = mux_(s, 1); } } - // 2. Kxx_ upper-triangular + // 2. Kxx_ upper-triangular (active edges only when selection is active) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { - out(idx++) = Kxx_(i, j); + if(!edge_selection_active_ || gxx(i, j) == 1) { + out(idx++) = Kxx_(i, j); + } } } @@ -314,14 +317,48 @@ arma::vec MixedMRFModel::get_vectorized_parameters() const { out(idx++) = muy_(j); } - // 4. Kyy_ upper-triangle including diagonal - for(size_t i = 0; i < q_; ++i) { - for(size_t j = i; j < q_; ++j) { - out(idx++) = Kyy_(i, j); + // 4. Kxy_ row-major (active edges only when selection is active) + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(!edge_selection_active_ || gxy(i, j) == 1) { + out(idx++) = Kxy_(i, j); + } } } - // 5. Kxy_ row-major + return out; +} + +arma::vec MixedMRFModel::get_full_vectorized_parameters() const { + // All NUTS parameters, fixed size (inactive edges are 0, no Kyy) + arma::vec out(full_parameter_dimension(), arma::fill::zeros); + size_t idx = 0; + + // 1. mux_ + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) { + out(idx++) = mux_(s, c); + } + } else { + out(idx++) = mux_(s, 0); + out(idx++) = mux_(s, 1); + } + } + + // 2. Kxx_ upper-triangular (all entries, zeros for inactive) + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + out(idx++) = Kxx_(i, j); + } + } + + // 3. muy_ + for(size_t j = 0; j < q_; ++j) { + out(idx++) = muy_(j); + } + + // 4. Kxy_ row-major (all entries, zeros for inactive) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { out(idx++) = Kxy_(i, j); @@ -331,11 +368,54 @@ arma::vec MixedMRFModel::get_vectorized_parameters() const { return out; } -arma::vec MixedMRFModel::get_full_vectorized_parameters() const { - return get_vectorized_parameters(); +arma::vec MixedMRFModel::get_storage_vectorized_parameters() const { + // All parameters including Kyy, fixed size + arma::vec out(storage_dimension(), arma::fill::zeros); + size_t idx = 0; + + // 1. mux_ + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) { + out(idx++) = mux_(s, c); + } + } else { + out(idx++) = mux_(s, 0); + out(idx++) = mux_(s, 1); + } + } + + // 2. Kxx_ upper-triangular + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + out(idx++) = Kxx_(i, j); + } + } + + // 3. muy_ + for(size_t j = 0; j < q_; ++j) { + out(idx++) = muy_(j); + } + + // 4. Kxy_ row-major + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + out(idx++) = Kxy_(i, j); + } + } + + // 5. Kyy_ upper-triangle including diagonal + for(size_t i = 0; i < q_; ++i) { + for(size_t j = i; j < q_; ++j) { + out(idx++) = Kyy_(i, j); + } + } + + return out; } void MixedMRFModel::set_vectorized_parameters(const arma::vec& params) { + // Unpack NUTS block only (no Kyy) size_t idx = 0; // 1. mux_ @@ -350,12 +430,14 @@ void MixedMRFModel::set_vectorized_parameters(const arma::vec& params) { } } - // 2. Kxx_ upper-triangular (mirror to lower) + // 2. Kxx_ upper-triangular (active edges only when selection is active) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { - Kxx_(i, j) = params(idx); - Kxx_(j, i) = params(idx); - idx++; + if(!edge_selection_active_ || gxx(i, j) == 1) { + Kxx_(i, j) = params(idx); + Kxx_(j, i) = params(idx); + idx++; + } } } @@ -364,30 +446,62 @@ void MixedMRFModel::set_vectorized_parameters(const arma::vec& params) { muy_(j) = params(idx++); } - // 4. Kyy_ upper-triangle including diagonal (mirror off-diag) - for(size_t i = 0; i < q_; ++i) { - for(size_t j = i; j < q_; ++j) { - Kyy_(i, j) = params(idx); - if(i != j) Kyy_(j, i) = params(idx); - idx++; - } - } - - // 5. Kxy_ row-major + // 4. Kxy_ row-major (active edges only when selection is active) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { - Kxy_(i, j) = params(idx++); + if(!edge_selection_active_ || gxy(i, j) == 1) { + Kxy_(i, j) = params(idx++); + } } } - // Refresh all caches - recompute_Kyy_decomposition(); + // Refresh caches (Kyy unchanged, so no Kyy decomposition update needed) recompute_conditional_mean(); if(use_marginal_pl_) { recompute_Theta(); } } +arma::vec MixedMRFModel::get_active_inv_mass() const { + if(!edge_selection_active_) { + return inv_mass_; + } + + arma::vec active(parameter_dimension()); + // Main effects: always active + active.head(num_main_) = inv_mass_.head(num_main_); + + size_t offset_full = num_main_; + size_t offset_active = num_main_; + + // Kxx active edges + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(gxx(i, j) == 1) { + active(offset_active++) = inv_mass_(offset_full); + } + offset_full++; + } + } + + // muy: always active + for(size_t j = 0; j < q_; ++j) { + active(offset_active++) = inv_mass_(offset_full++); + } + + // Kxy active edges + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(gxy(i, j) == 1) { + active(offset_active++) = inv_mass_(offset_full); + } + offset_full++; + } + } + + return active; +} + arma::ivec MixedMRFModel::get_vectorized_indicator_parameters() { size_t total = num_pairwise_xx_ + num_pairwise_yy_ + num_cross_; arma::ivec out(total); diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 9d8d62f9..b73ef916 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -74,8 +74,8 @@ class MixedMRFModel : public BaseModel { // Capability queries // ========================================================================= - /** @return false (MixedMRFModel is Metropolis-only, no gradient). */ - bool has_gradient() const override { return false; } + /** @return true (MixedMRFModel supports NUTS gradient for the unconstrained block). */ + bool has_gradient() const override { return true; } /** @return true (supports adaptive Metropolis via Robbins-Monro). */ bool has_adaptive_metropolis() const override { return true; } /** @return true when edge selection is enabled. */ @@ -134,29 +134,41 @@ class MixedMRFModel : public BaseModel { // ========================================================================= /** - * Dimensionality of the active parameter space. + * Dimensionality of the active NUTS parameter space (excludes Kyy). * When edge selection is active, excludes parameters for inactive edges. */ size_t parameter_dimension() const override; /** - * Full parameter dimension (all parameters, regardless of edge state). - * Used for fixed-size sample storage. + * Full NUTS-block dimension (all NUTS params, regardless of edge state). + * Excludes Kyy. Used for mass-matrix sizing and adaptation. */ size_t full_parameter_dimension() const override; - /** Get active parameters as a flat vector. */ + /** + * Storage dimension (all parameters including Kyy, regardless of edge state). + * Used for fixed-size sample storage. + */ + size_t storage_dimension() const override; + + /** Get active NUTS parameters as a flat vector (excludes Kyy). */ arma::vec get_vectorized_parameters() const override; - /** Get all parameters as a flat vector (inactive edges are 0). */ + /** Get all NUTS parameters (inactive edges are 0, excludes Kyy). */ arma::vec get_full_vectorized_parameters() const override; - /** Set parameters from a flat vector. */ + /** Get all parameters including Kyy for sample storage. */ + arma::vec get_storage_vectorized_parameters() const override; + + /** Set NUTS parameters from a flat vector (does not touch Kyy). */ void set_vectorized_parameters(const arma::vec& params) override; /** Get vectorized edge indicators (Gxx upper-tri, Gyy upper-tri, Gxy full). */ arma::ivec get_vectorized_indicator_parameters() override; + /** Get active subset of inverse mass diagonal (NUTS params only, excludes Kyy). */ + arma::vec get_active_inv_mass() const override; + // ========================================================================= // Infrastructure // ========================================================================= From dcae43e39a04a7f78bcb972d9dafb745151a22be Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:11:13 +0100 Subject: [PATCH 23/60] feat: logp_and_gradient for mixed MRF (conditional + marginal PL) (phase 2) --- src/models/mixed/mixed_mrf_gradient.cpp | 575 ++++++++++++++++++++++++ src/models/mixed/mixed_mrf_model.cpp | 3 + src/models/mixed/mixed_mrf_model.h | 45 ++ 3 files changed, 623 insertions(+) create mode 100644 src/models/mixed/mixed_mrf_gradient.cpp diff --git a/src/models/mixed/mixed_mrf_gradient.cpp b/src/models/mixed/mixed_mrf_gradient.cpp new file mode 100644 index 00000000..43b36400 --- /dev/null +++ b/src/models/mixed/mixed_mrf_gradient.cpp @@ -0,0 +1,575 @@ +#include +#include "models/mixed/mixed_mrf_model.h" +#include "utils/variable_helpers.h" +#include "math/explog_macros.h" + + +// ============================================================================= +// Gradient cache +// ============================================================================= +// The gradient cache stores precomputed index mappings and observed-statistic +// contributions that do not change during a leapfrog trajectory. It is +// invalidated whenever edge indicators change (same pattern as the OMRF). +// ============================================================================= + +void MixedMRFModel::ensure_gradient_cache() { + if(gradient_cache_valid_) return; + + // --- Build index matrix for Kxx upper-triangular entries --- + // Maps (i, j) to a position in the flat gradient vector (offset from + // the start of Kxx entries, which sits at num_main_). + kxx_index_cache_.set_size(p_, p_); + kxx_index_cache_.zeros(); + + int num_active_kxx = 0; + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(edge_indicators_(i, j) == 1) { + kxx_index_cache_(i, j) = num_main_ + num_active_kxx; + kxx_index_cache_(j, i) = kxx_index_cache_(i, j); + num_active_kxx++; + } + } + } + + // --- Build index matrix for Kxy entries --- + // Maps (i, j) to a position in the flat gradient vector (offset from + // the start of Kxy entries, which sits at num_main_ + active_kxx + q). + kxy_index_cache_.set_size(p_, q_); + kxy_index_cache_.zeros(); + + int kxy_offset = num_main_ + num_active_kxx + static_cast(q_); + int num_active_kxy = 0; + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(i, p_ + j) == 1) { + kxy_index_cache_(i, j) = kxy_offset + num_active_kxy; + num_active_kxy++; + } + } + } + + // muy offset in gradient vector + muy_grad_offset_ = num_main_ + num_active_kxx; + + // --- Precompute observed statistics portion of the gradient --- + size_t active_dim = num_main_ + num_active_kxx + q_ + num_active_kxy; + grad_obs_cache_.set_size(active_dim); + grad_obs_cache_.zeros(); + + // Observed statistics for discrete main effects (mux) + int offset = 0; + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + int C_s = num_categories_(s); + for(int c = 0; c < C_s; ++c) { + grad_obs_cache_(offset + c) = counts_per_category_(c + 1, s); + } + offset += C_s; + } else { + grad_obs_cache_(offset) = blume_capel_stats_(0, s); + grad_obs_cache_(offset + 1) = blume_capel_stats_(1, s); + offset += 2; + } + } + + // Observed statistics for Kxx edges + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(edge_indicators_(i, j) == 0) continue; + int loc = kxx_index_cache_(i, j); + // Factor 2 from the symmetric double-count in the pseudo-likelihood + grad_obs_cache_(loc) = 2.0 * arma::dot( + discrete_observations_dbl_.col(i), + discrete_observations_dbl_.col(j) + ); + } + } + + // No precomputed observed stats for muy or Kxy — those depend on + // continuous_observations_ combined with current parameters, so they + // are computed fresh each logp_and_gradient call. + + // Cache transpose of discrete observations for vectorized pairwise gradient + discrete_observations_dbl_t_ = discrete_observations_dbl_.t(); + + gradient_cache_valid_ = true; +} + + +void MixedMRFModel::invalidate_gradient_cache() { + gradient_cache_valid_ = false; +} + + +// ============================================================================= +// Unvectorize NUTS parameters into temporaries +// ============================================================================= +// Unpacks a NUTS-dimension parameter vector into temporary matrices without +// mutating model state. Used during leapfrog trajectory evaluation. +// ============================================================================= + +void MixedMRFModel::unvectorize_nuts_to_temps( + const arma::vec& params, + arma::mat& temp_mux, + arma::mat& temp_Kxx, + arma::vec& temp_muy, + arma::mat& temp_Kxy +) const { + size_t idx = 0; + + // 1. mux + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + for(int c = 0; c < num_categories_(s); ++c) { + temp_mux(s, c) = params(idx++); + } + } else { + temp_mux(s, 0) = params(idx++); + temp_mux(s, 1) = params(idx++); + } + } + + // 2. Kxx upper-triangular (active only) + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(edge_indicators_(i, j) == 1) { + temp_Kxx(i, j) = params(idx++); + temp_Kxx(j, i) = temp_Kxx(i, j); + } + } + } + + // 3. muy + for(size_t j = 0; j < q_; ++j) { + temp_muy(j) = params(idx++); + } + + // 4. Kxy row-major (active only) + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(i, p_ + j) == 1) { + temp_Kxy(i, j) = params(idx++); + } + } + } +} + + +// ============================================================================= +// gradient +// ============================================================================= + +arma::vec MixedMRFModel::gradient(const arma::vec& parameters) { + auto [logp, grad] = logp_and_gradient(parameters); + return grad; +} + + +// ============================================================================= +// logp_and_gradient — conditional pseudo-likelihood +// ============================================================================= +// Computes the log pseudo-posterior and its gradient with respect to the +// NUTS parameters (mux, Kxx, muy, Kxy). Kyy is treated as fixed. +// +// The pseudo-log-posterior is: +// l(theta) = sum_s log p(x_s | x_{-s}, y) [OMRF conditionals] +// + log p(y | x) [GGM conditional] +// + log pi(theta) [priors] +// +// For marginal PL, the OMRF conditionals use Theta = Kxx + 2 Kxy Σyy Kxy' +// instead of Kxx directly, and derive rest scores and denominator offsets +// from Theta. The GGM conditional is the same in both modes. +// ============================================================================= + +std::pair MixedMRFModel::logp_and_gradient( + const arma::vec& parameters) +{ + ensure_gradient_cache(); + + // --- Unvectorize into temporaries --- + arma::mat temp_mux = mux_; + arma::mat temp_Kxx = Kxx_; + arma::vec temp_muy = muy_; + arma::mat temp_Kxy = Kxy_; + unvectorize_nuts_to_temps(parameters, temp_mux, temp_Kxx, temp_muy, temp_Kxy); + + // --- Derived quantities --- + // Conditional mean: M_i = muy' + 2 x_i' Kxy Σyy (n x q) + arma::mat temp_cond_mean = arma::repmat(temp_muy.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * temp_Kxy * covariance_yy_; + + // Residual: D = Y - M (n x q) + arma::mat D = continuous_observations_ - temp_cond_mean; + + // Theta for marginal PL + arma::mat temp_Theta; + if(use_marginal_pl_) { + temp_Theta = temp_Kxx + 2.0 * temp_Kxy * covariance_yy_ * temp_Kxy.t(); + } + + // Start gradient from observed-statistics cache + arma::vec grad = grad_obs_cache_; + + double logp = 0.0; + + // ========================================================================= + // Part 1: OMRF conditionals + // ========================================================================= + + int mux_offset = 0; + for(size_t s = 0; s < p_; ++s) { + int C_s = num_categories_(s); + + // --- Rest score for variable s --- + arma::vec rest; + if(use_marginal_pl_) { + // Marginal: Theta-based rest + Kxy*muy bias + double theta_ss = temp_Theta(s, s); + rest = discrete_observations_dbl_ * temp_Theta.col(s) + - discrete_observations_dbl_.col(s) * theta_ss + + 2.0 * arma::dot(temp_Kxy.row(s), temp_muy); + } else { + // Conditional: Kxx-based rest + 2 Kxy y + rest = discrete_observations_dbl_ * temp_Kxx.col(s) + - discrete_observations_dbl_.col(s) * temp_Kxx(s, s) + + 2.0 * continuous_observations_ * temp_Kxy.row(s).t(); + } + + arma::vec bound = static_cast(C_s) * rest; + + if(is_ordinal_variable_(s)) { + arma::vec main_param = temp_mux.row(s).cols(0, C_s - 1).t(); + + // Marginal PL: absorb Theta_ss into main_param + if(use_marginal_pl_) { + double theta_ss = temp_Theta(s, s); + for(int c = 0; c < C_s; ++c) { + main_param(c) += static_cast((c + 1) * (c + 1)) * theta_ss; + } + } + + LogZAndProbs result = compute_logZ_and_probs_ordinal( + main_param, rest, bound, C_s + ); + + // log pseudo-posterior contribution + logp -= arma::accu(result.log_Z); + + // Main-effect gradient: ∂/∂mux_{s,c} = count_c - sum_i prob(c) + for(int c = 0; c < C_s; ++c) { + grad(mux_offset + c) -= arma::accu(result.probs.col(c + 1)); + } + + // Expected value E_s[c+1|rest] per observation + arma::vec weights = arma::regspace(1, C_s); + arma::vec E = result.probs.cols(1, C_s) * weights; + + // Kxx pairwise gradient: sum_i x_{i,t} * (x_{i,s}+1 - E_s) + // (uses pre-transposed discrete observations for BLAS efficiency) + arma::vec pw_grad = discrete_observations_dbl_t_ * E; + for(size_t t = 0; t < p_; ++t) { + if(edge_indicators_(s, t) == 0 || s == t) continue; + int loc = (s < t) ? kxx_index_cache_(s, t) : kxx_index_cache_(t, s); + grad(loc) -= pw_grad(t); + } + + if(use_marginal_pl_) { + // Additional Kxx gradient from Theta_ss in denominator: + // ∂/∂Kxx_{st} through Theta_ss: zero (∂Theta_ss/∂Kxx_st = δ_{st}) + // So Kxx gradient from Theta rest scores is already handled above. + + // Kxy gradient from marginal OMRF (through Theta): + // E_s[c^2] per observation + arma::vec weights_sq = arma::square(weights); + arma::vec E_sq = result.probs.cols(1, C_s) * weights_sq; + + // Through Theta rest scores: for each (s, t!=s): + // ∂Theta_{st}/∂Kxy_{a,j} = 2 Σyy_{j,:} Kxy_{t,:}' δ_{as} + // + 2 Kxy_{s,:} Σyy_{:,j} δ_{at} -- but a=s here + // The contribution is: sum_i x_{it} * (x_{is}+1 - E_s) + // times ∂Theta_{st}/∂Kxy_{s,j} = 2 [Σyy Kxy_t']_j + // Summed over t!=s: this equals 2 * sum_t!=s pw_grad(t) * [Σyy Kxy_t'] + // Plus the diagonal term: Theta_ss gives + // ∂/∂Kxy_{s,j} of Theta_ss = 4 [Σyy Kxy_s']_j + // contribution: -sum_i E_sq * 4 [Σyy Kxy_s']_j + // Actually let's use the vector form: + + // Off-diagonal Theta contribution to Kxy_s gradient: + // For variable s, the rest score R_s uses Theta_{st} for t!=s + // ∂R_{is}/∂Kxy_{s,j} = sum_{t!=s} x_{it} ∂Theta_{st}/∂Kxy_{s,j} + // = 2 sum_{t!=s} x_{it} [Σyy Kxy_t']_j + // = 2 [X_{-s} Kxy_{-s} Σyy]_{i,j} + // Gradient = sum_i (x_{is}+1 - E_s(i)) * ∂R_{is}/∂Kxy_{s,j} + // = sum_i (obs_s - E_s) * 2 [X_{-s} Kxy_{-s} Σyy]_{i,j} + // But X_{-s} means "all columns except s" — complex indexing. + // + // Simpler: ∂/∂Kxy_{s,:} of the Theta-based omrf for variable s: + // ∂Θ_{st}/∂Kxy_{s,:} = 2 Σyy Kxy_t' for each t (including t=s) + // Full rest-score chain rule: + // ∂l_s/∂Kxy_{s,:} = sum_{t!=s} (obs_stat_{st} - exp_stat_{st}) + // * 2 Σyy Kxy_t' + // + (obs_sq_s - exp_sq_s) * 2 Σyy Kxy_s' + // where obs_stat_{st} = sum_i x_{it} x_{is} + // exp_stat_{st} = sum_i x_{it} E_s + // obs_sq_s = sum_i x_{is}^2 + // exp_sq_s = sum_i E_sq + + // obs_minus_E for the pairwise statistics: already pw_grad = X' E + // obs_stat_{st} = sum_i x_{it}*x_{is} (cached in grad_obs for Kxx edges) + // So: obs - exp for the pairwise is exactly pw_grad subtracted from obs. + // But we already computed that as a vector over all t. + + // Vector form for Kxy_s gradient from Theta: + // diff_t = X'(x_s - E) (p-vector, where element t = sum_i x_it(x_is - E_s)) + arma::vec diff_pw = discrete_observations_dbl_t_ * + (discrete_observations_dbl_.col(s) - E); + diff_pw(s) = 0.0; // exclude self-interaction from rest score + + // diff_diag = sum_i (x_is^2 - E_sq) + double diff_diag = arma::dot( + discrete_observations_dbl_.col(s), + discrete_observations_dbl_.col(s)) - arma::accu(E_sq); + + // ∂l_s/∂Kxy_{s,:} from Theta = 2 (sum_{t!=s} diff_pw(t) * Kxy_t + diff_diag * Kxy_s) Σyy + arma::rowvec kxy_contrib = 2.0 * (diff_pw.t() * temp_Kxy + diff_diag * temp_Kxy.row(s)) * covariance_yy_; + + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(s, p_ + j) == 0) continue; + int loc = kxy_index_cache_(s, j); + grad(loc) += kxy_contrib(j); + } + + // muy gradient from marginal OMRF: + // ∂l_s/∂muy_j = 2 Kxy_{sj} * sum_i (x_{is} - E_s) + double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); + for(size_t j = 0; j < q_; ++j) { + grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; + } + } else { + // Conditional PL: Kxy gradient from OMRF rest score + // ∂/∂Kxy_{s,j} = 2 sum_i y_{ij} (x_{is}+1 - E_s) + arma::rowvec kxy_grad_s = 2.0 * ( + discrete_observations_dbl_.col(s) - E + ).t() * continuous_observations_; + + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(s, p_ + j) == 0) continue; + int loc = kxy_index_cache_(s, j); + grad(loc) += kxy_grad_s(j); + } + } + + mux_offset += C_s; + } else { + // --- Blume-Capel variable --- + int ref = baseline_category_(s); + double lin_eff = temp_mux(s, 0); + double quad_eff = temp_mux(s, 1); + + // Marginal PL: absorb Theta_ss into quadratic effect + double effective_quad = quad_eff; + if(use_marginal_pl_) { + effective_quad += temp_Theta(s, s); + } + + LogZAndProbs result = compute_logZ_and_probs_blume_capel( + rest, lin_eff, effective_quad, ref, C_s, bound + ); + + logp -= arma::accu(result.log_Z); + + arma::vec score = arma::regspace(0, C_s) - static_cast(ref); + arma::vec sq_score = arma::square(score); + + // Main-effect gradient + grad(mux_offset) -= arma::accu(result.probs * score); + grad(mux_offset + 1) -= arma::accu(result.probs * sq_score); + + // Expected score per person + arma::vec E = result.probs * score; + + // Kxx pairwise gradient + arma::vec pw_grad = discrete_observations_dbl_t_ * E; + for(size_t t = 0; t < p_; ++t) { + if(edge_indicators_(s, t) == 0 || s == t) continue; + int loc = (s < t) ? kxx_index_cache_(s, t) : kxx_index_cache_(t, s); + grad(loc) -= pw_grad(t); + } + + if(use_marginal_pl_) { + // Kxy gradient from marginal OMRF (same structure as ordinal) + arma::vec E_sq = result.probs * sq_score; + + arma::vec diff_pw = discrete_observations_dbl_t_ * + (discrete_observations_dbl_.col(s) - E); + diff_pw(s) = 0.0; + + double diff_diag = arma::dot( + discrete_observations_dbl_.col(s), + discrete_observations_dbl_.col(s)) - arma::accu(E_sq); + + arma::rowvec kxy_contrib = 2.0 * (diff_pw.t() * temp_Kxy + diff_diag * temp_Kxy.row(s)) * covariance_yy_; + + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(s, p_ + j) == 0) continue; + int loc = kxy_index_cache_(s, j); + grad(loc) += kxy_contrib(j); + } + + // muy gradient from marginal OMRF + double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); + for(size_t j = 0; j < q_; ++j) { + grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; + } + } else { + // Conditional PL: Kxy gradient from OMRF rest score + arma::rowvec kxy_grad_s = 2.0 * ( + discrete_observations_dbl_.col(s) - E + ).t() * continuous_observations_; + + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(s, p_ + j) == 0) continue; + int loc = kxy_index_cache_(s, j); + grad(loc) += kxy_grad_s(j); + } + } + + mux_offset += 2; + } + } + + // Add numerator contribution to logp from discrete sufficient statistics + // (already in grad_obs_cache_ as counts, but logp needs the actual dot-products) + mux_offset = 0; + for(size_t s = 0; s < p_; ++s) { + int C_s = num_categories_(s); + arma::vec rest; + if(use_marginal_pl_) { + double theta_ss = temp_Theta(s, s); + rest = discrete_observations_dbl_ * temp_Theta.col(s) + - discrete_observations_dbl_.col(s) * theta_ss + + 2.0 * arma::dot(temp_Kxy.row(s), temp_muy); + // Theta_ss quadratic contribution + logp += temp_Theta(s, s) * arma::dot( + discrete_observations_dbl_.col(s), + discrete_observations_dbl_.col(s)); + } else { + rest = discrete_observations_dbl_ * temp_Kxx.col(s) + - discrete_observations_dbl_.col(s) * temp_Kxx(s, s) + + 2.0 * continuous_observations_ * temp_Kxy.row(s).t(); + } + // Numerator: dot(x_s, rest) + main-effect sums + logp += arma::dot(discrete_observations_dbl_.col(s), rest); + + if(is_ordinal_variable_(s)) { + for(int c = 1; c <= C_s; ++c) { + logp += static_cast(counts_per_category_(c, s)) * temp_mux(s, c - 1); + } + } else { + logp += temp_mux(s, 0) * static_cast(blume_capel_stats_(0, s)) + + temp_mux(s, 1) * static_cast(blume_capel_stats_(1, s)); + } + } + + // ========================================================================= + // Part 2: GGM conditional log-likelihood and gradients + // ========================================================================= + // log p(y | x) = n/2 * (log|Kyy| - q log(2pi)) - 1/2 trace(Kyy D'D) + // where D = Y - M, M_i = muy' + 2 x_i' Kxy Σyy + // + // Kyy is fixed, so log|Kyy| contributes to logp but not gradient. + + double quad_sum = arma::accu((D * Kyy_) % D); + logp += static_cast(n_) / 2.0 * + (-static_cast(q_) * std::log(2.0 * arma::datum::pi) + + Kyy_log_det_) + - quad_sum / 2.0; + + // ∂/∂muy: Kyy * D' * 1_n = Kyy * sum_over_rows(D) + arma::vec D_colsums = arma::sum(D, 0).t(); // q-vector + arma::vec grad_muy_ggm = Kyy_ * D_colsums; + + for(size_t j = 0; j < q_; ++j) { + grad(muy_grad_offset_ + j) += grad_muy_ggm(j); + } + + // ∂/∂Kxy: The GGM conditional depends on Kxy through M. + // ∂M/∂Kxy_{s,j} = 2 x_s [Σyy]_{j,:} + // ∂logp_ggm/∂Kxy = 2 X' D (shortcut: Kyy Σyy = I eliminates Kyy) + // + // Correctly: ∂(−½ trace(Kyy D'D))/∂Kxy_{s,j} + // = trace(Kyy D' ∂M/∂Kxy_{s,j}) + // = trace(Kyy D' * 2 x_s [Σyy]_{j,:}) + // = 2 [x_s' D Kyy Σyy]_j + // = 2 [x_s' D]_j (since Kyy Σyy = I) + arma::mat grad_Kxy_ggm = 2.0 * discrete_observations_dbl_t_ * D; // p x q + + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(i, p_ + j) == 0) continue; + int loc = kxy_index_cache_(i, j); + grad(loc) += grad_Kxy_ggm(i, j); + } + } + + // ========================================================================= + // Part 3: Prior log-densities and gradient contributions + // ========================================================================= + + // --- mux priors: Beta(alpha, beta) on sigmoid scale --- + mux_offset = 0; + for(size_t s = 0; s < p_; ++s) { + if(is_ordinal_variable_(s)) { + int C_s = num_categories_(s); + for(int c = 0; c < C_s; ++c) { + double val = temp_mux(s, c); + logp += val * main_alpha_ - + std::log1p(MY_EXP(val)) * (main_alpha_ + main_beta_); + double p = 1.0 / (1.0 + MY_EXP(-val)); + grad(mux_offset + c) += main_alpha_ - (main_alpha_ + main_beta_) * p; + } + mux_offset += C_s; + } else { + for(int k = 0; k < 2; ++k) { + double val = temp_mux(s, k); + logp += val * main_alpha_ - + std::log1p(MY_EXP(val)) * (main_alpha_ + main_beta_); + double p = 1.0 / (1.0 + MY_EXP(-val)); + grad(mux_offset + k) += main_alpha_ - (main_alpha_ + main_beta_) * p; + } + mux_offset += 2; + } + } + + // --- Kxx priors: Cauchy(0, pairwise_scale_) --- + for(size_t i = 0; i < p_ - 1; ++i) { + for(size_t j = i + 1; j < p_; ++j) { + if(edge_indicators_(i, j) == 0) continue; + int loc = kxx_index_cache_(i, j); + double val = temp_Kxx(i, j); + logp += R::dcauchy(val, 0.0, pairwise_scale_, true); + grad(loc) -= 2.0 * val / (val * val + pairwise_scale_ * pairwise_scale_); + } + } + + // --- muy priors: Normal(0, 1) --- + for(size_t j = 0; j < q_; ++j) { + double val = temp_muy(j); + logp += R::dnorm(val, 0.0, 1.0, true); + grad(muy_grad_offset_ + j) -= val; // ∂/∂muy: -muy (from -muy^2/2) + } + + // --- Kxy priors: Cauchy(0, pairwise_scale_) --- + for(size_t i = 0; i < p_; ++i) { + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(i, p_ + j) == 0) continue; + int loc = kxy_index_cache_(i, j); + double val = temp_Kxy(i, j); + logp += R::dcauchy(val, 0.0, pairwise_scale_, true); + grad(loc) -= 2.0 * val / (val * val + pairwise_scale_ * pairwise_scale_); + } + } + + return {logp, grad}; +} diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index efd1470c..0a58c959 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -160,6 +160,7 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) kyy_vf2_(other.kyy_vf2_), kyy_u1_(other.kyy_u1_), kyy_u2_(other.kyy_u2_), + gradient_cache_valid_(false), use_marginal_pl_(other.use_marginal_pl_), rng_(other.rng_), edge_order_xx_(other.edge_order_xx_), @@ -594,6 +595,8 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { void MixedMRFModel::update_edge_indicators() { if(!edge_selection_active_) return; + invalidate_gradient_cache(); + // Discrete-discrete edges (shuffled order) for(size_t e = 0; e < num_pairwise_xx_; ++e) { size_t idx = edge_order_xx_(e); diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index b73ef916..618a9374 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -87,6 +87,21 @@ class MixedMRFModel : public BaseModel { // Core sampling methods // ========================================================================= + /** + * Compute gradient of the log pseudo-posterior (NUTS block only). + * @param parameters NUTS-dimension parameter vector + * @return Gradient vector (same size as parameters) + */ + arma::vec gradient(const arma::vec& parameters) override; + + /** + * Combined log pseudo-posterior and gradient evaluation. + * @param parameters NUTS-dimension parameter vector + * @return Pair of (log-pseudo-posterior, gradient) + */ + std::pair logp_and_gradient( + const arma::vec& parameters) override; + /** * Perform one full Metropolis sweep over all parameter groups. * @param iteration Current iteration (for Robbins-Monro adaptation) @@ -308,6 +323,17 @@ class MixedMRFModel : public BaseModel { arma::vec kyy_u1_; ///< q-vector workspace arma::vec kyy_u2_; ///< q-vector workspace + // ========================================================================= + // Gradient cache (populated by ensure_gradient_cache) + // ========================================================================= + + arma::mat discrete_observations_dbl_t_; ///< p x n transpose (BLAS gradient) + arma::vec grad_obs_cache_; ///< Cached observed-data gradient component + arma::imat kxx_index_cache_; ///< p x p map from (i,j) to gradient index + arma::imat kxy_index_cache_; ///< p x q map from (i,j) to gradient index + int muy_grad_offset_ = 0; ///< Offset of muy block in gradient vector + bool gradient_cache_valid_ = false; ///< Whether gradient cache is current + // ========================================================================= // Configuration // ========================================================================= @@ -342,6 +368,25 @@ class MixedMRFModel : public BaseModel { /** Recompute Theta_ from Kxx_, Kxy_, covariance_yy_ (marginal PL only). */ void recompute_Theta(); + // ========================================================================= + // Gradient helpers (implemented in mixed_mrf_gradient.cpp) + // ========================================================================= + + /** Rebuild gradient index maps after edge-indicator changes. */ + void ensure_gradient_cache(); + + /** Mark gradient cache as stale (call after edge-indicator changes). */ + void invalidate_gradient_cache(); + + /** Unpack NUTS-vector into temporary parameter matrices (no model mutation). */ + void unvectorize_nuts_to_temps( + const arma::vec& params, + arma::mat& temp_mux, + arma::mat& temp_Kxx, + arma::vec& temp_muy, + arma::mat& temp_Kxy + ) const; + // ========================================================================= // Likelihood functions (implemented in mixed_mrf_likelihoods.cpp) // ========================================================================= From 5a85fb1f19ae2bf93f7a139412686fd3ddd94d07 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:13:24 +0100 Subject: [PATCH 24/60] feat: extract do_kyy_metropolis_step for hybrid NUTS+MH (phase 3) --- src/models/mixed/mixed_mrf_model.cpp | 13 +++++++++++++ src/models/mixed/mixed_mrf_model.h | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 0a58c959..4fe7a9d4 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -592,6 +592,19 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { // (Matches the OMRF pattern; avoids double-counting indicator proposals.) } +void MixedMRFModel::do_kyy_metropolis_step(int iteration) { + // Off-diagonal Kyy (edge-gated) + if(q_ >= 2) { + for(size_t i = 0; i < q_ - 1; ++i) + for(size_t j = i + 1; j < q_; ++j) + if(!edge_selection_active_ || gyy(i, j) == 1) + update_Kyy_offdiag(i, j, iteration); + } + // Diagonal Kyy (always updated) + for(size_t i = 0; i < q_; ++i) + update_Kyy_diag(i, iteration); +} + void MixedMRFModel::update_edge_indicators() { if(!edge_selection_active_) return; diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 618a9374..be9d0ea5 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -108,6 +108,12 @@ class MixedMRFModel : public BaseModel { */ void do_one_metropolis_step(int iteration = -1) override; + /** + * Update only Kyy parameters via Metropolis (used by hybrid NUTS+MH). + * @param iteration Current iteration (for Robbins-Monro adaptation) + */ + void do_kyy_metropolis_step(int iteration = -1); + /** * Initialize Metropolis adaptation controllers for proposal-SD tuning. * Called before warmup begins. From 2203f7a8b5665ee9843d35075f321ebf0e1366d0 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:42:01 +0100 Subject: [PATCH 25/60] fix: correct 3 marginal PL gradient bugs in mixed MRF - Diagonal factor: use 4 (not 2) for dTheta_ss/dKxy_sj - Missing bias term: add 2*mu_yj * sum(x_s - E_s) contribution - Missing cross-contributions: variable s's conditional contributes to Kxy_t gradient for t != s - Add test_gradient.cpp (Rcpp export) and numerical gradient test script confirming all 4 test cases pass (max error ~1.5e-7) --- dev/tests/test-numerical-gradient.R | 153 ++++++++++++++++++++++++ src/models/mixed/mixed_mrf_gradient.cpp | 100 ++++++++-------- src/test_gradient.cpp | 57 +++++++++ 3 files changed, 262 insertions(+), 48 deletions(-) create mode 100644 dev/tests/test-numerical-gradient.R create mode 100644 src/test_gradient.cpp diff --git a/dev/tests/test-numerical-gradient.R b/dev/tests/test-numerical-gradient.R new file mode 100644 index 00000000..a81f0f12 --- /dev/null +++ b/dev/tests/test-numerical-gradient.R @@ -0,0 +1,153 @@ +# dev/tests/test-numerical-gradient.R +# +# Numerical gradient check for MixedMRFModel::logp_and_gradient(). +# Compares the analytical gradient against central finite differences. +# Tests both conditional and marginal pseudo-likelihood modes. + +library(bgms) +library(testthat) + +# --- Helper: central finite differences -------------------------------------- +numerical_gradient = function(f, theta, eps = 1e-5) { + grad = numeric(length(theta)) + for(i in seq_along(theta)) { + theta_plus = theta + theta_minus = theta + theta_plus[i] = theta[i] + eps + theta_minus[i] = theta[i] - eps + grad[i] = (f(theta_plus) - f(theta_minus)) / (2 * eps) + } + grad +} + +# --- Small test problem ------------------------------------------------------- +set.seed(42) +n = 100 +p = 2 # discrete variables, ordinal with 3 categories each +q = 2 # continuous variables + +# Simulate discrete data (values 0, 1, 2) +x_discrete = matrix(sample(0:2, n * p, replace = TRUE), nrow = n, ncol = p) +storage.mode(x_discrete) = "integer" + +# Simulate continuous data +x_continuous = matrix(rnorm(n * q), nrow = n, ncol = q) + +num_categories = as.integer(rep(3L, p)) +is_ordinal = as.integer(rep(1L, p)) +baseline_category = as.integer(rep(0L, p)) + +# NUTS vector dimension: mux (2*3=6) + Kxx_ut (1) + muy (2) + Kxy (2*2=4) = 13 +nuts_dim = sum(num_categories) + p * (p - 1) / 2 + q + p * q + +make_input = function(pl) { + list( + discrete_observations = x_discrete, + continuous_observations = x_continuous, + num_categories = num_categories, + is_ordinal_variable = is_ordinal, + baseline_category = baseline_category, + main_alpha = 1.0, + main_beta = 1.0, + pairwise_scale = 2.5, + pseudolikelihood = pl + ) +} + +# Start near zero with small random perturbations +theta0 = rnorm(nuts_dim, sd = 0.1) + +# --- Test conditional PL ------------------------------------------------------ +cat("Testing conditional pseudo-likelihood gradient...\n") +inp_cond = make_input("conditional") + +logp_fn_cond = function(th) { + bgms:::test_mixed_gradient(inp_cond, th)$logp +} + +result_cond = bgms:::test_mixed_gradient(inp_cond, theta0) +grad_analytical = result_cond$gradient +grad_numerical = numerical_gradient(logp_fn_cond, theta0) + +cat(" Max absolute difference:", max(abs(grad_analytical - grad_numerical)), "\n") +cat(" Max relative difference:", + max(abs(grad_analytical - grad_numerical) / + pmax(abs(grad_analytical), abs(grad_numerical), 1e-8)), "\n") + +test_that("conditional PL gradient matches finite differences", { + expect_equal(grad_analytical, grad_numerical, tolerance = 1e-4) +}) + +# --- Test marginal PL -------------------------------------------------------- +cat("Testing marginal pseudo-likelihood gradient...\n") +inp_marg = make_input("marginal") + +logp_fn_marg = function(th) { + bgms:::test_mixed_gradient(inp_marg, th)$logp +} + +result_marg = bgms:::test_mixed_gradient(inp_marg, theta0) +grad_analytical_m = result_marg$gradient +grad_numerical_m = numerical_gradient(logp_fn_marg, theta0) + +cat(" Max absolute difference:", max(abs(grad_analytical_m - grad_numerical_m)), "\n") +cat(" Max relative difference:", + max(abs(grad_analytical_m - grad_numerical_m) / + pmax(abs(grad_analytical_m), abs(grad_numerical_m), 1e-8)), "\n") + +test_that("marginal PL gradient matches finite differences", { + expect_equal(grad_analytical_m, grad_numerical_m, tolerance = 1e-4) +}) + +# --- Test with Blume-Capel variable ------------------------------------------- +cat("Testing with Blume-Capel variable...\n") +is_ordinal_bc = as.integer(c(1L, 0L)) # first ordinal, second Blume-Capel +# Blume-Capel has 2 main-effects (location + dispersion) +# NUTS dim: mux (3 + 2) + Kxx_ut (1) + muy (2) + Kxy (2*2=4) = 12 +nuts_dim_bc = 3 + 2 + 1 + 2 + 4 + +inp_bc = make_input("conditional") +inp_bc$is_ordinal_variable = is_ordinal_bc + +theta0_bc = rnorm(nuts_dim_bc, sd = 0.1) + +logp_fn_bc = function(th) { + bgms:::test_mixed_gradient(inp_bc, th)$logp +} + +result_bc = bgms:::test_mixed_gradient(inp_bc, theta0_bc) +grad_analytical_bc = result_bc$gradient +grad_numerical_bc = numerical_gradient(logp_fn_bc, theta0_bc) + +cat(" Max absolute difference:", max(abs(grad_analytical_bc - grad_numerical_bc)), "\n") +cat(" Max relative difference:", + max(abs(grad_analytical_bc - grad_numerical_bc) / + pmax(abs(grad_analytical_bc), abs(grad_numerical_bc), 1e-8)), "\n") + +test_that("conditional PL gradient with Blume-Capel matches finite differences", { + expect_equal(grad_analytical_bc, grad_numerical_bc, tolerance = 1e-4) +}) + +# --- Test marginal PL with Blume-Capel ---------------------------------------- +cat("Testing marginal PL with Blume-Capel variable...\n") +inp_bc_marg = make_input("marginal") +inp_bc_marg$is_ordinal_variable = is_ordinal_bc + +logp_fn_bc_marg = function(th) { + bgms:::test_mixed_gradient(inp_bc_marg, th)$logp +} + +result_bc_marg = bgms:::test_mixed_gradient(inp_bc_marg, theta0_bc) +grad_analytical_bc_m = result_bc_marg$gradient +grad_numerical_bc_m = numerical_gradient(logp_fn_bc_marg, theta0_bc) + +cat(" Max absolute difference:", max(abs(grad_analytical_bc_m - grad_numerical_bc_m)), "\n") +cat(" Max relative difference:", + max(abs(grad_analytical_bc_m - grad_numerical_bc_m) / + pmax(abs(grad_analytical_bc_m), abs(grad_numerical_bc_m), 1e-8)), "\n") + +test_that("marginal PL gradient with Blume-Capel matches finite differences", { + expect_equal(grad_analytical_bc_m, grad_numerical_bc_m, tolerance = 1e-4) +}) + +cat("\nAll gradient checks passed!\n") diff --git a/src/models/mixed/mixed_mrf_gradient.cpp b/src/models/mixed/mixed_mrf_gradient.cpp index 43b36400..a11a7cf8 100644 --- a/src/models/mixed/mixed_mrf_gradient.cpp +++ b/src/models/mixed/mixed_mrf_gradient.cpp @@ -213,6 +213,12 @@ std::pair MixedMRFModel::logp_and_gradient( double logp = 0.0; + // For marginal PL: precompute Kxy Σyy (used in cross-contributions) + arma::mat KxySyy; // p x q + if(use_marginal_pl_) { + KxySyy = temp_Kxy * covariance_yy_; + } + // ========================================================================= // Part 1: OMRF conditionals // ========================================================================= @@ -280,69 +286,52 @@ std::pair MixedMRFModel::logp_and_gradient( // So Kxx gradient from Theta rest scores is already handled above. // Kxy gradient from marginal OMRF (through Theta): - // E_s[c^2] per observation + // ∂Theta_{st}/∂Kxy_{a,j} has two terms: + // = 2 [Σyy Kxy_t']_j δ_{as} + 2 [Kxy_s Σyy]_j δ_{at} + // Self-contribution (a=s): from rest_s → Kxy_s + // Cross-contribution (a=t): from rest_s → Kxy_t for each t≠s + arma::vec weights_sq = arma::square(weights); arma::vec E_sq = result.probs.cols(1, C_s) * weights_sq; - // Through Theta rest scores: for each (s, t!=s): - // ∂Theta_{st}/∂Kxy_{a,j} = 2 Σyy_{j,:} Kxy_{t,:}' δ_{as} - // + 2 Kxy_{s,:} Σyy_{:,j} δ_{at} -- but a=s here - // The contribution is: sum_i x_{it} * (x_{is}+1 - E_s) - // times ∂Theta_{st}/∂Kxy_{s,j} = 2 [Σyy Kxy_t']_j - // Summed over t!=s: this equals 2 * sum_t!=s pw_grad(t) * [Σyy Kxy_t'] - // Plus the diagonal term: Theta_ss gives - // ∂/∂Kxy_{s,j} of Theta_ss = 4 [Σyy Kxy_s']_j - // contribution: -sum_i E_sq * 4 [Σyy Kxy_s']_j - // Actually let's use the vector form: - - // Off-diagonal Theta contribution to Kxy_s gradient: - // For variable s, the rest score R_s uses Theta_{st} for t!=s - // ∂R_{is}/∂Kxy_{s,j} = sum_{t!=s} x_{it} ∂Theta_{st}/∂Kxy_{s,j} - // = 2 sum_{t!=s} x_{it} [Σyy Kxy_t']_j - // = 2 [X_{-s} Kxy_{-s} Σyy]_{i,j} - // Gradient = sum_i (x_{is}+1 - E_s(i)) * ∂R_{is}/∂Kxy_{s,j} - // = sum_i (obs_s - E_s) * 2 [X_{-s} Kxy_{-s} Σyy]_{i,j} - // But X_{-s} means "all columns except s" — complex indexing. - // - // Simpler: ∂/∂Kxy_{s,:} of the Theta-based omrf for variable s: - // ∂Θ_{st}/∂Kxy_{s,:} = 2 Σyy Kxy_t' for each t (including t=s) - // Full rest-score chain rule: - // ∂l_s/∂Kxy_{s,:} = sum_{t!=s} (obs_stat_{st} - exp_stat_{st}) - // * 2 Σyy Kxy_t' - // + (obs_sq_s - exp_sq_s) * 2 Σyy Kxy_s' - // where obs_stat_{st} = sum_i x_{it} x_{is} - // exp_stat_{st} = sum_i x_{it} E_s - // obs_sq_s = sum_i x_{is}^2 - // exp_sq_s = sum_i E_sq - - // obs_minus_E for the pairwise statistics: already pw_grad = X' E - // obs_stat_{st} = sum_i x_{it}*x_{is} (cached in grad_obs for Kxx edges) - // So: obs - exp for the pairwise is exactly pw_grad subtracted from obs. - // But we already computed that as a vector over all t. - - // Vector form for Kxy_s gradient from Theta: - // diff_t = X'(x_s - E) (p-vector, where element t = sum_i x_it(x_is - E_s)) arma::vec diff_pw = discrete_observations_dbl_t_ * (discrete_observations_dbl_.col(s) - E); - diff_pw(s) = 0.0; // exclude self-interaction from rest score + diff_pw(s) = 0.0; - // diff_diag = sum_i (x_is^2 - E_sq) double diff_diag = arma::dot( discrete_observations_dbl_.col(s), discrete_observations_dbl_.col(s)) - arma::accu(E_sq); - // ∂l_s/∂Kxy_{s,:} from Theta = 2 (sum_{t!=s} diff_pw(t) * Kxy_t + diff_diag * Kxy_s) Σyy - arma::rowvec kxy_contrib = 2.0 * (diff_pw.t() * temp_Kxy + diff_diag * temp_Kxy.row(s)) * covariance_yy_; + double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); + + // Self-contribution: a = s + // Off-diagonal Theta: ∂Θ_{st}/∂Kxy_{s,j} = 2 [Σyy Kxy_t']_j + // Diagonal Theta: ∂Θ_{ss}/∂Kxy_{s,j} = 4 [Σyy Kxy_s']_j + // Rest-score bias: ∂(2 Kxy_s μy)/∂Kxy_{s,j} = 2 μy_j + arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_Kxy) * covariance_yy_ + + 4.0 * diff_diag * KxySyy.row(s) + + 2.0 * sum_obs_minus_E * temp_muy.t(); for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(s, p_ + j) == 0) continue; int loc = kxy_index_cache_(s, j); - grad(loc) += kxy_contrib(j); + grad(loc) += kxy_self(j); + } + + // Cross-contribution: a = t, for each t ≠ s + // ∂l_s/∂Kxy_{t,:} = diff_pw(t) * 2 * Kxy_s * Σyy + arma::rowvec V_s = 2.0 * KxySyy.row(s); // 2 * Kxy_s * Σyy + for(size_t t = 0; t < p_; ++t) { + if(t == s || std::abs(diff_pw(t)) < 1e-300) continue; + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(t, p_ + j) == 0) continue; + int loc = kxy_index_cache_(t, j); + grad(loc) += diff_pw(t) * V_s(j); + } } // muy gradient from marginal OMRF: // ∂l_s/∂muy_j = 2 Kxy_{sj} * sum_i (x_{is} - E_s) - double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); for(size_t j = 0; j < q_; ++j) { grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; } @@ -409,16 +398,31 @@ std::pair MixedMRFModel::logp_and_gradient( discrete_observations_dbl_.col(s), discrete_observations_dbl_.col(s)) - arma::accu(E_sq); - arma::rowvec kxy_contrib = 2.0 * (diff_pw.t() * temp_Kxy + diff_diag * temp_Kxy.row(s)) * covariance_yy_; + double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); + + // Self-contribution: a = s + arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_Kxy) * covariance_yy_ + + 4.0 * diff_diag * KxySyy.row(s) + + 2.0 * sum_obs_minus_E * temp_muy.t(); for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(s, p_ + j) == 0) continue; int loc = kxy_index_cache_(s, j); - grad(loc) += kxy_contrib(j); + grad(loc) += kxy_self(j); + } + + // Cross-contribution: a = t, for each t ≠ s + arma::rowvec V_s = 2.0 * KxySyy.row(s); + for(size_t t = 0; t < p_; ++t) { + if(t == s || std::abs(diff_pw(t)) < 1e-300) continue; + for(size_t j = 0; j < q_; ++j) { + if(edge_indicators_(t, p_ + j) == 0) continue; + int loc = kxy_index_cache_(t, j); + grad(loc) += diff_pw(t) * V_s(j); + } } // muy gradient from marginal OMRF - double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); for(size_t j = 0; j < q_; ++j) { grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; } diff --git a/src/test_gradient.cpp b/src/test_gradient.cpp new file mode 100644 index 00000000..75e71762 --- /dev/null +++ b/src/test_gradient.cpp @@ -0,0 +1,57 @@ +// test_gradient.cpp - Rcpp-exported helper for numerical gradient checking +// +// Constructs a MixedMRFModel from R inputs and evaluates logp_and_gradient +// at a given parameter vector. Used by tests to compare analytical gradients +// against finite-difference approximations. +#include +#include "models/mixed/mixed_mrf_model.h" + +// Evaluate log-posterior and gradient at a given NUTS parameter vector. +// +// @param inputFromR List with model specification (same as sample_mixed_mrf) +// @param theta NUTS parameter vector (excludes Kyy) +// @param edge_selection Whether to do edge selection +// +// @return List with "logp" (double) and "gradient" (numeric vector) +// [[Rcpp::export]] +Rcpp::List test_mixed_gradient( + const Rcpp::List& inputFromR, + const arma::vec& theta, + const bool edge_selection = false +) { + arma::imat discrete_obs = Rcpp::as(inputFromR["discrete_observations"]); + arma::mat continuous_obs = Rcpp::as(inputFromR["continuous_observations"]); + arma::ivec num_categories = Rcpp::as(inputFromR["num_categories"]); + arma::uvec is_ordinal = Rcpp::as(inputFromR["is_ordinal_variable"]); + arma::ivec baseline_cat = Rcpp::as(inputFromR["baseline_category"]); + double main_alpha = Rcpp::as(inputFromR["main_alpha"]); + double main_beta = Rcpp::as(inputFromR["main_beta"]); + double pairwise_scale = Rcpp::as(inputFromR["pairwise_scale"]); + std::string pseudolikelihood = Rcpp::as(inputFromR["pseudolikelihood"]); + + int p = discrete_obs.n_cols; + int q = continuous_obs.n_cols; + int total = p + q; + + arma::mat inclusion_prob = arma::ones(total, total); + arma::imat edge_indicators = arma::ones(total, total); + + MixedMRFModel model( + discrete_obs, continuous_obs, + num_categories, is_ordinal, baseline_cat, + inclusion_prob, edge_indicators, + edge_selection, pseudolikelihood, + main_alpha, main_beta, pairwise_scale, + 42 + ); + + // Set the NUTS block to the provided parameters + model.set_vectorized_parameters(theta); + + auto result = model.logp_and_gradient(theta); + + return Rcpp::List::create( + Rcpp::Named("logp") = result.first, + Rcpp::Named("gradient") = Rcpp::NumericVector(result.second.begin(), result.second.end()) + ); +} From 31f6773dde09a24466652ed7f2c6aca5514e41bc Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sat, 7 Mar 2026 15:42:08 +0100 Subject: [PATCH 26/60] feat: add hybrid NUTS sampler for mixed MRF models - HybridNUTSSampler: NUTS for (mux, Kxx, muy, Kxy), MH for Kyy - Wire sampler selection: R 'nuts' remapped to 'hybrid-nuts' for mixed - Pass sampler config (type, target_accept, tree depth, leapfrogs) from R through to C++ SamplerConfig - Update chain_runner factory and learn_sd flag for hybrid-nuts --- R/RcppExports.R | 8 ++- R/bgm_spec.R | 19 ++++-- R/run_sampler.R | 6 +- src/RcppExports.cpp | 26 +++++++-- src/mcmc/execution/chain_runner.cpp | 4 ++ src/mcmc/samplers/hybrid_nuts_sampler.h | 77 +++++++++++++++++++++++++ src/sample_mixed.cpp | 20 +++++-- 7 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 src/mcmc/samplers/hybrid_nuts_sampler.h diff --git a/R/RcppExports.R b/R/RcppExports.R index 39d81707..7324ab26 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -61,8 +61,8 @@ sample_ggm <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators .Call(`_bgms_sample_ggm`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, na_impute, missing_index_nullable) } -sample_mixed_mrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0) { - .Call(`_bgms_sample_mixed_mrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda) +sample_mixed_mrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, sampler_type = "mh", target_acceptance = 0.80, max_tree_depth = 10L, num_leapfrogs = 100L) { + .Call(`_bgms_sample_mixed_mrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs) } sample_omrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, sampler_type, seed, no_threads, progress_type, edge_prior = "Bernoulli", na_impute = FALSE, missing_index_nullable = NULL, beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, target_acceptance = 0.8, max_tree_depth = 10L, num_leapfrogs = 10L, pairwise_scaling_factors_nullable = NULL) { @@ -73,3 +73,7 @@ compute_Vn_mfm_sbm <- function(num_variables, dirichlet_alpha, t_max, lambda) { .Call(`_bgms_compute_Vn_mfm_sbm`, num_variables, dirichlet_alpha, t_max, lambda) } +test_mixed_gradient <- function(inputFromR, theta, edge_selection = FALSE) { + .Call(`_bgms_test_mixed_gradient`, inputFromR, theta, edge_selection) +} + diff --git a/R/bgm_spec.R b/R/bgm_spec.R index 3c186cba..4668ccf7 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -208,8 +208,13 @@ validate_bgm_spec = function(spec) { if(length(spec$data$num_categories) != spec$data$num_discrete) { stop("bgm_spec: num_categories length doesn't match num_discrete.") } - if(spec$sampler$update_method != "adaptive-metropolis") { - stop("bgm_spec: model_type = 'mixed_mrf' requires update_method = 'adaptive-metropolis'.") + allowed = c("adaptive-metropolis", "hybrid-nuts") + if(!(spec$sampler$update_method %in% allowed)) { + stop( + "bgm_spec: model_type = 'mixed_mrf' requires update_method in ", + paste(sQuote(allowed), collapse = " or "), ". Got '", + spec$sampler$update_method, "'." + ) } } @@ -316,8 +321,6 @@ bgm_spec = function(x, } # --- Sampler (needs is_continuous and edge_selection early) ------------------ - # Mixed MRF is MH-only (like GGM): force adaptive-metropolis via is_continuous - sampler_is_continuous = is_continuous || is_mixed sampler = validate_sampler( update_method = update_method, target_accept = target_accept, @@ -330,11 +333,17 @@ bgm_spec = function(x, cores = cores, seed = seed, display_progress = display_progress, - is_continuous = sampler_is_continuous, + is_continuous = is_continuous, edge_selection = if(model_type == "compare") FALSE else edge_selection, verbose = verbose ) + # Mixed MRF: remap "nuts" to the hybrid sampler that uses NUTS for the + # unconstrained block and component-wise MH for the SPD-constrained Kyy. + if(is_mixed && sampler$update_method == "nuts") { + sampler$update_method = "hybrid-nuts" + } + # --- Build by model type ---------------------------------------------------- if(model_type == "ggm") { spec = build_spec_ggm( diff --git a/R/run_sampler.R b/R/run_sampler.R index a21e173e..0ec3b967 100644 --- a/R/run_sampler.R +++ b/R/run_sampler.R @@ -201,7 +201,11 @@ run_sampler_mixed_mrf = function(spec) { beta_bernoulli_alpha_between = bb_alpha_between, beta_bernoulli_beta_between = bb_beta_between, dirichlet_alpha = p$dirichlet_alpha, - lambda = p$lambda + lambda = p$lambda, + sampler_type = s$update_method, + target_acceptance = s$target_accept, + max_tree_depth = s$nuts_max_depth, + num_leapfrogs = s$hmc_num_leapfrogs ) out_raw diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 3fdb2d88..0a6e6df3 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -310,8 +310,8 @@ BEGIN_RCPP END_RCPP } // sample_mixed_mrf -Rcpp::List sample_mixed_mrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda); -RcppExport SEXP _bgms_sample_mixed_mrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP) { +Rcpp::List sample_mixed_mrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda, const std::string& sampler_type, const double target_acceptance, const int max_tree_depth, const int num_leapfrogs); +RcppExport SEXP _bgms_sample_mixed_mrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP, SEXP sampler_typeSEXP, SEXP target_acceptanceSEXP, SEXP max_tree_depthSEXP, SEXP num_leapfrogsSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; @@ -332,7 +332,11 @@ BEGIN_RCPP Rcpp::traits::input_parameter< const double >::type beta_bernoulli_beta_between(beta_bernoulli_beta_betweenSEXP); Rcpp::traits::input_parameter< const double >::type dirichlet_alpha(dirichlet_alphaSEXP); Rcpp::traits::input_parameter< const double >::type lambda(lambdaSEXP); - rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda)); + Rcpp::traits::input_parameter< const std::string& >::type sampler_type(sampler_typeSEXP); + Rcpp::traits::input_parameter< const double >::type target_acceptance(target_acceptanceSEXP); + Rcpp::traits::input_parameter< const int >::type max_tree_depth(max_tree_depthSEXP); + Rcpp::traits::input_parameter< const int >::type num_leapfrogs(num_leapfrogsSEXP); + rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs)); return rcpp_result_gen; END_RCPP } @@ -384,6 +388,19 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } +// test_mixed_gradient +Rcpp::List test_mixed_gradient(const Rcpp::List& inputFromR, const arma::vec& theta, const bool edge_selection); +RcppExport SEXP _bgms_test_mixed_gradient(SEXP inputFromRSEXP, SEXP thetaSEXP, SEXP edge_selectionSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const Rcpp::List& >::type inputFromR(inputFromRSEXP); + Rcpp::traits::input_parameter< const arma::vec& >::type theta(thetaSEXP); + Rcpp::traits::input_parameter< const bool >::type edge_selection(edge_selectionSEXP); + rcpp_result_gen = Rcpp::wrap(test_mixed_gradient(inputFromR, theta, edge_selection)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -401,9 +418,10 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_sample_mixed_mrf_gibbs", (DL_FUNC) &_bgms_sample_mixed_mrf_gibbs, 11}, {"_bgms_run_mixed_simulation_parallel", (DL_FUNC) &_bgms_run_mixed_simulation_parallel, 16}, {"_bgms_sample_ggm", (DL_FUNC) &_bgms_sample_ggm, 19}, - {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 17}, + {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 21}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, + {"_bgms_test_mixed_gradient", (DL_FUNC) &_bgms_test_mixed_gradient, 3}, {NULL, NULL, 0} }; diff --git a/src/mcmc/execution/chain_runner.cpp b/src/mcmc/execution/chain_runner.cpp index d3ee969d..52b3087d 100644 --- a/src/mcmc/execution/chain_runner.cpp +++ b/src/mcmc/execution/chain_runner.cpp @@ -5,11 +5,14 @@ #include "mcmc/samplers/nuts_sampler.h" #include "mcmc/samplers/hmc_sampler.h" #include "mcmc/samplers/metropolis_sampler.h" +#include "mcmc/samplers/hybrid_nuts_sampler.h" std::unique_ptr create_sampler(const SamplerConfig& config, WarmupSchedule& schedule) { if (config.sampler_type == "nuts") { return std::make_unique(config, schedule); + } else if (config.sampler_type == "hybrid-nuts") { + return std::make_unique(config, schedule); } else if (config.sampler_type == "hmc" || config.sampler_type == "hamiltonian-mc") { return std::make_unique(config, schedule); } else if (config.sampler_type == "mh" || config.sampler_type == "adaptive-metropolis") { @@ -32,6 +35,7 @@ void run_mcmc_chain( // Construct warmup schedule (shared by runner and sampler) const bool learn_sd = (config.sampler_type == "nuts" || + config.sampler_type == "hybrid-nuts" || config.sampler_type == "hmc" || config.sampler_type == "hamiltonian-mc"); WarmupSchedule schedule(config.no_warmup, config.edge_selection, learn_sd); diff --git a/src/mcmc/samplers/hybrid_nuts_sampler.h b/src/mcmc/samplers/hybrid_nuts_sampler.h new file mode 100644 index 00000000..30d508be --- /dev/null +++ b/src/mcmc/samplers/hybrid_nuts_sampler.h @@ -0,0 +1,77 @@ +#pragma once + +#include +#include "mcmc/samplers/sampler_base.h" +#include "mcmc/algorithms/nuts.h" +#include "models/mixed/mixed_mrf_model.h" + +/** + * HybridNUTSSampler - NUTS for unconstrained block + MH for Kyy + * + * Designed for MixedMRFModel where the NUTS block covers (mux, Kxx, muy, Kxy) + * and the SPD-constrained Kyy is updated via component-wise Metropolis. + * Inherits warmup adaptation (step size, diagonal mass matrix) from + * GradientSamplerBase for the NUTS block. Kyy proposal SDs are adapted + * via the embedded Robbins-Monro schedule inside the model. + */ +class HybridNUTSSampler : public GradientSamplerBase { +public: + explicit HybridNUTSSampler(const SamplerConfig& config, WarmupSchedule& schedule) + : GradientSamplerBase(config.initial_step_size, config.target_acceptance, schedule), + max_tree_depth_(config.max_tree_depth), + schedule_(schedule) + {} + + bool has_nuts_diagnostics() const override { return true; } + + void initialize(BaseModel& model) override { + // Initialize NUTS adaptation (step-size heuristic + mass matrix) + GradientSamplerBase::initialize(model); + + // Initialize Kyy Metropolis adaptation (stores total_warmup_) + model.init_metropolis_adaptation(schedule_); + } + +protected: + StepResult do_gradient_step(BaseModel& model) override { + // --- Phase 1: NUTS step for the unconstrained block --- + arma::vec theta = model.get_vectorized_parameters(); + SafeRNG& rng = model.get_rng(); + + auto joint_fn = [&model](const arma::vec& params) + -> std::pair { + return model.logp_and_gradient(params); + }; + + arma::vec active_inv_mass = model.get_active_inv_mass(); + + StepResult result = nuts_step( + theta, step_size_, joint_fn, + active_inv_mass, rng, max_tree_depth_ + ); + + model.set_vectorized_parameters(result.state); + + // --- Phase 2: Kyy Metropolis step --- + auto& mixed = static_cast(model); + mixed.do_kyy_metropolis_step(current_iteration_); + + return result; + } + +private: + int max_tree_depth_; + WarmupSchedule& schedule_; + +public: + // The iteration counter is set by the overridden step() method via + // the base class. We store it so do_gradient_step() can pass it + // to the Kyy Metropolis update for Robbins-Monro adaptation. + StepResult step(BaseModel& model, int iteration) override { + current_iteration_ = iteration; + return GradientSamplerBase::step(model, iteration); + } + +private: + int current_iteration_ = -1; +}; diff --git a/src/sample_mixed.cpp b/src/sample_mixed.cpp index 2ff3b721..298ac607 100644 --- a/src/sample_mixed.cpp +++ b/src/sample_mixed.cpp @@ -2,7 +2,8 @@ // // Uses the unified MCMC runner infrastructure to sample from models with // both discrete (ordinal / Blume-Capel) and continuous variables. -// Supports MH sampler only, with optional edge selection. +// Supports MH and hybrid-nuts (NUTS for unconstrained block + MH for Kyy) +// samplers, with optional edge selection. #include #include #include @@ -41,6 +42,10 @@ // @param beta_bernoulli_beta_between SBM between-cluster beta // @param dirichlet_alpha Dirichlet alpha for SBM // @param lambda Lambda for SBM +// @param sampler_type Sampler type string ("mh", "hybrid-nuts", etc.) +// @param target_acceptance Target acceptance rate for gradient-based samplers +// @param max_tree_depth Maximum tree depth for NUTS +// @param num_leapfrogs Number of leapfrog steps for HMC // // @return List with per-chain results including samples and diagnostics // [[Rcpp::export]] @@ -61,7 +66,11 @@ Rcpp::List sample_mixed_mrf( const double beta_bernoulli_alpha_between = 1.0, const double beta_bernoulli_beta_between = 1.0, const double dirichlet_alpha = 1.0, - const double lambda = 1.0 + const double lambda = 1.0, + const std::string& sampler_type = "mh", + const double target_acceptance = 0.80, + const int max_tree_depth = 10, + const int num_leapfrogs = 100 ) { // Extract model inputs from R list arma::imat discrete_obs = Rcpp::as(inputFromR["discrete_observations"]); @@ -93,14 +102,17 @@ Rcpp::List sample_mixed_mrf( dirichlet_alpha, lambda ); - // Configure sampler — Mixed MRF is MH-only + // Configure sampler SamplerConfig config; - config.sampler_type = "mh"; + config.sampler_type = sampler_type; config.no_iter = no_iter; config.no_warmup = no_warmup; config.edge_selection = edge_selection; config.seed = seed; config.na_impute = false; + config.target_acceptance = target_acceptance; + config.max_tree_depth = max_tree_depth; + config.num_leapfrogs = num_leapfrogs; // Set up progress manager ProgressManager pm(no_chains, no_iter, no_warmup, 50, progress_type); From 04b95626db20a97b33958786635be92acedefd12 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sun, 8 Mar 2026 01:01:21 +0100 Subject: [PATCH 27/60] fix: remove test scaffolding, wire NUTS diagnostics, fix gradient overflow guards - Delete test_gradient.cpp and its Rcpp export (misguided test infrastructure) - Wire treedepth/divergent/energy diagnostics into mixed MRF output - Recognize 'hybrid-nuts' sampler type for NUTS diagnostic collection - Pass nuts_max_depth through to mixed MRF arguments - Fix ordinal gradient bound: use max(main_param) + C_s*rest, clamped at 0 - Fix BC gradient: use uninitialized bc_bound (computed inside helper) - Tighten fast-block overflow threshold by max(|main_param|) in both compute_logZ_and_probs_ordinal and compute_logZ_and_probs_blume_capel - Change mixed MRF progress interval from 50 to 1 --- R/RcppExports.R | 4 -- R/bgm_spec.R | 1 + R/build_output.R | 11 +++++ src/RcppExports.cpp | 14 ------ src/mcmc/execution/chain_runner.cpp | 3 +- src/models/mixed/mixed_mrf_gradient.cpp | 12 ++++-- src/sample_mixed.cpp | 2 +- src/test_gradient.cpp | 57 ------------------------- src/utils/variable_helpers.cpp | 20 +++++++-- 9 files changed, 40 insertions(+), 84 deletions(-) delete mode 100644 src/test_gradient.cpp diff --git a/R/RcppExports.R b/R/RcppExports.R index 7324ab26..186d9938 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -73,7 +73,3 @@ compute_Vn_mfm_sbm <- function(num_variables, dirichlet_alpha, t_max, lambda) { .Call(`_bgms_compute_Vn_mfm_sbm`, num_variables, dirichlet_alpha, t_max, lambda) } -test_mixed_gradient <- function(inputFromR, theta, edge_selection = FALSE) { - .Call(`_bgms_test_mixed_gradient`, inputFromR, theta, edge_selection) -} - diff --git a/R/bgm_spec.R b/R/bgm_spec.R index 4668ccf7..89995d9a 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -1167,6 +1167,7 @@ build_arguments_mixed_mrf = function(spec) { version = packageVersion("bgms"), update_method = spec$sampler$update_method, target_accept = spec$sampler$target_accept, + nuts_max_depth = spec$sampler$nuts_max_depth, num_chains = spec$sampler$chains, num_categories = spec$data$num_categories, data_columnnames = spec$data$data_columnnames, diff --git a/R/build_output.R b/R/build_output.R index 068908a2..c171342f 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -425,6 +425,9 @@ build_output_mixed_mrf = function(spec, raw) { if(!is.null(chain$allocation_samples)) { res$allocations = t(chain$allocation_samples) } + if(!is.null(chain$treedepth)) res[["treedepth__"]] = chain$treedepth + if(!is.null(chain$divergent)) res[["divergent__"]] = chain$divergent + if(!is.null(chain$energy)) res[["energy__"]] = chain$energy res }) @@ -700,6 +703,14 @@ build_output_mixed_mrf = function(spec, raw) { ) ) + # --- NUTS diagnostics ------------------------------------------------------- + if(s$update_method == "hybrid-nuts") { + results$nuts_diag = summarize_nuts_diagnostics( + raw, + nuts_max_depth = s$nuts_max_depth + ) + } + results } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 0a6e6df3..06f7a1b3 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -388,19 +388,6 @@ BEGIN_RCPP return rcpp_result_gen; END_RCPP } -// test_mixed_gradient -Rcpp::List test_mixed_gradient(const Rcpp::List& inputFromR, const arma::vec& theta, const bool edge_selection); -RcppExport SEXP _bgms_test_mixed_gradient(SEXP inputFromRSEXP, SEXP thetaSEXP, SEXP edge_selectionSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< const Rcpp::List& >::type inputFromR(inputFromRSEXP); - Rcpp::traits::input_parameter< const arma::vec& >::type theta(thetaSEXP); - Rcpp::traits::input_parameter< const bool >::type edge_selection(edge_selectionSEXP); - rcpp_result_gen = Rcpp::wrap(test_mixed_gradient(inputFromR, theta, edge_selection)); - return rcpp_result_gen; -END_RCPP -} static const R_CallMethodDef CallEntries[] = { {"_bgms_run_bgmCompare_parallel", (DL_FUNC) &_bgms_run_bgmCompare_parallel, 38}, @@ -421,7 +408,6 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 21}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, - {"_bgms_test_mixed_gradient", (DL_FUNC) &_bgms_test_mixed_gradient, 3}, {NULL, NULL, 0} }; diff --git a/src/mcmc/execution/chain_runner.cpp b/src/mcmc/execution/chain_runner.cpp index 52b3087d..1635b15b 100644 --- a/src/mcmc/execution/chain_runner.cpp +++ b/src/mcmc/execution/chain_runner.cpp @@ -143,7 +143,8 @@ std::vector run_mcmc_sampler( const int no_threads, ProgressManager& pm ) { - const bool has_nuts_diag = (config.sampler_type == "nuts"); + const bool has_nuts_diag = (config.sampler_type == "nuts" || + config.sampler_type == "hybrid-nuts"); const bool has_sbm_alloc = edge_prior.has_allocations() || (config.edge_selection && dynamic_cast(&edge_prior) != nullptr); diff --git a/src/models/mixed/mixed_mrf_gradient.cpp b/src/models/mixed/mixed_mrf_gradient.cpp index a11a7cf8..4c1fec18 100644 --- a/src/models/mixed/mixed_mrf_gradient.cpp +++ b/src/models/mixed/mixed_mrf_gradient.cpp @@ -242,8 +242,6 @@ std::pair MixedMRFModel::logp_and_gradient( + 2.0 * continuous_observations_ * temp_Kxy.row(s).t(); } - arma::vec bound = static_cast(C_s) * rest; - if(is_ordinal_variable_(s)) { arma::vec main_param = temp_mux.row(s).cols(0, C_s - 1).t(); @@ -255,6 +253,13 @@ std::pair MixedMRFModel::logp_and_gradient( } } + // bound = per-observation upper bound on log-scores for numerical + // stability. Must cover max_c(main_param(c) + (c+1)*rest(i)). + // The highest-category term main_param(C_s-1) + C_s*rest dominates + // when rest > 0; category 0 (score = 0) dominates when rest << 0. + arma::vec bound = main_param(C_s - 1) + static_cast(C_s) * rest; + bound = arma::max(bound, arma::zeros(bound.n_elem)); + LogZAndProbs result = compute_logZ_and_probs_ordinal( main_param, rest, bound, C_s ); @@ -362,8 +367,9 @@ std::pair MixedMRFModel::logp_and_gradient( effective_quad += temp_Theta(s, s); } + arma::vec bc_bound; LogZAndProbs result = compute_logZ_and_probs_blume_capel( - rest, lin_eff, effective_quad, ref, C_s, bound + rest, lin_eff, effective_quad, ref, C_s, bc_bound ); logp -= arma::accu(result.log_Z); diff --git a/src/sample_mixed.cpp b/src/sample_mixed.cpp index 298ac607..7a208a1d 100644 --- a/src/sample_mixed.cpp +++ b/src/sample_mixed.cpp @@ -115,7 +115,7 @@ Rcpp::List sample_mixed_mrf( config.num_leapfrogs = num_leapfrogs; // Set up progress manager - ProgressManager pm(no_chains, no_iter, no_warmup, 50, progress_type); + ProgressManager pm(no_chains, no_iter, no_warmup, 1, progress_type); // Run MCMC using unified infrastructure std::vector results = run_mcmc_sampler( diff --git a/src/test_gradient.cpp b/src/test_gradient.cpp deleted file mode 100644 index 75e71762..00000000 --- a/src/test_gradient.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// test_gradient.cpp - Rcpp-exported helper for numerical gradient checking -// -// Constructs a MixedMRFModel from R inputs and evaluates logp_and_gradient -// at a given parameter vector. Used by tests to compare analytical gradients -// against finite-difference approximations. -#include -#include "models/mixed/mixed_mrf_model.h" - -// Evaluate log-posterior and gradient at a given NUTS parameter vector. -// -// @param inputFromR List with model specification (same as sample_mixed_mrf) -// @param theta NUTS parameter vector (excludes Kyy) -// @param edge_selection Whether to do edge selection -// -// @return List with "logp" (double) and "gradient" (numeric vector) -// [[Rcpp::export]] -Rcpp::List test_mixed_gradient( - const Rcpp::List& inputFromR, - const arma::vec& theta, - const bool edge_selection = false -) { - arma::imat discrete_obs = Rcpp::as(inputFromR["discrete_observations"]); - arma::mat continuous_obs = Rcpp::as(inputFromR["continuous_observations"]); - arma::ivec num_categories = Rcpp::as(inputFromR["num_categories"]); - arma::uvec is_ordinal = Rcpp::as(inputFromR["is_ordinal_variable"]); - arma::ivec baseline_cat = Rcpp::as(inputFromR["baseline_category"]); - double main_alpha = Rcpp::as(inputFromR["main_alpha"]); - double main_beta = Rcpp::as(inputFromR["main_beta"]); - double pairwise_scale = Rcpp::as(inputFromR["pairwise_scale"]); - std::string pseudolikelihood = Rcpp::as(inputFromR["pseudolikelihood"]); - - int p = discrete_obs.n_cols; - int q = continuous_obs.n_cols; - int total = p + q; - - arma::mat inclusion_prob = arma::ones(total, total); - arma::imat edge_indicators = arma::ones(total, total); - - MixedMRFModel model( - discrete_obs, continuous_obs, - num_categories, is_ordinal, baseline_cat, - inclusion_prob, edge_indicators, - edge_selection, pseudolikelihood, - main_alpha, main_beta, pairwise_scale, - 42 - ); - - // Set the NUTS block to the provided parameters - model.set_vectorized_parameters(theta); - - auto result = model.logp_and_gradient(theta); - - return Rcpp::List::create( - Rcpp::Named("logp") = result.first, - Rcpp::Named("gradient") = Rcpp::NumericVector(result.second.begin(), result.second.end()) - ); -} diff --git a/src/utils/variable_helpers.cpp b/src/utils/variable_helpers.cpp index 586501cd..b3a745a4 100644 --- a/src/utils/variable_helpers.cpp +++ b/src/utils/variable_helpers.cpp @@ -359,6 +359,13 @@ LogZAndProbs compute_logZ_and_probs_ordinal( const arma::vec eM = ARMA_MY_EXP(main_param); + // The fast block computes eM[c] * pow % eB where the intermediate + // eM[c] * pow = exp(main_param(c) + (c+1)*rest) can overflow even when + // the final product exp(main_param(c) + (c+1)*rest - bound) is finite. + // Reduce the fast-block threshold by max(|main_param|) to prevent this. + const double max_abs_main = arma::max(arma::abs(main_param)); + const double FAST_LIM = std::max(0.0, EXP_BOUND - max_abs_main); + auto do_fast_block = [&](arma::uword i0, arma::uword i1) { auto P = result.probs.rows(i0, i1).cols(1, num_cats); arma::vec r = residual_score.rows(i0, i1); @@ -396,10 +403,10 @@ LogZAndProbs compute_logZ_and_probs_ordinal( const double* bp = bound.memptr(); arma::uword i = 0; while (i < N) { - const bool fast = !(bp[i] < -EXP_BOUND || bp[i] > EXP_BOUND); + const bool fast = !(bp[i] < -FAST_LIM || bp[i] > FAST_LIM); arma::uword j = i + 1; while (j < N) { - const bool fast_j = !(bp[j] < -EXP_BOUND || bp[j] > EXP_BOUND); + const bool fast_j = !(bp[j] < -FAST_LIM || bp[j] > FAST_LIM); if (fast_j != fast) break; j++; } @@ -488,14 +495,19 @@ LogZAndProbs compute_logZ_and_probs_blume_capel( result.log_Z.rows(i0, i1) = bb + ARMA_MY_LOG(denom); }; + // Same intermediate overflow guard as the ordinal function: + // exp_theta[c] * pow can overflow before the implicit cancellation with b. + const double max_abs_theta = arma::max(arma::abs(theta)); + const double THETA_LIM = std::max(0.0, EXP_BOUND - max_abs_theta); + const double* bp = b.memptr(); const double* pp = pow_bound.memptr(); arma::uword i = 0; while (i < N) { - const bool fast_i = (std::abs(bp[i]) <= EXP_BOUND) && (std::abs(pp[i]) <= EXP_BOUND); + const bool fast_i = (std::abs(bp[i]) <= EXP_BOUND) && (std::abs(pp[i]) <= THETA_LIM); arma::uword j = i + 1; while (j < N) { - const bool fast_j = (std::abs(bp[j]) <= EXP_BOUND) && (std::abs(pp[j]) <= EXP_BOUND); + const bool fast_j = (std::abs(bp[j]) <= EXP_BOUND) && (std::abs(pp[j]) <= THETA_LIM); if (fast_j != fast_i) break; j++; } From 84a7ba1404b725ab610fdca8e9702c20fbc629e8 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sun, 8 Mar 2026 01:01:27 +0100 Subject: [PATCH 28/60] docs: add phases H-L to mixed MRF implementation plan - Phase H: stochastic block model edge prior (future) - Phase I: missing data imputation (future) - Phase J: performance profiling - Phase K: code deduplication audit - Phase L: model output R code inspection --- dev/mixedmrf/implementation_plan.md | 216 +++++++++++++++++++++++++++- 1 file changed, 215 insertions(+), 1 deletion(-) diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 71ff9947..31bd9dab 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -2,7 +2,7 @@ **Date:** 2026-02-25 (updated 2026-03-04; review amendments 2026-03-04; Blume-Capel + PL consistency 2026-03-05; commit strategy 2026-03-05; -consistency review 2026-03-05) +consistency review 2026-03-05; phases J-L added 2026-03-08) **Branch:** `ggm_mixed` (PR #78) **Goal:** Build a monolithic `MixedMRFModel` in C++ that supports both conditional and marginal pseudo-likelihood, with and without edge selection. @@ -1492,6 +1492,220 @@ Test files: --- +## Phase H — Stochastic block model edge prior (future) + +The SBM edge prior is already implemented for GGM and OMRF models +(`src/priors/sbm_edge_prior.h`, `sbm_edge_prior_interface.cpp`). +Extending it to the mixed MRF requires wiring the existing prior +into the mixed MRF edge-selection machinery. + +### Scope + +1. Pass `edge_prior` and `block_count` arguments through to + `MixedMRFModel` and the Rcpp interface in `sample_mixed.cpp`. +2. In `update_edge_indicator_{Kxx,Kyy,Kxy}`: use the SBM + inclusion probability instead of the flat Bernoulli prior + when `edge_prior == "Stochastic-Block"`. +3. Add allocation sampling for the mixed MRF (port from the + GGM/OMRF pattern: one SBM prior object shared across + all three edge blocks Kxx, Kyy, Kxy). +4. Wire SBM posterior allocations into `build_output_mixed_mrf()`. +5. Validation: add an SBM edge-detection scenario to the + group 5 validation tests and a separate group 8 for + community-structure recovery. + +### Files affected + +| File | Change | +|------|--------| +| `R/bgm_spec.R` | Forward `edge_prior` / `block_count` to mixed args | +| `src/sample_mixed.cpp` | Accept and pass SBM arguments to model | +| `src/models/mixed/mixed_mrf_model.h` | Store `SBMEdgePrior` member | +| `src/models/mixed/mixed_mrf_metropolis.cpp` | Use SBM prior in edge updates | +| `R/build_output.R` | Extract SBM allocations for mixed MRF | +| `dev/tests/validation/group5_edge_detection.R` | Add SBM scenario | + +--- + +## Phase I — Missing data imputation (future) + +Missing data imputation for GGM and OMRF models is handled via +Gibbs imputation inside the MCMC loop (`impute_missing()` override). +The mixed MRF stub is currently a no-op. + +### Scope + +1. **Detection**: In the R interface, detect `NA` entries in both + discrete and continuous columns. Build missing-data masks: + `missing_discrete` (n × p logical) and `missing_continuous` + (n × q logical). +2. **Imputation step**: Override `impute_missing()` in + `MixedMRFModel` to cycle through missing entries: + - Discrete: sample from full conditional $f(x_s \mid x_{-s}, y)$ + using the same ordinal/BC probability helpers as the Gibbs + generator. + - Continuous: sample from $f(y_j \mid y_{-j}, x)$ using the + conditional Normal from the precision matrix $K_{yy}$. +3. **Integration**: `ChainRunner` already calls `impute_missing()` + each iteration when `has_missing_data()` returns `true`. Flip + the flag once imputation is implemented. +4. **Validation**: Test on data with MCAR missingness at 5%, 15%, + and 30%. Compare parameter recovery with and without missing + data. Verify that imputed values have plausible distributions. + +### Files affected + +| File | Change | +|------|--------| +| `R/validate_data.R` | Allow `NA` for mixed MRF; build masks | +| `src/sample_mixed.cpp` | Pass masks to model constructor | +| `src/models/mixed/mixed_mrf_model.h` | Store masks; override `has_missing_data` | +| `src/models/mixed/mixed_mrf_model.cpp` | Implement `impute_missing()` | +| `dev/tests/validation/` | New group for missing-data validation | + +--- + +## Phase J — Performance profiling + +Profile the mixed MRF sampler to identify bottlenecks and verify +that the rank-1 Cholesky optimizations (Phase B+) deliver the +expected speedup over naive recomputation. + +### Scope + +1. **Wall-clock benchmarks.** Time full `bgm()` runs at several + network sizes (p = 4/8/16, q = 3/6/12) with fixed iteration + counts. Record total time, per-iteration time, and breakdown + by update type (Kxx, Kyy, Kxy, Kxy, main effects, edge + selection when active). Compare MH vs NUTS. +2. **Cache-hit verification.** Under a profiler (or instrumented + C++ timers), confirm that the Cholesky rank-1 update path + dominates over any fallback full-recompute path. Quantify + the fraction of iterations that hit the fast path. +3. **Scaling curves.** Plot per-iteration cost against q (fixing + p) and against p (fixing q) to confirm empirical $O(q^2)$ + and $O(p)$ scaling respectively. +4. **Marginal vs conditional PL cost.** Conditional PL evaluates + one OMRF term per discrete variable per move; marginal PL + evaluates all $p$ terms for mean/precision moves. Benchmark + both and document the crossover point. +5. **Comparison with OMRF and GGM.** Run the same-sized pure + ordinal and pure continuous models and compare iteration cost + to the mixed MRF. + +### Deliverables + +| File | Content | +|------|---------| +| `dev/tests/validation/group9_profiling.R` | Benchmark script | +| `dev/tests/validation/output/group9_profiling.pdf` | Scaling curves and timing tables | +| `dev/ggm_speed.md` or `dev/ggm_performance.md` | Updated with mixed MRF results | + +--- + +## Phase K — Code deduplication audit + +Review the mixed MRF implementation and the rest of the package for +repeated code patterns that could be shared. The goal is to reduce +maintenance burden without over-abstracting. + +### Known candidates + +1. **Matrix assembly pattern in `build_output.R`.** + `build_output_mixed_mrf()` contains four near-identical nested + loops that fill an (p+q) × (p+q) matrix from offset-indexed + flat vectors (discrete main effects, continuous main effects, + pairwise matrix, indicator matrix). Extract a shared helper. +2. **SBM summarization computed twice.** + `summarize_alloc_pairs()` is called identically for the summary + table and the co-clustering matrix. Cache the result and reuse. +3. **Raw-samples list assembly.** + `build_output_bgm()` and `build_output_mixed_mrf()` construct + `results$raw_samples` with identical structure. Extract to a + shared helper. +4. **Parameter index computation.** + The 50-line block in `build_output_mixed_mrf()` that computes + mux/Kxx/muy/Kxy/Kyy offsets is inline and hard to audit. + Extract to a named function so it can be unit-tested. +5. **Cholesky header location.** + `cholupdate.h` / `cholupdate.cpp` live in `src/models/ggm/` + but are included by the mixed MRF model. Evaluate moving to + `src/utils/` for discoverability. +6. **Metropolis step skeleton.** + GGM, OMRF, and Mixed MRF each implement Robbins-Monro + adaptation with target acceptance 0.234 / 0.44. The adaptation + arithmetic is short and varies per model, so duplication is + low, but verify no copy-paste drift has occurred. + +### Scope + +- Audit, not refactor. This phase produces a ranked list of + deduplication opportunities with effort estimates. Actual + refactoring happens in follow-up commits. +- For each candidate, determine: lines saved, risk of introducing + bugs, and whether a shared helper already exists in the codebase. + +### Deliverables + +| File | Content | +|------|---------| +| `dev/mixedmrf/deduplication_audit.md` | Ranked list of candidates with code pointers | + +--- + +## Phase L — Model output R code inspection + +Systematic review of the R code that assembles, summarises, and +exposes the mixed MRF model output. The mixed MRF builder was +written alongside the C++ port and has accumulated inline logic +that may be fragile or inconsistent with the GGM/OMRF paths. + +### Inspection points + +1. **`build_output_mixed_mrf()` correctness.** + - Verify that the flat-to-matrix index mapping for mux, Kxx, + muy, Kxy, Kyy matches the C++ parameter ordering exactly. + - Trace the NUTS diagnostic column naming (`__` suffix + convention) and confirm it matches `build_output_bgm()`. + - Check that posterior_mean_main for BC variables correctly + stores alpha/beta in columns 1:2 with the rest NA. + - Confirm that `posterior_mean_pairwise` symmetry and sign + conventions match GGM/OMRF output. +2. **Posterior mean type consistency.** + Mixed MRF returns `posterior_mean_main` as a list with + `$discrete` and `$continuous` sub-elements, while GGM and + OMRF return a matrix. Determine whether this inconsistency + causes problems downstream (in `coef.bgms()`, print methods, + user code) and propose a resolution. +3. **`coef.bgms()` with mixed MRF.** + Verify that `coef()` on a mixed fit returns a structure that + users can work with. Check edge cases: all-ordinal mixed MRF + (q=0 should not occur but the code path should be guarded), + all-BC discrete variables, single variable of each type. +4. **`simulate.bgms()` with mixed MRF.** + Confirm that simulation from posterior means and from posterior + samples both produce correctly ordered data frames (original + column order, not internal discrete-first order). +5. **`predict.bgms()` with mixed MRF.** + Confirm that conditional prediction handles mixed types and + that the reordering from internal to user column order is + correct. +6. **NUTS diagnostic wiring.** + The `update_method` string in the mixed MRF path is + `"hybrid-nuts"` while GGM uses `"nuts"`. Verify that + downstream code (Rhat computation, ESS, trace extraction) + handles both strings correctly. +7. **`summary.bgms()` and `print.bgms()`.** + Confirm these methods produce sensible output for a mixed fit. + +### Deliverables + +| File | Content | +|------|---------| +| `dev/mixedmrf/output_inspection.md` | Findings, bugs found, and fix list | + +--- + ## Testing strategy ### Existing test infrastructure (from mixedGM) From 9e21374a80fee7b075b6e15e8782186da91bdf9d Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Sun, 8 Mar 2026 14:38:18 +0100 Subject: [PATCH 29/60] feat: missing data imputation for mixed MRF (Phase I) --- R/RcppExports.R | 4 +- R/bgm_spec.R | 61 +++- R/run_sampler.R | 6 +- dev/mixedmrf/implementation_plan.md | 492 +++++++++++++++++++++++---- src/RcppExports.cpp | 11 +- src/models/mixed/mixed_mrf_model.cpp | 130 +++++++ src/models/mixed/mixed_mrf_model.h | 27 +- src/sample_mixed.cpp | 24 +- 8 files changed, 666 insertions(+), 89 deletions(-) diff --git a/R/RcppExports.R b/R/RcppExports.R index 186d9938..e3007c1c 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -61,8 +61,8 @@ sample_ggm <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators .Call(`_bgms_sample_ggm`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, na_impute, missing_index_nullable) } -sample_mixed_mrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, sampler_type = "mh", target_acceptance = 0.80, max_tree_depth = 10L, num_leapfrogs = 100L) { - .Call(`_bgms_sample_mixed_mrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs) +sample_mixed_mrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior = "Bernoulli", beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, sampler_type = "mh", target_acceptance = 0.80, max_tree_depth = 10L, num_leapfrogs = 100L, na_impute = FALSE, missing_index_discrete_nullable = NULL, missing_index_continuous_nullable = NULL) { + .Call(`_bgms_sample_mixed_mrf`, inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs, na_impute, missing_index_discrete_nullable, missing_index_continuous_nullable) } sample_omrf <- function(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, sampler_type, seed, no_threads, progress_type, edge_prior = "Bernoulli", na_impute = FALSE, missing_index_nullable = NULL, beta_bernoulli_alpha = 1.0, beta_bernoulli_beta = 1.0, beta_bernoulli_alpha_between = 1.0, beta_bernoulli_beta_between = 1.0, dirichlet_alpha = 1.0, lambda = 1.0, target_acceptance = 0.8, max_tree_depth = 10L, num_leapfrogs = 10L, pairwise_scaling_factors_nullable = NULL) { diff --git a/R/bgm_spec.R b/R/bgm_spec.R index 89995d9a..78f29055 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -79,6 +79,13 @@ new_bgm_spec = function(model_type, data, variables, missing, prior, if(!is.null(missing$missing_index)) { stopifnot(is.matrix(missing$missing_index)) } + # mixed MRF uses separate indices for discrete and continuous + if(!is.null(missing$missing_index_discrete)) { + stopifnot(is.matrix(missing$missing_index_discrete)) + } + if(!is.null(missing$missing_index_continuous)) { + stopifnot(is.matrix(missing$missing_index_continuous)) + } # --- prior sub-list --- stopifnot(is.list(prior)) @@ -658,16 +665,45 @@ build_spec_mixed_mrf = function(x, data_columnnames, num_variables, variable_bool = is_ordinal_disc ) - # Missing data — not supported for mixed MRF (Phase H) - if(na_action == "impute") { - stop("Missing data imputation is not yet supported for mixed models.", - call. = FALSE - ) - } - if(anyNA(x)) { - stop("Missing data detected. Mixed models do not yet support missing data handling.", - call. = FALSE - ) + # Missing data handling + na_impute = FALSE + missing_index_discrete = NULL + missing_index_continuous = NULL + + if(na_action == "listwise") { + missing_rows = apply(x_disc, 1, anyNA) | apply(x_cont, 1, anyNA) + if(all(missing_rows)) { + stop(paste0( + "All rows in x contain at least one missing response.\n", + "You could try option na_action = \"impute\"." + )) + } + n_removed = sum(missing_rows) + if(n_removed > 0 && isTRUE(getOption("bgms.verbose", TRUE))) { + n_remaining = nrow(x_disc) - n_removed + message( + n_removed, " row", if(n_removed > 1) "s" else "", + " with missing values excluded (n = ", n_remaining, " remaining).\n", + "To impute missing values instead, use na_action = \"impute\"." + ) + } + x_disc = x_disc[!missing_rows, , drop = FALSE] + x_cont = x_cont[!missing_rows, , drop = FALSE] + if(nrow(x_disc) < 2) { + stop(paste0( + "After removing missing observations from the input matrix x,\n", + "there were less than two rows left in x." + )) + } + } else { + # Impute path: handle discrete and continuous sub-matrices separately + md_disc = handle_impute(x_disc) + md_cont = handle_impute(x_cont) + x_disc = md_disc$x + x_cont = md_cont$x + na_impute = md_disc$na_impute || md_cont$na_impute + if(md_disc$na_impute) missing_index_discrete = md_disc$missing_index + if(md_cont$na_impute) missing_index_continuous = md_cont$missing_index } # Ordinal recoding (reformat discrete data) @@ -718,8 +754,9 @@ build_spec_mixed_mrf = function(x, data_columnnames, num_variables, ), missing = list( na_action = na_action, - na_impute = FALSE, - missing_index = NULL + na_impute = na_impute, + missing_index_discrete = missing_index_discrete, + missing_index_continuous = missing_index_continuous ), prior = list( pairwise_scale = pairwise_scale, diff --git a/R/run_sampler.R b/R/run_sampler.R index 0ec3b967..6ca7fb0e 100644 --- a/R/run_sampler.R +++ b/R/run_sampler.R @@ -154,6 +154,7 @@ run_sampler_omrf = function(spec) { run_sampler_mixed_mrf = function(spec) { d = spec$data v = spec$variables + m = spec$missing p = spec$prior s = spec$sampler @@ -205,7 +206,10 @@ run_sampler_mixed_mrf = function(spec) { sampler_type = s$update_method, target_acceptance = s$target_accept, max_tree_depth = s$nuts_max_depth, - num_leapfrogs = s$hmc_num_leapfrogs + num_leapfrogs = s$hmc_num_leapfrogs, + na_impute = m$na_impute, + missing_index_discrete_nullable = m$missing_index_discrete, + missing_index_continuous_nullable = m$missing_index_continuous ) out_raw diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 31bd9dab..76bcc8e7 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -314,7 +314,14 @@ add the new Rcpp export to `src/RcppExports.cpp`, `R/RcppExports.R`, and | **D** | Edge selection: 3 RJ sweeps | B+ | Structure recovery test passes | ✅ | | **E** | R interface: `bgm()` dispatch, output formatting | B+ | End-to-end `bgm(mixed_data)` works | ✅ | | **F** | Warmup schedule, adaptation, diagnostics | E | Full warmup pipeline | ✅ | -| **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | +| **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | ✅ | +| **H** | Stochastic block model edge prior | G | SBM prior wired into mixed MRF | ✅ | +| **I** | Missing data imputation | G | `na_action = "impute"` for mixed data | ✅ | +| **J** | Performance profiling | G | Benchmark report, hotspot fixes | +| **K** | Code deduplication audit | G | Shared helpers extracted, dead code removed | +| **L** | Model output R code inspection | G | Output format verified, bugs fixed | +| **M** | Test suite cleanup and completion | G | 4 new test files, promoted dev tests, full T1–T30 coverage | +| **N** | Alternative proposals for GGM edge updates | G | New proposal mechanisms for GGM edges | --- @@ -1492,77 +1499,88 @@ Test files: --- -## Phase H — Stochastic block model edge prior (future) +## Phase H — Stochastic block model edge prior ✅ The SBM edge prior is already implemented for GGM and OMRF models (`src/priors/sbm_edge_prior.h`, `sbm_edge_prior_interface.cpp`). -Extending it to the mixed MRF requires wiring the existing prior -into the mixed MRF edge-selection machinery. - -### Scope - -1. Pass `edge_prior` and `block_count` arguments through to - `MixedMRFModel` and the Rcpp interface in `sample_mixed.cpp`. -2. In `update_edge_indicator_{Kxx,Kyy,Kxy}`: use the SBM - inclusion probability instead of the flat Bernoulli prior - when `edge_prior == "Stochastic-Block"`. -3. Add allocation sampling for the mixed MRF (port from the - GGM/OMRF pattern: one SBM prior object shared across - all three edge blocks Kxx, Kyy, Kxy). -4. Wire SBM posterior allocations into `build_output_mixed_mrf()`. -5. Validation: add an SBM edge-detection scenario to the - group 5 validation tests and a separate group 8 for - community-structure recovery. - -### Files affected - -| File | Change | -|------|--------| -| `R/bgm_spec.R` | Forward `edge_prior` / `block_count` to mixed args | -| `src/sample_mixed.cpp` | Accept and pass SBM arguments to model | -| `src/models/mixed/mixed_mrf_model.h` | Store `SBMEdgePrior` member | -| `src/models/mixed/mixed_mrf_metropolis.cpp` | Use SBM prior in edge updates | -| `R/build_output.R` | Extract SBM allocations for mixed MRF | -| `dev/tests/validation/group5_edge_detection.R` | Add SBM scenario | +The unified `BaseEdgePrior` / `ChainRunner` architecture means +the mixed MRF required **no additional code** — all five scope +items were already satisfied: + +1. ✅ `bgm_spec()` and `build_spec_mixed_mrf()` forward + `edge_prior` / SBM hyperparameters (6 params). +2. ✅ `run_sampler_mixed_mrf()` passes them to `sample_mixed_mrf()`. +3. ✅ `sample_mixed.cpp` creates the edge prior via + `create_edge_prior()` and passes it to `run_mcmc_sampler()`. +4. ✅ `ChainRunner` calls `edge_prior.update()` after each + edge-indicator sweep, modifying `inclusion_probability_` in + place via `MixedMRFModel::get_inclusion_probability()`. + Allocation samples are stored automatically. +5. ✅ `build_output_mixed_mrf()` extracts allocations, + co-clustering matrix, posterior mean/mode allocations, + and block-count summaries. + +Verified with a smoke test: `bgm(mixed_data, edge_prior = "Stochastic-Block")` +produces correct allocation, co-clustering, and block-count outputs +across 4 chains. --- -## Phase I — Missing data imputation (future) - -Missing data imputation for GGM and OMRF models is handled via -Gibbs imputation inside the MCMC loop (`impute_missing()` override). -The mixed MRF stub is currently a no-op. - -### Scope - -1. **Detection**: In the R interface, detect `NA` entries in both - discrete and continuous columns. Build missing-data masks: - `missing_discrete` (n × p logical) and `missing_continuous` - (n × q logical). -2. **Imputation step**: Override `impute_missing()` in - `MixedMRFModel` to cycle through missing entries: - - Discrete: sample from full conditional $f(x_s \mid x_{-s}, y)$ - using the same ordinal/BC probability helpers as the Gibbs - generator. - - Continuous: sample from $f(y_j \mid y_{-j}, x)$ using the - conditional Normal from the precision matrix $K_{yy}$. -3. **Integration**: `ChainRunner` already calls `impute_missing()` - each iteration when `has_missing_data()` returns `true`. Flip - the flag once imputation is implemented. -4. **Validation**: Test on data with MCAR missingness at 5%, 15%, - and 30%. Compare parameter recovery with and without missing - data. Verify that imputed values have plausible distributions. - -### Files affected +## Phase I — Missing data imputation ✅ + +Missing data imputation wires the existing `BaseModel` virtual interface +(`has_missing_data()`, `impute_missing()`) into the mixed MRF model, +mirroring the GGM and OMRF implementations. + +### Implementation + +Four layers were connected: + +1. **R spec** (`bgm_spec.R`): Removed the `stop()` guards that rejected + `NA` entries for mixed data. Added listwise-deletion and imputation + handling that processes discrete and continuous sub-matrices + separately via `handle_impute()`. The spec stores + `missing_index_discrete` and `missing_index_continuous` (0-based + row/col index matrices). +2. **R sampler** (`run_sampler.R`): Passes `na_impute`, + `missing_index_discrete`, and `missing_index_continuous` to the C++ + entry point. +3. **C++ entry** (`sample_mixed.cpp`): Accepts the three new + parameters, calls `model.set_missing_data()`, and sets + `config.na_impute`. +4. **C++ model** (`mixed_mrf_model.h/.cpp`): + - `has_missing_data()` returns the stored flag (was hardcoded + `false`). + - `set_missing_data()` stores the index matrices and sets the flag. + - `impute_missing()` performs Gibbs imputation in three phases: + - Phase 1 — Discrete: samples each missing entry from its full + conditional using rest scores and category probabilities + (ordinal or Blume-Capel). Updates sufficient statistics + (`counts_per_category_` or `blume_capel_stats_`). + - Phase 2 — Refreshes `conditional_mean_` when both discrete + and continuous entries are missing. + - Phase 3 — Continuous: samples each missing entry from the + conditional Normal $N(\mu^*, 1/K_{yy,jj})$. Invalidates the + gradient cache. + +`ChainRunner` already calls `impute_missing()` each iteration when +`config.na_impute && model.has_missing_data()`. + +The `RcppExports` were regenerated, which also fixed a pre-existing +bug where the R wrapper for `sample_mixed_mrf` had only 17 parameters +while the C++ function expected 21. + +### Files changed | File | Change | |------|--------| -| `R/validate_data.R` | Allow `NA` for mixed MRF; build masks | -| `src/sample_mixed.cpp` | Pass masks to model constructor | -| `src/models/mixed/mixed_mrf_model.h` | Store masks; override `has_missing_data` | -| `src/models/mixed/mixed_mrf_model.cpp` | Implement `impute_missing()` | -| `dev/tests/validation/` | New group for missing-data validation | - +| `R/bgm_spec.R` | Removed `stop()` guards; added listwise/impute handling for mixed data | +| `R/run_sampler.R` | Passes missing-data indices and `na_impute` flag to C++ | +| `R/RcppExports.R` | Regenerated (also fixed stale 17-param wrapper) | +| `src/sample_mixed.cpp` | Three new parameters; wires missing data to model | +| `src/models/mixed/mixed_mrf_model.h` | New data members, `set_missing_data()`, `impute_missing()` declaration | +| `src/models/mixed/mixed_mrf_model.cpp` | `impute_missing()` implementation, copy constructor updated | +| `src/RcppExports.cpp` | Regenerated | --- ## Phase J — Performance profiling @@ -1706,8 +1724,356 @@ that may be fragile or inconsistent with the GGM/OMRF paths. --- +## Phase M — Test suite cleanup and completion + +The planned test structure (§4 file layout, commit strategy) envisioned +four dedicated test files in `tests/testthat/`: + +``` +test-mixed-mrf-skeleton.R # T4, T5 (dimension, vectorization round-trip) +test-mixed-mrf-likelihood.R # T1–T3, T7–T12 (likelihood unit tests) +test-mixed-mrf-sampling.R # T13–T14, T16–T18 (recovery, reproducibility) +test-mixed-mrf-edge-sel.R # T15, T26–T27 (edge selection, BC combos) +``` + +What actually shipped is different: the scaffolding test helpers were +removed in commit `04b9562`, the likelihood tests were removed with +them, and the remaining coverage landed in two files plus scattered +additions to existing files. This phase reconciles the plan with +reality, fills coverage gaps, and consolidates test organization. + +### M.1 Current state audit + +**`tests/testthat/` (run by `R CMD check`):** + +| File | Mixed-MRF `test_that` blocks | Covers | +|------|:---:|---| +| `test-mixed-mrf-simulate-predict.R` | 15 | Gibbs generator, simulate, predict, p=1/q=1 edge cases | +| `test-bgm.R` (mixed section) | 8 | End-to-end `bgm()`, output dimensions, symmetry, marginal PL | +| `test-validate-variable-types.R` | 13 | Type validation (not model-specific) | + +**`dev/tests/` (manual only, not run by `R CMD check`):** + +| File | Blocks | Covers | +|------|:---:|---| +| `test-numerical-gradient.R` | 4 | Finite-diff vs analytical gradient (cond + marg, ord + BC) | +| `test-simulation-recovery.R` | 1 mixed | Mixed MRF sim-recovery cycle | +| `compare_bgms_mixedgm_cycle.R` | 0 | Script, no assertions — bgms vs mixedGM comparison | +| `validation/group1–7` | 0 | PDF-generating scripts, no programmatic assertions | + +### M.2 Gap analysis against plan's test matrix + +#### Covered (have a `test_that` block in `tests/testthat/`) + +| Test | Description | Covered by | +|------|-------------|------------| +| T17 | Reproducibility (same seed) | `test-bgm.R` "bgm mixed MRF is reproducible" | +| T19 | End-to-end `bgm()` | `test-bgm.R` (8 blocks) | +| T22 | Degenerate p=1 | `test-mixed-mrf-simulate-predict.R` "single discrete variable" | +| T23 | Degenerate q=1 | `test-mixed-mrf-simulate-predict.R` "single continuous variable" | +| T25 | Gibbs generator sanity | `test-mixed-mrf-simulate-predict.R` (dimension, range, SD, seed) | +| R1 | GGM regression | Existing `test-bgm.R` GGM section | +| R2 | OMRF regression | Existing `test-bgm.R` OMRF sections | +| R3 | bgmCompare regression | `test-bgmCompare.R` | + +#### Covered in `dev/tests/` only (not run by `R CMD check`) + +| Test | Description | Covered by | +|------|-------------|------------| +| T1 | `log_conditional_omrf(s)` | Was in scaffolding tests (removed); partially in `validation/group4` | +| T2 | `log_conditional_ggm()` | Same | +| T3 | `log_marginal_omrf(s)` | Same | +| T13 | Conditional PL recovery | `validation/group1`, `test-simulation-recovery.R` | +| T14 | Marginal PL recovery | `validation/group1` | +| T15 | Edge selection recovery | `validation/group5` | +| T16 | Cond vs marginal agreement | `validation/group3` | + +#### Covered in `dev/tests/` only (gradient-specific) + +| Test | Description | Covered by | +|------|-------------|------------| +| NUTS-7.1 | Numerical gradient check | `test-numerical-gradient.R` (4 blocks) | +| NUTS-7.2 | Posterior equivalence MH vs NUTS | `validation/group2` | +| NUTS-7.3 | ESS comparison | `validation/group6` | +| NUTS-7.4 | Edge selection with hybrid | `validation/group5` | + +#### Not covered anywhere + +| Test | Description | Status | +|------|-------------|--------| +| T4 | `parameter_dimension()` | Was in scaffolding tests, removed | +| T5 | Vectorization round-trip | Was in scaffolding tests, removed | +| T6 | Cholesky permutation involution | Superseded by B+ (permutation removed) | +| T7 | Analytic Gaussian ($K_{xy}=0$) | Was in scaffolding tests, removed | +| T8 | Fixture replay (bit-for-bit) | Never implemented | +| T9 | Cache freshness after parameter tweak | Never implemented | +| T10 | BC conditional OMRF vs standalone OMRF | Never implemented | +| T11 | BC marginal OMRF vs standalone OMRF | Never implemented | +| T12 | BC observation centering consistency | Never implemented | +| T18 | Multi-chain (4 chains, R-hat < 1.1) | Not in `tests/testthat/` | +| T20 | Kyy PD invariant under stress | Never implemented | +| T21 | Cache consistency under RJ | Never implemented | +| T24 | Binary-only ordinal matches logistic | Never implemented | +| T26 | Mixed ordinal + BC recovery | Never implemented | +| T27 | BC-only discrete recovery + edge selection | Never implemented | +| T28 | `log_ggm_ratio_edge` agreement | Was in scaffolding tests, removed | +| T29 | Cholesky update fidelity | Was in scaffolding tests, removed | +| T30 | Rank-2 quadratic shortcut | Never implemented (B+.10 not implemented) | + +#### Additional gaps not in original matrix + +| Gap | Description | +|-----|-------------| +| G1 | No `bgm_spec()` test for `mixed_mrf` model type | +| G2 | No `test-spec-wiring.R` coverage for mixed pipeline | +| G3 | No `test-methods.R` coverage (`coef`, `print`, `summary` for mixed fixture) | +| G4 | No `predict.bgms` posterior-draw-path test (only posterior-mean tested) | +| G5 | No multi-chain test for mixed MRF (chain-combining logic) | +| G6 | No `na_action = "listwise"` test for mixed data | +| G7 | No Blume-Capel + continuous combo end-to-end test | +| G8 | `compare_bgms_mixedgm_cycle.R` is unstructured script (no `test_that`) | +| G9 | Validation scripts (group1–7) have no programmatic pass/fail | +| G10 | `test-numerical-gradient.R` and `test-simulation-recovery.R` use `<-` assignment (style violation) | + +### M.3 Reorganization plan + +#### Target file structure + +Consolidate mixed-MRF tests into four files matching the original plan, +plus keep the simulate/predict file which has grown organically: + +``` +tests/testthat/ + test-mixed-mrf-skeleton.R # T4, T5 (dimension, round-trip) + test-mixed-mrf-likelihood.R # T1–T3, T7, T10–T12 (likelihood unit) + test-mixed-mrf-sampling.R # T13, T14, T16–T18, T26, T27 (recovery) + test-mixed-mrf-edge-selection.R # T15, T20, T21 (edge selection, PD, cache) + test-mixed-mrf-simulate-predict.R # (existing — keep as-is) + test-mixed-mrf-gradient.R # Numerical gradient (promote from dev/) +``` + +Mixed-MRF blocks currently in `test-bgm.R` stay there — they test the +`bgm()` interface, not the model internals. Add a mixed-MRF fixture to +`test-methods.R` and `test-bgm-spec.R`. + +#### What to promote from `dev/tests/` to `tests/testthat/` + +| Source | Target | Notes | +|--------|--------|-------| +| `test-numerical-gradient.R` (4 blocks) | `test-mixed-mrf-gradient.R` | Wrap in `skip_on_cran()`. Fix `<-` to `=`. | +| `test-simulation-recovery.R` (mixed block) | `test-mixed-mrf-sampling.R` | Merge into recovery section. Fix `<-` to `=`. | + +The validation suite (`dev/tests/validation/`) stays in `dev/`. These +are long-running visual diagnostics, not `R CMD check` tests. No +changes needed except documenting their role. + +`compare_bgms_mixedgm_cycle.R` stays in `dev/` as a manual diagnostic +script. Add a header comment clarifying it is not a testthat test. + +#### What to add (new tests) + +**Tier 1 — essential for correctness (add in this phase):** + +| File | Tests | What | +|------|-------|------| +| `test-mixed-mrf-skeleton.R` | T4, T5 | Parameter count for known (p,q, mixed ord+BC); vectorization round-trip | +| `test-mixed-mrf-likelihood.R` | T1, T2, T3, T7 | Likelihood values vs R reference at known params; analytic Gaussian check | +| `test-mixed-mrf-likelihood.R` | T10, T11, T12 | BC likelihood vs standalone OMRF; BC observation centering | +| `test-mixed-mrf-sampling.R` | T18 | Multi-chain (2 chains, R-hat < 1.2; `skip_on_cran()`) | +| `test-mixed-mrf-sampling.R` | T26, T27 | Mixed ord+BC recovery; BC-only recovery (`skip_on_cran()`) | +| `test-mixed-mrf-edge-selection.R` | T15 | Structure recovery on sparse graph (`skip_on_cran()`) | +| `test-bgm-spec.R` | G1 | Spec builder produces `mixed_mrf` for `c("ordinal","continuous")` input | +| `test-methods.R` | G3 | `coef`, `print`, `summary` on mixed fixture | + +**Tier 2 — defensive (add if time permits):** + +| File | Tests | What | +|------|-------|------| +| `test-mixed-mrf-likelihood.R` | T9 | Cache freshness: tweak one param, verify cache matches recompute | +| `test-mixed-mrf-edge-selection.R` | T20 | Kyy PD invariant under 500 iters with wide proposals | +| `test-mixed-mrf-edge-selection.R` | T21 | Cache consistency after RJ birth/death | +| `test-mixed-mrf-sampling.R` | T24 | Binary-only ordinal vs logistic rest-scores | +| `test-mixed-mrf-sampling.R` | G4 | Predict with posterior draws (not just posterior-mean) | +| `test-mixed-mrf-sampling.R` | G5 | Multi-chain output combining | +| `test-bgm.R` | G7 | `bgm()` with Blume-Capel + continuous data | + +**Dropped (superseded or not applicable):** + +| Test | Reason | +|------|--------| +| T6 | Cholesky permutation removed in Phase B+; rank-1 approach has no permutation | +| T8 | Fixture replay requires stable binary fixtures; deferred to future maintenance | +| T28, T29 | Rank-1 log-ratio and Cholesky fidelity: internal C++ state not easily testable from R without scaffolding exports. Cover implicitly via T13/T14 recovery. | +| T30 | B+.10 quadratic shortcut not implemented | + +### M.4 Style fixes + +Apply to all promoted and new test files: + +1. Replace `<-` with `=` for assignment (except inside `expect_*()` + calls where the result must be captured: + `expect_message(result <- foo(), "pat")`). +2. Remove `#'` roxygen-style comments; use plain `#` comments. +3. Use `if(` not `if (`. +4. Run `styler::style_file()` with `bgms_style` on each file. + +### M.5 Deliverables + +| # | Commit message | What ships | +|:-:|----------------|------------| +| 1 | `test: add mixed MRF skeleton and likelihood tests` | `test-mixed-mrf-skeleton.R` (T4, T5), `test-mixed-mrf-likelihood.R` (T1–T3, T7, T10–T12) | +| 2 | `test: add mixed MRF sampling recovery tests` | `test-mixed-mrf-sampling.R` (T13, T14, T16–T18, T26, T27) | +| 3 | `test: add mixed MRF edge selection tests` | `test-mixed-mrf-edge-selection.R` (T15) | +| 4 | `test: promote gradient tests to testthat` | `test-mixed-mrf-gradient.R` (from `dev/tests/`); style fixes | +| 5 | `test: add mixed MRF coverage to spec and methods tests` | `test-bgm-spec.R` (G1), `test-methods.R` (G3) | +| 6 | `test: defensive tests (tier 2)` | T9, T20, T21, T24, G4, G5, G7 | + +### M.6 Reference implementation for likelihood tests + +Likelihood tests (T1–T3, T10–T12) need R-level reference values. +The scaffolding test helpers that originally provided these were +Rcpp-exported functions in `test_mixed_mrf.cpp` (deleted in +commit `04b9562`). Two options: + +**(a) Pure-R reference functions.** Write compact R functions that +compute `log_conditional_omrf(s)`, `log_conditional_ggm()`, and +`log_marginal_omrf(s)` using base-R matrix operations. These are +10–20 lines each and serve as the gold standard. Place in +`tests/testthat/helper-mixed-mrf-reference.R`. + +**(b) Cross-validate against mixedGM.** Call +`mixedGM::rcpp_log_pl_conditional_omrf()` etc. from the test. Requires +`mixedGM` as a `Suggests` dependency or a `skip_if_not_installed()` +guard. + +Option (a) is preferred: no external dependency, self-contained, and +exercises a different code path than the C++ implementation. + +--- + +## Phase N — Alternative proposals for GGM edge updates + +The current edge birth/death proposals for the continuous part of the +mixed MRF (and the standalone GGM) use an adaptive random-walk +Metropolis-Hastings scheme: the birth move draws +$\epsilon \sim \mathcal{N}(0,\sigma_{ij})$ on a reparameterized scale, +and the death move proposes setting the off-diagonal to zero. Proposal +standard deviations $\sigma_{ij}$ are tuned via Robbins-Monro during +warmup. + +Van den Bergh, Clyde, Raftery, and Marsman (in preparation) show that +the MoMS (mixtures of mutually singular distributions) framework used in +bgms is equivalent to RJMCMC in terms of the Metropolis-Hastings +acceptance probability. However, the paper also demonstrates that +RJMCMC can achieve higher effective sample size (ESS) per iteration +in practice, because it allows more flexible proposal distributions +that better match the target. In principle, the MoMS framework admits +any proposal mechanism — the current random-walk proposal is a +convenience, not a requirement. + +This phase investigates alternative proposal distributions for the +conditional GGM edge updates ($K_{yy}$) and cross-type edge updates +($K_{xy}$), with the goal of improving edge-indicator mixing and ESS. +The same ideas apply to the standalone `GGMModel`. + +### N.1 Current proposal anatomy + +Both `GGMModel` and `MixedMRFModel` use the same proposal pattern +for $K_{yy}$ edges: + +**Birth** ($\gamma_{ij}: 0 \to 1$): +1. Draw $\epsilon \sim \mathcal{N}(0, \sigma_{ij})$. +2. Set $\omega_{ij}^* = C_3 \cdot \epsilon$ (reparameterized via + Cholesky constants). +3. Constrain $\omega_{jj}^*$ to maintain positive definiteness. +4. Accept with MH ratio combining likelihood ratio, Cauchy slab + prior, and $\mathcal{N}(0, \sigma_{ij})$ proposal density. + +**Death** ($\gamma_{ij}: 1 \to 0$): +1. Set $\omega_{ij}^* = 0$. +2. Constrain $\omega_{jj}^*$. +3. Accept with the reverse MH ratio. + +The proposal is symmetric on the $\epsilon$ scale. The +Robbins-Monro adaptation targets acceptance rate 0.44. + +### N.2 Candidate alternatives + +#### (a) Posterior-informed birth proposals + +Instead of drawing from $\mathcal{N}(0, \sigma_{ij})$, use a +proposal centered on a point estimate of $\omega_{ij}$ conditional +on the current state: + +$$\epsilon \sim \mathcal{N}\!\left(\hat{\omega}_{ij}^{\text{cond}},\,\sigma_{ij}\right)$$ + +where $\hat{\omega}_{ij}^{\text{cond}}$ is derived from the +conditional posterior mode. For the Gaussian likelihood with +Cauchy slab, the conditional mode given the sufficient statistics +$S = X^\top X$ and the rest of $\Omega$ can be computed in +closed form as a function of $S_{ij}$, $\Sigma_{ij}^{(-ij)}$, +and $n$. This turns the birth proposal into a near-optimal +independent proposal. + +The death proposal remains deterministic (set to zero), so +the MH ratio adjusts by replacing the reverse-proposal +$q(\omega_{ij} \mid 0)$ with +$\mathcal{N}(\omega_{ij} \mid \hat{\omega}_{ij}^{\text{cond}}, \sigma_{ij})$. + +#### (b) Exchange-type proposals + +For the within-model parameter update (when $\gamma_{ij} = 1$), +replace the random-walk proposal with a Gibbs draw from the +conditional posterior of $\omega_{ij}$ given the rest of $\Omega$. +Under the Gaussian likelihood with a Cauchy slab, this conditional +posterior is not available in closed form, but a single Newton step +or a Laplace approximation to the conditional can serve as a +high-quality proposal. + +#### (c) Block proposals for $K_{xy}$ + +The current $K_{xy}$ birth/death proposals update one element at a +time. Because each $K_{xy}$ change affects the conditional mean +$\mu_y + 2\,K_{xy}^\top x$, nearby $K_{xy}$ elements can be +strongly correlated in the posterior. A block proposal that updates +an entire row $K_{xy,i\cdot}$ simultaneously may improve mixing. +The NUTS sampler already handles $K_{xy}$ as part of the +gradient-based block, so this mainly benefits the Metropolis path. + +### N.3 Evaluation plan + +1. **Baseline ESS.** Run the current sampler on three benchmark + problems (p=4/q=3, p=8/q=6, p=4/q=6) with 50,000 iterations + after warmup. Record per-parameter ESS, per-edge-indicator ESS, + and bulk/tail ESS. +2. **Implement candidate (a).** Add `update_edge_indicator_Kyy_informed()` + as an alternative to `update_edge_indicator_Kyy()`. Selection via + a compile-time or constructor flag (`proposal_type`). +3. **Comparison.** Run the same benchmarks with the informed proposal. + Compare ESS, ESS/second, and acceptance rates. Focus on the + edge-indicator ESS (the primary bottleneck). +4. **Evaluate (b) and (c)** if (a) shows improvement. Otherwise, + document findings and close the phase. +5. **Apply to standalone GGM.** If the improved proposal works for + the mixed MRF $K_{yy}$, port it to `GGMModel` which uses the + same Cholesky reparameterization. + +### N.4 Deliverables + +| File | Content | +|------|---------| +| `dev/mixedmrf/proposal_study.md` | Design notes, derivation of informed proposal | +| `dev/tests/validation/group10_proposal_comparison.R` | Benchmark script | +| `dev/tests/validation/output/group10_proposal_comparison.pdf` | ESS comparison plots | +| `src/models/mixed/mixed_mrf_metropolis.cpp` | New proposal function(s) if adopted | +| `src/models/ggm/ggm_model.cpp` | Port to standalone GGM if adopted | + +--- + ## Testing strategy + + ### Existing test infrastructure (from mixedGM) The mixedGM prototype already provides comprehensive tests that can be adapted diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 06f7a1b3..477ea174 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -310,8 +310,8 @@ BEGIN_RCPP END_RCPP } // sample_mixed_mrf -Rcpp::List sample_mixed_mrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda, const std::string& sampler_type, const double target_acceptance, const int max_tree_depth, const int num_leapfrogs); -RcppExport SEXP _bgms_sample_mixed_mrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP, SEXP sampler_typeSEXP, SEXP target_acceptanceSEXP, SEXP max_tree_depthSEXP, SEXP num_leapfrogsSEXP) { +Rcpp::List sample_mixed_mrf(const Rcpp::List& inputFromR, const arma::mat& prior_inclusion_prob, const arma::imat& initial_edge_indicators, const int no_iter, const int no_warmup, const int no_chains, const bool edge_selection, const int seed, const int no_threads, const int progress_type, const std::string& edge_prior, const double beta_bernoulli_alpha, const double beta_bernoulli_beta, const double beta_bernoulli_alpha_between, const double beta_bernoulli_beta_between, const double dirichlet_alpha, const double lambda, const std::string& sampler_type, const double target_acceptance, const int max_tree_depth, const int num_leapfrogs, const bool na_impute, const Rcpp::Nullable missing_index_discrete_nullable, const Rcpp::Nullable missing_index_continuous_nullable); +RcppExport SEXP _bgms_sample_mixed_mrf(SEXP inputFromRSEXP, SEXP prior_inclusion_probSEXP, SEXP initial_edge_indicatorsSEXP, SEXP no_iterSEXP, SEXP no_warmupSEXP, SEXP no_chainsSEXP, SEXP edge_selectionSEXP, SEXP seedSEXP, SEXP no_threadsSEXP, SEXP progress_typeSEXP, SEXP edge_priorSEXP, SEXP beta_bernoulli_alphaSEXP, SEXP beta_bernoulli_betaSEXP, SEXP beta_bernoulli_alpha_betweenSEXP, SEXP beta_bernoulli_beta_betweenSEXP, SEXP dirichlet_alphaSEXP, SEXP lambdaSEXP, SEXP sampler_typeSEXP, SEXP target_acceptanceSEXP, SEXP max_tree_depthSEXP, SEXP num_leapfrogsSEXP, SEXP na_imputeSEXP, SEXP missing_index_discrete_nullableSEXP, SEXP missing_index_continuous_nullableSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; @@ -336,7 +336,10 @@ BEGIN_RCPP Rcpp::traits::input_parameter< const double >::type target_acceptance(target_acceptanceSEXP); Rcpp::traits::input_parameter< const int >::type max_tree_depth(max_tree_depthSEXP); Rcpp::traits::input_parameter< const int >::type num_leapfrogs(num_leapfrogsSEXP); - rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs)); + Rcpp::traits::input_parameter< const bool >::type na_impute(na_imputeSEXP); + Rcpp::traits::input_parameter< const Rcpp::Nullable >::type missing_index_discrete_nullable(missing_index_discrete_nullableSEXP); + Rcpp::traits::input_parameter< const Rcpp::Nullable >::type missing_index_continuous_nullable(missing_index_continuous_nullableSEXP); + rcpp_result_gen = Rcpp::wrap(sample_mixed_mrf(inputFromR, prior_inclusion_prob, initial_edge_indicators, no_iter, no_warmup, no_chains, edge_selection, seed, no_threads, progress_type, edge_prior, beta_bernoulli_alpha, beta_bernoulli_beta, beta_bernoulli_alpha_between, beta_bernoulli_beta_between, dirichlet_alpha, lambda, sampler_type, target_acceptance, max_tree_depth, num_leapfrogs, na_impute, missing_index_discrete_nullable, missing_index_continuous_nullable)); return rcpp_result_gen; END_RCPP } @@ -405,7 +408,7 @@ static const R_CallMethodDef CallEntries[] = { {"_bgms_sample_mixed_mrf_gibbs", (DL_FUNC) &_bgms_sample_mixed_mrf_gibbs, 11}, {"_bgms_run_mixed_simulation_parallel", (DL_FUNC) &_bgms_run_mixed_simulation_parallel, 16}, {"_bgms_sample_ggm", (DL_FUNC) &_bgms_sample_ggm, 19}, - {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 21}, + {"_bgms_sample_mixed_mrf", (DL_FUNC) &_bgms_sample_mixed_mrf, 24}, {"_bgms_sample_omrf", (DL_FUNC) &_bgms_sample_omrf, 24}, {"_bgms_compute_Vn_mfm_sbm", (DL_FUNC) &_bgms_compute_Vn_mfm_sbm, 4}, {NULL, NULL, 0} diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 4fe7a9d4..5e980db7 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -126,6 +126,9 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) max_cats_(other.max_cats_), is_ordinal_variable_(other.is_ordinal_variable_), baseline_category_(other.baseline_category_), + missing_index_discrete_(other.missing_index_discrete_), + missing_index_continuous_(other.missing_index_continuous_), + has_missing_(other.has_missing_), counts_per_category_(other.counts_per_category_), blume_capel_stats_(other.blume_capel_stats_), mux_(other.mux_), @@ -546,6 +549,133 @@ std::unique_ptr MixedMRFModel::clone() const { } +// ============================================================================= +// Missing data imputation +// ============================================================================= + +void MixedMRFModel::set_missing_data(const arma::imat& missing_discrete, + const arma::imat& missing_continuous) { + missing_index_discrete_ = missing_discrete; + missing_index_continuous_ = missing_continuous; + has_missing_ = (missing_index_discrete_.n_rows > 0 || + missing_index_continuous_.n_rows > 0); +} + +void MixedMRFModel::impute_missing() { + if(!has_missing_) return; + + // --- Phase 1: Impute discrete entries --- + const int num_disc_missing = missing_index_discrete_.n_rows; + if(num_disc_missing > 0) { + arma::vec category_probabilities(max_cats_ + 1); + + for(int miss = 0; miss < num_disc_missing; miss++) { + const int person = missing_index_discrete_(miss, 0); + const int variable = missing_index_discrete_(miss, 1); + const int num_cats = num_categories_(variable); + + // Rest score: sum_t x_vt * Kxx(t,s) + 2 * sum_j y_vj * Kxy(s,j) + // Kxx diagonal is zero, so no self-interaction subtraction needed + double rest_v = 0.0; + for(size_t t = 0; t < p_; t++) { + rest_v += discrete_observations_dbl_(person, t) * Kxx_(t, variable); + } + for(size_t j = 0; j < q_; j++) { + rest_v += 2.0 * continuous_observations_(person, j) * Kxy_(variable, j); + } + + double cumsum = 0.0; + + if(is_ordinal_variable_(variable)) { + // P(x=0) = 1, P(x=c) ∝ exp(c * rest + mux(s, c-1)) + cumsum = 1.0; + category_probabilities(0) = cumsum; + for(int c = 1; c <= num_cats; c++) { + double exponent = static_cast(c) * rest_v + + mux_(variable, c - 1); + cumsum += std::exp(exponent); + category_probabilities(c) = cumsum; + } + } else { + // Blume-Capel: categories centered at baseline + const int ref = baseline_category_(variable); + double alpha = mux_(variable, 0); + double beta = mux_(variable, 1); + cumsum = 0.0; + for(int cat = 0; cat <= num_cats; cat++) { + const int score = cat - ref; + double exponent = alpha * score + + beta * score * score + + score * rest_v; + cumsum += std::exp(exponent); + category_probabilities(cat) = cumsum; + } + } + + // Sample via inverse-transform + double u = runif(rng_) * cumsum; + int sampled = 0; + while(u > category_probabilities(sampled)) { + sampled++; + } + + int new_value = sampled; + if(!is_ordinal_variable_(variable)) { + new_value -= baseline_category_(variable); + } + const int old_value = discrete_observations_(person, variable); + + if(new_value != old_value) { + discrete_observations_(person, variable) = new_value; + discrete_observations_dbl_(person, variable) = + static_cast(new_value); + + if(is_ordinal_variable_(variable)) { + counts_per_category_(old_value, variable)--; + counts_per_category_(new_value, variable)++; + } else { + blume_capel_stats_(0, variable) += (new_value - old_value); + blume_capel_stats_(1, variable) += + (new_value * new_value - old_value * old_value); + } + } + } + } + + // --- Phase 2: Refresh conditional_mean_ (depends on discrete data) --- + if(num_disc_missing > 0 && missing_index_continuous_.n_rows > 0) { + recompute_conditional_mean(); + } + + // --- Phase 3: Impute continuous entries --- + const int num_cont_missing = missing_index_continuous_.n_rows; + if(num_cont_missing > 0) { + for(int miss = 0; miss < num_cont_missing; miss++) { + const int person = missing_index_continuous_(miss, 0); + const int variable = missing_index_continuous_(miss, 1); + + // Conditional: y_vj | y_{v,-j}, x ~ N(mu*, 1/Kyy_jj) + // mu* = M_vj - (1/Kyy_jj) * sum_{k!=j} Kyy_jk * (y_vk - M_vk) + double cond_mean = conditional_mean_(person, variable); + for(size_t k = 0; k < q_; k++) { + if(k != static_cast(variable)) { + cond_mean -= (Kyy_(variable, k) / Kyy_(variable, variable)) * + (continuous_observations_(person, k) - + conditional_mean_(person, k)); + } + } + double cond_sd = std::sqrt(1.0 / Kyy_(variable, variable)); + + continuous_observations_(person, variable) = + rnorm(rng_, cond_mean, cond_sd); + } + } + + // Invalidate gradient cache (observations changed) + invalidate_gradient_cache(); +} + + // ============================================================================= // Stubs (to be implemented in later phases) // ============================================================================= diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index be9d0ea5..aa9d9a85 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -80,8 +80,8 @@ class MixedMRFModel : public BaseModel { bool has_adaptive_metropolis() const override { return true; } /** @return true when edge selection is enabled. */ bool has_edge_selection() const override { return edge_selection_; } - /** @return false (missing data not yet supported). */ - bool has_missing_data() const override { return false; } + /** @return true when missing-data imputation is active. */ + bool has_missing_data() const override { return has_missing_; } // ========================================================================= // Core sampling methods @@ -227,11 +227,20 @@ class MixedMRFModel : public BaseModel { } // ========================================================================= - // Missing data (not yet supported) + // Missing data // ========================================================================= - /** No-op: missing data not supported in this PR. */ - void impute_missing() override {} + /** Impute missing entries from full-conditional distributions. */ + void impute_missing() override; + + /** + * Register missing-data locations for discrete and continuous sub-matrices. + * + * @param missing_discrete M_d x 2 matrix of 0-based (row, col) indices into discrete_observations_ + * @param missing_continuous M_c x 2 matrix of 0-based (row, col) indices into continuous_observations_ + */ + void set_missing_data(const arma::imat& missing_discrete, + const arma::imat& missing_continuous); private: @@ -259,6 +268,14 @@ class MixedMRFModel : public BaseModel { arma::uvec is_ordinal_variable_; ///< 1 = ordinal, 0 = Blume-Capel (p-vector) arma::ivec baseline_category_; ///< Reference category per discrete variable (p-vector) + // ========================================================================= + // Missing data + // ========================================================================= + + arma::imat missing_index_discrete_; ///< M_d x 2 (row, col) for missing discrete entries + arma::imat missing_index_continuous_; ///< M_c x 2 (row, col) for missing continuous entries + bool has_missing_ = false; ///< Whether imputation is active + // ========================================================================= // Sufficient statistics // ========================================================================= diff --git a/src/sample_mixed.cpp b/src/sample_mixed.cpp index 7a208a1d..d8b3fa06 100644 --- a/src/sample_mixed.cpp +++ b/src/sample_mixed.cpp @@ -46,6 +46,9 @@ // @param target_acceptance Target acceptance rate for gradient-based samplers // @param max_tree_depth Maximum tree depth for NUTS // @param num_leapfrogs Number of leapfrog steps for HMC +// @param na_impute Whether to impute missing data +// @param missing_index_discrete Matrix of missing discrete indices (n_miss x 2, 0-based) +// @param missing_index_continuous Matrix of missing continuous indices (n_miss x 2, 0-based) // // @return List with per-chain results including samples and diagnostics // [[Rcpp::export]] @@ -70,7 +73,10 @@ Rcpp::List sample_mixed_mrf( const std::string& sampler_type = "mh", const double target_acceptance = 0.80, const int max_tree_depth = 10, - const int num_leapfrogs = 100 + const int num_leapfrogs = 100, + const bool na_impute = false, + const Rcpp::Nullable missing_index_discrete_nullable = R_NilValue, + const Rcpp::Nullable missing_index_continuous_nullable = R_NilValue ) { // Extract model inputs from R list arma::imat discrete_obs = Rcpp::as(inputFromR["discrete_observations"]); @@ -93,6 +99,20 @@ Rcpp::List sample_mixed_mrf( seed ); + // Set up missing data imputation + if(na_impute) { + arma::imat missing_disc, missing_cont; + if(missing_index_discrete_nullable.isNotNull()) { + missing_disc = Rcpp::as( + Rcpp::IntegerMatrix(missing_index_discrete_nullable.get())); + } + if(missing_index_continuous_nullable.isNotNull()) { + missing_cont = Rcpp::as( + Rcpp::IntegerMatrix(missing_index_continuous_nullable.get())); + } + model.set_missing_data(missing_disc, missing_cont); + } + // Create edge prior EdgePrior edge_prior_enum = edge_prior_from_string(edge_prior); auto edge_prior_obj = create_edge_prior( @@ -109,7 +129,7 @@ Rcpp::List sample_mixed_mrf( config.no_warmup = no_warmup; config.edge_selection = edge_selection; config.seed = seed; - config.na_impute = false; + config.na_impute = na_impute; config.target_acceptance = target_acceptance; config.max_tree_depth = max_tree_depth; config.num_leapfrogs = num_leapfrogs; From cad34262250d93c6408bdf7935ac6bfd9d08dfdb Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 08:14:36 +0100 Subject: [PATCH 30/60] perf: use MY_LOG/MY_EXP macros in GGM and OMRF models (Phase J) --- src/models/ggm/ggm_model.cpp | 43 +++++++++++++++++----------------- src/models/omrf/omrf_model.cpp | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/models/ggm/ggm_model.cpp b/src/models/ggm/ggm_model.cpp index 573d37df..7c200c3c 100644 --- a/src/models/ggm/ggm_model.cpp +++ b/src/models/ggm/ggm_model.cpp @@ -1,5 +1,6 @@ #include "models/ggm/ggm_model.h" #include "rng/rng_utils.h" +#include "math/explog_macros.h" #include "models/ggm/cholupdate.h" #include "mcmc/execution/step_result.h" #include "mcmc/execution/warmup_schedule.h" @@ -8,16 +9,16 @@ void GGMModel::get_constants(size_t i, size_t j) { double logdet_omega = cholesky_helpers::get_log_det(cholesky_of_precision_); - double log_adj_omega_ii = logdet_omega + std::log(std::abs(covariance_matrix_(i, i))); - double log_adj_omega_ij = logdet_omega + std::log(std::abs(covariance_matrix_(i, j))); - double log_adj_omega_jj = logdet_omega + std::log(std::abs(covariance_matrix_(j, j))); + double log_adj_omega_ii = logdet_omega + MY_LOG(std::abs(covariance_matrix_(i, i))); + double log_adj_omega_ij = logdet_omega + MY_LOG(std::abs(covariance_matrix_(i, j))); + double log_adj_omega_jj = logdet_omega + MY_LOG(std::abs(covariance_matrix_(j, j))); double inv_omega_sub_j1j1 = cholesky_helpers::compute_inv_submatrix_i(covariance_matrix_, i, j, j); - double log_abs_inv_omega_sub_jj = log_adj_omega_ii + std::log(std::abs(inv_omega_sub_j1j1)); - double Phi_q1q = (2 * std::signbit(covariance_matrix_(i, j)) - 1) * std::exp( + double log_abs_inv_omega_sub_jj = log_adj_omega_ii + MY_LOG(std::abs(inv_omega_sub_j1j1)); + double Phi_q1q = (2 * std::signbit(covariance_matrix_(i, j)) - 1) * MY_EXP( (log_adj_omega_ij - (log_adj_omega_jj + log_abs_inv_omega_sub_jj) / 2) ); - double Phi_q1q1 = std::exp((log_adj_omega_jj - log_abs_inv_omega_sub_jj) / 2); + double Phi_q1q1 = MY_EXP((log_adj_omega_jj - log_abs_inv_omega_sub_jj) / 2); constants_[0] = Phi_q1q; constants_[1] = Phi_q1q1; @@ -41,7 +42,7 @@ double GGMModel::log_density_impl(const arma::mat& omega, const arma::mat& phi) double logdet_omega = cholesky_helpers::get_log_det(phi); double trace_prod = arma::accu(omega % suf_stat_); - double log_likelihood = n_ * (p_ * log(2 * arma::datum::pi) / 2 + logdet_omega / 2) - trace_prod / 2; + double log_likelihood = n_ * (p_ * MY_LOG(2 * arma::datum::pi) / 2 + logdet_omega / 2) - trace_prod / 2; return log_likelihood; } @@ -57,7 +58,7 @@ double GGMModel::log_density_impl_edge(size_t i, size_t j) const { double cc12 = 1 - (covariance_matrix_(i, j) * Ui2 + covariance_matrix_(j, j) * Uj2); double cc22 = 0 + Ui2 * Ui2 * covariance_matrix_(i, i) + 2 * Ui2 * Uj2 * covariance_matrix_(i, j) + Uj2 * Uj2 * covariance_matrix_(j, j); - double logdet = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + double logdet = MY_LOG(std::abs(cc11 * cc22 - cc12 * cc12)); // logdet - (logdet(aOmega_prop) - logdet(aOmega)) double trace_prod = -2 * (suf_stat_(j, j) * Uj2 + suf_stat_(i, j) * Ui2); @@ -75,7 +76,7 @@ double GGMModel::log_density_impl_diag(size_t j) const { double cc12 = 1 - covariance_matrix_(j, j) * Uj2; double cc22 = 0 + Uj2 * Uj2 * covariance_matrix_(j, j); - double logdet = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + double logdet = MY_LOG(std::abs(cc11 * cc22 - cc12 * cc12)); double trace_prod = -2 * suf_stat_(j, j) * Uj2; double log_likelihood_ratio = (n_ * logdet - trace_prod) / 2; @@ -111,7 +112,7 @@ void GGMModel::update_edge_parameter(size_t i, size_t j, int iteration) { ln_alpha += R::dcauchy(precision_proposal_(i, j), 0.0, pairwise_scale_, true); ln_alpha -= R::dcauchy(precision_matrix_(i, j), 0.0, pairwise_scale_, true); - if (std::log(runif(rng_)) < ln_alpha) { + if (MY_LOG(runif(rng_)) < ln_alpha) { double omega_ij_old = precision_matrix_(i, j); double omega_jj_old = precision_matrix_(j, j); @@ -165,7 +166,7 @@ void GGMModel::cholesky_update_after_edge(double omega_ij_old, double omega_jj_o void GGMModel::update_diagonal_parameter(size_t i, int iteration) { double logdet_omega = cholesky_helpers::get_log_det(cholesky_of_precision_); - double logdet_omega_sub_ii = logdet_omega + std::log(covariance_matrix_(i, i)); + double logdet_omega_sub_ii = logdet_omega + MY_LOG(covariance_matrix_(i, i)); size_t e = i * (i + 3) / 2; // parameter index in vectorized form (column-major upper triangle, i==j) double proposal_sd = proposal_sds_(e); @@ -174,15 +175,15 @@ void GGMModel::update_diagonal_parameter(size_t i, int iteration) { double theta_prop = rnorm(rng_, theta_curr, proposal_sd); precision_proposal_ = precision_matrix_; - precision_proposal_(i, i) = precision_matrix_(i, i) - std::exp(theta_curr) * std::exp(theta_curr) + std::exp(theta_prop) * std::exp(theta_prop); + precision_proposal_(i, i) = precision_matrix_(i, i) - MY_EXP(theta_curr) * MY_EXP(theta_curr) + MY_EXP(theta_prop) * MY_EXP(theta_prop); double ln_alpha = log_density_impl_diag(i); - ln_alpha += R::dgamma(exp(theta_prop), 1.0, 1.0, true); - ln_alpha -= R::dgamma(exp(theta_curr), 1.0, 1.0, true); + ln_alpha += R::dgamma(MY_EXP(theta_prop), 1.0, 1.0, true); + ln_alpha -= R::dgamma(MY_EXP(theta_curr), 1.0, 1.0, true); ln_alpha += theta_prop - theta_curr; // Jacobian adjustment - if (std::log(runif(rng_)) < ln_alpha) { + if (MY_LOG(runif(rng_)) < ln_alpha) { double omega_ii = precision_matrix_(i, i); precision_matrix_(i, i) = precision_proposal_(i, i); cholesky_update_after_diag(omega_ii, i); @@ -246,12 +247,12 @@ void GGMModel::update_edge_indicator_parameter_pair(size_t i, size_t j) { // } - ln_alpha += std::log(1.0 - inclusion_probability_(i, j)) - std::log(inclusion_probability_(i, j)); + ln_alpha += MY_LOG(1.0 - inclusion_probability_(i, j)) - MY_LOG(inclusion_probability_(i, j)); - ln_alpha += R::dnorm(precision_matrix_(i, j) / constants_[3], 0.0, proposal_sd, true) - std::log(constants_[3]); + ln_alpha += R::dnorm(precision_matrix_(i, j) / constants_[3], 0.0, proposal_sd, true) - MY_LOG(constants_[3]); ln_alpha -= R::dcauchy(precision_matrix_(i, j), 0.0, pairwise_scale_, true); - if (std::log(runif(rng_)) < ln_alpha) { + if (MY_LOG(runif(rng_)) < ln_alpha) { // Store old values for Cholesky update double omega_ij_old = precision_matrix_(i, j); @@ -295,15 +296,15 @@ void GGMModel::update_edge_indicator_parameter_pair(size_t i, size_t j) { // Rcpp::Rcout << "ln_alpha: " << ln_alpha << ", ln_alpha_ref: " << ln_alpha_ref << std::endl; // } // } - ln_alpha += std::log(inclusion_probability_(i, j)) - std::log(1.0 - inclusion_probability_(i, j)); + ln_alpha += MY_LOG(inclusion_probability_(i, j)) - MY_LOG(1.0 - inclusion_probability_(i, j)); // Prior change: add slab (Cauchy prior) ln_alpha += R::dcauchy(omega_prop_ij, 0.0, pairwise_scale_, true); // Proposal term: proposed edge value given it was generated from truncated normal - ln_alpha -= R::dnorm(omega_prop_ij / constants_[3], 0.0, proposal_sd, true) - std::log(constants_[3]); + ln_alpha -= R::dnorm(omega_prop_ij / constants_[3], 0.0, proposal_sd, true) - MY_LOG(constants_[3]); - if (std::log(runif(rng_)) < ln_alpha) { + if (MY_LOG(runif(rng_)) < ln_alpha) { // Accept: turn ON the edge // Store old values for Cholesky update double omega_ij_old = precision_matrix_(i, j); diff --git a/src/models/omrf/omrf_model.cpp b/src/models/omrf/omrf_model.cpp index 6dbe6189..5fc2c886 100644 --- a/src/models/omrf/omrf_model.cpp +++ b/src/models/omrf/omrf_model.cpp @@ -586,7 +586,7 @@ double OMRFModel::log_pseudoposterior_with_state( double log_post = 0.0; auto log_beta_prior = [this](double x) { - return x * main_alpha_ - std::log1p(std::exp(x)) * (main_alpha_ + main_beta_); + return x * main_alpha_ - std::log1p(MY_EXP(x)) * (main_alpha_ + main_beta_); }; // Main effect contributions (priors and sufficient statistics) From 676b49fd263571ee10af14ebf3bb270dc632d858 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 10:29:13 +0100 Subject: [PATCH 31/60] docs: naming conformance + MY_LOG/MY_EXP for MixedMRFModel (audit K, part 1) --- R/build_output.R | 75 ++-- src/mcmc/samplers/hybrid_nuts_sampler.h | 2 +- src/models/mixed/mixed_mrf_gradient.cpp | 262 ++++++------- src/models/mixed/mixed_mrf_likelihoods.cpp | 52 +-- src/models/mixed/mixed_mrf_metropolis.cpp | 430 ++++++++++----------- src/models/mixed/mixed_mrf_model.cpp | 293 +++++++------- src/models/mixed/mixed_mrf_model.h | 134 +++---- 7 files changed, 625 insertions(+), 623 deletions(-) diff --git a/R/build_output.R b/R/build_output.R index c171342f..f8190e0b 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -325,10 +325,11 @@ build_output_bgm = function(spec, raw) { # ============================================================================== # # Handles the mixed discrete + continuous parameter layout: -# C++ flat vector: [mux | Kxx_ut | muy | Kxy | Kyy_ut] +# C++ flat vector: [main_discrete | pairwise_discrete_ut | main_continuous | pairwise_cross | pairwise_continuous_ut] # C++ indicators: [Gxx_ut | Gyy_ut | Gxy] # -# Splits into main (mux, muy, Kyy_diag) and pairwise (Kxx, Kyy_offdiag, Kxy), +# Splits into main (discrete thresholds, continuous means, precision diagonal) +# and pairwise (discrete, precision off-diag, cross), # builds (p+q)×(p+q) interaction and indicator matrices, and maps internal # variable order (discrete first, continuous second) back to original column # order from the user's data. @@ -359,20 +360,20 @@ build_output_mixed_mrf = function(spec, raw) { nxy = as.integer(p * q) # Offsets in the flat vector (1-based) - mux_start = 1L - mux_end = nt - kxx_start = nt + 1L - kxx_end = nt + nxx - muy_start = nt + nxx + 1L - muy_end = nt + nxx + q - kxy_start = nt + nxx + q + 1L - kxy_end = nt + nxx + q + nxy - kyy_start = nt + nxx + q + nxy + 1L - kyy_end = nt + nxx + q + nxy + nyy_total - - # Kyy diagonal indices within the Kyy block - kyy_diag_within = integer(q) - kyy_offdiag_within = integer(nyy_offdiag) + main_discrete_start = 1L + main_discrete_end = nt + pairwise_discrete_start = nt + 1L + pairwise_discrete_end = nt + nxx + main_continuous_start = nt + nxx + 1L + main_continuous_end = nt + nxx + q + pairwise_cross_start = nt + nxx + q + 1L + pairwise_cross_end = nt + nxx + q + nxy + pairwise_continuous_start = nt + nxx + q + nxy + 1L + pairwise_continuous_end = nt + nxx + q + nxy + nyy_total + + # Precision diagonal indices within the pairwise_continuous block + precision_diag_within = integer(q) + precision_offdiag_within = integer(nyy_offdiag) k_diag = 0L k_off = 0L pos = 0L @@ -381,34 +382,34 @@ build_output_mixed_mrf = function(spec, raw) { pos = pos + 1L if(i == j) { k_diag = k_diag + 1L - kyy_diag_within[k_diag] = pos + precision_diag_within[k_diag] = pos } else { k_off = k_off + 1L - kyy_offdiag_within[k_off] = pos + precision_offdiag_within[k_off] = pos } } } - kyy_diag_abs = kyy_start - 1L + kyy_diag_within - kyy_offdiag_abs = kyy_start - 1L + kyy_offdiag_within + precision_diag_abs = pairwise_continuous_start - 1L + precision_diag_within + precision_offdiag_abs = pairwise_continuous_start - 1L + precision_offdiag_within - # Main indices: mux + muy + Kyy diagonal + # Main indices: discrete thresholds + continuous means + precision diagonal main_idx = c( - seq(mux_start, mux_end), - seq(muy_start, muy_end), - kyy_diag_abs + seq(main_discrete_start, main_discrete_end), + seq(main_continuous_start, main_continuous_end), + precision_diag_abs ) - # Pairwise indices: Kxx + Kyy off-diag + Kxy + # Pairwise indices: discrete + precision off-diag + cross pairwise_idx = c( - if(nxx > 0) seq(kxx_start, kxx_end) else integer(0), - kyy_offdiag_abs, - if(nxy > 0) seq(kxy_start, kxy_end) else integer(0) + if(nxx > 0) seq(pairwise_discrete_start, pairwise_discrete_end) else integer(0), + precision_offdiag_abs, + if(nxy > 0) seq(pairwise_cross_start, pairwise_cross_end) else integer(0) ) # --- Indicator index layout ------------------------------------------------- # C++ indicator vector: [Gxx_ut | Gyy_ut | Gxy] # All are pairwise, so indicator_samples maps directly to pairwise order: - # Kxx edges, Kyy edges, Kxy edges — same order as pairwise_idx above. + # Discrete, continuous, cross edges — same order as pairwise_idx above. # --- Normalize raw output per chain ----------------------------------------- raw = lapply(raw, function(chain) { @@ -460,7 +461,7 @@ build_output_mixed_mrf = function(spec, raw) { all_internal_names = c(disc_names, cont_names) edge_names = character() - # Kxx edges (discrete-discrete) + # Discrete-discrete edges if(p > 1) { for(i in seq_len(p - 1)) { for(j in seq(i + 1, p)) { @@ -471,7 +472,7 @@ build_output_mixed_mrf = function(spec, raw) { } } } - # Kyy edges (continuous-continuous, off-diagonal) + # Continuous-continuous edges (off-diagonal) if(q > 1) { for(i in seq_len(q - 1)) { for(j in seq(i + 1, q)) { @@ -482,7 +483,7 @@ build_output_mixed_mrf = function(spec, raw) { } } } - # Kxy edges (discrete-continuous) + # Cross edges (discrete-continuous) if(p > 0 && q > 0) { for(i in seq_len(p)) { for(j in seq_len(q)) { @@ -549,9 +550,9 @@ build_output_mixed_mrf = function(spec, raw) { # Continuous main effects: q × 2 matrix (mean, precision) pmm_cont = matrix(NA, nrow = q, ncol = 2) - muy_means = main_summary$mean[nt + seq_len(q)] + continuous_means = main_summary$mean[nt + seq_len(q)] kyy_diag_means = main_summary$mean[nt + q + seq_len(q)] - pmm_cont[, 1] = muy_means + pmm_cont[, 1] = continuous_means pmm_cont[, 2] = kyy_diag_means rownames(pmm_cont) = cont_names colnames(pmm_cont) = c("mean", "precision") @@ -571,7 +572,7 @@ build_output_mixed_mrf = function(spec, raw) { pw_means = pairwise_summary$mean idx = 0L - # Kxx block + # Discrete-discrete block if(p > 1) { for(i in seq_len(p - 1)) { for(j in seq(i + 1, p)) { @@ -584,7 +585,7 @@ build_output_mixed_mrf = function(spec, raw) { } } - # Kyy off-diagonal block + # Continuous-continuous off-diagonal block if(q > 1) { for(i in seq_len(q - 1)) { for(j in seq(i + 1, q)) { @@ -597,7 +598,7 @@ build_output_mixed_mrf = function(spec, raw) { } } - # Kxy block + # Cross block if(p > 0 && q > 0) { for(i in seq_len(p)) { for(j in seq_len(q)) { diff --git a/src/mcmc/samplers/hybrid_nuts_sampler.h b/src/mcmc/samplers/hybrid_nuts_sampler.h index 30d508be..344d35d7 100644 --- a/src/mcmc/samplers/hybrid_nuts_sampler.h +++ b/src/mcmc/samplers/hybrid_nuts_sampler.h @@ -54,7 +54,7 @@ class HybridNUTSSampler : public GradientSamplerBase { // --- Phase 2: Kyy Metropolis step --- auto& mixed = static_cast(model); - mixed.do_kyy_metropolis_step(current_iteration_); + mixed.do_pairwise_continuous_metropolis_step(current_iteration_); return result; } diff --git a/src/models/mixed/mixed_mrf_gradient.cpp b/src/models/mixed/mixed_mrf_gradient.cpp index 4c1fec18..c4119afc 100644 --- a/src/models/mixed/mixed_mrf_gradient.cpp +++ b/src/models/mixed/mixed_mrf_gradient.cpp @@ -15,9 +15,9 @@ void MixedMRFModel::ensure_gradient_cache() { if(gradient_cache_valid_) return; - // --- Build index matrix for Kxx upper-triangular entries --- + // --- Build index matrix for pairwise_effects_discrete_ upper-triangular entries --- // Maps (i, j) to a position in the flat gradient vector (offset from - // the start of Kxx entries, which sits at num_main_). + // the start of pairwise_discrete entries, which sits at num_main_). kxx_index_cache_.set_size(p_, p_); kxx_index_cache_.zeros(); @@ -32,9 +32,9 @@ void MixedMRFModel::ensure_gradient_cache() { } } - // --- Build index matrix for Kxy entries --- + // --- Build index matrix for pairwise_effects_cross_ entries --- // Maps (i, j) to a position in the flat gradient vector (offset from - // the start of Kxy entries, which sits at num_main_ + active_kxx + q). + // the start of pairwise_cross entries, which sits at num_main_ + active_kxx + q). kxy_index_cache_.set_size(p_, q_); kxy_index_cache_.zeros(); @@ -49,15 +49,15 @@ void MixedMRFModel::ensure_gradient_cache() { } } - // muy offset in gradient vector - muy_grad_offset_ = num_main_ + num_active_kxx; + // main_effects_continuous_ offset in gradient vector + main_effects_continuous_grad_offset_ = num_main_ + num_active_kxx; // --- Precompute observed statistics portion of the gradient --- size_t active_dim = num_main_ + num_active_kxx + q_ + num_active_kxy; grad_obs_cache_.set_size(active_dim); grad_obs_cache_.zeros(); - // Observed statistics for discrete main effects (mux) + // Observed statistics for discrete main effects int offset = 0; for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { @@ -73,7 +73,7 @@ void MixedMRFModel::ensure_gradient_cache() { } } - // Observed statistics for Kxx edges + // Observed statistics for pairwise_effects_discrete_ edges for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(edge_indicators_(i, j) == 0) continue; @@ -86,7 +86,7 @@ void MixedMRFModel::ensure_gradient_cache() { } } - // No precomputed observed stats for muy or Kxy — those depend on + // No precomputed observed stats for means or cross effects — those depend on // continuous_observations_ combined with current parameters, so they // are computed fresh each logp_and_gradient call. @@ -111,45 +111,45 @@ void MixedMRFModel::invalidate_gradient_cache() { void MixedMRFModel::unvectorize_nuts_to_temps( const arma::vec& params, - arma::mat& temp_mux, - arma::mat& temp_Kxx, - arma::vec& temp_muy, - arma::mat& temp_Kxy + arma::mat& temp_main_discrete, + arma::mat& temp_pairwise_discrete, + arma::vec& temp_main_continuous, + arma::mat& temp_pairwise_cross ) const { size_t idx = 0; - // 1. mux + // 1. main_effects_discrete_ for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) { - temp_mux(s, c) = params(idx++); + temp_main_discrete(s, c) = params(idx++); } } else { - temp_mux(s, 0) = params(idx++); - temp_mux(s, 1) = params(idx++); + temp_main_discrete(s, 0) = params(idx++); + temp_main_discrete(s, 1) = params(idx++); } } - // 2. Kxx upper-triangular (active only) + // 2. pairwise_effects_discrete_ upper-triangular (active only) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(edge_indicators_(i, j) == 1) { - temp_Kxx(i, j) = params(idx++); - temp_Kxx(j, i) = temp_Kxx(i, j); + temp_pairwise_discrete(i, j) = params(idx++); + temp_pairwise_discrete(j, i) = temp_pairwise_discrete(i, j); } } } - // 3. muy + // 3. main_effects_continuous_ for(size_t j = 0; j < q_; ++j) { - temp_muy(j) = params(idx++); + temp_main_continuous(j) = params(idx++); } - // 4. Kxy row-major (active only) + // 4. pairwise_effects_cross_ row-major (active only) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(i, p_ + j) == 1) { - temp_Kxy(i, j) = params(idx++); + temp_pairwise_cross(i, j) = params(idx++); } } } @@ -170,16 +170,16 @@ arma::vec MixedMRFModel::gradient(const arma::vec& parameters) { // logp_and_gradient — conditional pseudo-likelihood // ============================================================================= // Computes the log pseudo-posterior and its gradient with respect to the -// NUTS parameters (mux, Kxx, muy, Kxy). Kyy is treated as fixed. +// NUTS parameters (μ_x, K_xx, μ_y, K_xy). K_yy is treated as fixed. // // The pseudo-log-posterior is: -// l(theta) = sum_s log p(x_s | x_{-s}, y) [OMRF conditionals] +// l(θ) = sum_s log p(x_s | x_{-s}, y) [OMRF conditionals] // + log p(y | x) [GGM conditional] -// + log pi(theta) [priors] +// + log π(θ) [priors] // -// For marginal PL, the OMRF conditionals use Theta = Kxx + 2 Kxy Σyy Kxy' -// instead of Kxx directly, and derive rest scores and denominator offsets -// from Theta. The GGM conditional is the same in both modes. +// For marginal PL, the OMRF conditionals use Θ = K_xx + 2 K_xy Σ_yy K_xy' +// instead of K_xx directly, and derive rest scores and denominator offsets +// from Θ. The GGM conditional is the same in both modes. // ============================================================================= std::pair MixedMRFModel::logp_and_gradient( @@ -188,16 +188,16 @@ std::pair MixedMRFModel::logp_and_gradient( ensure_gradient_cache(); // --- Unvectorize into temporaries --- - arma::mat temp_mux = mux_; - arma::mat temp_Kxx = Kxx_; - arma::vec temp_muy = muy_; - arma::mat temp_Kxy = Kxy_; - unvectorize_nuts_to_temps(parameters, temp_mux, temp_Kxx, temp_muy, temp_Kxy); + arma::mat temp_main_discrete = main_effects_discrete_; + arma::mat temp_pairwise_discrete = pairwise_effects_discrete_; + arma::vec temp_main_continuous = main_effects_continuous_; + arma::mat temp_pairwise_cross = pairwise_effects_cross_; + unvectorize_nuts_to_temps(parameters, temp_main_discrete, temp_pairwise_discrete, temp_main_continuous, temp_pairwise_cross); // --- Derived quantities --- - // Conditional mean: M_i = muy' + 2 x_i' Kxy Σyy (n x q) - arma::mat temp_cond_mean = arma::repmat(temp_muy.t(), n_, 1) - + 2.0 * discrete_observations_dbl_ * temp_Kxy * covariance_yy_; + // Conditional mean: M_i = μ_y' + 2 x_i' K_xy Σ_yy (n x q) + arma::mat temp_cond_mean = arma::repmat(temp_main_continuous.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * temp_pairwise_cross * covariance_continuous_; // Residual: D = Y - M (n x q) arma::mat D = continuous_observations_ - temp_cond_mean; @@ -205,7 +205,7 @@ std::pair MixedMRFModel::logp_and_gradient( // Theta for marginal PL arma::mat temp_Theta; if(use_marginal_pl_) { - temp_Theta = temp_Kxx + 2.0 * temp_Kxy * covariance_yy_ * temp_Kxy.t(); + temp_Theta = temp_pairwise_discrete + 2.0 * temp_pairwise_cross * covariance_continuous_ * temp_pairwise_cross.t(); } // Start gradient from observed-statistics cache @@ -213,37 +213,37 @@ std::pair MixedMRFModel::logp_and_gradient( double logp = 0.0; - // For marginal PL: precompute Kxy Σyy (used in cross-contributions) - arma::mat KxySyy; // p x q + // For marginal PL: precompute K_xy Σ_yy (used in cross-contributions) + arma::mat cross_times_cov; // p x q if(use_marginal_pl_) { - KxySyy = temp_Kxy * covariance_yy_; + cross_times_cov = temp_pairwise_cross * covariance_continuous_; } // ========================================================================= // Part 1: OMRF conditionals // ========================================================================= - int mux_offset = 0; + int main_effects_discrete_offset = 0; for(size_t s = 0; s < p_; ++s) { int C_s = num_categories_(s); // --- Rest score for variable s --- arma::vec rest; if(use_marginal_pl_) { - // Marginal: Theta-based rest + Kxy*muy bias + // Marginal: Θ-based rest + K_xy μ_y bias double theta_ss = temp_Theta(s, s); rest = discrete_observations_dbl_ * temp_Theta.col(s) - discrete_observations_dbl_.col(s) * theta_ss - + 2.0 * arma::dot(temp_Kxy.row(s), temp_muy); + + 2.0 * arma::dot(temp_pairwise_cross.row(s), temp_main_continuous); } else { - // Conditional: Kxx-based rest + 2 Kxy y - rest = discrete_observations_dbl_ * temp_Kxx.col(s) - - discrete_observations_dbl_.col(s) * temp_Kxx(s, s) - + 2.0 * continuous_observations_ * temp_Kxy.row(s).t(); + // Conditional: K_xx-based rest + 2 K_xy y + rest = discrete_observations_dbl_ * temp_pairwise_discrete.col(s) + - discrete_observations_dbl_.col(s) * temp_pairwise_discrete(s, s) + + 2.0 * continuous_observations_ * temp_pairwise_cross.row(s).t(); } if(is_ordinal_variable_(s)) { - arma::vec main_param = temp_mux.row(s).cols(0, C_s - 1).t(); + arma::vec main_param = temp_main_discrete.row(s).cols(0, C_s - 1).t(); // Marginal PL: absorb Theta_ss into main_param if(use_marginal_pl_) { @@ -267,16 +267,16 @@ std::pair MixedMRFModel::logp_and_gradient( // log pseudo-posterior contribution logp -= arma::accu(result.log_Z); - // Main-effect gradient: ∂/∂mux_{s,c} = count_c - sum_i prob(c) + // Main-effect gradient: ∂/∂main_effects_discrete_{s,c} = count_c - sum_i prob(c) for(int c = 0; c < C_s; ++c) { - grad(mux_offset + c) -= arma::accu(result.probs.col(c + 1)); + grad(main_effects_discrete_offset + c) -= arma::accu(result.probs.col(c + 1)); } // Expected value E_s[c+1|rest] per observation arma::vec weights = arma::regspace(1, C_s); arma::vec E = result.probs.cols(1, C_s) * weights; - // Kxx pairwise gradient: sum_i x_{i,t} * (x_{i,s}+1 - E_s) + // Pairwise discrete gradient: sum_i x_{i,t} * (x_{i,s}+1 - E_s) // (uses pre-transposed discrete observations for BLAS efficiency) arma::vec pw_grad = discrete_observations_dbl_t_ * E; for(size_t t = 0; t < p_; ++t) { @@ -286,15 +286,15 @@ std::pair MixedMRFModel::logp_and_gradient( } if(use_marginal_pl_) { - // Additional Kxx gradient from Theta_ss in denominator: - // ∂/∂Kxx_{st} through Theta_ss: zero (∂Theta_ss/∂Kxx_st = δ_{st}) - // So Kxx gradient from Theta rest scores is already handled above. + // Additional pairwise_discrete gradient from Θ_ss in denominator: + // ∂/∂pairwise_effects_discrete_{st} through Θ_ss: zero (∂Θ_ss/∂pairwise_effects_discrete_st = δ_{st}) + // So pairwise_discrete gradient from Θ rest scores is already handled above. - // Kxy gradient from marginal OMRF (through Theta): - // ∂Theta_{st}/∂Kxy_{a,j} has two terms: - // = 2 [Σyy Kxy_t']_j δ_{as} + 2 [Kxy_s Σyy]_j δ_{at} - // Self-contribution (a=s): from rest_s → Kxy_s - // Cross-contribution (a=t): from rest_s → Kxy_t for each t≠s + // Pairwise_cross gradient from marginal OMRF (through Θ): + // ∂Theta_{st}/∂pairwise_effects_cross_{a,j} has two terms: + // = 2 [Σyy pairwise_effects_cross_t']_j δ_{as} + 2 [pairwise_effects_cross_s Σyy]_j δ_{at} + // Self-contribution (a=s): from rest_s → pairwise_effects_cross_s + // Cross-contribution (a=t): from rest_s → pairwise_effects_cross_t for each t≠s arma::vec weights_sq = arma::square(weights); arma::vec E_sq = result.probs.cols(1, C_s) * weights_sq; @@ -310,12 +310,12 @@ std::pair MixedMRFModel::logp_and_gradient( double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); // Self-contribution: a = s - // Off-diagonal Theta: ∂Θ_{st}/∂Kxy_{s,j} = 2 [Σyy Kxy_t']_j - // Diagonal Theta: ∂Θ_{ss}/∂Kxy_{s,j} = 4 [Σyy Kxy_s']_j - // Rest-score bias: ∂(2 Kxy_s μy)/∂Kxy_{s,j} = 2 μy_j - arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_Kxy) * covariance_yy_ - + 4.0 * diff_diag * KxySyy.row(s) - + 2.0 * sum_obs_minus_E * temp_muy.t(); + // Off-diagonal Theta: ∂Θ_{st}/∂pairwise_effects_cross_{s,j} = 2 [Σyy pairwise_effects_cross_t']_j + // Diagonal Theta: ∂Θ_{ss}/∂pairwise_effects_cross_{s,j} = 4 [Σyy pairwise_effects_cross_s']_j + // Rest-score bias: ∂(2 pairwise_effects_cross_s μy)/∂pairwise_effects_cross_{s,j} = 2 μy_j + arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_pairwise_cross) * covariance_continuous_ + + 4.0 * diff_diag * cross_times_cov.row(s) + + 2.0 * sum_obs_minus_E * temp_main_continuous.t(); for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(s, p_ + j) == 0) continue; @@ -324,8 +324,8 @@ std::pair MixedMRFModel::logp_and_gradient( } // Cross-contribution: a = t, for each t ≠ s - // ∂l_s/∂Kxy_{t,:} = diff_pw(t) * 2 * Kxy_s * Σyy - arma::rowvec V_s = 2.0 * KxySyy.row(s); // 2 * Kxy_s * Σyy + // ∂l_s/∂pairwise_effects_cross_{t,:} = diff_pw(t) * 2 * pairwise_effects_cross_s * Σyy + arma::rowvec V_s = 2.0 * cross_times_cov.row(s); // 2 K_xy_s Σ_yy for(size_t t = 0; t < p_; ++t) { if(t == s || std::abs(diff_pw(t)) < 1e-300) continue; for(size_t j = 0; j < q_; ++j) { @@ -335,14 +335,14 @@ std::pair MixedMRFModel::logp_and_gradient( } } - // muy gradient from marginal OMRF: - // ∂l_s/∂muy_j = 2 Kxy_{sj} * sum_i (x_{is} - E_s) + // Continuous mean gradient from marginal OMRF: + // ∂l_s/∂main_effects_continuous_j = 2 pairwise_effects_cross_{sj} * sum_i (x_{is} - E_s) for(size_t j = 0; j < q_; ++j) { - grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; + grad(main_effects_continuous_grad_offset_ + j) += 2.0 * temp_pairwise_cross(s, j) * sum_obs_minus_E; } } else { - // Conditional PL: Kxy gradient from OMRF rest score - // ∂/∂Kxy_{s,j} = 2 sum_i y_{ij} (x_{is}+1 - E_s) + // Conditional PL: pairwise_cross gradient from OMRF rest score + // ∂/∂pairwise_effects_cross_{s,j} = 2 sum_i y_{ij} (x_{is}+1 - E_s) arma::rowvec kxy_grad_s = 2.0 * ( discrete_observations_dbl_.col(s) - E ).t() * continuous_observations_; @@ -354,12 +354,12 @@ std::pair MixedMRFModel::logp_and_gradient( } } - mux_offset += C_s; + main_effects_discrete_offset += C_s; } else { // --- Blume-Capel variable --- int ref = baseline_category_(s); - double lin_eff = temp_mux(s, 0); - double quad_eff = temp_mux(s, 1); + double lin_eff = temp_main_discrete(s, 0); + double quad_eff = temp_main_discrete(s, 1); // Marginal PL: absorb Theta_ss into quadratic effect double effective_quad = quad_eff; @@ -378,13 +378,13 @@ std::pair MixedMRFModel::logp_and_gradient( arma::vec sq_score = arma::square(score); // Main-effect gradient - grad(mux_offset) -= arma::accu(result.probs * score); - grad(mux_offset + 1) -= arma::accu(result.probs * sq_score); + grad(main_effects_discrete_offset) -= arma::accu(result.probs * score); + grad(main_effects_discrete_offset + 1) -= arma::accu(result.probs * sq_score); // Expected score per person arma::vec E = result.probs * score; - // Kxx pairwise gradient + // Pairwise discrete gradient arma::vec pw_grad = discrete_observations_dbl_t_ * E; for(size_t t = 0; t < p_; ++t) { if(edge_indicators_(s, t) == 0 || s == t) continue; @@ -393,7 +393,7 @@ std::pair MixedMRFModel::logp_and_gradient( } if(use_marginal_pl_) { - // Kxy gradient from marginal OMRF (same structure as ordinal) + // Pairwise_cross gradient from marginal OMRF (same structure as ordinal) arma::vec E_sq = result.probs * sq_score; arma::vec diff_pw = discrete_observations_dbl_t_ * @@ -407,9 +407,9 @@ std::pair MixedMRFModel::logp_and_gradient( double sum_obs_minus_E = arma::accu(discrete_observations_dbl_.col(s)) - arma::accu(E); // Self-contribution: a = s - arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_Kxy) * covariance_yy_ - + 4.0 * diff_diag * KxySyy.row(s) - + 2.0 * sum_obs_minus_E * temp_muy.t(); + arma::rowvec kxy_self = 2.0 * (diff_pw.t() * temp_pairwise_cross) * covariance_continuous_ + + 4.0 * diff_diag * cross_times_cov.row(s) + + 2.0 * sum_obs_minus_E * temp_main_continuous.t(); for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(s, p_ + j) == 0) continue; @@ -418,7 +418,7 @@ std::pair MixedMRFModel::logp_and_gradient( } // Cross-contribution: a = t, for each t ≠ s - arma::rowvec V_s = 2.0 * KxySyy.row(s); + arma::rowvec V_s = 2.0 * cross_times_cov.row(s); for(size_t t = 0; t < p_; ++t) { if(t == s || std::abs(diff_pw(t)) < 1e-300) continue; for(size_t j = 0; j < q_; ++j) { @@ -428,12 +428,12 @@ std::pair MixedMRFModel::logp_and_gradient( } } - // muy gradient from marginal OMRF + // Continuous mean gradient from marginal OMRF for(size_t j = 0; j < q_; ++j) { - grad(muy_grad_offset_ + j) += 2.0 * temp_Kxy(s, j) * sum_obs_minus_E; + grad(main_effects_continuous_grad_offset_ + j) += 2.0 * temp_pairwise_cross(s, j) * sum_obs_minus_E; } } else { - // Conditional PL: Kxy gradient from OMRF rest score + // Conditional PL: pairwise_cross gradient from OMRF rest score arma::rowvec kxy_grad_s = 2.0 * ( discrete_observations_dbl_.col(s) - E ).t() * continuous_observations_; @@ -445,13 +445,13 @@ std::pair MixedMRFModel::logp_and_gradient( } } - mux_offset += 2; + main_effects_discrete_offset += 2; } } // Add numerator contribution to logp from discrete sufficient statistics // (already in grad_obs_cache_ as counts, but logp needs the actual dot-products) - mux_offset = 0; + main_effects_discrete_offset = 0; for(size_t s = 0; s < p_; ++s) { int C_s = num_categories_(s); arma::vec rest; @@ -459,67 +459,67 @@ std::pair MixedMRFModel::logp_and_gradient( double theta_ss = temp_Theta(s, s); rest = discrete_observations_dbl_ * temp_Theta.col(s) - discrete_observations_dbl_.col(s) * theta_ss - + 2.0 * arma::dot(temp_Kxy.row(s), temp_muy); + + 2.0 * arma::dot(temp_pairwise_cross.row(s), temp_main_continuous); // Theta_ss quadratic contribution logp += temp_Theta(s, s) * arma::dot( discrete_observations_dbl_.col(s), discrete_observations_dbl_.col(s)); } else { - rest = discrete_observations_dbl_ * temp_Kxx.col(s) - - discrete_observations_dbl_.col(s) * temp_Kxx(s, s) - + 2.0 * continuous_observations_ * temp_Kxy.row(s).t(); + rest = discrete_observations_dbl_ * temp_pairwise_discrete.col(s) + - discrete_observations_dbl_.col(s) * temp_pairwise_discrete(s, s) + + 2.0 * continuous_observations_ * temp_pairwise_cross.row(s).t(); } // Numerator: dot(x_s, rest) + main-effect sums logp += arma::dot(discrete_observations_dbl_.col(s), rest); if(is_ordinal_variable_(s)) { for(int c = 1; c <= C_s; ++c) { - logp += static_cast(counts_per_category_(c, s)) * temp_mux(s, c - 1); + logp += static_cast(counts_per_category_(c, s)) * temp_main_discrete(s, c - 1); } } else { - logp += temp_mux(s, 0) * static_cast(blume_capel_stats_(0, s)) - + temp_mux(s, 1) * static_cast(blume_capel_stats_(1, s)); + logp += temp_main_discrete(s, 0) * static_cast(blume_capel_stats_(0, s)) + + temp_main_discrete(s, 1) * static_cast(blume_capel_stats_(1, s)); } } // ========================================================================= // Part 2: GGM conditional log-likelihood and gradients // ========================================================================= - // log p(y | x) = n/2 * (log|Kyy| - q log(2pi)) - 1/2 trace(Kyy D'D) - // where D = Y - M, M_i = muy' + 2 x_i' Kxy Σyy + // log p(y | x) = n/2 (log|K_yy| - q log(2π)) - ½ trace(K_yy D'D) + // where D = Y - M, M_i = μ_y' + 2 x_i' K_xy Σ_yy // - // Kyy is fixed, so log|Kyy| contributes to logp but not gradient. + // K_yy is fixed, so log|K_yy| contributes to logp but not gradient. - double quad_sum = arma::accu((D * Kyy_) % D); + double quad_sum = arma::accu((D * pairwise_effects_continuous_) % D); logp += static_cast(n_) / 2.0 * - (-static_cast(q_) * std::log(2.0 * arma::datum::pi) - + Kyy_log_det_) + (-static_cast(q_) * MY_LOG(2.0 * arma::datum::pi) + + log_det_precision_) - quad_sum / 2.0; - // ∂/∂muy: Kyy * D' * 1_n = Kyy * sum_over_rows(D) + // ∂/∂μ_y: K_yy D' 1_n = K_yy sum_over_rows(D) arma::vec D_colsums = arma::sum(D, 0).t(); // q-vector - arma::vec grad_muy_ggm = Kyy_ * D_colsums; + arma::vec grad_main_effects_continuous_ggm = pairwise_effects_continuous_ * D_colsums; for(size_t j = 0; j < q_; ++j) { - grad(muy_grad_offset_ + j) += grad_muy_ggm(j); + grad(main_effects_continuous_grad_offset_ + j) += grad_main_effects_continuous_ggm(j); } - // ∂/∂Kxy: The GGM conditional depends on Kxy through M. - // ∂M/∂Kxy_{s,j} = 2 x_s [Σyy]_{j,:} - // ∂logp_ggm/∂Kxy = 2 X' D (shortcut: Kyy Σyy = I eliminates Kyy) + // ∂/∂K_xy: The GGM conditional depends on K_xy through M. + // ∂M/∂pairwise_effects_cross_{s,j} = 2 x_s [Σ_yy]_{j,:} + // ∂logp_ggm/∂K_xy = 2 X' D (shortcut: K_yy Σ_yy = I eliminates K_yy) // - // Correctly: ∂(−½ trace(Kyy D'D))/∂Kxy_{s,j} - // = trace(Kyy D' ∂M/∂Kxy_{s,j}) - // = trace(Kyy D' * 2 x_s [Σyy]_{j,:}) - // = 2 [x_s' D Kyy Σyy]_j - // = 2 [x_s' D]_j (since Kyy Σyy = I) - arma::mat grad_Kxy_ggm = 2.0 * discrete_observations_dbl_t_ * D; // p x q + // Correctly: ∂(−½ trace(K_yy D'D))/∂pairwise_effects_cross_{s,j} + // = trace(K_yy D' ∂M/∂pairwise_effects_cross_{s,j}) + // = trace(K_yy D' · 2 x_s [Σ_yy]_{j,:}) + // = 2 [x_s' D K_yy Σ_yy]_j + // = 2 [x_s' D]_j (since K_yy Σ_yy = I) + arma::mat grad_pairwise_effects_cross_ggm = 2.0 * discrete_observations_dbl_t_ * D; // p x q for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(i, p_ + j) == 0) continue; int loc = kxy_index_cache_(i, j); - grad(loc) += grad_Kxy_ggm(i, j); + grad(loc) += grad_pairwise_effects_cross_ggm(i, j); } } @@ -527,55 +527,55 @@ std::pair MixedMRFModel::logp_and_gradient( // Part 3: Prior log-densities and gradient contributions // ========================================================================= - // --- mux priors: Beta(alpha, beta) on sigmoid scale --- - mux_offset = 0; + // --- main_effects_discrete_ priors: Beta(alpha, beta) on sigmoid scale --- + main_effects_discrete_offset = 0; for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { int C_s = num_categories_(s); for(int c = 0; c < C_s; ++c) { - double val = temp_mux(s, c); + double val = temp_main_discrete(s, c); logp += val * main_alpha_ - std::log1p(MY_EXP(val)) * (main_alpha_ + main_beta_); double p = 1.0 / (1.0 + MY_EXP(-val)); - grad(mux_offset + c) += main_alpha_ - (main_alpha_ + main_beta_) * p; + grad(main_effects_discrete_offset + c) += main_alpha_ - (main_alpha_ + main_beta_) * p; } - mux_offset += C_s; + main_effects_discrete_offset += C_s; } else { for(int k = 0; k < 2; ++k) { - double val = temp_mux(s, k); + double val = temp_main_discrete(s, k); logp += val * main_alpha_ - std::log1p(MY_EXP(val)) * (main_alpha_ + main_beta_); double p = 1.0 / (1.0 + MY_EXP(-val)); - grad(mux_offset + k) += main_alpha_ - (main_alpha_ + main_beta_) * p; + grad(main_effects_discrete_offset + k) += main_alpha_ - (main_alpha_ + main_beta_) * p; } - mux_offset += 2; + main_effects_discrete_offset += 2; } } - // --- Kxx priors: Cauchy(0, pairwise_scale_) --- + // --- pairwise_effects_discrete_ priors: Cauchy(0, pairwise_scale_) --- for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(edge_indicators_(i, j) == 0) continue; int loc = kxx_index_cache_(i, j); - double val = temp_Kxx(i, j); + double val = temp_pairwise_discrete(i, j); logp += R::dcauchy(val, 0.0, pairwise_scale_, true); grad(loc) -= 2.0 * val / (val * val + pairwise_scale_ * pairwise_scale_); } } - // --- muy priors: Normal(0, 1) --- + // --- main_effects_continuous_ priors: Normal(0, 1) --- for(size_t j = 0; j < q_; ++j) { - double val = temp_muy(j); + double val = temp_main_continuous(j); logp += R::dnorm(val, 0.0, 1.0, true); - grad(muy_grad_offset_ + j) -= val; // ∂/∂muy: -muy (from -muy^2/2) + grad(main_effects_continuous_grad_offset_ + j) -= val; // -val from -val^2/2 } - // --- Kxy priors: Cauchy(0, pairwise_scale_) --- + // --- pairwise_effects_cross_ priors: Cauchy(0, pairwise_scale_) --- for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(edge_indicators_(i, p_ + j) == 0) continue; int loc = kxy_index_cache_(i, j); - double val = temp_Kxy(i, j); + double val = temp_pairwise_cross(i, j); logp += R::dcauchy(val, 0.0, pairwise_scale_, true); grad(loc) -= 2.0 * val / (val * val + pairwise_scale_ * pairwise_scale_); } diff --git a/src/models/mixed/mixed_mrf_likelihoods.cpp b/src/models/mixed/mixed_mrf_likelihoods.cpp index 65a57993..fabb80a1 100644 --- a/src/models/mixed/mixed_mrf_likelihoods.cpp +++ b/src/models/mixed/mixed_mrf_likelihoods.cpp @@ -18,29 +18,29 @@ double MixedMRFModel::log_conditional_omrf(int s) const { int C_s = num_categories_(s); // Rest score: contribution from other discrete vars + continuous vars - arma::vec rest = discrete_observations_dbl_ * Kxx_.col(s) - - discrete_observations_dbl_.col(s) * Kxx_(s, s) - + 2.0 * continuous_observations_ * Kxy_.row(s).t(); + arma::vec rest = discrete_observations_dbl_ * pairwise_effects_discrete_.col(s) + - discrete_observations_dbl_.col(s) * pairwise_effects_discrete_(s, s) + + 2.0 * continuous_observations_ * pairwise_effects_cross_.row(s).t(); // Numerator (sufficient-statistic form): dot(x_s, rest) + main-effect sums double numer = arma::dot(discrete_observations_dbl_.col(s), rest); if(is_ordinal_variable_(s)) { - // Ordinal: add threshold contributions sum_{c=1}^{C_s} count_c * mux_(s, c-1) + // Ordinal: add threshold contributions sum_{c=1}^{C_s} count_c * main_effects_discrete_(s, c-1) for(int c = 1; c <= C_s; ++c) { - numer += static_cast(counts_per_category_(c, s)) * mux_(s, c - 1); + numer += static_cast(counts_per_category_(c, s)) * main_effects_discrete_(s, c - 1); } // Denominator via compute_denom_ordinal (FAST/SAFE block-split) - arma::vec main_param = mux_.row(s).cols(0, C_s - 1).t(); + arma::vec main_param = main_effects_discrete_.row(s).cols(0, C_s - 1).t(); arma::vec bound = static_cast(C_s) * rest; arma::vec denom = compute_denom_ordinal(rest, main_param, bound); return numer - arma::accu(bound + ARMA_MY_LOG(denom)); } else { // Blume-Capel: alpha * sum(x) + beta * sum(x^2) - double alpha = mux_(s, 0); - double beta = mux_(s, 1); + double alpha = main_effects_discrete_(s, 0); + double beta = main_effects_discrete_(s, 1); numer += alpha * static_cast(blume_capel_stats_(0, s)) + beta * static_cast(blume_capel_stats_(1, s)); @@ -59,23 +59,23 @@ double MixedMRFModel::log_conditional_omrf(int s) const { // log_marginal_omrf // ============================================================================= // Marginal OMRF pseudolikelihood for discrete variable s: -// log f(x_s | x_{-s}) using Theta = Kxx + 2 Kxy Kyy^{-1} Kxy' +// log f(x_s | x_{-s}) using Θ = K_xx + 2 K_xy K_yy^{-1} K_xy' // // Differs from conditional form in three ways: -// 1. rest score uses Theta_ instead of Kxx_, minus self-interaction -// 2. scalar bias 2 * Kxy(s,:) * muy added to rest -// 3. numerator includes Theta_(s,s) * sum(x_s^2) -// 4. denominator offsets include c^2 * Theta_(s,s) +// 1. rest score uses Theta_ instead of pairwise_effects_discrete_, minus self-interaction +// 2. scalar bias 2 K_xy(s,:) μ_y added to rest +// 3. numerator includes Θ(s,s) * sum(x_s^2) +// 4. denominator offsets include c^2 * Θ(s,s) // ============================================================================= double MixedMRFModel::log_marginal_omrf(int s) const { int C_s = num_categories_(s); - // Rest score: Theta-based interaction + Kxy*muy bias + // Rest score: Θ-based interaction + K_xy μ_y bias double theta_ss = Theta_(s, s); arma::vec rest = discrete_observations_dbl_ * Theta_.col(s) - discrete_observations_dbl_.col(s) * theta_ss - + 2.0 * arma::dot(Kxy_.row(s), muy_); + + 2.0 * arma::dot(pairwise_effects_cross_.row(s), main_effects_continuous_); // Numerator: dot(x_s, rest) + theta_ss * dot(x_s, x_s) + main effects double numer = arma::dot(discrete_observations_dbl_.col(s), rest) @@ -84,13 +84,13 @@ double MixedMRFModel::log_marginal_omrf(int s) const { if(is_ordinal_variable_(s)) { for(int c = 1; c <= C_s; ++c) { - numer += static_cast(counts_per_category_(c, s)) * mux_(s, c - 1); + numer += static_cast(counts_per_category_(c, s)) * main_effects_discrete_(s, c - 1); } - // Denominator: main_param(c) = mux(s,c) + (c+1)^2 * theta_ss + // Denominator: main_param(c) = μ_x(s,c) + (c+1)^2 Θ_ss arma::vec main_param(C_s); for(int c = 0; c < C_s; ++c) { - main_param(c) = mux_(s, c) + static_cast((c + 1) * (c + 1)) * theta_ss; + main_param(c) = main_effects_discrete_(s, c) + static_cast((c + 1) * (c + 1)) * theta_ss; } arma::vec bound = static_cast(C_s) * rest; @@ -99,8 +99,8 @@ double MixedMRFModel::log_marginal_omrf(int s) const { return numer - arma::accu(bound + ARMA_MY_LOG(denom)); } else { // Blume-Capel: alpha * sum(x) + beta * sum(x^2) - double alpha = mux_(s, 0); - double beta = mux_(s, 1); + double alpha = main_effects_discrete_(s, 0); + double beta = main_effects_discrete_(s, 1); numer += alpha * static_cast(blume_capel_stats_(0, s)) + beta * static_cast(blume_capel_stats_(1, s)); @@ -122,19 +122,19 @@ double MixedMRFModel::log_marginal_omrf(int s) const { // log_conditional_ggm // ============================================================================= // Conditional GGM log-likelihood: log f(y | x) -// y | x ~ N(conditional_mean_, covariance_yy_) +// y | x ~ N(conditional_mean_, covariance_continuous_) // -// Uses cached covariance_yy_, Kyy_log_det_, and conditional_mean_. +// Uses cached covariance_continuous_, log_det_precision_, and conditional_mean_. // ============================================================================= double MixedMRFModel::log_conditional_ggm() const { arma::mat D = continuous_observations_ - conditional_mean_; - // Quadratic form: trace(Kyy * D' * D) = sum((D * Kyy_) .* D) - double quad_sum = arma::accu((D * Kyy_) % D); + // Quadratic form: trace(K_yy D'D) = sum((D K_yy) .* D) + double quad_sum = arma::accu((D * pairwise_effects_continuous_) % D); return static_cast(n_) / 2.0 * - (-static_cast(q_) * std::log(2.0 * arma::datum::pi) - + Kyy_log_det_) + (-static_cast(q_) * MY_LOG(2.0 * arma::datum::pi) + + log_det_precision_) - quad_sum / 2.0; } diff --git a/src/models/mixed/mixed_mrf_metropolis.cpp b/src/models/mixed/mixed_mrf_metropolis.cpp index d60c0288..b05059ed 100644 --- a/src/models/mixed/mixed_mrf_metropolis.cpp +++ b/src/models/mixed/mixed_mrf_metropolis.cpp @@ -19,16 +19,16 @@ static double log_beta_prior(double x, double alpha, double beta) { // update_main_effect // ============================================================================= // MH update for one main-effect parameter. -// Ordinal: mux_(s, c) = threshold for category c+1 (c in [0, C_s-1]) -// Blume-Capel: mux_(s, 0) = linear α, mux_(s, 1) = quadratic β +// Ordinal: main_effects_discrete_(s, c) = threshold for category c+1 (c in [0, C_s-1]) +// Blume-Capel: main_effects_discrete_(s, 0) = linear α, main_effects_discrete_(s, 1) = quadratic β // (c indexes 0 or 1 for BC) // // The accept/reject uses log_conditional_omrf(s) + beta-type prior. // ============================================================================= void MixedMRFModel::update_main_effect(int s, int c, int iteration) { - double& current = mux_(s, c); - double proposal_sd = prop_sd_mux_(s, c); + double& current = main_effects_discrete_(s, c); + double proposal_sd = proposal_sd_main_discrete_(s, c); double current_val = current; double proposed = rnorm(rng_, current_val, proposal_sd); @@ -44,14 +44,14 @@ void MixedMRFModel::update_main_effect(int s, int c, int iteration) { double ln_alpha = ll_prop - ll_curr; - if(std::log(runif(rng_)) >= ln_alpha) { + if(MY_LOG(runif(rng_)) >= ln_alpha) { current = current_val; // reject } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_mux_(s, c) = update_proposal_sd_with_robbins_monro( - prop_sd_mux_(s, c), ln_alpha, rm_weight, 0.44); + proposal_sd_main_discrete_(s, c) = update_proposal_sd_with_robbins_monro( + proposal_sd_main_discrete_(s, c), ln_alpha, rm_weight, 0.44); } } @@ -59,14 +59,14 @@ void MixedMRFModel::update_main_effect(int s, int c, int iteration) { // ============================================================================= // update_continuous_mean // ============================================================================= -// MH update for one continuous mean parameter muy_(j). +// MH update for one continuous mean parameter main_effects_continuous_(j). // The accept/reject uses log_conditional_ggm() + Normal(0, 1) prior. // Must save/restore conditional_mean_ around the proposal. // ============================================================================= void MixedMRFModel::update_continuous_mean(int j, int iteration) { - double current_val = muy_(j); - double proposed = rnorm(rng_, current_val, prop_sd_muy_(j)); + double current_val = main_effects_continuous_(j); + double proposed = rnorm(rng_, current_val, proposal_sd_main_continuous_(j)); // Current log-posterior (Normal(0,1) prior: -x^2/2 up to constant) double ll_curr = log_conditional_ggm() + R::dnorm(current_val, 0.0, 1.0, true); @@ -77,7 +77,7 @@ void MixedMRFModel::update_continuous_mean(int j, int iteration) { // Set proposed value and refresh conditional_mean_ arma::mat cond_mean_saved = conditional_mean_; - muy_(j) = proposed; + main_effects_continuous_(j) = proposed; recompute_conditional_mean(); double ll_prop = log_conditional_ggm() + R::dnorm(proposed, 0.0, 1.0, true); @@ -88,30 +88,30 @@ void MixedMRFModel::update_continuous_mean(int j, int iteration) { double ln_alpha = ll_prop - ll_curr; - if(std::log(runif(rng_)) >= ln_alpha) { - muy_(j) = current_val; // reject + if(MY_LOG(runif(rng_)) >= ln_alpha) { + main_effects_continuous_(j) = current_val; // reject conditional_mean_ = std::move(cond_mean_saved); } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_muy_(j) = update_proposal_sd_with_robbins_monro( - prop_sd_muy_(j), ln_alpha, rm_weight, 0.44); + proposal_sd_main_continuous_(j) = update_proposal_sd_with_robbins_monro( + proposal_sd_main_continuous_(j), ln_alpha, rm_weight, 0.44); } } // ============================================================================= -// update_Kxx +// update_pairwise_discrete // ============================================================================= -// MH update for one discrete-discrete interaction Kxx_(i, j). +// MH update for one discrete-discrete interaction pairwise_effects_discrete_(i, j). // Symmetric: sets both (i,j) and (j,i). // Acceptance: log_conditional_omrf(i) + log_conditional_omrf(j) + Cauchy prior. // ============================================================================= -void MixedMRFModel::update_Kxx(int i, int j, int iteration) { - double current_val = Kxx_(i, j); - double proposed = rnorm(rng_, current_val, prop_sd_Kxx_(i, j)); +void MixedMRFModel::update_pairwise_discrete(int i, int j, int iteration) { + double current_val = pairwise_effects_discrete_(i, j); + double proposed = rnorm(rng_, current_val, proposal_sd_pairwise_discrete_(i, j)); // Current log-posterior double ll_curr, ll_prop; @@ -119,8 +119,8 @@ void MixedMRFModel::update_Kxx(int i, int j, int iteration) { ll_curr = log_marginal_omrf(i) + log_marginal_omrf(j) + R::dcauchy(current_val, 0.0, pairwise_scale_, true); - Kxx_(i, j) = proposed; - Kxx_(j, i) = proposed; + pairwise_effects_discrete_(i, j) = proposed; + pairwise_effects_discrete_(j, i) = proposed; recompute_Theta(); ll_prop = log_marginal_omrf(i) + log_marginal_omrf(j) @@ -129,8 +129,8 @@ void MixedMRFModel::update_Kxx(int i, int j, int iteration) { ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j) + R::dcauchy(current_val, 0.0, pairwise_scale_, true); - Kxx_(i, j) = proposed; - Kxx_(j, i) = proposed; + pairwise_effects_discrete_(i, j) = proposed; + pairwise_effects_discrete_(j, i) = proposed; ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j) + R::dcauchy(proposed, 0.0, pairwise_scale_, true); @@ -138,52 +138,52 @@ void MixedMRFModel::update_Kxx(int i, int j, int iteration) { double ln_alpha = ll_prop - ll_curr; - if(std::log(runif(rng_)) >= ln_alpha) { - Kxx_(i, j) = current_val; // reject - Kxx_(j, i) = current_val; + if(MY_LOG(runif(rng_)) >= ln_alpha) { + pairwise_effects_discrete_(i, j) = current_val; // reject + pairwise_effects_discrete_(j, i) = current_val; if(use_marginal_pl_) recompute_Theta(); } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_Kxx_(i, j) = update_proposal_sd_with_robbins_monro( - prop_sd_Kxx_(i, j), ln_alpha, rm_weight, 0.44); + proposal_sd_pairwise_discrete_(i, j) = update_proposal_sd_with_robbins_monro( + proposal_sd_pairwise_discrete_(i, j), ln_alpha, rm_weight, 0.44); } } // ============================================================================= -// Rank-1 Kyy proposal helpers (permutation-free) +// Rank-1 precision proposal helpers (permutation-free) // ============================================================================= // Direct analogs of GGMModel::get_constants / constrained_diagonal, -// operating on Kyy_, Kyy_chol_, and covariance_yy_. +// operating on pairwise_effects_continuous_, cholesky_of_precision_, and covariance_continuous_. // ============================================================================= -void MixedMRFModel::get_kyy_constants(int i, int j) { - double logdet = cholesky_helpers::get_log_det(Kyy_chol_); +void MixedMRFModel::get_precision_constants(int i, int j) { + double logdet = cholesky_helpers::get_log_det(cholesky_of_precision_); - double log_adj_ii = logdet + std::log(std::abs(covariance_yy_(i, i))); - double log_adj_ij = logdet + std::log(std::abs(covariance_yy_(i, j))); - double log_adj_jj = logdet + std::log(std::abs(covariance_yy_(j, j))); + double log_adj_ii = logdet + MY_LOG(std::abs(covariance_continuous_(i, i))); + double log_adj_ij = logdet + MY_LOG(std::abs(covariance_continuous_(i, j))); + double log_adj_jj = logdet + MY_LOG(std::abs(covariance_continuous_(j, j))); - double inv_sub_jj = cholesky_helpers::compute_inv_submatrix_i(covariance_yy_, i, j, j); - double log_abs_inv_sub_jj = log_adj_ii + std::log(std::abs(inv_sub_jj)); + double inv_sub_jj = cholesky_helpers::compute_inv_submatrix_i(covariance_continuous_, i, j, j); + double log_abs_inv_sub_jj = log_adj_ii + MY_LOG(std::abs(inv_sub_jj)); - double Phi_q1q = (2 * std::signbit(covariance_yy_(i, j)) - 1) * std::exp( + double Phi_q1q = (2 * std::signbit(covariance_continuous_(i, j)) - 1) * MY_EXP( (log_adj_ij - (log_adj_jj + log_abs_inv_sub_jj) / 2) ); - double Phi_q1q1 = std::exp((log_adj_jj - log_abs_inv_sub_jj) / 2); + double Phi_q1q1 = MY_EXP((log_adj_jj - log_abs_inv_sub_jj) / 2); kyy_constants_[0] = Phi_q1q; kyy_constants_[1] = Phi_q1q1; - kyy_constants_[2] = Kyy_(i, j) - Phi_q1q * Phi_q1q1; + kyy_constants_[2] = pairwise_effects_continuous_(i, j) - Phi_q1q * Phi_q1q1; kyy_constants_[3] = Phi_q1q1; - kyy_constants_[4] = Kyy_(j, j) - Phi_q1q * Phi_q1q; + kyy_constants_[4] = pairwise_effects_continuous_(j, j) - Phi_q1q * Phi_q1q; kyy_constants_[5] = kyy_constants_[4] + kyy_constants_[2] * kyy_constants_[2] / (kyy_constants_[3] * kyy_constants_[3]); } -double MixedMRFModel::kyy_constrained_diagonal(double x) const { +double MixedMRFModel::precision_constrained_diagonal(double x) const { if(x == 0.0) { return kyy_constants_[5]; } else { @@ -196,9 +196,9 @@ double MixedMRFModel::kyy_constrained_diagonal(double x) const { // ============================================================================= // log_ggm_ratio_edge // ============================================================================= -// Log-likelihood ratio for a rank-2 off-diagonal Kyy change using the +// Log-likelihood ratio for a rank-2 off-diagonal precision change using the // matrix determinant lemma for the log-det part and Woodbury for the -// quadratic-form part. Assumes precision_yy_proposal_ is filled. +// quadratic-form part. Assumes precision_proposal_ is filled. // // B+.10 will replace the O(npq + nq²) quadratic-form computation with // an O(nq) rank-2 shortcut. @@ -211,24 +211,24 @@ double MixedMRFModel::log_ggm_ratio_edge(int i, int j) const { // --- Log-determinant ratio via matrix determinant lemma --- // ΔΩ has 3 nonzero entries: (i,j), (j,i), (j,j). // Ui = old - new off-diag, Uj = (old - new diag) / 2 - double Ui = Kyy_(ui, uj) - precision_yy_proposal_(ui, uj); - double Uj = (Kyy_(uj, uj) - precision_yy_proposal_(uj, uj)) / 2.0; + double Ui = pairwise_effects_continuous_(ui, uj) - precision_proposal_(ui, uj); + double Uj = (pairwise_effects_continuous_(uj, uj) - precision_proposal_(uj, uj)) / 2.0; - double cc11 = covariance_yy_(uj, uj); - double cc12 = 1.0 - (covariance_yy_(ui, uj) * Ui + - covariance_yy_(uj, uj) * Uj); - double cc22 = Ui * Ui * covariance_yy_(ui, ui) + - 2.0 * Ui * Uj * covariance_yy_(ui, uj) + - Uj * Uj * covariance_yy_(uj, uj); + double cc11 = covariance_continuous_(uj, uj); + double cc12 = 1.0 - (covariance_continuous_(ui, uj) * Ui + + covariance_continuous_(uj, uj) * Uj); + double cc22 = Ui * Ui * covariance_continuous_(ui, ui) + + 2.0 * Ui * Uj * covariance_continuous_(ui, uj) + + Uj * Uj * covariance_continuous_(uj, uj); - double logdet_ratio = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + double logdet_ratio = MY_LOG(std::abs(cc11 * cc22 - cc12 * cc12)); // --- Proposed covariance via Woodbury --- // ΔΩ = vf1 vf2' + vf2 vf1' where vf1 = [0,...,-1,...] (j-th), // vf2 = [0,...,Ui,...,Uj,...] (i-th and j-th). // s1 = Σ vf1 = -Σ[:,j], s2 = Σ vf2 = Ui*Σ[:,i] + Uj*Σ[:,j] - arma::vec s1 = -covariance_yy_.col(uj); - arma::vec s2 = Ui * covariance_yy_.col(ui) + Uj * covariance_yy_.col(uj); + arma::vec s1 = -covariance_continuous_.col(uj); + arma::vec s2 = Ui * covariance_continuous_.col(ui) + Uj * covariance_continuous_.col(uj); // 2×2 core matrix T = I + [vf2,vf1]' [s1,s2] // T = [1 + vf2's1, vf2's2; vf1's1, 1 + vf1's2] @@ -249,19 +249,19 @@ double MixedMRFModel::log_ggm_ratio_edge(int i, int j) const { // = Σ - (inv_t11*s1 + inv_t21*s2)*s2' - (inv_t12*s1 + inv_t22*s2)*s1' arma::vec w1 = inv_t11 * s1 + inv_t21 * s2; // coefficient for s2' row arma::vec w2 = inv_t12 * s1 + inv_t22 * s2; // coefficient for s1' row - arma::mat cov_prop = covariance_yy_ - w1 * s2.t() - w2 * s1.t(); + arma::mat cov_prop = covariance_continuous_ - w1 * s2.t() - w2 * s1.t(); // --- Proposed conditional mean --- - // M' = 1*μ_y' + 2 * X * Kxy * Σ' - arma::mat cond_mean_prop = arma::repmat(muy_.t(), n_, 1) + - 2.0 * discrete_observations_dbl_ * Kxy_ * cov_prop; + // M' = μ_y' + 2 X K_xy Σ' + arma::mat cond_mean_prop = arma::repmat(main_effects_continuous_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * pairwise_effects_cross_ * cov_prop; // --- Quadratic form difference --- arma::mat D_curr = continuous_observations_ - conditional_mean_; arma::mat D_prop = continuous_observations_ - cond_mean_prop; - double quad_curr = arma::accu((D_curr * Kyy_) % D_curr); - double quad_prop = arma::accu((D_prop * precision_yy_proposal_) % D_prop); + double quad_curr = arma::accu((D_curr * pairwise_effects_continuous_) % D_curr); + double quad_prop = arma::accu((D_prop * precision_proposal_) % D_prop); double n = static_cast(n_); return n / 2.0 * logdet_ratio - (quad_prop - quad_curr) / 2.0; @@ -271,7 +271,7 @@ double MixedMRFModel::log_ggm_ratio_edge(int i, int j) const { // ============================================================================= // log_ggm_ratio_diag // ============================================================================= -// Log-likelihood ratio for a rank-1 diagonal Kyy change. +// Log-likelihood ratio for a rank-1 diagonal precision change. // Same structure as log_ggm_ratio_edge but simpler (Ui = 0). // ============================================================================= @@ -279,30 +279,30 @@ double MixedMRFModel::log_ggm_ratio_diag(int i) const { size_t ui = static_cast(i); // --- Log-determinant ratio (rank-1) --- - double Uj = (Kyy_(ui, ui) - precision_yy_proposal_(ui, ui)) / 2.0; + double Uj = (pairwise_effects_continuous_(ui, ui) - precision_proposal_(ui, ui)) / 2.0; - double cc11 = covariance_yy_(ui, ui); - double cc12 = 1.0 - covariance_yy_(ui, ui) * Uj; - double cc22 = Uj * Uj * covariance_yy_(ui, ui); + double cc11 = covariance_continuous_(ui, ui); + double cc12 = 1.0 - covariance_continuous_(ui, ui) * Uj; + double cc22 = Uj * Uj * covariance_continuous_(ui, ui); - double logdet_ratio = std::log(std::abs(cc11 * cc22 - cc12 * cc12)); + double logdet_ratio = MY_LOG(std::abs(cc11 * cc22 - cc12 * cc12)); // --- Proposed covariance via Sherman-Morrison (rank-1 special case) --- // ΔΩ = -2Uj * e_i e_i', so Σ' = Σ + 2Uj * Σ[:,i] Σ[i,:]' / (1 - 2Uj * Σ(i,i)) - arma::vec s = covariance_yy_.col(ui); - double denom = 1.0 - 2.0 * Uj * covariance_yy_(ui, ui); - arma::mat cov_prop = covariance_yy_ + (2.0 * Uj / denom) * s * s.t(); + arma::vec s = covariance_continuous_.col(ui); + double denom = 1.0 - 2.0 * Uj * covariance_continuous_(ui, ui); + arma::mat cov_prop = covariance_continuous_ + (2.0 * Uj / denom) * s * s.t(); // --- Proposed conditional mean --- - arma::mat cond_mean_prop = arma::repmat(muy_.t(), n_, 1) + - 2.0 * discrete_observations_dbl_ * Kxy_ * cov_prop; + arma::mat cond_mean_prop = arma::repmat(main_effects_continuous_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * pairwise_effects_cross_ * cov_prop; // --- Quadratic form difference --- arma::mat D_curr = continuous_observations_ - conditional_mean_; arma::mat D_prop = continuous_observations_ - cond_mean_prop; - double quad_curr = arma::accu((D_curr * Kyy_) % D_curr); - double quad_prop = arma::accu((D_prop * precision_yy_proposal_) % D_prop); + double quad_curr = arma::accu((D_curr * pairwise_effects_continuous_) % D_curr); + double quad_prop = arma::accu((D_prop * precision_proposal_) % D_prop); double n = static_cast(n_); return n / 2.0 * logdet_ratio - (quad_prop - quad_curr) / 2.0; @@ -310,18 +310,18 @@ double MixedMRFModel::log_ggm_ratio_diag(int i) const { // ============================================================================= -// cholesky_update_after_kyy_edge +// cholesky_update_after_precision_edge // ============================================================================= -// Rank-2 Cholesky update after accepting an off-diagonal Kyy change. +// Rank-2 Cholesky update after accepting an off-diagonal precision change. // Decomposes ΔΩ = vf1*vf2' + vf2*vf1' into two rank-1 ops. -// Then recomputes inv_cholesky_yy_ and covariance_yy_. +// Then recomputes inv_cholesky_of_precision_ and covariance_continuous_. // ============================================================================= -void MixedMRFModel::cholesky_update_after_kyy_edge( +void MixedMRFModel::cholesky_update_after_precision_edge( double old_ij, double old_jj, int i, int j) { - kyy_v2_[0] = old_ij - precision_yy_proposal_(i, j); - kyy_v2_[1] = (old_jj - precision_yy_proposal_(j, j)) / 2.0; + kyy_v2_[0] = old_ij - precision_proposal_(i, j); + kyy_v2_[1] = (old_jj - precision_proposal_(j, j)) / 2.0; kyy_vf1_[i] = kyy_v1_[0]; // 0 kyy_vf1_[j] = kyy_v1_[1]; // -1 @@ -331,12 +331,12 @@ void MixedMRFModel::cholesky_update_after_kyy_edge( kyy_u1_ = (kyy_vf1_ + kyy_vf2_) / std::sqrt(2.0); kyy_u2_ = (kyy_vf1_ - kyy_vf2_) / std::sqrt(2.0); - cholesky_update(Kyy_chol_, kyy_u1_); - cholesky_downdate(Kyy_chol_, kyy_u2_); + cholesky_update(cholesky_of_precision_, kyy_u1_); + cholesky_downdate(cholesky_of_precision_, kyy_u2_); - arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); - covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); - Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); + arma::inv(inv_cholesky_of_precision_, arma::trimatu(cholesky_of_precision_)); + covariance_continuous_ = inv_cholesky_of_precision_ * inv_cholesky_of_precision_.t(); + log_det_precision_ = cholesky_helpers::get_log_det(cholesky_of_precision_); kyy_vf1_[i] = 0.0; kyy_vf1_[j] = 0.0; @@ -346,59 +346,59 @@ void MixedMRFModel::cholesky_update_after_kyy_edge( // ============================================================================= -// cholesky_update_after_kyy_diag +// cholesky_update_after_precision_diag // ============================================================================= -// Rank-1 Cholesky update after accepting a diagonal Kyy change. +// Rank-1 Cholesky update after accepting a diagonal precision change. // ============================================================================= -void MixedMRFModel::cholesky_update_after_kyy_diag(double old_ii, int i) { - double delta = old_ii - precision_yy_proposal_(i, i); +void MixedMRFModel::cholesky_update_after_precision_diag(double old_ii, int i) { + double delta = old_ii - precision_proposal_(i, i); bool downdate = delta > 0.0; kyy_vf1_[i] = std::sqrt(std::abs(delta)); if(downdate) - cholesky_downdate(Kyy_chol_, kyy_vf1_); + cholesky_downdate(cholesky_of_precision_, kyy_vf1_); else - cholesky_update(Kyy_chol_, kyy_vf1_); + cholesky_update(cholesky_of_precision_, kyy_vf1_); - arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); - covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); - Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); + arma::inv(inv_cholesky_of_precision_, arma::trimatu(cholesky_of_precision_)); + covariance_continuous_ = inv_cholesky_of_precision_ * inv_cholesky_of_precision_.t(); + log_det_precision_ = cholesky_helpers::get_log_det(cholesky_of_precision_); kyy_vf1_[i] = 0.0; } // ============================================================================= -// update_Kyy_offdiag +// update_pairwise_effects_continuous_offdiag // ============================================================================= -// MH update for one off-diagonal element of the precision matrix Kyy_(i, j). +// MH update for one off-diagonal element of the precision matrix pairwise_effects_continuous_(i, j). // Uses rank-1 Cholesky infrastructure (GGM-style, no permutation): -// 1. Extract constants from covariance_yy_ and Kyy_chol_ +// 1. Extract constants from covariance_continuous_ and cholesky_of_precision_ // 2. Propose on the unconstrained Cholesky scale -// 3. Map to Kyy space with constrained diagonal +// 3. Map to precision space with constrained diagonal // 4. Evaluate rank-2 log-likelihood ratio // 5. On accept: rank-1 Cholesky update // // Prior: Cauchy(0, pairwise_scale_) on off-diag, Gamma(1, 1) on diagonal. // ============================================================================= -void MixedMRFModel::update_Kyy_offdiag(int i, int j, int iteration) { - get_kyy_constants(i, j); +void MixedMRFModel::update_pairwise_effects_continuous_offdiag(int i, int j, int iteration) { + get_precision_constants(i, j); double phi_curr = kyy_constants_[0]; // Phi_q1q - double phi_prop = rnorm(rng_, phi_curr, prop_sd_Kyy_(i, j)); + double phi_prop = rnorm(rng_, phi_curr, proposal_sd_pairwise_continuous_(i, j)); double omega_prop_ij = kyy_constants_[2] + kyy_constants_[3] * phi_prop; - double omega_prop_jj = kyy_constrained_diagonal(omega_prop_ij); - double diag_curr = Kyy_(j, j); + double omega_prop_jj = precision_constrained_diagonal(omega_prop_ij); + double diag_curr = pairwise_effects_continuous_(j, j); // Fill proposal matrix (only the 3 changed entries matter) - precision_yy_proposal_ = Kyy_; - precision_yy_proposal_(i, j) = omega_prop_ij; - precision_yy_proposal_(j, i) = omega_prop_ij; - precision_yy_proposal_(j, j) = omega_prop_jj; + precision_proposal_ = pairwise_effects_continuous_; + precision_proposal_(i, j) = omega_prop_ij; + precision_proposal_(j, i) = omega_prop_ij; + precision_proposal_(j, j) = omega_prop_jj; double ln_alpha = log_ggm_ratio_edge(i, j); @@ -408,62 +408,62 @@ void MixedMRFModel::update_Kyy_offdiag(int i, int j, int iteration) { ln_alpha -= log_marginal_omrf(s); arma::mat Theta_saved = Theta_; - arma::mat Kyy_saved = Kyy_; - Kyy_ = precision_yy_proposal_; + arma::mat pairwise_effects_continuous_saved = pairwise_effects_continuous_; + pairwise_effects_continuous_ = precision_proposal_; recompute_Theta(); for(size_t s = 0; s < p_; ++s) ln_alpha += log_marginal_omrf(s); - Kyy_ = Kyy_saved; + pairwise_effects_continuous_ = pairwise_effects_continuous_saved; Theta_ = std::move(Theta_saved); } // Prior ratio: Cauchy on off-diag + Gamma(1,1) on diagonal ln_alpha += R::dcauchy(omega_prop_ij, 0.0, pairwise_scale_, true); - ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); + ln_alpha -= R::dcauchy(pairwise_effects_continuous_(i, j), 0.0, pairwise_scale_, true); ln_alpha += R::dgamma(omega_prop_jj, 1.0, 1.0, true); ln_alpha -= R::dgamma(diag_curr, 1.0, 1.0, true); - if(std::log(runif(rng_)) < ln_alpha) { - double old_ij = Kyy_(i, j); - double old_jj = Kyy_(j, j); + if(MY_LOG(runif(rng_)) < ln_alpha) { + double old_ij = pairwise_effects_continuous_(i, j); + double old_jj = pairwise_effects_continuous_(j, j); - Kyy_(i, j) = omega_prop_ij; - Kyy_(j, i) = omega_prop_ij; - Kyy_(j, j) = omega_prop_jj; + pairwise_effects_continuous_(i, j) = omega_prop_ij; + pairwise_effects_continuous_(j, i) = omega_prop_ij; + pairwise_effects_continuous_(j, j) = omega_prop_jj; - cholesky_update_after_kyy_edge(old_ij, old_jj, i, j); + cholesky_update_after_precision_edge(old_ij, old_jj, i, j); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_Kyy_(i, j) = update_proposal_sd_with_robbins_monro( - prop_sd_Kyy_(i, j), ln_alpha, rm_weight, 0.44); + proposal_sd_pairwise_continuous_(i, j) = update_proposal_sd_with_robbins_monro( + proposal_sd_pairwise_continuous_(i, j), ln_alpha, rm_weight, 0.44); } } // ============================================================================= -// update_Kyy_diag +// update_pairwise_effects_continuous_diag // ============================================================================= -// MH update for one diagonal element of Kyy. +// MH update for one diagonal element of the precision matrix. // Proposes on the log-Cholesky scale to ensure positivity. // Uses rank-1 Cholesky update on accept. // Prior: Gamma(1, 1) on the diagonal element + Jacobian for log-scale proposal. // ============================================================================= -void MixedMRFModel::update_Kyy_diag(int i, int iteration) { - double logdet = cholesky_helpers::get_log_det(Kyy_chol_); - double logdet_sub_ii = logdet + std::log(covariance_yy_(i, i)); +void MixedMRFModel::update_pairwise_effects_continuous_diag(int i, int iteration) { + double logdet = cholesky_helpers::get_log_det(cholesky_of_precision_); + double logdet_sub_ii = logdet + MY_LOG(covariance_continuous_(i, i)); double theta_curr = (logdet - logdet_sub_ii) / 2.0; - double theta_prop = rnorm(rng_, theta_curr, prop_sd_Kyy_(i, i)); + double theta_prop = rnorm(rng_, theta_curr, proposal_sd_pairwise_continuous_(i, i)); - precision_yy_proposal_ = Kyy_; - precision_yy_proposal_(i, i) = Kyy_(i, i) - - std::exp(theta_curr) * std::exp(theta_curr) - + std::exp(theta_prop) * std::exp(theta_prop); + precision_proposal_ = pairwise_effects_continuous_; + precision_proposal_(i, i) = pairwise_effects_continuous_(i, i) + - MY_EXP(theta_curr) * MY_EXP(theta_curr) + + MY_EXP(theta_prop) * MY_EXP(theta_prop); double ln_alpha = log_ggm_ratio_diag(i); @@ -473,50 +473,50 @@ void MixedMRFModel::update_Kyy_diag(int i, int iteration) { ln_alpha -= log_marginal_omrf(s); arma::mat Theta_saved = Theta_; - arma::mat Kyy_saved = Kyy_; - Kyy_ = precision_yy_proposal_; + arma::mat pairwise_effects_continuous_saved = pairwise_effects_continuous_; + pairwise_effects_continuous_ = precision_proposal_; recompute_Theta(); for(size_t s = 0; s < p_; ++s) ln_alpha += log_marginal_omrf(s); - Kyy_ = Kyy_saved; + pairwise_effects_continuous_ = pairwise_effects_continuous_saved; Theta_ = std::move(Theta_saved); } // Prior ratio: Gamma(1,1) on diagonal - ln_alpha += R::dgamma(precision_yy_proposal_(i, i), 1.0, 1.0, true); - ln_alpha -= R::dgamma(Kyy_(i, i), 1.0, 1.0, true); + ln_alpha += R::dgamma(precision_proposal_(i, i), 1.0, 1.0, true); + ln_alpha -= R::dgamma(pairwise_effects_continuous_(i, i), 1.0, 1.0, true); // Jacobian for log-scale proposal ln_alpha += theta_prop - theta_curr; - if(std::log(runif(rng_)) < ln_alpha) { - double old_ii = Kyy_(i, i); - Kyy_(i, i) = precision_yy_proposal_(i, i); + if(MY_LOG(runif(rng_)) < ln_alpha) { + double old_ii = pairwise_effects_continuous_(i, i); + pairwise_effects_continuous_(i, i) = precision_proposal_(i, i); - cholesky_update_after_kyy_diag(old_ii, i); + cholesky_update_after_precision_diag(old_ii, i); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_Kyy_(i, i) = update_proposal_sd_with_robbins_monro( - prop_sd_Kyy_(i, i), ln_alpha, rm_weight, 0.44); + proposal_sd_pairwise_continuous_(i, i) = update_proposal_sd_with_robbins_monro( + proposal_sd_pairwise_continuous_(i, i), ln_alpha, rm_weight, 0.44); } } // ============================================================================= -// update_Kxy +// update_pairwise_cross // ============================================================================= -// MH update for one cross-type interaction Kxy_(i, j). +// MH update for one cross-type interaction pairwise_effects_cross_(i, j). // Acceptance: log_conditional_omrf(i) + log_conditional_ggm() + Cauchy prior. // Must save/restore conditional_mean_ around the proposal. // ============================================================================= -void MixedMRFModel::update_Kxy(int i, int j, int iteration) { - double current_val = Kxy_(i, j); - double proposed = rnorm(rng_, current_val, prop_sd_Kxy_(i, j)); +void MixedMRFModel::update_pairwise_cross(int i, int j, int iteration) { + double current_val = pairwise_effects_cross_(i, j); + double proposed = rnorm(rng_, current_val, proposal_sd_pairwise_cross_(i, j)); // Current log-posterior double ll_curr = log_conditional_ggm() @@ -532,7 +532,7 @@ void MixedMRFModel::update_Kxy(int i, int j, int iteration) { arma::mat cond_mean_saved = conditional_mean_; arma::mat Theta_saved; if(use_marginal_pl_) Theta_saved = Theta_; - Kxy_(i, j) = proposed; + pairwise_effects_cross_(i, j) = proposed; recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); @@ -547,22 +547,22 @@ void MixedMRFModel::update_Kxy(int i, int j, int iteration) { double ln_alpha = ll_prop - ll_curr; - if(std::log(runif(rng_)) >= ln_alpha) { - Kxy_(i, j) = current_val; // reject + if(MY_LOG(runif(rng_)) >= ln_alpha) { + pairwise_effects_cross_(i, j) = current_val; // reject conditional_mean_ = std::move(cond_mean_saved); if(use_marginal_pl_) Theta_ = std::move(Theta_saved); } if(iteration >= 1 && iteration < total_warmup_) { double rm_weight = std::pow(iteration, -0.75); - prop_sd_Kxy_(i, j) = update_proposal_sd_with_robbins_monro( - prop_sd_Kxy_(i, j), ln_alpha, rm_weight, 0.44); + proposal_sd_pairwise_cross_(i, j) = update_proposal_sd_with_robbins_monro( + proposal_sd_pairwise_cross_(i, j), ln_alpha, rm_weight, 0.44); } } // ============================================================================= -// update_edge_indicator_Kxx +// update_edge_indicator_discrete // ============================================================================= // Reversible-jump birth/death for a discrete-discrete edge (i, j). // Birth (G=0→1): propose k ~ N(0, σ), accept with slab + Hastings. @@ -570,9 +570,9 @@ void MixedMRFModel::update_Kxy(int i, int j, int iteration) { // Follows cond_omrf_update_association_indicator_pair in mixedGM. // ============================================================================= -void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { - double k_curr = Kxx_(i, j); - double prop_sd = prop_sd_Kxx_(i, j); +void MixedMRFModel::update_edge_indicator_discrete(int i, int j) { + double k_curr = pairwise_effects_discrete_(i, j); + double prop_sd = proposal_sd_pairwise_discrete_(i, j); int g_curr = gxx(i, j); int g_prop = 1 - g_curr; @@ -589,27 +589,27 @@ void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { if(use_marginal_pl_) { ll_curr = log_marginal_omrf(i) + log_marginal_omrf(j); - Kxx_(i, j) = k_prop; - Kxx_(j, i) = k_prop; + pairwise_effects_discrete_(i, j) = k_prop; + pairwise_effects_discrete_(j, i) = k_prop; recompute_Theta(); ll_prop = log_marginal_omrf(i) + log_marginal_omrf(j); // Restore - Kxx_(i, j) = k_curr; - Kxx_(j, i) = k_curr; + pairwise_effects_discrete_(i, j) = k_curr; + pairwise_effects_discrete_(j, i) = k_curr; recompute_Theta(); } else { ll_curr = log_conditional_omrf(i) + log_conditional_omrf(j); - Kxx_(i, j) = k_prop; - Kxx_(j, i) = k_prop; + pairwise_effects_discrete_(i, j) = k_prop; + pairwise_effects_discrete_(j, i) = k_prop; ll_prop = log_conditional_omrf(i) + log_conditional_omrf(j); // Restore - Kxx_(i, j) = k_curr; - Kxx_(j, i) = k_curr; + pairwise_effects_discrete_(i, j) = k_curr; + pairwise_effects_discrete_(j, i) = k_curr; } double ln_alpha = ll_prop - ll_curr; @@ -618,19 +618,19 @@ void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { // Birth: add slab prior, subtract proposal density, inclusion prior ln_alpha += R::dcauchy(k_prop, 0.0, pairwise_scale_, true); ln_alpha -= R::dnorm(k_prop, k_curr, prop_sd, true); - ln_alpha += std::log(inclusion_probability_(i, j)) - - std::log(1.0 - inclusion_probability_(i, j)); + ln_alpha += MY_LOG(inclusion_probability_(i, j)) + - MY_LOG(1.0 - inclusion_probability_(i, j)); } else { // Death: subtract slab prior, add reverse proposal density, inclusion prior ln_alpha -= R::dcauchy(k_curr, 0.0, pairwise_scale_, true); ln_alpha += R::dnorm(k_curr, k_prop, prop_sd, true); - ln_alpha -= std::log(inclusion_probability_(i, j)) - - std::log(1.0 - inclusion_probability_(i, j)); + ln_alpha -= MY_LOG(inclusion_probability_(i, j)) + - MY_LOG(1.0 - inclusion_probability_(i, j)); } - if(std::log(runif(rng_)) < ln_alpha) { - Kxx_(i, j) = k_prop; - Kxx_(j, i) = k_prop; + if(MY_LOG(runif(rng_)) < ln_alpha) { + pairwise_effects_discrete_(i, j) = k_prop; + pairwise_effects_discrete_(j, i) = k_prop; set_gxx(i, j, g_prop); if(use_marginal_pl_) recompute_Theta(); } @@ -638,7 +638,7 @@ void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { // ============================================================================= -// update_edge_indicator_Kyy +// update_edge_indicator_continuous // ============================================================================= // Reversible-jump birth/death for a continuous-continuous edge (i, j). // Uses Cholesky reparameterization (permute-free constants extraction). @@ -647,8 +647,8 @@ void MixedMRFModel::update_edge_indicator_Kxx(int i, int j) { // Follows cond_ggm_update_precision_indicator_pair in mixedGM. // ============================================================================= -void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { - get_kyy_constants(i, j); +void MixedMRFModel::update_edge_indicator_continuous(int i, int j) { + get_precision_constants(i, j); int g_curr = gyy(i, j); int g_prop = 1 - g_curr; @@ -657,20 +657,20 @@ void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { if(g_prop == 1) { // Birth: propose from N(0, σ) on reparameterized scale - double epsilon = rnorm(rng_, 0.0, prop_sd_Kyy_(i, j)); + double epsilon = rnorm(rng_, 0.0, proposal_sd_pairwise_continuous_(i, j)); omega_prop_ij = kyy_constants_[3] * epsilon; - omega_prop_jj = kyy_constrained_diagonal(omega_prop_ij); + omega_prop_jj = precision_constrained_diagonal(omega_prop_ij); } else { // Death: set off-diagonal to 0 omega_prop_ij = 0.0; - omega_prop_jj = kyy_constrained_diagonal(0.0); + omega_prop_jj = precision_constrained_diagonal(0.0); } // Fill proposal - precision_yy_proposal_ = Kyy_; - precision_yy_proposal_(i, j) = omega_prop_ij; - precision_yy_proposal_(j, i) = omega_prop_ij; - precision_yy_proposal_(j, j) = omega_prop_jj; + precision_proposal_ = pairwise_effects_continuous_; + precision_proposal_(i, j) = omega_prop_ij; + precision_proposal_(j, i) = omega_prop_ij; + precision_proposal_(j, j) = omega_prop_jj; // --- Likelihood ratio --- double ln_alpha = log_ggm_ratio_edge(i, j); @@ -680,12 +680,12 @@ void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { ln_alpha -= log_marginal_omrf(s); arma::mat Theta_saved = Theta_; - arma::mat Kyy_saved = Kyy_; - Kyy_ = precision_yy_proposal_; + arma::mat pairwise_effects_continuous_saved = pairwise_effects_continuous_; + pairwise_effects_continuous_ = precision_proposal_; recompute_Theta(); for(size_t s = 0; s < p_; ++s) ln_alpha += log_marginal_omrf(s); - Kyy_ = Kyy_saved; + pairwise_effects_continuous_ = pairwise_effects_continuous_saved; Theta_ = std::move(Theta_saved); } @@ -696,33 +696,33 @@ void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { // Subtract proposal density: dnorm(k_prop / C[2], 0, σ) / C[2] // = dnorm(epsilon, 0, σ) / C[2] ln_alpha -= R::dnorm(omega_prop_ij / kyy_constants_[3], 0.0, - prop_sd_Kyy_(i, j), true) - - std::log(kyy_constants_[3]); + proposal_sd_pairwise_continuous_(i, j), true) + - MY_LOG(kyy_constants_[3]); // Inclusion prior: log(π / (1-π)) - ln_alpha += std::log(inclusion_probability_(p_ + i, p_ + j)) - - std::log(1.0 - inclusion_probability_(p_ + i, p_ + j)); + ln_alpha += MY_LOG(inclusion_probability_(p_ + i, p_ + j)) + - MY_LOG(1.0 - inclusion_probability_(p_ + i, p_ + j)); } else { // Death: subtract slab prior on current off-diag - ln_alpha -= R::dcauchy(Kyy_(i, j), 0.0, pairwise_scale_, true); + ln_alpha -= R::dcauchy(pairwise_effects_continuous_(i, j), 0.0, pairwise_scale_, true); // Add reverse proposal density: dnorm(k_curr / C[2], 0, σ) / C[2] - ln_alpha += R::dnorm(Kyy_(i, j) / kyy_constants_[3], 0.0, - prop_sd_Kyy_(i, j), true) - - std::log(kyy_constants_[3]); + ln_alpha += R::dnorm(pairwise_effects_continuous_(i, j) / kyy_constants_[3], 0.0, + proposal_sd_pairwise_continuous_(i, j), true) + - MY_LOG(kyy_constants_[3]); // Inclusion prior: log((1-π) / π) - ln_alpha -= std::log(inclusion_probability_(p_ + i, p_ + j)) - - std::log(1.0 - inclusion_probability_(p_ + i, p_ + j)); + ln_alpha -= MY_LOG(inclusion_probability_(p_ + i, p_ + j)) + - MY_LOG(1.0 - inclusion_probability_(p_ + i, p_ + j)); } - if(std::log(runif(rng_)) < ln_alpha) { - double old_ij = Kyy_(i, j); - double old_jj = Kyy_(j, j); + if(MY_LOG(runif(rng_)) < ln_alpha) { + double old_ij = pairwise_effects_continuous_(i, j); + double old_jj = pairwise_effects_continuous_(j, j); - Kyy_(i, j) = omega_prop_ij; - Kyy_(j, i) = omega_prop_ij; - Kyy_(j, j) = omega_prop_jj; + pairwise_effects_continuous_(i, j) = omega_prop_ij; + pairwise_effects_continuous_(j, i) = omega_prop_ij; + pairwise_effects_continuous_(j, j) = omega_prop_jj; set_gyy(i, j, g_prop); - cholesky_update_after_kyy_edge(old_ij, old_jj, i, j); + cholesky_update_after_precision_edge(old_ij, old_jj, i, j); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); } @@ -730,7 +730,7 @@ void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { // ============================================================================= -// update_edge_indicator_Kxy +// update_edge_indicator_cross // ============================================================================= // Reversible-jump birth/death for a cross-type edge (i, j). // Birth (G=0→1): propose k ~ N(0, σ). @@ -738,9 +738,9 @@ void MixedMRFModel::update_edge_indicator_Kyy(int i, int j) { // Follows cond_omrf_update_cross_association_indicator_pair in mixedGM. // ============================================================================= -void MixedMRFModel::update_edge_indicator_Kxy(int i, int j) { - double k_curr = Kxy_(i, j); - double prop_sd = prop_sd_Kxy_(i, j); +void MixedMRFModel::update_edge_indicator_cross(int i, int j) { + double k_curr = pairwise_effects_cross_(i, j); + double prop_sd = proposal_sd_pairwise_cross_(i, j); int g_curr = gxy(i, j); int g_prop = 1 - g_curr; @@ -761,7 +761,7 @@ void MixedMRFModel::update_edge_indicator_Kxy(int i, int j) { arma::mat cond_mean_saved = conditional_mean_; arma::mat Theta_saved = Theta_; - Kxy_(i, j) = k_prop; + pairwise_effects_cross_(i, j) = k_prop; recompute_conditional_mean(); recompute_Theta(); @@ -770,20 +770,20 @@ void MixedMRFModel::update_edge_indicator_Kxy(int i, int j) { ll_prop += log_marginal_omrf(s); // Restore - Kxy_(i, j) = k_curr; + pairwise_effects_cross_(i, j) = k_curr; conditional_mean_ = std::move(cond_mean_saved); Theta_ = std::move(Theta_saved); } else { ll_curr = log_conditional_omrf(i) + log_conditional_ggm(); arma::mat cond_mean_saved = conditional_mean_; - Kxy_(i, j) = k_prop; + pairwise_effects_cross_(i, j) = k_prop; recompute_conditional_mean(); ll_prop = log_conditional_omrf(i) + log_conditional_ggm(); // Restore - Kxy_(i, j) = k_curr; + pairwise_effects_cross_(i, j) = k_curr; conditional_mean_ = std::move(cond_mean_saved); } @@ -793,18 +793,18 @@ void MixedMRFModel::update_edge_indicator_Kxy(int i, int j) { // Birth ln_alpha += R::dcauchy(k_prop, 0.0, pairwise_scale_, true); ln_alpha -= R::dnorm(k_prop, k_curr, prop_sd, true); - ln_alpha += std::log(inclusion_probability_(i, p_ + j)) - - std::log(1.0 - inclusion_probability_(i, p_ + j)); + ln_alpha += MY_LOG(inclusion_probability_(i, p_ + j)) + - MY_LOG(1.0 - inclusion_probability_(i, p_ + j)); } else { // Death ln_alpha -= R::dcauchy(k_curr, 0.0, pairwise_scale_, true); ln_alpha += R::dnorm(k_curr, k_prop, prop_sd, true); - ln_alpha -= std::log(inclusion_probability_(i, p_ + j)) - - std::log(1.0 - inclusion_probability_(i, p_ + j)); + ln_alpha -= MY_LOG(inclusion_probability_(i, p_ + j)) + - MY_LOG(1.0 - inclusion_probability_(i, p_ + j)); } - if(std::log(runif(rng_)) < ln_alpha) { - Kxy_(i, j) = k_prop; + if(MY_LOG(runif(rng_)) < ln_alpha) { + pairwise_effects_cross_(i, j) = k_prop; set_gxy(i, j, g_prop); recompute_conditional_mean(); if(use_marginal_pl_) recompute_Theta(); diff --git a/src/models/mixed/mixed_mrf_model.cpp b/src/models/mixed/mixed_mrf_model.cpp index 5e980db7..0d95387c 100644 --- a/src/models/mixed/mixed_mrf_model.cpp +++ b/src/models/mixed/mixed_mrf_model.cpp @@ -1,5 +1,6 @@ #include #include "models/mixed/mixed_mrf_model.h" +#include "math/explog_macros.h" #include "rng/rng_utils.h" #include "mcmc/execution/warmup_schedule.h" @@ -63,38 +64,38 @@ MixedMRFModel::MixedMRFModel( compute_sufficient_statistics(); // Initialize parameters to zero - mux_ = arma::zeros(p_, max_cats_); - muy_ = arma::zeros(q_); - Kxx_ = arma::zeros(p_, p_); - Kyy_ = arma::eye(q_, q_); - Kxy_ = arma::zeros(p_, q_); + main_effects_discrete_ = arma::zeros(p_, max_cats_); + main_effects_continuous_ = arma::zeros(q_); + pairwise_effects_discrete_ = arma::zeros(p_, p_); + pairwise_effects_continuous_ = arma::eye(q_, q_); + pairwise_effects_cross_ = arma::zeros(p_, q_); // Initialize proposal SDs - prop_sd_mux_ = arma::ones(p_, max_cats_); - prop_sd_muy_ = arma::ones(q_); - prop_sd_Kxx_ = arma::ones(p_, p_); - prop_sd_Kyy_ = arma::ones(q_, q_); - prop_sd_Kxy_ = arma::ones(p_, q_); - - // Initialize Kyy caches (Kyy starts as identity) - Kyy_chol_ = arma::eye(q_, q_); - inv_cholesky_yy_ = arma::eye(q_, q_); - covariance_yy_ = arma::eye(q_, q_); - Kyy_log_det_ = 0.0; + proposal_sd_main_discrete_ = arma::ones(p_, max_cats_); + proposal_sd_main_continuous_ = arma::ones(q_); + proposal_sd_pairwise_discrete_ = arma::ones(p_, p_); + proposal_sd_pairwise_continuous_ = arma::ones(q_, q_); + proposal_sd_pairwise_cross_ = arma::ones(p_, q_); + + // Initialize precision caches (K_yy starts as identity) + cholesky_of_precision_ = arma::eye(q_, q_); + inv_cholesky_of_precision_ = arma::eye(q_, q_); + covariance_continuous_ = arma::eye(q_, q_); + log_det_precision_ = 0.0; // Rank-1 Cholesky update workspace - precision_yy_proposal_ = arma::mat(q_, q_, arma::fill::none); + precision_proposal_ = arma::mat(q_, q_, arma::fill::none); kyy_vf1_ = arma::zeros(q_); kyy_vf2_ = arma::zeros(q_); kyy_u1_ = arma::zeros(q_); kyy_u2_ = arma::zeros(q_); - // Initialize conditional mean: μ_y' + 2 x Kxy Kyy_inv - // With Kxy = 0 and Kyy = I, this is just 1 * μ_y' = 0. + // Initialize conditional mean: M = μ_y' + 2 X K_xy Σ_yy + // With K_xy = 0 and K_yy = I, this reduces to μ_y' = 0. conditional_mean_ = arma::zeros(n_, q_); - // Initialize Theta (marginal PL only): Kxx + 2 Kxy Kyy_inv Kxy' - // With Kxy = 0, Theta = Kxx = 0. + // Initialize Theta (marginal PL only): Θ = K_xx + 2 K_xy Σ_yy K_xy' + // With K_xy = 0, Θ = K_xx = 0. if(use_marginal_pl_) { Theta_ = arma::zeros(p_, p_); } @@ -131,11 +132,11 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) has_missing_(other.has_missing_), counts_per_category_(other.counts_per_category_), blume_capel_stats_(other.blume_capel_stats_), - mux_(other.mux_), - muy_(other.muy_), - Kxx_(other.Kxx_), - Kyy_(other.Kyy_), - Kxy_(other.Kxy_), + main_effects_discrete_(other.main_effects_discrete_), + main_effects_continuous_(other.main_effects_continuous_), + pairwise_effects_discrete_(other.pairwise_effects_discrete_), + pairwise_effects_continuous_(other.pairwise_effects_continuous_), + pairwise_effects_cross_(other.pairwise_effects_cross_), edge_indicators_(other.edge_indicators_), inclusion_probability_(other.inclusion_probability_), edge_selection_(other.edge_selection_), @@ -143,20 +144,20 @@ MixedMRFModel::MixedMRFModel(const MixedMRFModel& other) main_alpha_(other.main_alpha_), main_beta_(other.main_beta_), pairwise_scale_(other.pairwise_scale_), - prop_sd_mux_(other.prop_sd_mux_), - prop_sd_muy_(other.prop_sd_muy_), - prop_sd_Kxx_(other.prop_sd_Kxx_), - prop_sd_Kyy_(other.prop_sd_Kyy_), - prop_sd_Kxy_(other.prop_sd_Kxy_), + proposal_sd_main_discrete_(other.proposal_sd_main_discrete_), + proposal_sd_main_continuous_(other.proposal_sd_main_continuous_), + proposal_sd_pairwise_discrete_(other.proposal_sd_pairwise_discrete_), + proposal_sd_pairwise_continuous_(other.proposal_sd_pairwise_continuous_), + proposal_sd_pairwise_cross_(other.proposal_sd_pairwise_cross_), total_warmup_(other.total_warmup_), - Kyy_chol_(other.Kyy_chol_), - inv_cholesky_yy_(other.inv_cholesky_yy_), - covariance_yy_(other.covariance_yy_), - Kyy_log_det_(other.Kyy_log_det_), + cholesky_of_precision_(other.cholesky_of_precision_), + inv_cholesky_of_precision_(other.inv_cholesky_of_precision_), + covariance_continuous_(other.covariance_continuous_), + log_det_precision_(other.log_det_precision_), Theta_(other.Theta_), conditional_mean_(other.conditional_mean_), kyy_constants_(other.kyy_constants_), - precision_yy_proposal_(other.precision_yy_proposal_), + precision_proposal_(other.precision_proposal_), kyy_v1_(other.kyy_v1_), kyy_v2_(other.kyy_v2_), kyy_vf1_(other.kyy_vf1_), @@ -223,21 +224,21 @@ size_t MixedMRFModel::count_num_main_effects() const { // ============================================================================= void MixedMRFModel::recompute_conditional_mean() { - // conditional_mean_ = 1*μ_y' + 2 * discrete_obs * Kxy * covariance_yy_ - conditional_mean_ = arma::repmat(muy_.t(), n_, 1) + - 2.0 * discrete_observations_dbl_ * Kxy_ * covariance_yy_; + // M = μ_y' + 2 X K_xy Σ_yy + conditional_mean_ = arma::repmat(main_effects_continuous_.t(), n_, 1) + + 2.0 * discrete_observations_dbl_ * pairwise_effects_cross_ * covariance_continuous_; } -void MixedMRFModel::recompute_Kyy_decomposition() { - Kyy_chol_ = arma::chol(Kyy_); // upper Cholesky: Kyy = R'R - arma::inv(inv_cholesky_yy_, arma::trimatu(Kyy_chol_)); - covariance_yy_ = inv_cholesky_yy_ * inv_cholesky_yy_.t(); - Kyy_log_det_ = cholesky_helpers::get_log_det(Kyy_chol_); +void MixedMRFModel::recompute_pairwise_effects_continuous_decomposition() { + cholesky_of_precision_ = arma::chol(pairwise_effects_continuous_); // upper Cholesky: K_yy = R'R + arma::inv(inv_cholesky_of_precision_, arma::trimatu(cholesky_of_precision_)); + covariance_continuous_ = inv_cholesky_of_precision_ * inv_cholesky_of_precision_.t(); + log_det_precision_ = cholesky_helpers::get_log_det(cholesky_of_precision_); } void MixedMRFModel::recompute_Theta() { - // Θ = Kxx + 2 Kxy covariance_yy_ Kxy' - Theta_ = Kxx_ + 2.0 * Kxy_ * covariance_yy_ * Kxy_.t(); + // Θ = K_xx + 2 K_xy Σ_yy K_xy' + Theta_ = pairwise_effects_discrete_ + 2.0 * pairwise_effects_cross_ * covariance_continuous_ * pairwise_effects_cross_.t(); } @@ -245,31 +246,31 @@ void MixedMRFModel::recompute_Theta() { // Parameter vectorization // ============================================================================= -// NUTS vectorization order (excludes Kyy — sampled by MH separately): -// 1. mux_: per-variable (ordinal: C_s thresholds; BC: 2 coefficients) -// 2. Kxx_: upper-triangular, row-major — p(p-1)/2 -// 3. muy_: all q means -// 4. Kxy_: all p*q entries, row-major +// NUTS vectorization order (excludes pairwise_effects_continuous_ — sampled by MH separately): +// 1. main_effects_discrete_: per-variable (ordinal: C_s thresholds; BC: 2 coefficients) +// 2. pairwise_effects_discrete_: upper-triangular, row-major — p(p-1)/2 +// 3. main_effects_continuous_: all q means +// 4. pairwise_effects_cross_: all p*q entries, row-major // -// Storage vectorization order (includes Kyy): +// Storage vectorization order (includes pairwise_effects_continuous_): // 1–4. Same as NUTS order -// 5. Kyy_: upper-triangle including diagonal — q(q+1)/2 +// 5. pairwise_effects_continuous_: upper-triangle including diagonal — q(q+1)/2 size_t MixedMRFModel::parameter_dimension() const { if(!edge_selection_active_) { return full_parameter_dimension(); } - // Count active NUTS parameters only (no Kyy) - size_t dim = num_main_ + q_; // mux + muy always active + // Count active NUTS parameters only (no pairwise_effects_continuous_) + size_t dim = num_main_ + q_; // main effects always active - // Active Kxx edges + // Active pairwise_effects_discrete_ edges for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(gxx(i, j)) dim++; } } - // Active Kxy edges + // Active pairwise_effects_cross_ edges for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(gxy(i, j)) dim++; @@ -280,52 +281,52 @@ size_t MixedMRFModel::parameter_dimension() const { } size_t MixedMRFModel::full_parameter_dimension() const { - // NUTS block: mux + Kxx upper-tri + muy + Kxy full (no Kyy) + // NUTS block: main + pairwise_discrete upper-tri + means + pairwise_cross (no precision) return num_main_ + num_pairwise_xx_ + q_ + num_cross_; } size_t MixedMRFModel::storage_dimension() const { - // All parameters including Kyy + // All parameters including pairwise_effects_continuous_ return num_main_ + num_pairwise_xx_ + q_ + (q_ * (q_ + 1)) / 2 + num_cross_; } arma::vec MixedMRFModel::get_vectorized_parameters() const { - // Active NUTS parameters only (excludes Kyy, excludes inactive edges) + // Active NUTS parameters only (excludes precision, excludes inactive edges) arma::vec out(parameter_dimension()); size_t idx = 0; - // 1. mux_ + // 1. main_effects_discrete_ for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) { - out(idx++) = mux_(s, c); + out(idx++) = main_effects_discrete_(s, c); } } else { - out(idx++) = mux_(s, 0); - out(idx++) = mux_(s, 1); + out(idx++) = main_effects_discrete_(s, 0); + out(idx++) = main_effects_discrete_(s, 1); } } - // 2. Kxx_ upper-triangular (active edges only when selection is active) + // 2. pairwise_effects_discrete_ upper-triangular (active edges only when selection is active) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(!edge_selection_active_ || gxx(i, j) == 1) { - out(idx++) = Kxx_(i, j); + out(idx++) = pairwise_effects_discrete_(i, j); } } } - // 3. muy_ + // 3. main_effects_continuous_ for(size_t j = 0; j < q_; ++j) { - out(idx++) = muy_(j); + out(idx++) = main_effects_continuous_(j); } - // 4. Kxy_ row-major (active edges only when selection is active) + // 4. pairwise_effects_cross_ row-major (active edges only when selection is active) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(!edge_selection_active_ || gxy(i, j) == 1) { - out(idx++) = Kxy_(i, j); + out(idx++) = pairwise_effects_cross_(i, j); } } } @@ -334,38 +335,38 @@ arma::vec MixedMRFModel::get_vectorized_parameters() const { } arma::vec MixedMRFModel::get_full_vectorized_parameters() const { - // All NUTS parameters, fixed size (inactive edges are 0, no Kyy) + // All NUTS parameters, fixed size (inactive edges are 0, no precision) arma::vec out(full_parameter_dimension(), arma::fill::zeros); size_t idx = 0; - // 1. mux_ + // 1. main_effects_discrete_ for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) { - out(idx++) = mux_(s, c); + out(idx++) = main_effects_discrete_(s, c); } } else { - out(idx++) = mux_(s, 0); - out(idx++) = mux_(s, 1); + out(idx++) = main_effects_discrete_(s, 0); + out(idx++) = main_effects_discrete_(s, 1); } } - // 2. Kxx_ upper-triangular (all entries, zeros for inactive) + // 2. pairwise_effects_discrete_ upper-triangular (all entries, zeros for inactive) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { - out(idx++) = Kxx_(i, j); + out(idx++) = pairwise_effects_discrete_(i, j); } } - // 3. muy_ + // 3. main_effects_continuous_ for(size_t j = 0; j < q_; ++j) { - out(idx++) = muy_(j); + out(idx++) = main_effects_continuous_(j); } - // 4. Kxy_ row-major (all entries, zeros for inactive) + // 4. pairwise_effects_cross_ row-major (all entries, zeros for inactive) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { - out(idx++) = Kxy_(i, j); + out(idx++) = pairwise_effects_cross_(i, j); } } @@ -373,45 +374,45 @@ arma::vec MixedMRFModel::get_full_vectorized_parameters() const { } arma::vec MixedMRFModel::get_storage_vectorized_parameters() const { - // All parameters including Kyy, fixed size + // All parameters including pairwise_effects_continuous_, fixed size arma::vec out(storage_dimension(), arma::fill::zeros); size_t idx = 0; - // 1. mux_ + // 1. main_effects_discrete_ for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) { - out(idx++) = mux_(s, c); + out(idx++) = main_effects_discrete_(s, c); } } else { - out(idx++) = mux_(s, 0); - out(idx++) = mux_(s, 1); + out(idx++) = main_effects_discrete_(s, 0); + out(idx++) = main_effects_discrete_(s, 1); } } - // 2. Kxx_ upper-triangular + // 2. pairwise_effects_discrete_ upper-triangular for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { - out(idx++) = Kxx_(i, j); + out(idx++) = pairwise_effects_discrete_(i, j); } } - // 3. muy_ + // 3. main_effects_continuous_ for(size_t j = 0; j < q_; ++j) { - out(idx++) = muy_(j); + out(idx++) = main_effects_continuous_(j); } - // 4. Kxy_ row-major + // 4. pairwise_effects_cross_ row-major for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { - out(idx++) = Kxy_(i, j); + out(idx++) = pairwise_effects_cross_(i, j); } } - // 5. Kyy_ upper-triangle including diagonal + // 5. pairwise_effects_continuous_ upper-triangle including diagonal for(size_t i = 0; i < q_; ++i) { for(size_t j = i; j < q_; ++j) { - out(idx++) = Kyy_(i, j); + out(idx++) = pairwise_effects_continuous_(i, j); } } @@ -419,47 +420,47 @@ arma::vec MixedMRFModel::get_storage_vectorized_parameters() const { } void MixedMRFModel::set_vectorized_parameters(const arma::vec& params) { - // Unpack NUTS block only (no Kyy) + // Unpack NUTS block only (no pairwise_effects_continuous_) size_t idx = 0; - // 1. mux_ + // 1. main_effects_discrete_ for(size_t s = 0; s < p_; ++s) { if(is_ordinal_variable_(s)) { for(int c = 0; c < num_categories_(s); ++c) { - mux_(s, c) = params(idx++); + main_effects_discrete_(s, c) = params(idx++); } } else { - mux_(s, 0) = params(idx++); - mux_(s, 1) = params(idx++); + main_effects_discrete_(s, 0) = params(idx++); + main_effects_discrete_(s, 1) = params(idx++); } } - // 2. Kxx_ upper-triangular (active edges only when selection is active) + // 2. pairwise_effects_discrete_ upper-triangular (active edges only when selection is active) for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(!edge_selection_active_ || gxx(i, j) == 1) { - Kxx_(i, j) = params(idx); - Kxx_(j, i) = params(idx); + pairwise_effects_discrete_(i, j) = params(idx); + pairwise_effects_discrete_(j, i) = params(idx); idx++; } } } - // 3. muy_ + // 3. main_effects_continuous_ for(size_t j = 0; j < q_; ++j) { - muy_(j) = params(idx++); + main_effects_continuous_(j) = params(idx++); } - // 4. Kxy_ row-major (active edges only when selection is active) + // 4. pairwise_effects_cross_ row-major (active edges only when selection is active) for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(!edge_selection_active_ || gxy(i, j) == 1) { - Kxy_(i, j) = params(idx++); + pairwise_effects_cross_(i, j) = params(idx++); } } } - // Refresh caches (Kyy unchanged, so no Kyy decomposition update needed) + // Refresh caches (precision unchanged, so no decomposition update needed) recompute_conditional_mean(); if(use_marginal_pl_) { recompute_Theta(); @@ -478,7 +479,7 @@ arma::vec MixedMRFModel::get_active_inv_mass() const { size_t offset_full = num_main_; size_t offset_active = num_main_; - // Kxx active edges + // pairwise_effects_discrete_ active edges for(size_t i = 0; i < p_ - 1; ++i) { for(size_t j = i + 1; j < p_; ++j) { if(gxx(i, j) == 1) { @@ -488,12 +489,12 @@ arma::vec MixedMRFModel::get_active_inv_mass() const { } } - // muy: always active + // main_effects_continuous_: always active for(size_t j = 0; j < q_; ++j) { active(offset_active++) = inv_mass_(offset_full++); } - // Kxy active edges + // pairwise_effects_cross_ active edges for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(gxy(i, j) == 1) { @@ -574,40 +575,40 @@ void MixedMRFModel::impute_missing() { const int variable = missing_index_discrete_(miss, 1); const int num_cats = num_categories_(variable); - // Rest score: sum_t x_vt * Kxx(t,s) + 2 * sum_j y_vj * Kxy(s,j) - // Kxx diagonal is zero, so no self-interaction subtraction needed + // Rest score: sum_t x_vt K_xx(t,s) + 2 sum_j y_vj K_xy(s,j) + // K_xx diagonal is zero, so no self-interaction subtraction needed double rest_v = 0.0; for(size_t t = 0; t < p_; t++) { - rest_v += discrete_observations_dbl_(person, t) * Kxx_(t, variable); + rest_v += discrete_observations_dbl_(person, t) * pairwise_effects_discrete_(t, variable); } for(size_t j = 0; j < q_; j++) { - rest_v += 2.0 * continuous_observations_(person, j) * Kxy_(variable, j); + rest_v += 2.0 * continuous_observations_(person, j) * pairwise_effects_cross_(variable, j); } double cumsum = 0.0; if(is_ordinal_variable_(variable)) { - // P(x=0) = 1, P(x=c) ∝ exp(c * rest + mux(s, c-1)) + // P(x=0) = 1, P(x=c) ∝ exp(c · rest + μ_x(s, c-1)) cumsum = 1.0; category_probabilities(0) = cumsum; for(int c = 1; c <= num_cats; c++) { double exponent = static_cast(c) * rest_v + - mux_(variable, c - 1); - cumsum += std::exp(exponent); + main_effects_discrete_(variable, c - 1); + cumsum += MY_EXP(exponent); category_probabilities(c) = cumsum; } } else { // Blume-Capel: categories centered at baseline const int ref = baseline_category_(variable); - double alpha = mux_(variable, 0); - double beta = mux_(variable, 1); + double alpha = main_effects_discrete_(variable, 0); + double beta = main_effects_discrete_(variable, 1); cumsum = 0.0; for(int cat = 0; cat <= num_cats; cat++) { const int score = cat - ref; double exponent = alpha * score + beta * score * score + score * rest_v; - cumsum += std::exp(exponent); + cumsum += MY_EXP(exponent); category_probabilities(cat) = cumsum; } } @@ -654,17 +655,17 @@ void MixedMRFModel::impute_missing() { const int person = missing_index_continuous_(miss, 0); const int variable = missing_index_continuous_(miss, 1); - // Conditional: y_vj | y_{v,-j}, x ~ N(mu*, 1/Kyy_jj) - // mu* = M_vj - (1/Kyy_jj) * sum_{k!=j} Kyy_jk * (y_vk - M_vk) + // Conditional: y_vj | y_{v,-j}, x ~ N(mu*, 1/pairwise_effects_continuous_jj) + // mu* = M_vj - (1/pairwise_effects_continuous_jj) * sum_{k!=j} pairwise_effects_continuous_jk * (y_vk - M_vk) double cond_mean = conditional_mean_(person, variable); for(size_t k = 0; k < q_; k++) { if(k != static_cast(variable)) { - cond_mean -= (Kyy_(variable, k) / Kyy_(variable, variable)) * + cond_mean -= (pairwise_effects_continuous_(variable, k) / pairwise_effects_continuous_(variable, variable)) * (continuous_observations_(person, k) - conditional_mean_(person, k)); } } - double cond_sd = std::sqrt(1.0 / Kyy_(variable, variable)); + double cond_sd = std::sqrt(1.0 / pairwise_effects_continuous_(variable, variable)); continuous_observations_(person, variable) = rnorm(rng_, cond_mean, cond_sd); @@ -696,43 +697,43 @@ void MixedMRFModel::do_one_metropolis_step(int iteration) { for(size_t j = 0; j < q_; ++j) update_continuous_mean(j, iteration); - // Step 3: Update Kxx (upper triangle, edge-gated) + // Step 3: Update pairwise_effects_discrete_ (upper triangle, edge-gated) for(size_t i = 0; i < p_ - 1; ++i) for(size_t j = i + 1; j < p_; ++j) if(!edge_selection_active_ || gxx(i, j) == 1) - update_Kxx(i, j, iteration); + update_pairwise_discrete(i, j, iteration); - // Step 4: Update Kyy (off-diag + diagonal, edge-gated) + // Step 4: Update pairwise_effects_continuous_ (off-diag + diagonal, edge-gated) if(q_ >= 2) { for(size_t i = 0; i < q_ - 1; ++i) for(size_t j = i + 1; j < q_; ++j) if(!edge_selection_active_ || gyy(i, j) == 1) - update_Kyy_offdiag(i, j, iteration); + update_pairwise_effects_continuous_offdiag(i, j, iteration); } for(size_t i = 0; i < q_; ++i) - update_Kyy_diag(i, iteration); + update_pairwise_effects_continuous_diag(i, iteration); - // Step 5: Update Kxy (edge-gated) + // Step 5: Update pairwise_effects_cross_ (edge-gated) for(size_t i = 0; i < p_; ++i) for(size_t j = 0; j < q_; ++j) if(!edge_selection_active_ || gxy(i, j) == 1) - update_Kxy(i, j, iteration); + update_pairwise_cross(i, j, iteration); // Edge-indicator updates are handled by ChainRunner, not here. // (Matches the OMRF pattern; avoids double-counting indicator proposals.) } -void MixedMRFModel::do_kyy_metropolis_step(int iteration) { - // Off-diagonal Kyy (edge-gated) +void MixedMRFModel::do_pairwise_continuous_metropolis_step(int iteration) { + // Off-diagonal precision (edge-gated) if(q_ >= 2) { for(size_t i = 0; i < q_ - 1; ++i) for(size_t j = i + 1; j < q_; ++j) if(!edge_selection_active_ || gyy(i, j) == 1) - update_Kyy_offdiag(i, j, iteration); + update_pairwise_effects_continuous_offdiag(i, j, iteration); } - // Diagonal Kyy (always updated) + // Diagonal precision (always updated) for(size_t i = 0; i < q_; ++i) - update_Kyy_diag(i, iteration); + update_pairwise_effects_continuous_diag(i, iteration); } void MixedMRFModel::update_edge_indicators() { @@ -754,7 +755,7 @@ void MixedMRFModel::update_edge_indicators() { } count += row_len; } - update_edge_indicator_Kxx(i, j); + update_edge_indicator_discrete(i, j); } // Continuous-continuous edges (shuffled order) @@ -770,7 +771,7 @@ void MixedMRFModel::update_edge_indicators() { } count += row_len; } - update_edge_indicator_Kyy(i, j); + update_edge_indicator_continuous(i, j); } // Cross edges (shuffled order) @@ -778,7 +779,7 @@ void MixedMRFModel::update_edge_indicators() { size_t idx = edge_order_xy_(e); size_t i = idx / q_; size_t j = idx % q_; - update_edge_indicator_Kxy(i, j); + update_edge_indicator_cross(i, j); } } @@ -789,8 +790,8 @@ void MixedMRFModel::initialize_graph() { for(size_t j = i + 1; j < p_; ++j) { if(runif(rng_) >= inclusion_probability_(i, j)) { set_gxx(i, j, 0); - Kxx_(i, j) = 0.0; - Kxx_(j, i) = 0.0; + pairwise_effects_discrete_(i, j) = 0.0; + pairwise_effects_discrete_(j, i) = 0.0; } } } @@ -799,20 +800,20 @@ void MixedMRFModel::initialize_graph() { for(size_t j = i + 1; j < q_; ++j) { if(runif(rng_) >= inclusion_probability_(p_ + i, p_ + j)) { set_gyy(i, j, 0); - Kyy_(i, j) = 0.0; - Kyy_(j, i) = 0.0; + pairwise_effects_continuous_(i, j) = 0.0; + pairwise_effects_continuous_(j, i) = 0.0; } } } - // Recompute Kyy decomposition after potential zeroing - recompute_Kyy_decomposition(); + // Recompute precision decomposition after potential zeroing + recompute_pairwise_effects_continuous_decomposition(); recompute_conditional_mean(); for(size_t i = 0; i < p_; ++i) { for(size_t j = 0; j < q_; ++j) { if(runif(rng_) >= inclusion_probability_(i, p_ + j)) { set_gxy(i, j, 0); - Kxy_(i, j) = 0.0; + pairwise_effects_cross_(i, j) = 0.0; } } } diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index aa9d9a85..8bbb1a43 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -109,10 +109,10 @@ class MixedMRFModel : public BaseModel { void do_one_metropolis_step(int iteration = -1) override; /** - * Update only Kyy parameters via Metropolis (used by hybrid NUTS+MH). + * Update only continuous precision parameters via Metropolis (hybrid NUTS+MH). * @param iteration Current iteration (for Robbins-Monro adaptation) */ - void do_kyy_metropolis_step(int iteration = -1); + void do_pairwise_continuous_metropolis_step(int iteration = -1); /** * Initialize Metropolis adaptation controllers for proposal-SD tuning. @@ -155,39 +155,39 @@ class MixedMRFModel : public BaseModel { // ========================================================================= /** - * Dimensionality of the active NUTS parameter space (excludes Kyy). + * Dimensionality of the active NUTS parameter space (excludes precision). * When edge selection is active, excludes parameters for inactive edges. */ size_t parameter_dimension() const override; /** * Full NUTS-block dimension (all NUTS params, regardless of edge state). - * Excludes Kyy. Used for mass-matrix sizing and adaptation. + * Excludes continuous precision. Used for mass-matrix sizing and adaptation. */ size_t full_parameter_dimension() const override; /** - * Storage dimension (all parameters including Kyy, regardless of edge state). - * Used for fixed-size sample storage. + * Storage dimension (all parameters including continuous precision, + * regardless of edge state). Used for fixed-size sample storage. */ size_t storage_dimension() const override; - /** Get active NUTS parameters as a flat vector (excludes Kyy). */ + /** Get active NUTS parameters as a flat vector (excludes precision). */ arma::vec get_vectorized_parameters() const override; - /** Get all NUTS parameters (inactive edges are 0, excludes Kyy). */ + /** Get all NUTS parameters (inactive edges zeroed, excludes precision). */ arma::vec get_full_vectorized_parameters() const override; - /** Get all parameters including Kyy for sample storage. */ + /** Get all parameters including continuous precision for sample storage. */ arma::vec get_storage_vectorized_parameters() const override; - /** Set NUTS parameters from a flat vector (does not touch Kyy). */ + /** Set NUTS parameters from a flat vector (does not touch precision). */ void set_vectorized_parameters(const arma::vec& params) override; /** Get vectorized edge indicators (Gxx upper-tri, Gyy upper-tri, Gxy full). */ arma::ivec get_vectorized_indicator_parameters() override; - /** Get active subset of inverse mass diagonal (NUTS params only, excludes Kyy). */ + /** Get active subset of inverse mass diagonal (NUTS params only, excludes precision). */ arma::vec get_active_inv_mass() const override; // ========================================================================= @@ -287,11 +287,11 @@ class MixedMRFModel : public BaseModel { // Parameters // ========================================================================= - arma::mat mux_; ///< p x max_cats main effects (thresholds or alpha/beta) - arma::vec muy_; ///< q-vector continuous means - arma::mat Kxx_; ///< p x p discrete interactions (symmetric, zero diag) - arma::mat Kyy_; ///< q x q SPD precision matrix - arma::mat Kxy_; ///< p x q cross-type interactions + arma::mat main_effects_discrete_; ///< p x max_cats main effects (thresholds or alpha/beta) + arma::vec main_effects_continuous_; ///< q-vector continuous means + arma::mat pairwise_effects_discrete_; ///< p x p discrete interactions (symmetric, zero diag) + arma::mat pairwise_effects_continuous_; ///< q x q SPD precision matrix + arma::mat pairwise_effects_cross_; ///< p x q cross-type interactions // ========================================================================= // Edge indicators @@ -318,27 +318,27 @@ class MixedMRFModel : public BaseModel { // Proposal SDs (Robbins-Monro adapted) // ========================================================================= - arma::mat prop_sd_mux_; ///< p x max_cats - arma::vec prop_sd_muy_; ///< q-vector - arma::mat prop_sd_Kxx_; ///< p x p - arma::mat prop_sd_Kyy_; ///< q x q - arma::mat prop_sd_Kxy_; ///< p x q + arma::mat proposal_sd_main_discrete_; ///< p x max_cats + arma::vec proposal_sd_main_continuous_; ///< q-vector + arma::mat proposal_sd_pairwise_discrete_; ///< p x p + arma::mat proposal_sd_pairwise_continuous_; ///< q x q + arma::mat proposal_sd_pairwise_cross_; ///< p x q int total_warmup_ = 0; ///< Stored by init_metropolis_adaptation // ========================================================================= // Cached quantities // ========================================================================= - arma::mat Kyy_chol_; ///< q x q upper Cholesky of Kyy (Kyy = R'R) - arma::mat inv_cholesky_yy_; ///< q x q R^{-1} (upper triangular) - arma::mat covariance_yy_; ///< q x q Kyy^{-1} = R^{-1} R^{-T} - double Kyy_log_det_; ///< log|Kyy| - arma::mat Theta_; ///< p x p Kxx + 2 Kxy covariance_yy_ Kxy' (marginal PL) - arma::mat conditional_mean_; ///< n x q mu_y' + 2 discrete_obs Kxy covariance_yy_ + arma::mat cholesky_of_precision_; ///< q x q upper Cholesky R (K_yy = R'R) + arma::mat inv_cholesky_of_precision_; ///< q x q R^{-1} (upper triangular) + arma::mat covariance_continuous_; ///< q x q K_yy^{-1} = R^{-1} R^{-T} + double log_det_precision_; ///< log|K_yy| + arma::mat Theta_; ///< p x p marginal PL interaction matrix + arma::mat conditional_mean_; ///< n x q conditional mean mu_y + 2 X K_xy Sigma_yy // Rank-1 Cholesky update workspace std::array kyy_constants_{}; ///< Reparameterization constants - arma::mat precision_yy_proposal_; ///< q x q scratch for proposed Kyy + arma::mat precision_proposal_; ///< q x q scratch for proposed precision arma::vec kyy_v1_ = {0, -1}; ///< Rank-2 decomposition helper 1 arma::vec kyy_v2_ = {0, 0}; ///< Rank-2 decomposition helper 2 arma::vec kyy_vf1_; ///< q-vector, zeroed between uses @@ -354,7 +354,7 @@ class MixedMRFModel : public BaseModel { arma::vec grad_obs_cache_; ///< Cached observed-data gradient component arma::imat kxx_index_cache_; ///< p x p map from (i,j) to gradient index arma::imat kxy_index_cache_; ///< p x q map from (i,j) to gradient index - int muy_grad_offset_ = 0; ///< Offset of muy block in gradient vector + int main_effects_continuous_grad_offset_ = 0; ///< Offset of main_effects_continuous block in gradient vector bool gradient_cache_valid_ = false; ///< Whether gradient cache is current // ========================================================================= @@ -382,13 +382,13 @@ class MixedMRFModel : public BaseModel { /** Compute category counts and BC sufficient statistics from discrete_observations_. */ void compute_sufficient_statistics(); - /** Recompute conditional_mean_ from muy_, Kxy_, covariance_yy_. */ + /** Recompute conditional_mean_ from main_effects_continuous_, pairwise_effects_cross_, covariance_continuous_. */ void recompute_conditional_mean(); - /** Recompute Kyy_chol_, inv_cholesky_yy_, covariance_yy_, Kyy_log_det_ from Kyy_. */ - void recompute_Kyy_decomposition(); + /** Recompute cholesky_of_precision_, inv_cholesky_of_precision_, covariance_continuous_, log_det_precision_ from pairwise_effects_continuous_. */ + void recompute_pairwise_effects_continuous_decomposition(); - /** Recompute Theta_ from Kxx_, Kxy_, covariance_yy_ (marginal PL only). */ + /** Recompute Theta_ from pairwise_effects_discrete_, pairwise_effects_cross_, covariance_continuous_ (marginal PL only). */ void recompute_Theta(); // ========================================================================= @@ -404,10 +404,10 @@ class MixedMRFModel : public BaseModel { /** Unpack NUTS-vector into temporary parameter matrices (no model mutation). */ void unvectorize_nuts_to_temps( const arma::vec& params, - arma::mat& temp_mux, - arma::mat& temp_Kxx, - arma::vec& temp_muy, - arma::mat& temp_Kxy + arma::mat& temp_main_discrete, + arma::mat& temp_pairwise_discrete, + arma::vec& temp_main_continuous, + arma::mat& temp_pairwise_cross ) const; // ========================================================================= @@ -427,59 +427,59 @@ class MixedMRFModel : public BaseModel { // MH update functions (implemented in mixed_mrf_metropolis.cpp) // ========================================================================= - // --- Rank-1 Kyy proposal helpers (permutation-free) --- + // --- Rank-1 precision proposal helpers (permutation-free) --- - // Extract reparameterization constants for the (i,j) off-diagonal Kyy update. - // Populates kyy_constants_[0..5] from Kyy_chol_ and covariance_yy_. - void get_kyy_constants(int i, int j); + // Extract reparameterization constants for the (i,j) off-diagonal precision update. + // Populates kyy_constants_[0..5] from cholesky_of_precision_ and covariance_continuous_. + void get_precision_constants(int i, int j); - // Constrained diagonal value for a proposed off-diagonal Kyy element. - double kyy_constrained_diagonal(double x) const; + // Constrained diagonal value for a proposed off-diagonal precision element. + double precision_constrained_diagonal(double x) const; - // Log-likelihood ratio for a proposed off-diagonal Kyy change (rank-2). - // Assumes precision_yy_proposal_ is already filled by the caller. + // Log-likelihood ratio for a proposed off-diagonal precision change (rank-2). + // Assumes precision_proposal_ is already filled by the caller. double log_ggm_ratio_edge(int i, int j) const; - // Log-likelihood ratio for a proposed diagonal Kyy change (rank-1). - // Assumes precision_yy_proposal_ is already filled by the caller. + // Log-likelihood ratio for a proposed diagonal precision change (rank-1). + // Assumes precision_proposal_ is already filled by the caller. double log_ggm_ratio_diag(int i) const; - // Rank-1 Cholesky update after accepting an off-diagonal Kyy change. - void cholesky_update_after_kyy_edge(double old_ij, double old_jj, int i, int j); + // Rank-1 Cholesky update after accepting an off-diagonal precision change. + void cholesky_update_after_precision_edge(double old_ij, double old_jj, int i, int j); - // Rank-1 Cholesky update after accepting a diagonal Kyy change. - void cholesky_update_after_kyy_diag(double old_ii, int i); + // Rank-1 Cholesky update after accepting a diagonal precision change. + void cholesky_update_after_precision_diag(double old_ii, int i); // --- Parameter update sweeps --- - /** Update one main-effect: mux_(s, c). Ordinal threshold or BC α/β. */ + /** Update one main-effect: main_effects_discrete_(s, c). Ordinal threshold or BC α/β. */ void update_main_effect(int s, int c, int iteration); - /** Update one continuous mean: muy_(j). */ + /** Update one continuous mean: main_effects_continuous_(j). */ void update_continuous_mean(int j, int iteration); - /** Update one discrete interaction: Kxx_(i, j). Symmetric. */ - void update_Kxx(int i, int j, int iteration); + /** Update one discrete interaction: pairwise_effects_discrete_(i, j). Symmetric. */ + void update_pairwise_discrete(int i, int j, int iteration); - /** Update one off-diagonal precision element: Kyy_(i, j). Cholesky-based. */ - void update_Kyy_offdiag(int i, int j, int iteration); + /** Update one off-diagonal precision element. Cholesky-based. */ + void update_pairwise_effects_continuous_offdiag(int i, int j, int iteration); - /** Update one diagonal precision element: Kyy_(i, i). Log-scale Cholesky. */ - void update_Kyy_diag(int i, int iteration); + /** Update one diagonal precision element. Log-scale Cholesky. */ + void update_pairwise_effects_continuous_diag(int i, int iteration); - /** Update one cross interaction: Kxy_(i, j). */ - void update_Kxy(int i, int j, int iteration); + /** Update one cross interaction: pairwise_effects_cross_(i, j). */ + void update_pairwise_cross(int i, int j, int iteration); // --- Edge-indicator update sweeps (Phase D) --- - /** Reversible-jump birth/death for one Kxx edge (discrete-discrete). */ - void update_edge_indicator_Kxx(int i, int j); + /** Reversible-jump birth/death for one discrete-discrete edge. */ + void update_edge_indicator_discrete(int i, int j); - /** Reversible-jump birth/death for one Kyy edge (continuous-continuous). */ - void update_edge_indicator_Kyy(int i, int j); + /** Reversible-jump birth/death for one continuous-continuous edge. */ + void update_edge_indicator_continuous(int i, int j); - /** Reversible-jump birth/death for one Kxy edge (cross-type). */ - void update_edge_indicator_Kxy(int i, int j); + /** Reversible-jump birth/death for one cross-type edge. */ + void update_edge_indicator_cross(int i, int j); // ========================================================================= // Edge-indicator accessor helpers From d58848b23e00f71fa46b1481c4106bc03c05a46a Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:04:50 +0100 Subject: [PATCH 32/60] refactor: code deduplication + move cholupdate to src/math (audit K, part 2) --- R/build_output.R | 406 ++++++++++++------------ R/run_sampler.R | 53 ++-- R/simulate_predict.R | 29 +- src/{models/ggm => math}/cholupdate.cpp | 2 +- src/{models/ggm => math}/cholupdate.h | 0 src/models/ggm/ggm_model.cpp | 2 +- src/models/mixed/mixed_mrf_model.h | 2 +- 7 files changed, 249 insertions(+), 245 deletions(-) rename src/{models/ggm => math}/cholupdate.cpp (99%) rename src/{models/ggm => math}/cholupdate.h (100%) diff --git a/R/build_output.R b/R/build_output.R index f8190e0b..39fd4356 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -11,6 +11,189 @@ # ============================================================================== +# ------------------------------------------------------------------ +# fill_mixed_symmetric +# ------------------------------------------------------------------ +# Fills a symmetric (p+q)×(p+q) matrix from a flat vector of edge +# values stored in discrete-discrete / continuous-continuous / cross +# block order. Used for both pairwise means and indicator means in +# the mixed MRF output builder. +# +# @param values Flat numeric vector of edge values. +# @param p Number of discrete variables. +# @param q Number of continuous variables. +# @param disc_idx Integer vector mapping discrete 1:p to original columns. +# @param cont_idx Integer vector mapping continuous 1:q to original columns. +# @param dimnames List of row/colnames for the result matrix. +# +# Returns: Symmetric matrix with values placed in original-column order. +# ------------------------------------------------------------------ +fill_mixed_symmetric = function(values, p, q, disc_idx, cont_idx, dimnames) { + n = length(dimnames[[1]]) + mat = matrix(0, nrow = n, ncol = n, dimnames = dimnames) + idx = 0L + + # Discrete-discrete block (upper triangle) + if(p > 1) { + for(i in seq_len(p - 1)) { + for(j in seq(i + 1, p)) { + idx = idx + 1L + oi = disc_idx[i]; oj = disc_idx[j] + mat[oi, oj] = values[idx] + mat[oj, oi] = values[idx] + } + } + } + + # Continuous-continuous block (upper triangle) + if(q > 1) { + for(i in seq_len(q - 1)) { + for(j in seq(i + 1, q)) { + idx = idx + 1L + oi = cont_idx[i]; oj = cont_idx[j] + mat[oi, oj] = values[idx] + mat[oj, oi] = values[idx] + } + } + } + + # Cross block (all p × q pairs) + if(p > 0 && q > 0) { + for(i in seq_len(p)) { + for(j in seq_len(q)) { + idx = idx + 1L + oi = disc_idx[i]; oj = cont_idx[j] + mat[oi, oj] = values[idx] + mat[oj, oi] = values[idx] + } + } + } + + mat +} + + +# ------------------------------------------------------------------ +# compute_mixed_parameter_indices +# ------------------------------------------------------------------ +# Computes slice indices for the mixed MRF flat parameter vector. +# Separates main-effect indices (discrete thresholds, continuous +# means, precision diagonal) from pairwise indices (discrete edges, +# precision off-diagonal, cross edges). +# +# @param num_thresholds Total number of discrete threshold parameters. +# @param p Number of discrete variables. +# @param q Number of continuous variables. +# +# Returns: List with components num_thresholds, main_idx, pairwise_idx. +# ------------------------------------------------------------------ +compute_mixed_parameter_indices = function(num_thresholds, p, q) { + nt = num_thresholds + nxx = as.integer(p * (p - 1) / 2) + nyy_total = as.integer(q * (q + 1) / 2) + nyy_offdiag = as.integer(q * (q - 1) / 2) + nxy = as.integer(p * q) + + # Offsets in the flat vector (1-based) + main_discrete_start = 1L + main_discrete_end = nt + pairwise_discrete_start = nt + 1L + pairwise_discrete_end = nt + nxx + main_continuous_start = nt + nxx + 1L + main_continuous_end = nt + nxx + q + pairwise_cross_start = nt + nxx + q + 1L + pairwise_cross_end = nt + nxx + q + nxy + pairwise_continuous_start = nt + nxx + q + nxy + 1L + + # Precision diagonal vs off-diagonal within the continuous block + precision_diag_within = integer(q) + precision_offdiag_within = integer(nyy_offdiag) + k_diag = 0L + k_off = 0L + pos = 0L + for(i in seq_len(q)) { + for(j in i:q) { + pos = pos + 1L + if(i == j) { + k_diag = k_diag + 1L + precision_diag_within[k_diag] = pos + } else { + k_off = k_off + 1L + precision_offdiag_within[k_off] = pos + } + } + } + precision_diag_abs = pairwise_continuous_start - 1L + precision_diag_within + precision_offdiag_abs = pairwise_continuous_start - 1L + precision_offdiag_within + + # Main: discrete thresholds + continuous means + precision diagonal + main_idx = c( + seq(main_discrete_start, main_discrete_end), + seq(main_continuous_start, main_continuous_end), + precision_diag_abs + ) + + # Pairwise: discrete + precision off-diagonal + cross + pairwise_idx = c( + if(nxx > 0) seq(pairwise_discrete_start, pairwise_discrete_end) else integer(0), + precision_offdiag_abs, + if(nxy > 0) seq(pairwise_cross_start, pairwise_cross_end) else integer(0) + ) + + list( + num_thresholds = nt, + main_idx = main_idx, + pairwise_idx = pairwise_idx + ) +} + + +# ------------------------------------------------------------------ +# build_raw_samples_list +# ------------------------------------------------------------------ +# Assembles the $raw_samples list shared by all output builders. +# +# @param raw Per-chain list (normalized). +# @param edge_selection Logical. +# @param edge_prior Character string naming the edge prior. +# @param names_main Character vector of main-effect parameter names. +# @param edge_names Character vector of edge parameter names. +# @param allocation_names Optional character vector; when non-NULL, added +# to $parameter_names$allocations. +# +# Returns: List with main, pairwise, indicator, allocations, nchains, +# niter, parameter_names. +# ------------------------------------------------------------------ +build_raw_samples_list = function(raw, edge_selection, edge_prior, + names_main, edge_names, + allocation_names = NULL) { + list( + main = lapply(raw, function(chain) chain$main_samples), + pairwise = lapply(raw, function(chain) chain$pairwise_samples), + indicator = if(edge_selection) { + lapply(raw, function(chain) chain$indicator_samples) + } else { + NULL + }, + allocations = if(edge_selection && + identical(edge_prior, "Stochastic-Block") && + "allocations" %in% names(raw[[1]])) { + lapply(raw, `[[`, "allocations") + } else { + NULL + }, + nchains = length(raw), + niter = nrow(raw[[1]]$main_samples), + parameter_names = list( + main = names_main, + pairwise = edge_names, + indicator = if(edge_selection) edge_names else NULL, + allocations = allocation_names + ) + ) +} + + # ============================================================================== # build_output() — dispatcher # ============================================================================== @@ -181,6 +364,7 @@ build_output_bgm = function(spec, raw) { node_names = data_columnnames ) results$posterior_summary_pairwise_allocations = sbm_convergence$sbm_summary + co_occur_matrix = sbm_convergence$co_occur_matrix } } @@ -240,11 +424,7 @@ build_output_bgm = function(spec, raw) { t(results$posterior_mean_indicator) if(has_sbm) { - sbm_convergence2 = summarize_alloc_pairs( - allocations = lapply(raw, `[[`, "allocations"), - node_names = data_columnnames - ) - results$posterior_mean_coclustering_matrix = sbm_convergence2$co_occur_matrix + results$posterior_mean_coclustering_matrix = co_occur_matrix arguments = build_arguments(spec) sbm_summary = posterior_summary_SBM( @@ -262,33 +442,13 @@ build_output_bgm = function(spec, raw) { class(results) = "bgms" # --- raw_samples ------------------------------------------------------------ - results$raw_samples = list( - main = lapply(raw, function(chain) chain$main_samples), - pairwise = lapply(raw, function(chain) chain$pairwise_samples), - indicator = if(edge_selection) { - lapply(raw, function(chain) chain$indicator_samples) - } else { - NULL - }, - allocations = if(edge_selection && - identical(edge_prior, "Stochastic-Block") && - "allocations" %in% names(raw[[1]])) { - lapply(raw, `[[`, "allocations") - } else { - NULL - }, - nchains = length(raw), - niter = nrow(raw[[1]]$main_samples), - parameter_names = list( - main = names_main, - pairwise = edge_names, - indicator = if(edge_selection) edge_names else NULL, - allocations = if(identical(edge_prior, "Stochastic-Block")) { - if(is_continuous) data_columnnames else edge_names - } else { - NULL - } - ) + alloc_names = if(identical(edge_prior, "Stochastic-Block")) { + if(is_continuous) data_columnnames else edge_names + } else { + NULL + } + results$raw_samples = build_raw_samples_list( + raw, edge_selection, edge_prior, names_main, edge_names, alloc_names ) # --- easybgm compat shim (OMRF only) --------------------------------------- @@ -353,58 +513,14 @@ build_output_mixed_mrf = function(spec, raw) { edge_selection = pr$edge_selection # --- Compute index layout in flat parameter vector -------------------------- - nt = spec$precomputed$num_thresholds - nxx = as.integer(p * (p - 1) / 2) - nyy_total = as.integer(q * (q + 1) / 2) - nyy_offdiag = as.integer(q * (q - 1) / 2) - nxy = as.integer(p * q) - - # Offsets in the flat vector (1-based) - main_discrete_start = 1L - main_discrete_end = nt - pairwise_discrete_start = nt + 1L - pairwise_discrete_end = nt + nxx - main_continuous_start = nt + nxx + 1L - main_continuous_end = nt + nxx + q - pairwise_cross_start = nt + nxx + q + 1L - pairwise_cross_end = nt + nxx + q + nxy - pairwise_continuous_start = nt + nxx + q + nxy + 1L - pairwise_continuous_end = nt + nxx + q + nxy + nyy_total - - # Precision diagonal indices within the pairwise_continuous block - precision_diag_within = integer(q) - precision_offdiag_within = integer(nyy_offdiag) - k_diag = 0L - k_off = 0L - pos = 0L - for(i in seq_len(q)) { - for(j in i:q) { - pos = pos + 1L - if(i == j) { - k_diag = k_diag + 1L - precision_diag_within[k_diag] = pos - } else { - k_off = k_off + 1L - precision_offdiag_within[k_off] = pos - } - } - } - precision_diag_abs = pairwise_continuous_start - 1L + precision_diag_within - precision_offdiag_abs = pairwise_continuous_start - 1L + precision_offdiag_within - - # Main indices: discrete thresholds + continuous means + precision diagonal - main_idx = c( - seq(main_discrete_start, main_discrete_end), - seq(main_continuous_start, main_continuous_end), - precision_diag_abs - ) - - # Pairwise indices: discrete + precision off-diag + cross - pairwise_idx = c( - if(nxx > 0) seq(pairwise_discrete_start, pairwise_discrete_end) else integer(0), - precision_offdiag_abs, - if(nxy > 0) seq(pairwise_cross_start, pairwise_cross_end) else integer(0) + layout = compute_mixed_parameter_indices( + num_thresholds = spec$precomputed$num_thresholds, + p = p, + q = q ) + nt = layout$num_thresholds + main_idx = layout$main_idx + pairwise_idx = layout$pairwise_idx # --- Indicator index layout ------------------------------------------------- # C++ indicator vector: [Gxx_ut | Gyy_ut | Gxy] @@ -524,6 +640,7 @@ build_output_mixed_mrf = function(spec, raw) { node_names = all_internal_names ) results$posterior_summary_pairwise_allocations = sbm_convergence$sbm_summary + co_occur_matrix = sbm_convergence$co_occur_matrix } } @@ -563,106 +680,19 @@ build_output_mixed_mrf = function(spec, raw) { ) # --- Posterior mean: pairwise as (p+q) × (p+q) matrix ----------------------- - # Map from internal block indices to original column positions - pmat = matrix(0, - nrow = num_variables, ncol = num_variables, - dimnames = list(data_columnnames, data_columnnames) + dn = list(data_columnnames, data_columnnames) + results$posterior_mean_pairwise = fill_mixed_symmetric( + pairwise_summary$mean, p, q, disc_idx, cont_idx, dn ) - pw_means = pairwise_summary$mean - idx = 0L - - # Discrete-discrete block - if(p > 1) { - for(i in seq_len(p - 1)) { - for(j in seq(i + 1, p)) { - idx = idx + 1L - oi = disc_idx[i] - oj = disc_idx[j] - pmat[oi, oj] = pw_means[idx] - pmat[oj, oi] = pw_means[idx] - } - } - } - - # Continuous-continuous off-diagonal block - if(q > 1) { - for(i in seq_len(q - 1)) { - for(j in seq(i + 1, q)) { - idx = idx + 1L - oi = cont_idx[i] - oj = cont_idx[j] - pmat[oi, oj] = pw_means[idx] - pmat[oj, oi] = pw_means[idx] - } - } - } - - # Cross block - if(p > 0 && q > 0) { - for(i in seq_len(p)) { - for(j in seq_len(q)) { - idx = idx + 1L - oi = disc_idx[i] - oj = cont_idx[j] - pmat[oi, oj] = pw_means[idx] - pmat[oj, oi] = pw_means[idx] - } - } - } - - results$posterior_mean_pairwise = pmat - # --- Posterior mean: indicator ----------------------------------------------- if(edge_selection) { - ind_means = indicator_summary$mean - imat = matrix(0, - nrow = num_variables, ncol = num_variables, - dimnames = list(data_columnnames, data_columnnames) + results$posterior_mean_indicator = fill_mixed_symmetric( + indicator_summary$mean, p, q, disc_idx, cont_idx, dn ) - idx = 0L - if(p > 1) { - for(i in seq_len(p - 1)) { - for(j in seq(i + 1, p)) { - idx = idx + 1L - oi = disc_idx[i] - oj = disc_idx[j] - imat[oi, oj] = ind_means[idx] - imat[oj, oi] = ind_means[idx] - } - } - } - if(q > 1) { - for(i in seq_len(q - 1)) { - for(j in seq(i + 1, q)) { - idx = idx + 1L - oi = cont_idx[i] - oj = cont_idx[j] - imat[oi, oj] = ind_means[idx] - imat[oj, oi] = ind_means[idx] - } - } - } - if(p > 0 && q > 0) { - for(i in seq_len(p)) { - for(j in seq_len(q)) { - idx = idx + 1L - oi = disc_idx[i] - oj = cont_idx[j] - imat[oi, oj] = ind_means[idx] - imat[oj, oi] = ind_means[idx] - } - } - } - results$posterior_mean_indicator = imat - if(has_sbm) { - sbm_convergence2 = summarize_alloc_pairs( - allocations = lapply(raw, `[[`, "allocations"), - node_names = all_internal_names - ) - results$posterior_mean_coclustering_matrix = sbm_convergence2$co_occur_matrix + results$posterior_mean_coclustering_matrix = co_occur_matrix arguments = build_arguments(spec) sbm_summary = posterior_summary_SBM( @@ -680,28 +710,8 @@ build_output_mixed_mrf = function(spec, raw) { class(results) = "bgms" # --- raw_samples ------------------------------------------------------------ - results$raw_samples = list( - main = lapply(raw, function(chain) chain$main_samples), - pairwise = lapply(raw, function(chain) chain$pairwise_samples), - indicator = if(edge_selection) { - lapply(raw, function(chain) chain$indicator_samples) - } else { - NULL - }, - allocations = if(edge_selection && - identical(edge_prior, "Stochastic-Block") && - "allocations" %in% names(raw[[1]])) { - lapply(raw, `[[`, "allocations") - } else { - NULL - }, - nchains = length(raw), - niter = nrow(raw[[1]]$main_samples), - parameter_names = list( - main = names_main, - pairwise = edge_names, - indicator = if(edge_selection) edge_names else NULL - ) + results$raw_samples = build_raw_samples_list( + raw, edge_selection, edge_prior, names_main, edge_names ) # --- NUTS diagnostics ------------------------------------------------------- diff --git a/R/run_sampler.R b/R/run_sampler.R index 6ca7fb0e..37462b6b 100644 --- a/R/run_sampler.R +++ b/R/run_sampler.R @@ -7,6 +7,20 @@ # ============================================================================== +# ------------------------------------------------------------------ +# bb_between_default +# ------------------------------------------------------------------ +# Maps NULL to -1.0 (C++ sentinel for "no between-cluster prior"). +# +# @param value Scalar or NULL from the prior spec. +# +# Returns: value unchanged, or -1.0 when NULL. +# ------------------------------------------------------------------ +bb_between_default = function(value) { + if(is.null(value)) -1.0 else value +} + + # ============================================================================== # run_sampler() — main dispatcher # ============================================================================== @@ -41,17 +55,8 @@ run_sampler_ggm = function(spec) { s = spec$sampler m = spec$missing - # C++ expects -1 for "no between-cluster prior" - bb_alpha_between = if(is.null(p$beta_bernoulli_alpha_between)) { - -1.0 - } else { - p$beta_bernoulli_alpha_between - } - bb_beta_between = if(is.null(p$beta_bernoulli_beta_between)) { - -1.0 - } else { - p$beta_bernoulli_beta_between - } + bb_alpha_between = bb_between_default(p$beta_bernoulli_alpha_between) + bb_beta_between = bb_between_default(p$beta_bernoulli_beta_between) out_raw = sample_ggm( inputFromR = list(X = d$x), @@ -92,17 +97,8 @@ run_sampler_omrf = function(spec) { p = spec$prior s = spec$sampler - # C++ expects -1 for "no between-cluster prior" - bb_alpha_between = if(is.null(p$beta_bernoulli_alpha_between)) { - -1.0 - } else { - p$beta_bernoulli_alpha_between - } - bb_beta_between = if(is.null(p$beta_bernoulli_beta_between)) { - -1.0 - } else { - p$beta_bernoulli_beta_between - } + bb_alpha_between = bb_between_default(p$beta_bernoulli_alpha_between) + bb_beta_between = bb_between_default(p$beta_bernoulli_beta_between) input_list = list( observations = d$x, @@ -158,17 +154,8 @@ run_sampler_mixed_mrf = function(spec) { p = spec$prior s = spec$sampler - # C++ expects -1 for "no between-cluster prior" - bb_alpha_between = if(is.null(p$beta_bernoulli_alpha_between)) { - -1.0 - } else { - p$beta_bernoulli_alpha_between - } - bb_beta_between = if(is.null(p$beta_bernoulli_beta_between)) { - -1.0 - } else { - p$beta_bernoulli_beta_between - } + bb_alpha_between = bb_between_default(p$beta_bernoulli_alpha_between) + bb_beta_between = bb_between_default(p$beta_bernoulli_beta_between) input_list = list( discrete_observations = d$x_discrete, diff --git a/R/simulate_predict.R b/R/simulate_predict.R index 5a3d1851..f82101bc 100644 --- a/R/simulate_predict.R +++ b/R/simulate_predict.R @@ -9,6 +9,22 @@ # ============================================================================== +# ------------------------------------------------------------------ +# expand_variable_type +# ------------------------------------------------------------------ +# Recycles a scalar variable_type to length num_variables. +# +# @param variable_type Character vector (possibly length 1). +# @param num_variables Target length. +# +# Returns: Character vector of length num_variables. +# ------------------------------------------------------------------ +expand_variable_type = function(variable_type, num_variables) { + if(length(variable_type) == 1) rep(variable_type, num_variables) + else variable_type +} + + #' Simulate Observations from a Markov Random Field #' #' @description @@ -640,10 +656,7 @@ simulate.bgms = function(object, data_columnnames = arguments$data_columnnames # Handle variable_type - - if(length(variable_type) == 1) { - variable_type = rep(variable_type, num_variables) - } + variable_type = expand_variable_type(variable_type, num_variables) # Get baseline_category (for Blume-Capel variables) baseline_category = arguments$baseline_category @@ -1069,9 +1082,7 @@ predict.bgms = function(object, } # Handle variable_type - if(length(variable_type) == 1) { - variable_type = rep(variable_type, num_variables) - } + variable_type = expand_variable_type(variable_type, num_variables) # Get baseline_category baseline_category = arguments$baseline_category @@ -1493,10 +1504,6 @@ predict.bgmCompare = function(object, reconstruct_main = function(main_vec, num_variables, num_categories, variable_type) { - if(length(variable_type) == 1) { - variable_type = rep(variable_type, num_variables) - } - max_cats = max(num_categories) main = matrix(NA, nrow = num_variables, ncol = max_cats) diff --git a/src/models/ggm/cholupdate.cpp b/src/math/cholupdate.cpp similarity index 99% rename from src/models/ggm/cholupdate.cpp rename to src/math/cholupdate.cpp index 81331be9..3d3776b9 100644 --- a/src/models/ggm/cholupdate.cpp +++ b/src/math/cholupdate.cpp @@ -1,4 +1,4 @@ -#include "models/ggm/cholupdate.h" +#include "math/cholupdate.h" extern "C" { diff --git a/src/models/ggm/cholupdate.h b/src/math/cholupdate.h similarity index 100% rename from src/models/ggm/cholupdate.h rename to src/math/cholupdate.h diff --git a/src/models/ggm/ggm_model.cpp b/src/models/ggm/ggm_model.cpp index 7c200c3c..8dea6782 100644 --- a/src/models/ggm/ggm_model.cpp +++ b/src/models/ggm/ggm_model.cpp @@ -1,7 +1,7 @@ #include "models/ggm/ggm_model.h" #include "rng/rng_utils.h" #include "math/explog_macros.h" -#include "models/ggm/cholupdate.h" +#include "math/cholupdate.h" #include "mcmc/execution/step_result.h" #include "mcmc/execution/warmup_schedule.h" diff --git a/src/models/mixed/mixed_mrf_model.h b/src/models/mixed/mixed_mrf_model.h index 8bbb1a43..c601e166 100644 --- a/src/models/mixed/mixed_mrf_model.h +++ b/src/models/mixed/mixed_mrf_model.h @@ -4,7 +4,7 @@ #include #include "models/base_model.h" #include "math/cholesky_helpers.h" -#include "models/ggm/cholupdate.h" +#include "math/cholupdate.h" #include "rng/rng_utils.h" /** From b944cd4aa168e5f8a0599fecb4991d3ea719376b Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 16:24:53 +0100 Subject: [PATCH 33/60] fix: document overflow-guard bitwise break, regenerate HMC fixtures, restore progress interval --- dev/bitwise_compliance/test_compliance.R | 25 +++++++++++++++--- .../compliance/bgm_boredom_hmc_bernoulli.rds | Bin 4250 -> 3199 bytes .../compliance/cmp_wenchuan_hmc_bernoulli.rds | Bin 10326 -> 10616 bytes src/sample_mixed.cpp | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/dev/bitwise_compliance/test_compliance.R b/dev/bitwise_compliance/test_compliance.R index 6a552521..71cc71a3 100644 --- a/dev/bitwise_compliance/test_compliance.R +++ b/dev/bitwise_compliance/test_compliance.R @@ -70,6 +70,21 @@ # mismatch was a regression introduced and fixed within PR #78; it was # never in a CRAN release. # +# 7. Intermediate-overflow guard in compute_logZ_and_probs_ordinal and +# compute_logZ_and_probs_blume_capel (ACCEPTED — not a bug): +# Commit 04b9562 tightened the fast/slow block threshold from EXP_BOUND +# (709) to FAST_LIM = max(0, EXP_BOUND - max_abs_main) to prevent +# intermediate overflow in exp(main_param(c) + (c+1)*rest) before the +# cancellation with exp(-bound). Both code paths are mathematically +# identical but differ at floating-point level. During HMC leapfrog +# integration, parameters can temporarily reach extreme values where +# max_abs_main is large enough that FAST_LIM < EXP_BOUND, reclassifying +# some observations between the fast (vectorized) and slow (per-element) +# paths. The resulting floating-point perturbation cascades through the +# fixed-step leapfrog integrator. This is needed for mixed MRF models +# where Theta_ss is absorbed into main_param. The affected configs use +# structure-only comparison against CRAN fixtures. +# # ============================================================================== library(bgms) @@ -425,11 +440,13 @@ na_bugfix_ids = c( ) # Configs excluded from bitwise comparison due to confirmed algorithm changes -# (see header note 5). Checked for structural match only. +# (see header notes 5 and 7). Checked for structural match only. structure_only_ids = c( - "bgm_wenchuan_nuts_blumecapel_impute", # Blume-Capel imputation bug fix - "bgm_wenchuan_nuts_sbm", # SBM lazy init changes RNG order (not a bug) - "bgm_adhd_nuts_sbm" # SBM lazy init changes RNG order (not a bug) + "bgm_wenchuan_nuts_blumecapel_impute", # Blume-Capel imputation bug fix (note 5c) + "bgm_wenchuan_nuts_sbm", # SBM lazy init changes RNG order (note 4) + "bgm_adhd_nuts_sbm", # SBM lazy init changes RNG order (note 4) + "bgm_boredom_hmc_bernoulli", # overflow guard reclassifies fast/slow (note 7) + "cmp_wenchuan_hmc_bernoulli" # overflow guard reclassifies fast/slow (note 7) ) compare_fields = function(expected, actual, type, id) { diff --git a/dev/fixtures/compliance/bgm_boredom_hmc_bernoulli.rds b/dev/fixtures/compliance/bgm_boredom_hmc_bernoulli.rds index 4b21b5702fab8ab46e3c287147d1bad8042b033d..bddebbc320c43d0c1fe7aa7e3daf8144cb54b6bd 100644 GIT binary patch literal 3199 zcmY*Xc|6ox8?W3Vl&(}GC9-GVCQ7DsEyG3Dv5o9&8XEgDZYcL!%aFocvSyjlor%ew zE5=xh%%DM8W3n^DEao-y{_%d^-#_Pf&hy=#=bS6)0!Mfs-zw##y_o4m{*6V^REsl5 zjde^mPl%k(K8Lmemu}uZX=311^r1vX!Z_UlhR5Re@a2&5!UanPsqY%I%b%AmWd9~vC+{{%fxKc_m{gg95Wg+<-C2% z5{Tm&0&$~w{w}BHAjqY6Aq}KPy}&M4xNpmhsVTNh$3dK)|9j%2Of>y32J!8;OC$vP z?wiVk(kWvBW)Pd*WmAGP}H_nJMBa~_s?O=2LnVy{xzP4n@k+O1n*()})Qk4x0=pK!Kt+CklxHKVm&X%*hJ5WQ*m zVv{-(`(xmEUHQ_CLL}|vr=szVYWTETy%|z-Y;Mdf}Cs(Rh~2`CcLChAS8ncK(~3+hBWnt-#9^+ ziE|!)JPLERcl%VNAOC2)A+%|6c|>$rphJb^s7;Aj8}T6R_iq8eHVXSmC~KFVa1SIl zN+BwAK&FM7#3&gC2E{bCn}cSIW0y+C$_zN@ zEG~5T)gsISRjI48Nf(q}O6RAUU~oLQJ>=gYx$HHE6DKGjS$lqKeV8r1Ngg9o;aa;0SssemmV5#fM+9J=E>Bkt0BeqqTQ2mx_x=g8GvT^^ETaE zR>CjxRrjXbl7ziOs@a~MPTHbqpt*Ca0hsx3Q{)p17ec?U`4shytUi5GOUVWATy7x$ zH1Z@$%C0a=;+%p->D)*;^xf~ORI#!VtH2Rxskzyz&wJ%*w`4mvBcmJxTTF&k&}U3= z-0Qkx57K=N38|N-#0DbEoK2f-RUy^Bf)$-=0C{#w&Vdo}$ZMaHd$!kGkmi3YLX^Lx zi8X!yRbzm0(vN){cQk3@c4ytgD;H&}&utRJv>L8-{syT_URwJao0NFIPU5NbA<5E9}!GQn*8!y>&o`3ZyC3*~}}j8it(j2}i`Dq{W}4MabQq){eS-6-Pylx3uV` z4%PS9ANW==`M`Mo2=^1rx`qC4_+D4bVm912^9W&A&~n_03#z>TWZc5r}s6#F+LSWihF-A{Nj#UxT2kcAIB+hy_^ zeJkAcr4F^;OEmWU+1T@(*7dG`R^bm56<%2R{OX4MCvZWjjD93zC8IsLc9&ee$IYAH7RXZ=J=c&x^-q#;AERhNm zQ19^HHN*Fn3Xjs&R|D5j@YOFTd-!j!cvp73S^_NJp0b$Rr*asqo$a`>)-MBkCt~LI z6BA;m_xIuk)lv4>|Iit0vT7cJyP_zYWSBpu0n`yx*z#~M!*Qo3cYu6aS@ncSJSf0uzuV)xcXhwH+hPH5hkuYKdEd9Ryz<;et7+ zsjVG}RYE6^Fyzrok0M;4>^zb~U|TNfPT*8N2_A@gLAoCZ%_CVfF*MN3kythK=m?{> z9TQ})@ixuzV{lj<+bF2a9SVr3u3t5>5X88FmM*a0!}1P(sdNw+tl!rtEA`@cIH7V;Jp#iD!)*;0 zYYpYIkGb~%RMpu}iVi7rgQmJ{<0&5l+}E}h#G{UlZQ5|SJ3IL({u@g(@gTb4Q*J|F zjoDW?zmb5nm`rfDPisrfs-A#!%DvnnTzfc&RLP%m#z@ipx(tc$sF1u`D6lhoHGqb!mSNyZcR@)B#j@vr|YkgxK04REsI z3Af_xyE!;=yh4a8pow)PYcHr3d*1xKZnQEQDu6+Nr(s{7(sb?WPQgO#gCQtDPx~J~ z2jjQR12(L9F@^EZGC7ZIgsmlyKJh&$6`HWu4|qT%o3Fqm)#=dMwWAZ}0@Cr-Erno$ zY(*-sO-f`K+|kYNDzCHBidggv6xjy13bT90@^S=1zdcfB&R0;5yh4Oo<|^4&r^)J* z%al4&jl|J^=2V}xce?;d$d7LNJy5Sb6^tZ)%d{-8G<{f-Q_&7k(+WzW`9p4ah7_Fk zrF?nQ2)>>XR`}biI;*q{$KD?JUw(|`GSSl6ocnc(gkXRBS~28a>W^;2zS&vPcgf14 Tx!{IWHt079aegfQ=#l>b)Js)P literal 4250 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 results = run_mcmc_sampler( From ee3b9bab97fddda1268e0d694bfca6cd7cd72535 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:23:43 +0100 Subject: [PATCH 34/60] =?UTF-8?q?docs:=20R=20output=20audit=20=E2=80=94=20?= =?UTF-8?q?extract=5Fmain=5Feffects,=20GGM=20quadratic=20fix,=20print/coef?= =?UTF-8?q?/summary=20(audit=20L)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 5 +- R/bgm.R | 13 +- R/bgm_spec.R | 12 +- R/bgms-methods.R | 37 +- R/build_output.R | 9 +- R/extractor_functions.R | 129 +++-- dev/ggm_g_prior.md | 41 ++ dev/ggm_nuts/blockwise_hmc.md | 25 + .../chordal_completion_augmentation.md | 34 ++ dev/ggm_nuts/elliptical_slice_surrogates.md | 24 + .../partial_correlation_reparameterization.md | 28 ++ dev/ggm_nuts/projected_nuts.md | 28 ++ dev/ggm_nuts/riemannian_gwishart_hmc.md | 24 + dev/mixedmrf/deduplication_audit.md | 459 ++++++++++++++++++ dev/mixedmrf/implementation_plan.md | 33 +- dev/mixedmrf/output_inspection.md | 360 ++++++++++++++ dev/test_step_size.R | 35 ++ dev/tests/compare_bgms_mixedgm_cycle.R | 213 ++++++++ dev/tests/cycle_scatterplots.pdf | Bin 0 -> 13023 bytes dev/tests/debug_main_effects.R | 74 +++ .../easybgm/test_easybgm_bgms_interaction.R | 0 dev/tests/plot_cycle_scatterplots.R | 139 ++++++ .../validation/group1_parameter_recovery.R | 189 ++++++++ dev/tests/validation/group2_mh_vs_nuts.R | 239 +++++++++ dev/tests/validation/group3_cond_vs_marg.R | 219 +++++++++ dev/tests/validation/group4_cross_package.R | 229 +++++++++ dev/tests/validation/group5_edge_detection.R | 323 ++++++++++++ dev/tests/validation/group6_diagnostics.R | 285 +++++++++++ dev/tests/validation/group7_empirical.R | 287 +++++++++++ dev/tests/validation/group9_breakdown.R | 174 +++++++ dev/tests/validation/group9_profiling.R | 323 ++++++++++++ dev/tests/validation/helpers.R | 405 ++++++++++++++++ .../output/group1_parameter_recovery.pdf | Bin 0 -> 20189 bytes .../validation/output/group2_mh_vs_nuts.pdf | Bin 0 -> 26158 bytes dev/tests/validation/output/group2_traces.pdf | Bin 0 -> 624248 bytes .../validation/output/group3_cond_vs_marg.pdf | Bin 0 -> 22709 bytes .../output/group3_diff_distributions.pdf | Bin 0 -> 6353 bytes .../output/group4_cross_package.pdf | Bin 0 -> 19697 bytes .../output/group5_edge_detection.pdf | Bin 0 -> 10875 bytes .../output/group6_autocorrelation.pdf | Bin 0 -> 12977 bytes .../validation/output/group6_diagnostics.pdf | Bin 0 -> 522914 bytes .../validation/output/group7_empirical.pdf | Bin 0 -> 13038 bytes .../validation/output/group9_profiling.pdf | Bin 0 -> 7965 bytes dev/tests/validation/run_all.R | 121 +++++ man/bgm.Rd | 13 +- man/coef.bgms.Rd | 9 +- man/extract_arguments.Rd | 1 + man/extract_category_thresholds.Rd | 20 +- man/extract_ess.Rd | 1 + man/extract_group_params.Rd | 3 +- man/extract_indicator_priors.Rd | 1 + man/extract_indicators.Rd | 1 + man/extract_main_effects.Rd | 66 +++ man/extract_pairwise_interactions.Rd | 3 +- man/extract_pairwise_thresholds.Rd | 4 +- ...tract_posterior_inclusion_probabilities.Rd | 1 + man/extract_rhat.Rd | 1 + man/extract_sbm.Rd | 1 + paper/paper.bib | 105 ++++ paper/paper.md | 143 ++++++ tests/testthat/test-build-arguments.R | 9 +- tests/testthat/test-extractor-functions.R | 40 +- 62 files changed, 4857 insertions(+), 81 deletions(-) create mode 100644 dev/ggm_g_prior.md create mode 100644 dev/ggm_nuts/blockwise_hmc.md create mode 100644 dev/ggm_nuts/chordal_completion_augmentation.md create mode 100644 dev/ggm_nuts/elliptical_slice_surrogates.md create mode 100644 dev/ggm_nuts/partial_correlation_reparameterization.md create mode 100644 dev/ggm_nuts/projected_nuts.md create mode 100644 dev/ggm_nuts/riemannian_gwishart_hmc.md create mode 100644 dev/mixedmrf/deduplication_audit.md create mode 100644 dev/mixedmrf/output_inspection.md create mode 100644 dev/test_step_size.R create mode 100644 dev/tests/compare_bgms_mixedgm_cycle.R create mode 100644 dev/tests/cycle_scatterplots.pdf create mode 100644 dev/tests/debug_main_effects.R create mode 100644 dev/tests/easybgm/test_easybgm_bgms_interaction.R create mode 100644 dev/tests/plot_cycle_scatterplots.R create mode 100644 dev/tests/validation/group1_parameter_recovery.R create mode 100644 dev/tests/validation/group2_mh_vs_nuts.R create mode 100644 dev/tests/validation/group3_cond_vs_marg.R create mode 100644 dev/tests/validation/group4_cross_package.R create mode 100644 dev/tests/validation/group5_edge_detection.R create mode 100644 dev/tests/validation/group6_diagnostics.R create mode 100644 dev/tests/validation/group7_empirical.R create mode 100644 dev/tests/validation/group9_breakdown.R create mode 100644 dev/tests/validation/group9_profiling.R create mode 100644 dev/tests/validation/helpers.R create mode 100644 dev/tests/validation/output/group1_parameter_recovery.pdf create mode 100644 dev/tests/validation/output/group2_mh_vs_nuts.pdf create mode 100644 dev/tests/validation/output/group2_traces.pdf create mode 100644 dev/tests/validation/output/group3_cond_vs_marg.pdf create mode 100644 dev/tests/validation/output/group3_diff_distributions.pdf create mode 100644 dev/tests/validation/output/group4_cross_package.pdf create mode 100644 dev/tests/validation/output/group5_edge_detection.pdf create mode 100644 dev/tests/validation/output/group6_autocorrelation.pdf create mode 100644 dev/tests/validation/output/group6_diagnostics.pdf create mode 100644 dev/tests/validation/output/group7_empirical.pdf create mode 100644 dev/tests/validation/output/group9_profiling.pdf create mode 100644 dev/tests/validation/run_all.R create mode 100644 man/extract_main_effects.Rd create mode 100644 paper/paper.bib create mode 100644 paper/paper.md diff --git a/NAMESPACE b/NAMESPACE index aa26428e..bc34e829 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,8 +4,6 @@ S3method(coef,bgmCompare) S3method(coef,bgms) S3method(extract_arguments,bgmCompare) S3method(extract_arguments,bgms) -S3method(extract_category_thresholds,bgmCompare) -S3method(extract_category_thresholds,bgms) S3method(extract_ess,bgmCompare) S3method(extract_ess,bgms) S3method(extract_group_params,bgmCompare) @@ -13,6 +11,8 @@ S3method(extract_indicator_priors,bgmCompare) S3method(extract_indicator_priors,bgms) S3method(extract_indicators,bgmCompare) S3method(extract_indicators,bgms) +S3method(extract_main_effects,bgmCompare) +S3method(extract_main_effects,bgms) S3method(extract_pairwise_interactions,bgmCompare) S3method(extract_pairwise_interactions,bgms) S3method(extract_posterior_inclusion_probabilities,bgmCompare) @@ -40,6 +40,7 @@ export(extract_ess) export(extract_group_params) export(extract_indicator_priors) export(extract_indicators) +export(extract_main_effects) export(extract_pairwise_interactions) export(extract_pairwise_thresholds) export(extract_posterior_inclusion_probabilities) diff --git a/R/bgm.R b/R/bgm.R index 81323631..61cc2caa 100644 --- a/R/bgm.R +++ b/R/bgm.R @@ -326,14 +326,21 @@ #' Main components include: #' \itemize{ #' \item \code{posterior_summary_main}: Data frame with posterior summaries -#' (mean, sd, MCSE, ESS, Rhat) for category threshold parameters. +#' (mean, sd, MCSE, ESS, Rhat) for main-effect parameters. +#' For OMRF models these are category thresholds; for GGM models +#' these are precision matrix diagonal entries (quadratic effects); +#' for mixed MRF models these include both discrete thresholds and +#' continuous means and precisions. #' \item \code{posterior_summary_pairwise}: Data frame with posterior #' summaries for pairwise interaction parameters. #' \item \code{posterior_summary_indicator}: Data frame with posterior #' summaries for edge inclusion indicators (if \code{edge_selection = TRUE}). #' -#' \item \code{posterior_mean_main}: Matrix of posterior mean thresholds -#' (rows = variables, cols = categories or parameters). +#' \item \code{posterior_mean_main}: Posterior mean of per-variable +#' parameters. For OMRF: a matrix (p x max_categories) of category +#' thresholds. For GGM: a (p x 1) matrix of precision diagonal entries +#' (quadratic effects, not main effects). For mixed MRF: a list with +#' \code{$discrete} and \code{$continuous} components. #' \item \code{posterior_mean_pairwise}: Symmetric matrix of posterior mean #' pairwise interaction strengths. #' \item \code{posterior_mean_indicator}: Symmetric matrix of posterior mean diff --git a/R/bgm_spec.R b/R/bgm_spec.R index 78f29055..fc6f2d28 100644 --- a/R/bgm_spec.R +++ b/R/bgm_spec.R @@ -1130,7 +1130,8 @@ build_arguments_ggm = function(spec) { num_chains = spec$sampler$chains, data_columnnames = spec$data$data_columnnames, no_variables = spec$data$num_variables, - is_continuous = TRUE + is_continuous = TRUE, + model_type = "ggm" ) } @@ -1172,7 +1173,8 @@ build_arguments_omrf = function(spec) { data_columnnames = spec$data$data_columnnames, baseline_category = spec$variables$baseline_category, pairwise_scaling_factors = spec$prior$pairwise_scaling_factors, - no_variables = spec$data$num_variables + no_variables = spec$data$num_variables, + model_type = "omrf" ) } @@ -1215,7 +1217,8 @@ build_arguments_mixed_mrf = function(spec) { baseline_category = spec$variables$baseline_category, is_ordinal = spec$variables$is_ordinal, no_variables = spec$data$num_variables, - is_mixed = TRUE + is_mixed = TRUE, + model_type = "mixed_mrf" ) } @@ -1248,7 +1251,8 @@ build_arguments_compare = function(spec) { num_categories = spec$data$num_categories, is_ordinal_variable = spec$variables$is_ordinal, group = sort(spec$data$group), - pairwise_scaling_factors = spec$prior$pairwise_scaling_factors + pairwise_scaling_factors = spec$prior$pairwise_scaling_factors, + model_type = "compare" ) } diff --git a/R/bgms-methods.R b/R/bgms-methods.R index 3168f4f2..71dda5ca 100644 --- a/R/bgms-methods.R +++ b/R/bgms-methods.R @@ -21,7 +21,7 @@ print.bgms = function(x, ...) { arguments = extract_arguments(x) - # Model type + # Estimation method if(isTRUE(arguments$edge_selection)) { prior_msg = switch(arguments$edge_prior, "Bernoulli" = "Bayesian Edge Selection using a Bernoulli prior on edge inclusion", @@ -34,6 +34,21 @@ print.bgms = function(x, ...) { cat("Bayesian Estimation\n") } + # Model type + mt = arguments$model_type + if(!is.null(mt)) { + mt_label = switch(mt, + ggm = "GGM (Gaussian Graphical Model)", + omrf = "OMRF (Ordinal Markov Random Field)", + mixed_mrf = sprintf( + "Mixed MRF (%d discrete, %d continuous)", + arguments$num_discrete, arguments$num_continuous + ), + mt + ) + cat(paste0(" Model: ", mt_label, "\n")) + } + # Dataset info cat(paste0(" Number of variables: ", arguments$num_variables, "\n")) if(isTRUE(arguments$standardize)) { @@ -84,10 +99,18 @@ summary.bgms = function(object, ...) { arguments = extract_arguments(object) if(!is.null(object$posterior_summary_main) && !is.null(object$posterior_summary_pairwise)) { + mt = arguments$model_type + main_label = switch(mt, + ggm = "Precision diagonal (quadratic effects):", + omrf = "Category thresholds:", + mixed_mrf = "Main effects (discrete thresholds and continuous means/precisions):", + "Main effects:" + ) out = list( main = object$posterior_summary_main, pairwise = object$posterior_summary_pairwise ) + attr(out, "main_label") = main_label if(!is.null(object$posterior_summary_indicator)) { out$indicator = object$posterior_summary_indicator @@ -118,7 +141,8 @@ print.summary.bgms = function(x, digits = 3, ...) { cat("Posterior summaries from Bayesian estimation:\n\n") if(!is.null(x$main)) { - cat("Category thresholds:\n") + main_label = attr(x, "main_label") %||% "Main effects:" + cat(main_label, "\n") print(round(head(x$main, 6), digits = digits)) if(nrow(x$main) > 6) cat("... (use `summary(fit)$main` to see full output)\n") cat("\n") @@ -179,14 +203,19 @@ print.summary.bgms = function(x, digits = 3, ...) { #' @title Extract Coefficients from a bgms Object #' @name coef.bgms -#' @description Returns the posterior mean thresholds, pairwise effects, and edge inclusion indicators from a \code{bgms} model fit. +#' @description Returns the posterior mean main effects, pairwise effects, and edge inclusion indicators from a \code{bgms} model fit. #' #' @param object An object of class \code{bgms}. #' @param ... Ignored. #' #' @return A list with the following components: #' \describe{ -#' \item{main}{Posterior mean of the category threshold parameters.} +#' \item{main}{Posterior mean of the main-effect parameters. For GGM models +#' this contains the precision matrix diagonal (quadratic effects, not main +#' effects). For OMRF models this is a numeric matrix (p x max_categories) +#' of category thresholds. For mixed MRF models this is a list with +#' `$discrete` (p x max_categories matrix) and `$continuous` (q x 2 matrix +#' with columns "mean" and "precision").} #' \item{pairwise}{Posterior mean of the pairwise interaction matrix.} #' \item{indicator}{Posterior mean of the edge inclusion indicators (if available).} #' } diff --git a/R/build_output.R b/R/build_output.R index 39fd4356..f34424f3 100644 --- a/R/build_output.R +++ b/R/build_output.R @@ -464,7 +464,7 @@ build_output_bgm = function(spec, raw) { results$indicator = extract_indicators(results) } results$interactions = extract_pairwise_interactions(results) - results$thresholds = extract_category_thresholds(results) + results$thresholds = extract_main_effects(results) } } @@ -710,8 +710,13 @@ build_output_mixed_mrf = function(spec, raw) { class(results) = "bgms" # --- raw_samples ------------------------------------------------------------ + alloc_names = if(identical(edge_prior, "Stochastic-Block")) { + all_internal_names + } else { + NULL + } results$raw_samples = build_raw_samples_list( - raw, edge_selection, edge_prior, names_main, edge_names + raw, edge_selection, edge_prior, names_main, edge_names, alloc_names ) # --- NUTS diagnostics ------------------------------------------------------- diff --git a/R/extractor_functions.R b/R/extractor_functions.R index 76e9bb14..418a1d7c 100644 --- a/R/extractor_functions.R +++ b/R/extractor_functions.R @@ -407,7 +407,7 @@ extract_indicator_priors.bgmCompare = function(bgms_object) { #' interaction parameters.} #' } #' -#' @seealso [bgm()], [bgmCompare()], [extract_category_thresholds()] +#' @seealso [bgm()], [bgmCompare()], [extract_main_effects()] #' @family extractors #' @export extract_pairwise_interactions = function(bgms_object) { @@ -428,10 +428,17 @@ extract_pairwise_interactions.bgms = function(bgms_object) { mats = bgms_object$raw_samples$pairwise mat = do.call(rbind, mats) - edge_names = character() - for(i in 1:(num_vars - 1)) { - for(j in (i + 1):num_vars) { - edge_names = c(edge_names, paste0(var_names[i], "-", var_names[j])) + # Use stored parameter names when available (correct for all model types + # including mixed MRF where block order differs from upper-triangle order) + stored_names = bgms_object$raw_samples$parameter_names$pairwise + if(!is.null(stored_names)) { + edge_names = stored_names + } else { + edge_names = character() + for(i in 1:(num_vars - 1)) { + for(j in (i + 1):num_vars) { + edge_names = c(edge_names, paste0(var_names[i], "-", var_names[j])) + } } } @@ -492,46 +499,84 @@ extract_pairwise_interactions.bgmCompare = function(bgms_object) { stop("No pairwise interaction samples found in fit object.") } -#' Extract Category Threshold Estimates +#' Extract Main Effect Estimates +#' +#' @title Extract Main Effect Estimates #' #' @description -#' Retrieves category threshold parameters from a model fitted with -#' [bgm()] or [bgmCompare()]. +#' Retrieves posterior mean main-effect parameters from a model fitted with +#' [bgm()] or [bgmCompare()]. For OMRF models these are category thresholds; +#' for mixed MRF models these include both discrete thresholds and continuous +#' means and precisions. GGM models have no main effects (the precision +#' diagonal represents quadratic effects) and return `NULL`. #' #' @param bgms_object A fitted model object of class `bgms` (from [bgm()]) #' or `bgmCompare` (from [bgmCompare()]). #' -#' @return +#' @return The structure depends on the model type: #' \describe{ -#' \item{bgms}{A matrix with one row per variable and one column per -#' category threshold, containing posterior means.} +#' \item{GGM (bgms)}{`NULL` (invisibly). GGM models have no main effects; +#' the precision matrix diagonal contains quadratic effects, accessible +#' via `$posterior_mean_main`.} +#' \item{OMRF (bgms)}{A numeric matrix with one row per variable and one +#' column per category threshold, containing posterior means. Columns +#' beyond the number of categories for a variable are `NA`.} +#' \item{Mixed MRF (bgms)}{A list with two elements: +#' \describe{ +#' \item{discrete}{A numeric matrix (p rows x max_categories columns) +#' of posterior mean thresholds for discrete variables.} +#' \item{continuous}{A numeric matrix (q rows x 2 columns) with +#' columns `"mean"` and `"precision"` for continuous variables.} +#' }} #' \item{bgmCompare}{A matrix with one row per post-warmup iteration, -#' containing posterior samples of baseline threshold parameters.} +#' containing posterior samples of baseline main-effect parameters.} #' } #' -#' @seealso [bgm()], [bgmCompare()], [extract_pairwise_interactions()] +#' @examples +#' \donttest{ +#' fit = bgm(x = Wenchuan[, 1:3]) +#' extract_main_effects(fit) +#' } +#' +#' @seealso [bgm()], [bgmCompare()], [extract_pairwise_interactions()], +#' [extract_category_thresholds()] #' @family extractors #' @export -extract_category_thresholds = function(bgms_object) { - UseMethod("extract_category_thresholds") +extract_main_effects = function(bgms_object) { + UseMethod("extract_main_effects") } -#' @inheritParams extract_category_thresholds +#' @inheritParams extract_main_effects #' @exportS3Method #' @noRd -extract_category_thresholds.bgms = function(bgms_object) { +extract_main_effects.bgms = function(bgms_object) { arguments = extract_arguments(bgms_object) - var_names = arguments$data_columnnames + + # GGM: no main effects (precision diagonal entries are quadratic, not main) + if(isTRUE(arguments$is_continuous)) { + message( + "GGM models have no main effects. The precision matrix diagonal ", + "(quadratic effects) is available via $posterior_mean_main." + ) + return(invisible(NULL)) + } + + # Mixed MRF: return pre-built list from posterior_mean_main + if(isTRUE(arguments$is_mixed)) { + return(bgms_object$posterior_mean_main) + } # Current format (0.1.6.0+) if(!is.null(bgms_object$posterior_summary_main)) { vec = bgms_object$posterior_summary_main[, "mean"] - # Handle legacy field name (no_variables → num_variables in 0.1.6.0) + var_names = arguments$data_columnnames num_vars = arguments$num_variables %||% arguments$no_variables variable_type = arguments$variable_type if(length(variable_type) == 1) { variable_type = rep(variable_type, num_vars) } + + # OMRF: threshold matrix num_cats = arguments$num_categories max_cats = max(num_cats) mat = matrix(NA_real_, nrow = num_vars, ncol = max_cats) @@ -556,8 +601,8 @@ extract_category_thresholds.bgms = function(bgms_object) { "0.1.6.0", I("The '$thresholds' field is deprecated; please refit with bgms >= 0.1.6.0") ) + var_names = arguments$data_columnnames means = colMeans(bgms_object$thresholds) - # For binary variables in 0.1.4.x, there's 1 threshold per variable mat = matrix(means, nrow = length(means), ncol = 1) rownames(mat) = var_names return(mat) @@ -570,10 +615,10 @@ extract_category_thresholds.bgms = function(bgms_object) { ) } -#' @inheritParams extract_category_thresholds +#' @inheritParams extract_main_effects #' @exportS3Method #' @noRd -extract_category_thresholds.bgmCompare = function(bgms_object) { +extract_main_effects.bgmCompare = function(bgms_object) { arguments = extract_arguments(bgms_object) # Current format (0.1.6.0+) @@ -604,11 +649,39 @@ extract_category_thresholds.bgmCompare = function(bgms_object) { "0.1.6.0", I("The '$thresholds_gr*' fields are deprecated; please refit with bgms >= 0.1.6.0") ) - # Combine the two groups' thresholds return(cbind(bgms_object$thresholds_gr1, bgms_object$thresholds_gr2)) } - stop("No category threshold samples found in fit object.") + stop("No main effect samples found in fit object.") +} + + +#' Extract Category Threshold Estimates +#' +#' @title Extract Category Threshold Estimates +#' +#' @description +#' `r lifecycle::badge("deprecated")` +#' +#' `extract_category_thresholds()` was renamed to [extract_main_effects()] to +#' reflect that main effects include continuous means and precisions +#' (mixed MRF), not only category thresholds. +#' +#' @param bgms_object A fitted model object of class `bgms` (from [bgm()]) +#' or `bgmCompare` (from [bgmCompare()]). +#' +#' @return See [extract_main_effects()] for details. +#' +#' @seealso [extract_main_effects()] +#' @family extractors +#' @export +extract_category_thresholds = function(bgms_object) { + lifecycle::deprecate_warn( + "0.2.1.0", + "extract_category_thresholds()", + "extract_main_effects()" + ) + extract_main_effects(bgms_object) } #' Extract Group-Specific Parameters @@ -624,7 +697,7 @@ extract_category_thresholds.bgmCompare = function(bgms_object) { #' group) and `pairwise_effects_groups` (pairwise effects per group). #' #' @seealso [bgmCompare()], [extract_pairwise_interactions()], -#' [extract_category_thresholds()] +#' [extract_main_effects()] #' @family extractors #' @export extract_group_params = function(bgms_object) { @@ -842,13 +915,13 @@ extract_edge_indicators = function(bgms_object) { extract_indicators(bgms_object) } -#' Deprecated: Use extract_category_thresholds instead +#' Deprecated: Use extract_main_effects instead #' @param bgms_object A bgms or bgmCompare object. #' @keywords internal #' @export extract_pairwise_thresholds = function(bgms_object) { - lifecycle::deprecate_warn("0.1.4.2", "extract_pairwise_thresholds()", "extract_category_thresholds()") - extract_category_thresholds(bgms_object) + lifecycle::deprecate_warn("0.1.4.2", "extract_pairwise_thresholds()", "extract_main_effects()") + extract_main_effects(bgms_object) } diff --git a/dev/ggm_g_prior.md b/dev/ggm_g_prior.md new file mode 100644 index 00000000..49f9132c --- /dev/null +++ b/dev/ggm_g_prior.md @@ -0,0 +1,41 @@ +# g-type Slab Prior for bgms Edge Weights + +## Motivation +Manual tuning of the Cauchy slab scale is awkward and can obscure whether discrepancies with comparators stem from modeling or shrinkage choices. In regression-style spike-and-slab models, Zellner's $g$-prior offers automatic scaling by tying coefficients to the design matrix. We can mimic that idea for individual edge parameters $\theta_{ij}$ in the mixed GGM sampler by anchoring the slab variance to local Fisher information, giving consistent units across nodes and datasets. + +## Proposed Formulation +For each candidate edge $(i,j)$ with corresponding conditional regression coefficient $\theta_{ij}$: + +- Use the usual spike mixture: $\theta_{ij} \sim (1-\gamma_{ij}) \delta_0 + \gamma_{ij} \cdot p_{\text{slab}}(\theta_{ij})$ with inclusion indicator $\gamma_{ij} \in \{0,1\}$. +- Replace the free-scale Cauchy slab with a conditionally normal slab whose variance adapts via a $g$ parameter: + $$p_{\text{slab}}(\theta_{ij} \mid g, s_{ij}) = \mathcal N\bigl(0, g \cdot s_{ij}^{-1}\bigr).$$ +- Here $s_{ij}$ approximates the Fisher information for $\theta_{ij}$ when the rest of the graph is fixed. For Gaussian nodes this could be the conditional residual variance; for mixed nodes we can use the negative Hessian of the log-likelihood restricted to $\theta_{ij}$. + +### Hyperprior on $g$ +Adopt a standard Beta-prime / inverse-gamma style: +- $g \sim \text{BetaPrime}(a_g, b_g)$ with density proportional to $g^{a_g-1}(1+g)^{-(a_g+b_g)}$. +- Default choice $a_g = 1$, $b_g = 1$ mirrors the hyper-$g$ prior, favoring moderate shrinkage while leaving heavy tails. +- Alternative: $g/(1+g) \sim \text{Beta}(a_g, b_g)$ to keep $g$ finite with more intuitive tuning. + +## Implementation Sketch +1. **Compute $s_{ij}$ efficiently**: during local edge updates we already build score/Hessian terms. Cache $s_{ij}$ (or its approximation) when evaluating the conditional likelihood. +2. **Augment sampler state**: treat $g$ as either global (shared across edges) or edge-specific $g_{ij}$. Start with a global $g$ for simplicity. +3. **Gibbs/Metropolis steps**: + - Conditional on $g$, sampling $\theta_{ij}$ from the Gaussian slab is straightforward (or use MH if the mixed-node likelihood prevents conjugacy). + - Update $g$ via MH or slice sampling using the Beta-prime prior and the product of Gaussian slabs. +4. **Compatibility with spike indicator**: no change—the inclusion probability update uses the new slab density. + +## Evaluation Plan +- **Full-graph scenario**: compare bgms with Cauchy slabs vs g-type slabs on $p=20$ dense graphs; track RMSE and coverage relative to truth and bggm. +- **Sparse scenario**: measure inclusion ROC/AUC and calibration when using g-type slabs, ensuring sparsity is not overly penalized. +- **Sensitivity**: vary $(a_g, b_g)$ to see if results are robust; consider placing a hyperprior on $s_{ij}$ approximation error if needed. + +## Open Questions +- How stable is $s_{ij}$ for mixed discrete nodes? Need to confirm the Hessian remains positive definite; otherwise use a sandwich estimator. +- Global vs local $g$: does sharing one $g$ across edges over-shrink high-degree nodes? Potential extension with $g_i$ per node. +- Interaction with existing spike penalties: should inclusion priors be adjusted when switching slab families to keep edge probabilities comparable? + +## Next Steps +1. Prototype $s_{ij}$ computation in the continuous-only case to validate scaling. +2. Implement a global-$g$ sampler branch and benchmark on small graphs. +3. Decide whether to expose the g-type slab as a user option or keep it experimental during the performance study. diff --git a/dev/ggm_nuts/blockwise_hmc.md b/dev/ggm_nuts/blockwise_hmc.md new file mode 100644 index 00000000..e1972439 --- /dev/null +++ b/dev/ggm_nuts/blockwise_hmc.md @@ -0,0 +1,25 @@ +# Blockwise / Subspace HMC for Sparse GGMs + +## Concept +Split the precision matrix parameters into clique-based subsets that admit local Cholesky factorizations without fill-ins, then run Hamiltonian proposals (HMC or NUTS) within each subset while conditioning on the rest. The approach mimics block Gibbs but uses gradient-informed trajectories to accelerate mixing inside large cliques. + +## Construction +1. Decompose the graph into cliques and separators (junction tree or block-cut tree). +2. For each clique, identify the free precision entries (including its separator interface). +3. Parameterize each block via a local Cholesky factor (log-diagonals + unconstrained subdiagonal entries). Because the block is chordal by definition, PD is automatic. +4. Run NUTS inside the block, treating separator values from neighboring blocks as fixed during the leapfrog trajectory. +5. Accept/reject per block, then cycle through blocks or randomly scan them. + +## Pros +- Keeps parameter dimensionality close to the true number of edges. +- Exploits sparsity: small cliques reuse cached symbolic factorizations. +- Amenable to parallel updates across disconnected components. + +## Cons +- Requires dynamic bookkeeping of separators when RJ moves add/remove edges. +- Acceptance rates can drop if separators induce strong cross-block dependence. +- Implementation complexity: need reversible Metropolis-within-Gibbs logic and gradient code per block. + +## References +- Green, P. J., & Thomas, A. (2013). *Sampling decomposable graphs using a Markov chain on junction trees.* Biometrika 100(1). +- Mohammadi, A., & Wit, E. C. (2015). *Bayesian structure learning in sparse Gaussian graphical models.* Bayesian Analysis 10(1). diff --git a/dev/ggm_nuts/chordal_completion_augmentation.md b/dev/ggm_nuts/chordal_completion_augmentation.md new file mode 100644 index 00000000..2bb7a02d --- /dev/null +++ b/dev/ggm_nuts/chordal_completion_augmentation.md @@ -0,0 +1,34 @@ +# Chordal Completion Augmentation for GGM NUTS + +## Goal +Use the No-U-Turn Sampler for Gaussian graphical model parameters while enforcing the sparsity pattern of a non-chordal precision matrix. The idea is to work on an augmented parameter space where positive definiteness is guaranteed, then map back to the original graph. + +## Strategy Overview +1. **Chordal completion**: Given the current graph \(G\), build a chordal supergraph \(\tilde G\) by adding the minimal set of fill-in edges. Algorithms such as minimum degree, approximate minimum degree, or nested dissection supply reasonable triangulations. +2. **Perfect elimination order**: Compute a PEO on \(\tilde G\). This ordering ensures that sparse Cholesky factorization of any PD matrix respecting \(\tilde G\) introduces no further fill-ins. +3. **Sparse Cholesky parameterization**: + - Parameterize a lower-triangular matrix \(L\) whose sparsity matches \(\tilde G\). Entries corresponding to edges (including fill-ins) are free parameters; non-edges are fixed at zero. + - Diagonal entries live on the log scale to enforce positivity: \(L_{ii} = \exp(d_i)\) with unconstrained \(d_i \in \mathbb{R}\). + - All other free entries are unconstrained reals. Together they form the vector that NUTS updates. +4. **Precision reconstruction**: Form \(Q = L L^\top\). By construction \(Q\) is positive definite for any unconstrained parameter values. +5. **Projection back to \(G\)**: Extract the entries of \(Q\) that correspond to edges and diagonals of the original graph, discarding the auxiliary fill-in elements. These extracted entries plug into the likelihood and priors defined on \(G\). + +## Why This Works +- Cholesky factors of non-chordal sparse matrices inevitably introduce fill-ins. By expanding to \(\tilde G\) we accept those fill-ins explicitly, rather than letting them appear implicitly during factorization. +- NUTS operates on the free parameters of \(L\), which live on \(\mathbb{R}^{k}\) with no boundary constraints, so the Hamiltonian dynamics remain well-defined. +- The auxiliary parameters tied to fill-in edges never enter the likelihood directly; they ensure the reconstructed precision stays PD while respecting the observed sparsity once projected. + +## Computational Cost +- Building \(\tilde G\) and its PEO costs roughly linear time in the number of edges plus fill-ins but can be dominated by triangulation for dense graphs. +- The dimension of the parameter space increases with the number of fill-in edges. If \(G\) is far from chordal, this inflation can slow NUTS steps and gradient evaluations. +- Sparse matrix routines (symbolic factorization, reuse of elimination trees) should be cached across iterations to keep costs manageable. + +## Practical Tips +- Reuse the same chordal completion for all iterations while the graph structure stays fixed. If the edge set changes (RJ step), recompute the triangulation only when necessary. +- Choose heuristics (e.g., AMD) that minimize fill-ins, balancing numerical stability and efficiency. +- Gradients of \(Q = L L^\top\) w.r.t. the free entries of \(L\) follow standard reverse-mode rules; implement them with sparse structures to avoid dense \(O(p^2)\) work. + +## References +- Rue, H., & Held, L. (2005). *Gaussian Markov Random Fields: Theory and Applications*. Chapters 2–3 discuss chordal completions and sparse Cholesky factors. +- Atay-Kayis, A., & Massam, H. (2005). "A Monte Carlo method for computing the marginal likelihood in nondecomposable Gaussian graphical models." *Journal of Computational and Graphical Statistics*. +- Dahl, J., Vandenberghe, L., & Roychowdhury, V. (2008). "Covariance selection for non-chordal graphs via chordal embedding." *Optimization and Engineering*. diff --git a/dev/ggm_nuts/elliptical_slice_surrogates.md b/dev/ggm_nuts/elliptical_slice_surrogates.md new file mode 100644 index 00000000..7c299eba --- /dev/null +++ b/dev/ggm_nuts/elliptical_slice_surrogates.md @@ -0,0 +1,24 @@ +# Elliptical Slice / Surrogate Transitions + +## Concept +Retain the graph-respecting adaptive Metropolis kernel but wrap it with gradient-informed or Gaussian surrogate moves to boost local exploration without heavy Hamiltonian mechanics. Elliptical slice sampling (ESS) is attractive when the prior is Gaussian with sparse precision; surrogate transitions such as preconditioned Crank–Nicolson (pCN) or blocked ESS reuse sparse linear solves. + +## Construction +1. Use the existing RJ step to update the edge set. +2. Conditional on a fixed graph, draw proposals from a Gaussian surrogate with precision equal (or close) to the current posterior curvature, e.g., via solving \(Q x = z\) with sparse methods. +3. Apply ESS or pCN to accept/reject along the elliptical trajectory without tuning step sizes. +4. Optionally interleave occasional gradient-informed Metropolis proposals (Langevin, quasi-Newton) that exploit the sparse precision as a preconditioner. + +## Pros +- No need for chordal completions or manifold integrators. +- Exact ESS has acceptance probability 1 when the likelihood is Gaussian; in general it is robust to tuning. +- Sparse linear algebra can be reused across iterations, matching the structure already present for RJ moves. + +## Cons +- Mixing can lag behind full NUTS, especially with highly correlated posteriors. +- Requires drawing from the surrogate Gaussian, which still needs sparse Cholesky solves each iteration. +- Does not exploit gradients beyond what is embedded in the surrogate; tuning the surrogate to match posterior curvature can be difficult. + +## References +- Murray, I., Adams, R. P., & MacKay, D. J. C. (2010). *Elliptical slice sampling.* AISTATS. +- Cotter, S., et al. (2013). *MCMC methods for functions: modifying old algorithms to make them faster.* Statistical Science 28(3). diff --git a/dev/ggm_nuts/partial_correlation_reparameterization.md b/dev/ggm_nuts/partial_correlation_reparameterization.md new file mode 100644 index 00000000..25e65f96 --- /dev/null +++ b/dev/ggm_nuts/partial_correlation_reparameterization.md @@ -0,0 +1,28 @@ +# Partial-correlation reparameterization for GGM NUTS + +## Core idea +Map unconstrained parameters to admissible precision matrices by working in partial correlations (PCs). Each PC lives on \((-1, 1)\), so we represent it via \(\rho = \tanh(\eta)\) with \(\eta \in \mathbb{R}\). Diagonal precision entries use log-scales to ensure positivity. The mapping guarantees positive definiteness and enforces graph zeros, allowing NUTS to operate on \(\eta\) and the log-diagonals without boundary constraints. + +## Construction steps +1. Choose a node ordering and form sequential regressions (modified Cholesky / Schur complements). +2. For every permitted edge \((i, j)\) with \(j < i\), introduce an unconstrained \(\eta_{ij}\); set the partial correlation \(\rho_{ij} = \tanh(\eta_{ij})\). +3. Assemble the unit-diagonal correlation matrix using the recursive PC-to-correlation formulas (Joe, 2006; Liechty et al., 2004). Missing edges receive \(\rho = 0\). +4. Introduce unconstrained \(\zeta_i\) for each node and set conditional precision scales as \(\exp(\zeta_i)\). +5. Form \(Q = D^{-1/2} R^{-1} D^{-1/2}\) where \(D = \operatorname{diag}(\exp(\zeta_i))\) and \(R\) is the correlation matrix from step 3. + +## Graph enforcement +Only existing edges get \(\eta\)-parameters, so their PCs can vary; missing edges stay fixed at zero PCs, and the recursive construction keeps those entries zero in the final precision. Thus \(Q\) respects the graph after the similarity transform. + +## Using with NUTS +- Parameter vector consists of \(\eta\) (one per edge) plus \(\zeta\) (one per node). +- Log posterior is evaluated through \(Q(\eta, \zeta)\). +- Gradients flow through the smooth tanh and matrix operations, so autodiff applies. Cache intermediate matrices to keep complexity reasonable. + +## Practical notes +- Clamp \(|\rho|\) slightly below 1 (e.g., \(\rho = \tanh(\eta)\times (1-\epsilon)\)) for numerical stability. +- Reorder nodes (AMD, nested dissection) to limit numerical error and keep regressions well-conditioned. +- Jacobian adjustments: add \(\log \cosh(\eta_{ij})\) for each PC transform and \(\zeta_i\) for each log-diagonal. + +## References +- Liechty, J., Liechty, M., & Müller, P. (2004). Bayesian correlation estimation. *Journal of the American Statistical Association*, 99(447), 1021–1035. +- Joe, H. (2006). Generating random correlation matrices based on partial correlations. *Journal of Multivariate Analysis*, 97(10), 2177–2189. (See also UBC Technical Report 2005-11.) diff --git a/dev/ggm_nuts/projected_nuts.md b/dev/ggm_nuts/projected_nuts.md new file mode 100644 index 00000000..c9ed6fc3 --- /dev/null +++ b/dev/ggm_nuts/projected_nuts.md @@ -0,0 +1,28 @@ +# Projected NUTS for Sparse Precision Matrices + +## Concept +Run Hamiltonian dynamics in an unconstrained Euclidean space, then project intermediate states back onto the sparse positive-definite cone that encodes the graph. Projection enforces symmetry, sparsity, and PD by solving a convex program after each integrator step. + +## Construction +1. Parameterize a dense symmetric matrix \(S\) with unconstrained entries. +2. During each leapfrog step, update \(S\) using standard NUTS integration. +3. After the position update, solve a projection problem: + \[ + \min_{Q \succeq 0} \|Q - S\|_F^2 \quad \text{s.t.}\quad Q_{ij} = 0 \;\text{for}\; (i,j) \notin E. + \] + This is a log-det barrier or semidefinite program over the sparsity-constrained cone. +4. Use the projected \(Q\) to evaluate the log posterior and gradients (via implicit differentiation through the projection). + +## Pros +- Parameter dimension equals the number of edges (after eliminating fixed zeros) if you operate in the sparse coordinate basis. +- Projection guarantees feasibility even if leapfrog steps wander outside the cone. +- Compatible with existing convex-optimization libraries (e.g., sparse log-det solvers). + +## Cons +- Each projection may require solving a sizable convex problem (costly for large graphs). +- Differentiating through the projection demands custom adjoint code or implicit differentiation. +- Numerical errors from repeated projection can accumulate, making reversibility checks essential. + +## References +- Dahl, J., Vandenberghe, L., & Roychowdhury, V. (2008). *Covariance selection for non-chordal graphs via chordal embedding.* Optimization and Engineering. +- Nishihara, R., et al. (2014). *Proximal algorithms for constrained HMC.* (Workshop paper; describes projection-based integrators.) diff --git a/dev/ggm_nuts/riemannian_gwishart_hmc.md b/dev/ggm_nuts/riemannian_gwishart_hmc.md new file mode 100644 index 00000000..de76bb2d --- /dev/null +++ b/dev/ggm_nuts/riemannian_gwishart_hmc.md @@ -0,0 +1,24 @@ +# Riemannian Manifold HMC on the G-Wishart Cone + +## Concept +Treat the space of graph-constrained positive-definite matrices as a Riemannian manifold endowed with the Fisher information metric of the G-Wishart distribution. Run Riemannian HMC (RMHMC) so that geodesic proposals respect the sparsity constraints without auxiliary completions. + +## Construction +1. Define the target density as the posterior over the sparse precision matrix, typically proportional to a G-Wishart prior times the data likelihood. +2. Use the Fisher metric of the G-Wishart (or an approximation) as the position-dependent mass matrix. +3. At each leapfrog step solve the implicit equations for RMHMC (usually via fixed-point iterations) to update momentum and position. +4. Ensure gradients are evaluated only on free entries; metric tensors inherit the sparse structure, but linear solves involve fill-ins. + +## Pros +- Moves directly on the constrained space; no auxiliary parameters or projections. +- Metric adapts to local curvature, improving exploration in stiff posteriors. +- Naturally accommodates different priors via the metric definition. + +## Cons +- Each leapfrog step requires solving nonlinear equations plus sparse linear systems; computationally heavy. +- Implementing efficient sparse RMHMC is complex (automatic differentiation of metrics, symbolic factorization reuse). +- Requires tuning step sizes and number of fixed-point iterations to maintain stability. + +## References +- Byrne, S., & Girolami, M. (2013). *Geodesic Monte Carlo on embedded manifolds.* Scandinavian Journal of Statistics 40(4). +- Lenkoski, A. (2013). *A direct sampler for G-Wishart variates.* Stat 2(1). (Appendix discusses the manifold structure.) diff --git a/dev/mixedmrf/deduplication_audit.md b/dev/mixedmrf/deduplication_audit.md new file mode 100644 index 00000000..f9d7992a --- /dev/null +++ b/dev/mixedmrf/deduplication_audit.md @@ -0,0 +1,459 @@ +# Phase K — Code Deduplication & Architectural Conformance Audit + +**Date:** 2026-03-09 +**Branch:** `ggm_mixed` +**Scope:** Audit only — no refactoring in this phase. + +--- + +## Part 1: Architectural Conformance + +The GGM model is the prototype for how model classes should be structured. +The OMRF follows GGM conventions in most areas. This section documents +where the MixedMRF deviates from the GGM/OMRF pattern and recommends +alignment. + +### 1.1 Edge selection: embedded vs separated + +| Model | Pattern | Location | +|-------|---------|----------| +| GGM | Embedded in `do_one_metropolis_step` | `ggm_model.cpp` L341–346 | +| OMRF | Separated: `update_edge_indicators()` called by ChainRunner | `omrf_model.cpp` L1296–1305 | +| MixedMRF | Separated: `update_edge_indicators()` with three sub-sweeps | `mixed_mrf_model.cpp` | + +**Finding:** GGM embeds edge selection inside the Metropolis step; OMRF +and MixedMRF separate it. The OMRF/MixedMRF pattern is the better +design (matches the ChainRunner contract where `update_edge_indicators()` +is called as a distinct step). GGM is the outlier here. + +**Decision:** MixedMRF correctly follows the OMRF pattern. No change. +GGM should align upward to this pattern in a future refactor. + +### 1.2 Edge-order shuffling + +| Model | Shuffle | Where | +|-------|---------|-------| +| GGM | No shuffle — deterministic i,j loop | `do_one_metropolis_step` | +| OMRF | Shuffles `shuffled_edge_order_` in `prepare_iteration()` | `omrf_model.cpp` | +| MixedMRF | Shuffles three vectors in `prepare_iteration()` | `mixed_mrf_model.cpp` | + +**Finding:** GGM does not shuffle edge update order at all. OMRF and +MixedMRF do, which is better practice (reduces order bias in RJ sweeps). + +**Decision:** OMRF/MixedMRF pattern is preferred. MixedMRF is correct. +The three separate shuffle vectors (xx, yy, xy) are necessary because +MixedMRF has three distinct edge-type blocks. GGM should add shuffling +in a future refactor. + +### 1.3 Metropolis adaptation mechanism + +| Model | Mechanism | Controller object? | +|-------|-----------|-------------------| +| GGM | Inline Robbins-Monro in each update function | No | +| OMRF | Delegated to `MetropolisAdaptationController` | Yes (2 instances: main, pairwise) | +| MixedMRF | Inline Robbins-Monro in each update function | No | + +**Adaptation formula (GGM and MixedMRF):** +```cpp +if(iteration >= 1 && iteration < total_warmup_) { + double rm_weight = std::pow(iteration, -0.75); + prop_sd_(i, j) = update_proposal_sd_with_robbins_monro( + prop_sd_(i, j), ln_alpha, rm_weight, 0.44); +} +``` + +**Finding:** GGM and MixedMRF use identical inline Robbins-Monro (target +0.44, exponent -0.75). OMRF uses a controller object that collects +acceptance probabilities into matrices and applies batch updates. The +OMRF approach is more structured but also more complex. + +**Recommendation:** MixedMRF matches GGM exactly. No copy-paste drift +detected. The OMRF's controller pattern was designed for its specific +batch-collection workflow and is not obviously better for the mixed +model's five-block sweep. Status quo is fine. + +### 1.4 Proposal SD storage + +| Model | Storage | +|-------|---------| +| GGM | `proposal_sds_` — flat `arma::vec` of length dim_ | +| OMRF | `proposal_sd_main_` (p x max_cats), `proposal_sd_pairwise_` (p x p) | +| MixedMRF | `prop_sd_mux_`, `prop_sd_muy_`, `prop_sd_Kxx_`, `prop_sd_Kyy_`, `prop_sd_Kxy_` | + +**Finding:** GGM flattens everything into one vector; OMRF uses two +matrices; MixedMRF uses five separate storage objects. The MixedMRF +approach is natural for a model with five parameter blocks. No issue. + +**Recommendation:** No change needed. The naming abbreviation `prop_sd_` +vs OMRF's `proposal_sd_` is a minor style divergence; consider +standardizing to `proposal_sd_` for consistency with OMRF. + +### 1.5 Naming conventions + +The naming scheme uses a two-level hierarchy: role (`main_effects_`, +`pairwise_effects_`) qualified by variable type (`discrete_`, +`continuous_`, `cross_`). Both category thresholds and continuous +means are main effects — the variable type is the qualifier, not the +statistical role. + +#### Agreed rename mapping + +**Parameters:** + +| Current | New | +|---------|-----| +| `mux_` | `main_effects_discrete_` | +| `muy_` | `main_effects_continuous_` | +| `Kxx_` | `pairwise_effects_discrete_` | +| `Kyy_` | `pairwise_effects_continuous_` | +| `Kxy_` | `pairwise_effects_cross_` | + +**Proposal SDs:** + +| Current | New | +|---------|-----| +| `prop_sd_mux_` | `proposal_sd_main_discrete_` | +| `prop_sd_muy_` | `proposal_sd_main_continuous_` | +| `prop_sd_Kxx_` | `proposal_sd_pairwise_discrete_` | +| `prop_sd_Kyy_` | `proposal_sd_pairwise_continuous_` | +| `prop_sd_Kxy_` | `proposal_sd_pairwise_cross_` | + +**Derived quantities (GGM pattern for Cholesky names):** + +| Current | New | +|---------|-----| +| `Kyy_chol_` | `cholesky_of_precision_` | +| `inv_cholesky_yy_` | `inv_cholesky_of_precision_` | +| `covariance_yy_` | `covariance_continuous_` | + +**Cross-model consistency:** + +| Concept | GGM | OMRF | MixedMRF (new) | +|---------|-----|------|----------------| +| Main effects | N/A | `main_effects_` | `main_effects_discrete_`, `main_effects_continuous_` | +| Pairwise effects | `precision_matrix_` | `pairwise_effects_` | `pairwise_effects_discrete_`, `pairwise_effects_continuous_`, `pairwise_effects_cross_` | +| Cholesky | `cholesky_of_precision_` | N/A | `cholesky_of_precision_` | +| Inv Cholesky | `inv_cholesky_of_precision_` | N/A | `inv_cholesky_of_precision_` | +| Covariance | `covariance_matrix_` | N/A | `covariance_continuous_` | +| Proposal SDs | `proposal_sds_` | `proposal_sd_*` | `proposal_sd_*` | +| Observations (int) | N/A | `observations_` | `discrete_observations_` (OK — mixed needs qualifier) | +| Observations (dbl) | `observations_` | `observations_double_` | `discrete_observations_dbl_` (OK) | + +Grepping for `main_effects_` or `pairwise_effects_` finds all relevant +members across all three models. The Cholesky names parallel GGM +directly — anyone familiar with the GGM code recognizes the role. + +**Decision (high priority):** Apply this rename. The change is mechanical +but touches many lines across 4 C++ files and the R output builder. + +### 1.6 `MY_LOG` vs `std::log` in edge selection + +| Model | Usage in edge-indicator inclusion-prior terms | +|-------|-----------------------------------------------| +| GGM | `MY_LOG(inclusion_probability_(i, j))` | +| OMRF | `MY_LOG(inclusion_probability_ij)` | +| MixedMRF | `std::log(inclusion_probability_(i, j))` | + +**Finding:** GGM and OMRF use `MY_LOG`; MixedMRF uses `std::log`. +The `MY_LOG` macro was introduced for consistent fast-math behavior +across the codebase. + +**Recommendation (fix):** Replace all 6 `std::log(inclusion_probability_` +occurrences in `mixed_mrf_metropolis.cpp` with `MY_LOG`. This is a +mechanical change (lines 621, 627, 702, 712, 796, 802). + +### 1.7 File organization + +| Model | Implementation files | Pattern | +|-------|---------------------|---------| +| GGM | 1: `ggm_model.cpp` (~470 lines) + `cholupdate.cpp` (~120 lines) | Monolithic | +| OMRF | 1: `omrf_model.cpp` (~1450 lines) | Monolithic | +| MixedMRF | 4: `mixed_mrf_model.cpp` (~850), `mixed_mrf_likelihoods.cpp` (~140), `mixed_mrf_gradient.cpp` (~500), `mixed_mrf_metropolis.cpp` (~800) | Modular split | + +**Finding:** MixedMRF splits into four files while GGM and OMRF are +monolithic. The MixedMRF approach is arguably better for a 2300-line +model, but diverges from the established pattern. + +**Recommendation:** No change. The split is pragmatic given the model's +complexity. If GGM or OMRF grow, they should adopt the same split +pattern rather than forcing MixedMRF back into a monolith. + +### 1.8 Public API surface + +**GGM-specific public methods:** +- `log_likelihood()` (2 overloads) +- `set_missing_data(const arma::imat&)` + +**OMRF-specific public methods:** +- ~15 accessors/setters (`get_main_effects`, `set_pairwise_effects`, etc.) +- `set_step_size`, `get_step_size`, `set_inv_mass`, `get_inv_mass` +- `set_pairwise_scaling_factors` + +**MixedMRF-specific public methods:** +- `do_kyy_metropolis_step(int)` — exposed for hybrid NUTS sampler +- `set_missing_data(const arma::imat&, const arma::imat&)` — two matrices +- `storage_dimension()`, `get_storage_vectorized_parameters()` — extra vectorization levels +- `get_active_inv_mass()` — override for NUTS mass matrix + +**Finding:** MixedMRF has a relatively narrow public API compared to OMRF. +The `do_kyy_metropolis_step` public method is specific to the hybrid +NUTS+MH design and is called by `HybridNUTSSampler`. The OMRF's many +accessors exist because the NUTS sampler needs direct parameter +access. MixedMRF absorbs this into the vectorization interface instead. + +**Recommendation:** The OMRF's many public accessors (`get_main_effects`, +`set_pairwise_effects`, etc.) create a wide coupling surface. The +MixedMRF's approach of using vectorization methods is cleaner. Consider +narrowing OMRF's public API in a future refactor to match. + +### 1.9 `storage_dimension()` override + +Only MixedMRF overrides `storage_dimension()`. BaseModel's default +returns `full_parameter_dimension()`. MixedMRF needs this because +Kyy is excluded from the NUTS gradient block but must still be stored +in the sample buffer. + +**Finding:** This is a necessary architectural extension, not a +conformance issue. GGM and OMRF don't need it because they don't +have a hybrid sampler. + +**Recommendation:** No change. Document in BaseModel that +`storage_dimension` exists for hybrid samplers. + +### 1.10 Documentation quality + +| Model | Class-level doc | Private method doc | Member field doc | Section dividers | +|-------|:---:|:---:|:---:|:---:| +| GGM | `/** */` | Minimal | `///` on most | Minimal | +| OMRF | `/** */` | Most methods | `///` on all | `//` section headers | +| MixedMRF | `/** */` extensive | All methods | `///` on all | `// ===` and `// ---` | + +**Finding:** MixedMRF has the most thorough documentation. This exceeds +GGM/OMRF quality. Good. + +**Recommendation:** No change for MixedMRF. Consider improving GGM's +private-method documentation to match OMRF/MixedMRF level. + +--- + +## Part 2: Code Duplication Candidates + +### 2.1 Matrix assembly in `build_output.R` + +**Location:** `R/build_output.R` +- `build_output_mixed_mrf()` lines 476–569: Four nested-loop blocks + filling (p+q)×(p+q) matrices from flat vectors (pairwise means, + pairwise indicators, each with Kxx/Kyy/Kxy sub-blocks). +- `build_output_bgm()` lines 225–253: Analogous matrix assembly using + `lower.tri()` + transpose (simpler because only one matrix block). + +**Duplication:** The mixed MRF has 3 sub-blocks per matrix × 2 matrices +(pairwise + indicator) = 6 near-identical loop nests. Each is ~12 lines. +Total redundant code: ~60 lines. + +**Extraction candidate:** +```r +fill_symmetric_matrix = function(flat_values, idx_pairs, target_matrix) { + for(k in seq_along(flat_values)) { + i = idx_pairs[k, 1]; j = idx_pairs[k, 2] + target_matrix[i, j] = flat_values[k] + target_matrix[j, i] = flat_values[k] + } + target_matrix +} +``` + +**Effort:** Low (30 min). **Risk:** Low. **Lines saved:** ~50. + +### 2.2 SBM summarization computed twice + +**Location:** `R/build_output.R` +- `build_output_bgm()`: `summarize_alloc_pairs()` called at lines ~176 + and ~243, producing `sbm_summary` and `co_occur_matrix` respectively. + Same inputs both times. + +**Finding confirmed:** The same function is called twice with identical +arguments. The first call extracts `$sbm_summary`, the second extracts +`$co_occur_matrix`. + +**Extraction:** Call once, store result, extract both fields. + +**Effort:** Trivial (5 min). **Risk:** None. **Lines saved:** ~8. + +### 2.3 Raw-samples list assembly + +**Location:** `R/build_output.R` +- `build_output_bgm()` lines 274–304 +- `build_output_mixed_mrf()` lines 678–703 + +**Duplication:** Near-identical structure. Both build: +```r +list(main = ..., pairwise = ..., indicator = ..., allocations = ..., + nchains = ..., niter = ..., parameter_names = ...) +``` + +**Difference:** `build_output_bgm` includes `allocations` naming; +`build_output_mixed_mrf` omits it. Otherwise identical. + +**Extraction candidate:** +```r +build_raw_samples_list = function(raw, edge_selection, edge_prior, + names_main, edge_names) { ... } +``` + +**Effort:** Low (20 min). **Risk:** Low. **Lines saved:** ~25. + +### 2.4 Parameter index computation in `build_output_mixed_mrf()` + +**Location:** `R/build_output.R` lines 337–429 (~90 lines) + +**Finding:** This block computes mux/Kxx/muy/Kxy/Kyy offsets and +separates them into `main_idx` and `pairwise_idx`. It's inline and +hard to audit. Contains a nested loop (lines 361–375) to identify +Kyy diagonal vs off-diagonal positions. + +**Extraction candidate:** +```r +compute_mixed_parameter_indices = function(num_thresholds, p, q) { + # Returns: list(mux_range, kxx_range, muy_range, kxy_range, + # kyy_range, kyy_diag_abs, kyy_offdiag_abs, + # main_idx, pairwise_idx) +} +``` + +**Effort:** Medium (45 min). **Risk:** Low — can unit-test independently. +**Lines saved:** 0 (extracted, not eliminated), but testability improves. + +### 2.5 `cholupdate.h` location + +**Current location:** `src/models/ggm/cholupdate.h` and `cholupdate.cpp` +**Included by:** GGMModel and MixedMRFModel + +**Finding:** This is pure linear algebra with no GGM-specific state. +Living under `src/models/ggm/` is misleading since MixedMRF depends on it. + +**Recommendation:** Move to `src/math/cholupdate.h` (alongside +`cholesky_helpers.h` which is already in `src/math/`). + +**Effort:** Low (15 min — move files, update includes, regenerate +`sources.mk`). **Risk:** Low — `#include` paths change, nothing else. + +### 2.6 Robbins-Monro adaptation + +**Finding:** GGM and MixedMRF use identical inline Robbins-Monro calls +with the same parameters (target=0.44, exponent=-0.75). Both call +`update_proposal_sd_with_robbins_monro()` which is a shared utility. +No copy-paste drift detected. + +OMRF uses `MetropolisAdaptationController` which internally does the +same math but in a batch-collection pattern. + +**Recommendation:** No extraction needed. The shared utility function +`update_proposal_sd_with_robbins_monro()` already prevents drift. + +### 2.7 Beta-Bernoulli between-cluster parameter handling + +**Location:** `R/run_sampler.R` +- Lines ~109–115 in `run_sampler_omrf()` +- Same pattern in `run_sampler_ggm()` and `run_sampler_mixed_mrf()` + +```r +bb_alpha_between = if(is.null(p$beta_bernoulli_alpha_between)) -1.0 + else p$beta_bernoulli_alpha_between +``` + +**Finding:** Identical 6-line pattern in all three sampler functions. + +**Extraction candidate:** Helper function or inline in `run_sampler()`. + +**Effort:** Trivial (10 min). **Risk:** None. **Lines saved:** ~12. + +### 2.8 Variable-type normalization in simulate/predict + +**Location:** `R/simulate_predict.R` +- Line ~1157 (simulate.bgms) and ~1627 (predict.bgms) + +```r +if(length(variable_type) == 1) { + variable_type = rep(variable_type, num_variables) +} +``` + +**Finding:** Same 3-line pattern duplicated in simulate and predict. + +**Extraction:** Minor; could go in a shared input-normalization helper. + +**Effort:** Trivial (5 min). **Risk:** None. **Lines saved:** ~3. + +--- + +## Part 3: Ranked Summary + +| # | Item | Type | Priority | Effort | Risk | Lines saved | +|:-:|------|------|:--------:|:------:|:----:|:-----------:| +| 1 | MY_LOG in edge selection (§1.6) | Bug-class fix | High | 5 min | None | 0 (correctness) | +| 2 | Naming conventions (§1.5) | Conformance | High | 2–3 hrs | Medium | 0 (rename) | +| 3 | cholupdate.h location (§2.5) | Organization | Medium | 15 min | Low | 0 (move) | +| 4 | Matrix assembly helper (§2.1) | Dedup | Medium | 30 min | Low | ~50 | +| 5 | SBM double-call (§2.2) | Dedup | Medium | 5 min | None | ~8 | +| 6 | Parameter index extraction (§2.4) | Testability | Medium | 45 min | Low | 0 (testable) | +| 7 | Raw-samples assembly (§2.3) | Dedup | Low | 20 min | Low | ~25 | +| 8 | BB between-cluster helper (§2.7) | Dedup | Low | 10 min | None | ~12 | +| 9 | Variable-type normalization (§2.8) | Dedup | Low | 5 min | None | ~3 | +| 10 | prop_sd_ → proposal_sd_ (§1.4) | Naming | Low | 30 min | Low | 0 (rename) | + +### Items NOT recommended for change + +- **File split (§1.7):** MixedMRF's 4-file split is better than monolithic. +- **Adaptation mechanism (§1.3):** Inline Robbins-Monro matches GGM. No drift. +- **Public API width (§1.8):** MixedMRF's narrow API is preferred. +- **storage_dimension (§1.9):** Necessary for hybrid sampler. +- **Edge selection separation (§1.1):** MixedMRF follows OMRF correctly. +- **Edge-order shuffling (§1.2):** MixedMRF follows OMRF correctly. + +--- + +## Appendix: Structural Comparison Tables + +### A. BaseModel Override Implementation + +| Override | GGM | OMRF | MixedMRF | +|----------|-----|------|----------| +| `has_gradient()` | `false` | `true` | `true` | +| `has_adaptive_metropolis()` | `true` | `true` | `true` | +| `do_one_metropolis_step` | Off-diag → diag → edge sel | Pairwise → main | Main → muy → Kxx → Kyy → Kxy | +| `update_edge_indicators` | No-op (embedded) | Shuffled sweep | Three shuffled sweeps | +| `prepare_iteration` | No-op | Shuffle edges | Shuffle 3 edge vectors | +| `get_vectorized_parameters` | Upper-tri precision | Main + pairwise | mux + muy + Kxx + Kxy | +| `set_vectorized_parameters` | Not implemented | Full unpack + cache | Full unpack + cache | +| `init_metropolis_adaptation` | Store warmup count | Create 2 controllers | Store warmup count | +| `tune_proposal_sd` | No-op | Poll 2 controllers | No-op | +| `impute_missing` | Conditional Normal | Categorical probs | Categorical + Normal | +| `clone` | Copy constructor | Copy constructor | Copy constructor | + +### B. Member Variable Inventory + +| Category | GGM | OMRF | MixedMRF | +|----------|:---:|:----:|:--------:| +| Data members | 5 | 8 | 10 | +| Parameter members | 1 (precision) | 2 (main, pairwise) | 5 (mux, muy, Kxx, Kyy, Kxy) | +| Cache members | 3 (chol, inv_chol, cov) | 3 (residual, gradient, index) | 8 (chol, inv_chol, cov, logdet, Theta, cond_mean, gradient, index) | +| Prior members | 2 | 4 | 3 | +| Proposal SD members | 1 | 2 | 5 | +| Edge members | 3 | 3 | 3 | +| RNG + config | 2 | 4 | 3 | +| Workspace | 7 (rank-2 vectors) | 0 | 7 (rank-2 vectors, prefixed kyy_) | +| **Total** | ~23 | ~24 | ~44 | + +### C. Cholesky Infrastructure Sharing + +``` +src/math/cholesky_helpers.h ← Shared (get_log_det, compute_inv_submatrix_i) +src/models/ggm/cholupdate.h ← Should be src/math/cholupdate.h + ├── Used by GGMModel (precision_matrix_ updates) + └── Used by MixedMRFModel (Kyy_ updates) + +GGM reparameterization pattern (get_constants, constrained_diagonal): + ├── GGMModel::get_constants() + └── MixedMRFModel::get_kyy_constants() ← Adapted copy (same math) +``` diff --git a/dev/mixedmrf/implementation_plan.md b/dev/mixedmrf/implementation_plan.md index 76bcc8e7..d36b2d6a 100644 --- a/dev/mixedmrf/implementation_plan.md +++ b/dev/mixedmrf/implementation_plan.md @@ -317,8 +317,8 @@ add the new Rcpp export to `src/RcppExports.cpp`, `R/RcppExports.R`, and | **G** | Simulation and prediction | E | `simulate.bgms` and `predict.bgms` for mixed | ✅ | | **H** | Stochastic block model edge prior | G | SBM prior wired into mixed MRF | ✅ | | **I** | Missing data imputation | G | `na_action = "impute"` for mixed data | ✅ | -| **J** | Performance profiling | G | Benchmark report, hotspot fixes | -| **K** | Code deduplication audit | G | Shared helpers extracted, dead code removed | +| **J** | Performance profiling | G | Benchmark report, hotspot fixes | partial | +| **K** | Code deduplication audit | G | Shared helpers extracted, dead code removed | ✅ | | **L** | Model output R code inspection | G | Output format verified, bugs fixed | | **M** | Test suite cleanup and completion | G | 4 new test files, promoted dev tests, full T1–T30 coverage | | **N** | Alternative proposals for GGM edge updates | G | New proposal mechanisms for GGM edges | @@ -1583,12 +1583,24 @@ while the C++ function expected 21. | `src/RcppExports.cpp` | Regenerated | --- -## Phase J — Performance profiling +## Phase J — Performance profiling (partial) Profile the mixed MRF sampler to identify bottlenecks and verify that the rank-1 Cholesky optimizations (Phase B+) deliver the expected speedup over naive recomputation. +### Completed + +- `MY_LOG`/`MY_EXP` macros applied across GGM and OMRF models + (commit `cad3426`). +- Benchmark baseline saved (`dev/fixtures/benchmark_baseline.rds`); + rounds 1–3 saved. Optimization rounds 1–8 stashed (`stash@{0}`). + +### Remaining + +- Formal scaling-curve plots and profiling report not yet produced. +- Marginal vs conditional PL cost comparison not yet documented. + ### Scope 1. **Wall-clock benchmarks.** Time full `bgm()` runs at several @@ -1621,12 +1633,25 @@ expected speedup over naive recomputation. --- -## Phase K — Code deduplication audit +## Phase K — Code deduplication audit ✅ Review the mixed MRF implementation and the rest of the package for repeated code patterns that could be shared. The goal is to reduce maintenance burden without over-abstracting. +### Completed + +- **Part 1** (`676b49f`): Renamed all MixedMRF member variables to + match GGM/OMRF naming conventions (`mux_` → `main_effects_discrete_`, + `Kxx_` → `pairwise_effects_discrete_`, etc.). Replaced 6 `std::log` + calls with `MY_LOG` in `mixed_mrf_metropolis.cpp`. +- **Part 2** (`d58848b`): Moved `cholupdate.h`/`.cpp` from + `src/models/ggm/` to `src/math/`. Deduplicated R output-builder + code in `build_output.R` and `run_sampler.R`. +- **Part 3** (`b944cd4`): Documented overflow-guard bitwise break, + regenerated HMC fixtures, restored progress interval. +- Full audit in `dev/mixedmrf/deduplication_audit.md`. + ### Known candidates 1. **Matrix assembly pattern in `build_output.R`.** diff --git a/dev/mixedmrf/output_inspection.md b/dev/mixedmrf/output_inspection.md new file mode 100644 index 00000000..eead7306 --- /dev/null +++ b/dev/mixedmrf/output_inspection.md @@ -0,0 +1,360 @@ +# Phase L — Model Output R Code Inspection + +**Date:** 2026-03-09 +**Branch:** `ggm_mixed` +**Scope:** Audit of R code that assembles, summarises, and exposes +mixed MRF model output. Identifies bugs and inconsistencies. + +--- + +## L1. `build_output_mixed_mrf()` correctness + +### L1.1 Flat-to-matrix index mapping + +The C++ `get_storage_vectorized_parameters()` emits parameters in this +order: + +``` +[main_discrete | Kxx_ut | main_continuous | Kxy_rowmajor | Kyy_ut+diag] +``` + +The R function `compute_mixed_parameter_indices()` splits this into: + +- `main_idx`: discrete thresholds + continuous means + Kyy diagonal +- `pairwise_idx`: Kxx upper-tri + Kyy off-diagonal + Kxy + +The Kyy block in C++ is stored row-major upper-triangular including +diagonal (i.e., for `j >= i`). The R code iterates `for(i in 1:q) +for(j in i:q)` and separates diagonal from off-diagonal positions. + +**Finding: correct.** The R loop matches the C++ `for(i) for(j=i..q)` +ordering exactly. Diagonal and off-diagonal positions are correctly +identified and routed to `main_idx` and `pairwise_idx` respectively. + +### L1.2 Indicator ordering vs pairwise ordering + +C++ indicator vector: `[Gxx_ut | Gyy_ut | Gxy_rowmajor]` +R `pairwise_idx` order: `[Kxx_ut | Kyy_offdiag | Kxy]` + +**Finding: correct.** The indicator vector excludes diagonal entries +(Gyy has no diagonal — self-edges are not indicators). The pairwise +vector also excludes diagonal (Kyy diagonal is routed to main). Both +use the same traversal order within each block. The edge names +generated in `build_output_mixed_mrf` follow the same block order +(discrete-discrete, continuous-continuous, cross), so +`indicator_summary` rows align with `pairwise_summary` rows. + +### L1.3 NUTS diagnostic column naming + +`build_output_mixed_mrf` checks `s$update_method == "hybrid-nuts"`. +`build_output_bgm` checks `s$update_method == "nuts"`. +Both call the same `summarize_nuts_diagnostics()` function. + +**Finding: correct.** The `bgm_spec` pipeline remaps `"nuts"` to +`"hybrid-nuts"` for mixed MRF models (line 350–351 of `bgm_spec.R`), +so the string comparison works correctly in both builders. + +### L1.4 BC main effects in posterior mean + +For Blume-Capel discrete variables, `build_output_mixed_mrf` stores +alpha and beta in columns 1:2 of `pmm_disc`, with remaining columns +NA. This matches the OMRF behavior in `build_output_bgm`. + +**Finding: correct.** + +### L1.5 Pairwise symmetry and sign + +`fill_mixed_symmetric()` places each edge value symmetrically +(`mat[oi,oj] = mat[oj,oi] = value`), mapping from internal +discrete-first indices to original user column indices via +`disc_idx` and `cont_idx`. + +**Finding: correct.** Sign convention is inherited from C++: positive +values mean positive association, matching GGM/OMRF convention. + +### L1.6 SBM allocation names missing in raw_samples + +`build_output_mixed_mrf` calls `build_raw_samples_list(raw, +edge_selection, edge_prior, names_main, edge_names)` without the +`allocation_names` argument. When the SBM prior is active, the +allocations are stored in `$raw_samples$allocations`, but +`$raw_samples$parameter_names$allocations` is `NULL`. + +In contrast, `build_output_bgm` computes `alloc_names` and passes it. + +**Verdict: BUG (minor).** The allocation names are missing from the +raw samples list for mixed MRF models with SBM prior. Fix: pass +`allocation_names = all_internal_names` (the `c(disc_names, +cont_names)` vector already computed on line 586). + +**Priority:** Low — only affects users who directly access +`$raw_samples$parameter_names$allocations` with an SBM prior on +mixed data. + +--- + +## L2. Posterior mean type inconsistency + +| Model | `$posterior_mean_main` type | +|-------|----------------------------| +| GGM | numeric matrix (p × 1, column = "mean") | +| OMRF | numeric matrix (p × max_cats) | +| Mixed MRF | **list** with `$discrete` (p × max_cats) and `$continuous` (q × 2) | + +**Verdict: INCONSISTENCY (moderate).** This is the most significant +structural difference in the output. Any user code that does +`fit$posterior_mean_main[1, 2]` will fail on a mixed MRF fit because +the list does not support matrix indexing. + +The list structure is arguably the correct design — discrete thresholds +and continuous means/precisions are different quantities that belong +in separate matrices. But it breaks the assumption that +`$posterior_mean_main` is always a matrix. + +**Recommendation:** Keep the list structure for mixed MRF. Document it +clearly in `?bgm` and in `coef.bgms()`. The alternative — flattening +into one matrix with mixed row semantics — would be worse for users. + +--- + +## L3. `coef.bgms()` with mixed MRF + +```r +coef.bgms = function(object, ...) { + out = list(main = object$posterior_mean_main, ...) +} +``` + +For mixed MRF, `out$main` is a list (with `$discrete` and +`$continuous`), yielding a nested list: `coef(fit)$main$discrete`. +For GGM/OMRF, `coef(fit)$main` is a matrix. + +**Verdict: INCONSISTENCY (moderate).** The return type of +`coef()$main` depends on the model type. This is not documented. + +**Recommendation:** Accept this inconsistency but document it: +- For GGM: matrix (p × 1) +- For OMRF: matrix (p × max_cats) +- For mixed MRF: list with `$discrete` (matrix) and `$continuous` + (matrix) + +The `@return` block of `coef.bgms` currently says "Posterior mean of +the category threshold parameters" — incorrect for mixed MRF. + +--- + +## L4. `extract_category_thresholds()` — BROKEN for mixed MRF + +```r +extract_category_thresholds.bgms = function(bgms_object) { + vec = bgms_object$posterior_summary_main[, "mean"] + num_vars = arguments$num_variables # = p + q + num_cats = arguments$num_categories # length p (discrete only) + ... + for(v in seq_len(num_vars)) { + num_cats[v] # ERROR: index out of bounds when v > p + } +} +``` + +**Verdict: BUG (crash).** For mixed MRF, `num_variables = p + q`, but +`num_categories` has length `p`. When the loop reaches `v = p + 1`, +`num_cats[v]` is an out-of-bounds access. The function will error. + +Additionally, even if the bounds were fixed, the `vec` from +`posterior_summary_main` for mixed MRF interleaves discrete thresholds +with continuous mean/precision entries. The positional extraction logic +(`pos = pos + k` vs `pos = pos + 2`) would misalign because it does +not know that continuous-variable rows have a different meaning. + +**Fix required:** Either: +1. Guard: `if(isTRUE(arguments$is_mixed))` and extract only discrete + thresholds using `arguments$num_discrete` and `arguments$is_ordinal`. +2. Or: extract from `object$posterior_mean_main$discrete` directly. + +--- + +## L5. `extract_pairwise_interactions()` — WRONG COLUMN NAMES for mixed MRF + +```r +extract_pairwise_interactions.bgms = function(bgms_object) { + mats = bgms_object$raw_samples$pairwise + mat = do.call(rbind, mats) + edge_names = character() + for(i in 1:(num_vars - 1)) { + for(j in (i + 1):num_vars) { + edge_names = c(edge_names, paste0(var_names[i], "-", var_names[j])) + } + } + dimnames(mat) = list(..., edge_names) +} +``` + +**Verdict: BUG (silent wrong labels).** The function generates edge +names in standard upper-triangle order of the (p+q) × (p+q) matrix, +using user column order. But for mixed MRF, `raw_samples$pairwise` +columns are in block order: [Kxx_ut | Kyy_offdiag | Kxy]. These two +orderings are NOT the same when discrete and continuous variables are +interleaved in the original data. + +Example: data with columns `[x1, y1, x2, y2]` (disc, cont, disc, cont). +- Standard upper-tri: (x1,y1), (x1,x2), (x1,y2), (y1,x2), (y1,y2), (x2,y2) +- Mixed block order: (x1,x2), (y1,y2), (x1,y1), (x1,y2), (x2,y1), (x2,y2) + +The edge count is the same (6), but the assignment is scrambled. + +Note: `raw_samples$parameter_names$pairwise` already contains the +correct edge names — the extractor should use those instead of +generating its own. + +**Fix required:** Use `bgms_object$raw_samples$parameter_names$pairwise` +for mixed MRF models instead of regenerating edge names. + +--- + +## L6. `extract_indicators()` — SAME BUG as L5 + +`extract_indicators.bgms` also generates its own column names via +the `parameter_names$indicator` stored in raw_samples — wait, it +actually *does* use `bgms_object$raw_samples$parameter_names$indicator`: + +```r +param_names = bgms_object$raw_samples$parameter_names$indicator +colnames(indicator_samples) = param_names +``` + +**Finding: correct.** Unlike `extract_pairwise_interactions`, the +indicator extractor uses stored names. No bug here. + +--- + +## L7. `simulate.bgms()` with mixed MRF + +The `simulate_bgms_mixed` helper: +1. Extracts parameters from `posterior_mean_main$discrete` / + `$continuous` and `posterior_mean_pairwise`. +2. Calls `sample_mixed_mrf_gibbs()` (C++). +3. `combine_mixed_result()` scatters x/y columns into original order + using `disc_idx` and `cont_idx`. + +**Finding: correct.** The `nsim` parameter is properly forwarded. The +`combine_mixed_result` helper uses `disc_idx` / `cont_idx` from +`arguments`, which are set by `build_arguments_mixed_mrf`. Column +reordering is correct. `drop = FALSE` protects against single-variable +edge cases. + +--- + +## L8. `predict.bgms()` with mixed MRF + +The `predict_bgms_mixed` helper: +1. Splits `newdata` by `disc_idx` / `cont_idx`. +2. Maps `predict_vars` to internal 0-based indices via `match()`. +3. Calls C++ `compute_conditional_mixed`. +4. Formats output with variable-type-aware labels. + +**Finding: correct.** Both discrete and continuous conditioned +variables are supported. Column matching is positional (same as +GGM/OMRF), which is correct given users provide data in the same +column order as training data. + +Minor note: no column-name validation is performed — if `newdata` has +different column names or order from training data, results will be +silently wrong. This is consistent with GGM/OMRF behavior so it is +not a mixed-MRF-specific issue. + +--- + +## L9. NUTS diagnostic wiring + +`build_output_mixed_mrf` checks for `"hybrid-nuts"`; +`build_output_bgm` checks for `"nuts"`. Both funnel to the same +`summarize_nuts_diagnostics()`. + +The `bgm_spec` pipeline maps `"nuts"` → `"hybrid-nuts"` for mixed +MRF at spec-build time. + +**Finding: correct.** No model-type-specific behavior is needed in +the diagnostics function itself. + +--- + +## L10. `summary.bgms()` and `print.summary.bgms()` + +`summary.bgms()` blindly returns `$posterior_summary_main` and +`$posterior_summary_pairwise` — this works for all model types. + +`print.summary.bgms()` labels the main block as +**"Category thresholds:"** unconditionally. + +**Verdict: MISLEADING LABEL (minor).** For mixed MRF, the main +summary includes rows like `"V4 (mean)"` and `"V4 (precision)"` under +the label "Category thresholds:", which is incorrect. For GGM, the +main effects are means (also mislabeled as thresholds). + +**Recommendation:** Change the label to context-appropriate text: +- GGM: "Variable means:" +- OMRF: "Category thresholds:" +- Mixed MRF: "Main effects:" (covers both threshold and mean params) + +This requires `print.summary.bgms` to read the model type from the +fit object, which it currently does not do. A lightweight fix: store +`model_type` in `$arguments` and read it in the print method. + +--- + +## L11. `print.bgms()` + +Prints "Bayesian Estimation" or "Bayesian Edge Selection" with no +indication of model type (GGM vs OMRF vs mixed MRF). + +**Verdict: COSMETIC (low priority).** Adding a model-type line +(e.g., "Model: Mixed MRF (3 ordinal, 2 continuous)") would help +users confirm they're looking at the right fit. + +--- + +## Summary of findings + +### Bugs (must fix) + +| # | Severity | Location | Issue | +|:-:|:--------:|----------|-------| +| B1 | **Crash** | `extract_category_thresholds.bgms` | Out-of-bounds on `num_categories` for mixed MRF (p+q > p) | +| B2 | **Wrong results** | `extract_pairwise_interactions.bgms` | Edge names in standard upper-tri order; mixed MRF samples in block order | +| B3 | **Minor** | `build_output_mixed_mrf` | SBM allocation names missing from `$raw_samples$parameter_names$allocations` | + +### Inconsistencies (should fix for release) + +| # | Severity | Location | Issue | +|:-:|:--------:|----------|-------| +| I1 | Moderate | `coef.bgms` | `$main` is list for mixed, matrix for others; undocumented | +| I2 | Minor | `print.summary.bgms` | "Category thresholds:" label incorrect for mixed and GGM | +| I3 | Minor | `print.bgms` | No model-type indication | +| I4 | Minor | `coef.bgms` roxygen | `@return` describes only threshold params | + +### Correct (no action needed) + +| # | Component | Notes | +|:-:|-----------|-------| +| OK1 | `build_output_mixed_mrf` index mapping | C++/R ordering matches exactly | +| OK2 | `fill_mixed_symmetric` | Block traversal and index scattering correct | +| OK3 | Indicator ordering | Matches pairwise block ordering | +| OK4 | `simulate.bgms` for mixed | Column reordering correct | +| OK5 | `predict.bgms` for mixed | Type-aware dispatch and formatting correct | +| OK6 | NUTS diagnostic wiring | `"hybrid-nuts"` string handled correctly | +| OK7 | `extract_indicators` | Uses stored parameter names (not regenerated) | +| OK8 | `extract_ess` | Reads from summary tables with row names; model-agnostic | +| OK9 | `summary.bgms` | Correct; label issue is in print method only | + +--- + +## Recommended fix order + +1. **B1** — `extract_category_thresholds`: guard for mixed MRF. +2. **B2** — `extract_pairwise_interactions`: use stored parameter + names for mixed MRF. +3. **B3** — `build_output_mixed_mrf`: pass `allocation_names`. +4. **I1/I4** — Document `coef.bgms` return type for mixed MRF. +5. **I2** — Improve `print.summary.bgms` label. +6. **I3** — Add model type to `print.bgms`. diff --git a/dev/test_step_size.R b/dev/test_step_size.R new file mode 100644 index 00000000..1fdb077a --- /dev/null +++ b/dev/test_step_size.R @@ -0,0 +1,35 @@ +devtools::load_all() + +set.seed(42) +n = 500L +x = matrix(sample(0:1, n * 2, replace = TRUE), n, 2) +y = matrix(rnorm(n * 2), n, 2) + +input_list = list( + discrete_observations = x, + continuous_observations = y, + num_categories = as.integer(c(1, 1)), + is_ordinal_variable = as.integer(c(1, 1)), + baseline_category = as.integer(c(0, 0)), + main_alpha = 0.5, + main_beta = 0.5, + pairwise_scale = 2.5, + pseudolikelihood = "full" +) + +# p=2 binary: mux=2, Kxx=1, muy=2, Kxy=4 => dim=9 +theta0 = rep(0, 9) + +cat("--- Gradient test ---\n") +r = test_mixed_gradient(input_list, theta0) +cat("logp:", r$logp, "\n") +cat("grad length:", length(r$gradient), "\n") +cat("grad:", round(r$gradient, 2), "\n") +cat("grad norm:", round(sqrt(sum(r$gradient^2)), 2), "\n") + +cat("\n--- Step-size heuristic ---\n") +r2 = test_mixed_step_size(input_list, theta0) +cat("Step size:", r2$step_size, "\n") +cat("Elapsed ms:", r2$elapsed_ms, "\n") +cat("logp at theta:", r2$logp_at_theta, "\n") +cat("Grad norm:", round(r2$grad_norm, 2), "\n") diff --git a/dev/tests/compare_bgms_mixedgm_cycle.R b/dev/tests/compare_bgms_mixedgm_cycle.R new file mode 100644 index 00000000..f8ee72b3 --- /dev/null +++ b/dev/tests/compare_bgms_mixedgm_cycle.R @@ -0,0 +1,213 @@ +# ============================================================================== +# Compare bgms vs mixedGM marginal PL cycle test +# ============================================================================== +# Uses Boredom data (8 items: 4 ordinal + 4 continuous). +# Fits marginal PL with both packages, simulates, refits, compares main effects. +# ============================================================================== + +devtools::load_all(quiet = TRUE) # bgms +library(mixedGM) + +data("Boredom", package = "bgms") +raw = as.matrix(Boredom[, 2:9]) +raw = raw - 1L # shift 1-7 to 0-6 +colnames(raw) = names(Boredom)[2:9] +n_obs = nrow(raw) + +# Assign variable types: alternating ordinal / continuous +ord_idx = c(1, 3, 5, 7) +cont_idx = c(2, 4, 6, 8) + +x_disc = raw[, ord_idx, drop = FALSE] # n x 4 integer ordinal (0-6) +y_cont = raw[, cont_idx, drop = FALSE] # n x 4 integer-valued, treated as continuous +storage.mode(y_cont) = "double" + +num_cats_disc = apply(x_disc, 2, max) + 1L # total categories (mixedGM convention) +p = ncol(x_disc) +q = ncol(y_cont) +seed = 44321 + +cat(sprintf("p = %d ordinal, q = %d continuous, n = %d\n", p, q, n_obs)) +cat("num_categories (max index):", num_cats_disc, "\n\n") + +# ============================================================================== +# mixedGM marginal PL cycle +# ============================================================================== +cat("=== mixedGM: marginal PL ===\n") +set.seed(seed) +fit_mg = mixed_sampler(x = x_disc, y = y_cont, + num_categories = num_cats_disc, + pseudolikelihood = "marginal", + log_prior_mean = mixedGM:::log_prior_logistic, + edge_selection = FALSE, + n_warmup = 5000, n_samples = 5000, + verbose = FALSE) + +mux_orig_mg = apply(fit_mg$samples$mux, c(2, 3), mean) +muy_orig_mg = colMeans(fit_mg$samples$muy) +Kxx_orig_mg = apply(fit_mg$samples$Kxx, c(2, 3), mean) +Kyy_orig_mg = apply(fit_mg$samples$Kyy, c(2, 3), mean) +Kxy_orig_mg = apply(fit_mg$samples$Kxy, c(2, 3), mean) + +cat("Original mux:\n"); print(round(mux_orig_mg, 3)) +cat("Original muy:", round(muy_orig_mg, 3), "\n\n") + +# Simulate from posterior means +sim_mg = mixed_gibbs_generate( + n = n_obs, + Kxx = Kxx_orig_mg, Kxy = Kxy_orig_mg, Kyy = Kyy_orig_mg, + mux = mux_orig_mg, muy = muy_orig_mg, + num_categories = num_cats_disc, + n_burnin = 1000 +) + +# Refit +set.seed(seed) +refit_mg = mixed_sampler(x = sim_mg$x, y = sim_mg$y, + num_categories = num_cats_disc, + pseudolikelihood = "marginal", + log_prior_mean = mixedGM:::log_prior_logistic, + edge_selection = FALSE, + n_warmup = 5000, n_samples = 5000, + verbose = FALSE) + +mux_refit_mg = apply(refit_mg$samples$mux, c(2, 3), mean) +muy_refit_mg = colMeans(refit_mg$samples$muy) + +cat("Refit mux:\n"); print(round(mux_refit_mg, 3)) +cat("Refit muy:", round(muy_refit_mg, 3), "\n\n") + +# Flat comparison +orig_flat_mg = c(as.vector(t(mux_orig_mg)), muy_orig_mg) +refit_flat_mg = c(as.vector(t(mux_refit_mg)), muy_refit_mg) +keep_mg = !is.na(orig_flat_mg) & !is.na(refit_flat_mg) + +cat("=== mixedGM main-effect comparison ===\n") +df_mg = data.frame(original = round(orig_flat_mg[keep_mg], 3), + refit = round(refit_flat_mg[keep_mg], 3), + diff = round(refit_flat_mg[keep_mg] - orig_flat_mg[keep_mg], 3)) +print(df_mg) +cat("Correlation:", round(cor(orig_flat_mg[keep_mg], refit_flat_mg[keep_mg]), 3), "\n") +cat("Max |diff|:", round(max(abs(df_mg$diff)), 3), "\n\n") + +# ============================================================================== +# bgms marginal PL cycle (for comparison) +# ============================================================================== +cat("=== bgms: marginal PL ===\n") +vtype = c("ordinal", "continuous", "ordinal", "continuous", + "ordinal", "continuous", "ordinal", "continuous") + +fit_bg = bgm(raw, variable_type = vtype, pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 5000, warmup = 5000, chains = 1, + display_progress = "none") + +set.seed(seed) +sim_bg = simulate(fit_bg, nsim = n_obs, method = "posterior-mean", seed = seed) + +refit_bg = bgm(sim_bg, variable_type = vtype, pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 5000, warmup = 5000, chains = 1, + display_progress = "none") + +extract_main_flat = function(fit) { + pm = fit$posterior_mean_main + c(as.vector(t(pm$discrete)), as.vector(t(pm$continuous))) +} +orig_flat_bg = extract_main_flat(fit_bg) +refit_flat_bg = extract_main_flat(refit_bg) +keep_bg = !is.na(orig_flat_bg) & !is.na(refit_flat_bg) + +cat("=== bgms main-effect comparison ===\n") +df_bg = data.frame(original = round(orig_flat_bg[keep_bg], 3), + refit = round(refit_flat_bg[keep_bg], 3), + diff = round(refit_flat_bg[keep_bg] - orig_flat_bg[keep_bg], 3)) +print(df_bg) +cat("Correlation:", round(cor(orig_flat_bg[keep_bg], refit_flat_bg[keep_bg]), 3), "\n") +cat("Max |diff|:", round(max(abs(df_bg$diff)), 3), "\n\n") + +# ============================================================================== +# Also compare original estimates between bgms and mixedGM +# ============================================================================== +cat("=== Original estimates: bgms vs mixedGM ===\n") +cat("mux comparison (bgms discrete thresholds vs mixedGM mux):\n") +bgms_mux = fit_bg$posterior_mean_main$discrete +cat("bgms:\n"); print(round(bgms_mux, 3)) +cat("mixedGM:\n"); print(round(mux_orig_mg, 3)) +cat("Max |diff|:", round(max(abs(bgms_mux[!is.na(bgms_mux)] - mux_orig_mg[!is.na(mux_orig_mg)])), 3), "\n\n") + +cat("muy comparison:\n") +bgms_muy = fit_bg$posterior_mean_main$continuous[, "mean"] +cat("bgms:", round(bgms_muy, 3), "\n") +cat("mixedGM:", round(muy_orig_mg, 3), "\n") +cat("Max |diff|:", round(max(abs(bgms_muy - muy_orig_mg)), 3), "\n") + +# ============================================================================== +# Scatterplots: 2x2 grid (mixedGM / bgms) x (pairwise / main) +# ============================================================================== +# Also extract pairwise from mixedGM +Kxx_refit_mg = apply(refit_mg$samples$Kxx, c(2, 3), mean) +Kyy_refit_mg = apply(refit_mg$samples$Kyy, c(2, 3), mean) +Kxy_refit_mg = apply(refit_mg$samples$Kxy, c(2, 3), mean) + +# Flatten upper-tri pairwise for mixedGM +flatten_pw_mg = function(Kxx, Kyy, Kxy) { + c(Kxx[upper.tri(Kxx)], Kyy[upper.tri(Kyy)], as.vector(Kxy)) +} +orig_pw_mg = flatten_pw_mg(Kxx_orig_mg, Kyy_orig_mg, Kxy_orig_mg) +refit_pw_mg = flatten_pw_mg(Kxx_refit_mg, Kyy_refit_mg, Kxy_refit_mg) + +# bgms pairwise +orig_pw_bg = colMeans(extract_pairwise_interactions(fit_bg)) +refit_pw_bg = colMeans(extract_pairwise_interactions(refit_bg)) + +cor_pw_mg = cor(orig_pw_mg, refit_pw_mg) +cor_pw_bg = cor(orig_pw_bg, refit_pw_bg) +cor_main_mg = cor(orig_flat_mg[keep_mg], refit_flat_mg[keep_mg]) +cor_main_bg = cor(orig_flat_bg[keep_bg], refit_flat_bg[keep_bg]) + +out_file = file.path("dev", "tests", "cycle_scatterplots.pdf") +pdf(out_file, width = 10, height = 10) +par(mfrow = c(2, 2), mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: pairwise +rng_pw = range(c(orig_pw_mg, refit_pw_mg, orig_pw_bg, refit_pw_bg)) + +plot(orig_pw_mg, refit_pw_mg, + xlab = "Original pairwise estimates", + ylab = "Refit pairwise estimates", + main = sprintf("mixedGM marginal PL - pairwise (r = %.3f)", cor_pw_mg), + pch = 19, col = adjustcolor("firebrick", 0.7), + xlim = rng_pw, ylim = rng_pw, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +plot(orig_pw_bg, refit_pw_bg, + xlab = "Original pairwise estimates", + ylab = "Refit pairwise estimates", + main = sprintf("bgms marginal PL - pairwise (r = %.3f)", cor_pw_bg), + pch = 19, col = adjustcolor("steelblue", 0.7), + xlim = rng_pw, ylim = rng_pw, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +# Row 2: main effects +rng_main = range(c(orig_flat_mg[keep_mg], refit_flat_mg[keep_mg], + orig_flat_bg[keep_bg], refit_flat_bg[keep_bg])) + +plot(orig_flat_mg[keep_mg], refit_flat_mg[keep_mg], + xlab = "Original main-effect estimates", + ylab = "Refit main-effect estimates", + main = sprintf("mixedGM marginal PL - main (r = %.3f)", cor_main_mg), + pch = 19, col = adjustcolor("firebrick", 0.7), + xlim = rng_main, ylim = rng_main, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +plot(orig_flat_bg[keep_bg], refit_flat_bg[keep_bg], + xlab = "Original main-effect estimates", + ylab = "Refit main-effect estimates", + main = sprintf("bgms marginal PL - main (r = %.3f)", cor_main_bg), + pch = 19, col = adjustcolor("steelblue", 0.7), + xlim = rng_main, ylim = rng_main, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +dev.off() +cat(sprintf("\nSaved to %s\n", out_file)) diff --git a/dev/tests/cycle_scatterplots.pdf b/dev/tests/cycle_scatterplots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e78d5ebd8d192825462fad292a13437337d9ebcb GIT binary patch literal 13023 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 N@_iOMX(bt~{{!aJ(DVQR literal 0 HcmV?d00001 diff --git a/dev/tests/debug_main_effects.R b/dev/tests/debug_main_effects.R new file mode 100644 index 00000000..ab32e2ee --- /dev/null +++ b/dev/tests/debug_main_effects.R @@ -0,0 +1,74 @@ +devtools::load_all(quiet = TRUE) + +data("Boredom", package = "bgms") +x = as.matrix(Boredom[, 2:9]) +x = x - 1L +colnames(x) = names(Boredom)[2:9] +n_obs = nrow(x) +vtype = c("ordinal", "continuous", "ordinal", "continuous", + "ordinal", "continuous", "ordinal", "continuous") +seed = 44321 + +extract_main_flat = function(fit) { + pm = fit$posterior_mean_main + c(as.vector(t(pm$discrete)), as.vector(t(pm$continuous))) +} + +# --- Marginal PL --- +cat("Fitting marginal PL...\n") +fit_marg = bgm(x, variable_type = vtype, pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +cat("=== Original marginal PL main effects ===\n") +cat("Discrete:\n"); print(round(fit_marg$posterior_mean_main$discrete, 3)) +cat("Continuous:\n"); print(round(fit_marg$posterior_mean_main$continuous, 3)) + +set.seed(seed) +sim_marg = simulate(fit_marg, nsim = n_obs, method = "posterior-mean", seed = seed) + +cat("\nRefitting on simulated data...\n") +refit_marg = bgm(sim_marg, variable_type = vtype, pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +cat("=== Refit marginal PL main effects ===\n") +cat("Discrete:\n"); print(round(refit_marg$posterior_mean_main$discrete, 3)) +cat("Continuous:\n"); print(round(refit_marg$posterior_mean_main$continuous, 3)) + +o = extract_main_flat(fit_marg) +r = extract_main_flat(refit_marg) +keep = !is.na(o) & !is.na(r) +cat("\n=== Flat comparison (non-NA) ===\n") +df = data.frame(original = round(o[keep], 3), refit = round(r[keep], 3), + diff = round(r[keep] - o[keep], 3)) +print(df) +cat("\nCorrelation:", round(cor(o[keep], r[keep]), 3), "\n") +cat("Original range:", round(range(o[keep]), 3), "\n") +cat("Refit range: ", round(range(r[keep]), 3), "\n") + +# --- Also compare with conditional PL for reference --- +cat("\n\n--- Conditional PL for comparison ---\n") +fit_cond = bgm(x, variable_type = vtype, pseudolikelihood = "conditional", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +set.seed(seed) +sim_cond = simulate(fit_cond, nsim = n_obs, method = "posterior-mean", seed = seed) + +refit_cond = bgm(sim_cond, variable_type = vtype, pseudolikelihood = "conditional", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +oc = extract_main_flat(fit_cond) +rc = extract_main_flat(refit_cond) +keepc = !is.na(oc) & !is.na(rc) +cat("\n=== Conditional PL flat comparison (non-NA) ===\n") +dfc = data.frame(original = round(oc[keepc], 3), refit = round(rc[keepc], 3), + diff = round(rc[keepc] - oc[keepc], 3)) +print(dfc) +cat("\nCorrelation:", round(cor(oc[keepc], rc[keepc]), 3), "\n") diff --git a/dev/tests/easybgm/test_easybgm_bgms_interaction.R b/dev/tests/easybgm/test_easybgm_bgms_interaction.R new file mode 100644 index 00000000..e69de29b diff --git a/dev/tests/plot_cycle_scatterplots.R b/dev/tests/plot_cycle_scatterplots.R new file mode 100644 index 00000000..26381c9f --- /dev/null +++ b/dev/tests/plot_cycle_scatterplots.R @@ -0,0 +1,139 @@ +# ============================================================================== +# Scatterplots for mixed MRF simulation-recovery cycle tests +# ============================================================================== +# Fits mixed MRF with conditional and marginal PL on the full Boredom data +# (8 items, 4 ordinal + 4 continuous), simulates from each fit, refits on +# simulated data, and plots original vs refit estimates for both pairwise +# interactions and main effects. +# ============================================================================== + +devtools::load_all(quiet = TRUE) + +data("Boredom", package = "bgms") +x = as.matrix(Boredom[, 2:9]) +x = x - 1L +colnames(x) = names(Boredom)[2:9] +n_obs = nrow(x) +vtype = c("ordinal", "continuous", "ordinal", "continuous", + "ordinal", "continuous", "ordinal", "continuous") +seed = 44321 + +# Helper: extract a flat main-effects vector from a mixed fit +extract_main_flat = function(fit) { + pm = fit$posterior_mean_main + c(as.vector(t(pm$discrete)), # discrete thresholds (row-major) + as.vector(t(pm$continuous))) # continuous mean + precision (row-major) +} + +# ============================================================================== +# Conditional PL +# ============================================================================== +cat("Fitting conditional PL...\n") +fit_cond = bgm(x, variable_type = vtype, pseudolikelihood = "conditional", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +orig_pw_cond = colMeans(extract_pairwise_interactions(fit_cond)) +orig_main_cond = extract_main_flat(fit_cond) + +cat("Simulating from conditional PL fit...\n") +set.seed(seed) +sim_cond = simulate(fit_cond, nsim = n_obs, method = "posterior-mean", + seed = seed) + +cat("Refitting on conditional PL simulated data...\n") +refit_cond = bgm(sim_cond, variable_type = vtype, + pseudolikelihood = "conditional", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +refit_pw_cond = colMeans(extract_pairwise_interactions(refit_cond)) +refit_main_cond = extract_main_flat(refit_cond) +cor_pw_cond = cor(orig_pw_cond, refit_pw_cond) +cor_main_cond = cor(orig_main_cond, refit_main_cond, use = "complete.obs") +cat(sprintf("Conditional PL — pairwise r = %.3f, main r = %.3f\n", + cor_pw_cond, cor_main_cond)) + +# ============================================================================== +# Marginal PL +# ============================================================================== +cat("Fitting marginal PL...\n") +fit_marg = bgm(x, variable_type = vtype, pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +orig_pw_marg = colMeans(extract_pairwise_interactions(fit_marg)) +orig_main_marg = extract_main_flat(fit_marg) + +cat("Simulating from marginal PL fit...\n") +set.seed(seed) +sim_marg = simulate(fit_marg, nsim = n_obs, method = "posterior-mean", + seed = seed) + +cat("Refitting on marginal PL simulated data...\n") +refit_marg = bgm(sim_marg, variable_type = vtype, + pseudolikelihood = "marginal", + edge_selection = FALSE, seed = seed, + iter = 1000, warmup = 1000, chains = 1, + display_progress = "none") + +refit_pw_marg = colMeans(extract_pairwise_interactions(refit_marg)) +refit_main_marg = extract_main_flat(refit_marg) +cor_pw_marg = cor(orig_pw_marg, refit_pw_marg) +cor_main_marg = cor(orig_main_marg, refit_main_marg, use = "complete.obs") +cat(sprintf("Marginal PL — pairwise r = %.3f, main r = %.3f\n", + cor_pw_marg, cor_main_marg)) + +# ============================================================================== +# Plot: 2 x 2 grid (pairwise / main) x (conditional / marginal) +# ============================================================================== +out_file = file.path("dev", "tests", "cycle_scatterplots.pdf") +pdf(out_file, width = 10, height = 10) +par(mfrow = c(2, 2), mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: pairwise +rng_pw = range(c(orig_pw_cond, refit_pw_cond, orig_pw_marg, refit_pw_marg)) + +plot(orig_pw_cond, refit_pw_cond, + xlab = "Original pairwise estimates", + ylab = "Refit pairwise estimates", + main = sprintf("Conditional PL — pairwise (r = %.3f)", cor_pw_cond), + pch = 19, col = adjustcolor("steelblue", 0.7), + xlim = rng_pw, ylim = rng_pw, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +plot(orig_pw_marg, refit_pw_marg, + xlab = "Original pairwise estimates", + ylab = "Refit pairwise estimates", + main = sprintf("Marginal PL — pairwise (r = %.3f)", cor_pw_marg), + pch = 19, col = adjustcolor("firebrick", 0.7), + xlim = rng_pw, ylim = rng_pw, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +# Row 2: main effects (drop NAs from padding) +keep_cond = !is.na(orig_main_cond) & !is.na(refit_main_cond) +keep_marg = !is.na(orig_main_marg) & !is.na(refit_main_marg) +rng_main = range(c(orig_main_cond[keep_cond], refit_main_cond[keep_cond], + orig_main_marg[keep_marg], refit_main_marg[keep_marg])) + +plot(orig_main_cond[keep_cond], refit_main_cond[keep_cond], + xlab = "Original main-effect estimates", + ylab = "Refit main-effect estimates", + main = sprintf("Conditional PL — main (r = %.3f)", cor_main_cond), + pch = 19, col = adjustcolor("steelblue", 0.7), + xlim = rng_main, ylim = rng_main, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +plot(orig_main_marg[keep_marg], refit_main_marg[keep_marg], + xlab = "Original main-effect estimates", + ylab = "Refit main-effect estimates", + main = sprintf("Marginal PL — main (r = %.3f)", cor_main_marg), + pch = 19, col = adjustcolor("firebrick", 0.7), + xlim = rng_main, ylim = rng_main, asp = 1) +abline(0, 1, lty = 2, col = "grey40") + +dev.off() +cat(sprintf("Saved to %s\n", out_file)) diff --git a/dev/tests/validation/group1_parameter_recovery.R b/dev/tests/validation/group1_parameter_recovery.R new file mode 100644 index 00000000..cd287c0e --- /dev/null +++ b/dev/tests/validation/group1_parameter_recovery.R @@ -0,0 +1,189 @@ +# =========================================================================== +# Group 1: Parameter recovery on known mixed-MRF networks +# =========================================================================== +# Simulate data from networks with known parameters, fit with bgms, and +# verify that posterior means recover the true values. Tests three network +# sizes (small, medium, large) and both PL methods. +# +# Output: numerical summary + PDF with recovery scatter plots. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 1: Parameter recovery on known networks\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# 1a. Small network: 2 ordinal + 2 continuous, dense +# ------------------------------------------------------------------ +cat("--- 1a: Small network (p=2, q=2) --------------------------------\n") +net_small = make_network(p = 2, q = 2, n_cat = c(1L, 2L), density = 1.0, seed = 101) +dat_small = generate_data(net_small, n = 2000, source = "bgms", seed = 201) + +true_small = list( + mux = net_small$mux, muy = net_small$muy, + Kxx = net_small$Kxx, Kxy = net_small$Kxy, Kyy = net_small$Kyy +) + +fit_small_cond = bgm( + dat_small, + variable_type = c(rep("ordinal", 2), rep("continuous", 2)), + pseudolikelihood = "conditional", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 301 +) + +fit_small_marg = bgm( + dat_small, + variable_type = c(rep("ordinal", 2), rep("continuous", 2)), + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 302 +) + +est_small_cond = extract_bgms_blocks(fit_small_cond, net_small) +est_small_marg = extract_bgms_blocks(fit_small_marg, net_small) + +tab_sc = recovery_table(true_small, est_small_cond, "conditional") +tab_sm = recovery_table(true_small, est_small_marg, "marginal") + +summarise_recovery(tab_sc, "Small conditional") +summarise_recovery(tab_sm, "Small marginal") + +# ------------------------------------------------------------------ +# 1b. Medium network: 4 ordinal + 3 continuous, sparse +# ------------------------------------------------------------------ +cat("\n--- 1b: Medium network (p=4, q=3) -------------------------------\n") +net_med = make_network(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), density = 0.4, seed = 102) +dat_med = generate_data(net_med, n = 3000, source = "bgms", seed = 202) + +true_med = list( + mux = net_med$mux, muy = net_med$muy, + Kxx = net_med$Kxx, Kxy = net_med$Kxy, Kyy = net_med$Kyy +) + +fit_med_cond = bgm( + dat_med, + variable_type = c(rep("ordinal", 4), rep("continuous", 3)), + pseudolikelihood = "conditional", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 303 +) + +fit_med_marg = bgm( + dat_med, + variable_type = c(rep("ordinal", 4), rep("continuous", 3)), + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 304 +) + +est_med_cond = extract_bgms_blocks(fit_med_cond, net_med) +est_med_marg = extract_bgms_blocks(fit_med_marg, net_med) + +tab_mc = recovery_table(true_med, est_med_cond, "conditional") +tab_mm = recovery_table(true_med, est_med_marg, "marginal") + +summarise_recovery(tab_mc, "Medium conditional") +summarise_recovery(tab_mm, "Medium marginal") + +# ------------------------------------------------------------------ +# 1c. Larger network: 6 ordinal + 4 continuous, moderate density +# ------------------------------------------------------------------ +cat("\n--- 1c: Larger network (p=6, q=4) -------------------------------\n") +net_large = make_network(p = 6, q = 4, n_cat = c(1L, 2L, 3L, 1L, 2L, 1L), + density = 0.3, seed = 103) +dat_large = generate_data(net_large, n = 5000, source = "bgms", seed = 203) + +true_large = list( + mux = net_large$mux, muy = net_large$muy, + Kxx = net_large$Kxx, Kxy = net_large$Kxy, Kyy = net_large$Kyy +) + +fit_large_marg = bgm( + dat_large, + variable_type = c(rep("ordinal", 6), rep("continuous", 4)), + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 305 +) + +est_large_marg = extract_bgms_blocks(fit_large_marg, net_large) +tab_lm = recovery_table(true_large, est_large_marg, "marginal") +summarise_recovery(tab_lm, "Large marginal") + +# ------------------------------------------------------------------ +# 1d. Mixed ordinal + Blume-Capel network: 4 discrete + 2 continuous +# ------------------------------------------------------------------ +cat("\n--- 1d: Mixed ordinal + BC (p=4, q=2) ---------------------------\n") +net_bc = make_network( + p = 4, q = 2, + n_cat = c(1L, 2L, 2L, 3L), + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel"), + baseline_category = c(0L, 0L, 1L, 1L), + density = 0.5, seed = 104 +) +dat_bc = generate_data(net_bc, n = 3000, source = "bgms", seed = 204) + +true_bc = list( + mux = net_bc$mux, muy = net_bc$muy, + Kxx = net_bc$Kxx, Kxy = net_bc$Kxy, Kyy = net_bc$Kyy +) + +fit_bc_marg = bgm( + dat_bc, + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel", + "continuous", "continuous"), + baseline_category = c(0L, 0L, 1L, 1L), + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 306 +) + +est_bc_marg = extract_bgms_blocks(fit_bc_marg, net_bc) +tab_bcm = recovery_table(true_bc, est_bc_marg, "marginal") +summarise_recovery(tab_bcm, "BC marginal") + +fit_bc_cond = bgm( + dat_bc, + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel", + "continuous", "continuous"), + baseline_category = c(0L, 0L, 1L, 1L), + pseudolikelihood = "conditional", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 307 +) + +est_bc_cond = extract_bgms_blocks(fit_bc_cond, net_bc) +tab_bcc = recovery_table(true_bc, est_bc_cond, "conditional") +summarise_recovery(tab_bcc, "BC conditional") + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group1_parameter_recovery.pdf"), width = 12, height = 10) +par(mfrow = c(2, 4)) +recovery_scatter(tab_sc, "Small conditional PL") +recovery_scatter(tab_sm, "Small marginal PL") +recovery_scatter(tab_mc, "Medium conditional PL") +recovery_scatter(tab_mm, "Medium marginal PL") +recovery_scatter(tab_lm, "Large marginal PL") +recovery_scatter(tab_bcm, "BC marginal PL") +recovery_scatter(tab_bcc, "BC conditional PL") +plot.new() # blank panel +dev.off() + +cat(sprintf("\nPlots saved to %s/group1_parameter_recovery.pdf\n", out_dir)) +cat("=== Group 1 complete =============================================\n\n") diff --git a/dev/tests/validation/group2_mh_vs_nuts.R b/dev/tests/validation/group2_mh_vs_nuts.R new file mode 100644 index 00000000..5b379c22 --- /dev/null +++ b/dev/tests/validation/group2_mh_vs_nuts.R @@ -0,0 +1,239 @@ +# =========================================================================== +# Group 2: Metropolis vs NUTS posterior agreement +# =========================================================================== +# Fit the same data with adaptive-metropolis and hybrid-NUTS. Compare +# posterior means; if both samplers target the same pseudo-posterior, +# estimates should agree closely. +# +# Output: numerical summary + PDF with agreement scatter plots. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 2: Metropolis vs NUTS posterior agreement\n") +cat("=======================================================================\n\n") + +# Use medium network from group 1 for consistency +net = make_network(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), density = 0.4, seed = 102) +dat = generate_data(net, n = 3000, source = "bgms", seed = 202) +vtype = c(rep("ordinal", 4), rep("continuous", 3)) + +true_blocks = list( + mux = net$mux, muy = net$muy, + Kxx = net$Kxx, Kxy = net$Kxy, Kyy = net$Kyy +) + +# ------------------------------------------------------------------ +# 2a. Conditional PL: Metropolis vs NUTS +# ------------------------------------------------------------------ +cat("--- 2a: Conditional PL — Metropolis vs NUTS ----------------------\n") + +fit_mh_cond = bgm( + dat, variable_type = vtype, + pseudolikelihood = "conditional", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 15000, warmup = 10000, chains = 2, + seed = 401 +) + +fit_nuts_cond = bgm( + dat, variable_type = vtype, + pseudolikelihood = "conditional", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 2, + seed = 402 +) + +est_mh_cond = extract_bgms_blocks(fit_mh_cond, net) +est_nuts_cond = extract_bgms_blocks(fit_nuts_cond, net) + +tab_mh_cond = recovery_table(true_blocks, est_mh_cond, "MH-conditional") +tab_nuts_cond = recovery_table(true_blocks, est_nuts_cond, "NUTS-conditional") + +cat(" Metropolis:\n") +summarise_recovery(tab_mh_cond, "MH cond") +cat(" NUTS:\n") +summarise_recovery(tab_nuts_cond, "NUTS cond") + +# Direct agreement +r_cond = cor(tab_mh_cond$estimate, tab_nuts_cond$estimate) +rmse_cond = sqrt(mean((tab_mh_cond$estimate - tab_nuts_cond$estimate)^2)) +cat(sprintf(" MH vs NUTS agreement: r = %.4f, RMSE = %.4f\n", r_cond, rmse_cond)) + +# ------------------------------------------------------------------ +# 2b. Marginal PL: Metropolis vs NUTS +# ------------------------------------------------------------------ +cat("\n--- 2b: Marginal PL — Metropolis vs NUTS -------------------------\n") + +fit_mh_marg = bgm( + dat, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 15000, warmup = 10000, chains = 2, + seed = 403 +) + +fit_nuts_marg = bgm( + dat, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 2, + seed = 404 +) + +est_mh_marg = extract_bgms_blocks(fit_mh_marg, net) +est_nuts_marg = extract_bgms_blocks(fit_nuts_marg, net) + +tab_mh_marg = recovery_table(true_blocks, est_mh_marg, "MH-marginal") +tab_nuts_marg = recovery_table(true_blocks, est_nuts_marg, "NUTS-marginal") + +cat(" Metropolis:\n") +summarise_recovery(tab_mh_marg, "MH marg") +cat(" NUTS:\n") +summarise_recovery(tab_nuts_marg, "NUTS marg") + +r_marg = cor(tab_mh_marg$estimate, tab_nuts_marg$estimate) +rmse_marg = sqrt(mean((tab_mh_marg$estimate - tab_nuts_marg$estimate)^2)) +cat(sprintf(" MH vs NUTS agreement: r = %.4f, RMSE = %.4f\n", r_marg, rmse_marg)) + +# ------------------------------------------------------------------ +# 2c. Mixed ordinal + Blume-Capel: Metropolis vs NUTS (marginal PL) +# ------------------------------------------------------------------ +cat("\n--- 2c: BC mixed — Metropolis vs NUTS (marginal PL) --------------\n") + +net_bc = make_network( + p = 4, q = 2, + n_cat = c(1L, 2L, 2L, 3L), + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel"), + baseline_category = c(0L, 0L, 1L, 1L), + density = 0.5, seed = 104 +) +dat_bc = generate_data(net_bc, n = 3000, source = "bgms", seed = 204) + +vtype_bc = c("ordinal", "ordinal", "blume-capel", "blume-capel", + "continuous", "continuous") +bl_bc = c(0L, 0L, 1L, 1L) + +true_bc = list(mux = net_bc$mux, muy = net_bc$muy, + Kxx = net_bc$Kxx, Kxy = net_bc$Kxy, Kyy = net_bc$Kyy) + +fit_mh_bc = bgm( + dat_bc, variable_type = vtype_bc, baseline_category = bl_bc, + pseudolikelihood = "marginal", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 15000, warmup = 10000, chains = 2, + seed = 405 +) + +fit_nuts_bc = bgm( + dat_bc, variable_type = vtype_bc, baseline_category = bl_bc, + pseudolikelihood = "marginal", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 2, + seed = 406 +) + +est_mh_bc = extract_bgms_blocks(fit_mh_bc, net_bc) +est_nuts_bc = extract_bgms_blocks(fit_nuts_bc, net_bc) + +tab_mh_bc = recovery_table(true_bc, est_mh_bc, "MH-bc") +tab_nuts_bc = recovery_table(true_bc, est_nuts_bc, "NUTS-bc") + +cat(" Metropolis:\n") +summarise_recovery(tab_mh_bc, "MH BC") +cat(" NUTS:\n") +summarise_recovery(tab_nuts_bc, "NUTS BC") + +r_bc = cor(tab_mh_bc$estimate, tab_nuts_bc$estimate) +rmse_bc = sqrt(mean((tab_mh_bc$estimate - tab_nuts_bc$estimate)^2)) +cat(sprintf(" MH vs NUTS agreement: r = %.4f, RMSE = %.4f\n", r_bc, rmse_bc)) + +# ------------------------------------------------------------------ +# 2d. Numerical summary table +# ------------------------------------------------------------------ +cat("\n--- 2d: Summary table ---------------------------------------------\n") +summary_df = data.frame( + comparison = c("conditional", "marginal", "BC-marginal"), + correlation = round(c(r_cond, r_marg, r_bc), 4), + rmse = round(c(rmse_cond, rmse_marg, rmse_bc), 4), + max_diff = round(c(max(abs(tab_mh_cond$estimate - tab_nuts_cond$estimate)), + max(abs(tab_mh_marg$estimate - tab_nuts_marg$estimate)), + max(abs(tab_mh_bc$estimate - tab_nuts_bc$estimate))), 4) +) +print(summary_df, row.names = FALSE) + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group2_mh_vs_nuts.pdf"), width = 14, height = 14) + +layout(matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: conditional PL +recovery_scatter(tab_mh_cond, "MH conditional: recovery") +recovery_scatter(tab_nuts_cond, "NUTS conditional: recovery") +agreement_scatter(tab_mh_cond, tab_nuts_cond, + "MH cond", "NUTS cond", + sprintf("MH vs NUTS conditional (r=%.3f)", r_cond)) + +# Row 2: marginal PL +recovery_scatter(tab_mh_marg, "MH marginal: recovery") +recovery_scatter(tab_nuts_marg, "NUTS marginal: recovery") +agreement_scatter(tab_mh_marg, tab_nuts_marg, + "MH marg", "NUTS marg", + sprintf("MH vs NUTS marginal (r=%.3f)", r_marg)) + +# Row 3: BC marginal PL +recovery_scatter(tab_mh_bc, "MH BC marginal: recovery") +recovery_scatter(tab_nuts_bc, "NUTS BC marginal: recovery") +agreement_scatter(tab_mh_bc, tab_nuts_bc, + "MH BC", "NUTS BC", + sprintf("MH vs NUTS BC marginal (r=%.3f)", r_bc)) + +dev.off() + +# --- Trace plot comparison for selected parameters --- +pdf(file.path(out_dir, "group2_traces.pdf"), width = 10, height = 14) + +# Extract raw samples (combine chains) +mh_cond_pw = do.call(rbind, fit_mh_cond$raw_samples$pairwise) +nuts_cond_pw = do.call(rbind, fit_nuts_cond$raw_samples$pairwise) +mh_marg_pw = do.call(rbind, fit_mh_marg$raw_samples$pairwise) +nuts_marg_pw = do.call(rbind, fit_nuts_marg$raw_samples$pairwise) + +# Assign column names +colnames(mh_cond_pw) = fit_mh_cond$raw_samples$parameter_names$pairwise +colnames(nuts_cond_pw) = fit_nuts_cond$raw_samples$parameter_names$pairwise +colnames(mh_marg_pw) = fit_mh_marg$raw_samples$parameter_names$pairwise +colnames(nuts_marg_pw) = fit_nuts_marg$raw_samples$parameter_names$pairwise + +# Pick first 4 pairwise params for trace comparison +sel_params = colnames(mh_cond_pw)[seq_len(min(4, ncol(mh_cond_pw)))] + +par(mfrow = c(length(sel_params), 2), mar = c(3, 3, 2, 1), mgp = c(2, 0.6, 0)) +for(nm in sel_params) { + # MH trace + plot(mh_cond_pw[, nm], type = "l", col = adjustcolor("steelblue", 0.4), + main = paste(nm, "— MH cond"), xlab = "Iteration", ylab = nm, cex.main = 0.9) + # NUTS trace + plot(nuts_cond_pw[, nm], type = "l", col = adjustcolor("firebrick", 0.4), + main = paste(nm, "— NUTS cond"), xlab = "Iteration", ylab = nm, cex.main = 0.9) +} + +dev.off() + +cat(sprintf("\nPlots saved to %s/group2_mh_vs_nuts.pdf\n", out_dir)) +cat(sprintf("Traces saved to %s/group2_traces.pdf\n", out_dir)) +cat("=== Group 2 complete =============================================\n\n") diff --git a/dev/tests/validation/group3_cond_vs_marg.R b/dev/tests/validation/group3_cond_vs_marg.R new file mode 100644 index 00000000..6fc4778a --- /dev/null +++ b/dev/tests/validation/group3_cond_vs_marg.R @@ -0,0 +1,219 @@ +# =========================================================================== +# Group 3: Conditional vs Marginal pseudo-likelihood agreement +# =========================================================================== +# Both PL methods target the same model; posterior means should converge +# to the same values with enough data. This test compares them on the +# same dataset and checks where they diverge, broken down by block. +# +# Output: numerical summary + PDF with agreement scatter and difference +# distributions. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 3: Conditional vs Marginal PL agreement\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# 3a. Small network (p=2, q=2) +# ------------------------------------------------------------------ +cat("--- 3a: Small network (p=2, q=2) ---------------------------------\n") +net_s = make_network(p = 2, q = 2, n_cat = c(1L, 2L), density = 1.0, seed = 101) +dat_s = generate_data(net_s, n = 2000, source = "bgms", seed = 201) +vtype_s = c(rep("ordinal", 2), rep("continuous", 2)) + +true_s = list(mux = net_s$mux, muy = net_s$muy, + Kxx = net_s$Kxx, Kxy = net_s$Kxy, Kyy = net_s$Kyy) + +fit_cond_s = bgm(dat_s, variable_type = vtype_s, + pseudolikelihood = "conditional", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 501) + +fit_marg_s = bgm(dat_s, variable_type = vtype_s, + pseudolikelihood = "marginal", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 502) + +est_cond_s = extract_bgms_blocks(fit_cond_s, net_s) +est_marg_s = extract_bgms_blocks(fit_marg_s, net_s) + +tab_cond_s = recovery_table(true_s, est_cond_s, "conditional") +tab_marg_s = recovery_table(true_s, est_marg_s, "marginal") + +summarise_recovery(tab_cond_s, "Small conditional") +summarise_recovery(tab_marg_s, "Small marginal") + +r_s = cor(tab_cond_s$estimate, tab_marg_s$estimate) +max_d_s = max(abs(tab_cond_s$estimate - tab_marg_s$estimate)) +cat(sprintf(" Cond vs Marg: r = %.4f, max|diff| = %.4f\n\n", r_s, max_d_s)) + +# ------------------------------------------------------------------ +# 3b. Medium network (p=4, q=3) +# ------------------------------------------------------------------ +cat("--- 3b: Medium network (p=4, q=3) --------------------------------\n") +net_m = make_network(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), density = 0.4, seed = 102) +dat_m = generate_data(net_m, n = 3000, source = "bgms", seed = 202) +vtype_m = c(rep("ordinal", 4), rep("continuous", 3)) + +true_m = list(mux = net_m$mux, muy = net_m$muy, + Kxx = net_m$Kxx, Kxy = net_m$Kxy, Kyy = net_m$Kyy) + +fit_cond_m = bgm(dat_m, variable_type = vtype_m, + pseudolikelihood = "conditional", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 503) + +fit_marg_m = bgm(dat_m, variable_type = vtype_m, + pseudolikelihood = "marginal", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 504) + +est_cond_m = extract_bgms_blocks(fit_cond_m, net_m) +est_marg_m = extract_bgms_blocks(fit_marg_m, net_m) + +tab_cond_m = recovery_table(true_m, est_cond_m, "conditional") +tab_marg_m = recovery_table(true_m, est_marg_m, "marginal") + +summarise_recovery(tab_cond_m, "Medium conditional") +summarise_recovery(tab_marg_m, "Medium marginal") + +r_m = cor(tab_cond_m$estimate, tab_marg_m$estimate) +max_d_m = max(abs(tab_cond_m$estimate - tab_marg_m$estimate)) +cat(sprintf(" Cond vs Marg: r = %.4f, max|diff| = %.4f\n\n", r_m, max_d_m)) + +# ------------------------------------------------------------------ +# 3c. Mixed ordinal + Blume-Capel (p=4, q=2) +# ------------------------------------------------------------------ +cat("--- 3c: Mixed ordinal + BC (p=4, q=2) ----------------------------\n") +net_bc = make_network( + p = 4, q = 2, + n_cat = c(1L, 2L, 2L, 3L), + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel"), + baseline_category = c(0L, 0L, 1L, 1L), + density = 0.5, seed = 104 +) +dat_bc = generate_data(net_bc, n = 3000, source = "bgms", seed = 204) + +vtype_bc = c("ordinal", "ordinal", "blume-capel", "blume-capel", + "continuous", "continuous") +bl_bc = c(0L, 0L, 1L, 1L) + +true_bc = list(mux = net_bc$mux, muy = net_bc$muy, + Kxx = net_bc$Kxx, Kxy = net_bc$Kxy, Kyy = net_bc$Kyy) + +fit_cond_bc = bgm(dat_bc, variable_type = vtype_bc, baseline_category = bl_bc, + pseudolikelihood = "conditional", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 505) + +fit_marg_bc = bgm(dat_bc, variable_type = vtype_bc, baseline_category = bl_bc, + pseudolikelihood = "marginal", edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 506) + +est_cond_bc = extract_bgms_blocks(fit_cond_bc, net_bc) +est_marg_bc = extract_bgms_blocks(fit_marg_bc, net_bc) + +tab_cond_bc = recovery_table(true_bc, est_cond_bc, "conditional") +tab_marg_bc = recovery_table(true_bc, est_marg_bc, "marginal") + +summarise_recovery(tab_cond_bc, "BC conditional") +summarise_recovery(tab_marg_bc, "BC marginal") + +r_bc = cor(tab_cond_bc$estimate, tab_marg_bc$estimate) +max_d_bc = max(abs(tab_cond_bc$estimate - tab_marg_bc$estimate)) +cat(sprintf(" Cond vs Marg: r = %.4f, max|diff| = %.4f\n\n", r_bc, max_d_bc)) + +# ------------------------------------------------------------------ +# 3d. Per-block divergence analysis +# ------------------------------------------------------------------ +cat("--- 3d: Per-block divergence (medium network) --------------------\n") +blocks = unique(tab_cond_m$block) +block_stats = do.call(rbind, lapply(blocks, function(b) { + idx = tab_cond_m$block == b + d = tab_cond_m$estimate[idx] - tab_marg_m$estimate[idx] + data.frame( + block = b, + n = sum(idx), + mean_diff = mean(d), + sd_diff = sd(d), + max_abs_diff = max(abs(d)), + cor = cor(tab_cond_m$estimate[idx], tab_marg_m$estimate[idx]), + stringsAsFactors = FALSE + ) +})) +cat("Per-block conditional vs marginal divergence:\n") +print(block_stats, row.names = FALSE) + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group3_cond_vs_marg.pdf"), width = 14, height = 14) + +layout(matrix(1:9, nrow = 3, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: Small network +recovery_scatter(tab_cond_s, "Small: conditional recovery") +recovery_scatter(tab_marg_s, "Small: marginal recovery") +agreement_scatter(tab_cond_s, tab_marg_s, + "Conditional", "Marginal", + sprintf("Small: cond vs marg (r=%.3f)", r_s)) + +# Row 2: Medium network +recovery_scatter(tab_cond_m, "Medium: conditional recovery") +recovery_scatter(tab_marg_m, "Medium: marginal recovery") +agreement_scatter(tab_cond_m, tab_marg_m, + "Conditional", "Marginal", + sprintf("Medium: cond vs marg (r=%.3f)", r_m)) + +# Row 3: BC network +recovery_scatter(tab_cond_bc, "BC: conditional recovery") +recovery_scatter(tab_marg_bc, "BC: marginal recovery") +agreement_scatter(tab_cond_bc, tab_marg_bc, + "Conditional", "Marginal", + sprintf("BC: cond vs marg (r=%.3f)", r_bc)) +dev.off() + +# Difference distribution plots +pdf(file.path(out_dir, "group3_diff_distributions.pdf"), width = 10, height = 8) +par(mfrow = c(2, 3), mar = c(4, 4, 2.5, 1)) + +block_cols = c(mux = "#E41A1C", muy = "#377EB8", Kxx = "#4DAF4A", + Kxy = "#984EA3", Kyy = "#FF7F00") + +for(b in blocks) { + idx = tab_cond_m$block == b + d = tab_cond_m$estimate[idx] - tab_marg_m$estimate[idx] + if(length(d) > 2) { + hist(d, breaks = 15, col = adjustcolor(block_cols[b], 0.5), + border = block_cols[b], + main = sprintf("%s diffs (n=%d)", b, sum(idx)), + xlab = "Conditional - Marginal") + abline(v = 0, lty = 2, col = "grey30") + } else { + barplot(d, names.arg = tab_cond_m$parameter[idx], + col = adjustcolor(block_cols[b], 0.5), + main = sprintf("%s diffs (n=%d)", b, sum(idx)), + ylab = "Conditional - Marginal") + abline(h = 0, lty = 2, col = "grey30") + } +} + +# Overall +all_d = tab_cond_m$estimate - tab_marg_m$estimate +hist(all_d, breaks = 20, col = adjustcolor("grey60", 0.5), + main = sprintf("All diffs (n=%d)", length(all_d)), + xlab = "Conditional - Marginal") +abline(v = 0, lty = 2, col = "red") + +dev.off() + +cat(sprintf("\nPlots saved to %s/group3_*.pdf\n", out_dir)) +cat("=== Group 3 complete =============================================\n\n") diff --git a/dev/tests/validation/group4_cross_package.R b/dev/tests/validation/group4_cross_package.R new file mode 100644 index 00000000..2cdd2b26 --- /dev/null +++ b/dev/tests/validation/group4_cross_package.R @@ -0,0 +1,229 @@ +# =========================================================================== +# Group 4: Cross-package validation (bgms vs mixedGM) +# =========================================================================== +# Both packages implement the same mixed MRF pseudo-likelihood sampler. +# We fit the same data with both and compare posterior means. +# Also runs a simulate-refit cycle: fit -> simulate -> refit -> compare. +# +# Note: mixedGM uses total-categories convention (binary = 2), while +# bgms uses max-index convention (binary = 1). +# The threshold/mean prior in mixedGM must be set to log_prior_logistic +# to match bgms's default Beta(1,1)-on-logistic prior. +# +# Output: numerical summary + PDF with cross-package comparisons. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +library(mixedGM) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 4: Cross-package validation (bgms vs mixedGM)\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# 4a. Setup: shared true network + data +# ------------------------------------------------------------------ +cat("--- 4a: Generating shared data -----------------------------------\n") + +net = make_network(p = 3, q = 2, n_cat = c(1L, 2L, 1L), density = 0.6, seed = 601) + +# Generate data via mixedGM (both packages should accept this) +set.seed(611) +sim = mixedGM::mixed_gibbs_generate( + n = 2000, + Kxx = net$Kxx, Kxy = net$Kxy, Kyy = net$Kyy, + mux = net$mux, muy = net$muy, + num_categories = net$n_cat + 1L, + n_burnin = 1000 +) + +x_disc = sim$x # n x p integer matrix +y_cont = sim$y # n x q numeric matrix + +true_blocks = list(mux = net$mux, muy = net$muy, + Kxx = net$Kxx, Kxy = net$Kxy, Kyy = net$Kyy) + +cat(sprintf(" p = %d ordinal, q = %d continuous, n = %d\n", + net$p, net$q, nrow(x_disc))) +cat(" n_cat (bgms convention):", net$n_cat, "\n") +cat(" n_cat (mixedGM convention):", net$n_cat + 1L, "\n\n") + +# ------------------------------------------------------------------ +# 4b. Fit with mixedGM (marginal PL) +# ------------------------------------------------------------------ +cat("--- 4b: mixedGM marginal PL fit ----------------------------------\n") + +set.seed(621) +fit_mgm_marg = mixedGM::mixed_sampler( + x = x_disc, y = y_cont, + num_categories = net$n_cat + 1L, # mixedGM: total categories + pseudolikelihood = "marginal", + log_prior_mean = mixedGM:::log_prior_logistic, + edge_selection = FALSE, + n_warmup = 5000, n_samples = 10000, + verbose = FALSE +) + +est_mgm_marg = extract_mgm_blocks(fit_mgm_marg, n_cat = net$n_cat) +tab_mgm_marg = recovery_table(true_blocks, est_mgm_marg, "mixedGM-marginal") +summarise_recovery(tab_mgm_marg, "mixedGM marginal") + +# ------------------------------------------------------------------ +# 4c. Fit with bgms (marginal PL) +# ------------------------------------------------------------------ +cat("\n--- 4c: bgms marginal PL fit -------------------------------------\n") + +# Combine x and y into single data frame (bgms convention) +bgms_dat = as.data.frame(cbind(x_disc, y_cont)) +names(bgms_dat) = c(paste0("X", seq_len(net$p)), paste0("Y", seq_len(net$q))) +vtype = c(rep("ordinal", net$p), rep("continuous", net$q)) + +fit_bgms_marg = bgm( + bgms_dat, variable_type = vtype, + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 622 +) + +est_bgms_marg = extract_bgms_blocks(fit_bgms_marg, net) +tab_bgms_marg = recovery_table(true_blocks, est_bgms_marg, "bgms-marginal") +summarise_recovery(tab_bgms_marg, "bgms marginal") + +# ------------------------------------------------------------------ +# 4d. Head-to-head comparison +# ------------------------------------------------------------------ +cat("\n--- 4d: bgms vs mixedGM comparison --------------------------------\n") + +r_cross = cor(tab_bgms_marg$estimate, tab_mgm_marg$estimate) +rmse_cross = sqrt(mean((tab_bgms_marg$estimate - tab_mgm_marg$estimate)^2)) +max_d_cross = max(abs(tab_bgms_marg$estimate - tab_mgm_marg$estimate)) +cat(sprintf(" bgms vs mixedGM: r = %.4f, RMSE = %.4f, max|diff| = %.4f\n", + r_cross, rmse_cross, max_d_cross)) + +# Per-block comparison +blocks = unique(tab_bgms_marg$block) +cross_stats = do.call(rbind, lapply(blocks, function(b) { + idx = tab_bgms_marg$block == b + d = tab_bgms_marg$estimate[idx] - tab_mgm_marg$estimate[idx] + data.frame( + block = b, n = sum(idx), + mean_diff = round(mean(d), 4), + max_abs_diff = round(max(abs(d)), 4), + cor = round(cor(tab_bgms_marg$estimate[idx], tab_mgm_marg$estimate[idx]), 4), + stringsAsFactors = FALSE + ) +})) +cat("\n Per-block bgms vs mixedGM:\n") +print(cross_stats, row.names = FALSE) + +# ------------------------------------------------------------------ +# 4e. Conditional PL comparison +# ------------------------------------------------------------------ +cat("\n--- 4e: Conditional PL comparison ---------------------------------\n") + +set.seed(631) +fit_mgm_cond = mixedGM::mixed_sampler( + x = x_disc, y = y_cont, + num_categories = net$n_cat + 1L, + pseudolikelihood = "conditional", + log_prior_mean = mixedGM:::log_prior_logistic, + edge_selection = FALSE, + n_warmup = 5000, n_samples = 10000, + verbose = FALSE +) +est_mgm_cond = extract_mgm_blocks(fit_mgm_cond, n_cat = net$n_cat) +tab_mgm_cond = recovery_table(true_blocks, est_mgm_cond, "mixedGM-conditional") + +fit_bgms_cond = bgm( + bgms_dat, variable_type = vtype, + pseudolikelihood = "conditional", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 632 +) +est_bgms_cond = extract_bgms_blocks(fit_bgms_cond, net) +tab_bgms_cond = recovery_table(true_blocks, est_bgms_cond, "bgms-conditional") + +r_cond = cor(tab_bgms_cond$estimate, tab_mgm_cond$estimate) +rmse_cond = sqrt(mean((tab_bgms_cond$estimate - tab_mgm_cond$estimate)^2)) +cat(sprintf(" bgms vs mixedGM (conditional): r = %.4f, RMSE = %.4f\n", + r_cond, rmse_cond)) + +# ------------------------------------------------------------------ +# 4f. Simulate-refit cycle (bgms) +# ------------------------------------------------------------------ +cat("\n--- 4f: bgms simulate-refit cycle ---------------------------------\n") + +sim_bgms = simulate(fit_bgms_marg, nsim = 2000, method = "posterior-mean", seed = 641) + +refit_bgms = bgm( + sim_bgms, variable_type = vtype, + pseudolikelihood = "marginal", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 642 +) + +est_orig = extract_bgms_blocks(fit_bgms_marg, net) +est_refit = extract_bgms_blocks(refit_bgms, net) + +tab_orig = recovery_table(true_blocks, est_orig, "bgms-original") +tab_refit = recovery_table(true_blocks, est_refit, "bgms-refit") + +r_cycle = cor(tab_orig$estimate, tab_refit$estimate) +rmse_cycle = sqrt(mean((tab_orig$estimate - tab_refit$estimate)^2)) +cat(sprintf(" bgms cycle: original vs refit r = %.4f, RMSE = %.4f\n", + r_cycle, rmse_cycle)) + +# ------------------------------------------------------------------ +# Master summary +# ------------------------------------------------------------------ +cat("\n--- Summary of all cross-package comparisons ----------------------\n") +master_summary = data.frame( + comparison = c("bgms vs mixedGM (marginal)", "bgms vs mixedGM (conditional)", + "bgms cycle (marginal)"), + correlation = round(c(r_cross, r_cond, r_cycle), 4), + rmse = round(c(rmse_cross, rmse_cond, rmse_cycle), 4), + max_diff = round(c(max_d_cross, + max(abs(tab_bgms_cond$estimate - tab_mgm_cond$estimate)), + max(abs(tab_orig$estimate - tab_refit$estimate))), 4) +) +print(master_summary, row.names = FALSE) + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group4_cross_package.pdf"), width = 15, height = 12) +layout(matrix(1:9, nrow = 3, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: Marginal PL — recovery from truth +recovery_scatter(tab_mgm_marg, "mixedGM marginal: recovery") +recovery_scatter(tab_bgms_marg, "bgms marginal: recovery") +agreement_scatter(tab_bgms_marg, tab_mgm_marg, + "bgms", "mixedGM", + sprintf("bgms vs mixedGM marginal (r=%.3f)", r_cross)) + +# Row 2: Conditional PL — recovery from truth +recovery_scatter(tab_mgm_cond, "mixedGM conditional: recovery") +recovery_scatter(tab_bgms_cond, "bgms conditional: recovery") +agreement_scatter(tab_bgms_cond, tab_mgm_cond, + "bgms", "mixedGM", + sprintf("bgms vs mixedGM conditional (r=%.3f)", r_cond)) + +# Row 3: bgms cycle +recovery_scatter(tab_orig, "bgms original fit") +recovery_scatter(tab_refit, "bgms refit (simulated data)") +agreement_scatter(tab_orig, tab_refit, + "Original", "Refit", + sprintf("bgms cycle (r=%.3f)", r_cycle)) + +dev.off() + +cat(sprintf("\nPlots saved to %s/group4_cross_package.pdf\n", out_dir)) +cat("=== Group 4 complete =============================================\n\n") diff --git a/dev/tests/validation/group5_edge_detection.R b/dev/tests/validation/group5_edge_detection.R new file mode 100644 index 00000000..69ef4290 --- /dev/null +++ b/dev/tests/validation/group5_edge_detection.R @@ -0,0 +1,323 @@ +# =========================================================================== +# Group 5: Edge detection accuracy +# =========================================================================== +# Tests Bayesian edge selection on known sparse networks. With edge_selection +# TRUE, the sampler reports posterior inclusion probabilities (PIPs). We +# evaluate sensitivity, specificity, precision, F1, and MCC at a 0.5 PIP +# threshold and also via ROC-like analysis. +# +# Conditions: weak edges (small J), medium edges, strong edges, +# both PL methods, both samplers. +# +# Output: numerical summary + PDF with ROC-like curves and confusion matrices. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 5: Edge detection accuracy\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# Helper: compute edge detection metrics from PIPs and truth +# ------------------------------------------------------------------ +# @param pip Matrix of posterior inclusion probabilities (p+q x p+q). +# @param true_adj Binary adjacency matrix (p+q x p+q). +# @param threshold PIP threshold for declaring an edge present. +# +# Returns: named list with TP, FP, FN, TN, sensitivity, specificity, +# precision, F1, MCC. +# ------------------------------------------------------------------ +edge_metrics = function(pip, true_adj, threshold = 0.5) { + # Upper triangle only (avoid double counting) + ut = upper.tri(pip) + pred = ifelse(pip[ut] >= threshold, 1, 0) + truth = ifelse(true_adj[ut] != 0, 1, 0) + + tp = sum(pred == 1 & truth == 1) + fp = sum(pred == 1 & truth == 0) + fn = sum(pred == 0 & truth == 1) + tn = sum(pred == 0 & truth == 0) + + sens = if(tp + fn > 0) tp / (tp + fn) else NA + spec = if(tn + fp > 0) tn / (tn + fp) else NA + prec = if(tp + fp > 0) tp / (tp + fp) else NA + f1 = if(!is.na(prec) && !is.na(sens) && (prec + sens) > 0) + 2 * prec * sens / (prec + sens) else NA + denom = sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn)) + mcc = if(denom > 0) (tp * tn - fp * fn) / denom else NA + + list(TP = tp, FP = fp, FN = fn, TN = tn, + sensitivity = sens, specificity = spec, + precision = prec, F1 = f1, MCC = mcc) +} + +# ------------------------------------------------------------------ +# Helper: ROC-like curve from PIPs +# ------------------------------------------------------------------ +roc_curve = function(pip, true_adj) { + ut = upper.tri(pip) + scores = pip[ut] + truth = ifelse(true_adj[ut] != 0, 1, 0) + thresholds = sort(unique(c(0, scores, 1))) + + tpr = fpr = numeric(length(thresholds)) + for(i in seq_along(thresholds)) { + pred = ifelse(scores >= thresholds[i], 1, 0) + tp = sum(pred == 1 & truth == 1) + fp = sum(pred == 1 & truth == 0) + fn = sum(pred == 0 & truth == 1) + tn = sum(pred == 0 & truth == 0) + tpr[i] = if(tp + fn > 0) tp / (tp + fn) else 0 + fpr[i] = if(fp + tn > 0) fp / (fp + tn) else 0 + } + + # AUC by trapezoidal rule + ord = order(fpr, tpr) + fpr_s = fpr[ord]; tpr_s = tpr[ord] + auc = sum(diff(fpr_s) * (tpr_s[-1] + tpr_s[-length(tpr_s)]) / 2) + + list(fpr = fpr_s, tpr = tpr_s, auc = auc) +} + +# ------------------------------------------------------------------ +# Helper: create true adjacency matrix from network +# ------------------------------------------------------------------ +true_adjacency = function(net) { + p = net$p; q = net$q; tot = p + q + adj = matrix(0, tot, tot) + adj[seq_len(p), seq_len(p)] = (net$Kxx != 0) * 1 + adj[p + seq_len(q), p + seq_len(q)] = (net$Kyy != 0) * 1 + diag(adj[p + seq_len(q), p + seq_len(q)]) = 0 # diag doesn't count + adj[seq_len(p), p + seq_len(q)] = (net$Kxy != 0) * 1 + adj[p + seq_len(q), seq_len(p)] = t(adj[seq_len(p), p + seq_len(q)]) + adj +} + +# ------------------------------------------------------------------ +# 5a. Define edge-strength scenarios +# ------------------------------------------------------------------ +scenarios = list( + weak = list(density = 0.4, scale = 0.3, seed = 701, label = "weak (J~0.3)"), + medium = list(density = 0.4, scale = 0.6, seed = 702, label = "medium (J~0.6)"), + strong = list(density = 0.4, scale = 1.0, seed = 703, label = "strong (J~1.0)") +) + +# Modified make_network with controllable edge strength +make_network_scaled = function(p, q, n_cat, density, scale, seed, + variable_type = rep("ordinal", p), + baseline_category = rep(0L, p)) { + net = make_network(p, q, n_cat, variable_type = variable_type, + baseline_category = baseline_category, density = density, + seed = seed) + # Rescale non-zero edges + net$Kxx = net$Kxx * scale / max(abs(net$Kxx[net$Kxx != 0]), 1) + net$Kxy = net$Kxy * scale / max(abs(net$Kxy[net$Kxy != 0]), 1) + off_diag_yy = net$Kyy; diag(off_diag_yy) = 0 + if(any(off_diag_yy != 0)) { + net$Kyy[upper.tri(net$Kyy)] = net$Kyy[upper.tri(net$Kyy)] * scale / max(abs(off_diag_yy[off_diag_yy != 0]), 1) + net$Kyy[lower.tri(net$Kyy)] = t(net$Kyy)[lower.tri(net$Kyy)] + } + # Re-enforce diagonal dominance for Kyy + diag(net$Kyy) = abs(rowSums(net$Kyy - diag(diag(net$Kyy)))) + runif(q, 1.0, 2.0) + net +} + +results = list() +roc_data = list() + +for(sc_name in names(scenarios)) { + sc = scenarios[[sc_name]] + cat(sprintf("--- 5_%s: %s ---\n", sc_name, sc$label)) + + net = make_network_scaled(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), + density = sc$density, scale = sc$scale, seed = sc$seed) + dat = generate_data(net, n = 3000, source = "bgms", seed = sc$seed + 100) + vtype = c(rep("ordinal", 4), rep("continuous", 3)) + adj = true_adjacency(net) + + n_true_edges = sum(adj[upper.tri(adj)]) + n_possible = sum(upper.tri(adj)) + cat(sprintf(" True edges: %d / %d possible\n", n_true_edges, n_possible)) + + # Fit with edge selection + fit = bgm( + dat, variable_type = vtype, + pseudolikelihood = "marginal", + edge_selection = TRUE, + iter = 10000, warmup = 5000, chains = 2, + seed = sc$seed + 200 + ) + + pip = fit$posterior_mean_indicator + met = edge_metrics(pip, adj, threshold = 0.5) + roc = roc_curve(pip, adj) + + results[[sc_name]] = data.frame( + scenario = sc$label, + n_true_edges = n_true_edges, + TP = met$TP, FP = met$FP, FN = met$FN, TN = met$TN, + sensitivity = round(met$sensitivity, 3), + specificity = round(met$specificity, 3), + precision = round(met$precision, 3), + F1 = round(met$F1, 3), + MCC = round(met$MCC, 3), + AUC = round(roc$auc, 3), + stringsAsFactors = FALSE + ) + roc_data[[sc_name]] = roc + + cat(sprintf(" Sens = %.3f | Spec = %.3f | F1 = %.3f | MCC = %.3f | AUC = %.3f\n", + met$sensitivity, met$specificity, met$F1, met$MCC, roc$auc)) +} + +# ------------------------------------------------------------------ +# 5b. Blume-Capel edge detection (medium signal strength) +# ------------------------------------------------------------------ +cat("\n--- 5b: BC mixed — edge detection (medium signal) ----------------\n") + +net_bc = make_network_scaled( + p = 4, q = 2, + n_cat = c(1L, 2L, 2L, 3L), + density = 0.4, scale = 0.6, seed = 710, + variable_type = c("ordinal", "ordinal", "blume-capel", "blume-capel"), + baseline_category = c(0L, 0L, 1L, 1L) +) +dat_bc = generate_data(net_bc, n = 3000, source = "bgms", seed = 810) + +vtype_bc = c("ordinal", "ordinal", "blume-capel", "blume-capel", + "continuous", "continuous") +adj_bc = true_adjacency(net_bc) + +n_true_bc = sum(adj_bc[upper.tri(adj_bc)]) +n_poss_bc = sum(upper.tri(adj_bc)) +cat(sprintf(" True edges: %d / %d possible\n", n_true_bc, n_poss_bc)) + +fit_bc = bgm( + dat_bc, variable_type = vtype_bc, + baseline_category = c(0L, 0L, 1L, 1L), + pseudolikelihood = "marginal", + edge_selection = TRUE, + iter = 10000, warmup = 5000, chains = 2, + seed = 910 +) + +pip_bc = fit_bc$posterior_mean_indicator +met_bc = edge_metrics(pip_bc, adj_bc, threshold = 0.5) +roc_bc = roc_curve(pip_bc, adj_bc) + +results[["bc_medium"]] = data.frame( + scenario = "BC medium (J~0.6)", + n_true_edges = n_true_bc, + TP = met_bc$TP, FP = met_bc$FP, FN = met_bc$FN, TN = met_bc$TN, + sensitivity = round(met_bc$sensitivity, 3), + specificity = round(met_bc$specificity, 3), + precision = round(met_bc$precision, 3), + F1 = round(met_bc$F1, 3), + MCC = round(met_bc$MCC, 3), + AUC = round(roc_bc$auc, 3), + stringsAsFactors = FALSE +) +roc_data[["bc_medium"]] = roc_bc + +cat(sprintf(" Sens = %.3f | Spec = %.3f | F1 = %.3f | MCC = %.3f | AUC = %.3f\n", + met_bc$sensitivity, met_bc$specificity, met_bc$F1, met_bc$MCC, roc_bc$auc)) + +# ------------------------------------------------------------------ +# Summary table +# ------------------------------------------------------------------ +cat("\n--- Edge detection summary ----------------------------------------\n") +summary_df = do.call(rbind, results) +print(summary_df, row.names = FALSE) + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group5_edge_detection.pdf"), width = 14, height = 14) + +layout(matrix(1:8, nrow = 2, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Row 1: ROC curves + PIP panels for ordinal scenarios +cols = c(weak = "#E41A1C", medium = "#377EB8", strong = "#4DAF4A", + bc_medium = "#984EA3") + +# Combined ROC (all scenarios including BC) +plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1), + xlab = "False Positive Rate", ylab = "True Positive Rate", + main = "ROC curves by scenario", asp = 1) +abline(0, 1, lty = 2, col = "grey60") +for(sc_name in names(roc_data)) { + roc = roc_data[[sc_name]] + lines(roc$fpr, roc$tpr, col = cols[sc_name], lwd = 2) +} +legend("bottomright", + legend = paste0(names(roc_data), sprintf(" (AUC=%.2f)", sapply(roc_data, `[[`, "auc"))), + col = cols[names(roc_data)], lwd = 2, bty = "n") + +# PIP panels for ordinal scenarios +for(sc_name in names(scenarios)) { + sc = scenarios[[sc_name]] + net = make_network_scaled(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), + density = sc$density, scale = sc$scale, seed = sc$seed) + dat = generate_data(net, n = 3000, source = "bgms", seed = sc$seed + 100) + vtype = c(rep("ordinal", 4), rep("continuous", 3)) + + fit = bgm(dat, variable_type = vtype, + pseudolikelihood = "marginal", edge_selection = TRUE, + iter = 10000, warmup = 5000, chains = 2, + display_progress = "none", seed = sc$seed + 200) + + pip = fit$posterior_mean_indicator + adj = true_adjacency(net) + + ut_pip = pip[upper.tri(pip)] + ut_adj = adj[upper.tri(adj)] + plot(jitter(ut_adj, 0.1), ut_pip, pch = 19, + col = adjustcolor(ifelse(ut_adj == 1, "firebrick", "steelblue"), 0.6), + xlab = "True edge (0/1)", ylab = "Posterior inclusion prob", + main = sprintf("%s: PIPs", sc$label), + xlim = c(-0.3, 1.3), ylim = c(0, 1)) + abline(h = 0.5, lty = 2, col = "grey40") + legend("center", + legend = c("True edge", "True null"), + col = c("firebrick", "steelblue"), pch = 19, bty = "n") +} + +# Row 2: BC PIP panel + barplot +# BC PIP panel +ut_pip_bc = pip_bc[upper.tri(pip_bc)] +ut_adj_bc = adj_bc[upper.tri(adj_bc)] +plot(jitter(ut_adj_bc, 0.1), ut_pip_bc, pch = 19, + col = adjustcolor(ifelse(ut_adj_bc == 1, "firebrick", "steelblue"), 0.6), + xlab = "True edge (0/1)", ylab = "Posterior inclusion prob", + main = "BC medium: PIPs", + xlim = c(-0.3, 1.3), ylim = c(0, 1)) +abline(h = 0.5, lty = 2, col = "grey40") +legend("center", + legend = c("True edge", "True null"), + col = c("firebrick", "steelblue"), pch = 19, bty = "n") + +# Barplot of metrics (all scenarios) +all_cols = cols[names(results)] +metrics_mat = t(sapply(results, function(r) + c(Sensitivity = r$sensitivity, Specificity = r$specificity, + F1 = r$F1, MCC = r$MCC))) +barplot(metrics_mat, beside = TRUE, col = all_cols, + main = "Edge detection metrics by scenario", + ylab = "Score", ylim = c(0, 1.1)) +legend("topright", legend = names(results), fill = all_cols, bty = "n") +abline(h = 1, lty = 2, col = "grey60") + +# Blank panels +plot.new() +plot.new() + +dev.off() + +cat(sprintf("\nPlots saved to %s/group5_edge_detection.pdf\n", out_dir)) +cat("=== Group 5 complete =============================================\n\n") diff --git a/dev/tests/validation/group6_diagnostics.R b/dev/tests/validation/group6_diagnostics.R new file mode 100644 index 00000000..bc16f6e0 --- /dev/null +++ b/dev/tests/validation/group6_diagnostics.R @@ -0,0 +1,285 @@ +# =========================================================================== +# Group 6: MCMC diagnostics +# =========================================================================== +# Evaluate chain convergence and mixing quality for the mixed MRF sampler. +# Reports R-hat, ESS, and effective samples per second. Visualises trace +# plots, density overlays per chain, and autocorrelation. +# +# Special focus on Kyy parameters (the MH component in hybrid NUTS) to +# verify that MH acceptance is reasonable and chains mix. +# +# Output: numerical summary + PDF with diagnostic panels. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 6: MCMC diagnostics\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# Helpers +# ------------------------------------------------------------------ + +# Split-Rhat (Vehtari et al. 2021 simplified version) +split_rhat = function(chains) { + # chains: list of numeric vectors (one per chain) + n = min(sapply(chains, length)) + # Split each chain in half + split_chains = unlist(lapply(chains, function(ch) { + half = floor(n / 2) + list(ch[1:half], ch[(half + 1):(2 * half)]) + }), recursive = FALSE) + m = length(split_chains) + n_half = length(split_chains[[1]]) + chain_means = sapply(split_chains, mean) + chain_vars = sapply(split_chains, var) + W = mean(chain_vars) + B = var(chain_means) * n_half + var_hat = (1 - 1 / n_half) * W + B / n_half + sqrt(var_hat / W) +} + +# ESS (simple formula based on autocorrelation) +simple_ess = function(x) { + n = length(x) + if(n < 10) return(NA) + acf_vals = acf(x, lag.max = min(n - 1, 500), plot = FALSE)$acf[, 1, 1] + # Geyer's initial positive sequence + T_max = length(acf_vals) + rho_sum = 0 + for(k in seq(2, T_max, by = 2)) { + pair_sum = acf_vals[k] + if(k + 1 <= T_max) acf_vals[k + 1] else 0 + if(pair_sum < 0) break + rho_sum = rho_sum + pair_sum + } + n / (1 + 2 * rho_sum) +} + +# ------------------------------------------------------------------ +# 6a. Fit with multiple chains +# ------------------------------------------------------------------ +cat("--- 6a: Fitting 4-chain models -----------------------------------\n") + +net = make_network(p = 4, q = 3, n_cat = c(1L, 2L, 3L, 1L), density = 0.4, seed = 102) +dat = generate_data(net, n = 3000, source = "bgms", seed = 202) +vtype = c(rep("ordinal", 4), rep("continuous", 3)) + +t_mh = system.time({ + fit_mh = bgm(dat, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 4, + seed = 801) +}) + +t_nuts = system.time({ + fit_nuts = bgm(dat, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 4, + seed = 802) +}) + +cat(sprintf(" MH wall time: %.1f sec\n", t_mh["elapsed"])) +cat(sprintf(" NUTS wall time: %.1f sec\n", t_nuts["elapsed"])) + +# ------------------------------------------------------------------ +# 6b. Extract per-chain diagnostics +# ------------------------------------------------------------------ +cat("\n--- 6b: Per-parameter diagnostics ---------------------------------\n") + +compute_diagnostics = function(fit, label, wall_time) { + main_chains = fit$raw_samples$main + pair_chains = fit$raw_samples$pairwise + nchains = fit$raw_samples$nchains + main_names = fit$raw_samples$parameter_names$main + pair_names = fit$raw_samples$parameter_names$pairwise + + all_names = c(main_names, pair_names) + n_main = length(main_names) + n_pair = length(pair_names) + + rhat_vals = ess_vals = numeric(length(all_names)) + names(rhat_vals) = names(ess_vals) = all_names + + for(j in seq_len(n_main)) { + chains_j = lapply(main_chains, function(m) m[, j]) + rhat_vals[j] = split_rhat(chains_j) + ess_vals[j] = simple_ess(do.call(c, chains_j)) + } + for(j in seq_len(n_pair)) { + chains_j = lapply(pair_chains, function(m) m[, j]) + rhat_vals[n_main + j] = split_rhat(chains_j) + ess_vals[n_main + j] = simple_ess(do.call(c, chains_j)) + } + + # Classify parameters + block = ifelse(seq_along(all_names) <= n_main, "main", "pairwise") + + data.frame( + parameter = all_names, + block = block, + rhat = round(rhat_vals, 4), + ess = round(ess_vals, 0), + ess_per_sec = round(ess_vals / wall_time, 1), + method = label, + stringsAsFactors = FALSE, row.names = NULL + ) +} + +diag_mh = compute_diagnostics(fit_mh, "MH", t_mh["elapsed"]) +diag_nuts = compute_diagnostics(fit_nuts, "NUTS", t_nuts["elapsed"]) +diag_all = rbind(diag_mh, diag_nuts) + +# Summary statistics +cat("\n MH diagnostics:\n") +cat(sprintf(" R-hat: median = %.3f, max = %.3f, n > 1.01 = %d\n", + median(diag_mh$rhat), max(diag_mh$rhat), sum(diag_mh$rhat > 1.01))) +cat(sprintf(" ESS: median = %.0f, min = %.0f, ESS/s median = %.1f\n", + median(diag_mh$ess), min(diag_mh$ess), median(diag_mh$ess_per_sec))) + +cat("\n NUTS diagnostics:\n") +cat(sprintf(" R-hat: median = %.3f, max = %.3f, n > 1.01 = %d\n", + median(diag_nuts$rhat), max(diag_nuts$rhat), sum(diag_nuts$rhat > 1.01))) +cat(sprintf(" ESS: median = %.0f, min = %.0f, ESS/s median = %.1f\n", + median(diag_nuts$ess), min(diag_nuts$ess), median(diag_nuts$ess_per_sec))) + +# ------------------------------------------------------------------ +# 6c. NUTS-specific diagnostics +# ------------------------------------------------------------------ +cat("\n--- 6c: NUTS-specific diagnostics ---------------------------------\n") +if(!is.null(fit_nuts$nuts_diag)) { + nuts_d = fit_nuts$nuts_diag + if(is.list(nuts_d)) { + # Tree depth distribution + if(!is.null(nuts_d$tree_depth) || !is.null(nuts_d[[1]]$tree_depth)) { + cat(" NUTS diagnostics available\n") + # Try to extract tree depths from first chain + td = if(is.list(nuts_d[[1]])) nuts_d[[1]]$tree_depth else nuts_d$tree_depth + if(!is.null(td)) { + cat(" Tree depth distribution:\n") + print(table(td)) + cat(sprintf(" Mean tree depth: %.2f\n", mean(td))) + } + } + } +} else { + cat(" No NUTS diagnostics available in fit object.\n") +} + +# ------------------------------------------------------------------ +# 6d. Identify problematic parameters +# ------------------------------------------------------------------ +cat("\n--- 6d: Flagged parameters ----------------------------------------\n") +flagged = diag_all[diag_all$rhat > 1.05 | diag_all$ess < 100, ] +if(nrow(flagged) > 0) { + cat(sprintf(" %d parameters flagged (R-hat > 1.05 or ESS < 100):\n", nrow(flagged))) + print(flagged, row.names = FALSE) +} else { + cat(" No parameters flagged. All R-hat <= 1.05 and ESS >= 100.\n") +} + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group6_diagnostics.pdf"), width = 14, height = 16) + +layout(matrix(1:8, nrow = 4, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Panel 1: R-hat comparison +plot(diag_mh$rhat, diag_nuts$rhat, pch = 19, + col = adjustcolor(ifelse(diag_mh$block == "main", "steelblue", "firebrick"), 0.6), + xlab = "R-hat (MH)", ylab = "R-hat (NUTS)", + main = "R-hat: MH vs NUTS") +abline(h = 1.01, v = 1.01, lty = 2, col = "grey40") +abline(0, 1, lty = 3, col = "grey60") +legend("topleft", legend = c("main", "pairwise"), + col = c("steelblue", "firebrick"), pch = 19, bty = "n") + +# Panel 2: ESS comparison +plot(diag_mh$ess, diag_nuts$ess, pch = 19, + col = adjustcolor(ifelse(diag_mh$block == "main", "steelblue", "firebrick"), 0.6), + xlab = "ESS (MH)", ylab = "ESS (NUTS)", + main = "ESS: MH vs NUTS", log = "xy") +abline(0, 1, lty = 2, col = "grey40") + +# Panel 3: ESS/sec comparison +plot(diag_mh$ess_per_sec, diag_nuts$ess_per_sec, pch = 19, + col = adjustcolor(ifelse(diag_mh$block == "main", "steelblue", "firebrick"), 0.6), + xlab = "ESS/sec (MH)", ylab = "ESS/sec (NUTS)", + main = "Efficiency: MH vs NUTS", log = "xy") +abline(0, 1, lty = 2, col = "grey40") + +# Panel 4: R-hat distributions +boxplot(rhat ~ method, data = diag_all, col = c("steelblue", "firebrick"), + main = "R-hat distribution by method", + ylab = "R-hat") +abline(h = 1.01, lty = 2, col = "grey40") + +# Panels 5-6: Trace plots for selected parameters (MH) +pair_names_mh = fit_mh$raw_samples$parameter_names$pairwise +sel = pair_names_mh[seq_len(min(2, length(pair_names_mh)))] +for(nm_idx in seq_along(sel)) { + nm = sel[nm_idx] + j = match(nm, pair_names_mh) + cols_chain = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3") + plot(0, 0, type = "n", + xlim = c(1, fit_mh$raw_samples$niter), + ylim = range(sapply(fit_mh$raw_samples$pairwise, function(m) range(m[, j]))), + xlab = "Iteration", ylab = nm, + main = sprintf("MH trace: %s", nm)) + for(ch in seq_len(fit_mh$raw_samples$nchains)) { + lines(fit_mh$raw_samples$pairwise[[ch]][, j], + col = adjustcolor(cols_chain[ch], 0.4)) + } +} + +# Panels 7-8: Trace plots for selected parameters (NUTS) +pair_names_nuts = fit_nuts$raw_samples$parameter_names$pairwise +sel_n = pair_names_nuts[seq_len(min(2, length(pair_names_nuts)))] +for(nm_idx in seq_along(sel_n)) { + nm = sel_n[nm_idx] + j = match(nm, pair_names_nuts) + plot(0, 0, type = "n", + xlim = c(1, fit_nuts$raw_samples$niter), + ylim = range(sapply(fit_nuts$raw_samples$pairwise, function(m) range(m[, j]))), + xlab = "Iteration", ylab = nm, + main = sprintf("NUTS trace: %s", nm)) + for(ch in seq_len(fit_nuts$raw_samples$nchains)) { + lines(fit_nuts$raw_samples$pairwise[[ch]][, j], + col = adjustcolor(cols_chain[ch], 0.4)) + } +} + +dev.off() + +# --- Autocorrelation comparison --- +pdf(file.path(out_dir, "group6_autocorrelation.pdf"), width = 12, height = 10) + +# Pick 4 pairwise parameters and compare autocorrelation between MH and NUTS +n_show = min(4, length(pair_names_mh)) +par(mfrow = c(n_show, 2), mar = c(3, 4, 2.5, 1), mgp = c(2, 0.6, 0)) + +for(j in seq_len(n_show)) { + nm = pair_names_mh[j] + # MH autocorrelation (chain 1) + mh_samp = fit_mh$raw_samples$pairwise[[1]][, j] + acf(mh_samp, lag.max = 100, main = sprintf("MH: %s", nm), cex.main = 0.9) + + nm_n = pair_names_nuts[j] + nuts_samp = fit_nuts$raw_samples$pairwise[[1]][, j] + acf(nuts_samp, lag.max = 100, main = sprintf("NUTS: %s", nm_n), cex.main = 0.9) +} + +dev.off() + +cat(sprintf("\nPlots saved to %s/group6_*.pdf\n", out_dir)) +cat("=== Group 6 complete =============================================\n\n") diff --git a/dev/tests/validation/group7_empirical.R b/dev/tests/validation/group7_empirical.R new file mode 100644 index 00000000..23db183b --- /dev/null +++ b/dev/tests/validation/group7_empirical.R @@ -0,0 +1,287 @@ +# =========================================================================== +# Group 7: Empirical data smoke tests +# =========================================================================== +# Fit the mixed MRF model on real-world data to verify that: +# 1. The model runs to completion without errors. +# 2. Posterior summaries have correct dimensions. +# 3. R-hat values are acceptable. +# 4. Simulate and predict methods work on the fitted object. +# 5. Both PL methods and both samplers produce sensible output. +# +# Uses the Boredom dataset (8 items: 4 treated as ordinal, 4 as continuous) +# following the convention from the existing cycle test. +# +# Output: numerical summary + PDF with trace and density panels. +# =========================================================================== + +devtools::load_all(quiet = TRUE) +source(file.path("dev", "tests", "validation", "helpers.R")) + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("=======================================================================\n") +cat(" Group 7: Empirical data smoke tests\n") +cat("=======================================================================\n\n") + +# ------------------------------------------------------------------ +# 7a. Prepare Boredom data as mixed +# ------------------------------------------------------------------ +cat("--- 7a: Preparing Boredom data ------------------------------------\n") + +data("Boredom", package = "bgms") +raw = as.matrix(Boredom[, 2:9]) # drop language factor +raw = raw - 1L # shift 1-7 -> 0-6 +colnames(raw) = names(Boredom)[2:9] + +ord_idx = c(1, 3, 5, 7) +cont_idx = c(2, 4, 6, 8) +vtype = character(8) +vtype[ord_idx] = "ordinal" +vtype[cont_idx] = "continuous" + +cat(sprintf(" n = %d, %d ordinal + %d continuous variables\n", + nrow(raw), length(ord_idx), length(cont_idx))) +cat(" Variable types:", vtype, "\n\n") + +# ------------------------------------------------------------------ +# 7b. Fit: MH + marginal PL +# ------------------------------------------------------------------ +cat("--- 7b: MH + marginal PL -----------------------------------------\n") + +fit_mh_marg = bgm( + raw, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 901 +) + +# Sanity checks +stopifnot(!is.null(fit_mh_marg$posterior_summary_pairwise)) +stopifnot(!is.null(fit_mh_marg$posterior_mean_main)) +stopifnot(!is.null(fit_mh_marg$posterior_mean_pairwise)) +cat(" posterior_summary_pairwise rows:", nrow(fit_mh_marg$posterior_summary_pairwise), "\n") +cat(" posterior_mean_pairwise dim:", paste(dim(fit_mh_marg$posterior_mean_pairwise), collapse = "x"), "\n") +cat(" Main effects (discrete) dim:", paste(dim(coef(fit_mh_marg)$main$discrete), collapse = "x"), "\n") +cat(" Main effects (continuous) dim:", paste(dim(coef(fit_mh_marg)$main$continuous), collapse = "x"), "\n") +cat(" OK\n\n") + +# ------------------------------------------------------------------ +# 7c. Fit: MH + conditional PL +# ------------------------------------------------------------------ +cat("--- 7c: MH + conditional PL --------------------------------------\n") + +fit_mh_cond = bgm( + raw, variable_type = vtype, + pseudolikelihood = "conditional", + update_method = "adaptive-metropolis", + edge_selection = FALSE, + iter = 10000, warmup = 5000, chains = 2, + seed = 902 +) + +stopifnot(!is.null(fit_mh_cond$posterior_mean_pairwise)) +cat(" posterior_mean_pairwise dim:", paste(dim(fit_mh_cond$posterior_mean_pairwise), collapse = "x"), "\n") +cat(" OK\n\n") + +# ------------------------------------------------------------------ +# 7d. Fit: NUTS + marginal PL +# ------------------------------------------------------------------ +cat("--- 7d: NUTS + marginal PL ---------------------------------------\n") + +fit_nuts_marg = bgm( + raw, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 2, + seed = 903 +) + +stopifnot(!is.null(fit_nuts_marg$posterior_mean_pairwise)) +cat(" posterior_mean_pairwise dim:", paste(dim(fit_nuts_marg$posterior_mean_pairwise), collapse = "x"), "\n") +cat(" OK\n\n") + +# ------------------------------------------------------------------ +# 7e. Fit: NUTS + conditional PL +# ------------------------------------------------------------------ +cat("--- 7e: NUTS + conditional PL ------------------------------------\n") + +fit_nuts_cond = bgm( + raw, variable_type = vtype, + pseudolikelihood = "conditional", + update_method = "nuts", + edge_selection = FALSE, + iter = 5000, warmup = 3000, chains = 2, + display_progress = "none", seed = 904 +) + +stopifnot(!is.null(fit_nuts_cond$posterior_mean_pairwise)) +cat(" posterior_mean_pairwise dim:", paste(dim(fit_nuts_cond$posterior_mean_pairwise), collapse = "x"), "\n") +cat(" OK\n\n") + +# ------------------------------------------------------------------ +# 7f. Cross-method agreement on empirical data +# ------------------------------------------------------------------ +cat("--- 7f: Cross-method agreement on empirical data ------------------\n") + +get_pw_flat = function(fit) as.vector(fit$posterior_mean_pairwise[upper.tri(fit$posterior_mean_pairwise)]) + +pw_mh_marg = get_pw_flat(fit_mh_marg) +pw_mh_cond = get_pw_flat(fit_mh_cond) +pw_nuts_marg = get_pw_flat(fit_nuts_marg) +pw_nuts_cond = get_pw_flat(fit_nuts_cond) + +pairs = list( + c("MH-marginal", "MH-conditional"), + c("MH-marginal", "NUTS-marginal"), + c("NUTS-marginal", "NUTS-conditional"), + c("MH-marginal", "NUTS-conditional") +) +pw_list = list( + `MH-marginal` = pw_mh_marg, `MH-conditional` = pw_mh_cond, + `NUTS-marginal` = pw_nuts_marg, `NUTS-conditional` = pw_nuts_cond +) + +cat(" Pairwise interaction correlations:\n") +for(pr in pairs) { + r = cor(pw_list[[pr[1]]], pw_list[[pr[2]]]) + rmse = sqrt(mean((pw_list[[pr[1]]] - pw_list[[pr[2]]])^2)) + cat(sprintf(" %s vs %s: r = %.4f, RMSE = %.4f\n", pr[1], pr[2], r, rmse)) +} + +# ------------------------------------------------------------------ +# 7g. Simulate from fitted model +# ------------------------------------------------------------------ +cat("\n--- 7g: Simulate from fitted model --------------------------------\n") + +sim1 = simulate(fit_mh_marg, nsim = 500, method = "posterior-mean", seed = 911) +cat(sprintf(" simulate(posterior-mean): %d x %d\n", nrow(sim1), ncol(sim1))) +stopifnot(nrow(sim1) == 500) +stopifnot(ncol(sim1) == 8) + +# Check that ordinal columns are integers and continuous are numeric +for(i in ord_idx) { + stopifnot(all(sim1[, i] == floor(sim1[, i]))) +} +cat(" Ordinal columns contain integers: OK\n") +cat(" Continuous column ranges:\n") +for(i in cont_idx) { + cat(sprintf(" col %d: [%.2f, %.2f]\n", i, min(sim1[, i]), max(sim1[, i]))) +} + +# ------------------------------------------------------------------ +# 7h. Edge selection on empirical data +# ------------------------------------------------------------------ +cat("\n--- 7h: Edge selection on empirical data --------------------------\n") + +fit_edge = bgm( + raw, variable_type = vtype, + pseudolikelihood = "marginal", + update_method = "adaptive-metropolis", + edge_selection = TRUE, + iter = 10000, warmup = 5000, chains = 2, + seed = 921 +) + +pip = fit_edge$posterior_mean_indicator +n_edges = sum(pip[upper.tri(pip)] > 0.5) +n_possible = sum(upper.tri(pip)) +cat(sprintf(" Edges detected (PIP > 0.5): %d / %d\n", n_edges, n_possible)) +cat(" PIP distribution:\n") +pip_ut = pip[upper.tri(pip)] +print(summary(pip_ut)) + +# ------------------------------------------------------------------ +# 7i. R-hat check across all fits +# ------------------------------------------------------------------ +cat("\n--- 7i: R-hat check -----------------------------------------------\n") + +check_rhat = function(fit, label) { + summ = fit$posterior_summary_pairwise + if(!is.null(summ) && "Rhat" %in% names(summ)) { + rhats = summ$Rhat + cat(sprintf(" %s: max R-hat = %.3f, n > 1.05 = %d / %d\n", + label, max(rhats, na.rm = TRUE), + sum(rhats > 1.05, na.rm = TRUE), length(rhats))) + } else { + cat(sprintf(" %s: R-hat not available in summary\n", label)) + } +} + +check_rhat(fit_mh_marg, "MH marginal") +check_rhat(fit_mh_cond, "MH conditional") +check_rhat(fit_nuts_marg, "NUTS marginal") +check_rhat(fit_nuts_cond, "NUTS conditional") + +# ------------------------------------------------------------------ +# Plots +# ------------------------------------------------------------------ +pdf(file.path(out_dir, "group7_empirical.pdf"), width = 14, height = 12) + +layout(matrix(1:6, nrow = 2, byrow = TRUE)) +par(mar = c(4.5, 4.5, 2.5, 1)) + +# Panel 1: All methods pairwise agreement (MH-marg as x, rest as y) +rng = range(c(pw_mh_marg, pw_mh_cond, pw_nuts_marg, pw_nuts_cond)) +plot(pw_mh_marg, pw_mh_cond, pch = 19, + col = adjustcolor("steelblue", 0.5), + xlim = rng, ylim = rng, asp = 1, + xlab = "MH marginal", ylab = "MH conditional", + main = sprintf("MH: marginal vs conditional (r=%.3f)", + cor(pw_mh_marg, pw_mh_cond))) +abline(0, 1, lty = 2, col = "grey40") + +plot(pw_mh_marg, pw_nuts_marg, pch = 19, + col = adjustcolor("firebrick", 0.5), + xlim = rng, ylim = rng, asp = 1, + xlab = "MH marginal", ylab = "NUTS marginal", + main = sprintf("Marginal: MH vs NUTS (r=%.3f)", + cor(pw_mh_marg, pw_nuts_marg))) +abline(0, 1, lty = 2, col = "grey40") + +plot(pw_mh_marg, pw_nuts_cond, pch = 19, + col = adjustcolor("#4DAF4A", 0.5), + xlim = rng, ylim = rng, asp = 1, + xlab = "MH marginal", ylab = "NUTS conditional", + main = sprintf("MH-marg vs NUTS-cond (r=%.3f)", + cor(pw_mh_marg, pw_nuts_cond))) +abline(0, 1, lty = 2, col = "grey40") + +# Panel 4: Estimated network heatmap (MH marginal) +pw_mat = fit_mh_marg$posterior_mean_pairwise +image(seq_len(nrow(pw_mat)), seq_len(ncol(pw_mat)), pw_mat, + col = hcl.colors(50, "Blue-Red 3"), + xlab = "", ylab = "", main = "MH marginal: pairwise matrix", + axes = FALSE) +axis(1, at = seq_len(ncol(pw_mat)), labels = colnames(raw), las = 2, cex.axis = 0.7) +axis(2, at = seq_len(nrow(pw_mat)), labels = colnames(raw), las = 2, cex.axis = 0.7) + +# Panel 5: PIPs heatmap +if(!is.null(pip)) { + image(seq_len(nrow(pip)), seq_len(ncol(pip)), pip, + col = hcl.colors(50, "Viridis"), + xlab = "", ylab = "", main = "Edge inclusion probabilities", + axes = FALSE, zlim = c(0, 1)) + axis(1, at = seq_len(ncol(pip)), labels = colnames(raw), las = 2, cex.axis = 0.7) + axis(2, at = seq_len(nrow(pip)), labels = colnames(raw), las = 2, cex.axis = 0.7) +} + +# Panel 6: Simulated vs observed distributions (first 2 ordinal vars) +sim_check = simulate(fit_mh_marg, nsim = nrow(raw), method = "posterior-mean", seed = 930) +par(mar = c(4.5, 4.5, 2.5, 1)) +obs_tab = table(raw[, 1]) +sim_tab = table(factor(sim_check[, 1], levels = names(obs_tab))) +barplot(rbind(obs_tab / sum(obs_tab), sim_tab / sum(sim_tab)), + beside = TRUE, col = c("steelblue", "firebrick"), + main = sprintf("%s: observed vs simulated", colnames(raw)[1]), + ylab = "Proportion", xlab = "Category") +legend("topright", legend = c("Observed", "Simulated"), + fill = c("steelblue", "firebrick"), bty = "n") + +dev.off() + +cat(sprintf("\nPlots saved to %s/group7_empirical.pdf\n", out_dir)) +cat("=== Group 7 complete =============================================\n\n") diff --git a/dev/tests/validation/group9_breakdown.R b/dev/tests/validation/group9_breakdown.R new file mode 100644 index 00000000..986c70c4 --- /dev/null +++ b/dev/tests/validation/group9_breakdown.R @@ -0,0 +1,174 @@ +# =========================================================================== +# Targeted timing breakdown for mixed MRF hotspot identification +# =========================================================================== +library(bgms) +source("dev/tests/validation/helpers.R") + +cat("===================================================================\n") +cat(" Mixed MRF Timing Breakdown\n") +cat("===================================================================\n\n") + +# --------------------------------------------------------------------------- +# Setup: p=8, q=6 problem +# --------------------------------------------------------------------------- +p = 8; q = 6; n = 300 +n_cat = rep(2L, p) +net = make_network(p = p, q = q, n_cat = n_cat, density = 0.4, seed = 42) +dat = generate_data(net, n = n, seed = 42) +vt = c(rep("ordinal", p), rep("continuous", q)) + +n_iter = 200; n_warmup = 100 + +cat(sprintf("Config: p=%d, q=%d, n=%d, iter=%d, warmup=%d\n\n", p, q, n, n_iter, n_warmup)) + +# --------------------------------------------------------------------------- +# A. Component breakdown: estimation-only vs edge-selection +# --------------------------------------------------------------------------- +cat("--- A. Edge selection overhead ---\n") + +t_est = system.time(suppressWarnings( + bgm(dat, variable_type = vt, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + +t_es = system.time(suppressWarnings( + bgm(dat, variable_type = vt, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = TRUE, + display_progress = FALSE)))["elapsed"] + +cat(sprintf(" Estimation only: %6.2f s (%5.2f ms/iter)\n", t_est, t_est/n_iter*1000)) +cat(sprintf(" + Edge selection: %6.2f s (%5.2f ms/iter)\n", t_es, t_es/n_iter*1000)) +cat(sprintf(" Edge selection adds: %.2f ms/iter (%.0f%%)\n\n", + (t_es - t_est)/n_iter*1000, (t_es - t_est)/t_es*100)) + +# --------------------------------------------------------------------------- +# B. Conditional vs Marginal PL at varying p +# --------------------------------------------------------------------------- +cat("--- B. Conditional vs Marginal PL scaling ---\n") + +for(pp in c(4, 8, 12)) { + qq = round(pp * 0.75) + nc = rep(2L, pp) + net2 = make_network(p = pp, q = qq, n_cat = nc, density = 0.4, seed = 42) + dat2 = generate_data(net2, n = n, seed = 42) + vt2 = c(rep("ordinal", pp), rep("continuous", qq)) + + tc = system.time(suppressWarnings( + bgm(dat2, variable_type = vt2, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + tm = system.time(suppressWarnings( + bgm(dat2, variable_type = vt2, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + pseudolikelihood = "marginal", + display_progress = FALSE)))["elapsed"] + + cat(sprintf(" p=%2d q=%2d : cond=%5.2f, marg=%5.2f ms/iter (%.1fx)\n", + pp, qq, tc/n_iter*1000, tm/n_iter*1000, tm/tc)) +} + +# --------------------------------------------------------------------------- +# C. Pure sub-model comparison (isolate cross-term cost) +# --------------------------------------------------------------------------- +cat("\n--- C. Cross-model comparison ---\n") + +for(sz in c(4, 8, 12)) { + nc = rep(2L, sz) + net3 = make_network(p = sz, q = sz, n_cat = nc, density = 0.4, seed = 42) + dat3 = generate_data(net3, n = n, seed = 42) + vt3 = c(rep("ordinal", sz), rep("continuous", sz)) + + # Mixed + t_mix = system.time(suppressWarnings( + bgm(dat3, variable_type = vt3, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + # OMRF only (discrete columns) + dat_o = dat3[, 1:sz, drop = FALSE] + t_omrf = system.time(suppressWarnings( + bgm(dat_o, variable_type = rep("ordinal", sz), iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + # GGM only (continuous columns) + dat_g = dat3[, (sz+1):(2*sz), drop = FALSE] + t_ggm = system.time(suppressWarnings( + bgm(dat_g, variable_type = rep("continuous", sz), iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + omrf_ms = t_omrf/n_iter*1000 + ggm_ms = t_ggm/n_iter*1000 + mix_ms = t_mix/n_iter*1000 + cross_ms = mix_ms - omrf_ms - ggm_ms + + cat(sprintf(" size=%2d : mixed=%5.2f omrf=%5.2f ggm=%5.2f cross(residual)=%5.2f ms/iter\n", + sz, mix_ms, omrf_ms, ggm_ms, cross_ms)) +} + +# --------------------------------------------------------------------------- +# D. Scaling: isolate p-scaling (fix q=4) and q-scaling (fix p=4) +# --------------------------------------------------------------------------- +cat("\n--- D. Scaling curves ---\n") + +cat(" Fix q=4, vary p:\n") +for(pp in c(3, 6, 9, 12)) { + nc = rep(2L, pp) + net4 = make_network(p = pp, q = 4, n_cat = nc, density = 0.4, seed = 42) + dat4 = generate_data(net4, n = n, seed = 42) + vt4 = c(rep("ordinal", pp), rep("continuous", 4)) + + tt = system.time(suppressWarnings( + bgm(dat4, variable_type = vt4, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + cat(sprintf(" p=%2d q=4 : %5.2f ms/iter\n", pp, tt/n_iter*1000)) +} + +cat(" Fix p=4, vary q:\n") +for(qq in c(2, 4, 6, 8, 10)) { + nc = rep(2L, 4) + net5 = make_network(p = 4, q = qq, n_cat = nc, density = 0.4, seed = 42) + dat5 = generate_data(net5, n = n, seed = 42) + vt5 = c(rep("ordinal", 4), rep("continuous", qq)) + + tt = system.time(suppressWarnings( + bgm(dat5, variable_type = vt5, iter = n_iter, warmup = n_warmup, + chains = 1, cores = 1, edge_selection = FALSE, + display_progress = FALSE)))["elapsed"] + + cat(sprintf(" p=4 q=%2d : %5.2f ms/iter\n", qq, tt/n_iter*1000)) +} + +# --------------------------------------------------------------------------- +# E. Operation counts and expected complexity +# --------------------------------------------------------------------------- +cat("\n--- E. Complexity analysis ---\n") +cat("Per-iteration MH proposals for p=8, q=6:\n") + +mux_ops = sum(rep(2L, p)) # binary ordinal: 2 categories → 1 threshold each +muy_ops = q +kxx_ops = p * (p - 1) / 2 +kyy_ops = q * (q - 1) / 2 + q # off-diag + diag +kxy_ops = p * q + +cat(sprintf(" Main effects (mux): %3d proposals\n", mux_ops)) +cat(sprintf(" Continuous means: %3d proposals\n", muy_ops)) +cat(sprintf(" Kxx updates: %3d proposals\n", kxx_ops)) +cat(sprintf(" Kyy updates: %3d proposals (off-diag: %d, diag: %d)\n", + kyy_ops, q*(q-1)/2, q)) +cat(sprintf(" Kxy updates: %3d proposals\n", kxy_ops)) +cat(sprintf(" TOTAL: %3d proposals/iter\n", + mux_ops + muy_ops + kxx_ops + kyy_ops + kxy_ops)) + +# Edge selection adds: +es_ops = kxx_ops + q*(q-1)/2 + kxy_ops +cat(sprintf(" Edge selection: %3d proposals/iter (Kxx:%d + Kyy:%d + Kxy:%d)\n", + es_ops, kxx_ops, q*(q-1)/2, kxy_ops)) + +cat("\n===================================================================\n") +cat(" Done\n") +cat("===================================================================\n") diff --git a/dev/tests/validation/group9_profiling.R b/dev/tests/validation/group9_profiling.R new file mode 100644 index 00000000..c82b9ea1 --- /dev/null +++ b/dev/tests/validation/group9_profiling.R @@ -0,0 +1,323 @@ +# =========================================================================== +# GROUP 9: Performance profiling for the mixed MRF sampler +# =========================================================================== +# Benchmarks bgm() for mixed data across network sizes and sampler types. +# +# Measures: +# 1. Wall-clock time at several (p, q) grid points +# 2. Per-iteration cost (total / n_iter) +# 3. MH vs NUTS comparison +# 4. Marginal vs conditional PL comparison +# 5. Comparison with pure ordinal (OMRF) and pure continuous (GGM) models +# 6. Scaling curves: per-iteration cost vs p (fixing q) and vs q (fixing p) +# +# Usage: +# Rscript dev/tests/validation/group9_profiling.R +# =========================================================================== + +library(bgms) + +source("dev/tests/validation/helpers.R") + +out_dir = file.path("dev", "tests", "validation", "output") +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +cat("===================================================================\n") +cat(" GROUP 9: Performance Profiling\n") +cat(sprintf(" Started: %s\n", Sys.time())) +cat("===================================================================\n\n") + +# --------------------------------------------------------------------------- +# Configuration +# --------------------------------------------------------------------------- +n_obs = 300 # observations per dataset +n_iter = 500 # post-warmup iterations +n_warmup = 200 # warmup iterations +n_chains = 1 # single chain for timing consistency +seed = 2026 + +# Grid of (p, q) sizes for the mixed MRF +mixed_grid = data.frame( + p = c(3, 4, 6, 8, 10, 12), + q = c(2, 3, 4, 6, 8, 10) +) + +# --------------------------------------------------------------------------- +# Helper: time a single bgm() call +# --------------------------------------------------------------------------- +time_bgm = function(data, variable_type, pairwise_scale = 2.5, + iter = n_iter, warmup = n_warmup, ...) { + gc(verbose = FALSE) + t0 = proc.time() + fit = bgm( + x = data, + variable_type = variable_type, + pairwise_scale = pairwise_scale, + iter = iter, + warmup = warmup, + chains = n_chains, + cores = 1, + display_progress = FALSE, + ... + ) + elapsed = (proc.time() - t0)["elapsed"] + list(elapsed = unname(elapsed), fit = fit) +} + +# --------------------------------------------------------------------------- +# 1. Mixed MRF: wall-clock across (p, q) grid — MH, conditional PL +# --------------------------------------------------------------------------- +cat("--- 1. Mixed MRF wall-clock (MH, conditional PL) ---\n") + +mixed_results = data.frame( + p = integer(), q = integer(), elapsed = numeric(), + per_iter_ms = numeric(), stringsAsFactors = FALSE +) + +for(i in seq_len(nrow(mixed_grid))) { + p = mixed_grid$p[i] + q = mixed_grid$q[i] + n_cat = rep(2L, p) # binary ordinal for simplicity + + net = make_network(p = p, q = q, n_cat = n_cat, density = 0.4, seed = seed) + dat = generate_data(net, n = n_obs, seed = seed) + + vt = c(rep("ordinal", p), rep("continuous", q)) + + res = time_bgm(dat, variable_type = vt, + iter = n_iter, warmup = n_warmup) + + per_iter_ms = res$elapsed / n_iter * 1000 + + mixed_results = rbind(mixed_results, data.frame( + p = p, q = q, elapsed = round(res$elapsed, 2), + per_iter_ms = round(per_iter_ms, 2) + )) + + cat(sprintf(" p=%2d q=%2d : %.2fs total, %.2f ms/iter\n", + p, q, res$elapsed, per_iter_ms)) +} + +cat("\nMixed MRF timing summary (MH, conditional PL):\n") +print(mixed_results, row.names = FALSE) +cat("\n") + +# --------------------------------------------------------------------------- +# 2. Conditional vs Marginal PL comparison +# --------------------------------------------------------------------------- +cat("--- 2. Conditional vs Marginal PL comparison ---\n") + +pl_grid = data.frame(p = c(4, 8, 12), q = c(3, 6, 10)) +pl_results = data.frame( + p = integer(), q = integer(), + cond_ms = numeric(), marg_ms = numeric(), + ratio = numeric(), stringsAsFactors = FALSE +) + +for(i in seq_len(nrow(pl_grid))) { + p = pl_grid$p[i] + q = pl_grid$q[i] + n_cat = rep(2L, p) + + net = make_network(p = p, q = q, n_cat = n_cat, density = 0.4, seed = seed) + dat = generate_data(net, n = n_obs, seed = seed) + vt = c(rep("ordinal", p), rep("continuous", q)) + + res_cond = time_bgm(dat, variable_type = vt, + iter = n_iter, warmup = n_warmup, + pseudolikelihood = "conditional") + res_marg = time_bgm(dat, variable_type = vt, + iter = n_iter, warmup = n_warmup, + pseudolikelihood = "marginal") + + cond_ms = res_cond$elapsed / n_iter * 1000 + marg_ms = res_marg$elapsed / n_iter * 1000 + + pl_results = rbind(pl_results, data.frame( + p = p, q = q, + cond_ms = round(cond_ms, 2), + marg_ms = round(marg_ms, 2), + ratio = round(marg_ms / cond_ms, 2) + )) + + cat(sprintf(" p=%2d q=%2d : cond=%.2f ms/iter, marg=%.2f ms/iter (ratio=%.2fx)\n", + p, q, cond_ms, marg_ms, marg_ms / cond_ms)) +} + +cat("\nPL comparison:\n") +print(pl_results, row.names = FALSE) +cat("\n") + +# --------------------------------------------------------------------------- +# 3. MH vs NUTS (hybrid-nuts) comparison +# --------------------------------------------------------------------------- +cat("--- 3. MH vs hybrid-NUTS comparison ---\n") + +nuts_grid = data.frame(p = c(4, 8), q = c(3, 6)) +nuts_results = data.frame( + p = integer(), q = integer(), + mh_ms = numeric(), nuts_ms = numeric(), + ratio = numeric(), stringsAsFactors = FALSE +) + +for(i in seq_len(nrow(nuts_grid))) { + p = nuts_grid$p[i] + q = nuts_grid$q[i] + n_cat = rep(2L, p) + + net = make_network(p = p, q = q, n_cat = n_cat, density = 0.4, seed = seed) + dat = generate_data(net, n = n_obs, seed = seed) + vt = c(rep("ordinal", p), rep("continuous", q)) + + res_mh = time_bgm(dat, variable_type = vt, + iter = n_iter, warmup = n_warmup, + update_method = "adaptive-metropolis") + res_nuts = time_bgm(dat, variable_type = vt, + iter = n_iter, warmup = n_warmup, + update_method = "nuts") + + mh_ms = res_mh$elapsed / n_iter * 1000 + nuts_ms = res_nuts$elapsed / n_iter * 1000 + + nuts_results = rbind(nuts_results, data.frame( + p = p, q = q, + mh_ms = round(mh_ms, 2), + nuts_ms = round(nuts_ms, 2), + ratio = round(nuts_ms / mh_ms, 2) + )) + + cat(sprintf(" p=%2d q=%2d : MH=%.2f ms/iter, NUTS=%.2f ms/iter (ratio=%.2fx)\n", + p, q, mh_ms, nuts_ms, nuts_ms / mh_ms)) +} + +cat("\nMH vs NUTS:\n") +print(nuts_results, row.names = FALSE) +cat("\n") + +# --------------------------------------------------------------------------- +# 4. Cross-model comparison: Mixed vs pure OMRF vs pure GGM +# --------------------------------------------------------------------------- +cat("--- 4. Cross-model comparison (mixed vs OMRF vs GGM) ---\n") + +cross_sizes = c(4, 8, 12) +cross_results = data.frame( + size = integer(), + mixed_ms = numeric(), omrf_ms = numeric(), ggm_ms = numeric(), + stringsAsFactors = FALSE +) + +for(sz in cross_sizes) { + # Mixed: p = sz discrete, q = sz continuous + net = make_network(p = sz, q = sz, n_cat = rep(2L, sz), + density = 0.4, seed = seed) + dat_mixed = generate_data(net, n = n_obs, seed = seed) + vt_mixed = c(rep("ordinal", sz), rep("continuous", sz)) + + res_mixed = time_bgm(dat_mixed, variable_type = vt_mixed, + iter = n_iter, warmup = n_warmup) + + # Pure OMRF: 2*sz ordinal variables + dat_omrf = dat_mixed[, 1:sz, drop = FALSE] + vt_omrf = rep("ordinal", sz) + res_omrf = time_bgm(dat_omrf, variable_type = vt_omrf, + iter = n_iter, warmup = n_warmup) + + # Pure GGM: 2*sz continuous variables + dat_ggm = dat_mixed[, (sz + 1):(2 * sz), drop = FALSE] + res_ggm = time_bgm(dat_ggm, variable_type = rep("continuous", sz), + iter = n_iter, warmup = n_warmup) + + mixed_ms = res_mixed$elapsed / n_iter * 1000 + omrf_ms = res_omrf$elapsed / n_iter * 1000 + ggm_ms = res_ggm$elapsed / n_iter * 1000 + + cross_results = rbind(cross_results, data.frame( + size = sz, + mixed_ms = round(mixed_ms, 2), + omrf_ms = round(omrf_ms, 2), + ggm_ms = round(ggm_ms, 2) + )) + + cat(sprintf(" size=%2d : mixed=%.2f, omrf=%.2f, ggm=%.2f ms/iter\n", + sz, mixed_ms, omrf_ms, ggm_ms)) +} + +cat("\nCross-model comparison:\n") +print(cross_results, row.names = FALSE) +cat("\n") + +# --------------------------------------------------------------------------- +# 5. Scaling plots +# --------------------------------------------------------------------------- +cat("--- 5. Generating scaling plots ---\n") + +pdf_path = file.path(out_dir, "group9_profiling.pdf") +pdf(pdf_path, width = 10, height = 8) + +# Plot 1: Per-iteration cost vs total variables (p + q) +par(mfrow = c(2, 2), mar = c(4.5, 4.5, 3, 1)) + +plot(mixed_results$p + mixed_results$q, mixed_results$per_iter_ms, + type = "b", pch = 19, col = "steelblue", + xlab = "Total variables (p + q)", ylab = "ms / iteration", + main = "Mixed MRF: per-iteration cost vs network size", + log = "y") +grid() + +# Plot 2: Conditional vs Marginal PL +barplot_mat = t(as.matrix(pl_results[, c("cond_ms", "marg_ms")])) +colnames(barplot_mat) = sprintf("p=%d,q=%d", pl_results$p, pl_results$q) +barplot(barplot_mat, beside = TRUE, + col = c("steelblue", "coral"), + ylab = "ms / iteration", + main = "Conditional vs Marginal PL") +legend("topleft", legend = c("Conditional", "Marginal"), + fill = c("steelblue", "coral"), bty = "n") + +# Plot 3: MH vs NUTS +barplot_mat2 = t(as.matrix(nuts_results[, c("mh_ms", "nuts_ms")])) +colnames(barplot_mat2) = sprintf("p=%d,q=%d", nuts_results$p, nuts_results$q) +barplot(barplot_mat2, beside = TRUE, + col = c("steelblue", "seagreen"), + ylab = "ms / iteration", + main = "MH vs hybrid-NUTS") +legend("topleft", legend = c("MH", "hybrid-NUTS"), + fill = c("steelblue", "seagreen"), bty = "n") + +# Plot 4: Cross-model comparison +barplot_mat3 = t(as.matrix(cross_results[, c("mixed_ms", "omrf_ms", "ggm_ms")])) +colnames(barplot_mat3) = sprintf("size=%d", cross_results$size) +barplot(barplot_mat3, beside = TRUE, + col = c("steelblue", "coral", "seagreen"), + ylab = "ms / iteration", + main = "Mixed vs OMRF vs GGM") +legend("topleft", legend = c("Mixed", "OMRF", "GGM"), + fill = c("steelblue", "coral", "seagreen"), bty = "n") + +# Plot 5: Scaling curves — p vs cost (q fixed) and q vs cost (p fixed) +# Extract from mixed_results: fix q at smallest/middle value +par(mfrow = c(1, 2), mar = c(4.5, 4.5, 3, 1)) + +plot(mixed_results$p, mixed_results$per_iter_ms, + type = "b", pch = 19, col = "steelblue", + xlab = "p (discrete)", ylab = "ms / iteration", + main = "Per-iteration cost vs p") +grid() + +plot(mixed_results$q, mixed_results$per_iter_ms, + type = "b", pch = 19, col = "coral", + xlab = "q (continuous)", ylab = "ms / iteration", + main = "Per-iteration cost vs q") +grid() + +dev.off() + +cat(sprintf(" Plots saved to: %s\n", pdf_path)) + +# --------------------------------------------------------------------------- +# Summary +# --------------------------------------------------------------------------- +cat("\n===================================================================\n") +cat(" GROUP 9: Performance Profiling — COMPLETE\n") +cat(sprintf(" Finished: %s\n", Sys.time())) +cat("===================================================================\n") diff --git a/dev/tests/validation/helpers.R b/dev/tests/validation/helpers.R new file mode 100644 index 00000000..83a46d11 --- /dev/null +++ b/dev/tests/validation/helpers.R @@ -0,0 +1,405 @@ +# =========================================================================== +# Shared helpers for the mixed MRF validation test suite +# =========================================================================== +# Provides: +# - make_network() : generate reproducible true parameter sets +# - generate_data() : simulate data from true parameters via bgms or +# mixedGM +# - extract_bgms_blocks(): pull (mux, muy, Kxx, Kxy, Kyy) from bgms fit +# - extract_mgm_blocks() : pull (mux, muy, Kxx, Kxy, Kyy) from mixedGM fit +# - flatten_params() : flatten all blocks to a single named vector +# - recovery_table() : compare estimated vs true as a data.frame +# - recovery_scatter() : scatterplot of estimated vs true +# - summarise_recovery() : one-line correlation + bias + RMSE summary +# =========================================================================== + +# ------------------------------------------------------------------ +# make_network +# ------------------------------------------------------------------ +# Build a reproducible mixed MRF parameter set. +# +# @param p Number of discrete variables. +# @param q Number of continuous variables. +# @param n_cat Integer vector of length p: number of categories per +# discrete variable (bgms convention = max index, +# e.g. binary = 1). +# @param variable_type Character vector of length p: "ordinal" or +# "blume-capel" per discrete variable. Default: all +# ordinal. +# @param baseline_category Integer vector of length p: baseline category +# for Blume-Capel variables. Ignored for ordinal. +# Default: all zeros. +# @param density Approximate fraction of non-zero edges. +# @param seed Random seed for reproducibility. +# +# Returns: named list with mux, muy, Kxx, Kxy, Kyy, n_cat, p, q, +# variable_type, baseline_category. +# ------------------------------------------------------------------ +make_network = function(p, q, n_cat, variable_type = rep("ordinal", p), + baseline_category = rep(0L, p), + density = 0.5, seed = 42) { + set.seed(seed) + + max_cat = max(n_cat) + # BC variables use 2 columns (alpha, beta); ensure mux is wide enough + mux_cols = max(max_cat, 2L) + + # --- Main effects (mux) --- + # Ordinal: threshold parameters, NA-padded. + # Blume-Capel: alpha (linear) and beta (quadratic), rest NA. + mux = matrix(NA_real_, nrow = p, ncol = mux_cols) + for(i in seq_len(p)) { + if(variable_type[i] == "blume-capel") { + mux[i, 1] = round(runif(1, -0.3, 0.3), 2) # alpha + mux[i, 2] = round(runif(1, -0.4, -0.05), 2) # beta (negative = peaked) + } else { + vals = sort(round(seq(-0.5, 0.5, length.out = n_cat[i]), 2)) + if(n_cat[i] == 1) vals = round(runif(1, -0.3, 0.3), 2) + mux[i, seq_len(n_cat[i])] = vals + } + } + + # --- Continuous means --- + muy = round(runif(q, -0.5, 0.5), 2) + + # --- Kxx: ordinal-ordinal interactions (symmetric, zero diagonal) --- + n_edges_xx = p * (p - 1) / 2 + mask_xx = rbinom(n_edges_xx, 1, density) + vals_xx = mask_xx * round(runif(n_edges_xx, 0.15, 0.4) * sample(c(-1, 1), n_edges_xx, replace = TRUE), 2) + Kxx = matrix(0, p, p) + Kxx[upper.tri(Kxx)] = vals_xx + Kxx = Kxx + t(Kxx) + + # --- Kyy: continuous precision (positive definite, sparse off-diag with diagonal dominance) --- + n_edges_yy = q * (q - 1) / 2 + mask_yy = rbinom(n_edges_yy, 1, density) + vals_yy = mask_yy * round(runif(n_edges_yy, 0.05, 0.2) * sample(c(-1, 1), n_edges_yy, replace = TRUE), 2) + Kyy = matrix(0, q, q) + Kyy[upper.tri(Kyy)] = vals_yy + Kyy = Kyy + t(Kyy) + diag(Kyy) = abs(rowSums(Kyy)) + runif(q, 1.2, 1.8) + + # --- Kxy: ordinal-continuous cross interactions --- + n_cross = p * q + mask_xy = rbinom(n_cross, 1, density) + vals_xy = mask_xy * round(runif(n_cross, 0.1, 0.3) * sample(c(-1, 1), n_cross, replace = TRUE), 2) + Kxy = matrix(vals_xy, p, q) + + list( + mux = mux, muy = muy, + Kxx = Kxx, Kxy = Kxy, Kyy = Kyy, + n_cat = n_cat, p = p, q = q, + variable_type = variable_type, + baseline_category = as.integer(baseline_category) + ) +} + +# ------------------------------------------------------------------ +# generate_data +# ------------------------------------------------------------------ +# Simulate data from true network parameters. +# +# @param net Output from make_network(). +# @param n Number of observations. +# @param source "bgms" or "mixedGM". +# @param iter Gibbs burn-in iterations. +# @param seed Random seed. +# +# Returns: data.frame (n x (p+q)) with ordinal columns first, then continuous. +# ------------------------------------------------------------------ +generate_data = function(net, n, source = "bgms", iter = 1000L, seed = 1) { + if(source == "bgms") { + # simulate_mrf() does not support mixed types; use the C++ Gibbs + # sampler directly via sample_mixed_mrf_gibbs(). + sim = bgms:::sample_mixed_mrf_gibbs( + num_states = as.integer(n), + Kxx_r = net$Kxx, + Kxy_r = net$Kxy, + Kyy_r = net$Kyy, + mux_r = net$mux, + muy_r = net$muy, + num_categories_r = as.integer(net$n_cat), + variable_type_r = net$variable_type, + baseline_category_r = net$baseline_category, + iter = as.integer(iter), + seed = as.integer(seed) + ) + df = as.data.frame(cbind(sim$x, sim$y)) + names(df) = c(paste0("X", seq_len(net$p)), paste0("Y", seq_len(net$q))) + df + + } else if(source == "mixedGM") { + sim = mixedGM::mixed_gibbs_generate( + n = n, + Kxx = net$Kxx, Kxy = net$Kxy, Kyy = net$Kyy, + mux = net$mux, muy = net$muy, + num_categories = net$n_cat + 1L, + n_burnin = iter + ) + df = as.data.frame(cbind(sim$x, sim$y)) + names(df) = c(paste0("X", seq_len(net$p)), paste0("Y", seq_len(net$q))) + df + } +} + +# ------------------------------------------------------------------ +# extract_bgms_blocks +# ------------------------------------------------------------------ +# Extract parameter blocks from a bgms fit object. +# +# @param fit A bgms object. +# @param net The true network (for dimension reference). +# +# Returns: list(mux, muy, Kxx, Kxy, Kyy). +# ------------------------------------------------------------------ +extract_bgms_blocks = function(fit, net) { + pm = coef(fit) + mux = pm$main$discrete # p x max_cat + muy_vec = pm$main$continuous[, "mean"] # length q + Kyy_diag = pm$main$continuous[, "precision"] # length q + + pw = pm$pairwise # (p+q) x (p+q) + p = net$p; q = net$q + Kxx = pw[seq_len(p), seq_len(p)] + Kxy = pw[seq_len(p), p + seq_len(q)] + Kyy_off = pw[p + seq_len(q), p + seq_len(q)] + Kyy = Kyy_off + diag(Kyy) = Kyy_diag + + list(mux = mux, muy = muy_vec, Kxx = Kxx, Kxy = Kxy, Kyy = Kyy) +} + +# ------------------------------------------------------------------ +# extract_mgm_blocks +# ------------------------------------------------------------------ +# Extract posterior means from a mixedGM fit object. +# +# @param fit Output of mixedGM::mixed_sampler(). +# @param n_cat Integer vector of length p: number of categories per ordinal +# variable (bgms convention). Used to NA-pad unused threshold +# slots so flatten_params() produces matching lengths. +# +# Returns: list(mux, muy, Kxx, Kxy, Kyy). +# ------------------------------------------------------------------ +extract_mgm_blocks = function(fit, n_cat) { + mux = apply(fit$samples$mux, c(2, 3), mean) + for(i in seq_along(n_cat)) { + if(n_cat[i] < ncol(mux)) { + mux[i, (n_cat[i] + 1):ncol(mux)] = NA_real_ + } + } + list( + mux = mux, + muy = colMeans(fit$samples$muy), + Kxx = apply(fit$samples$Kxx, c(2, 3), mean), + Kxy = apply(fit$samples$Kxy, c(2, 3), mean), + Kyy = apply(fit$samples$Kyy, c(2, 3), mean) + ) +} + +# ------------------------------------------------------------------ +# flatten_params +# ------------------------------------------------------------------ +# Flatten parameter blocks to a single named vector for comparison. +# Excludes NA entries in mux. +# +# @param blocks list(mux, muy, Kxx, Kxy, Kyy). +# @param prefix Optional prefix for names. +# +# Returns: named numeric vector. +# ------------------------------------------------------------------ +flatten_params = function(blocks, prefix = "") { + mux_vals = as.vector(t(blocks$mux)) + mux_keep = !is.na(mux_vals) + mux_named = mux_vals[mux_keep] + names(mux_named) = paste0(prefix, "mux_", which(mux_keep)) + + muy_named = blocks$muy + names(muy_named) = paste0(prefix, "muy_", seq_along(muy_named)) + + # Kxx upper triangle + kxx_ut = blocks$Kxx[upper.tri(blocks$Kxx)] + names(kxx_ut) = paste0(prefix, "Kxx_", seq_along(kxx_ut)) + + # Kxy full + kxy_vals = as.vector(blocks$Kxy) + names(kxy_vals) = paste0(prefix, "Kxy_", seq_along(kxy_vals)) + + # Kyy upper triangle (includes diagonal) + kyy_ut = blocks$Kyy[upper.tri(blocks$Kyy, diag = TRUE)] + names(kyy_ut) = paste0(prefix, "Kyy_", seq_along(kyy_ut)) + + c(mux_named, muy_named, kxx_ut, kxy_vals, kyy_ut) +} + +# ------------------------------------------------------------------ +# recovery_table +# ------------------------------------------------------------------ +# Build a data.frame comparing true vs estimated parameters. +# +# @param true_blocks list(mux, muy, Kxx, Kxy, Kyy). +# @param est_blocks list(mux, muy, Kxx, Kxy, Kyy). +# @param label Character label for the method. +# +# Returns: data.frame with columns: parameter, true, estimate, diff, block, method. +# ------------------------------------------------------------------ +recovery_table = function(true_blocks, est_blocks, label = "estimate") { + true_flat = flatten_params(true_blocks) + est_flat = flatten_params(est_blocks) + + # Determine block membership + block = ifelse(grepl("^mux", names(true_flat)), "mux", + ifelse(grepl("^muy", names(true_flat)), "muy", + ifelse(grepl("^Kxx", names(true_flat)), "Kxx", + ifelse(grepl("^Kxy", names(true_flat)), "Kxy", "Kyy")))) + + data.frame( + parameter = names(true_flat), + true = true_flat, + estimate = est_flat, + diff = est_flat - true_flat, + block = block, + method = label, + stringsAsFactors = FALSE, + row.names = NULL + ) +} + +# ------------------------------------------------------------------ +# recovery_scatter +# ------------------------------------------------------------------ +# Scatterplot of estimated vs true, coloured by block. +# +# @param tab Output of recovery_table() (possibly rbind of multiple). +# @param main Plot title. +# ------------------------------------------------------------------ +recovery_scatter = function(tab, main = "Parameter recovery") { + block_cols = c(mux = "#E41A1C", muy = "#377EB8", Kxx = "#4DAF4A", + Kxy = "#984EA3", Kyy = "#FF7F00") + rng = range(c(tab$true, tab$estimate), na.rm = TRUE) + rng = rng + diff(rng) * c(-0.05, 0.05) + + plot(tab$true, tab$estimate, pch = 19, cex = 0.9, + col = adjustcolor(block_cols[tab$block], 0.7), + xlim = rng, ylim = rng, asp = 1, + xlab = "True value", ylab = "Posterior mean", + main = main) + abline(0, 1, lty = 2, col = "grey40") + + r = cor(tab$true, tab$estimate) + rmse = sqrt(mean(tab$diff^2)) + legend("topleft", + legend = c(names(block_cols), + sprintf("r = %.3f", r), + sprintf("RMSE = %.3f", rmse)), + col = c(block_cols, NA, NA), + pch = c(rep(19, 5), NA, NA), + bty = "n", cex = 0.8) +} + +# ------------------------------------------------------------------ +# summarise_recovery +# ------------------------------------------------------------------ +# Print a one-line summary of recovery quality. +# +# @param tab Output of recovery_table(). +# @param label String label. +# +# Returns: invisible data.frame with summary stats. +# ------------------------------------------------------------------ +summarise_recovery = function(tab, label = "") { + r = cor(tab$true, tab$estimate) + bias = mean(tab$diff) + rmse = sqrt(mean(tab$diff^2)) + max_diff = max(abs(tab$diff)) + cat(sprintf("[%s] r = %.4f | bias = %.4f | RMSE = %.4f | max|diff| = %.4f\n", + label, r, bias, rmse, max_diff)) + + # Per-block summary + blocks = unique(tab$block) + block_summary = do.call(rbind, lapply(blocks, function(b) { + sub = tab[tab$block == b, ] + r_val = if(nrow(sub) >= 3 && sd(sub$true) > 0 && sd(sub$estimate) > 0) + cor(sub$true, sub$estimate) else NA_real_ + data.frame( + block = b, + n = nrow(sub), + r = r_val, + bias = mean(sub$diff), + rmse = sqrt(mean(sub$diff^2)), + max_diff = max(abs(sub$diff)), + stringsAsFactors = FALSE + ) + })) + + cat(" Per-block breakdown:\n") + print(block_summary, row.names = FALSE) + invisible(block_summary) +} + +# ------------------------------------------------------------------ +# agreement_scatter +# ------------------------------------------------------------------ +# Scatterplot of method A vs method B estimates, coloured by block. +# +# @param tab_a recovery_table for method A. +# @param tab_b recovery_table for method B. +# @param label_a, label_b Axis labels. +# @param main Plot title. +# ------------------------------------------------------------------ +agreement_scatter = function(tab_a, tab_b, label_a = "Method A", + label_b = "Method B", main = "Agreement") { + block_cols = c(mux = "#E41A1C", muy = "#377EB8", Kxx = "#4DAF4A", + Kxy = "#984EA3", Kyy = "#FF7F00") + rng = range(c(tab_a$estimate, tab_b$estimate), na.rm = TRUE) + rng = rng + diff(rng) * c(-0.05, 0.05) + + plot(tab_a$estimate, tab_b$estimate, pch = 19, cex = 0.9, + col = adjustcolor(block_cols[tab_a$block], 0.7), + xlim = rng, ylim = rng, asp = 1, + xlab = label_a, ylab = label_b, main = main) + abline(0, 1, lty = 2, col = "grey40") + + r = cor(tab_a$estimate, tab_b$estimate) + rmse = sqrt(mean((tab_a$estimate - tab_b$estimate)^2)) + legend("topleft", + legend = c(names(block_cols), + sprintf("r = %.3f", r), + sprintf("RMSE = %.3f", rmse)), + col = c(block_cols, NA, NA), + pch = c(rep(19, 5), NA, NA), + bty = "n", cex = 0.8) +} + +# ------------------------------------------------------------------ +# trace_panel +# ------------------------------------------------------------------ +# Plot trace + density panels for selected parameters from raw samples. +# +# @param samples Matrix of MCMC samples (iterations x parameters). +# @param names Column names to plot. +# @param true_vals Optional named vector of true values. +# @param main Overall title. +# ------------------------------------------------------------------ +trace_panel = function(samples, names = NULL, true_vals = NULL, main = "") { + if(is.null(names)) names = colnames(samples)[seq_len(min(6, ncol(samples)))] + n_par = length(names) + par(mfrow = c(n_par, 2), mar = c(3, 3, 2, 1), mgp = c(2, 0.6, 0)) + for(nm in names) { + vals = samples[, nm] + # Trace + plot(vals, type = "l", col = adjustcolor("grey30", 0.5), + main = paste(nm, "trace"), xlab = "Iteration", ylab = nm, cex.main = 0.9) + if(!is.null(true_vals) && nm %in% names(true_vals)) { + abline(h = true_vals[nm], col = "red", lwd = 2) + } + abline(h = mean(vals), col = "steelblue", lwd = 1.5) + # Density + d = density(vals) + plot(d, main = paste(nm, "density"), xlab = nm, cex.main = 0.9) + if(!is.null(true_vals) && nm %in% names(true_vals)) { + abline(v = true_vals[nm], col = "red", lwd = 2) + } + abline(v = mean(vals), col = "steelblue", lwd = 1.5) + } +} diff --git a/dev/tests/validation/output/group1_parameter_recovery.pdf b/dev/tests/validation/output/group1_parameter_recovery.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f05ed1f38f57530ae226a3e390ca24d7e2e2f267 GIT binary patch literal 20189 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 literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group2_mh_vs_nuts.pdf b/dev/tests/validation/output/group2_mh_vs_nuts.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7366b75e018be7d6f4d31c4ac94369b4b6af6b0d GIT binary patch literal 26158 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

    MMrtbvN@i(geyvhO1tgcXcCvo0rp{GyAgQ3G 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

    Ab2Yr#9HkfPk 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 z
    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%0D`ga2rRCf#$Z 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 R?Zg;GaB@F;? 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�G{UmY>16?`meDt~zD^kHQcD_tZ~$%ZHO7 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≶SLL!#Ypufc1LcI!&I&LSf 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�A!cN*^NKXDa2nAT064atW5 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 z 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

    l!Kfl;Tf2K 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⪙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 z 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 R{*w`(02Tv-tePCw{{aupHzEK4 literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group3_cond_vs_marg.pdf b/dev/tests/validation/output/group3_cond_vs_marg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4971dc89285501042b4464eb95a69377b0159691 GIT binary patch literal 22709 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

    ??M+-t<7(Ay^gLXMMHuFa!`VQkS!){MS6 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�pNbp+tz>ftZ;-A1QPD2fditA!(uT2>yr-iv;!+D zLELc!3JHuvKs+f#G6s*qk~v_CiVznffF~u9aA1h57wQ7g1J9md|+|x~|@Us!$0-tUQ35YqxnY_tC zr5gc_ath@RObHMdn|0Y5qmRK~z>slh6bIyIUBL8;Zs(+K3XuOt0-))q7yh>da+*ZE z%m0<-AAakvAM&T%0g$gJz)*Q*D14iq+LSw6)B0}*m^>5;-R`hmfo&D)m!RSR%Da_e zdu4xWAUfdozZ^C*Y;*AO!eBW7`G?>DGXGe>2qh&2B`_BJ%LWGo9en{4e%W9MK)e0R z22(*O0~+u*o3auxrQd8wg+Iq3|A+^L!s%M^U%r41`MV7cLnr|t+kcIN!;p0S_-`8= z`bRuC97b22zm5CzyTO5hf8>S35!>oQ_Cn!+d*=XJ7z{DT`C)*Xf*}S3ED;dfn}XMj gNF;;lr_AP=N+P4Y$eY!N!xdmq4k;-e6J3t~0joK#$p8QV literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group3_diff_distributions.pdf b/dev/tests/validation/output/group3_diff_distributions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04f44b3e8007e87965661cefdac5d5ae48bff6ff GIT binary patch literal 6353 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 Z_a8DM2}vM*pEOKf4h9kt(K6Bo{SWHD>y7{b literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group4_cross_package.pdf b/dev/tests/validation/output/group4_cross_package.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2943924badf3c44023b84c0bea60fc9c696c1a32 GIT binary patch literal 19697 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�W!=W;N(07KQ-NmkW5>V{r* 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 literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group6_autocorrelation.pdf b/dev/tests/validation/output/group6_autocorrelation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a823c9929831fe2b1c689ecd481d69913b62e0b GIT binary patch literal 12977 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%0AV?8@mnqshTLMnQe-2w1o6+So`>wODy@ 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 literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group6_diagnostics.pdf b/dev/tests/validation/output/group6_diagnostics.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16acbeb78f60293c83bda02d02a9a8faecbcae95 GIT binary patch literal 522914 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�i0-?G6vv)Asd;eqLwbG84ebu+ZQjwxoBZ_E}p5l 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

    ?34^!AaOD@^<7w9$KhC)d;oCw( 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%0Atg(kY) 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

    5e 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 Nk3~-}E-!)ge*k^Iek=e0 literal 0 HcmV?d00001 diff --git a/dev/tests/validation/output/group9_profiling.pdf b/dev/tests/validation/output/group9_profiling.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6a91a781732703eaf34a72ad355d3dd722532be GIT binary patch literal 7965 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

    U5Mm&$t z3#+MWon^bRo^A4srzmVK$8p7G1&F^`Pe!L!lWpwGe8lEWB`8T<&}#jP2~AO9XDEL@ zE`+1CdmAjzClOTBlITY6%eWb0*p@uUbc^PCU?EcgBa>oov?LSz8x7Tmo+xJ>t2kT1Rlz+R zrx42383QjUyY)hGlxIDPuEYJ6JzA=o#)r{|*@r?Yjusn%He)bzOuRtK7t<+j+D&B%?-_) z)-HdL{cyFY^uy<8UeCUM&>5NhpfNJ@TzZ5!GCWfA{QmRV;TxzYs1TP=cfY)sFaC4 z^DceO>sE)2YsFg4k+Ul{1M|_D*cE2a;%w?XjMynINf95b?)*M!`^|Q? zu6WsFfQWIzbk$5D?hj|)<+E>YZ5sO-9Gn;YHm46h^u9&vec9+&%IHoSgsWr5eN`nd zg%S_N&%2`&tyW)r#}7F;3UpI-qkHnaI(H6sE-uH`t<|~PuEX*%v^CJ0MvTdQ*!?)4 z;A3(IB15KTLRU!PbEl%^n*&a_M{f(1(wB~*oxbaQzk+R_8fa+u84O=wSu)+g%~}q~ zP1Jn2|88Ig8#;T%ztTVcm+UX@GuCIO13m{lztPo_7)ZSNG@Ih)hnozfhJbpj3cs6{ z-P`Z+4Lfwp7nbjb1`P%bZshF0iD^p;CGy2lGh8U8_UDAN7&E?a4yd>54oadZ6=)Rb z5!iyJK(%wd^VsrOa?|qeba{3??$Sb(*jskqjv9_&X(x0c7V{R<7796z#HQ=qlv}Um z$j=`MEUJ4&ONfo$N^d$iVD1o37uIBcA1M_n9=WBElTO*cI~0&#rCV5w-jvv6$)v(k zVIOV111%d0)m=^$QPJ_xpUG5CS;#bb_|2?^-RweU;Zfmeev`ok{i&?)S5z)Hs*oo? zd~(lBi>ZM67+fX20}ij~t%$04+LNBVVJj<4!z_bTn}{xN=zvTNj0Chp%Ws2I7n4jA zb}q{)?rUYbXG&u2>L$MF_lSHW?lj*Hv~GpHx5>77Rc(jQUw(IFK3J4r>}|PTDq*eC z)QRm2tO}_@x%dMsCB#6!brOy+!-p2{Q*+Dq{MK!v*`m}t{N=R~+|sxv`ju|Et~HnK1Pp0ZRkcPW=l05EN0zu1KP7y#d(+x8>*+uIu@ha4Ev!lAJsU0*&g-9cu(8*6Gu-FFtGG&{(*ewt zsw(d(%bM+s!iU5m;f=U;-fI^AIj+So zdy(pxPm%HxrBXOgcs)o7w#k(#=erPfoH%URSen_u?zS=X_Q%8db>lJYj8-jwV|T;h zip5dMat#hMFl~k7Al7`!9BPa@PTlABgPfGX)&MHk)>IU??OKDC5YuHM*O9+={a&x| zAHq9A`k_05Q<`0ui6Wruw+}pjXpbhO6n0#{`pfpX_tV7vX3rmBNj4>!pSHU{hD+1# zJZm2RHMEJ`!jJEsSaOv*-cEjP?2nrhUw8f0@Z>&=blq0j*467z{8kP*cfW2H#u#S# zk?)7>9RGuROZ|1O_peEsI)*f~LSaawv{T;tpEpYs<|YP*`U9W=K~av5NYeQ1bUtPS zfXIMcQ5XUapdbsnN5JBdXrv>ahBOicIbcZ>KO7DP06DqCJxC-Mjv$PM@4EcUMhl7dK;lsdI1T8Jx&VHc^slqW-*V#rBLj){pH}{F z8N^kwXovqPji)=(kwy|A1)-7r^8v`p$Vkfo907k~VA2 0) { + cat("\n Generated plots:\n") + for(f in pdfs) cat(sprintf(" %s\n", f)) +} diff --git a/man/bgm.Rd b/man/bgm.Rd index e9ead76c..c31b6bc5 100644 --- a/man/bgm.Rd +++ b/man/bgm.Rd @@ -203,14 +203,21 @@ matrices, and access to raw MCMC draws. The object can be passed to Main components include: \itemize{ \item \code{posterior_summary_main}: Data frame with posterior summaries - (mean, sd, MCSE, ESS, Rhat) for category threshold parameters. + (mean, sd, MCSE, ESS, Rhat) for main-effect parameters. + For OMRF models these are category thresholds; for GGM models + these are precision matrix diagonal entries (quadratic effects); + for mixed MRF models these include both discrete thresholds and + continuous means and precisions. \item \code{posterior_summary_pairwise}: Data frame with posterior summaries for pairwise interaction parameters. \item \code{posterior_summary_indicator}: Data frame with posterior summaries for edge inclusion indicators (if \code{edge_selection = TRUE}). - \item \code{posterior_mean_main}: Matrix of posterior mean thresholds - (rows = variables, cols = categories or parameters). + \item \code{posterior_mean_main}: Posterior mean of per-variable + parameters. For OMRF: a matrix (p x max_categories) of category + thresholds. For GGM: a (p x 1) matrix of precision diagonal entries + (quadratic effects, not main effects). For mixed MRF: a list with + \code{$discrete} and \code{$continuous} components. \item \code{posterior_mean_pairwise}: Symmetric matrix of posterior mean pairwise interaction strengths. \item \code{posterior_mean_indicator}: Symmetric matrix of posterior mean diff --git a/man/coef.bgms.Rd b/man/coef.bgms.Rd index ae663fdc..3a7c9884 100644 --- a/man/coef.bgms.Rd +++ b/man/coef.bgms.Rd @@ -14,13 +14,18 @@ \value{ A list with the following components: \describe{ - \item{main}{Posterior mean of the category threshold parameters.} + \item{main}{Posterior mean of the main-effect parameters. For GGM models + this contains the precision matrix diagonal (quadratic effects, not main + effects). For OMRF models this is a numeric matrix (p x max_categories) + of category thresholds. For mixed MRF models this is a list with + `$discrete` (p x max_categories matrix) and `$continuous` (q x 2 matrix + with columns "mean" and "precision").} \item{pairwise}{Posterior mean of the pairwise interaction matrix.} \item{indicator}{Posterior mean of the edge inclusion indicators (if available).} } } \description{ -Returns the posterior mean thresholds, pairwise effects, and edge inclusion indicators from a \code{bgms} model fit. +Returns the posterior mean main effects, pairwise effects, and edge inclusion indicators from a \code{bgms} model fit. } \examples{ \donttest{ diff --git a/man/extract_arguments.Rd b/man/extract_arguments.Rd index f4212df3..93121f4a 100644 --- a/man/extract_arguments.Rd +++ b/man/extract_arguments.Rd @@ -28,6 +28,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_category_thresholds.Rd b/man/extract_category_thresholds.Rd index ef1b7bf2..00a15c20 100644 --- a/man/extract_category_thresholds.Rd +++ b/man/extract_category_thresholds.Rd @@ -11,19 +11,20 @@ extract_category_thresholds(bgms_object) or `bgmCompare` (from [bgmCompare()]).} } \value{ -\describe{ - \item{bgms}{A matrix with one row per variable and one column per - category threshold, containing posterior means.} - \item{bgmCompare}{A matrix with one row per post-warmup iteration, - containing posterior samples of baseline threshold parameters.} - } +See [extract_main_effects()] for details. } \description{ -Retrieves category threshold parameters from a model fitted with -[bgm()] or [bgmCompare()]. +`r lifecycle::badge("deprecated")` + +`extract_category_thresholds()` was renamed to [extract_main_effects()] to +reflect that main effects include continuous means and precisions +(mixed MRF), not only category thresholds. +} +\details{ +Extract Category Threshold Estimates } \seealso{ -[bgm()], [bgmCompare()], [extract_pairwise_interactions()] +[extract_main_effects()] Other extractors: \code{\link{extract_arguments}()}, @@ -31,6 +32,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_ess.Rd b/man/extract_ess.Rd index de2c1f8c..0240f2c0 100644 --- a/man/extract_ess.Rd +++ b/man/extract_ess.Rd @@ -27,6 +27,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_group_params.Rd b/man/extract_group_params.Rd index 1d4ca459..11356f70 100644 --- a/man/extract_group_params.Rd +++ b/man/extract_group_params.Rd @@ -20,7 +20,7 @@ parameters and group differences from a model fitted with [bgmCompare()]. } \seealso{ [bgmCompare()], [extract_pairwise_interactions()], - [extract_category_thresholds()] + [extract_main_effects()] Other extractors: \code{\link{extract_arguments}()}, @@ -28,6 +28,7 @@ Other extractors: \code{\link{extract_ess}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_indicator_priors.Rd b/man/extract_indicator_priors.Rd index bba68c32..2e8b5ee1 100644 --- a/man/extract_indicator_priors.Rd +++ b/man/extract_indicator_priors.Rd @@ -35,6 +35,7 @@ Other extractors: \code{\link{extract_ess}()}, \code{\link{extract_group_params}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_indicators.Rd b/man/extract_indicators.Rd index 41b1cc81..605c739b 100644 --- a/man/extract_indicators.Rd +++ b/man/extract_indicators.Rd @@ -34,6 +34,7 @@ Other extractors: \code{\link{extract_ess}()}, \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, diff --git a/man/extract_main_effects.Rd b/man/extract_main_effects.Rd new file mode 100644 index 00000000..6d6e5657 --- /dev/null +++ b/man/extract_main_effects.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/extractor_functions.R +\name{extract_main_effects} +\alias{extract_main_effects} +\title{Extract Main Effect Estimates} +\usage{ +extract_main_effects(bgms_object) +} +\arguments{ +\item{bgms_object}{A fitted model object of class `bgms` (from [bgm()]) +or `bgmCompare` (from [bgmCompare()]).} +} +\value{ +The structure depends on the model type: + \describe{ + \item{GGM (bgms)}{`NULL` (invisibly). GGM models have no main effects; + the precision matrix diagonal contains quadratic effects, accessible + via `$posterior_mean_main`.} + \item{OMRF (bgms)}{A numeric matrix with one row per variable and one + column per category threshold, containing posterior means. Columns + beyond the number of categories for a variable are `NA`.} + \item{Mixed MRF (bgms)}{A list with two elements: + \describe{ + \item{discrete}{A numeric matrix (p rows x max_categories columns) + of posterior mean thresholds for discrete variables.} + \item{continuous}{A numeric matrix (q rows x 2 columns) with + columns `"mean"` and `"precision"` for continuous variables.} + }} + \item{bgmCompare}{A matrix with one row per post-warmup iteration, + containing posterior samples of baseline main-effect parameters.} + } +} +\description{ +Retrieves posterior mean main-effect parameters from a model fitted with +[bgm()] or [bgmCompare()]. For OMRF models these are category thresholds; +for mixed MRF models these include both discrete thresholds and continuous +means and precisions. GGM models have no main effects (the precision +diagonal represents quadratic effects) and return `NULL`. +} +\details{ +Extract Main Effect Estimates +} +\examples{ +\donttest{ +fit = bgm(x = Wenchuan[, 1:3]) +extract_main_effects(fit) +} + +} +\seealso{ +[bgm()], [bgmCompare()], [extract_pairwise_interactions()], + [extract_category_thresholds()] + +Other extractors: +\code{\link{extract_arguments}()}, +\code{\link{extract_category_thresholds}()}, +\code{\link{extract_ess}()}, +\code{\link{extract_group_params}()}, +\code{\link{extract_indicator_priors}()}, +\code{\link{extract_indicators}()}, +\code{\link{extract_pairwise_interactions}()}, +\code{\link{extract_posterior_inclusion_probabilities}()}, +\code{\link{extract_rhat}()}, +\code{\link{extract_sbm}()} +} +\concept{extractors} diff --git a/man/extract_pairwise_interactions.Rd b/man/extract_pairwise_interactions.Rd index 70e02886..cba1a1a0 100644 --- a/man/extract_pairwise_interactions.Rd +++ b/man/extract_pairwise_interactions.Rd @@ -24,7 +24,7 @@ Retrieves posterior samples of pairwise interaction parameters from a model fitted with [bgm()] or [bgmCompare()]. } \seealso{ -[bgm()], [bgmCompare()], [extract_category_thresholds()] +[bgm()], [bgmCompare()], [extract_main_effects()] Other extractors: \code{\link{extract_arguments}()}, @@ -33,6 +33,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()}, \code{\link{extract_sbm}()} diff --git a/man/extract_pairwise_thresholds.Rd b/man/extract_pairwise_thresholds.Rd index f6a8920f..58e0b330 100644 --- a/man/extract_pairwise_thresholds.Rd +++ b/man/extract_pairwise_thresholds.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/extractor_functions.R \name{extract_pairwise_thresholds} \alias{extract_pairwise_thresholds} -\title{Deprecated: Use extract_category_thresholds instead} +\title{Deprecated: Use extract_main_effects instead} \usage{ extract_pairwise_thresholds(bgms_object) } @@ -10,6 +10,6 @@ extract_pairwise_thresholds(bgms_object) \item{bgms_object}{A bgms or bgmCompare object.} } \description{ -Deprecated: Use extract_category_thresholds instead +Deprecated: Use extract_main_effects instead } \keyword{internal} diff --git a/man/extract_posterior_inclusion_probabilities.Rd b/man/extract_posterior_inclusion_probabilities.Rd index 059232f1..2d4843d0 100644 --- a/man/extract_posterior_inclusion_probabilities.Rd +++ b/man/extract_posterior_inclusion_probabilities.Rd @@ -35,6 +35,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_rhat}()}, \code{\link{extract_sbm}()} diff --git a/man/extract_rhat.Rd b/man/extract_rhat.Rd index b923c584..f6633562 100644 --- a/man/extract_rhat.Rd +++ b/man/extract_rhat.Rd @@ -28,6 +28,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_sbm}()} diff --git a/man/extract_sbm.Rd b/man/extract_sbm.Rd index 987153b7..04cb0414 100644 --- a/man/extract_sbm.Rd +++ b/man/extract_sbm.Rd @@ -30,6 +30,7 @@ Other extractors: \code{\link{extract_group_params}()}, \code{\link{extract_indicator_priors}()}, \code{\link{extract_indicators}()}, +\code{\link{extract_main_effects}()}, \code{\link{extract_pairwise_interactions}()}, \code{\link{extract_posterior_inclusion_probabilities}()}, \code{\link{extract_rhat}()} diff --git a/paper/paper.bib b/paper/paper.bib new file mode 100644 index 00000000..ba89c61a --- /dev/null +++ b/paper/paper.bib @@ -0,0 +1,105 @@ +@manual{bgms-package, + title = {bgms: Bayesian Analysis of Graphical Models}, + author = {Marsman, Maarten and {van den Bergh}, Don}, + year = {2026}, + note = {R package version 0.1.6.4}, + url = {https://CRAN.R-project.org/package=bgms} +} + +@article{ContrerasEtAl_2019, + author = {Contreras, A. and Nieto, I. and Valiente, C. and Espinosa, R. and Vazquez, C.}, + doi = {10.1159/000497425}, + journal = {Psychotherapy and Psychosomatics}, + number = {2}, + pages = {71--83}, + title = {The study of psychopathology from the network analysis perspective: A systematic review}, + volume = {88}, + year = {2019} +} + +@article{HuthEtAl_2023_intro, + author = {Huth, K. and {de Ron}, J. and Goudriaan, A. E. and Luigjes, K. and Mohammadi, R. and {van Holst}, R. J. and Wagenmakers, E.-J. and Marsman, M.}, + journal = {Advances in Methods and Practices in Psychological Science}, + title = {Bayesian analysis of cross-sectional networks: A tutorial in R and JASP}, + volume = {6}, + pages = {1--18}, + doi = {10.1177/25152459231193334}, + year = {2023} +} + +@book{KindermannSnell1980, + address = {Providence}, + author = {Kindermann, R. and Snell, J. L.}, + publisher = {American Mathematical Society}, + series = {Contemporary Mathematics}, + title = {Markov Random Fields and their Applications}, + volume = {1}, + year = {1980} +} + +@book{Lauritzen2004, + address = {Oxford}, + author = {Lauritzen, S. L.}, + publisher = {Oxford University Press}, + title = {Graphical Models}, + year = {2004} +} + +@article{MarsmanVandenBerghHaslbeck_2025, + author = {Marsman, M. and {van den} Bergh, D. and Haslbeck, J. M. B.}, + doi = {10.1017/psy.2024.4}, + journal = {Psychometrika}, + number = {1}, + pages = {146--182}, + title = {Bayesian analysis of the ordinal Markov random field}, + volume = {90}, + year = {2025} +} + +@article{MarsmanWaldorpSekulovskiHaslbeck_2024, + author = {Marsman, M. and Waldorp, L. J. and Sekulovski, N. and Haslbeck, J. M. B.}, + doi = {10.1017/psy.2025.10060}, + journal = {Psychometrika}, + number = {5}, + pages = {1809--1842}, + title = {Bayes factor tests for group differences in ordinal and binary graphical models}, + volume = {90}, + year = {2025} +} + +@article{RobinaughEtAl_2020, + author = {Robinaugh, D. J. and Hoekstra, R. H. A. and Toner, E. R. and Borsboom, D.}, + doi = {10.1017/S0033291719003404}, + journal = {Psychological Medicine}, + pages = {353--366}, + title = {The network approach to psychopathology: A review of the literature 2008--2018 and an agenda for future research}, + volume = {50}, + year = {2020} +} + +@article{SekulovskiEtAl_2024, + author = {Sekulovski, N. and Keetelaar, S. and Huth, K. B. S. and Wagenmakers, Eric-Jan and {van }Bork, R. and {van den }Bergh, D. and Marsman, M.}, + doi = {10.1080/00273171.2024.2345915}, + journal = {Multivariate Behavioral Research}, + pages = {913--933}, + title = {Testing conditional independence in psychometric networks: An analysis of three Bayesian methods}, + volume = {59}, + year = {2024} +} + +@article{SekulovskiEtAl_2025, + author = {Sekulovski, N. and Arena, G. and Haslbeck, J. M. B. and Huth, K. B. S. and Friel, N. and Marsman, M.}, + journal = {PsyArXiv}, + title = {A stochastic block prior for clustering in graphical models}, + note = {OSF preprint}, + url = {https://osf.io/preprints/psyarxiv/29p3m_v1}, + year = {2025} +} + +@misc{bgms-archive, + title = {bgms software archive}, + author = {Marsman, Maarten and {van den Bergh}, Don}, + year = {2026}, + note = {Replace with archived release DOI (e.g., Zenodo) after acceptance}, + url = {https://github.com/Bayesian-Graphical-Modelling-Lab/bgms} +} diff --git a/paper/paper.md b/paper/paper.md new file mode 100644 index 00000000..c5461868 --- /dev/null +++ b/paper/paper.md @@ -0,0 +1,143 @@ +--- +title: "bgms: Bayesian Analysis of Graphical Models for Ordinal, Continuous, and Mixed Data" +tags: + - R + - Bayesian inference + - graphical models + - Markov random fields + - Gaussian graphical models + - psychometrics +authors: + - name: Maarten Marsman + orcid: 0000-0001-5309-7502 + affiliation: "1" + - name: + given-names: Don + non-dropping-particle: van den + surname: Bergh + orcid: 0000-0002-9838-7308 + affiliation: "1" +affiliations: + - index: 1 + name: University of Amsterdam, The Netherlands +date: 9 March 2026 +bibliography: paper.bib +--- + +# Summary + +`bgms` is an R package for Bayesian analysis of undirected graphical models +with binary, ordinal, continuous, and mixed variables. The package supports +single-group estimation with `bgm()` and multi-group comparison with +`bgmCompare()`. Core use cases include estimating network structure, +quantifying evidence for conditional dependence or independence, and comparing +parameter equality across groups. + +The package combines pseudolikelihood-based model fitting with Markov chain +Monte Carlo (MCMC) sampling to obtain posterior summaries and Bayes factors for +model comparison tasks [@MarsmanVandenBerghHaslbeck_2025; +@MarsmanWaldorpSekulovskiHaslbeck_2024]. `bgms` is distributed on CRAN and +includes vignettes, tests, and C++ backends for computationally intensive +routines. + +# Statement of need + +Network models are widely used in psychological and psychometric research to +study conditional dependence structures among observed variables +[@ContrerasEtAl_2019; @RobinaughEtAl_2020]. In these settings, analysts often +need to answer inferential questions that go beyond point estimation: whether a +specific edge is present, whether a missing edge is plausible, and whether +network parameters differ across populations. + +Frequentist workflows for graphical models are useful for estimation and +selection, but they are less direct when researchers need graded evidence for +both null and alternative hypotheses in the same analysis. `bgms` addresses this +need by offering a Bayesian workflow where posterior inclusion probabilities and +Bayes factors can be used to evaluate edge presence/absence and group +differences/equivalence within one framework [@HuthEtAl_2023_intro; +@SekulovskiEtAl_2024]. + +The target audience is applied researchers and methodologists who work with +cross-sectional network models in psychology, psychometrics, and related +fields, and who need a practical Bayesian toolchain in R for estimation, +comparison, prediction, simulation, and diagnostics. + +# State of the field + +Graphical-model software for applied research is broad, but many workflows are +either specialized to a single data type, focused on point estimation rather +than evidence quantification, or centered on one modeling task at a time +(estimation without comparison, or comparison without integrated diagnostics). + +`bgms` contributes by integrating several tasks in one package: ordinal MRF +estimation, Gaussian graphical model estimation, mixed-variable MRF estimation, +and multi-group comparison with a shared inferential language based on posterior +inclusion and Bayes factors [@MarsmanVandenBerghHaslbeck_2025; +@MarsmanWaldorpSekulovskiHaslbeck_2024]. This design reduces friction between +analysis stages that are often split across multiple tools. + +The package was developed as a standalone implementation rather than as a thin +wrapper because its scope required coordinated support for multiple model +families, custom prior specifications, shared diagnostics, and a compiled +backend tied to the package API. The result is a coherent research software +artifact that can be installed, tested, and reused as a single unit. + +# Software design + +`bgms` exposes high-level R interfaces while delegating compute-heavy operations +to C++ implementations. This architecture separates user-facing modeling +workflows from low-level sampling and likelihood code, allowing the package to +maintain a consistent R API while keeping core routines efficient. + +Key design choices include: + +1. A unified front-end (`bgm()`, `bgmCompare()`) across model families. +2. Shared extraction, summary, simulation, and prediction interfaces for fitted + objects. +3. Bayesian variable/effect selection via spike-and-slab style workflows for + edges, group differences, and (optionally) clustering components. +4. Pseudolikelihood-based modeling to make estimation practical in settings + where full likelihood approaches are expensive. + +These choices matter for research applications because users can move from model +estimation to hypothesis evaluation and reporting without re-implementing +separate pipelines for each data type. + +# Research impact statement + +`bgms` has been used in methodological work on Bayesian ordinal network +analysis, Bayesian group-difference testing in graphical models, and related +applications [@MarsmanVandenBerghHaslbeck_2025; +@MarsmanWaldorpSekulovskiHaslbeck_2024; @SekulovskiEtAl_2024]. The package also +supports reproducible workflows through scripted estimation, diagnostics, +simulation, and prediction, and includes public documentation and vignettes. + +The software is publicly developed on GitHub with issue tracking, pull requests, +continuous integration, and automated tests. A stable CRAN release and package +website are available, providing accessible installation and user guidance. This +combination of methodological grounding, public development, and practical +interfaces supports continued adoption and citation in network-analytic +research. + +# AI usage disclosure + +Generative AI tools were used to assist drafting parts of this manuscript and to +support code/documentation editing during package development. Human authors +reviewed, edited, and validated all AI-assisted outputs and made all substantive +design and scientific decisions. + + + +# Acknowledgements + +We acknowledge contributors to the `bgms` codebase and documentation, and thank +reviewers and users who provided feedback through issues and pull requests. + + + +# References diff --git a/tests/testthat/test-build-arguments.R b/tests/testthat/test-build-arguments.R index fa52e8cb..c31bd463 100644 --- a/tests/testthat/test-build-arguments.R +++ b/tests/testthat/test-build-arguments.R @@ -98,7 +98,8 @@ test_that("GGM build_arguments: all expected field names present", { "beta_bernoulli_alpha_between", "beta_bernoulli_beta_between", "dirichlet_alpha", "lambda", "na_action", "version", "update_method", "target_accept", "num_chains", - "data_columnnames", "no_variables", "is_continuous" + "data_columnnames", "no_variables", "is_continuous", + "model_type" ) expect_true(all(expected %in% names(a)), info = paste("Missing:", paste(setdiff(expected, names(a)), @@ -162,7 +163,8 @@ test_that("OMRF build_arguments: all expected field names present", { "nuts_max_depth", "learn_mass_matrix", "num_chains", "num_categories", "data_columnnames", "baseline_category", - "pairwise_scaling_factors", "no_variables" + "pairwise_scaling_factors", "no_variables", + "model_type" ) expect_true(all(expected %in% names(a)), info = paste("Missing:", paste(setdiff(expected, names(a)), @@ -222,7 +224,8 @@ test_that("Compare build_arguments: all expected field names present", { "num_chains", "num_groups", "data_columnnames", "projection", "num_categories", "is_ordinal_variable", - "group", "pairwise_scaling_factors" + "group", "pairwise_scaling_factors", + "model_type" ) expect_true(all(expected %in% names(a)), info = paste("Missing:", paste(setdiff(expected, names(a)), diff --git a/tests/testthat/test-extractor-functions.R b/tests/testthat/test-extractor-functions.R index 770a9777..9d4ce46b 100644 --- a/tests/testthat/test-extractor-functions.R +++ b/tests/testthat/test-extractor-functions.R @@ -125,10 +125,10 @@ test_that("extract_pairwise_interactions returns valid matrix for all fit types" # ------------------------------------------------------------------------------ -# extract_category_thresholds() Tests (parameterized) +# extract_main_effects() Tests (parameterized) # ------------------------------------------------------------------------------ -test_that("extract_category_thresholds returns valid output for all fit types", { +test_that("extract_main_effects returns valid output for all fit types", { fixtures = get_all_fixtures() for(spec in fixtures) { @@ -136,17 +136,30 @@ test_that("extract_category_thresholds returns valid output for all fit types", fit = spec$get_fit() args = extract_arguments(fit) - thresholds = extract_category_thresholds(fit) + main = extract_main_effects(fit) - # Structure checks - expect_true(is.matrix(thresholds), info = paste(ctx, "should be matrix")) - - # Values finite where not NA - vals = thresholds[!is.na(thresholds)] - expect_true(all(is.finite(vals)), info = paste(ctx, "non-NA values should be finite")) + if(isTRUE(args$is_mixed)) { + # Mixed MRF returns a list + expect_true(is.list(main), info = paste(ctx, "should be list for mixed")) + expect_true(is.matrix(main$discrete), info = paste(ctx, "$discrete should be matrix")) + expect_true(is.matrix(main$continuous), info = paste(ctx, "$continuous should be matrix")) + } else { + # GGM / OMRF return matrix + expect_true(is.matrix(main), info = paste(ctx, "should be matrix")) + vals = main[!is.na(main)] + expect_true(all(is.finite(vals)), info = paste(ctx, "non-NA values should be finite")) + } } }) +test_that("extract_category_thresholds emits deprecation warning", { + fit = get_bgms_fit() + expect_warning( + extract_category_thresholds(fit), + "extract_main_effects" + ) +}) + # ------------------------------------------------------------------------------ # extract_indicators() and extract_posterior_inclusion_probabilities() Tests @@ -390,7 +403,7 @@ test_that("extractor outputs are dimensionally consistent", { pairwise = extract_pairwise_interactions(fit) expect_equal(ncol(pairwise), n_edges, info = paste(ctx, "pairwise cols")) - thresholds = extract_category_thresholds(fit) + thresholds = suppressWarnings(extract_category_thresholds(fit)) expect_equal(nrow(thresholds), p, info = paste(ctx, "threshold rows")) } }) @@ -888,7 +901,7 @@ test_that("pre-0.1.4 bgm formats emit deprecation warnings for pairwise/threshol expect_warning(extract_pairwise_interactions(fit), "deprecated", info = paste(spec$label, "extract_pairwise should warn") ) - expect_warning(extract_category_thresholds(fit), "deprecated", + expect_warning(extract_category_thresholds(fit), "extract_main_effects", info = paste(spec$label, "extract_thresholds should warn") ) } @@ -910,7 +923,7 @@ test_that("0.1.4-0.1.5 formats emit deprecation warnings", { expect_warning(extract_pairwise_interactions(fit), "deprecated", info = paste(spec$label, "extract_pairwise should warn") ) - expect_warning(extract_category_thresholds(fit), "deprecated", + expect_warning(extract_category_thresholds(fit), "extract_main_effects", info = paste(spec$label, "extract_thresholds should warn") ) @@ -934,7 +947,8 @@ test_that("0.1.6+ formats work without deprecation warnings", { expect_no_warning(extract_indicators(fit)) expect_no_warning(extract_posterior_inclusion_probabilities(fit)) expect_no_warning(extract_pairwise_interactions(fit)) - expect_no_warning(extract_category_thresholds(fit)) + expect_warning(extract_category_thresholds(fit), "extract_main_effects") + expect_no_warning(extract_main_effects(fit)) } }) From 0544d9552676bcffb39f5a75409039a053a8e973 Mon Sep 17 00:00:00 2001 From: MaartenMarsman <52934067+MaartenMarsman@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:28:57 +0100 Subject: [PATCH 35/60] chore: untrack dev/ directory from git --- .gitignore | 2 +- dev/README.md | 6 - dev/benchmark_memoization.R | 65 - dev/bitwise_compliance/generate_fixtures.R | 688 ----- dev/bitwise_compliance/test_compliance.R | 685 ----- .../compliance/bgm_adhd_mh_bernoulli.rds | Bin 15972 -> 0 bytes .../compliance/bgm_adhd_nuts_bernoulli.rds | Bin 34326 -> 0 bytes .../compliance/bgm_adhd_nuts_no_edgesel.rds | Bin 37045 -> 0 bytes dev/fixtures/compliance/bgm_adhd_nuts_sbm.rds | Bin 35727 -> 0 bytes .../compliance/bgm_boredom_hmc_bernoulli.rds | Bin 3199 -> 0 bytes .../compliance/bgm_boredom_mh_betabern.rds | Bin 37904 -> 0 bytes .../compliance/bgm_boredom_nuts_bernoulli.rds | Bin 80471 -> 0 bytes .../bgm_boredom_nuts_no_edgesel.rds | Bin 83112 -> 0 bytes .../compliance/bgm_wenchuan_hmc_bernoulli.rds | Bin 3720 -> 0 bytes .../bgm_wenchuan_hmc_blumecapel.rds | Bin 35155 -> 0 bytes .../compliance/bgm_wenchuan_mh_bernoulli.rds | Bin 29005 -> 0 bytes .../compliance/bgm_wenchuan_mh_blumecapel.rds | Bin 18665 -> 0 bytes .../bgm_wenchuan_nuts_bernoulli.rds | Bin 59635 -> 0 bytes .../compliance/bgm_wenchuan_nuts_betabern.rds | Bin 60552 -> 0 bytes .../bgm_wenchuan_nuts_blumecapel.rds | Bin 40781 -> 0 bytes ...bgm_wenchuan_nuts_blumecapel_baseline1.rds | Bin 39985 -> 0 bytes .../bgm_wenchuan_nuts_blumecapel_impute.rds | Bin 39703 -> 0 bytes ...gm_wenchuan_nuts_blumecapel_no_edgesel.rds | Bin 46157 -> 0 bytes .../compliance/bgm_wenchuan_nuts_impute.rds | Bin 59404 -> 0 bytes .../bgm_wenchuan_nuts_no_edgesel.rds | Bin 65420 -> 0 bytes .../compliance/bgm_wenchuan_nuts_sbm.rds | Bin 59582 -> 0 bytes .../bgm_wenchuan_nuts_scaled_prior.rds | Bin 58758 -> 0 bytes .../compliance/cmp_adhd_mh_bernoulli.rds | Bin 60679 -> 0 bytes .../compliance/cmp_adhd_nuts_bernoulli.rds | Bin 110822 -> 0 bytes .../compliance/cmp_boredom_mh_bernoulli.rds | Bin 132601 -> 0 bytes .../compliance/cmp_boredom_nuts_bernoulli.rds | Bin 277648 -> 0 bytes .../compliance/cmp_wenchuan_hmc_bernoulli.rds | Bin 10616 -> 0 bytes .../compliance/cmp_wenchuan_mh_bernoulli.rds | Bin 101998 -> 0 bytes .../compliance/cmp_wenchuan_mh_blumecapel.rds | Bin 69663 -> 0 bytes .../cmp_wenchuan_nuts_bernoulli.rds | Bin 205011 -> 0 bytes .../compliance/cmp_wenchuan_nuts_betabern.rds | Bin 199846 -> 0 bytes .../cmp_wenchuan_nuts_blumecapel.rds | Bin 137008 -> 0 bytes ...mp_wenchuan_nuts_blumecapel_no_diffsel.rds | Bin 170259 -> 0 bytes .../compliance/cmp_wenchuan_nuts_impute.rds | Bin 208561 -> 0 bytes .../cmp_wenchuan_nuts_main_diffsel.rds | Bin 107050 -> 0 bytes .../cmp_wenchuan_nuts_no_diffsel.rds | Bin 247153 -> 0 bytes dev/fixtures/compliance/manifest.rds | Bin 1106 -> 0 bytes .../bgm_ggm_bernoulli_listwise.rds | Bin 2467 -> 0 bytes .../bgm_ggm_betabern_listwise_na.rds | Bin 2352 -> 0 bytes ...bgm_omrf_blumecapel_bernoulli_listwise.rds | Bin 769 -> 0 bytes ...bgm_omrf_blumecapel_betabern_impute_na.rds | Bin 860 -> 0 bytes .../bgm_omrf_mixed_bernoulli_listwise.rds | Bin 704 -> 0 bytes .../bgm_omrf_ordinal_bernoulli_listwise.rds | Bin 671 -> 0 bytes .../bgm_omrf_ordinal_betabern_impute_na.rds | Bin 868 -> 0 bytes .../bgm_omrf_ordinal_no_edgesel.rds | Bin 596 -> 0 bytes .../bgm_omrf_ordinal_sbm_listwise.rds | Bin 774 -> 0 bytes .../compare_blumecapel_listwise_2groups.rds | Bin 715 -> 0 bytes .../compare_mixed_missing_category_bc.rds | Bin 959 -> 0 bytes .../compare_ordinal_betabern_diff.rds | Bin 857 -> 0 bytes .../compare_ordinal_impute_2groups_na.rds | Bin 889 -> 0 bytes .../compare_ordinal_listwise_2groups.rds | Bin 823 -> 0 bytes .../compare_ordinal_listwise_3groups.rds | Bin 1083 -> 0 bytes .../compare_ordinal_missing_category.rds | Bin 835 -> 0 bytes .../compare_ordinal_no_diffsel.rds | Bin 806 -> 0 bytes dev/fixtures/scaffolding/manifest.rds | Bin 581 -> 0 bytes dev/generate_legacy_fixtures.R | 285 -- dev/generate_scaffolding_fixtures.R | 778 ------ dev/ggm_g_prior.md | 41 - dev/ggm_nuts/blockwise_hmc.md | 25 - .../chordal_completion_augmentation.md | 34 - dev/ggm_nuts/elliptical_slice_surrogates.md | 24 - .../partial_correlation_reparameterization.md | 28 - dev/ggm_nuts/projected_nuts.md | 28 - dev/ggm_nuts/riemannian_gwishart_hmc.md | 24 - dev/mixedmrf/deduplication_audit.md | 459 ---- dev/mixedmrf/implementation_plan.md | 2340 ----------------- dev/mixedmrf/nuts-plan.md | 518 ---- dev/mixedmrf/output_inspection.md | 360 --- .../bgm_blumecapel_normalization_PL.R | 647 ----- .../bgm_blumecapel_normalization_PL_extra.R | 900 ------- .../bgm_blumecapel_probs_PL.R | 248 -- .../bgm_regularordinal_normalization_PL.R | 695 ----- dev/test_step_size.R | 35 - dev/tests/compare_bgms_mixedgm_cycle.R | 213 -- dev/tests/cycle_scatterplots.pdf | Bin 13023 -> 0 bytes dev/tests/debug_main_effects.R | 74 - .../easybgm/test_easybgm_bgms_interaction.R | 0 dev/tests/plot_cycle_scatterplots.R | 139 - dev/tests/test-numerical-gradient.R | 153 -- dev/tests/test-simulation-recovery.R | 794 ------ .../validation/group1_parameter_recovery.R | 189 -- dev/tests/validation/group2_mh_vs_nuts.R | 239 -- dev/tests/validation/group3_cond_vs_marg.R | 219 -- dev/tests/validation/group4_cross_package.R | 229 -- dev/tests/validation/group5_edge_detection.R | 323 --- dev/tests/validation/group6_diagnostics.R | 285 -- dev/tests/validation/group7_empirical.R | 287 -- dev/tests/validation/group9_breakdown.R | 174 -- dev/tests/validation/group9_profiling.R | 323 --- dev/tests/validation/helpers.R | 405 --- .../output/group1_parameter_recovery.pdf | Bin 20189 -> 0 bytes .../validation/output/group2_mh_vs_nuts.pdf | Bin 26158 -> 0 bytes dev/tests/validation/output/group2_traces.pdf | Bin 624248 -> 0 bytes .../validation/output/group3_cond_vs_marg.pdf | Bin 22709 -> 0 bytes .../output/group3_diff_distributions.pdf | Bin 6353 -> 0 bytes .../output/group4_cross_package.pdf | Bin 19697 -> 0 bytes .../output/group5_edge_detection.pdf | Bin 10875 -> 0 bytes .../output/group6_autocorrelation.pdf | Bin 12977 -> 0 bytes .../validation/output/group6_diagnostics.pdf | Bin 522914 -> 0 bytes .../validation/output/group7_empirical.pdf | Bin 13038 -> 0 bytes .../validation/output/group9_profiling.pdf | Bin 7965 -> 0 bytes dev/tests/validation/run_all.R | 121 - 107 files changed, 1 insertion(+), 13081 deletions(-) delete mode 100644 dev/README.md delete mode 100644 dev/benchmark_memoization.R delete mode 100644 dev/bitwise_compliance/generate_fixtures.R delete mode 100644 dev/bitwise_compliance/test_compliance.R delete mode 100644 dev/fixtures/compliance/bgm_adhd_mh_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_adhd_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_adhd_nuts_no_edgesel.rds delete mode 100644 dev/fixtures/compliance/bgm_adhd_nuts_sbm.rds delete mode 100644 dev/fixtures/compliance/bgm_boredom_hmc_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_boredom_mh_betabern.rds delete mode 100644 dev/fixtures/compliance/bgm_boredom_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_boredom_nuts_no_edgesel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_hmc_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_hmc_blumecapel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_mh_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_mh_blumecapel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_betabern.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_baseline1.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_impute.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_no_edgesel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_impute.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_no_edgesel.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_sbm.rds delete mode 100644 dev/fixtures/compliance/bgm_wenchuan_nuts_scaled_prior.rds delete mode 100644 dev/fixtures/compliance/cmp_adhd_mh_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_adhd_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_boredom_mh_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_boredom_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_hmc_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_mh_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_mh_blumecapel.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_bernoulli.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_betabern.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_blumecapel.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_blumecapel_no_diffsel.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_impute.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_main_diffsel.rds delete mode 100644 dev/fixtures/compliance/cmp_wenchuan_nuts_no_diffsel.rds delete mode 100644 dev/fixtures/compliance/manifest.rds delete mode 100644 dev/fixtures/scaffolding/bgm_ggm_bernoulli_listwise.rds delete mode 100644 dev/fixtures/scaffolding/bgm_ggm_betabern_listwise_na.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_blumecapel_bernoulli_listwise.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_blumecapel_betabern_impute_na.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_mixed_bernoulli_listwise.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_ordinal_bernoulli_listwise.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_ordinal_betabern_impute_na.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_ordinal_no_edgesel.rds delete mode 100644 dev/fixtures/scaffolding/bgm_omrf_ordinal_sbm_listwise.rds delete mode 100644 dev/fixtures/scaffolding/compare_blumecapel_listwise_2groups.rds delete mode 100644 dev/fixtures/scaffolding/compare_mixed_missing_category_bc.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_betabern_diff.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_impute_2groups_na.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_listwise_2groups.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_listwise_3groups.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_missing_category.rds delete mode 100644 dev/fixtures/scaffolding/compare_ordinal_no_diffsel.rds delete mode 100644 dev/fixtures/scaffolding/manifest.rds delete mode 100644 dev/generate_legacy_fixtures.R delete mode 100644 dev/generate_scaffolding_fixtures.R delete mode 100644 dev/ggm_g_prior.md delete mode 100644 dev/ggm_nuts/blockwise_hmc.md delete mode 100644 dev/ggm_nuts/chordal_completion_augmentation.md delete mode 100644 dev/ggm_nuts/elliptical_slice_surrogates.md delete mode 100644 dev/ggm_nuts/partial_correlation_reparameterization.md delete mode 100644 dev/ggm_nuts/projected_nuts.md delete mode 100644 dev/ggm_nuts/riemannian_gwishart_hmc.md delete mode 100644 dev/mixedmrf/deduplication_audit.md delete mode 100644 dev/mixedmrf/implementation_plan.md delete mode 100644 dev/mixedmrf/nuts-plan.md delete mode 100644 dev/mixedmrf/output_inspection.md delete mode 100644 dev/numerical_analyses/bgm_blumecapel_normalization_PL.R delete mode 100644 dev/numerical_analyses/bgm_blumecapel_normalization_PL_extra.R delete mode 100644 dev/numerical_analyses/bgm_blumecapel_probs_PL.R delete mode 100644 dev/numerical_analyses/bgm_regularordinal_normalization_PL.R delete mode 100644 dev/test_step_size.R delete mode 100644 dev/tests/compare_bgms_mixedgm_cycle.R delete mode 100644 dev/tests/cycle_scatterplots.pdf delete mode 100644 dev/tests/debug_main_effects.R delete mode 100644 dev/tests/easybgm/test_easybgm_bgms_interaction.R delete mode 100644 dev/tests/plot_cycle_scatterplots.R delete mode 100644 dev/tests/test-numerical-gradient.R delete mode 100644 dev/tests/test-simulation-recovery.R delete mode 100644 dev/tests/validation/group1_parameter_recovery.R delete mode 100644 dev/tests/validation/group2_mh_vs_nuts.R delete mode 100644 dev/tests/validation/group3_cond_vs_marg.R delete mode 100644 dev/tests/validation/group4_cross_package.R delete mode 100644 dev/tests/validation/group5_edge_detection.R delete mode 100644 dev/tests/validation/group6_diagnostics.R delete mode 100644 dev/tests/validation/group7_empirical.R delete mode 100644 dev/tests/validation/group9_breakdown.R delete mode 100644 dev/tests/validation/group9_profiling.R delete mode 100644 dev/tests/validation/helpers.R delete mode 100644 dev/tests/validation/output/group1_parameter_recovery.pdf delete mode 100644 dev/tests/validation/output/group2_mh_vs_nuts.pdf delete mode 100644 dev/tests/validation/output/group2_traces.pdf delete mode 100644 dev/tests/validation/output/group3_cond_vs_marg.pdf delete mode 100644 dev/tests/validation/output/group3_diff_distributions.pdf delete mode 100644 dev/tests/validation/output/group4_cross_package.pdf delete mode 100644 dev/tests/validation/output/group5_edge_detection.pdf delete mode 100644 dev/tests/validation/output/group6_autocorrelation.pdf delete mode 100644 dev/tests/validation/output/group6_diagnostics.pdf delete mode 100644 dev/tests/validation/output/group7_empirical.pdf delete mode 100644 dev/tests/validation/output/group9_profiling.pdf delete mode 100644 dev/tests/validation/run_all.R diff --git a/.gitignore b/.gitignore index eef79de8..2535b0b7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ src/sources.mk docs/* /doc/ /inst/doc/ -dev/plans/ +dev/ diff --git a/dev/README.md b/dev/README.md deleted file mode 100644 index 30593bb3..00000000 --- a/dev/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# dev/ - -Developer-only materials excluded from the built R package (via -`.Rbuildignore`). Contains documentation strategy, audit plans, -numerical analyses, test fixtures, and design notes. Nothing in -this directory is shipped to CRAN or installed by users. diff --git a/dev/benchmark_memoization.R b/dev/benchmark_memoization.R deleted file mode 100644 index 6d7b050f..00000000 --- a/dev/benchmark_memoization.R +++ /dev/null @@ -1,65 +0,0 @@ -# ============================================================================= -# Benchmark: Hash-map cache vs Single-entry cache for NUTS memoization -# ============================================================================= -# -# Purpose: Compare two memoization strategies in src/mcmc/mcmc_memoization.h -# 1. Hash-map cache (uses std::unordered_map) -# 2. Single-entry cache (uses memcmp on last theta) -# -# Instructions: -# 1. Install the version you want to test (modify mcmc_memoization.h) -# 2. Run: R CMD INSTALL . -# 3. Run this script: Rscript dev/benchmark_memoization.R -# -# ============================================================================= - -library(bgms) -library(psych) - -# ----------------------------------------------------------------------------- -# Configuration -# ----------------------------------------------------------------------------- -N_REPLICATES <- 5 -SEED <- 123 -WARMUP <- 1000 -ITER <- 500 - -# ----------------------------------------------------------------------------- -# Data setup -# ----------------------------------------------------------------------------- -data(bfi) -bfi_data <- bfi[, 1:25] # 25 personality items, NO na.omit - -cat("=== Memoization Benchmark ===\n") -cat("Data: psych::bfi[, 1:25]\n") -cat("Dimensions:", nrow(bfi_data), "x", ncol(bfi_data), "\n") -cat("Warmup:", WARMUP, "\n") -cat("Iterations:", ITER, "\n") -cat("Replicates:", N_REPLICATES, "\n") -cat("Seed:", SEED, "\n") -cat("==============================\n\n") - -# ----------------------------------------------------------------------------- -# Run benchmark -# ----------------------------------------------------------------------------- -set.seed(SEED) -times <- numeric(N_REPLICATES) - -for (i in 1:N_REPLICATES) { - cat("Replicate", i, "of", N_REPLICATES, "... ") - t0 <- Sys.time() - fit <- bgm(bfi_data, warmup = WARMUP, iter = ITER, verbose = FALSE) - times[i] <- as.numeric(difftime(Sys.time(), t0, units = "secs")) - cat(round(times[i], 1), "s\n") -} - -# ----------------------------------------------------------------------------- -# Results -# ----------------------------------------------------------------------------- -cat("\n=== RESULTS ===\n") -cat("Mean:", round(mean(times), 2), "s\n") -cat("SD:", round(sd(times), 2), "s\n") -cat("Min:", round(min(times), 2), "s\n") -cat("Max:", round(max(times), 2), "s\n") -cat("Times:", paste(round(times, 1), collapse = ", "), "\n") -cat("===============\n") diff --git a/dev/bitwise_compliance/generate_fixtures.R b/dev/bitwise_compliance/generate_fixtures.R deleted file mode 100644 index 062f218f..00000000 --- a/dev/bitwise_compliance/generate_fixtures.R +++ /dev/null @@ -1,688 +0,0 @@ -# ============================================================================== -# Generate Bitwise Compliance Fixtures (baseline: CRAN bgms 0.1.6.3) -# ============================================================================== -# -# Installs bgms 0.1.6.3 from CRAN into an isolated library and runs all -# configurations. The resulting fixtures are the ground-truth reference for -# OMRF/Blume-Capel models (bgm + bgmCompare). -# -# These fixtures capture the LAST CRAN release before continuous variables -# were added. All future development must preserve bitwise-identical output -# for discrete (ordinal / binary / Blume-Capel) models. -# -# Usage: -# Rscript dev/bitwise_compliance/generate_fixtures.R -# -# Output: -# dev/fixtures/compliance/ — one .rds per configuration + manifest.rds -# -# ============================================================================== - -library(callr) - -fixture_dir = file.path("dev", "fixtures", "compliance") -dir.create(fixture_dir, recursive = TRUE, showWarnings = FALSE) - -# ============================================================================== -# Install CRAN 0.1.6.3 into a temporary library -# ============================================================================== - -cran_lib = tempfile("bgms_cran_") -dir.create(cran_lib) - -cat("Installing bgms 0.1.6.3 from CRAN...\n") -install.packages( - "bgms", - repos = "https://cloud.r-project.org", - lib = cran_lib, - quiet = TRUE -) - -installed_version = callr::r( - function(lib_path) { - as.character(packageVersion("bgms", lib.loc = lib_path)) - }, - args = list(lib_path = cran_lib) -) -cat("Installed version:", installed_version, "\n") - -if (installed_version != "0.1.6.3") { - cat("WARNING: Expected 0.1.6.3, got", installed_version, "\n") - cat("Fixtures will be tagged with the actual version.\n") -} - -# ============================================================================== -# Configuration matrix — OMRF/Blume-Capel bgm() configurations -# ============================================================================== -# -# Covers: -# Datasets: Wenchuan (ordinal 5-pt), ADHD (binary), Boredom (ordinal 7-pt) -# Variable types: ordinal (default), blume-capel -# Samplers: NUTS, adaptive-metropolis, hamiltonian-mc -# Edge priors: Bernoulli, Beta-Bernoulli, Stochastic-Block -# Edge selection: TRUE, FALSE -# Missing data: listwise, impute -# -# Short iterations (200 iter / 200 warmup / 2 chains) — bitwise identity does -# not require convergence. -# ============================================================================== - -bgm_configs = list( - - # --- Wenchuan ordinal --- - - list( - id = "bgm_wenchuan_nuts_bernoulli", - desc = "bgm: Wenchuan 6v, NUTS, Bernoulli, edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 101, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_no_edgesel", - desc = "bgm: Wenchuan 6v, NUTS, no edge selection", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - update_method = "nuts", seed = 102, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_mh_bernoulli", - desc = "bgm: Wenchuan 6v, MH, Bernoulli, edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 103, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_hmc_bernoulli", - desc = "bgm: Wenchuan 6v, HMC, Bernoulli, edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 104, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_betabern", - desc = "bgm: Wenchuan 6v, NUTS, Beta-Bernoulli, edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Beta-Bernoulli", - beta_bernoulli_alpha = 1, beta_bernoulli_beta = 1, - update_method = "nuts", seed = 105, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_sbm", - desc = "bgm: Wenchuan 6v, NUTS, Stochastic-Block, edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Stochastic-Block", - update_method = "nuts", seed = 106, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_scaled_prior", - desc = "bgm: Wenchuan 6v, NUTS, pairwise_scale=1.0", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - pairwise_scale = 1.0, - update_method = "nuts", seed = 107, display_progress = "none" - ) - ), - - # --- Wenchuan Blume-Capel --- - - list( - id = "bgm_wenchuan_nuts_blumecapel", - desc = "bgm: Wenchuan 6v, NUTS, Blume-Capel, baseline=2", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 401, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_mh_blumecapel", - desc = "bgm: Wenchuan 6v, MH, Blume-Capel, baseline=2", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 402, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_hmc_blumecapel", - desc = "bgm: Wenchuan 6v, HMC, Blume-Capel, baseline=2", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 403, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_blumecapel_no_edgesel", - desc = "bgm: Wenchuan 6v, NUTS, Blume-Capel, no edge_sel", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = FALSE, - update_method = "nuts", seed = 404, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_blumecapel_baseline1", - desc = "bgm: Wenchuan 6v, NUTS, Blume-Capel, baseline=1", - args = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 1, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 405, display_progress = "none" - ) - ), - - # --- ADHD binary --- - - list( - id = "bgm_adhd_nuts_bernoulli", - desc = "bgm: ADHD 6v, NUTS, Bernoulli, edge_sel", - args = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 201, display_progress = "none" - ) - ), - list( - id = "bgm_adhd_mh_bernoulli", - desc = "bgm: ADHD 6v, MH, Bernoulli, edge_sel", - args = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 202, display_progress = "none" - ) - ), - list( - id = "bgm_adhd_nuts_no_edgesel", - desc = "bgm: ADHD 6v, NUTS, no edge selection", - args = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - update_method = "nuts", seed = 203, display_progress = "none" - ) - ), - list( - id = "bgm_adhd_nuts_sbm", - desc = "bgm: ADHD 6v, NUTS, Stochastic-Block, edge_sel", - args = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Stochastic-Block", - update_method = "nuts", seed = 204, display_progress = "none" - ) - ), - - # --- Boredom ordinal 7-point --- - - list( - id = "bgm_boredom_nuts_bernoulli", - desc = "bgm: Boredom 6v, NUTS, Bernoulli, edge_sel", - args = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 301, display_progress = "none" - ) - ), - list( - id = "bgm_boredom_mh_betabern", - desc = "bgm: Boredom 6v, MH, Beta-Bernoulli, edge_sel", - args = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Beta-Bernoulli", - update_method = "adaptive-metropolis", seed = 302, display_progress = "none" - ) - ), - list( - id = "bgm_boredom_hmc_bernoulli", - desc = "bgm: Boredom 6v, HMC, Bernoulli, edge_sel", - args = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 303, display_progress = "none" - ) - ), - list( - id = "bgm_boredom_nuts_no_edgesel", - desc = "bgm: Boredom 6v, NUTS, no edge selection", - args = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - update_method = "nuts", seed = 304, display_progress = "none" - ) - ), - - # --- Missing data imputation --- - - list( - id = "bgm_wenchuan_nuts_impute", - desc = "bgm: Wenchuan 6v +NAs, NUTS, impute", - args = list( - x = "wenchuan_na", iter = 200, warmup = 200, chains = 2, - na_action = "impute", - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 501, display_progress = "none" - ) - ), - list( - id = "bgm_wenchuan_nuts_blumecapel_impute", - desc = "bgm: Wenchuan 6v +NAs, NUTS, Blume-Capel, impute", - args = list( - x = "wenchuan_na", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - na_action = "impute", - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "nuts", seed = 502, display_progress = "none" - ) - ) -) - -# ============================================================================== -# bgmCompare() configurations -# ============================================================================== -# -# Uses x/y API (two separate data frames) since that is how 0.1.6.3 was -# primarily tested. Covers ordinal, binary, and Blume-Capel with -# difference_selection and main_difference_selection. -# ============================================================================== - -compare_configs = list( - - # --- Wenchuan ordinal (split into two groups) --- - - list( - id = "cmp_wenchuan_nuts_bernoulli", - desc = "bgmCompare: Wenchuan, NUTS, Bernoulli, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "nuts", seed = 601, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_mh_bernoulli", - desc = "bgmCompare: Wenchuan, MH, Bernoulli, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 602, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_hmc_bernoulli", - desc = "bgmCompare: Wenchuan, HMC, Bernoulli, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 603, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_nuts_no_diffsel", - desc = "bgmCompare: Wenchuan, NUTS, no diff selection", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = FALSE, - update_method = "nuts", seed = 604, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_nuts_main_diffsel", - desc = "bgmCompare: Wenchuan, NUTS, main+pairwise diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - main_difference_selection = TRUE, - update_method = "nuts", seed = 605, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_nuts_betabern", - desc = "bgmCompare: Wenchuan, NUTS, Beta-Bernoulli, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - difference_prior = "Beta-Bernoulli", - update_method = "nuts", seed = 606, display_progress = "none" - ) - ), - - # --- Wenchuan Blume-Capel --- - - list( - id = "cmp_wenchuan_nuts_blumecapel", - desc = "bgmCompare: Wenchuan, NUTS, Blume-Capel, baseline=2, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = TRUE, - update_method = "nuts", seed = 701, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_mh_blumecapel", - desc = "bgmCompare: Wenchuan, MH, Blume-Capel, baseline=2, diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 702, display_progress = "none" - ) - ), - list( - id = "cmp_wenchuan_nuts_blumecapel_no_diffsel", - desc = "bgmCompare: Wenchuan, NUTS, Blume-Capel, no diff_sel", - args = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = FALSE, - update_method = "nuts", seed = 703, display_progress = "none" - ) - ), - - # --- ADHD binary --- - - list( - id = "cmp_adhd_nuts_bernoulli", - desc = "bgmCompare: ADHD, NUTS, Bernoulli, diff_sel", - args = list( - x = "adhd_g1", y = "adhd_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "nuts", seed = 801, display_progress = "none" - ) - ), - list( - id = "cmp_adhd_mh_bernoulli", - desc = "bgmCompare: ADHD, MH, Bernoulli, diff_sel", - args = list( - x = "adhd_g1", y = "adhd_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 802, display_progress = "none" - ) - ), - - # --- Boredom ordinal 7-point --- - - list( - id = "cmp_boredom_nuts_bernoulli", - desc = "bgmCompare: Boredom, NUTS, Bernoulli, diff_sel", - args = list( - x = "boredom_g1", y = "boredom_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "nuts", seed = 901, display_progress = "none" - ) - ), - list( - id = "cmp_boredom_mh_bernoulli", - desc = "bgmCompare: Boredom, MH, Bernoulli, diff_sel", - args = list( - x = "boredom_g1", y = "boredom_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 902, display_progress = "none" - ) - ), - - # --- Missing data imputation in bgmCompare --- - - list( - id = "cmp_wenchuan_nuts_impute", - desc = "bgmCompare: Wenchuan +NAs, NUTS, impute, diff_sel", - args = list( - x = "wenchuan_g1_na", y = "wenchuan_g2_na", - iter = 200, warmup = 200, chains = 2, - na_action = "impute", - difference_selection = TRUE, - update_method = "nuts", seed = 1001, display_progress = "none" - ) - ) -) - -# ============================================================================== -# Dataset preparation -# ============================================================================== - -prepare_datasets = function() { - data(Wenchuan, package = "bgms", envir = environment()) - data(ADHD, package = "bgms", envir = environment()) - data(Boredom, package = "bgms", envir = environment()) - - wenchuan_small = Wenchuan[, 1:6] - adhd_small = ADHD[, 2:7] - boredom_small = Boredom[, 2:7] - - # Wenchuan with NAs (deterministic injection) - wenchuan_na = wenchuan_small - set.seed(999) - na_idx = sample(length(wenchuan_na), size = 20) - wenchuan_na[na_idx] = NA - - # Split datasets for bgmCompare (deterministic halves) - n_w = nrow(wenchuan_small) - wenchuan_g1 = wenchuan_small[1:floor(n_w / 2), ] - wenchuan_g2 = wenchuan_small[(floor(n_w / 2) + 1):n_w, ] - - n_a = nrow(adhd_small) - adhd_g1 = adhd_small[1:floor(n_a / 2), ] - adhd_g2 = adhd_small[(floor(n_a / 2) + 1):n_a, ] - - n_b = nrow(boredom_small) - boredom_g1 = boredom_small[1:floor(n_b / 2), ] - boredom_g2 = boredom_small[(floor(n_b / 2) + 1):n_b, ] - - # Wenchuan groups with NAs - wenchuan_g1_na = wenchuan_g1 - wenchuan_g2_na = wenchuan_g2 - set.seed(998) - na_idx1 = sample(length(wenchuan_g1_na), size = 10) - wenchuan_g1_na[na_idx1] = NA - set.seed(997) - na_idx2 = sample(length(wenchuan_g2_na), size = 10) - wenchuan_g2_na[na_idx2] = NA - - list( - wenchuan_small = wenchuan_small, - adhd_small = adhd_small, - boredom_small = boredom_small, - wenchuan_na = wenchuan_na, - wenchuan_g1 = wenchuan_g1, - wenchuan_g2 = wenchuan_g2, - adhd_g1 = adhd_g1, - adhd_g2 = adhd_g2, - boredom_g1 = boredom_g1, - boredom_g2 = boredom_g2, - wenchuan_g1_na = wenchuan_g1_na, - wenchuan_g2_na = wenchuan_g2_na - ) -} - -# ============================================================================== -# Fixture extraction helpers -# ============================================================================== - -extract_bgm_fixture = function(fit, config) { - list( - id = config$id, - desc = config$desc, - posterior_summary_main = fit$posterior_summary_main, - posterior_summary_pairwise = fit$posterior_summary_pairwise, - posterior_summary_indicator = fit$posterior_summary_indicator, - posterior_mean_main = fit$posterior_mean_main, - posterior_mean_pairwise = fit$posterior_mean_pairwise, - posterior_mean_indicator = fit$posterior_mean_indicator, - raw_main_chain1 = fit$raw_samples$main[[1]], - raw_pairwise_chain1 = fit$raw_samples$pairwise[[1]], - raw_indicator_chain1 = if (!is.null(fit$raw_samples$indicator)) - fit$raw_samples$indicator[[1]] else NULL, - nuts_diag = fit$nuts_diag, - posterior_coclustering_matrix = fit$posterior_coclustering_matrix, - posterior_mean_allocations = fit$posterior_mean_allocations, - bgms_version = as.character(packageVersion("bgms")) - ) -} - -extract_compare_fixture = function(fit, config) { - list( - id = config$id, - desc = config$desc, - posterior_summary_main_baseline = fit$posterior_summary_main_baseline, - posterior_summary_pairwise_baseline = fit$posterior_summary_pairwise_baseline, - posterior_summary_main_differences = fit$posterior_summary_main_differences, - posterior_summary_pairwise_differences = fit$posterior_summary_pairwise_differences, - posterior_summary_indicator = fit$posterior_summary_indicator, - posterior_mean_main_baseline = fit$posterior_mean_main_baseline, - posterior_mean_pairwise_baseline = fit$posterior_mean_pairwise_baseline, - posterior_mean_main_differences = fit$posterior_mean_main_differences, - posterior_mean_pairwise_differences = fit$posterior_mean_pairwise_differences, - posterior_mean_indicator = fit$posterior_mean_indicator, - raw_samples = fit$raw_samples, - nuts_diag = fit$nuts_diag, - bgms_version = as.character(packageVersion("bgms")) - ) -} - -# ============================================================================== -# Generate fixtures via callr (isolated CRAN library) -# ============================================================================== - -resolve_args = function(args, datasets) { - resolved = args - for (nm in names(resolved)) { - if (is.character(resolved[[nm]]) && resolved[[nm]] %in% names(datasets)) { - resolved[[nm]] = datasets[[resolved[[nm]]]] - } - } - resolved -} - -datasets = prepare_datasets() - -# --- bgm fixtures --- - -cat(sprintf("\nGenerating %d bgm fixtures...\n", length(bgm_configs))) -bgm_manifest = list() - -for (config in bgm_configs) { - cat(sprintf(" [%s] %s ... ", config$id, config$desc)) - resolved = resolve_args(config$args, datasets) - - result = tryCatch({ - callr::r( - function(args, lib_path, extract_fn) { - .libPaths(c(lib_path, .libPaths())) - library(bgms, lib.loc = lib_path) - set.seed(args$seed) - fit = do.call(bgm, args) - extract_fn(fit, list(id = "tmp", desc = "tmp")) - }, - args = list(args = resolved, lib_path = cran_lib, extract_fn = extract_bgm_fixture), - show = FALSE - ) - }, error = function(e) { - cat(sprintf("ERROR: %s\n", conditionMessage(e))) - NULL - }) - - if (!is.null(result)) { - result$id = config$id - result$desc = config$desc - result$bgms_version = installed_version - path = file.path(fixture_dir, paste0(config$id, ".rds")) - saveRDS(result, path) - bgm_manifest[[config$id]] = list( - id = config$id, desc = config$desc, type = "bgm", - file = paste0(config$id, ".rds") - ) - cat("OK\n") - } -} - -# --- bgmCompare fixtures --- - -cat(sprintf("\nGenerating %d bgmCompare fixtures...\n", length(compare_configs))) -compare_manifest = list() - -for (config in compare_configs) { - cat(sprintf(" [%s] %s ... ", config$id, config$desc)) - resolved = resolve_args(config$args, datasets) - - result = tryCatch({ - callr::r( - function(args, lib_path, extract_fn) { - .libPaths(c(lib_path, .libPaths())) - library(bgms, lib.loc = lib_path) - set.seed(args$seed) - fit = do.call(bgmCompare, args) - extract_fn(fit, list(id = "tmp", desc = "tmp")) - }, - args = list(args = resolved, lib_path = cran_lib, extract_fn = extract_compare_fixture), - show = FALSE - ) - }, error = function(e) { - cat(sprintf("ERROR: %s\n", conditionMessage(e))) - NULL - }) - - if (!is.null(result)) { - result$id = config$id - result$desc = config$desc - result$bgms_version = installed_version - path = file.path(fixture_dir, paste0(config$id, ".rds")) - saveRDS(result, path) - compare_manifest[[config$id]] = list( - id = config$id, desc = config$desc, type = "bgmCompare", - file = paste0(config$id, ".rds") - ) - cat("OK\n") - } -} - -# ============================================================================== -# Save manifest -# ============================================================================== - -manifest = c(bgm_manifest, compare_manifest) -saveRDS(manifest, file.path(fixture_dir, "manifest.rds")) - -cat(sprintf( - "\nDone. %d bgm + %d bgmCompare = %d total fixtures in %s\n", - length(bgm_manifest), length(compare_manifest), length(manifest), fixture_dir -)) -cat("Baseline version:", installed_version, "\n") -cat("R version:", R.version.string, "\n") -cat("Date:", format(Sys.time(), "%Y-%m-%d %H:%M"), "\n") - -# Cleanup -unlink(cran_lib, recursive = TRUE) diff --git a/dev/bitwise_compliance/test_compliance.R b/dev/bitwise_compliance/test_compliance.R deleted file mode 100644 index 71cc71a3..00000000 --- a/dev/bitwise_compliance/test_compliance.R +++ /dev/null @@ -1,685 +0,0 @@ -# ============================================================================== -# Bitwise Compliance Test: Current Build vs CRAN 0.1.6.3 Fixtures -# ============================================================================== -# -# Reruns every bgm() and bgmCompare() configuration from the compliance -# fixture set and verifies bitwise-identical output. -# -# Usage: -# Rscript dev/bitwise_compliance/test_compliance.R -# -# Prerequisites: -# Rscript dev/bitwise_compliance/generate_fixtures.R -# -# Exit code: -# 0 = all pass, 1 = any fail -# -# ------------------------------------------------------------------------------ -# Known differences vs CRAN 0.1.6.3 -# ------------------------------------------------------------------------------ -# -# 1. NUTS target_accept defaults changed between 0.1.6.3 and current: -# - bgm(): 0.60 → 0.80 -# - bgmCompare(): 0.65 → 0.80 -# DualAveraging receives a different target acceptance rate, changing the -# adapted step size from iteration 1 onward and cascading into different -# NUTS trajectories. MH and HMC defaults did not change. -# Fix: bgm NUTS configs pass target_accept=0.6, bgmCompare NUTS configs -# pass target_accept=0.65, matching the old defaults. -# -# 2. nuts_diag structure: current code adds a warmup_check field and -# warmup_incomplete to the summary sub-list. These fields did not exist -# in 0.1.6.3. The comparison skips nuts_diag and compares only the -# shared core fields (treedepth, divergent, energy, ebfmi). -# -# 3. posterior_summary NA handling: 0.1.6.3 returned NA for mean and Rhat -# of constant or near-constant parameters. Current code computes values -# in those cells. The comparison ignores cells that are NA in the fixture. -# -# 4. SBM RNG ordering (CONFIRMED, NOT FIXED — not a bug): -# The SBM algorithm itself is unchanged. However, old code initialized -# cluster allocations (runif + block_probs_mfm_sbm) BEFORE the NUTS -# step-size search; new code does step-size search first, then lazily -# initializes SBM on the first edge_prior.update(). The swapped RNG -# order causes divergence from iteration 1. Both orderings produce -# valid MCMC chains; this is not a bug. SBM configs use structure-only -# comparison. -# -# 5. Imputation bugs (CONFIRMED, 2 of 3 FIXED): -# (a) Stale gradient cache: ensure_gradient_cache() cached sufficient -# statistics (counts_per_category_, pairwise_stats_) but was never -# invalidated after impute_missing() updated them. Old code -# recomputed gradient_observed_active() fresh at each HMC call. -# Fix: invalidate_gradient_cache() at end of impute_missing(). -# (b) Stale observations_double_t_: the precomputed transpose used -# in gradient computation was set once in the constructor, never -# updated after imputation changed observations_double_ cells. -# Old code created obs_double_t fresh from observations each -# gradient call. Fix: update observations_double_t_ at end of -# impute_missing(). -# (c) Blume-Capel baseline probability: old code pre-initialized -# cumsum with MY_EXP(ref*main + ref^2*main) before the category -# loop, adding a phantom probability mass to the imputation -# distribution. New code starts cumsum = 0.0. Confirmed: restoring -# the old formula produces bitwise match. The old code was wrong; -# the new code is correct. This config uses structure-only check. -# -# 6. Blume-Capel centering: all configs pass because CRAN 0.1.6.3 already -# centered BC data in R before passing to C++, producing the same result -# as the current C++ constructor. The observations_/observations_double_ -# mismatch was a regression introduced and fixed within PR #78; it was -# never in a CRAN release. -# -# 7. Intermediate-overflow guard in compute_logZ_and_probs_ordinal and -# compute_logZ_and_probs_blume_capel (ACCEPTED — not a bug): -# Commit 04b9562 tightened the fast/slow block threshold from EXP_BOUND -# (709) to FAST_LIM = max(0, EXP_BOUND - max_abs_main) to prevent -# intermediate overflow in exp(main_param(c) + (c+1)*rest) before the -# cancellation with exp(-bound). Both code paths are mathematically -# identical but differ at floating-point level. During HMC leapfrog -# integration, parameters can temporarily reach extreme values where -# max_abs_main is large enough that FAST_LIM < EXP_BOUND, reclassifying -# some observations between the fast (vectorized) and slow (per-element) -# paths. The resulting floating-point perturbation cascades through the -# fixed-step leapfrog integrator. This is needed for mixed MRF models -# where Theta_ss is absorbed into main_param. The affected configs use -# structure-only comparison against CRAN fixtures. -# -# ============================================================================== - -library(bgms) - -fixture_dir = file.path("dev", "fixtures", "compliance") - -if(!file.exists(file.path(fixture_dir, "manifest.rds"))) { - stop("No fixtures found. Run dev/bitwise_compliance/generate_fixtures.R first.") -} - -manifest = readRDS(file.path(fixture_dir, "manifest.rds")) -cat(sprintf("Testing %d compliance fixtures against current build...\n", length(manifest))) -cat("Current bgms version:", as.character(packageVersion("bgms")), "\n\n") - -# ============================================================================== -# Datasets (must match generate_fixtures.R) -# ============================================================================== - -data(Wenchuan) -data(ADHD) -data(Boredom) - -wenchuan_small = Wenchuan[, 1:6] -adhd_small = ADHD[, 2:7] -boredom_small = Boredom[, 2:7] - -wenchuan_na = wenchuan_small -set.seed(999) -na_idx = sample(length(wenchuan_na), size = 20) -wenchuan_na[na_idx] = NA - -n_w = nrow(wenchuan_small) -wenchuan_g1 = wenchuan_small[1:floor(n_w / 2), ] -wenchuan_g2 = wenchuan_small[(floor(n_w / 2) + 1):n_w, ] - -n_a = nrow(adhd_small) -adhd_g1 = adhd_small[1:floor(n_a / 2), ] -adhd_g2 = adhd_small[(floor(n_a / 2) + 1):n_a, ] - -n_b = nrow(boredom_small) -boredom_g1 = boredom_small[1:floor(n_b / 2), ] -boredom_g2 = boredom_small[(floor(n_b / 2) + 1):n_b, ] - -wenchuan_g1_na = wenchuan_g1 -wenchuan_g2_na = wenchuan_g2 -set.seed(998) -na_idx1 = sample(length(wenchuan_g1_na), size = 10) -wenchuan_g1_na[na_idx1] = NA -set.seed(997) -na_idx2 = sample(length(wenchuan_g2_na), size = 10) -wenchuan_g2_na[na_idx2] = NA - -datasets = list( - wenchuan_small = wenchuan_small, - adhd_small = adhd_small, - boredom_small = boredom_small, - wenchuan_na = wenchuan_na, - wenchuan_g1 = wenchuan_g1, - wenchuan_g2 = wenchuan_g2, - adhd_g1 = adhd_g1, - adhd_g2 = adhd_g2, - boredom_g1 = boredom_g1, - boredom_g2 = boredom_g2, - wenchuan_g1_na = wenchuan_g1_na, - wenchuan_g2_na = wenchuan_g2_na -) - -# ============================================================================== -# Configuration rebuild (mirrors generate_fixtures.R) -# ============================================================================== - -bgm_configs = list( - bgm_wenchuan_nuts_bernoulli = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 101, display_progress = "none" - ), - bgm_wenchuan_nuts_no_edgesel = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - target_accept = 0.6, update_method = "nuts", seed = 102, display_progress = "none" - ), - bgm_wenchuan_mh_bernoulli = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 103, display_progress = "none" - ), - bgm_wenchuan_hmc_bernoulli = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 104, display_progress = "none" - ), - bgm_wenchuan_nuts_betabern = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Beta-Bernoulli", - beta_bernoulli_alpha = 1, beta_bernoulli_beta = 1, - target_accept = 0.6, update_method = "nuts", seed = 105, display_progress = "none" - ), - bgm_wenchuan_nuts_sbm = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Stochastic-Block", - target_accept = 0.6, update_method = "nuts", seed = 106, display_progress = "none" - ), - bgm_wenchuan_nuts_scaled_prior = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - pairwise_scale = 1.0, - target_accept = 0.6, update_method = "nuts", seed = 107, display_progress = "none" - ), - bgm_wenchuan_nuts_blumecapel = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 401, display_progress = "none" - ), - bgm_wenchuan_mh_blumecapel = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 402, display_progress = "none" - ), - bgm_wenchuan_hmc_blumecapel = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 403, display_progress = "none" - ), - bgm_wenchuan_nuts_blumecapel_no_edgesel = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - edge_selection = FALSE, - target_accept = 0.6, update_method = "nuts", seed = 404, display_progress = "none" - ), - bgm_wenchuan_nuts_blumecapel_baseline1 = list( - x = "wenchuan_small", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 1, - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 405, display_progress = "none" - ), - bgm_adhd_nuts_bernoulli = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 201, display_progress = "none" - ), - bgm_adhd_mh_bernoulli = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "adaptive-metropolis", seed = 202, display_progress = "none" - ), - bgm_adhd_nuts_no_edgesel = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - target_accept = 0.6, update_method = "nuts", seed = 203, display_progress = "none" - ), - bgm_adhd_nuts_sbm = list( - x = "adhd_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Stochastic-Block", - target_accept = 0.6, update_method = "nuts", seed = 204, display_progress = "none" - ), - bgm_boredom_nuts_bernoulli = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 301, display_progress = "none" - ), - bgm_boredom_mh_betabern = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Beta-Bernoulli", - update_method = "adaptive-metropolis", seed = 302, display_progress = "none" - ), - bgm_boredom_hmc_bernoulli = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = TRUE, edge_prior = "Bernoulli", - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 303, display_progress = "none" - ), - bgm_boredom_nuts_no_edgesel = list( - x = "boredom_small", iter = 200, warmup = 200, chains = 2, - edge_selection = FALSE, - target_accept = 0.6, update_method = "nuts", seed = 304, display_progress = "none" - ), - bgm_wenchuan_nuts_impute = list( - x = "wenchuan_na", iter = 200, warmup = 200, chains = 2, - na_action = "impute", - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 501, display_progress = "none" - ), - bgm_wenchuan_nuts_blumecapel_impute = list( - x = "wenchuan_na", iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - na_action = "impute", - edge_selection = TRUE, edge_prior = "Bernoulli", - target_accept = 0.6, update_method = "nuts", seed = 502, display_progress = "none" - ) -) - -compare_configs = list( - cmp_wenchuan_nuts_bernoulli = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 601, display_progress = "none" - ), - cmp_wenchuan_mh_bernoulli = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 602, display_progress = "none" - ), - cmp_wenchuan_hmc_bernoulli = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "hamiltonian-mc", hmc_num_leapfrogs = 20, - seed = 603, display_progress = "none" - ), - cmp_wenchuan_nuts_no_diffsel = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = FALSE, - target_accept = 0.65, update_method = "nuts", seed = 604, display_progress = "none" - ), - cmp_wenchuan_nuts_main_diffsel = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - main_difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 605, display_progress = "none" - ), - cmp_wenchuan_nuts_betabern = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - difference_prior = "Beta-Bernoulli", - target_accept = 0.65, update_method = "nuts", seed = 606, display_progress = "none" - ), - cmp_wenchuan_nuts_blumecapel = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 701, display_progress = "none" - ), - cmp_wenchuan_mh_blumecapel = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 702, display_progress = "none" - ), - cmp_wenchuan_nuts_blumecapel_no_diffsel = list( - x = "wenchuan_g1", y = "wenchuan_g2", - iter = 200, warmup = 200, chains = 2, - variable_type = "blume-capel", baseline_category = 2, - difference_selection = FALSE, - target_accept = 0.65, update_method = "nuts", seed = 703, display_progress = "none" - ), - cmp_adhd_nuts_bernoulli = list( - x = "adhd_g1", y = "adhd_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 801, display_progress = "none" - ), - cmp_adhd_mh_bernoulli = list( - x = "adhd_g1", y = "adhd_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 802, display_progress = "none" - ), - cmp_boredom_nuts_bernoulli = list( - x = "boredom_g1", y = "boredom_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 901, display_progress = "none" - ), - cmp_boredom_mh_bernoulli = list( - x = "boredom_g1", y = "boredom_g2", - iter = 200, warmup = 200, chains = 2, - difference_selection = TRUE, - update_method = "adaptive-metropolis", seed = 902, display_progress = "none" - ), - cmp_wenchuan_nuts_impute = list( - x = "wenchuan_g1_na", y = "wenchuan_g2_na", - iter = 200, warmup = 200, chains = 2, - na_action = "impute", - difference_selection = TRUE, - target_accept = 0.65, update_method = "nuts", seed = 1001, display_progress = "none" - ) -) - -all_configs = c(bgm_configs, compare_configs) - -# ============================================================================== -# Comparison helpers -# ============================================================================== - -resolve_args = function(args) { - resolved = args - for(nm in names(resolved)) { - if(is.character(resolved[[nm]]) && resolved[[nm]] %in% names(datasets)) { - resolved[[nm]] = datasets[[resolved[[nm]]]] - } - } - resolved -} - -extract_bgm_actual = function(fit) { - list( - posterior_summary_main = fit$posterior_summary_main, - posterior_summary_pairwise = fit$posterior_summary_pairwise, - posterior_summary_indicator = fit$posterior_summary_indicator, - posterior_mean_main = fit$posterior_mean_main, - posterior_mean_pairwise = fit$posterior_mean_pairwise, - posterior_mean_indicator = fit$posterior_mean_indicator, - raw_main_chain1 = fit$raw_samples$main[[1]], - raw_pairwise_chain1 = fit$raw_samples$pairwise[[1]], - raw_indicator_chain1 = if(!is.null(fit$raw_samples$indicator)) - fit$raw_samples$indicator[[1]] else NULL, - nuts_diag = fit$nuts_diag, - posterior_coclustering_matrix = fit$posterior_coclustering_matrix, - posterior_mean_allocations = fit$posterior_mean_allocations - ) -} - -extract_compare_actual = function(fit) { - list( - posterior_summary_main_baseline = fit$posterior_summary_main_baseline, - posterior_summary_pairwise_baseline = fit$posterior_summary_pairwise_baseline, - posterior_summary_main_differences = fit$posterior_summary_main_differences, - posterior_summary_pairwise_differences = fit$posterior_summary_pairwise_differences, - posterior_summary_indicator = fit$posterior_summary_indicator, - posterior_mean_main_baseline = fit$posterior_mean_main_baseline, - posterior_mean_pairwise_baseline = fit$posterior_mean_pairwise_baseline, - posterior_mean_main_differences = fit$posterior_mean_main_differences, - posterior_mean_pairwise_differences = fit$posterior_mean_pairwise_differences, - posterior_mean_indicator = fit$posterior_mean_indicator, - raw_samples = fit$raw_samples, - nuts_diag = fit$nuts_diag - ) -} - -# Configs where 0.1.6.3 returned NA in posterior_summary/posterior_mean for -# constant or near-constant parameters, and the current code computes values -# (bug fix). Only these are allowed to have NA→value differences. -na_bugfix_ids = c( - "bgm_wenchuan_nuts_bernoulli", - "bgm_wenchuan_hmc_bernoulli", - "bgm_wenchuan_nuts_blumecapel", - "bgm_boredom_hmc_bernoulli", - "bgm_wenchuan_nuts_blumecapel_baseline1", - "bgm_wenchuan_nuts_impute" -) - -# Configs excluded from bitwise comparison due to confirmed algorithm changes -# (see header notes 5 and 7). Checked for structural match only. -structure_only_ids = c( - "bgm_wenchuan_nuts_blumecapel_impute", # Blume-Capel imputation bug fix (note 5c) - "bgm_wenchuan_nuts_sbm", # SBM lazy init changes RNG order (note 4) - "bgm_adhd_nuts_sbm", # SBM lazy init changes RNG order (note 4) - "bgm_boredom_hmc_bernoulli", # overflow guard reclassifies fast/slow (note 7) - "cmp_wenchuan_hmc_bernoulli" # overflow guard reclassifies fast/slow (note 7) -) - -compare_fields = function(expected, actual, type, id) { - if(type == "bgm") { - fields = c( - "posterior_summary_main", "posterior_summary_pairwise", - "posterior_summary_indicator", - "posterior_mean_main", "posterior_mean_pairwise", "posterior_mean_indicator", - "raw_main_chain1", "raw_pairwise_chain1", "raw_indicator_chain1", - "posterior_coclustering_matrix", "posterior_mean_allocations" - ) - } else { - fields = c( - "posterior_summary_main_baseline", "posterior_summary_pairwise_baseline", - "posterior_summary_main_differences", "posterior_summary_pairwise_differences", - "posterior_summary_indicator", - "posterior_mean_main_baseline", "posterior_mean_pairwise_baseline", - "posterior_mean_main_differences", "posterior_mean_pairwise_differences", - "posterior_mean_indicator", - "raw_samples" - ) - } - - allow_na_skip = id %in% na_bugfix_ids - mismatches = character() - - for(field in fields) { - exp_val = expected[[field]] - act_val = actual[[field]] - - if(is.null(exp_val) && is.null(act_val)) next - if(is.null(exp_val) != is.null(act_val)) { - mismatches = c(mismatches, sprintf(" %s: one is NULL, the other is not", field)) - next - } - if(!identical(dim(exp_val), dim(act_val))) { - mismatches = c(mismatches, sprintf( - " %s: dim mismatch (%s vs %s)", field, - paste(dim(exp_val), collapse = "x"), paste(dim(act_val), collapse = "x") - )) - next - } - - # For known bug-fix configs only: the old code returned NA in - # posterior_summary/posterior_mean for constant parameters where the new - # code computes values. Compare only cells that are non-NA in the fixture. - is_posterior = grepl("^posterior_summary|^posterior_mean", field) - if(allow_na_skip && is_posterior && - (is.data.frame(exp_val) || is.matrix(exp_val))) { - exp_m = as.matrix(exp_val) - act_m = as.matrix(act_val) - non_na = !is.na(exp_m) - if(!identical(exp_m[non_na], act_m[non_na])) { - if(is.numeric(exp_m) && is.numeric(act_m)) { - max_diff = max(abs(exp_m[non_na] - act_m[non_na]), na.rm = TRUE) - mismatches = c(mismatches, sprintf( - " %s: NOT identical (max |diff| = %.2e, ignoring fixture NAs)", field, max_diff - )) - } else { - mismatches = c(mismatches, sprintf(" %s: NOT identical (non-numeric)", field)) - } - } - next - } - - if(!identical(exp_val, act_val)) { - if(is.numeric(exp_val) && is.numeric(act_val)) { - max_diff = max(abs(as.numeric(exp_val) - as.numeric(act_val)), na.rm = TRUE) - mismatches = c(mismatches, sprintf( - " %s: NOT identical (max |diff| = %.2e)", field, max_diff - )) - } else { - mismatches = c(mismatches, sprintf(" %s: NOT identical (non-numeric)", field)) - } - } - } - - # nuts_diag: compare only the shared core fields (new code adds warmup_check) - exp_nd = expected[["nuts_diag"]] - act_nd = actual[["nuts_diag"]] - if(!is.null(exp_nd) && !is.null(act_nd)) { - for(nd_field in c("treedepth", "divergent", "energy", "ebfmi")) { - if(!identical(exp_nd[[nd_field]], act_nd[[nd_field]])) { - mismatches = c(mismatches, sprintf(" nuts_diag$%s: NOT identical", nd_field)) - } - } - } else if(!is.null(exp_nd) != !is.null(act_nd)) { - mismatches = c(mismatches, " nuts_diag: one is NULL, the other is not") - } - - mismatches -} - -# Structure-only check for SBM and impute configs: verifies that output fields -# have matching names, dimensions, and types without requiring identical values. -check_structure = function(expected, actual, type) { - if(type == "bgm") { - fields = c( - "posterior_summary_main", "posterior_summary_pairwise", - "posterior_summary_indicator", - "posterior_mean_main", "posterior_mean_pairwise", "posterior_mean_indicator", - "raw_main_chain1", "raw_pairwise_chain1", "raw_indicator_chain1" - ) - } else { - fields = c( - "posterior_summary_main_baseline", "posterior_summary_pairwise_baseline", - "posterior_summary_main_differences", "posterior_summary_pairwise_differences", - "posterior_summary_indicator", - "posterior_mean_main_baseline", "posterior_mean_pairwise_baseline", - "posterior_mean_main_differences", "posterior_mean_pairwise_differences", - "posterior_mean_indicator", - "raw_samples" - ) - } - - mismatches = character() - for(field in fields) { - exp_val = expected[[field]] - act_val = actual[[field]] - if(is.null(exp_val) && is.null(act_val)) next - if(is.null(exp_val) != is.null(act_val)) { - mismatches = c(mismatches, sprintf(" %s: one is NULL, the other is not", field)) - next - } - if(!identical(class(exp_val), class(act_val))) { - mismatches = c(mismatches, sprintf(" %s: class mismatch (%s vs %s)", - field, paste(class(exp_val), collapse = "/"), paste(class(act_val), collapse = "/"))) - next - } - if(!identical(dim(exp_val), dim(act_val)) && !identical(length(exp_val), length(act_val))) { - mismatches = c(mismatches, sprintf(" %s: dim mismatch (%s vs %s)", - field, paste(dim(exp_val), collapse = "x"), paste(dim(act_val), collapse = "x"))) - } - } - mismatches -} - -# ============================================================================== -# Run all comparisons -# ============================================================================== - -pass_count = 0 -fail_count = 0 -skip_count = 0 -error_count = 0 -failures = list() - -for(entry in manifest) { - id = entry$id - type = entry$type - cat(sprintf(" [%s] %s ... ", id, entry$desc)) - - # Load expected fixture - fixture_path = file.path(fixture_dir, entry$file) - if(!file.exists(fixture_path)) { - cat("SKIP (fixture file missing)\n") - skip_count = skip_count + 1 - next - } - expected = readRDS(fixture_path) - - # Get config - if(!id %in% names(all_configs)) { - cat("SKIP (config not found)\n") - skip_count = skip_count + 1 - next - } - args = resolve_args(all_configs[[id]]) - - # Run current build - set.seed(args$seed) - fit = tryCatch({ - if(type == "bgm") { - do.call(bgm, args) - } else { - do.call(bgmCompare, args) - } - }, error = function(e) { - cat(sprintf("ERROR: %s\n", conditionMessage(e))) - NULL - }) - - if(is.null(fit)) { - error_count = error_count + 1 - failures[[id]] = "model fitting errored" - next - } - - # Extract comparable output - if(type == "bgm") { - actual = extract_bgm_actual(fit) - } else { - actual = extract_compare_actual(fit) - } - - # Compare: structure-only for known algorithm changes, bitwise otherwise - if(id %in% structure_only_ids) { - mismatches = check_structure(expected, actual, type) - label = "PASS (structure)" - } else { - mismatches = compare_fields(expected, actual, type, id) - label = "PASS" - } - - if(length(mismatches) == 0) { - cat(label, "\n") - pass_count = pass_count + 1 - } else { - cat("FAIL\n") - for(m in mismatches) cat(m, "\n") - fail_count = fail_count + 1 - failures[[id]] = mismatches - } -} - -# ============================================================================== -# Summary -# ============================================================================== - -total = length(manifest) -cat(sprintf( - "\n=== Results: %d PASS, %d FAIL, %d ERROR, %d SKIP (of %d) ===\n", - pass_count, fail_count, error_count, skip_count, total -)) - -if(fail_count > 0 || error_count > 0) { - cat("\nFailed/errored fixtures:\n") - for(id in names(failures)) { - cat(sprintf(" %s:\n", id)) - msgs = failures[[id]] - for(m in msgs) cat(" ", m, "\n") - } - quit(status = 1) -} else if(pass_count == total) { - cat("All fixtures match — build is bitwise-identical to CRAN 0.1.6.3.\n") -} diff --git a/dev/fixtures/compliance/bgm_adhd_mh_bernoulli.rds b/dev/fixtures/compliance/bgm_adhd_mh_bernoulli.rds deleted file mode 100644 index 4946eaf78ebaa5b8b2fdf0bdd058d6068094e4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15972 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 SO&0!k-u^#HK?{c$#{d9eMf4B= diff --git a/dev/fixtures/compliance/bgm_adhd_nuts_bernoulli.rds b/dev/fixtures/compliance/bgm_adhd_nuts_bernoulli.rds deleted file mode 100644 index ceeb24b03c3cb418c6aad7c16b96d18a4daf057e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34326 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%0Ab76Fw9N={Bwp*WOWueCt(JLCSz92^ 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�!l#U*?QLt@#53(M#{S*fuXf8 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 diff --git a/dev/fixtures/compliance/bgm_adhd_nuts_sbm.rds b/dev/fixtures/compliance/bgm_adhd_nuts_sbm.rds deleted file mode 100644 index a78c233d6297dfc54366a5812bd0cff88714a726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35727 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®XE&IC%>x3HEjLqMhL<_qD^u zwWv$?1XJJK7OWlWZg(NR&gD1lXFxa7C(k|e1a+((cQlEI{_QhyVXZR*ukSVtcQYo$ zvFyMS8Vzy2kGgpX_EIvp5B8Z&h?5%~7gQoY*;<1L@-y)IlNrk|1n=KbEUz~KzO(af z{89f*O0K>Y@Sr$-w?a#ZI*@MUzKJHp@+L*r6~xn=(wm)!yb{~fql~-ooZlab;fODH z`n%S+wcx9(j7)-_Bs^MQFdjHR8xz0k;X&}8ZD>?I1w5^DJCHOU_QI_Hz2O}C`&R$J z{%eG|xS}9zCmnet88q!(N{B-ru9;`*0(}%7$}WG5zSbn>?FOzBGvZH(-@=~i&?5Z@ zsE5~G!bgfa{}r&^8hw?h+*jnDhF{UC5W^?nsZQM0%jo<0J*{Y0eSoR_JW!*iRLNxT47@edbl@ z;I{G7IN%|^mmG6cAMx<&%g13Z_^wgriJ_Zu8Ff!>pAzEot*!3UmLpEFqtcv5i0@}5 zg^Q}78`a0TT6L%!Ink8OM&8F#BYs4G3#1P23-h3RHm-wtZiM)7V6ba1@S0jt9k>-b z$=3+{YqTExh7GPMhVC8J{HL$cA@I?OTkiloUZ+oXN{EDihx`e)4LC1;w%!x-CEBU( zxGmz7h?J^ssn~gf{9IHc#Zp zK_0RP`|Uri1THu&ej(5qR#@T!lYICu3mew-61x3sXyL1k&^Phg(DjwjNw2^&;fVY8 zrg};w^zWEgYg85LwpTT)aS;=7#F0ksN8XthmJ8Q}Vt&2L8I;zBI0HtyGX;eBgpop~ z>5O@O@NJjRbKu;%i1Y~a;&BFz)rb4)MkAvo!!Y0eHB=V18a%Nqk9C>=d>@ZVt^|%R zMz@`4L0*lTsyj6v=zq*5lL+YI`;M%6Ehh+Zm6P7g2?!Ie`KEq^iBCPByJ`2JWc=oeCLdF0+q)R) zJwhB~Tfx2o{GLjRI=TmW7nd2;7g`o8g!!7bJ^L1o4{%Mx=+IlF^@+ikVAlrOTWJ|h=VTH>Nppy z!n{q?ta1rQJ>>g*T1n8=NiyB zZxf+6?#+=`f#X{nCP{v_B_v~1M0gPJUrH%GS&sWnv0aax1AV*0FDjh@9e(_50k0Hw zjoihWy$$xy(cV0og8QI!UTpIM;O19m}+|a8D?Be(#(w^fqv7c*?$gnCD3*@yR~m=?#U1fw^1s-nfnm z-p2L#K9E2MuF8BCI;BZyIv1M~QfC zcTV*G5p}xGOp!w$qTZey7K8iieSzrJuQq-CEG;VZhyIM8ylpse;!X9`^8-Iqa)LF& zWZzssGY%!zIjkOscobS`px-pUgZNG-0*9ByPbZI?Ue0M>1!3Zjva=p7!hr2zWa+WW|! zA;Q4=Kizh_aNH7j@7-Wtm%f>hXuLX-_XFnpl~_*!2X)Sxb3Jkx z^ge1b7NQ$tD%}LK>`!#(h$;UAAH>;!^$;Dsw`A(z#)WtT10LANFR30#`XX ze?$<7Kiy))#vS10>B}Wo$l(34SU2WN^jU6|?YILt7T71O?uM=vKfF(pRQ&(%C>o>s z*5q~#^5V$$3*`2mk&YKm&QSjrY_R%V^NTM$I$x~&&j#N8>_@ZD&zSyqhiGWybF9!q zNM%##EH4J1$>7o$0`HY*FQL{&q01=c<8`G zeed?aIfPaHuS<`c&`xQy!JY-@_6x)KBPt z{{)LmXVIua5B@++|9*tSpmM*oKk1vJZ;b1HbNsF4(R}KjesdJsZv3?vaM-s!VCw6m z34KTZHS_hEHrG=q04AtR^~Th{-P1g1Y|s7$mkEzTKFj<267|POWwSkCoaMnC0M5u= XOpbs86bP`{*Vq35M+u_oE$#pS_@D04 diff --git a/dev/fixtures/compliance/bgm_boredom_hmc_bernoulli.rds b/dev/fixtures/compliance/bgm_boredom_hmc_bernoulli.rds deleted file mode 100644 index bddebbc320c43d0c1fe7aa7e3daf8144cb54b6bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3199 zcmY*Xc|6ox8?W3Vl&(}GC9-GVCQ7DsEyG3Dv5o9&8XEgDZYcL!%aFocvSyjlor%ew zE5=xh%%DM8W3n^DEao-y{_%d^-#_Pf&hy=#=bS6)0!Mfs-zw##y_o4m{*6V^REsl5 zjde^mPl%k(K8Lmemu}uZX=311^r1vX!Z_UlhR5Re@a2&5!UanPsqY%I%b%AmWd9~vC+{{%fxKc_m{gg95Wg+<-C2% z5{Tm&0&$~w{w}BHAjqY6Aq}KPy}&M4xNpmhsVTNh$3dK)|9j%2Of>y32J!8;OC$vP z?wiVk(kWvBW)Pd*WmAGP}H_nJMBa~_s?O=2LnVy{xzP4n@k+O1n*()})Qk4x0=pK!Kt+CklxHKVm&X%*hJ5WQ*m zVv{-(`(xmEUHQ_CLL}|vr=szVYWTETy%|z-Y;Mdf}Cs(Rh~2`CcLChAS8ncK(~3+hBWnt-#9^+ ziE|!)JPLERcl%VNAOC2)A+%|6c|>$rphJb^s7;Aj8}T6R_iq8eHVXSmC~KFVa1SIl zN+BwAK&FM7#3&gC2E{bCn}cSIW0y+C$_zN@ zEG~5T)gsISRjI48Nf(q}O6RAUU~oLQJ>=gYx$HHE6DKGjS$lqKeV8r1Ngg9o;aa;0SssemmV5#fM+9J=E>Bkt0BeqqTQ2mx_x=g8GvT^^ETaE zR>CjxRrjXbl7ziOs@a~MPTHbqpt*Ca0hsx3Q{)p17ec?U`4shytUi5GOUVWATy7x$ zH1Z@$%C0a=;+%p->D)*;^xf~ORI#!VtH2Rxskzyz&wJ%*w`4mvBcmJxTTF&k&}U3= z-0Qkx57K=N38|N-#0DbEoK2f-RUy^Bf)$-=0C{#w&Vdo}$ZMaHd$!kGkmi3YLX^Lx zi8X!yRbzm0(vN){cQk3@c4ytgD;H&}&utRJv>L8-{syT_URwJao0NFIPU5NbA<5E9}!GQn*8!y>&o`3ZyC3*~}}j8it(j2}i`Dq{W}4MabQq){eS-6-Pylx3uV` z4%PS9ANW==`M`Mo2=^1rx`qC4_+D4bVm912^9W&A&~n_03#z>TWZc5r}s6#F+LSWihF-A{Nj#UxT2kcAIB+hy_^ zeJkAcr4F^;OEmWU+1T@(*7dG`R^bm56<%2R{OX4MCvZWjjD93zC8IsLc9&ee$IYAH7RXZ=J=c&x^-q#;AERhNm zQ19^HHN*Fn3Xjs&R|D5j@YOFTd-!j!cvp73S^_NJp0b$Rr*asqo$a`>)-MBkCt~LI z6BA;m_xIuk)lv4>|Iit0vT7cJyP_zYWSBpu0n`yx*z#~M!*Qo3cYu6aS@ncSJSf0uzuV)xcXhwH+hPH5hkuYKdEd9Ryz<;et7+ zsjVG}RYE6^Fyzrok0M;4>^zb~U|TNfPT*8N2_A@gLAoCZ%_CVfF*MN3kythK=m?{> z9TQ})@ixuzV{lj<+bF2a9SVr3u3t5>5X88FmM*a0!}1P(sdNw+tl!rtEA`@cIH7V;Jp#iD!)*;0 zYYpYIkGb~%RMpu}iVi7rgQmJ{<0&5l+}E}h#G{UlZQ5|SJ3IL({u@g(@gTb4Q*J|F zjoDW?zmb5nm`rfDPisrfs-A#!%DvnnTzfc&RLP%m#z@ipx(tc$sF1u`D6lhoHGqb!mSNyZcR@)B#j@vr|YkgxK04REsI z3Af_xyE!;=yh4a8pow)PYcHr3d*1xKZnQEQDu6+Nr(s{7(sb?WPQgO#gCQtDPx~J~ z2jjQR12(L9F@^EZGC7ZIgsmlyKJh&$6`HWu4|qT%o3Fqm)#=dMwWAZ}0@Cr-Erno$ zY(*-sO-f`K+|kYNDzCHBidggv6xjy13bT90@^S=1zdcfB&R0;5yh4Oo<|^4&r^)J* z%al4&jl|J^=2V}xce?;d$d7LNJy5Sb6^tZ)%d{-8G<{f-Q_&7k(+WzW`9p4ah7_Fk zrF?nQ2)>>XR`}biI;*q{$KD?JUw(|`GSSl6ocnc(gkXRBS~28a>W^;2zS&vPcgf14 Tx!{IWHt079aegfQ=#l>b)Js)P diff --git a/dev/fixtures/compliance/bgm_boredom_mh_betabern.rds b/dev/fixtures/compliance/bgm_boredom_mh_betabern.rds deleted file mode 100644 index 598d60426f81ed5717639af33a351f1ae9c0e91e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37904 zcmV(}K+wM*iwFP!000001MK_`MRY>gw*< zg~KxxczAe(ctpemc!b2;U-5`f8E8l<;o%W5Ztu`;f9SS9_;^Hk6;=pwr|5vR4icYir5riivwL|u`YXPEN?7rnd4bX)8oQeZ*E6=BMp3T;3eAh5w=cN>#-pMil7k_@q2J{je-;DyuSMLeNgjj;$5|DhW@G|F zN-sL4*CzlS7fUvk6(?Zf#Ot5&7681f(dh|SVt`2C$LoH8@aH%|ey3`}I}@)%&oo5Z zDsA|n`1>USs|mtTp)jF-LbN?pj?c*87RV1(*V(-6v=xGU?Q>M@?98B0D(~SUl~yP^ zY56&kiv$$&d6)B9j{Q(t!tq#Xt1+lxZ9j&NSQrX9S*3S{dlU-WqTa3Y?Jo4DY|~9g zm{z04jwO~S%RVuT%2`XcnKvy zHOH-^{h@TWAI@Tlkr2GdMn}na5ejsbrM(?%4m}fWj6E~|0eaKaFXZe;3gw)yZS?g! z29;{M8-(q)gDUJ9o>VJELjm#miV&M06uqvZU=zXurPnk@y4KxP!q-H;Zvm(P#atPW5QNn zsBcWyjcTwF$|JtbzDMc@R7`*Oy1YQ5>QeENJS)H9SZ z@acOgR8%=YL&qWsmFi8NI}}t8mFBjUkTV2B)gk<@xu<2I2A%L{@x#PWt4zinuJmJ2 zZv92BsUa7rm@>IS^;H2>{ZM13WxhFhVY*id8TFH=xKW#v%z zfDi;up32rGw18?1Id_fu--Et>w0kQb7Xh^wyTuxt1E_CR$(G_#1(bhK=co&%98@~* zhTr%?1FG|nT=G_}gjxyV^OanCpzcGQEj>m((2yuwcG+y-&v8;aK6Hb^)R;-_P?Wsb z53w#a`N+lf*Tk`ETt}B)oFlPQW6gZmj<@Tz8lNoh>Gberwc|hfJf9r9t#&kxlw{1q zSxv3tyB_699yLu7KO3rWRy7s1-pSXJ+G=~w+RdKlPgm0j8hmNm`a(^eW0W7vv#3e5 zJt2H^K~7CVb%Dt{H(O1(KgLeYa9B+!NwayWpGxh-_el0Tq{(W>&WrI2nF^~NaJ$8@ zbi7V&AAeTo>I$*iUavG?C;ZQ9vS;s^b1T`XX-=iedb!Aneh0dStO>=3`1>|bHf}oL%w%- z(r_O%BQ1i*{azB9;e7+g%?&|wJycJp&+?H>Xn3WDuUNXS9^wzpzK~$^S4e~A)2KQ0Zvben=1PN4!w+b&*17TlF)#GPec}4I zL}F;^T;Qw8{kx#~75yKzwVu$j`hKFQqgK$`VR`onCsAk%@4D1P*Nht8xqvKI>Mdxi z?4VLa)HP_Hyl|MXrvO?`ZQP?%FAZ&lalJDVo>s&EeqB1CaYYS3J7e^=>3|wR80p~s zsbXl>Fm75RvKyKuJgG=`S`C_ckrbe5XRvH$ZJ{Lf^$zfYF``{dn!pRDlr z$=Gvo)qcBg=FXNDe?Av~N|gJ%MESo<-2Hcn3V)Y~M5n)EY3X2U^IvDl(#iQxJ@{*e z9Igy`Tp7D@Whmgv*zOe`-sWF^pV2}f;N6SoL|IV0jw07sPd$_^tr(w9!44Ign($<1 z20_L4mef_^EKo*^!R`4a56H!q!AH&15{lc9WP0QaLsf5B=GUr3p~M(UBHFxl2rPAn zun8nV?zN9Te=pmFGP^s??oN|IRaA_eIq6rR!hCU_;ZbfR{tJzAuCRteC@^A4sYz8H z3fcNtQoBD2veMjZv_$s;3d_D3Byi~h6uNeX)PYnQ^0rf<6HJDnC-GOxk7{^Bj&Y}j z-9xWIW>=m@u|7$MY$(ZWo5$Wk0aYE}q}=Kt|C!I@Dl!AmOJyI^WLh;ST;?HhXW|zm z{#|MeO#GicZiIq^o}pDx2qkBLgs~gs*%`n(XB!Xs+zZU6c^(Z}5t2ywf5?X}PH@&A=r@Ay zhzcFce47Z}5ZF>YIehSEd^K^&5h2xzWTR>#ZzV);C8Vf{hMsvbYec6eIsc=n;TD0KiYWoh^EWPPQjyn6 zI~QHlRJGinnLO@NQ|qm-;t~;4lbraH|5{2zO>XfT>$7=rU12iLQcU)MJ2b$-a&X>4;2bwEBae5bh z<-cy|_*?%Ej}q+TdJz6BLHkDu4EFXdiQG#6$Yc6b9`+vhM<(;1 zGXHen`I}~uyTTuNtbfY;AJ^y4x=26JQJJuL=%9?)%)iED!DjtkNM>xHzdM*e<)RMe zPkDdWGSi=$Lse$`bLQXGWFrY6MUirUwfz?C3+lBm|+y;dg z>X7(S!tf);6X53&nr;hg`o-3$hf zWv0+V3pF`siSN&LfA0U~DMtPqPca$E{W5>vkwtc7|C}TH=bZohx zJ@=1wT4eq8=ep|8_0pf~pg-4rf3D~LT&MlH{`zxW_2+u&AM3+E*L{Dk=l)!${ki^% zU03}d3kHN1HdnWy{;vyi`$O`t&;KYwwq4}sk^>yq+#gpJb^`xgh4|~GLxGyP zl<0Xy{@3|H{nwNH=cuF?&Hw!3_^(~L|G6vwKX-Tk&s~N8x%=}q@L$vD=Ux1lUjzRr zht%8YweV+qf0RS&;d)*C8TV&}%Gf@hji|HO(t|xBu{@JcWVqw!qiY@F-j7T*6Hg#Bs_VWlN6|c$Sd3le~uOmz`r8Wj{@2i8!mD zMfsYz>X)5rwhfsJ53mVr2ysh7A+I! zaXiGShS!W^B$8-9UyhMtHbop?a(+C>oe0l}%zyV)RYROk@fFrl=Yz*aL!(39o|jIV#^@OgNa z%KQ51_FSyludg<4cEK}k@(o4N+w7vP8+i0nPjOz!1mZaTH^t-Aq43xhT1s9y z0eGZfm_y{$1$g3p;=TJ_-{7(Gmv?ioG{BR^A2xfp4x^lSctU_ibqWy8eBwPwWr;{k z68rIx_d`Vd2FchI4`Gx9me&G^OB;9AoSW_J%VU5biT{ykJ_XhfFK@fLJVA-S;P?FL znhGFzzG7rjc@Vd$uW0kG(rv$vy+86}*$5DB78zB;v4F_R{CUCmJe(2=oTxSkdWuNU zyHDV&VjI@fp2#Do!@ zABcpJ=k(YfaiVpdDp>zO1&AKc;A?x(?<~;;i@pahahvh&V&T9jAifb#U+YhgQxb;Z z&5Lgm5Q)O*QeH#vJx?JLD{J1|!!CwM zqRM}B4`#bRRg)L4ak>E_vlPET;}=-vcT*%^wFAVukMCn{X5m(6oG0W^79jd=ag^%g zo9!1;J&GSvwt$%KMO{Wp2O!woqc`(D8sKY`KIBp+`F$_1b$p_!0eGRLi;qK!0m01+ zyL*0UAQEn^B}C!{1EP-4TaphS1AW zK_sNm7a%*Yj!4kjWM6uV4G=P37fy991B93D5`|+#(cXupvlt!#Lbrj_C+&{_;z52k z5OxC)Z7mGM`)#2leoeh1*2uL8H7k|WP53=@*^N}r#f&h^e`a8U${YX?8wi* z*g6P^+6!V83htwoxTADFZF{~#^@pP;+t6AYXXto51VrD09z-6xjZ;FSMJoZO5tJm3 zg2u~CeSqZU8uw>w4?wiUeoIPw4@zPWYxZdlB0w~i&$^ltf=GP9z^#u)5s^rvFYVG3 zWwa%$4mm7Rh{Wz=^`T3HfLN#oFFtAeey>J##J+_Tr-UQ}6eQ>S5edu<)DD{;0fe$W zY{DuQD5+mC+UYd#07{Gp_lG`toKo#AynIOH5uh}yBg(XC1k{yGbsdK<1M;~mO-GXV zU~LZmex#lQP>3#0%1f)Dq&%xI^EtE+Yrl@rif;v=@~KtdZ@qsvl1A_7 ztz#E>aZ1(uRIK;W79zEV?IFjUPiQ~Ynb|!S0#t@?7xDHj;FS6--oxGYo`7m|l}GBx z5F+(gMU(w+E(4m|a_e8yo&wr?6xYA1Cn3^Iz1z>XbQ92c84CE{#l!6p7uao-5s?;O z%&7LZ86tHPInxCuT0qB5SKL59fk<dotx58m7XTg02kBFF!hlxmlAJ@A z5};#Dy>6Vr1!&IR)9O2l59rEG8@_fySj{LO?`50BdYHDU;n^OX(!4%-{1X2wMB3@g zdpI{E0Bx3o?4l$AA{~Y95Ep|Vpi?P0XmRd4pe2b_=)KjyvnoHn72fLwG_QzU^6r^o zeN0NTvY-s8lk-C5*X{wTkSu4RitX_^M;EhiKm)gqo<*uSz@(XMA~svb4TwiL^^hPrTq6-0rf5C)Kg#B0L}fHAL5?xP|``Zl0Q26 z3{V#w`jSie4A81Br0Xwt0Gh#>+e!K=yM}_xv`8Old9H zJ~e|ivRCkSj5?sban`&z;Hg>#Xya_~q@0>|lrEa4#qVqxA}w5|PSTnO z81BbV*jAM8D82uvChL45N(S!hBEfWiSPdq7%YfF-j(rO49)AEBbhZ@9uj2s*^{H?KqyvKRu)vQ%Tc(sQikZfk3I%>a{p{C$%FXMnjPdY&)E5ipT4`cgJ1 zV!cPzY~e_Oh#|k#75PdV>n+<7=^+w;(Q%a1aUVluB6eUfb`eF}l(eo*)w83_&P>B$ zN&Z-+jARa(bpEzXYYba0dv(#iU0VMtqYs!aRtU*NN1#;^aY&Zj_9{V#s{28}bXnDI z>|+$b)KT0iqJ4zOL{Xo|F8l`VlWWO$nz{g!lvo7Dv?0zRJk`b17195g80%u&rfI7kWfJtn?yv)`ko^6QE}JrHAuZuX3 z0%mH~s5o71z-+;vTArDN$TZAeJP|{;vuD;CWqZE@rqB7Rws+{zKAp}H7kvpZDSXi( zOaSYLIhk2ZJz!!I@hk7hM7y%SS6^Uzp0&;L5d~ENrkbnv=T~ZeS>`V=z8u{sV9J=< ztPpWQ-b&wq0PoUW+^r}bI^2VcKOrddAVY#bn&celW;u8BA)Q4-+vYur?DzlQdL=7wK$ zC*ZU+y*8x$6(yH{`nS!x!e2Mj0gvtN9juD!Ju4R%0hg#>__1%%fNKdz#NVyk*=NrE zn@xj&o5#x5_P{Z~Q|nN>(eVvyG!fSvfz`HrbwX$K0FPjgxu^;$;8Dy8l22sVQSNEy zjN#r@tOHbpGPekKl!y1xql4ey0$!sfwr^aefS2{a-V>Uyu!?u#r!C~;_L^|mMN5a@ z*Wr~f;rI;J3typ>!yf@J*PeXYhjza#Ps+D)s`K1COPh8)^nD9Xd1>pu>z{G^eKm9p zd)wabD9_Z#mCNB~|FOIp5AC0r=>XniL4hr#Vkmj^kK7oaj{L{u?i0(a`DB5Thjg`$ z)MXWsyDM6&fyxVQn5FiNRr|j!kLAX0r`9UKQ{=5MeXe)=yxa6lMXTeKhX-TDd20K* zAZg$Z&-#qpmg#XWMFEuD8xw9XOd0|A2R~V&>I%SJlrdrd`5NGH8Jn~6-iuS-M{8%g zPiF&Oy|3@MG(`V7*(dgn{-1bI*KvgHs3dW(+oxjX{`746;>4^wwk5EGVzXM70=I#Q^p zTigPIk?s$}S$^#7kx`k{&z4v#g5`yS@Uey+$P7N&h1SZL)qKVTt6(;*D?$Bsz6^2n zV9IuVZuT?Eq=-WDE#0RHyn)b36FEDDFd%dz{V8Xy0uV~IczDBf5Nl_Jmht;7AQT); zaPj7AAatwmp{{TT5Ejo6`OI(l%L)M=`n|$}Xn(YFD8z&SAvK?Hl?rmK5uBa{w47+~ zsrwg%mZKCLx$|THaWf!TmriX?REQ{K7k#GIX#wrNbviRo10ZA|dv7G}A`sHNRGBn( z7*VjxR?@Gu7EvhpLloo1y+G)Eq|cfDuRxfC$D2|8ETT}S$YW8FQQYRG*88Uk0U@(e z5Exp6TQY~smR{6A=;)yeYF{Zt!MUW2k5d}BZI+fGINkp1evgkkp)87a*?K*Wh8C;% zb1QzQy+AOheO)@14l8SeS0_0H1hcKL_y-04#|quLkt?u;k0>}PdC}w0I@*QrQ?ys! zAquGt&AoP2`E?Jqmw;O%K#1??EaNF=ta}0{LO&G%p}k`%Hykr@Tjy20#MT6amh34m z&YS&7!#mDlwG}{E_vG!#=>fFH`;?Bjen$I7wn-_+9xeT#r7XG4cK>EJ zOG%jEv2!$SZ5h6Z(~6&tl){wo6v?5-B-y@LKattAf1H75ci-w`ITryYA=F^tn5@C zec1~S5s)7BC{D-e@WIDv-Mf+f*1(PHq*ro%(SeaiS`j zXZQKth@-W+M6XU9-W~_Dwz*RhI34pi?Xv5pJ3Lh!Flww_15Ys5-N@K4jW{kn-CM3z z2~U_VZbp$+!()zKf~o3jh{Ko9Fm^&Ihy%&e>^c1Fh$Ce$s9t+Vp&Wy$$I1AZ5r^!i z7$j57cXZVAj!jToJmPRJ7hlz*8}PW-m!fgPN_boYWIC5?qTOGloQR)|a0GDpXT1* z(P{n5-^xlf;fW6_@`EHE@K{7t$syxSczE3|rrkXaacuLl>F}33I33qcReE{A03MSi z{rD`{5+43&&u-{bjnfHE#xnW+#}KCq+vi9Q+(n$s9*VRT#)roRG|DgCd;m`pLxRTF zMG;4fic|Fc+<)2W`;3!b&mqLA51)mv^2@@LlPzB~z%1g}yJOiIi=W|%6#EyqIHTbq zaWT)c9nat)ePW&GzTJoube%b=qUG?YgZyKe!8XKUfxg4nC+?vQj;Iz;;@i>DN$2x6 zvArnAVpP8cUCD%}f>%bfi;ZwP`CUmyr&$@E+8=K+w%!ZRTqI~-V5mWyykTLW(%ghN zk(DzgO7H|8TVBep<_^c{gvVBAQ}|Utpv`-HfnFJ{z+8D)gx0UCzswxhRfm%B{2j(N z*NcEqJ*`k$ybG7`ro7T5*|ILc8@HADVxEUK_h`e_x79y|w^kEIY)qxmW(j3mT^ED5 z)I9JmUrzd~08c?`$awQ1R$BGKm3s#OUhn}o^8@WWONqxkp~MgHe(VuB@n8>1{E-<# z_Nq>-bGdhJmb3x9Jwt)TLXQFdqXe#Cy+o9Fflv9PKeQm?3+@$U^IZc3*;Mm|vJcQ6 zE%Z#(j{x|uhiUaLF=N%_IX1h35AfAbr{GPTMXPLhjw>+_tM_ZMXVGkk1c5}me|)}z zh@ZqY#Hv1yNRY@*$|kdY9N*3;c8fIpwglxPDva??054`ndH)M>fY&BAty$c?J&(5P z*hIGbXKZsm*6AH?ZLIVCEl06BRDV@$(81a;-$f{CgcU!&=uBZ3z<)4F~t z0@Vq3_6c@Gd=pB24OuUMpRkfjNH4de1czy~$IlMITf<+bkGx_7c;$|X6a9oZ#rH7d z(Q=#u1R*C{MIyKB)2G=FDpvMSf=gJw&``QiX5$ z?Es!lH(P~-C%_YTe%$!69N`U@d ztN~A+lF%(768cIyV`5nV5i!r_ciEyiB~&jp*BM~yE~qN#1$3-cTpWgPu@bnJN;5eC+OK!_mo;PnTDuI#ho7%v zePCG^VC;&L1~zYPc6yDq&W3L+YkNEohwZH--<~(hpR{7+Y5~oes>_XgssW9gJcHvU zPe2_D?c1{uwxd)Qe$lDNq*2lY!J{3v2{@%~KXJ})pC%%;;37x9yAE16@!PMsxv^4^ zXfDOx#wm@rl=%xgCammguY3a~aY}p0AF|IpiuLRsAz33fL@HNZq4UFSh%|Uq4W^6| zfa*I@PG8O%BFz`iaEtmfKr0aX{#&8z&XNm{ePoD1>pA)DJpOC66mPE7ea{9oFTdK( zStnrKo3?-0Yd4@hzN^Zy>KmZR)^rfQWdUf839UByup-hC>vAyW0zg}9ytG^SD4@IH za!+^46wvNA{PNCb7a|?W-e_j|PL#AfCF8y&i-2aKEQ@D-H*Q1RShMjZ5NY35X!|~( z1Wbo$o|UubA!4G=cqc{_0?ge9!lET&IAzS%5a0;0Mr80~elb>g5$l6%Avw>I5$QiE zS0uR9SS01WpIjhz)%M*F~rZZzx@*5d}I$Kr6q#cU*732~X!`fvH`cg67DU9bUoNWr@N{SQmc7t-f>1L0j2>vrxQ!AsdOEU8EEixzE8Vp6jj$do zPtCQP0vN@tYX=zD(E2r9W7T#*`*i*u^sRH?BN>ni-=5u?ys4c5&&kgR?GQ$B-YPI&&_G(>}-LE{G7sVz@%mJjO$Ys zz@$&)m+%juWO`(}AL_PFc+^N_ z_l`23=HB1_-WctkC-rv&_WV`o;km6SbSTytc<#I_BE$(hiiEyIYD@{-OZm-sb9P ze-S0qG3oms-$wvU$a{_E-TDAC{3UYuo)B&yr2{iGyB>{{0eQx^eH_V%L^B7>t^5c~lISrT^398s$haxiL(Uh5UO5>ENVWsJd++9RWs193W-u5`Z z$Yz>cRRByO<@{^`PKaEG^{b2Jn*kSH%F}|n2&|l*8HcMHXn{T+I?6-LJitgbfa;Sx~u1nY=vVS(4_Wg1Oun#BPY7I64 z9OCvzbYWIw?1f2Lh1oKBG5IMRw zM=p$U0M31f0_+*?qqRIAQ0!j`IMd_q>M}23wRV3cPc5{g9IbvwUNX3#Ee*AfRBi?w z&yx~5A0-3MD_=vj1WeH0JN~x4=Q-daF89dc-tN!$vA*|#H?YRYs6@nyq2zjhs99!c z9qam;mf?F^h}`GI0Vl8Zue&GJ{_O4wlw6Bfy;9vEoO0$?-Ji|E2b^ZaLopr0XiwVO znS8nlI76@5nAzS1oSwou7c-r)F5ihti#dXI5)!<#yahNq=Ctftt$$fgxAu79GOZou zm=-Z;Q+N(Ie%uR4Xn|33^4)6?AjSinWMT7rP&>1C?dyRqJ8oLp8<#4i;nn@GCNy2d(Vz54sfnKQ>5s6fXF44|NU!S@6JYx zJKwVy1)N^7CY)pvSp7e~m2ck%xLo0Y(=6NL|DpXL4+bA_9TJbHQnN+mTr8br)Y3)d znv&Fc^gc+o6@t+2ljt?)$HOV-*OmG!6!!o(U3eUY&PBlW_@iH7 z%QE2d6Rp}<2?ktRj`vc&TtfQ}4D1daM#=BPU%;sJ9ILgvz;U`Fz;DC4wdZgT;JX#j z&VFMP@I|gC@5`D5yg?`FUe#^_-k5{lsmkuZuZ;UK)@XddM@cW88*L5v*bHLEvjcFu z&(JzaWCQEVu(q;}_kgde^X4^rHo*6Y;6XjLG}b*{b_Jh4@2rjdnc$U^SiN<5<$UT9 z`6=bEo$=oU{2Igj(u0ItL zrv_xX-QSGV{R!<6KtMmu__XCB5YU@D#$ogv2<(@2Gk1 zMik_V)4!*r00b#485>`8;nruwk0me(2&UN#eCXug*%;EdAF|#6!H84GNuFK;g05ba zle=87TBoOZy}XT;vYq}L+4k{P=Dj~o`UxvrL5t=QGqjv)n4ynRJIY^0^R0F{9q^k* z#95X+#d^o*ow7?J;P+kGB2Jmdsler3iH3?cSS3P+igM%sWBI=}L{IZ1V|~w;Lcn<% z@K3tAI%L(L6tF%R6(#!?Yf{2_!CUEA&v|f9?bkx&zi?RN{O)j+0@Nqz-AWp<%4z7u zGVmh`>JCnk;^m>0{*L)l^brX3Xm_5MwZ(1o@WEK6Ng&AcJm5GpDcXnpBzae#V)dj~ zuO5921YP<>-<^Ao_2L^nSF*d?X4;Q@h{qcKE+Vgn2J4HjSMddnx7#rkA;4n*f_m## zhgPdl3M@!3@UJ-T?2kkzS<0J;g1(V~gE5kDxl^;wmk*UFL8>KtGHone_rYXk{5CCO z`IAAtRN;9zOIhdZ)5lhD?v2~;2RBU+bLyIBjQE`3XYRbugq^c~3Z>WepYzj7|0$et zqnwvR@f#ec)UzeY?gr%-wR@l9se#{yl{UqQvGLN&P&%Qyi&$|Q_H@S8auGpm^`r*1RT)O5c)*$o(&iSzn2nP1RDMkUL zcw3L)VpjPYm5(}b)w#=(BA;7+3OSg3fe*g)`zido*wJDb4-e66C8QP#sQp!;#F+Bi zoD#*qZCHHtAcOVIpTd<-gH_7eo#1qBX-3z8j-7<^Ns`+No>D_G6|~nIP1X_Js({Dc z1IPXH6+%EmdjmxW0&_ae%=4*T?Rn4nPLQ)8qaO@3R=BSO+qpTPz;ks2s3D*WU?Q#n=L9EIu53JalfdkCqPRuL? zp#+#KM}|1hqAZq5BWEVu4W~0G#y{ZJgFp2iZj{h}j#aSCXO1G!L@ab zCQob?;U;RbNkWcDlN9o9=paAQa1p1sZnD8G{CPAVeeCd_Ex7;W z=V#w*kDwgXx^6m>@C@#+IT#<=Gza(Bo!<9R^&$LCAk=a1q1V4{`z;?5o#-UEkFw41 z$?G+gEtv^6>EYY=hwnj#!#Dfj>W=5sCpovrRXp&v&4q=1ACC>Jgy{cP{V*+kc&e`b=r~hlq2; z7L&K&!5CHJb~RU&{YsD8X`Qm+KAOHF`p+;t;AfJ5W3M6HO{NoM;Oq-`;~yXyJf4p7 zYwO9!gU7|-ueRTx_K!QE?AJJ#$L8<`u~#m{^2@RbJaAuRPEDX1>+{l4_p(U1Z)B}3 zyZ$!H0W!V($4^2K+wt_Qu4zrc?J}FCj^T`m14h%K4Iawy_w_OjThmFnd*ugnz(fpU zd#t7AT$TvjYkg?O4?hbYDA#UsBD;gK&*fZt_+xT-#HQ22U;Gx_n;@qn!b^)dWOh|3 zw$=mf;lW$?hhcb>^3X*&jjA0TY_t*@yx$HFUI|PYVm5>arNz%H;nSgkH=E>jzWWjTi|9+q^JU@w z?s^%4mk`Q9o`pp@>WlDz!n~qqV=O$_^3_9AZtsrv)tLEKJQG7XqgCVFgM+I#AB3KU z2l=RZTh2Ek_KfVyOw0&@`)MOC1P=G%bl|BDMp*(MEvuA6r(Z8tY90AnmaJbl@f6*< z?NfN*49zLmj_vzKtxlQ0fji=md{60g+#KRCC6{t0(=J6d9ZSwckp3g=9m@}0O93*E05$BJG3!i>NinuVIa_O+} zG}e~~)w|28|6k*r;KQnjfDiCIO?ztPgC2NR)xnvCryS+<5k=SUALig$s&=zRRStMQ zXKnLwUaoVmq}~m z+pB~)o9m|XA?hnu;XQ(}_P&U72CDPtc8?-1Na%*ICYQqVTFd;k64wxCAN0N;+2TVv zwWecm@ewV`*%+6a#9T9Ynv^uSy!0+Sqmr3cQE7s>Ao}d&-C%8$Q>{@(+yN)y*(?X4 zX=5v_x3o2r2_SeDPw4P~#~GZ?2t<^|Bp!ihBMLLVpC|qIHT5SIUnfDFbM{{CYmGp; zBz%;bs!SK(e^xJGB%Gv&X^>-~z;MpRR&Uq`W>*{frDvuQ6bR{Uo zhNbBXylUW^eeKLmlq>K0^@T3QBQCkJJaJpxLR?OOIxTCRe%%X+R~oF?5f@9&oQma3 zMY%B6l`d}M0xw@&485v41plx!v#OyrhZje*rcR3x!OPF+Ssc_1ak@m?d!9h|2+AM+ z0j~|{q);v{h7D|ZlEFV7D9FuvUx$Cph=K(Bm+*3ofmgGtZb(>j;`Wn%%jILu@Y+{a>w>x;@annH2@b>0h%4n9 z3cH-*ak@OT;D4?sW&8Y;av7Ua!K)P4r6QZ@5Lej7Y)+V5hgX>?Ufy=eg;&|0>#Xjr zM_hjYz1Hfa0oDQU%_cCV^|ct!Nsd0w8?~Wt&2;I=4c_nqa64|3v>Mx-i)>t4Uo-*Hw9>u^Mt%m zZd~27qTwYAZ>35s-#HbGm5r2j?j1Se#*G-s@0^qHhB96Z)!|XJGUoYV4Es@T5iT(V zpKiqZ-eX9K?H<6hCxm-W=K{P#3Q0}tDSs8-8oxL8+OZqnte?Itta}2jGGY0=`yQNb zT>WrGqWlcJnZ7x5_XzkYz&p&k*70QIufkiyy@sUkKfs$3;dI_Mp8(!DaVEC=^0+;K z?{wSJ|EKWgJO^CTs)0*@r^tP4H-Gd`;jLW^BGmEih?`I97o71IM~+%Z-h08Z?x6z8eFPrA>_+QXie%bWlv{jsX?9AHe-+@FlG5>X zDB*UWAdUV}kDtO@b+mONHpT!?nl|DCzZ<;yS~J>`>JGdXr84uND-~YP5%y#rSb;Yk z%Wl3MxCpOx8t#)!+=aLiQt)#9TL`>SFdNa*ee0(H@7aD9qP$UnNAqNI=@uuzBfY0# zV5E-rX}q%ByfL8f%eXu$? zTCv@wmVSk}CB3IQFU(=hBX4M7{wH{pKZ93WGj&bTUNgw;`5IUW!K(vO|N z>vm$eC1t;o-}DeIRgYDDrT`$_l6+n_ua8wlDf=2m6OgM@M)~{@MI?2cePA&D4C_Vx z%_;3^M3P<}CyA$f5J~sn!!(Y~;FNq{4I#Ycfk?r_HhJ&j(vFgsC9~n#D&n?EyhGod z3?&6%uqQl4h*R=et$q%tU_?slh$N+;=O`(zGhUK-8oskO!fa`E+v68o@laM-8zqG% z?HTo`mK~)EYX!TEWf94p8O25BZeo3`Y+AT%g-CJwE(>LmK1!qZSAZzg-RXjX(s#wNk3O>qPzX=KH&tAXYy$w(fT@6#;8DTM@gOsA9`N=k?E5PE+D zMDp++yxo&>fFexvas8krpd{q>FuTG1+frzJsSvOl1mxN7yneAS5Gjs6sW9jHibytV zt>rwrJ?|tOU-O)#_-)CTYS=h}1W{71D%U<6cSNK*z@;DR(gLWRlL#K1$OKf5t-~|N zcn~RbHx8B^-vrcY9M=mDwjokYv{BXT-vHE5S8Y<3C?Z9wE^E=rM4VEo->=#DdJQlv z{m7jivj_CEa-yX(pRv9QKA6id1?U=_mv3wAN2GTM)B2|Cgp!usg*o2vFrc$e+eI_7 z|M&GL60O2l1$62UpS`#fgOc7^TEze698T$`zi)h7kOlNte4m8&9K@W zGtkmezk0rh2kol)xm44)Sc$niN(HA8=~wa_MN@SFV_3-t&g2-ZH&@cf*{Kj2@@4Or z$(HRXy@C@(oGLq@Umd7i>QzT%DBG>+b*uz1P>g&a_n!a^wPm*Z4ExY>oEB|8@))NW z$8ST|4JHAG_7jP_<1E00?&0+*T?Uv}?<@_MU9j>h(s1WB;FPh&@JO>v1z^nLInTAh zhc>$3AZjZHEurOT%rYJ#hA2#1mFW$@(9b)MKt(7SudHqsPh0_v98wxm^jiSa+;dB9 zloFB2FoM_h;5;H@mA^$)v;bhtSs9PBSOpk%^9%`BrX6Lxo?FM^tPL2O#^x9+XMb6Y z^Nncn51v>*dyqX#$_JQ$z;ne}#{njc<$0Ve9#(%m3#D9JfLYC}5w7t7j3x}PEV%Qw z$7hk4lydU-jXiLI3a=J0`f4A%^t}LWT1vc>lnr21ZR-6brh~}Pr9$0WB(tYp9+4QsDdwB9p7H`aVB$-ebNf~Xm~=C2JqpJG(>u2aRfX;T zWG}+50(odN=r+en1QD6?V>Cp+wgILa?|6jw?nj%tb|&)RGel;k(T3}bd4Q=d>a4`n z1Heq8#S#EAK+V4{$_y|`Q71x1{~z3I@kEc@9bj(Pzqu(?{8PAdg8H6K(HPu&Ub!NR z{3zU?`J%j(Mi?HDB_-JKp@v7zbxHJ#I^dD!sf2>%bMQbH-nZk04-kjn({W$k^%QO^ zvHQG6Cj$@292}sKTtggWCMQ)FeF=AN?Oo}V?fzxEKAB1|tjeO5WT0@ET|?Qy`Y7Ri z@dd=*B~XOVl!7?m85o#NeE{ww9CS}R_73hGBY3t;m~KaVGOU){6C~hvvpth@N9f_s z&9;dzjpB&?-PNvC^A2#Yt0BH#WgXn5R}vr~O^&kLuIB0n10Q1F-j6DR7xLlW%!k}~ zH~Zn{Q=-L}#suJI(%G9A9BUB2x|e4O#8|<7>Vayyr!MAh&~ASRgea;&P~Jp#|AgHuAD^dd+B!ZT#5%gAW|eA>6;1n z-hNXX%54G<5MIEmznF#C2@U9d9;rs`lc&b7mt2Iq);4u}s!pTqxtvMJXV(S~u*phz zJo16NyjZkeH)rf<-@Bkjxybu)AFFBE$>%k2e@P7H)RkJqLACpH;a~Q7 zRh)L!w=XFA)8llIqfA;m`zYMiK2=Liiy7+1o zu~!9z29r+Uw6B!L);2W~?j78H{m5<`xZC~aHG7h-9c@pydv~G{hI_UGO(zytQ1-f# z_1!a%O*^WR(5|n*a2b4P(4kAw0W}#4_sexG24{^k7&ETrZTLChps3`%J7TB z1Kkod1UdWQVfE|J1P-o4$#ssg152;LUaUrfv8|j|>tc26mabnd}yB>J`32#}2 z6C1o?2i*3Jo&9|`E%j0^2qSKtnP0ZKc^Bmd!?O}5!v=Ws)bQnvcXTK>Tret=7PoeE z-Ls}pG-DIqDBu#0ku8O{@MfMjX6{Ez9M3!%b_M08K(Xz#+NH`vYrzPw77AYd^gthRQ%%nj;?zalP%)dQOHxIv@A{w>e-mE+ zgcq$Y{1kC@Q?^6c14g;=KIp!=w-HX)o;*x-n&J9&$z?y_A2-G6YDSIHrz<~jyCe`e zGS-QUVMOlFFMoIp-xN&=)jCw*1 zu|EZP%Pi6)WLFRg=pL56H_QYCCo;a+YOG*2@X(|db?BO?BRvxHBAo&fv=S^?#2(Z6nwh;EOs*gqzb$D$Tkr9{Mkg}H9JJdH@yhS$}1 z6(1$xBa>C58mfQZrgzRcs>EpRmiRtsv|{D3XBIY~LHkm{@pZK~AbjvhdC*V~5T(@Q z;fr2HNqjSIe}~R%v^`s&7t}ofQH00STg)N2rKi+CVPyx1ce|cC8nq9R;PbW3%lpc4 zN@R4Bm-qR0`;?4C?Qw4a(S*sEVfZFWVtWgRK{pw!6)6ucg$DexB$7F^*WjmskzdT;MOyl0pW_-k?QoEUzR8#PN#K94!2$n7C!=x0HU%V($uVbv8EKH ze9|@8_D&9&LIWWBlALR=T?a@aUiDc!9mOeei1Nt6hr1AoI(Z`IuMF%cvGmIAPK(@s z-y)wA6D@=|CG7etbn^A(9VJ;`Y4)w=$0>1kaoxc(TR=HwLSMz_3n)uJByVNv0g9H? zl)Ry2K=Gbn?ep9?Airq+X5S||M6#Uu`^_Tfa7rFhTVN#NkM+WxiTfIDh-8Vyt&55$ zf88JI3uMOmh~(mz4$F%gBa#i_w+O~KBT|qg-+r^M56D>vEb*C(5h>&w@=|#kP*UbO zuhb^bVm&4~bY8a{P(GYJDOr6Qr_}V`u`%Zuv0AE(josS<)MPQo?yP0tluB4fr|@+i zpfs}%4x?fORN3W|helVi#^%`?t{nrEA59F!p1r{-6)D+)V?2vHOY@{{ytD%A^o6$` znMVQj!D9({LX0@2v1GZE+y54~k9+;_xk>=d;db*E(xPbZHQ1d4H~wvDwJcA^yHx_3 z*3)$=AC&-2$5nHWE%{%T&hs$=%f3pinyUWX+wJ_Xl9p0_(b>)gw{)6CF2M8Gr3%=b z-8~Lyx^HY4Le~Jz^ZxZVvVDO1XeXHDv-)+ZE>FQNN3jZiq%!|f1gOoeCBhzN0b1#2 zcL=q808Ljpy(pPF*3J>}o_o1y{lw?8f6N2wA+|T3m5+9m>e1bSWg!PZ6S2~{88(L2 zO+A3jy&AW*M3=;D#1W~luS8_}lOxiEA0-OCFMvorG%Y}N`32T&{Lsbo5<45FcU@}h zJl4#28Q)$SA=12iRpTg4iAcwnL*u+<3239A_y%5d*x4T9i!?z@fadO(6~&>eSZj8j zHrClbzJ9I&i6&08KW3b&{N@npsAJ(QiA+T5$8RwUe6oNxiP%A!OdHT~5^4o%&h2co z#@%~{BY^(0;heuHHJ}+iI=R~A4QOqbykn@!vF@d~b8Y*2rX#Q8iBM-i$@to2w(;9Z zw3xK$JNN4V!(DmX4B8T$(ubZ5XekT_^w4LS4@Dk`3_>#x8UqRe{p^*v?1$-q;T@q# zs_h#@`fkobqOFPT`rXx6Jw1L~hI6VMU>Fpn6X%|E|`l5vTV{FPKA+7WrYFjiZ@_yT?$ zZIgkBxg_z1j)M?jjxW;74Q-$muaz3M9YbW)Gh_5Q_6#uIw|MFnr;CU&Aj`OWD+gfi z9d%rjwgs4Hj~Lwho**)@)qi)~Isur7;pqFv0}wG%o%J;S3;^?KuHF<*2N*vEo>aF? zluWHmk27?)o$XzEOiqP%nN9hI?+joX(jPcwIf;^4Cao}Zehn+0xAn^o7PPaYm%UGz z0_OfXW7E>g?e<-H)cuVRnYqOWF4NYcecG+`c}*K7OIp0nVt)oA^Zsj=Lt(qHRvoN6 zbVMC6e`bH*lWBq5$3Lz=%85c`AugW_y;6tBY;|ya$&wE+z4m>+GAo4k=p$wN=KDKK z8e`!g$&8g~Jxhhz32OyK_qpRPziw~aIp1=Uf8Q4@Yj@+ku)4n#VWB5RtCcQyVYD9+ zGw;OyF}m@$WfJr`^m!j4R9DJe9>)!wGRr!eG^{KE%$%U{?)4vlDeeeQ zN0AKL*B8<}AA194diTBglMrC0Q|z$*w5?#U$le5UtX`zW;U~YKWyp8D%={hghcW5f z!HR%c<>43K7sPC8)7X*EIk*58u`fh#7&-tm z^)2!jH`K90gw7ie-ym|`9OZ1X%>(S4{^>nogNSUZJ(+c#Zh$pD?~BzVC!DhMbSyVN zUcfrbtnO7t4OqRt(Qc;e0Cs~(`YUR_fYt71#0(}I>s|L)NjY1JyT59G#!1>VUafu54uiHIrJ|9B>I17YXZhTxs$z{f(6aG;Ya5gs0o(!M{ zTv1XI3W{!soIeP;Q+iYoxeLQ5%)hJvu1~&nX$|%`58m{2pwu+K_1XHd-#EMmW(sHT%E?T+j$E1ZN zfGb<4cvOKCaI1%Rt$3_q@-s6-D7O7)2+QKRK zVGTi3#qTJ&?zGLCrHlbCYbUV|-??A6mZE-U*>`8#i1cS?UZQ>S_+9Q3dqnPmBiy-Q z10|2$N>G(;Jm6tbC`sQR_RDh5y%1w@I*G`0=d7Oofc|sZGQmn z$_@>Bv70El8iT(Qxg~6$w>>RuyH5cwFZ+j*_qLDYbjr;~Cv5=NOA5$NZ+ObyysbK+^7-(cgx;c`;cU;l?T&q6Ljw++#9BR%2Xp8?v}`o zI;6mW(+=q#TYg_>#FiE|w~qvScC=4xq1GVs?2h&hXQ>puvW2_(HZO7|c*1><#sl(` zRd83qD))o{8DeK1j7w6|%l&JFVr?%aBQ zDS6!o9tbLb&3Gvrr~Plb@`z-$5&QDWA930fBX-X1pMPby0{7~t^qHi;MQmsMZojg> z67GJ*R!+(M1s-@Zx4cP~2sdU_Chp_OLF^o#AC@7)M;sUwAARNC4-ay@ztc0AgVUZj zxz2$`$?)*;FZ@>s>)^2mj|e#XSK;B8RHpY1h#>Y}8{8{f+=%#X$m-AyCTGOH&pl={ z53j);9Y?J>!u8<30j_dqu!7jb+=Il=OXgCnL#EE~4R@AjAHgpdl#UhqhGUtTmk@Z-yahlbv8?`tg+?KM`!?u*in z5rXP)Kb7f3tCcF;cmIoFkluNe-}PCmMLvzgt%)Zz zyusXIb2#neoTsI2m=Ny8Aog+N=F( z=gVACt}byp8K_1fZrHqL_4u+3Z|u4LMtm^7+Ti;0FO#|}!nB=}+cBB1lz`^(N zzwPFes-DTg`JVzjb_Ttma9wzd)Xt%8`W8+%lldpL@_lN=BJf?Q}j*1GrWp~gG<$7!xIA^c|ud6%o8r-mf*QI9OzHG|F?f40e4kk0)Hj)$O9QcIOO?&COf>2&~ zWAE#s@gOCDM>m^S`xyVP!kaFY4w-11yW23}tojk;LagEwQ^@4U%K zfVUVwzX-c@6<)2x*A-#UMO829z5Hxy3;-QornaJZb2ft=f)mYEnwIjE(~GhlN5x6M?w3 zy3g;&R|Uvq1LW#sy{zv~0J&En6g z09i-ZUGHysfUI9~s!?+VP!eI-#&z=nrPtfTA}@~t^2o4phOc#iGLV!xoqqt34``3g zZ@2*ptriDu?PfqRJTmMQeiu+c*92eNhyu!9uBAi7RcO5n?ilhG{<2j02dH<=d`C$+ zB}DOVs02_oev62GwFqcrhS^A(+yJ%thS5m)1WGC&8uq64IY2GCl+jP&hLVbA4~X1; z563CdnH-}wUqGdB;ME=DZzw5>1f)l2w)-9LA^FV38cCl!GQ{zjTw^An8VGS4KJWri9doK2 zy7MO^#gzOj`2i&+Y+U{H653e(HBCSRC>m~RoVdt{{Jl=c0aHRxLoJyYka5xVo`IF;(Z0rAZ zUNw`5JhB1BP31OIXckaVYL!2+)Wix?e^90*L8Js44axF+fI?Wb!k=J2B9%j}Dt*%# zK$*$?z&3d$1M*2c z?v&@-h34p>O&=d}%2b6rPACFna1M;oxIr8jKL`pfUYkUiYfboRvWatq= zw9Nb7C|-{R46*tuHY8Snq3~viR?$J+M#*`tU1`N_X{n|Jkp^JsZTqC-@&@bM{(H&U ziinK+E_pU^w*y95tu32Zhp@iBR1|Mg0T{go_?bV-VpR#rvweRMFc#OR9>Whr#FWaO zm;S_olF_*+=k-esfN}TRT20hMdto@@>Xl-wbF``%obFhka$;m+>HuafVDzFx6(W-~ zyWUInj_v)C*?zV60Fz&`&sDVcw`F4SqkMI>6sH*1(|qFv>L?j|Y$FT%zX41}0$)Ig zAWj*JxV07qI#6PqJmjx)=mLxbbCVcHHNZ%U=2H@xW7Q?F@zmRm_4=)L6Pd)9Do(fTSX=>yX^*Gzfnc=lx9{66#{E7wxd^=-m1%L?(j@ zw~iO@(1y9Zw9NSmn95bE!U{OI&xfwx>moLkn6F1qd7bD$$uuiRtr4n-+o*Eko@GP8 z^oln42&)}n+CQjx@5~%dFc{VRs-1Z07j2{*E0`cfH}TE za9^$pw~>1eUgGdTt9NCp$-4<)2%bsfjc;F1&GJu*BYS_}Tmr^qom#Aq&)Zce7NNvw zmRC|AtN4>V%(5f3RM0b~C0wIOLUtQALi+fwfU#`h(SKB4y8&${%PjY|e}^%?_>#D>eI5PBM&P?H;QIr{^JhJag-!#; zg2(5cWN70QBYi_@(69`VF-uSDW7Bp%`IElS4H0NhJL-$I>_uevY%G!pXa($Hfo7XNWM{q{r~-AzZyMVJGQ^#}v5@63)O>Uh6z?n&i+ zji<1lzdXlb>IAr0BQMleECJ3zEyB7v4wPI972&LtI#_r2)Olm70hiqVD47dUfOAUf zqXW@Ptg}<4mJ$ho^VpGRpR}a0k~8Tx@cQA_?p+W(q9Ig7tJ*VNlzhiWVEVZPhLahoRQsfTfc$2d*qtiB;?^bHP;qn;E0y1%emEas|GeMK zO}Pgp$J3mdsmJF4N5G<`Lx2h32o#oJGIaj8<@D&$)~;~_9G7&Dd^K_UUnVEd56y8A z$L( z`qEB@oR?r{du}91?8*iL7NSLF*M|`W4<&0V=e`7jG7hEp9$W*056yNdBp$|k{ZXM_ z_&p%#6;W(8A%|P>qc!}oFR+ST-ED7?3k2>mT`bwt0|flruN}@?!EIcA3yYp9)`vQ) z_+7(To!cI>b3DQ->TfN7#$x-pF3V+4YXO0SoYeMfJy@AvFYi|J2LfK)@?O3(KtN3U zX~72_wEISStwK1kM!K+xcwPnqkH4NA+pPx#q}Qm2t~}U2jzqmvChXM>}2_$y@^h^v@0p5{d!= zAyTo9-6m*_ldS2d>H+`a0>{CiM`+iM2>S+1Aqp_se9gRe11;5!{lohBzbyY)-4hN4 zFTmeNwwv%`F4`M4-S%=X(RMD`FtcgwZ1Ve+YK|9JpP#9IeMtiF@1;0yD-eWM$tR}{ zv|(NSo_zbz3g9nUJ2=uV0tDpyo4FZ$5&75HsF{b}{jvfiFE-s3k6|UBCrVQ~0R&7Q zN97#v-R{RN;We*Ow0j0gL*l0af0EkxK!@k=TTk`EBgGl(TZW|Pp&TgL zrx2ytgwtVPLPg1_e#D_1GQp_0M`)$mhwykN;laE@aYY8t|80&?!wkEPqkh?`s0xhI z%`foS=e=QR{x5MlE__I7TsQ~iVB{Hk;fYLmj8`mLR$2gSf?yk-T`1z9XUZowjWdWt z#vjkTUAD&>DKv2?e=klawv5TIQn#ZV`}TM`I6Ly+b~2syQ{v`Poc5Up1)a}N*wOwx zIg<<1%kUJxpxB2=H^d2@rudgteDIiZtxaHy2Ry98(5f1=eP6nw<-x?dh&U#n^bmwS zg~tf3yUe|Bp&Wj2m6dtp3_KF^-J|%p2t3X;vpcj;9dYo9{ME{f_V7rwH)Ho{J;Xss z?q<-wBzWZfv!{sx?KmC2P~u{U$Ba1I==6L7z5x%Zt#RY;f&l>wexc73JwW)CNj-Pr z4BEugUV1b60RMC`w?-x&z?*fkd?Y#r@O(|iwKpJu*JJU>^hXyW0i`yJekCu~yO4ZA zb_LeyV6}zs?O5|Wj91b!QR3fKZ8Q2Hh*N@L)>mXYgIFoGjcBv95bXY<$OeTCx2Ul>Ls&l5p1|EzT#bdZWOKN&FK@9FL8=L@I%Ss zZVT2~{jB*Xt%w9Sl*I5V0}=6aioSR~$p-iuq!+$}N`RMNG2LG)2?%`jcpO!VP!b;I zq0(uu1^BjK8C^W@BjT-9bZZ|WL?mcnn?9GdACYMP`tGt1k-sfrcCPcry_1Lp06dr| z+xMSaln4{;Wda0MXSHQ+Y|pn{j%->@IeWFyk{k8M0dct^aUQQLAYwav;@fUJwB7FP zYeyMS5)&sGCy3tygb}Wdm82`bZucZrbvXqh!G=wf>69%Xn$+0UBNG9Ly3CZ;ddAW6 zsDAF7i~__&rSYtqIe^$WRyN^8A0R3cj(wsXfK!sQhdQJghqlYtzCKf}j!5{TVttYH zBq07)DYG|u9g&2V;-g*CQADCA_-{7}o3Q%1TzqL#3J6#`EbbPkZr{JG*e-t91Bi;B zc@H-%qSbwnu*-%T5Jx^{bPKu(h$|Y24z@R;Bzks^R223CMAM2%X9*sn&E9pW?uk5Z z-QPC9P~V4E{V|L7zFt6dV8$t?c@`x>m&~oVo?j7(HlU}Gix<(}oDB2yasjlJF_N8i zlz>*x{}KOTen5lgDY`4o9FeM}r(yEV1FY%aBBy1t0L_y)zIV9=Xf5NqgP>T4_G5!mb%Wd*k!bQN&*aHLFOFW+UrkMeq4Pn^M^pVy_=Py2Et(HrTS-QwW74C) z+$(}e^CSH%XV4cwBX4?rule@4YxcX2cF-eI@4p=TL_r3(;$NK>Ug+YK)_QENQrH;K zF{@F2I+X!vCi-;zvfNP8UEaE(Dz}XG%5kf=q=A6;yR_`aa~4FplM|;$ z!oQW%aw%?hBuw!gVVRR+-4+HqGcL?O~O-#cq0eiqQJ zuBSX455qdCv6*hygj0I^*+x-qT0qYlw{lyu4lvL}kPC<8;*`EsF1l2&3oz^oy?O3# z$9jNOzLB_WZ?RKo@)IZb*?s05igR`oR~?9c8++Ti?L66EJ0% zSkWuF;x=13eLAKPYXxS`spBLfrZQT6)JGLCeTq(8#kU5`qKsZ!s)>k9)5RPi@5um@ z&D|^KrH^AJ9Z-DzxD0J*LkEAI3D&(eOA1ae085sa%J(F*>B6j`aH2)sSL1?mPuCGWZ;zf zZm?$8m2-gU^BXO4s1%Xe_~yRb!Eq>=X0nK$5$wTghaVMD^c65)oIEGjJA=qnJ>o9# z-4Jb3VwGc05@3$Gn%3$K0CRo+`_~u}-1>b^OD;VOSTV*-CzV71bI$E61a=O9MeA$} zkl+R^g41DvOH?SCD;h(dSk0mJDtS8U;{uqkd+=$dYyjqPzpmai4!|6FZ@kcG0_hnJO6 zvIP6S_G#Y>SgweUg)(gK+bh){Ea2Z+nxr!~LQ(;XU#PU;syS97+Tptz7JzyEBGq%= zEku?@=G_%}&(OLkWNN*h2CNQq;^84zuznBWQ)YgJ^^G8zeXJ^Ag=^Utw8a6N3`OKp z)o#GrI{4A>$4jg?b<)*qn6L(`$-Xh zmq{0P+`e4X`C26iSbIaXO*h2>Ym#>JhorupU77|u-tCC&cZh91K5fOSMz?BfSq9kZ z%T4!pvS6LdylCHcAFzG#QmJX{0&EXXAGft41#DL$liN?;!L9z6t7+YAfK>|8Vbcl( zY^tnhgwE;U_V}scFT5YnW|7`Mu=pLY30!&W!)AiWIuuoKP_`Sev2yP_bUhT2^|ly8 zE*=qJec{{6bL2c=9kCbbTU-FF9eP&BtF-{z+lXQIdJDk1uIb2bJq1{EY12nr>H+J+ z3&{@Y#aM;h=QqAy2dsoAo?pt^p1&=hWyLB*v7X!CHu-FAyWE+J#=4zYKh1t`^Y8_% zXT@U@q8R|skZqZQMljm$>x$hEr2)^vytL^=0B%$6C56-G;1*zvx{tiU?c)mvg5_@F zlsAL_Gu_)vtWQcFX7@;7rC8x=XFQ9@!zfkCz*mp;QniEVi%P&t^?_uPG6JVOU)YMz zZmOcaAo=ESv;@{$rKdl?K99&f`oy)n;0@pvAUi`rVgPsyW$g+^CIGLz-$}SdC6)-C5m^ zlP6)e5?T#-<$T_

    6}Gv;RH`1AkVEosS-?kK=p7*t*oVTCs5V$F+OB}6_co?^@k zDMa4YJ<4j*OMp+oDlF>#5a7M^tszyS4)C#^bfBAhf|9o*ZBI?|BH(SlnkFqNg0=h8 zW%rlUSclppZJJttSw8Z#)01a50N?xMqLp-ez~{(intAawRwYW4l;CGrubycYgFFCl zLMFHFx**zq%5VM$#;_JT=gExUMafsFR8s9=3iu8*+p%r`{`+OOblTW9Z2>>ya;C`% zm7OKN@bo!2v7>xp!uxNQhXB3@&)#OsHUPfpv(#zBN6~I(5@)V#?Cex-e5CU#B7dND za>X-Iz)w|K5 zBkX6)F@QfF--mJdFyK!wcjqHjMe8McxJuOoZEVVA|HYD>wST#8rGU4yQJWowFe%_G zP17N7jzZ+;ak|TJ_z2)2%d~m;X*Cd{9LvdwkpY4mH_A*arcnx| z=LViv;lX;nKz}{_0uXv(cywB75bf4Lk~guv!#kT2ustMXoLsT1ucbT7B6%R|AAy$}jpJ zGXg?RfdP^}%eWm1eNeMDgD6Y{)h)ga#_j!P(K|O;fly2MsUtVPVvU){g>+|GivbWh(Z8ZKT#Htw z*yb~#C=lMb&(2N34}=#l?YB5xf>RNhlOM)q=MjZ-Cm2Sq-NtRH z41oxNM;pU9ArRT$UrG9e7b}~m{)rdrK;-HT(*(uce=?)3>s}=L|$N?+BC*9tR>dv#oQFtIDO8Crod5Kr#5UfZueS%K{vFId! ztaIse#6s6SVo&4`Ai^J?1il$7L@W{KrV31w`(@#nOrdj7F;tRH7Begm%}H$KES15aHbRp;P$tSn~_?@|SLG=dWg8CEE{yq?-4%ySCeB{MO0c zaTbDA^mBNRQlc!nXXR?4!Zfl%=^dJGGRI?586YXNtzckO6#!7-ID#3fKM zV7e1oJ&dv>N^(=TZ46~;`rzKY_8U-%_N&28_x>`b0+i)O>^2XFhHzS1 zcqxtQOc_)f#(Q0Kj~2?}gcu_yp%@6%eazDN@){~Rz4)Wu{R-CE!Vw@bfLL5Q5vW+i ziCCg!{ovS-K9r@B2dt>WWFe3u;d+b%9|AWS?q6P*-`Q|w7TTi+ArPE?_3n5eVlg8p z^)YoFltnR8>B`4h(W*|UW?zD#kJTqHv4-12A4zDZyKWglg~0!C*5fopV0BSbzPJdh zs!E%o?imOi``*72qz8er5@X4#0hC2-&dQG>iJ&6l2Oj6fGog=d+FzbhZ(pCfuU3hi zTCu_u;Q?d)h#z-{D%HEL{7iWXWG5kJtm`&f!qLy4n? zcZVy_Ln%gG_>0fO5kIV}k6sNc`L|7%GPVDkolrWxK5@)tVw9;u9$h|3 zr8rIO;vP4NV}=rAygWWJY9hWLGTrR8Rzi$jVi$R^QGnBTyfTwTVbf4jUdqA^p;0J~ zjLNJ~U>>LM&uXj5d+0;&QZHTc74=6<#S>GTb(8#k1==4TdtS4nNgGb_F~)bG59)W^ zEYEiSW4@1;nmpE2fYW#2ibkO1#oso%&sB(TgdU3HpgMd0sopOeJJ8Tbx}XQeY_0CG zj%!1V&Ki`e|55_QO25A69OVYR>4e7wPjT;Pth#U9mGRRk;|Z8NkGp@vdhgpAk2_X~ zZxfQCJC3A??*!`i*4nTAwsE-@VT<2Ka2g(^TP4+C4aIrhrzm?vj2QJ@F_-wcJ<9i0 zNko>~#XI_TPtY5oedkfeslORxzi=6PXEpbFBQE@xjgQ|OM|R>G$`22+lI5DCQ6|ka zT%>qv0=;pMo-s@0Mwxgf)M594<$r8itK6l14{M}{-I2xf$`F*uPk#2^ z;{0!$5PMD;PpTR*ndI(t*Y|^nsY=f0$wQz2bC&BrU_SNm-!^{XDM!h-$2UhrW-e?xDq8pS$hTUe$Iq< zG=2J=J{!ge%4(koR#@ivWwT?sco@>lq14`lw8o>m5z`r{hi>gH|9u}7A2E&{N6fGb z^FN2l+R^mBv}5g2nurp z^Ei}k{fVxYvJlFO9hy^ZoPaWCN;SOZZJ{g+PrL)K-=oadn3lgS(1Dou_U&euEf-?$ z&BNW~g@agWm~)7Kut0efCCIp|B*v;9VPX1TXUm1B{?ETdc?A(M6B@NUn!9Rp^EtOUR6zB> zd@1NWVqSgK``|Oi|D3dsn19rC z0~IJ&Id{Cjiqm|Ia!aMR1IoNRDf+E|9Jl%E@+6bdIL-C{gx?UTkJT5tbjXAUu^=Ho zc=KF1R2T#wx3Wlw3L^{5z8erA=FdRmyFA=*T43x`&wX$e%I+FDlp);#<({^@JZMdY z)BLBO9OFVt7(P@6I5{2BD?y4GGg9oBQwm$rQbGJ z{KQQQtrDo<`Ana>A0b*%wpi2b{O#+hOXpDvA!7F3w8vDXkx+pRTji>BA(TIGV$$#C zWt0_yH!d<;cOe#e9+n^<(fDO^4WAl>9wk7`I#aHJf3F_O>MI)5IsXI7)8kEfHjhEf z7i#vX^(aKlbBsQ)miGn9=SWd&W-NztuFc;oe#G$4IeEQ*--!!|g?qs1WCx>v+eBA#mQMAz`-yR>fz$ z&a}jc#k*QL&Y63o1RahBm02~=$AOxuc;9iH7S4J+@|>3Y{~C*~@_rMupZv!xz7aW} zOxysKrq`Wiwuy#HFM;B!Z!}Oz^ECz|JC$FyIBjIy@5)7}WMvCfy)fU=QpcGqfl-(K zG0QdtJ7jXhpmO=q_*ZuXP!@Z><$S>^4wc$3h$b<&L8WIf8b2JKW5tu{JE2N~wu5Nk zyAIQimbg4gGa}&sWs7_HCZ5cFKrHpt^|iPhi&(~+x|m|z`d9z@_jA|=p>hnVVRRC|hf1*a(? zFAJq7`=Mmmr6cT3!Ec)=%~wAweevJ+U3FV8)8UGL%(s_L_S~wx3MI)LW;)X2hcfY9 zG{6@h{AE9UVmuV%P=_*kZ^zmbRZA%Sx_O2Xo5#-XqoLBFT7%LBSzey|H2060N%uwd zbla|9Hmmhel(VcUlsOVz_f@h3`fz)gKj)(el&&0oFHg%6Woqn|gn&=8PjT6O zO@dNE-!l-iBg?OlHRnR9)sCU^TeVP%Md;ZJV@IG5@=+1>ns%Hkbr&>Vh*RavS>Hz*cm@=c!^<>L!bs!5zrYM&kSLG!9+@s%N* zW}I1uItCMWw&Hs)qp;;a?M}~+|6kc4y{7#V32kToPxs^hZvV^%ahrzhPH*Y`Ki!Z2 zyZygwgU&e;*t_$d{XgB0|9{z_-0_iCF_~Z}&n8Xpv)eu>ueGUSU%Ud=Fu5|{cs<0z zdM~n$V0x(Vz{{^%+V+U~w-ZBe4^%^0wRt@!2hJj9AHLgg>|6>@Ko{GC~PQJaL+J>nef#YdoB$+dbwlDSiuO1##b^3GalmZ_|}EUeZ9Bx$)I& z$zcNe0CU+HU*$qfC;X02CvOOSIN!%Vx@eA8&ict%(lID)Zg=*0`h*2J=OJy)gh%bcc(~`Sne%UBC z>l6m7NW|D0fzNbqtytd>P)CodBEG$4zh`|+>EAZhLFXXzC3YzB<0Uh?bWy|2W{J%}f_=^73tRTe3~3JF0>8L0Iv(^5c8 zKb%3#aoY|t`5WGYu^4~ExF$2Id{!Q1;wc#~*BD3WP0YstCkaC6d0GC70J}co z3*itIk~T@4Mics|m=ZNZFEwfBrN+k)OPo(%C8Rh9mADO`dumLJbqasK3fC0Y3GESa z2_wW(T61PtO&+VX@iEQQvryUf5kd2PLQq-#L#>1TIaos&*qHg^&{l{we=qdKn!+*K zZ%_}Fg}Lnx(}uBHbh)*5OF?CJaU$eCOHjGSa@-lBaj3k=Rb8en7b@=+&TX05gv#HS za0I?M1eF_x^0}`XL*?GB_F^LVP0G}+#Uk1Ee zE5U=x{g)4TH$YJN8~WP0RT8K?{ndVI4?@I>*g=vKmT{^=+Tn$z9G&?`PYj+KG$F;sb!5x#ZnEmWzo)vjp52~}n~Uo-z^164`f_%1I-L)pYN>_&n`9(V)eSl(n(1JuiuaS0%+YnIssIicSkZ>68iuud#xYRU z4|tliPYbGg(om^jW{B06sb%C48&*DZ@iqFFP?bQROjR5rNghY5zgb=sW3t1rpT~O6#M30xE3{)MTr?WBm9r|=k{|9OBEwqenXKcgAq3Y!y zVXpSd(5L@TJ9h#P)!zRB+>(7Mxe8;=nxeGYy1!DA-111pP1(o3kGO53ELkgS$i5Q> zV;{_nWtbThqD3fcyJ$~&-23#LxwrG5Kk9$e^MB_1dVRdd`TfrC_d93K@bWrdM>6@I*cPj#|9})^mnoL0JsQHMOegSBmj21XhwgZr2rPpeF*hFei>^4UOzsbqOT9*OsuMEwHDPERg&tPls} z85t7$^z8Ou(+eWhcLCBXYt{U{aex#-R=DKu0Z5ERIu!-nfF!^dPnkRjS_20*^7wke zY*FHuk*aC}t()|J?OZhtT32SeF&~WvB#j^gzpB~eUeC-UDDFqKVEYN_fz!Z>s`HayyPJj|`h^W`YQVqH! zoyvEcs=V0bo#{J(vd^N^87T`%wkLSLGxz|L0uEW*f3N@)Q_&r!C(lzY5VFd+@fx(T zJxAGer-1|tli#XysUYi!lwxNi4^`b2sw)C9APf1_BIZOsO|zX8WVJ}=K(23)uR%Bx z{s8^M0|5s>TF2$liaz%UGo=puj&3dap$#HNEWKNT#D3h%n$a72+Pk1T?vL=?ljZe3P zneDoo)n9;{rumy^+S7_vL4ly6n*3Hhkk7-^I=&;3ra5oKKNa0R1)0gkr#@lP1ad@; zTZ6WFf&3+miH#p8L5?-Y9_1x>K<=4)?|F+}Lgugx1eo{ggKYHxA>u$PO>+f&h8f)I zK=yKp;FZ7WRASB$AG~Wkn{XBN@(~AWbPPB zYQNwp$Tw2^M1EWjvrw-?oj=$QuGs~@h;jG1RdbH&8y|!$Ro@b-i+HkNi)%~kbVm>{ zi@I3qV=ScMs`c+|nrgoG^M6d)DL@v7-TILE=pkg*PIq)z z)$Hf%^ z(Yj`}Ro0LN?@!I#@$&)sxA&W%eqn;lJa!)u|B(fxbBz<@44NUcZ13cWE@^{IjnW+^ zyKe!h5`_WhZgbI=hmrYanleb(d!X1vSOugGSZJNrehD&aG;&9i{1qly}61 z6S9b@eKg*W4diKON2@nj%-c*|9dBp8*`IF}kD|h^MMCBp`b_Pcn7xj?LIte()kcEe{cYi8*4YOeI`h@%XF1QY-T7rQ!%tF?%i4|@< zFbg!}9yCVTQq{3!sCIn{vq*L7$kf09!0*fGNM3?oxa(fLY+-*4>L=N5g>7O0Wz4cf ze%BrIwyLkAoFh5`Cbr<(wokmMImL0E?M9c3g4)vP)}S;&m~};MPHj_2Nc{fHRW}^+ z0gf%hBmbxrAoz;yS+jZ);9b}*Uwc^(Nf1TGmz3fcZqzOBnM?r-)17TFZDJ} z8`^#qdBr3LlMt;aH^Wj%b&UO|Hj>g;iz7q`OTJfyiTBU&?vnFdxR__vQ zw~fI)Bf6U(f`-OtZBIFcVG>3fJ0@180YaIt)NtB3zzH|k`QC7!C2u62pcME z#!g)T$e5Dev8GO#9-FW>H|*@8`y}ZKX_S70zB%uw*zguzIoFW0(EBj;2lB5Gi}z?R zbiaiba1i8q;o{HuchB>^3Y<{$nPA zg&cbJT+<9hM~{;an@vN;vFpXYjOB$)^=}B%b2l+p#t}g!{_Q`}G>`q`sq_9OFtc@Toh_GahM8H-yNypv45W=;RK!XmL3)ozo!51( zg*(KmdQIC5Tz&FlTIbjU$V9YWC;vln$P|vg*Xrx~;ik&TH^(Qz%y_Z-O+A+=O%vi+ z4=MK4z>I%@jRGE5f}}9!UP~dXOw7KW_IAUWD57(9zS86u)%5m@}3)I zs1k-me>|@d=-L0x7UxGRi6-rZiP@2PmUz%@PD^JzBL>&o%~$C6LR=;;kqr?BS(Np$ zrW_#(S?;jJ0WBO1S()KYNq?vhursy+r;7(+;^LIFj|J6IO-ZuPGVm%)<_l#CB^}R@Q9L930{t+HMD$ZrTqe zUUCP-eKIXGAvtjO+MmhXEDV}!MN$>Y?m!ZW;RA?Q>|sk}Os!20qzATe5G1 zaKAZieMC0*W-kRTGkWhdW%^;ZrlHV%9-e^6qW@w448wwL{!r3jp!OD$D7X6VHS_C` z%?>D6Z0P~GPn{&EZ8Ya?%lZ~$?Z_99#F`^J@9jvUX^R)Y?mfTuyGwKxKqZIqP)+Y) zQ*YkBU|SG`_DEeenzl-TwjqWGFiGsr24k_MUu}#2L_|2lrLVTRicKb0&kwR?A|JKR zub-x^j#7tSTf2eQp)7ra#tN!~&G91QD5~5%H{>!(0g-%h8LQ3&s0&spzNxGZ6OXt% znj~Taa6^@!-YkDlTfbusp+znLS9#Xl{^J?AAz2=BH_m^%qs0bxgIx2rw!zt5=#nzP zbK9!~4FmzKREmXeOg&^p=O{k-a5t!|Mg^fXe}>BNUbMt%vRB~ zrbR%*2Vo0Yr*62nE)hdhETXsPx13y(%i7t354X;{A;xF0WDfW^p8z zf%AG;NW6SdY*|hoB!Oqya-;jVA#ueuLYaok0bX*a6e>FqCSjXOE#5@|67N`Cd9p_u zU~9TXEU_&Br)vAK;AS$+x=kh44Cup z^?m+H#JsI;>t4tD-jAj=V|*nSi8^qToI90wU!`qtY>}i^JIq@7D>?hRZ^EoA-q0=L z)AQBhiZg3EZi&rl)hkXOG?<|&_RiaV{th_ETGhxc7V*Q7_5Sv9yDd9uimMFP8JG2j zNx0Bs(LBloiCg<(Tbr&N)yVPMdL^TI+n`K*o!!|D@T;_BD!C4VS_Q75&IhV+gSjm; zibDWy8IhPUEkV;-$4_PwX!MuTc*gruhJQWdo#%^Zyfe~64?XnIL(c-j@B^%Y9(w4Z zhaP(9q38cozO2Pw4?Xn!NLh?pta-n8{kI(FeCj{-TrBqIlOB5Lp@$xN=%I%mdg%G@ z4a1-ObNx@-=F|3nxzE?s_nK!h=3VS-WwEZ$AE6feJkUeWj}V3*U=8%pLk~Ul{Kw^g z`ycqfWZ576moRY5%C=rfS!s*X#((Y3IPE~u9JFCyHmRKQCmY-j*aCJd>Al>a; z+)Yu(ot(_wPnbHH+c|%36^6IEn%lX1*`bi1dm!LF?3}IaEX_S!+&_2Wr*?5dnmhk_ z{FPrceKEM;7tLReywu&?>yP0~Ep2DND*t=J-#7nzsJ}M-^m`LD%wO9$oR52;Os(w9 zZ9Z=hrA}|@V(EDNk8hl9W@q$pxBCr#ivC!mxuc`Y?BI4T&Zy5lxGij)P^O+pchv00 Q-`}@?0%V7BGJ1>w0NcIpssI20 diff --git a/dev/fixtures/compliance/bgm_boredom_nuts_bernoulli.rds b/dev/fixtures/compliance/bgm_boredom_nuts_bernoulli.rds deleted file mode 100644 index 64e50a6e9ac4e137866d16821b443e62c27ba924..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80471 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

    +VS&Y4Ej|)GWlq3D*oL7CmBGMv`oGLd~Lwcr> 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_baseline1.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_baseline1.rds deleted file mode 100644 index 215657657c1ca9f7fd4710f5f6738565328e3791..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39985 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 lLL@y2WMA!oKyz`>O=k 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 ReE1=5{|`_2e~WV!0RZf=`gZ^T diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_impute.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_impute.rds deleted file mode 100644 index e640cd6088eeb205bb673de743f64b1e58a06c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39703 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
    %(J1ljk+9)M1J(v|yz ze$W>!v0bFI92$apzcPKreq664^+&Nl zUZq@qz+e;zT18oRkCt=tL7hT;87FV9DvUT%C=Wf~R)3wCmVv>2I#=k{j?h&pnQXE0 z8T7WS_1w5O3u!u)0mi{Ak$&^5hKSO4r0%K2AkLPTlHQUdSLJW2`7RYP27j8>(4H6uu$b zAYja8*aw+$@$1v)Ss;63_M?aGlE`{#XXzNIf{Y3QYRBG6WRnhMy3bW1(=ldn(}q-J zR2`jkc8x$riRh;EPo2n=9KJ1a^D)xXat{V*-ay6zt@HXLw#csh;iKDV%Q@e}-FZzH za72(PvaF2rp5IgSezuQ|tf7*OTPa$|s4*%fwwG}FC%<>a3NlDvdcvmaRt~bPZ11QO z^^xI2x;8)RJEvY6Io192JTf2ZfCu#hvND2Svjnq|*8j!r$2G-zv#f5GEN=9e(+-9a-{S{mOf)Y;nYX*0plxYk+sh5v5aI34$qn% zwf)S|7o$az=2JqtNWyk;rANqUT-lN-u8*wi)y?vDoI1y<$71giF=VMcqvbxGL6+?a zok9Pd$cXYbP7HKJR^-%&RJBDo!YcOG)sI4ES$)TCy?ID$Y8%*GppA_B?StymddTb} z9^g9=hqNw>V|%hokP)Qga^kuJGS{ zXw^92Mfws)T5li659GpC#XkxnbK?@eupOL!=h!m?A3`(Iw-^8fo_ymOf2qAj4s@GXAnH()+KSxWJo*EWM

    q}nYNVNCO!5kVgg$Xr3p7J7l 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_no_edgesel.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel_no_edgesel.rds deleted file mode 100644 index 1a6fcb24b3708128d6f1f62f0e37110d2a20f1b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46157 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 BlAQnm diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_impute.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_impute.rds deleted file mode 100644 index 9af793751933b6e8bb5797cb00a5609c94843f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59404 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%0Ae|p5^ga6m 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


    wB&?wmN*{^>Ts%8t-ud#EYd?BL7F3F0 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_no_edgesel.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_no_edgesel.rds deleted file mode 100644 index 7fc50a8902ae71718e663d31b74db9f404b06113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65420 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%0DiW9>h%Xh!1J5+&aq?B!1?jOerfs^;QD>a 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

    =z6`QeC0hCbouxRj3<;pPqtp0HfKF_ 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 d#8JukaoijVVVK)#g{s93Oo%Fyf0RUK!+l>GK diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_sbm.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_sbm.rds deleted file mode 100644 index 8278187906642b08757523ef55c49583548854f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59582 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_scaled_prior.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_scaled_prior.rds deleted file mode 100644 index 9db1d7b1e1584da664977aa5e3598d5614b8b133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58758 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

    C@HiKx8=m{?p}efEOWT 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 Xb~ihd7kHaI_8>c%<-Yd!y~ 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 UjdTqDxRQ?le?dV|oo%)P07$u(_5c6? diff --git a/dev/fixtures/compliance/cmp_adhd_nuts_bernoulli.rds b/dev/fixtures/compliance/cmp_adhd_nuts_bernoulli.rds deleted file mode 100644 index bd6b507970129598fda2ba97cecb0fefe982bfc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110822 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

    t0d0gv8*X8G0L3d3-p6;X`^-agXNFL{u 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�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 diff --git a/dev/fixtures/compliance/cmp_boredom_mh_bernoulli.rds b/dev/fixtures/compliance/cmp_boredom_mh_bernoulli.rds deleted file mode 100644 index a892ca478fd55ebdf2e4ab8192a51eaa7c1c1db3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132601 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

    ARyNWAGAyJ=Nt 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 diff --git a/dev/fixtures/compliance/cmp_boredom_nuts_bernoulli.rds b/dev/fixtures/compliance/cmp_boredom_nuts_bernoulli.rds deleted file mode 100644 index 79cd2a6aa449faf3fa8ad45c025434e855c4750c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277648 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

    >H6dXgg;Nhi5wdUdrmi*-6tm39DH+EzSD= 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%0DX=wz2bh| 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 z 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

    NmR79HIJqwQ25hJI*yW7w>2}1XD(`bGg~J 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 diff --git a/dev/fixtures/compliance/cmp_wenchuan_hmc_bernoulli.rds b/dev/fixtures/compliance/cmp_wenchuan_hmc_bernoulli.rds deleted file mode 100644 index ab4aa6a7a91ef5e853d37c37cb44ccf4ed53ef49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10616 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 z 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

    uw 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

    PZj$fTbr52jn)nAtIyqWHwCGC?wk@H zOVK(0jD{5tJpRBs9HWkBK6=Vpc?RI|g5r9w-{gB5!Xxrpsry7X@I(uT$7zyhcuZ&Lrn}Jzyf~EY z>DEnz7lhrf3klfZiNaGC6<5CFd8Om&A1cq{xwz5$v|V@c==}vQo76DeUtyi`#xe*` zFI;qD&z!-7=T5T`%lY9&Dbet@o?Ccw!TLz#)I&VIVg7JdvIEf6Ho6vMB$@ic#K+(?Ny}>o_sxaC_L#Oo_2jPLN|95kIB#e zbRQJOLyeM`I@&z`%Mp_gZo$^3cp>&s#+I!wUi^FE3i%C5JTGjkp*^dOCm-&#bGv)v z_8LJ8O;Ue6*F4Df<)_^LaA;=K^J-ZK9?y)t@l7xQPiZEy*}VCM$FBuSP5Z~-$)%4K z&(bd85jP~ZU_*kNpOM=&kzBy@1qrK_>dAOW*mE$q=nI~*9bUi8)QD%#&i^ykvBvXu z9m|~ZNqDJYGm$MJ8PBUl$wjKS;(10prpsSt@tosk#g}i_@Pbm=8-=55c>YPrA#$Uy zc;bieSl#VT+-JG&qMYH3m;SUVlEkXwk$d`X3cbO2mUlp&wI%}3k8Jz8yc#3;{neg% zFB6_WU_Lrqcmoell05zJQy5QNWBe?&Sc4b5$MTA6>~Oc#v~1awQRUeg zJnhf0Q2o9T&&|%cWS_La^YQQNZ%+H*c~PyaI}@sSLet99)iMh&J`t^rP`i)QekIB3 zG0EZSFE^t)m(Jj+fC!~1sxUl#N84K7p%_mnf3sC~qrnh+Y6z#bqUtqI6)Yi+%lh>maZ`qfZ_CS_3Sv3fR&O zqk-w|7lXs=uYhS@$OD|`fWGy0TDXoMFxawe9Au9LruvL2(|5YS@ce z?0$1UFd5O8q_Tbo7Ckn-lY?u(a^#rmrgR1{C)C-Pp~t{1xz+erNGcP ztFSB$tUTA!T4NUD0>IMTTz^wXZzBa217`bkwU%f5_OwutXUprTTX|jWkPon`Cj=Kg;q}KqW z-%60Pwgk{V%xh2}*#r8VFzN&|zXsr;q2C}8}Qouy)%2u#0>m_84E2Bwb}qDS6X0plpy z-XqZGz+JgkW#;Z7T-;)5{G{?h&VOPTQjj9b-sDSQvalxRBAuxE; zMQVh^0XF%+d7DUU~~mD;bABizpI&s~x@@Qw=PU zPvLh%I4}+P(Ik=+=6WuD<(XK0V7(|hcsD;4SfAJjo}4fS)@Bm}Q7vC!vpf_a5u*oe z`e8?1r?-K&a?qJ6{twV<$+tF(5b`G1!+u}=2GCOssR<@ZjhD{(R~Wt^FLs2B~*GGigHqXdDTT}GfX zW)oP*>rE@0z5}zI;#zMJ!R|4XJl^PHR4YJu5GK`dW75m=mb$6xCw0W(|tV5}|?Aus+0%B?2@ zV>J8EJdX`vI^`8P>vrXTNWU0ltobN{kOx{ZYn+6A{p~ZZS8@af7v9@NQDVT9U@ZHn z;}|fWYq|6J(gC1)uQ0@Ke*>8NltL*#^8qstgLR2O5ionqNOm(A1CyIKt)cB_U~#l` zmT{H>HeXY@bS80N{#3W2ux<-1*o$&~aut{w?~oQ38xwR+Z;SUd0+t4OR0F-4VY-3C+D>11JlBnd)eRAfZq81KIya!uqZ2u-#_FI%%ld-Mn7c$ z{ruC`GM68~Sp1K}IGEs%Q6u%4V}F6k0EL|lIR{LK*-N@Ua}j)$lb_R11x$LBsJTOxRQEtB707l}dHSXCnz-$!$_SJ0}V9Md%_+w}cj9%BmCcOy1_d5A^ zK;a%RPQMp@{@e=q49-xIQCgJhCj$Qd z>M&EoRp7TiZ`gIu8u)kW;xr^a1D}!^xqXrv@T6`2q|+Y+krxMVY)c#m;jQHRY-!~n zWI6oep5{IXL|naM#g+-eou*Tys?8wu0`uQCVFh7s@EtWU{JDA`1l+EEsO0bi!N=y8+s~fjP`RLO6ef zSF%VM2vxF??Byqeuts4=o{R+uv$|`eMQaeEps9P&X#|3Q%RabAtAfyh8xEgdXae`R zu#sHR0Prx}8r|$W4!oZO0~2W?fhUvht!RrJ2o6V;I-Q~iKEpGAkM-{WZ)Od1Fo_cg z1_pQSxY7aNOGm7`t`Gd`TAa*7`M|#wdRwTG0{EA=mlPdKLEyp%f0Jbo5G?j~`AZxF zLWZ_udSCB>V45pE|64i`xP|>anidFu@9^$%{c9i?5p}r9;0_4fmFp}mr~y8;Uzf&> zhJa@`@`KQM7T}L5sxdYM;CWh4dG?wN2-BDZjaM#$fXv5h)6+E|Xi#+I6enSSG<6YO zw|PMD(%pmmrQ5*wXYpx{pC0gjCG)<#d=GdW7^MV!Y=LKajki(#1@NAB6Zl&H8@R0} zoA@c)fsd%_vfMEn;Fn=3WmlyIzJ)`+0S&ppyYV8FLgyOrn-*UGpkf3(XPB-XuY3Z0 zr)|G1c7_3;ceyL)6H(xA^*{Swl>r34md%jgnIjx385Y7pY9QkkFr1_D}1>})#T zz%RQOdjBdRzMLnos^?w@fd@PyOSwzHqm-zw1|GmG%r|Xb>j}J-BPL^e+`vn>Yu)u$ z2KbDd`Mt`10PhP`izLG&5ITAP!O2oa5MuB<8vVAE;O`>EsI&nP;tXT(W+RY)Rr~G?Y=Y1gcinF}3m|l`O@!7)0EFc$v$&HBLC7&Cn!G{`gzRHljg}685c|VN53&g7 zx3JkKwW9;UE=O8TV@(j`eGM6%pFps#b69FGAB1dwv@DU41OF#h<0twQATT?IksP%uy`)x`yOr0DAgd4UJvI%h=ZThy;$^-m$&x!4A=7C>O*V8Q926#$a za*XF*0r&lPHNn;I2=Q|#F}`I7LMQSLoC*I9LR(>F*tZM>YMpg4*$@Z?4%%Ol=K$gA zA>~A>Cm`&tI&oIR5d>eIu6)ICoS=6agOC^#2t@^-cbcC9;Vb?R?(XV?K$9i0lUW<^ z4-koZep&=!77qXDEo0#S5t|Yn)CqhImsdxKEP=n4PPfYOAP59lHjw@p2mVgG{uX{h zy~@%|*0zc!)K4vkNl`}NFJ-*n7rO!ccE2Mj#6E+NIwo^rA;edee)X*s1MnwzDilY` z0)IeIqM#rG{%YGNPYRzA)?Ybi^spcJi7TV^KhS_cd+!Urz}JL2QzmZMqcN(#`$RZQ%w1Q7xUQIxi3ycuZ{45kRQFPt5B5nhCymPVCS283Z|u&I*$jfxzt= zk)vJuAeqpp>l!}+k|HuT1|}RJY4hoZwAVKfYx}Bp=$r<~Lh$k7A|H_cV`$LLVgr)u zjUEQBdLZ>y=s~THFi76uvH$(a6(l$~8V{HEfn2Jm-u;1MI8fh}Fi4myWSTEsCVl-5 zq)MYmbo&3mfs%~C+_mc<^V;J`0o6q~AVyr?{>BFmh<0)d{}}?A>GQY8^XWiZ@t%U2 z(sPiauG{HP+6Jjh|I`;nb3t0jf_4v+gAA$Y6s6cvkfzc63r@#D+U08eE>|WSeOQJZN|fzt63m>4u9DGRRGc&i8n$MLJ8|>Bz;v6fppeczZQzGAUzrN zt?RQpNWQvqmCbP%Bv1><>-B1oaL!h`A(9W`72k;O>D~hg-lyg}vK%1(_OS5vSAig* zrSWo5*DY*&v_Gm ze)^bGPE0dM1~c4y-m(png0%Qg_G^&7M^3zuO#(7!-3?O|`a$ZIwF*(H07zOrj3iUf z1nJMmC1SmUKnncQS;bpGbh^Y}PB0iGf)}Va8X`dA%V>?bRRF=C`g9652_UiLxb}V1 z2_$BMyU&6V$Rw+|8?$}`8K#;sS(9*()K>niGf9ZE(6qJ(y*bFNlxIm*M1XY5WTR#0 zJ2*gMmuOfy3>yF1m)aoEvO%=lCeH~=UCN|!gk%CMxN4cK!EJzRL z>{mwk!huI6PtUph23gkezZGl`2=PkdFy;3L>Bd?OKLr|)WYY1oHmC$y%YU-$uD?OX zY3aTFWC}=MOBB02lmfEeHenMY!yr?9k%vp=9pO2dCFfByNLv+p1^?Ot8J{-|?q3!` zdTuM^bhQ;o7oUzmZ$5$4#;bavy{90RPs8GtssR!^l2$@%R|(Jkb>kAz2apk;oIT*U z{C}ip7i{mK1{qm4g))9+kRChxvpNEUv;oJUg8&am_)Yb!M5cfgO=AW4_=2=n!n27E z*Z-k}YMzJ@Yb!{ZEiXR2Tn5r|{@3=u*Mp=(V^+hH4v_Q_Dm!yF5yVe#3N-yl0dbal zWAYX^K*sZl=6xzdkfmi?J%9fV$nuVjws`@_kf(HC`1urMRSTjr=+@u>H)B~Kz6o+f zOo!eP`VVQ17dB~q+8}LPxAbaa5@fC4y0j(bfNTiPOI2tk)R!-MPgR;gagGxWH{D=t2J@(BuYN@*Xf;zoHb&wlk^ zBEzLhUsB&2S>m`G-VPcWHaO9eSeJ!~1b^Q<_nFC~ABSH!`=Q+P5w4#+6{}D230IX6 zOTUgZ#={g&(n6m@Icx8L)A&7uXlg*;3G^nYTKv%;V%+Lus~FEhiM!0RTR;DRp`7^K<@9yjBKl7)Mr9c{v2&*skTl@3*hf3B&dcKR zK0^lW7e=_*>q}EH_cr!tJU%)b@ez+*Td3po>czeKD^_K0W4MoU0Toze;-=znkv;dc zaDVlkFQyI}xa;HswZP{uc<_@Px3o(Vo?I!KNUTi8BSR`03ZZUz$B0sl9`4eFlJXFgw)3bI3cX)qfB)v+ECr^{`6z2uvk;~^TMU0&A z=+fkyqmd@Kq2+~un%HmL6#4wVdWbV_^bt7Cf3XR7(5b8cBL_S_#AG`9^*EkbbiZqI z>=ACIcX^camKjegI)*;`RgR}}UBuLS-{Oguv5O_D!Fcw($eRzHthns^mgy4~QQTBl zB5TWta2?Ie8dvxaJXqU%;Lr0OT>VZlp?5$Ex7&P~b}i_@?cFaD&Ai0$z2IYH%)@pl z-pcU9Qt)rwNdAnuQYQyjm(U(Lbu|^Iird}MM$5Q6T5>gYV;JXJE;-%)9fd4bxEJIz zYjG9LdQWS!1FmQ=uQPU-$GNRXa`a6SaWl=YI7dfy++wog{q)Z^u6W$_@-v?}ZY}mZ ze{lH;&gb9=m}Qy8jd6qS1x}xEyF1C1&+39W(L_{}@~1YAp%gm%W#bYq)4$jvEu4#s zT5OpflauADq(5$z^$pRzVvIYkOl~}NV#e)h59DBD4!7JZ{TL@d ziE9hLZ|^=ifr~<8BT3h@aqT1d>#5Ina7XQ8n1+5TYP^#nd$&asXUAy78~lqy9QWdm zsksv2e&rK6hq7q#pvV4EdqGFs>qXI&BWi)W8`^ZMtpjm?-A$TX;YPSKv#h*ifCOjU zy;f;)9dKn|lo?B_6#g?yA9-Z&D9(3E{4PCy4VNG4uiU01!p#A%PNZ0n6MWT|@OWqp zchMC3^48zO?XIJXUDs#+%Z|Tf12Qt=xc`2kxA%Z4ZoFIF7+~=Mx6ycVX;X_4^pv-( z9_GUBLid>D3jJ}JA%EmUJp4awyZc`5X|XC!QC;ai^?e(6E>U{#P?q8ng&h7YqYB&+ z#Bqi~tr)kTfNW2#gSf1;xmVcc5+35nUAH*NiTia$Z4#KD;+B>p?XT`q;eK-p-lH!= z@Bll{fY~Y`&tT_XOG+W`USfRt@8&n$_4AYEr0F*9%3_hN%DaFYV>fxWUHEbL(OT_I zx+L7Dx}kQA1Mm=)SnttMZ`>Mn>5%x14%|30-fj4_2p1_fv<1kUAfGLdkAI)&;V;wa zHK{t&IJJDsYDP8{4^ss#)jeCsT^DVaf_B7lx%ROEw^m17G0t}+<=YmnIy^o$EHjLo zM3oeiX)5kK_GfgZ@G4P&WPl>;2^u!&b(FtEyr?P zL=pKc?F8W5+QD`??=ajfP;M`MK@q4KA_`6?w*k$?#e7p*2cXKOSt!;9px63yJ}HV9 zC_X+Zf3ANBCPgkiGq?er^92P_*mkO%4kI^_x)ipnM!C zr~7OVckKa{$9B@e7iWOt$LEQLKEgSv9Pces-viQb>u)tl<$?UD#ah+BBS6Vlmh2@K z1LPd__7-MaKy|SA0sTfOP<^;lY^k^zDx@{y4kPoMhTNZ z_tWeGr|u5WK8+2!t*Zm{Z(f;+DkcLBUAcvtf(=mdWEl-B(EwG+t1mk4Cx9;d(VcI* zr+}Vx@@%&}88EyhGjvv=2AZpLt#>K5fWBDO)a76r(4S3uXNS^(>4arkYef-69}kcUb>*8oLIjiHBN7?4{s z(tZ9`4wU?@_8y(PKzaQ{mt5oqP~N^OUro&d6f|xp4<7LbD(@dHOj8CxA^$GzJ2T;Z z!*)$%`{Y11a+65N@-|R-OX)|8kpTHRnTFyj21=qER0hgjK+bM)oLA)=P&jF_el-3D zR07g(-LI|zg^iMPnZyoI^#?J3On(bhLeqGxgm9ii9El=oIY7zCwzAqw@XyUgk)vII zfU4uQ@)i0sK>nSIex_IqC}jC|7v>%TMXn2*U4#Ho4$D;PKD7q&r)E+y_&SiLeKjl1 z$_5I@<1Yo}RDj0dN=)NYCD3m7JywNEpw7#l>%DjssHQeJm`d`1rmZ&Tk?3Kd{-W-| zvG4-OQ_qVFTo(i~10|JUX!1LxtpgtF; ze)qdRP`%1GwKCQPirRHLqow8lV~TUb9QzPZp zpPul(DFw(5YXj<+JlU~hi9mftQ-jmBi%`d&T7Reh2o&EM9`wmM0;OJs?Lu@bkhWE^ zOiIT9`tO?N9);k9ZwvP6+@RA57b~`2j_<8q1Aat3WZO^(JgV6R0hC z5B|_|1nRSS);VXqfcm~dAZzktpibo-&dgK+DkF78&iY26IyZmWwJH**<5;-1?Ee8J z&nJc{$A3V<-|rhiY5+70?3(zJG0@(UdRAeWN~miB2ZcEZb)t}=VszdYD7b|NsPEAL z<^J%I%8TtlVf}idev}xqVnb)_zE0G{^@lv`O}f!oG-lC|m;@JkHDkOiFvj+$q0 zH%JSCv-mHkk>63^EZ>R0{7n=%H$6lG-@gM+*AYsoS_JHkpoJFK|{R27G)&2Ao9k#U~f*fkTt7jsNj8;BKa)G1A=OdmP2JX|tJed4R~%8UR+P<1};~=0QqDC;1WB+{vlQuxJKW$ z+I_hOyt7qJ(L5%=RX?28k`NEv?kYbk1q^|gw{U7H_Adx@JSwQre-8qukA#kLJ_5c7 zV`87EPr#?xLTYuq2RN?=)2@`a0DIY~XKvf}z^Ql1F5Uxx)2aAeKr01sTUdqI+Fc~X zDb@M-y%gXyxw+wfixjw%In$FbBmu`xn!%G>1t1{M-h8I53wYgw#uDGl03W5&mGuuC zz{lU&I%x6|c)PlVNyp}Zdy`p1{)j8^kkVWfAl}8TmJmOy%;p_ z!x#d*1>JJoREEIwLp)V}kO#Pkz1OT17J%D!py9|bHQ-W6u;UJ$0xtH*%Q36hfV1|m z;o%p(z@Zpra*aw3I7Y(fqAf{)kiV%b^E3E&D^z2cQN4qV@?ejn02 z0-V>|-%uFF1N&_rt<#e3z^(Xg_)JU^?Fu05Z&8+LIxz&ev+r5CADaU1t2@&kE&{+&eugPY zBn#M`bL27SJ>VFVau4J*1NLaE#m6yEfxWMN?f3gC;Lg>;uI0PH;~McnSl~Qxbp<_P zymtV2j%(0S*ysEo8UFd7Jl6-jhpkSWwYUo0DWd1KL_PyoT=unB^!C6(mNWiD-j|Sf zm74n|GQcT4f8}eG(EpIbVj*+*-BI8UOPai$@e8;nGs>9B33WrnI^)CG5#X>&>bom@ z3OM`L!&V<=14o^Ziy5aH@Q&pxPtqy_U)aNf-*>ryr=`e-$WI&i=9LO*rUQY`;jtR| zh8gf{>{D;I-va)g^b3D4wE|D%3dN7L1HfgI|7swQ40r@XcUE370S~S3`@b!Bfh$d< zzOU#oaIZgBRQ`AacqAhIzGj{S9-(797K(1bb;~M~pTdu@|E-TUx5)`UT-1)9`UISI z#?G%;bAj))^m^}LA@H}ia~qoT5bB2qamd3r!2UAnkcG-D!PjoGc`<9iee_*uI|(1~ z^uCvwKW+!S$3-28Gzq->nbYbxDR8>*SX#K>1a0nCjH`rgCT_cXPnTrXCSQa34NqL2%Hr)q71`?dg~JXA#!*X zIF^RI___!>+B3$xR;U2m^Otk}>!!fIDMRb>hv4^%_8zSfgu0PqpkP!{1e_OX6iOJ_ zfKxa9K;Uk5 zwo?Of(^|!$yC*@stxb#KfeMJTM7m`hU}x zc->cR5WZ1oGQvd!Vq;WeFVllT%x{a*p=kj`H^fwJPZok`75DCrmKBJldd0WN%YeAK zqxZAc10dX3DRrYN3B;L_fBE|cfmq=%x#~tWh*eOmN<4W65?hH*bYCh!a*0b}t@a3r ztv~$jDR2|SL=9ToZw`W3o%f$^COr@lpYxiTa08K~nwuJnxR`jsO4OyM3~q^?XA?+$Ps8?qxWL(`he7vfctI(*r|M zdGsJ2Fi5*a!3AP#Pgst~_kfh9lkM|!vmkSvUWMv=I7rXc+llyzffU7S`BX0pkhbhR zeq1^YB&aqTRE9Z0%(t`~u4#Z6W%1vS`dc7geaZD|wKa%uXumyK^$^6Gj0{uy9)Q>h zm6q_AUqPa5{HAc(84!(lPdVN40AxP6B>%u0Am!wxt-lZoQVI&EUTX4#l--{a>(}cb zx##Ei+M5_8U#9V`THXMO>FaHmIe`$LgQtEy5d>*2qs4?!7m&91x<>k?9;6hJp4&5Z zkhes2M!ZrxCgwO0&(}5F(dvCkT}Jy?o)38;>Q})WN;kwXPQV`5X|V|N4^e z;dKxlIb!-ZdwCkVtLq z@g0Boe+*(4vs$AENj;e*R<}5ixF#BXEvyS9WD1)}@_a#*{D81(!4yawq5t{#5gCZd zxTKAa>-`T!9rw;Qo9=-4@)z1wQG%X_sj9X+vq1c-@=NReC=hFBxU?92im;C`zCzgq zLcXgGa=q9BX~$qw+2(qX>{nfMb;<^*yx#{eQpmbb> zPwAS>0y1(69HIx`f{6DTv0+a$h>4fiygSql;>6Y+yX8b6k#&B|M^Z0rS3t( zIrMtcrT_o+)o(^VS1N+o=csis(+07})OW<3`#~&A#aVBO7DQcD&Lx^X0x|my0~2>b z{6E^<)N;Q9B4$_h>4G*uRAbQlaljUcGG34}xS>M02Qv7SN-03B(zJi!E)$4Ny=mXM z;g6#ot@Vx1`Qnah9!3H3e`r**;DXdvH_97+d)czN5sm#LYtG`aMIFaNbA*okK`9nl zeb4SEp={~9%3p4*;`Hva3p@*4D1_^BcmUTm)SRYviYl%L)r&HXO{Z_*W`~n+%yyYk za_IVBwu*LCU(8h-9R3Ao{<_N;A8`kjb1bJgoF_*`GQEK<&xKH1N*C*|fI8F@YT16W zY855BcqOFsKSO18jnW$z)NqmKH==VsVW>hYsl@Ttag=(jmgK7vGaj6O%qEb03r)0( zZt>;+LXPTGU8i0oqv5f#00Xj2G;_!*-grj|S98|tQ<;85nTKvx-1(V}n|8kPUCKI) z%kM~>zxHz(|7mbJZCY-GURYdbkp8@g+OK8WjXlo5?V6+dT#{Y$Jb@*o+t&(GVK ze$7O!J-gF-W^d83S*!7I&<`}%I`N5}@;ojN?5rj!EJ3BwIWa5c!|2and4Vo=3zSSG zk}v4jj;b%-l)C!72qi^N2|3*$Mb$|rFVi&Npcc7fQ91JWaMY%js)WN+)LG;&q9=L^ zjc-kC9jXvP?N6T!KWBABbu@WD4*sk}d8;JW?^FMvHa&xv|Lh{s-8gmjt>j4byNy{O z!zUc;QRb(G&Mcxq7QGmwIyYQ;HVnO^tVE4Dy|OmPsZiqwnJZbvuTY!Uou&Rmo%lDo zc-LD`YFw`H^|;ld4eB0sX;4s~LR}88)ol(-qw!ejGevXjxcWqZ&6@Hou4^-->wsR| z@Feb7`~3r`@|INFeo`aKQvWkT(^#MDO4N>i~<|S(SY50x{aiN0UI-wmNdDQWzFVx~i7s|MCze7q{09iWm z=@#Ac!R3Q@FErFmqyAXS-Vx*XsQV{*dnIoKb*Bh4zTFN-ZMsh$YJ4g~ zjrs-!5oCAJizD%#ctjNVgJFdyom)+By4<71SL@J0dfsjM}6$ zCfD&<)Fh^0HTdr=&VK%#q?ZGs&bXkkdcKdiJm=HQSn?L?;I@;BIn{t`8Uob&)hSS) z?ciyBK?hW(wbIVU6N)MxKXEd>qKj(F9Wp<#b)brFifH=rlj!}b^z>j7HBNn&Ww*#2 zhRT|+W%lp>#DCv>5a%{jLd_2D&_dFRV(O2C#m9u>>RMLl~suva%`_V5>p^Re#NUlB~SyWQ`YOE->CWk$(;mUc{E%X zo%!#69g22HCW$vPLFs)XCrDks{Fkx%X)ZPw-UD%UJ%pd3moj5&v_y~0_X%FRjXq^RuJl%GM-cbq~tMmHcaj9S>w>PsI>MMaS*Ji9j+aoXb$ zqpBV|RPeEigMTazzZXv=O4WI| zc)trWxrlxiS7%3&=imZ+jf7jTdQryV%Tx9DJyBtqcOKKA11j)+^GoRFZB#``^KeUc z2xa)3ne=!4fhu-ay0-ZGa4<0Y3jBG8nvcdAowN_eDfJ&oUy`t)JZYnt9@cb}B6!<< z`07(sb|Um_)*X9PeK5VmbiWs+?X_>HKk5e(%lm>C4G#n9;h*W&iB5R^@}JgJQyaWP zc~;jz$Q!R}{m$r*QN;V_NSWoX!~v1Xl}n#LJO$#~o|(|S4j{S^wmbXuJ`npo-IJc) z$Gb$cW?ZTkc>nmn9&|Gg?>k)cr+SnOB%OLrPULs+HuZ)!$@~u>{^P0DL+gomw@y-@ zt1ASeD8E5#+qd{%o58Eqo^8CDS!>zH#0kW@ZhBb;AMqZQcnfpdParDM4b};l0b=@B z%hAQ#Kytz^D!lP3P^hO~>{nO98%!#VybT|Kr0Fin+BpZjMDxVQdV>W2yQgFle|r;1 zxo$EAOW6TQ2Zg&REh!K`SJ&BZX$9h21!8-L8-e&eMesJOKM%@}{ zKw@=->z0@ykjXi%E#(&B9TNVLg%vftscxt{HZ_I+mF`PQ-qgp-*=Evv;yys8GB8j2 zhZk?J-z#_-LyNB!_mkKHH-m&mfI?ZLgCtWI0YUd2Z z?=E`F-xR=mb6Xd`o5|tL{UVb)^pAj~waRQyI2&&(Jy!ek^)HaU4;%UWix2PkmlLJA zoyWVG7sY}P9mU(Xjf1Tp_W+3|%f*aiwm>>lF=!EU9dFb7D_&c@hF3U;x??jx;5DTL ziGWotAdM}|5kIO4Nx zqViELVP7#4qU!MzKx|AmZa*y#B=PTM7LE6S~4qmMn>7g#9!e( zQ3HnI;fHv$Kwsdxs1gtd-LQxZCHU{S4$`x=z}p`DCh=^McvJr9l2E%i-pjT&_B-l@ zH>XdymfUH?o16VIIfiU_@4fJ@ulOF`CsBUIt$Pe_y1o1Iz?2+s-E#cC9vXpn6@GGE zc%y?icORX3k<8zATk$Ss8(16V#_l|AJvNSrf0^z;_w%V$Et%b0cE9l-0@0%jQPo|?(92mn!aWZH-QRlJqgYhbF^>y zLdf_0lOpWWkAY<7-Ot48PQ35i#*_2T0&k3{M;M*`4n&sC#%qWSh<@_~65C(IySu5^ zlYUs^t&S@97s_pT`=r6Psp<_N*-;Hh2=)WAvxUlMmc9Uy{+-oN$PRCEy}tkN(^nvU z5->hdL&z6A)@fK`gm=HcR9~&U3`E(;nfv`X5DkuzWGSfuv7WxX|LcVRkF2+h$}(!c zhXLvC?hZjgkq|uyf|wvGA|fcD5-Jubp`s{A7$DLhAV_!T9J;%^yE_zp@8`q&{MPzE zpZ0>qb*?!xd+(WHv2HNYEwk&7Q?6qo8@iUuvLf&|UR_G}KmIewIc*u-jEUHeNhKAY z!9?n{&Qr!mF%f6gHR^Z*9~nbsN6SfJmsMguR^AJfuwCyiiS&g(lBr2?qgj~fx3iNU zxeV+c{IsI?P85@ffs{zt1}0%XaE@6t1QUJWWJz2Ihrf@$UQ>IY0)HDEC{LffiHTAU zbEMiAVb->oZ5xsr%<}546YY5|OgB4!s_)G(re}65ChsS~3{|uj)c3w&7J=JuZvMQF znW{ct<#Kk%te?MBo@xxhOxstlRE%z57UlKv>@7RYl)`HD`8dK%KU=$2MUG(RNYRhd z8B3VWB>!Mi&ST6>W>!ak;xlHUG#8%^bHL029tXQ*Ut*>^ZJ)0boyYXZIq*xs2~67y z;#^&)F)Jsju~XU&%o5i!Sv!!8Sw0|7O=f1y_WE3D{*(%4n?OQV$AmHal}-z`Aa~4^ z{+HZ*%oH;Puz%vI{DGQ|gnp)pTbS+DB(Eb;0%o3m?*I75 zL(HreQduM6gqdc~+$tU?oYUlE?L!rdnbES{nrItlwVTYnXFrYE&6rQNdbnabO|ekB z(r`?dX7O&}eHLc;sp0S0M~>;#-+O(&MuS=Hy?=#d`eSCn5-E52_n2|>K5y~KI?UL* zn0rA5VU~(x-coZzm}$8)OnAB%GnOyhGL9C(%uCa|io+g+yj0%TJi&^Y*`KYIxsYO} z3VS2jB@WE&y<#D1;DMP&_#fL`AjeE`?kSA<^q9q>91ok;VWy|wzUF`E!AvryWvxFO zG1Ip|jxs7X%$TL&U7BTt*>nS)JjY5fqx^w@h7AeKq{k|hRV$1cFCKsPg+~pu5D(7f z|CPn;YtODu{W^weRZ}C&=>K6l`x=vxuv3_>{$o@UAzqeWG|D4)%P?Engx02y5@uC0 z7k+GZ8Z#FJxQ+L`!AuF+VFKR*G1HW)htZo*%&=HImx87-Bd104L*Eq4^3FHh@ofxd z)sBdJYLtYT*ce;ps9G`eZB6ZqD}=b6tZgdKmt$t)+31{xV9a3Rrt^nTSJw5dsV<)` zLY_?IEt-E}rh6av1&K~z#`PG>AMuQs>B39i_gZH#ldpQXUnCi(W91-ylhuzI+j<12 zB$zOhmV@E*tK*nSsoQmx>oI0(X;Ttbd4?Ik%02Ane~%gXdf!|>6^B`5wQU9EPZD_i zsAxnPVFoGYf$}y6%=)v7Ht-4;W)?ejsp!T{%y10)G#5rOW11%Yh^0Da{1VVQoa#v6 zeWUoWXf0;>;}*#-VT~F6K2RroHpa{?Jntj6Ixw^4`jAnP8Dmg|4ZZswfAET=0cW5NwE^Ht+lBW!_~@v{y0?*o7t zs~Hv}i^4F|-M)mYYj*#Kiu>o7-}GUo&9<|CDSVj4NoQ4-KN&O4HN_aeYa{S0cj}EB z6J~zQ@uK1G9H#!)<3e@N=6{gMb}jnu6(hnuADeTAnqc}FESruh%}WVy4EdU48b_I)wQ2PDyWlWyMTMUSciZ-(W_A)1@!9Z877b_tb?q z6qqF;>zQBd!pWh)674LTbsgegF%2BymZRs$qUU z6~(YcaxC~V@PpJnM=bo=Bi4r|7Yha4GCxIp6^rs!@2h7Y!-Cld9%nv0gGIh3CQ3Q} zz(OX$th`xMSO_H36z!j2AqPBu!f^|W@|tNbp)M?xBKkGuXDJrG7g->9&Jzo5^KD-K zID&5s7H|Z{u@GHplQr#cEKFQ!8m*{< zMRFfpmI~g(qQ}MmkvJM-J}Zi~8;(nuZ(=cc>(w_bu*p0!Yny=ik2#;!ZsNxxuX{39 z{FSiK(db#tzgbw2XXkRS=O`Asb}mT&%M=!V&DV68N&^cEkH}}-vBCV^M<3cm5@F#t z#S+n_!&o?EHoIZj7Ymz~`@S))$3krp+a;PGurOEMz0h8H!Z|MYO1&GgQ2I%`(`gT} zNYB~3_IlT`&}a(L%aQk3NSX4INsu8HGElnl$?Pr`;_eP@4Y-O$TFA8i(I#SnyN?eB zby;JfM;{o-RX4EU^!9P-raUa%s4Q{$CBkB6A8gqFe#U$qH0-svmoWc_=!B@`HY_m0 zU*5oJhDAP+^Z7_OW0B?=rGqbTU=baywy-DOSj1EWGPh{3&|T(k`_ea9$X1JMVnCme zp8^NV^uJi(gXbMCi5M)r!9Z47{{xFStTQJ6eSrl-KZq=)>tW%WiNs4!7_gv+EL1OR zV8K<5Smh5wm_O(+!v@JUESkRC6rllFsH43#J53P_^%rK6P6!d|?oxQ|$2Tl^J8PBN zF%Js~mnmxGk7EJ-rvtTQV_5JoN3*{64=iZ${M^lLIxOfJG^5i}jD?E_YBYMIvA|y? zwxc{`nD1qU4DFm479J7d?d@|Vod2^UqLCN#Ur;buUB8G$pL9#*|2~a{+$p&KnTiqk z|K;Ivdu=Rq=D_}`-=DD%$zt=Q(+Mn;cwA;}GZTv*8~7Lc%LNP3*bhBA^$ZJh+PNwe z`C}oQhZiG05%PF4>#0}592T%LDf^SHi-kT)OE}8@#zHY~<&~RmVWEqr!i7ERgm~)@ zirtaL!m>*xIhD;=sMFZkJ!c&Y)>OQVu^hre8yYeW2}D@P{$G>005ukBcA5Bl{tp(8 z*^O?OvBg5Ar7`hYGFYfuq4<(C9~Sx-Cx0!IilDz!wR{pMT*oEzD_Hpc+FBQZ zCqnWkJ%3qsVBxEmp2bidC+MJYvoZ1-7CE)nBs3OH;MFt5WXQ(C|Ef-#Ptz0hn{*`R zf+gX74cY^5&9FeNSHc6OY%FBh>=Kn-jD^Zif6}`mfyG`#k-h37=zv&#;r=IT%wO&L zEX8&a3;(veaeBcR3uQzsib@flYu$=tyla9*6h~(&eFx zuwXKA)n%3hELdP!Ie+>r7Lmx^xoj+g1y$%D{wq9zMPgiyC$97pbTLXN-_L5sYt~cz^rCILztJdDYzpFxZgFngh7D&(j<46&@~lRvu;%f`V=r$!LW8_TQx z!RD|u+-du$hXN|XT__**X23|S>n=B6D9m;D9^F~>h6zS7Cw-PSm<-U`|-KCCAp zieVzhG=;iQ3nsH4vNh8UL-)+$rBv=BXlH5cV$z6&E*&bHywEQ&{aN<SHo!L<1e0Jgr6Ur4BGi@0aM5SPV8?Bn_-QG$*r24TQyE zeVzF{3z*fmXzlQJfa$L-Ki=p6fSJPHhKlnUFwM&J@2x`{3_DJy314l4*~GJ^ui~j- zvRhPNu&f5AF42ZjMC!xJoj|)9@c}|z7SbZ$E5e*yuIxRgK$umJc;X`X5@vMItxL-* z!-z$U#JnpRjB`Cr8oqiRmYCc-?U{&Sy!sFkKOG0mG8EHawn~S^=jVC9RS@`ffI<1x z=v$bvKmL=IOd95^+48vM8e!@KYOCh?3NykrKbl-LVcz!8mYKE_j4x$+3i|89SnsbG z$xvfhBDqv!bZ`b1fB37MjvatWsbYV{6$O~P_4={0nh(s89h#}(V1w~JUm7CTIGAI6 zOs+n(3{&mhXYOV%z{Ja+Egol0Va4*opIKT87*RS+d;ViQjBecwksV1R;DHl-H3KlA z{#C{G&Ktl=rE5FWbkJX!c4Cyk>!E{nPPT2fFiOQr*OE&OV}r-ErmKTs=v!PwTVfT= z+RS^<&1}L1eJWM^mme^07k_>x%ErA zz;qR*`+Zh>7{AW%u_<;H24f=uX7FB((GZm9B%A5>%heAX03Ne$NvWxVqD!c?jMHf zI#Yq)6IC#6qtV-AeHX?Of>9i|BTVN?%*Kux!DN$J-sVkJm~1xb?|P;MGsdl>Ec4p1 zTGy9k#J37-XMUcbZi<5u;`~#Wu_%lQT|N+5*$NYe$9}zvd=1lge01#wh+tHRe3sZr z8wO$(m}RQ;VX8UsHuFnE=q-L*Zr?5hYj)Rqsd9%1{`1-?^XWRwePU&0uN{CD5=XO| zm1i&;v0eTmOaT_s=?vrBpTb{ADrvFhGF#481(%$%L($KJyflPZhVj~B4wo<0$GA|94kr>E3KnP7!CE3U788dj}? z#NIx*3kzfCYOhxm!14#zq`MKnVf2n$OPcx}m@oN#h3&c$jQe^7g8d6v^_zdgCUyln zOOCT@8S2BR%xcD8t2!7D&T=7pMeuEU-l&$L_t58-ardR{8qA5G878ZM@wOh0*{p7@{7$2(GC{>+UICi*?7rA19(S>vUJU-?^1etP&sEW*k353OKm0TBe65Hnw_M`Dp9a&2T)jQAM1v`_ z8Q7?QT)|X*?6wrA#xPX{``y}03Ya?U{E~HfI;Q0>8Gii06jM);lg&{9rq;l@ysu3# zHF3EfPemrC)i`9)d36=ji@k23kY>fSIOxUo!}FMW(2(cdscKBa+z=tBb05>)r??LK zhL}#z&i3VK6Q=RqI@3g$Kd9$7-h8Qa#nhc4Vmvb>n99I_eD7;2rnPgTY`dfp?#4O5-^s#CN!fT=GVn=uzSW7;@2+HY0- zn0lN2DxcFEOv;!vINhj^$+brO*`4Mv>9LbtE%)3p^>Sz_*N=HjnIitGxa|_A`dsF+ zpuCEy$^Lo_@%3OvXU&i$mSjv{{PQ!4R>9N;iX9Rsk6>D-<`a~hewgfb*r0TcN9231U`J%8^BVq3$tCUF9%@e~^;f+nVPWNLv zl&G^kdhGfW?|Y$2^-%sIZRdXJD^G57gH;21QHifVH&|4 z_lm|~Oj$g)t2Z`{X@_^t>Pr&pewFn2uVV)=UEJmL?D>j}~3O1N( zrh0CTh!0apaCN;BA>=J}o7|1F4Abmie|43O0@L_aSbiAh5U*({!x<8IU!`bd@RU6l@xp+TZu1r}-kLS-ZOKpw^0Mo5EuUcW5y6Ih|s@ z`+JxsFJ9ooy(gH?Tdg3|o(t32(-*uA6~;81D-(n6!I-M)sM+&_w=vz{*1yANJuuZu z-k!n5NldeHcg3&rJ*KU4otXL(kEzM?{GE$FW5)CRr{|7sVoFEdOmUcA^^3nQ zruGz#y1N^V=}S&!uk0~k3agj_veHMGs=Muy{wXd@L3!<@_+mPy{C>)8Kdlo}eQSLE zLwyNT!ndARXJ{~;%IxdQ>~xq`Pkw3j*#%6sdm^lK*c4N?6>T5g^~N*?>WSAPUlG1v zaP#HyYD_D-L%pO&f@!9u%VJ3sFqI$sBNI|TOf~ksZL*9GQ*x)c$EHwXioDYsVc*vN ziPX0oZB?TbfLzVRaS*CgSFP{Mqf!xO(JU+ z$te6kNGCSAL0C93jWzKO@Ax97Bp1~(xmS&;ly3j?da{Qp4|Vo_jP}Abv!*9A<)ksy zTe|4y(QcTwFtaQtp#jqf8(HYrxDt4xuX8T$FQ!&`QXo?J5mNi;-?qz`Ml!6^rr!e7{Ja>tdRzt5cS-F1%1yv@ zxzoqScL=_*kbaU$A-OLu9(tD-}>P@f=`H2<_nuV!<1aRcWvvmF?nOm znc1)Um~g0Y5b+pUBSs6K94gBuBJEIZQFb zqw^dcx_+3m*v8wfTM%Z$!RHZfPh1@SX4sWJD^7VRk<;S1H%+x^5-RIhYVANk@2o$)ZO0 zr!?kz;$Ups+=Y1xR&D1sLos(kHzUK%Xv`BcaX@3n9`kH&>!-fe!CYmG#?kdMn2X5$ z>04o1%$X+Y_)nq$^BJplN2@qv-md28A@xPfy}hAm#uJZuX%zN+Zy&^5A%a|;|4w1f zMEC5AOs_DnyF{bZOJ~fNcld#}WIEKCeZ^b`-XC6GQp4O#$7m_| zMKO14ICOQAVlKIv41tmpn0tpTE&ga2=FUiN{1QaiPgyFjBp!^#d{5j|_6@o*m%gdJ zzLXf|`uy|ylzcAcsTsSw=;26+gW~bsc2~^y?ZeyJ9C^$(FhBMB`2oxp_29(^tz($a z@93f z=H*qpj+-VhuTi{ou<;K<9d3xM1qNZR2o5@}tt!lYQP4e3pb&GPuK~``8q7_j8!|H! zfw>3qt46IN%=t}pwAJOUXM>sG`H zp4phED3V1^8*`67pe8;~;O`n^flHA*=6R3S7KcVLk5yO${o4l2H9szUUU>_1 z%Tj*0LbHT!0fJ3z*Y=Rc^-Z8|J@~E%YPX z7<2kQj8p*vx&?2CEMIooiB{lq-{8!qn+Z(yFEy(g)*129*{ z%@Gaziv-=0FrJmB!rW)lH8&VCF^}~5tYFF~gy(eZ_7yEKN4TD)A7cpS`b7D?-1Z;l zXlp3qeDn-+@|&cDxqkUCa;zGvct6|2+y@dvDBt;EuB2{@bgrYA%Ql^!BaILTZzHFDD5#qCP0_b#j1cBJZKYAUMc{WTl{DAs0?eKEIaJF3JLa}u@p)y*f_Yv_HDf~m=L|n( zZFDmSbL;oI_vhTk+$T=m&@&+LfrIQ#)9?$-`Hz1zo?`{`sPeQ&*?hp<8%4y~=8rJ1 zZ?K%!C=KSBt$R77bDqE_!+({5aabVsY*~?EI_7zJQ?lh&B<6O^(*_fD%zarrPJFu$ z^Y-Qn-c%^WygbeELqbcK$A)>S^w$-F4uTWRN(j%H{3y()BPZk&6xU=PV6JIq$;c2j z%+C~9-dl7B^D(^$;CL5}`Ne36zK^D30h{2HDo+ftpls; zC<|boL6GBbYQWqLG42(FIgm%hic)MS6m#5cQq{<8Ao!^5ow}K9%q4qJeY+|Sa}*pT z*HwLsIZCKpUdXv)?r+W-{*z*u+n0GWP=5|{S)Xm}jw8ft8txORU4c1_4ex!#k1>aX zU|k#Tw_KSX3tbf4${5op_3qr3ZWU<68k<(v!b+Fh*?vEpZW3kn# z-9JH#SS(aVVwb}Ni^Mi1dbZYM$&iFQGU}>WVk{wv=4m{Z_#D8juEc{SC?guuLnW}d z-AOCandey4{E4yUrXm&(DrLDnE{mn8iqA<4UdECu+Sj#Q7qF0)MDL8Y4i=|-5qtWw zI2QLd+^Tawj>SJci0mCU!s0JDehz36?w4kMmRZvai|Zcwv&ecGOC9{f6DEdF{N`cQ?1DcdHyN$ar)jkx~}F&ivg zS2dtn{tHV4+iH)OJ7BTSyrZp4eOPqPF-h=)jT5gnu(+l3=RXn$v3QXyJ=Yr@Ea6H1<50~fEXhwsRL$`l zi^oQx;P`7;0`V|vW))$Hl($bC(+G9s&3dPjDTGD)$mW|fC9njY@sY2Yy;!{c0G*wU zITpLg_c`n802U{m7?8T6kHtzAZ)OgyVu>p{_Alw2u$W@f2PxBVES_;QT`qnJOFSxy zVkPu5$>-sJwmvChi8IEJSFjoucajs)V)73@20TWy~wim$aXAo zAlunYnG}od>zp_ohY9==HfN>w#S+^mGU$jrvBc2V_?MS*v3OgZ(t(aWEFL58X)r>K z#h$9Oah_|#;z@QnQTMH}gwRE5qMO&T*d+gMvpz8v4_l@WTr|bvwogqYD?VWfDvNtc zTNnQGIdDJEQn6t1=aE(ccVA(Nfr0MRAJnm!+d!J(q5&35e8P9gfCEd&Ww+Bie8Hkg z-b@CSR9H$x%Ix(`RV>=&X~LhkgheDuqeLtM2=8ec=@4VWl5NN0J$Nr;(Fgo#d~A2I z$l8v+)*K@i9`a@|B%#CNj4x=1?)GBQ-;xXZ2OeQDE4r(k4h;le%KjqGiy+*;ck=YszaX*E(kC4OVE?7`SGCImkiOZrl?O?YnP z{p3j+cP#O|^)U2TV+pJq7%VSN;D3j4RNejm#U5WAK9qwcCJIWV5MWVvUycrQ0zam0 zc=ZKNVv%**U+g*lS0_Lck zoH~bDDi(Er*w2+2r$CkJNrz3YJD`!6zCs0iHZ*cqw7pMc22DlLl#$e>qp?HpK2;@+ zp_E3G!0+SzsL6TZ%g?ZXsPR*2wCY$ts?WwQ<1F7$zwEo&mV5qasO|n^&H`&xFJ9I1 z<;ZhXeST1{hKL2FmwgzcaFj+9DaNH&_$JWUbYicG9v2$bJT5}2QG)u znjesu?jl%Fwv7VYbwZ`0J5c{f{_f#FOsI**FOnY@qBiZ_Lua{ZQ9XV2ZRKfe)N=Ze z-E#S1G<3B6tS1p8%85SXy;UxaS}B;Gnr=|S50lGDA19SjLtG$xpIRI0l-<%g<`RgS z=SfyI3bG+s-D~^n`#v<%I(FOOUrovvdf=)k58VQqJ5kXioVSds+#VhMQ{st6zw||=x(lOvznsB{AMR*^ zL{idYI|mKe3-?c=5i}+uFR&0!IFI%Yx*5QRrp;V4hg>aDR*lG;AFI-{lZv}nvj1{lxXL_@x{)b9Uw!nhTkWA- zw>Lzd^&cSa@{H~wYXS5lTf!Qpok6`GFYX;>-9>GtLNi*9&Zu_6r8G`F5LJdBozog* zg`xw4tNW|AsM5NthEzEfby1v`KKAb`dKIeXPNpplpM{kE2Eq?Y z6dF(eCy=kof^rYW$fr6BqTXe7buvL#)cR~i|JIH)`W~h^C2zBWI!8Bd{bi*>Wk-o^ zS}s|j#M`6q-=q`6SCJ_hRofO+6~Lf+td#?0dRKBcXcF)nSa4Zl)I?GGS2_I!Y6_sG z8#uaw+H1sazvmJ{!xh2ukMCKczV$Alii5mh#j_@~SI>xgFUr)ttx`vw+JC=fdX=L= zrVnNZx3$r?oAIAtQp};gbd#j|uD>W_g(jr+FGfB5`umTsR-)SZF!DnmkD>BR!>&LB z8PsjYWb@{-AZnK0{zsMb57m}w3P=!qZ**zdMX9@a+7 zqdSoTdzQPzi*pvR$DkoTv1j9Agk6moHpAoAFsH7)Z8v5NE7v0X&xF*&;`cK9 z_l{n$rowIZ^r?NVCjY3U`kUAY?%m+ALitNwfoNZ?8MYz zgW}@m(83;U{!v|tzheVi##&a|R{5}JaCC`DRSveqZ|uE_%Yn^s{iu8QqhXWYRH`;{ z8#ZlKmgxh0U~^Zs#P9P%*h=Rv|NKx4wy9*E7`e*8?|?f4tY`1QcA(yn_$ni;UthN; zclrw(w``lXU*CbvhvsK5H*CR{D2@5C&Pmvqt8hOqrU|R36&_5UxCBcRb)El4uE1(s z$c^R`Z(*6|i$$u77t9x2y7Fz*9Tt3SyKb`%!o&kH7gH@pm}ltcvhtaPDJMynJf`Y8^gzrueV@6TDj=$KR*JmVtDj;SYcVe|1j0Nm#`9o3ZEu+ z!|K-@9d92FShmaY99iUGLpj{y{>lm1Ail~tQXm8?d`+tJP6uI;C5^70#2L2N z7iR9f4Tf!+-LEeb(qWI1%Jv=)L6SYh!LHtg55IXjV3&)MMeFelY$f5(Q!^Lg zH+MyMen$fAIZT!4-3@|2VTb&hTBb2^)W4}k+hW+Qk4e2pWea<^+zW;w%`tB3! zu@~_7dXw&Zl|0zm?|Q@k_B(8U-hWK5mJd6Fi>xGrk+5~|%0rzwY4}5Q>-T=)$p7H) zhXZWxjzFl-@5|J8q+$CuJKxIhTG;qy`^jm*8@3{v^+PoxVJG)NZdcd`*l4&UA4+!( zc25q4`@GYD->qB=Uxf+hUvbjBTN4bs3Wj0rntkwlN%r_*`)lx9jdgQ2C<6A@EGU+F z2z4qD96R0Q4cl`DQ$)%Au%2q&bI)^`@IDi6RW%>juDzT&Jd*-jqY;N*D`&&{b9w!6 zUq{%Kx#2KPbrv?K-?+VH?1l{$ADty38`wVZF#W{m+pyLDg8E86!C(C{tt$T!!R~@` z{>h2gu&V#M*E``TY}IL;`c1+Ho2aMtj<_mp&gxH&U}f02=pXB5O%Cg^A&cFK1f3Y1 z4-_s5h8=JmeP(_iwwY@}*yDC#^|j3qb+`{KpUoe+?YaT0#qP?p4gX+eAc#t|C9o@c^vcVeG1!TrNI2nQ4O=9wi&bZi z!1np6R`Y#l*m(aWAT*N~*0mN$CJd@zE$qxDag05ztLSSN^c{lv;NQP%QyyXppSI)| zgW;Gw$}cEAJs(qqWftyST*DLv*+p6N-k3T?ELP*CI;QwgTWzWT9n-ibly*B?V#>8= zpFgy5VA=vodR-qOOu3p!wT%vA>K2=!sLMAo)u`gr6l%oOrK$oXL4c_vr!Vtzg<+~0kF|Qmf0%5Nh>D_38gy3V)IODCx(W{kC5pe8(cw+9rXye~-DSqP z)Iv;OE8SdD(}?MwwEl2Q+`%+ADVQAy`yy3k*aF$1W=vsxQLf{KFec?Vu+*e_6_ehz z^Nnu<)rv8k5RX9`_{P z!6fyoAD=OfW75b&#kUGCVDgf0^%AnqnDYMME%BZ(O#T@eCS7X6&C6qr!gFm*TwNhVV- zrg-q^jLgYGOtB(^&U$rXimhqK!;y@bn&*!YUl;|ZtrA|`NTJ3w!u;yjgaa_u(T{x+k1+Wi zPPWmTXEBMxvd;Sg5q#kB=D!pBg#3POn|;ah9h2ho*+gHyV`7D0(#^GOu)F>5kUaT$ zd|+ot@8HnK$L299Yphsm zy(uP%4`A$j^9hs9I=t*DjlrZOZBo3lESTif+Y2k}iY`usq=j)P7AnUYFQWcXD=l% z1?Am~e_J;(r4f7dgOXuPGkuyNE_oeO))qTO-<-x&)>3jAXLK-m;H{PB=9`%OSpFr7 z{Y6YJd-DF9bp}kO7;d;eFomga4SU{q_rVN_%qq+LDVTPlA>{VjO-!?Q_>3zVE2f%s z`OW!t9MdS-rt9U;VY-R+0^b=0OxvG#i9Ti$)BF*BAa%+C)655^af>lys!ta}ge{+7 z8q#*#Qv-aMjzzXJS=bNLNiP>NX;fiaLB;7SIO+Mn1tx?!q4=^Roag08H54zf?|U`l!Ysp$l2OjQ(n z$?@_@OikCO%(4}QY4VJW6At|*@SJtr^@kOvyc73xX6G;_uT#0(C8UTcyFZc&Yg1!d zqHf)W`-7M^^ofSIQaGlksbOzx*2LtyZdvEX6)_pf$f1)G1m8+=%HFc)#-wWpYp;$s zW71m>W9rUqVp0jx8~-lWVhUnyrB|+wm@29FA=R=irpbQkvv7bO)0YK2cRWY%UGm&U zDTN0FpGrQsrB#WkKe-gXer1BGuWcN7T6-K*?iFz%5;jaOF#4?`=@KRlxk}d@rd9p*?PQ7HDC!klTF&(~cz zF=t~LYp<9;=5)NJZ9!`2OPP08*`-b?+jF}Vs?rG zd$T?r%o0!1FV^;h4OC@I#F{>&cHZ#;|FssJE?)X_3%>2;U@4NCG zX7@2l=TLZuIST6}g1UP!TS!2@N5eAa42mvUa`VFMOWDS>nfaLG6x)^@2F#(%d+%uV zL(KJJRmzKe6?522GJXB_4YO0DqTz???=HkjcZW?yOO=6ex_x#%yyXFVc~xyFjt zQ>Yg)SK128N{Be-%nbjMdhiUPu3x$)xV$hYSAT{B%{FE$F^=W?mV!B|!u}BJPhxiK z>|QT5Zp`-ao6Kd;F9iN^_I%B#!YrT5YXYy-U{CB0%FPoph?1$Fo7)s?Z`|@rUbCuCU2{o8G+Zthe8_Zl9pYO(yg<0K*JKoQkU{)15rn-S0%2o&B!*c8W z%>(+FOY?&3jpyx{>rkyNyW0%r=-eiWE*r<(Yp$a4n&X&9lG~%!oE>xaB^?a!?#A2^ zMDiEB{$LK@w?!X*m0+%0x0=JF z%&p64Q)bwMxn)29c=S;gbKlK=V~C0k6#oDVt0 zu77UEoc`F(OVb8(eULE}8dt+y-0%7+WIX-{Icq|!=9~mEn=jLPdLkhYOA4N^N$4?W zM^VvVkx9&H%v!~Dq6f3<(B8hD5Q{k}54jE1(qL{)t1sj|eweF{RNL_@V4n3T8S)Ma z%-u+TL_)O^vpeNni0Br^yceBaOYekWo^#w*GDrC_yMGsv+aFQPaoe0}SAznx#c{ro zeZWrORj}X(Eiuf+6#kJkgaLC#e)xR;peJSn&X94@tC)S`lYKXp6J|Fl;mdy|fjQ-N z%R+8s6MW3WqbDO{2UzB3OEZ&`pOu2V3`?>s>>wgLS z=sl{~ZR~@&Sb5$?rv4z*OybOMx?DjO5VwHNc$KI~K;~!hfG~k%K|5j4C>ta%glsHBGIb z2&1WoKR$5Ef>ncBVe_~Us3G^ZjTc{s5z-rv{J2D6wDw9Hzuy7qL1UC6BN;H!(M!tA z>1uD z+cwlbqzLa*~`s0EyL8QGAWjp{gZ5ESHb%|h3P~vpc!70>s zO605b2~n7e(BeOO&kU-jMYBA!|G;R-+|>_fL|~4i{h*QXd1%QX&P`?$hLJLNF3#eU z(7}H4wkNF`%>Ldlv5uIA$aB_CjG2y*uqRaRFz_Dgf5tc)UnqbLKb9lp6z@)A6>8|*5Frq&l+9&lMrbnW5 z$Qj2W*QD$0g!^%rsR|;`49kL<-B*L(1b@M%qc1hPjWk$<=f%=7Mxc`8PT8hkzruKK zV}46=3N*N^JXyb?gQ|SF2G~*w_ou9$kfE}Id5;*)uv-)`5~T1hv-vnobZbk$_@sp5 z7($zPrIcZWl}XGiGXj>Y|3mVxew)uUV;HqOOA8* z(qa5WaI9cT5UhOAX&0B1gT5Z!>CzLkFl;r=CF7L@y-$AyQJjAYy+`Js>14^lsBk17 zG5dFzvrbGQn(Kiv?cfnAF@G5Up5x3}A`XLT`KDacH(}2I*Y{(j(=e;_BkKY22^f6g zTk&zf5c<3g3d*0JgXY7oNyEyTFtu=|`Z~`MXc=@o6u2}8^W48iinF|+@=~H)P8|oz z;+jwj$UexEIr82B+TPw7jdkj&E=RV7Ym!q!2P0=6MdSG~`d*N!$ zKJu!Jx#Z2N4&5fFy$+lvffX8!Et%N{n7gf<7&5j5(~kL<`~Q7KKQ9!NZhYfv=en2Jw7@OeQLEsPde>j;Thap-d9Sy?yY|1b8+9i52|--8*!&@UyOuVKK^izDz^ zGmM;gA-k7O2_vA!=y&ou^fiyYqAOy9nat2Fr7vXvgOk_Dqey>*Lub+jbd128u?g{@ zcR6ZMli8i_vqui|hRyT+WRfsOX)@;TzXP44PsT&V^I$+D%5yCHBcv?9Y|dd*g_euq zwdmp*n4sXQB&rFw{KuLT&sEj2(VB^O39pYBc*bTKi|Av$fx^O4bZk zZ;;L0r@sccYhB3c>IU>LFXq$KEW)tPT{9x8R2bdn64Wv2g2{s2OH#|vpx4OA=5)UT zbloTW9R8vU>YtHbblKX2b?TEjH6ABn?fT;N&{!c@k$P_Vg7FZ{v1a$s&sf5`Z)_YB1u4kBhr~fr-!jkCfltg%(jU8HEoEu#hHi z9=Un|W`=W__CjtE^ttBje_an&$Cge;{H=zmPgE3A#CKsu$l)l<@N-xRyh1`0od8qL zQWaL-il}-)xw`$x8frH;EYn=ufrYQZN&#Y9(A@W=>ayMdbXV9u?pZs43NNqUdnSJm zrfg~3JMFZfDbq5~y)FY99U!P)zy;wKGsAaP{h;=zpaoohjmnx7sSJ7ApiH+lf;CMJ z3Xc&JUwrfeM(Aj|Ym04A&)&3sck=It%?` zn);WQ<)KeMqQ_`S5RKWddkEPML9V9UK(_NHH1FVy};}3JS(*7+%UwC@oEU6Je zv`0qBlOw1}d+(&|+Xv7U;xSR&C;+Y2e0I|~0RkI3h_y#|pyp19yHea76iF4=if?eC zf^g!Gj4Gy3cRG*j$^$cK-#EWl-j#rQUb(ItF7cpNmk!bos;sbN%NQ~fB!F6^QmP#& z{GgzaT+XYzA9cy?cc^H+g7#^R(qR5aFt}qJ*>=_nO8#8CI4&dvy@tBIwni)Hox(5v z7XhKDDE#V)1cHATTp;pHReTHGmJiH$E*^#6@|V_znWShalRd-lK{{&Pr~7iyKo82* zG}H`V8KTCbbFpiRjcA%tST>fO1~uK!=W2f#0gbk)Re{xdkn%j&isjc4XwRV*sTGMq zdY|(c!+CF`TGEuJ6P;|ZIL=#sEI%CDo{leEo7Y3NCogi=Ywe-pSheE)zDp?IGrcn^ zr350QFRlo1wxz>cQ~+Yir7pVm;(f{ZXoD+yzCaCLMfVCkjQfC#jPJGoX!KI&Pqhz)MNJ z_pa=E&>-@m8wn0UOY(|xOM4uutSb_*E|f#*dAd)xll`G^ohoof>IWpx6kNZk^&0A~ z3zBMzDxeylDvJicWmJRg+r89`pzXMy(VXosRG4-#QJjhrI&a)E^Y4&D!+eDyWTLyM z(|Eeh`nCXS-t2Q26W>J%?RgEkbmmq=K_$vnPnPY!^agd_dC_e(pb9fae0@6_ z8K|+CC?nS9C~9$tC!z|rfnuwTzqBxNT-sdbbTp^CI*~i{{AaRm#O5>-P(77j2Y^uMnA8@V6e@5RWBNp z7;e2pazPtXpFE=BcUnhPC-)pzlqgX}WOdPsF(tGn+;ymabq}f&XX$@U{ekhgM=#c% z=)h|Azq0#G%+TiljD~$75KUx;T$_{`MU&hYU;Q1+h8~GYw|hHgFs{C4bd}>F47hv2 zc?EwMur1vc@=1j0Q;rG;N}6Hm74gL%_er2gWu0U9$7SfL9%ssNdyZOWPdEKlJOm*j zo;}`EqA)_=(4A#r0v$g39&vr=VF4_k37DUSGI^svV*Y8Uf5&peuc`@3f*_08+zx)) z)t>0n+=mSArSsh~Z2+&6!wTn{VA<2~rc8D{jOaaFNSQW(@gP&xlZWhKRB^cEgE1qd z{l5OT@Y63C5!jT!TXqZDO5OYo=?=i4Z<*qSo6Rs$xpg4JECCjC^EEXX9N?GvXaDN` zQB-y8XPxN*23X&aY`W@13d=is-^XT#pw)23i!^r!wxc{9_`7{zXFcMrn}Z?jIN4rk zx;F!>Zyl~H_Zpz4Yl=#F`#H$Pv|jy>HiiYyw?}pFu)`!DG0bRY>-aA=!>sR|wYYRW%>2Fa<%69+VIHncL;2HZ>Aqm)s`PZdyWq`Ukk0qcI zFBl>TeKnBs99qgFd8;|MVEoRBtyz-q(7=~Ft(?q?+P=CCavunQ(QiiH*?EdE9@|x7 z^_C9$iWC~<|VS#t@JeI0_n+R%K*?blYyW0?J*o8{BC0|S>weqNoQfo>Av_M>wLVL-1x-mhC4+CNg4 z?M^GfD&M3vkAM!08k@a5UvU_^J|*?|M%;q_es%IayC<;ha_Fbn$~26A?9g`CbcFmy zQirpId2#hH*B6gSBd8!P_ovHw06FtlvB-p)PL&FTj__EX!x(n!>3Ud zs7Os>l+L9F)*Qx67x>g+*jeV8E_WP^NB%ZPpIo4?;=RVlZ_NM2Q4-@bUT0KbGA&i@ z$$`_Ts@Hw-@!d&C)A&QLG7GrQLSCnAP@w0Cj*YN+~fr;-*Z4C+&|jtfQAHpbMn10GIsH5Zs>|Oj ziXU=@ZmX`Kp|>%Rlv^!9FWm!u!#90%_fJDR-^KMCa)PklZg{P){uumg5@4 zj}t1czky~6hnysDa_CF1t%-=g0b}pI-rQ?5fcZbEe|(4Dz$O=-y`Gr>n^84)f2+*H zy0FeWLkB-tSCjJ@{4fji!|?)FbsE6G^%mRxS0d1^?yM8gKnaxthlk zP0Hk7L$Z2krXrcsj8X_jhHtnxseDHxLn=A*Wq;9*cSup0SO=Qh`nW~A9F1nq=wC6K zT|tXCiwze}ub^2+-+x!QGg0GpXWzTyuVIdSvPrj*9CbXR5#bDc0Bv4Pj92`x5ccM4 z$@$F%XyuVcx}>Nv>Uj1?OEBv_N;WjrBpEY@rf=vaeYn%Pda;Y}zdB*&B+13PY zaQeM|y|02+)$_}C2XbJ9ntWw^GMZ2y^-;WcBn%zwtgGN_p=Y!CG!G4;H1JlY6I!zraOj&xwe~P zY5%?5Ff>Mu7Y?+_K+nm(7z5*d)JtAf!RgP4g0@`0n-cO@Z;XOX#(ALK?YQ7vrUlxG z4;2$)AA|m2p2d@?MhL6wIW#zVK&sE9yq}JlXz~X?FMXg6YLd5qyrT3K)g+8O6-m2< zM#&O+Yz``*aVFVhmPW#!v^4VUK|=;Cxt7kaK9xc(@@4z6|K6Y`=CPE*Q$Nu}vSF*% z&`JkLeK%la_jDJnUNNeTJf&Bf@sA2T$>oB z2#j4O;rdDb5GJm3%*5TVL-R&vZ-zFN5YPlzOddRj!d;L4nsQKvS#xF9z~BiqB4~8n zVj~KAjlT0KQ|zF|Q*G4NmpIY0>T4(Zxu&80Vu#_OQh6Awj=H=+kpzwW-~0|fB1W@M zvd%{QG)7rJD@|fD^g>EAn88fZ<+HC-|D|$lTn#T=hx=vXq(}of1sYV$ERIO_%Fvg*Lxgj_)?wW3!O? zCiDXRIkwQn6)1_8vdjZ{?Yd!rgI;lu!wpTJe!lXPLLE()m%E>w*g*3YD$-3S7ypaX zGXJJ^S4PmJ_>GPEt9Ma<%jRW#B?8pdhmZ+W7{%XG33Dnv}G83d^i<(V$u2zygLo<_ezMaXVXhrJqsT#^> zFzPkmE;(9>T6uPu&PF9c&d&Vf65I!sM;Pf3i~lI_QZ8noc?GnOj<4UAb;wHIA@jEPGs z_%{w$!-noVnV)l$u&Q_eTtQ+g>QyvwZapH0Ce3oT^<@3fcvL0D!Ej;dbo`aw`ilr= zD$=@`4?chejaT`Btgm7A`uI*y`~XbXY&1W9w*xJ0JHIG14bTie2Ndze2qf2+T<)r& zRVQ~=iCSXR$aiR*uZR`465hKsiMW>0aTxu@(_ zw;8vf+pEvV{eud0-zR@wpivAfaY-6&2BFX*=p*#In-e;w_U~Jri-)mfXVs&rsnE)5 zL2}6NEQ}JpcqDiv4T=MF7xErD!f4UOIx~UmkS_3cORe)ejQ77t8LBse_NyxVtUswx zWZT_ttNSNmh1`8gU^5HaqnRGXQ8hw>;QsL_{1~!1BgTelKSBrTUs?bA`_QD{BR=}W z9|qA=Hq~qAplid4+&_|y<`EbGmx_i}Adjnfx#Fbawl0_N{-dXFb zQS!q0ZM9dIR@44ThR`c9d;n3MWmomoO1taw$ozl_8(AD=i zY@XnUoz0$J{S`tmE?c;Iekl${)fIPtY{GEN+0nNz!lD0g zUPvGBN$7tw+9qYHh|0o;#!O%4!SvjZTYGhXV6>pf=WY-a!5^~zUboJI4xF)Br5O*a zfjl>_bq&LsxJ4O>*ag)8o2f29nFPRfk#&? za#o?`PU08hku4Y&xb?*QQwelmp<7nEX8>tW9bQd+-h!ELA=|d!HlS_VN)X8Sp=%-Y z&W@}nw8(OM%BSf-8=iepp?DCgJr>X1TNFk4S$1TUtBfaCa(8pLuwGa zAxwKHi4sPM|NdP4sQ@EQS^h$eW-!{*%RA=t2D(>LO_sXNVZ`JTi|X<`3=dfsWMvsZ zXHQ>cN7xVyPoFsPD~lY)=QE}fek8+!bj{KWtAB)jqxF=fm;&@KtWWIhlRn!vnS&$tieoQx03l?p=?|M>)ifm&xfGQN~a8s8!7fXg#NP@0zz2ok8ExdM(D_tHQZDN*%w6)?TJ0EvSns#THiQJBKb3LH*2frnzcZ|J z-D-rfOCnzRr9&{PIs2NEXaFXjTi!k^YYLSwgB}vgyn|+?56#?5!qDS>o+V`AEVO?= zu7f`YLKpKg(S2M7Jy{}suJM1NRaIHZrFIX7f0tA7_7}jASBAHOWgv{7vrriRN|-<0 zzuMnw@%%4N#&P{vp74Y+QEIhYtsBt(51|I08K`p6QQ9~=0o|8Qll}FhfsU}pIe|7w zFes*$Wp_~if3Rt)^_2**3`{44++4Yv0c}?vy|-!6feFV;p$FQRq5V;Y_fjeYER4Nj zELe_#Z$2EHRngwi&3vNj#%&fDq#Ji zaaetNs-614AdKvpC0Q}ths6t_@nQuM&_*1Z^VAFKt2V!;)R@!ybFWQUvWb}zg>i`eQtH-cjC}f?5mr4pB6eEYW$pHn1!xo zzcSW~eXu~2r_0Ut6e3F1{^XIf!;F+(t1|glXx|rH*_w+*j~3n_g5q6 z93t!D^=yKf1~uzvC)A*`s-?zgG5|WIB_Abx=0{a`cuSn24>}ZdEO_+Vp*4KdhmNHN z29k0$LsKJBd?pX+>RmoGEy5TfdWIBM1zCPq6OEv5rbi?~ysoI4x<<)v+6=01Y~9^D z(uUeZo#*IfHlTO6c#4y^4$XQLQsr(&z{tYvC6~NKu%A92uNl7p+U?a1@4 zw&E8kcOg{s-R^f(y?*et4~~MN;`39ng)gB|U4cXXv?=OYI~cBZmKU{tSdcTbV}i=# z*BfG1hoD`4^YX1<8Bj~2?w|+O(3*ugvkvV-`}K{AlP`-P!%)mEH75XC71Cq9Z?K{^ zeqyTLLIJ20x0^URbpSFy9rijFxC?FNQa9$qSD~LWNK$t^4vh!tIZKEQqE5a)nUW5+ z2=eaVIHIc$)kQw(J?bM+Z7}mt-}EK4pPu5mRW#{HcW|)yqSP(NNfpR)3hos9wke~K0cl?G1%CoCW z&=qKhiG+C8*Og{4^TF@iooDya`2K_P9-&qkw<+RaCrO4;aj9Vo=g-g{c(yL6%NA-W zj=%lP_zC%OjE`nqTY~;L#c-7(1Ow5I3(*m!sIgGX!^Yw;Bv^i>F(`0{OyaQ>)j4(; zUDaehm}`hiR>NA73bvqiDqu>*U=;O7HGdzB%0@k^E;?D%mM{`X;m+|$9koK@zO>9f z6x?V@y=kWoS#>F3sV?Pq#DiB=Om!~_VRnKi@4e zCH;G-b>tPL{{a~YJ{VlhF!=zwbE4bxjW(cCySyuw<34nqcrtXnQWvGZB0Z&~YzB$R zp(d0ENKwrmXQW5GFsdAU-CZ3c3>_+iX%-yYkbCp4)qIFBs(;0g<*qHDwx?r9G=DUp z5fVnGCMI=M691}yW$GNHx0nj=hQ2|gi^m>(d|H4q-UfhtOcS)7)8GF&%SiA~pZS^G zE@%^fA9Xa>1p31+g_e-MgZ{KP%A^XWXns8YSov@c8e{x0-eqtc^{@St=AU6fWxj`w zPgF%f+B;`u8MQH#bnI9K_t($pt=gGeH#%;k?xVxDy5#pzX-%&&Nsk6ftfH@oY0-n` zR#jWqOJ&gc{7>C$T?y3KcC*!RNEMBiU0b7LUxkJ}&wnZ3%u%@pe}xe3BWUM;HnpE} z8#*HIDn4g?jizBXE`8Jt1yMPtC@(8RtM%(vXXb~fwDe-g>=R9t9*}G4rJs!Q3(0?P z7`Q;E+s)R<&{pUTp*G%`6NH}p`J!7F4N!lQPjl1dIE4Qx)o^ZlLgR#TRu01oR4~`t zJ+9+N%9|JU8_bCQe}o(lE%y`0FQ5@}>)j5gSMVa`X`XtcC1k&vzV8)E1Kr;v{|>T9 zqqc)dW#2#BK(6CE+B0vT{=bOEuXJv4L~fyM3M*#G^kQ-^t2h^2C?oSl$i6+CUMWYXr!QP)-j{5P z)Oyh4ndrrSCJB`dF$!D|qKC=;D`%;nN z_qP|Cpq_K4PZyns(MNd<%`ul?BH4&+F3FQH&p8QZ=$XM#gDhV9+yi5R_lhW2-@%ZU zzl779Vi-8S@AAjxIW&jbKW}@d09~lBn5NPQriA4+l#DW=QP1f?)Oa^^oPKI|fw2dM z!zzW(5b`_NGP0|D|07f>Fmr7%5qvh*WXAC(C#)1?1vU4dgmtRAHnPjyu)1YD`;m(l z<|-K|$2_W`_d=aX%*sLNO)HHNJ~$4gJxn*)Um=LD8E3O;A?)L^7X<>hHdl~DU$zVZ>Oz4Dws zh0zz5d0tY#oePAus*6&L>jzO~Qt^_&@M%b^0n)=-W3Y0NP6G4x!5oABPm5ojFi*E~ z<$i1{3^^tFTQ(07_LGux>6BrxcGIL<-R=jf9x9+--fDpLGsFL=&-cKbjWLO@Z#FF9 z5r_Mo8PM%sQs}K6M402Y7p&#hVXm``Gxe7fEV(YO+YG;hk&`3mMxwvNK={pa7U?k< zje2)aHP8e$h!;$x=O4fjL%~4*tUAn1*lg?nWq{k%Px|lL>cNl=uZp)fEsUWC?`__9 zsJLt4IOx5DX%$UG@A?ipuXE>qj4=4m-&6fA?jM1uIC~|u{~r28D=s@LjicoEo>3_W z3G<1`UVP|RMp!(k64d)M2By=xANpte!SY}KsTXGMVt)XZw%;U2PmOu!&S%Wf;42Q z#JDWFYCuHC?Bro>ItU6)xY^G^=<|0LXvrq8pm|$q#+!pgu=LQyRr~uE6mtm?J?G$u zHH}(d|1Y&LvU;g7``sg$t?q0KHC=#34j18>PbZPj;^vJvihZb6JUWN&Fex-eQd+CM z+=nsFTN06D+|a|zD$;SE4$7aY=69;H!i@j{4xSEHetoRpQ&1j0@`J5 zj()Ye3d?gf$4sg|Lz4>y?a;fcP&39J@cip%m@iH4KVL}+zdPw_&?3#$#`W+WOy-6h zb=uH}*5_iHOWcrfE7FG2`@h!G9^OTmhEv*?mKw&l zRoxBMcc3ppCF+wwG_)o1R4iRrgpN12Hku>}`y@q+-<4CtFqAy#?o)pX#*W&=n#vhL zK?fCoqU={F^%^iZuR{XMS{$-r*`Lt>hgHe?y-mWtm>m1D#Tt5#`OX>iUV`y&{JUN> zVKB0JFLz)x8)m%GkVs!L?0hwr{Z0`_@DnuIRO8#^mBk9!ftix$;}b7JlD12>eA>hsK)8rp$&F(A3b- z?eZ75q3>;d&UdwgXw<>)T0Zk1=#hej*PPTSbS>tF1zin{g;)owxgJ1+S^WEY=Rcqk zd%AC8X~bx1zJ%go|68cirtjYQP7S34Kfm^H`=aWP$^k+aOW+#%#O`<9Z8TY}?Xcop z2BUAE(_CBXL~~?Ar1#r8p}gm%{8uVt=+?de@mHJ%%uqh>x1c!;bHT&O+wb1N8ZVnQ zJ6AN61v$#@U%!AF$&yy?{Aq(~c^S{}LK>8CON{Pgrv@q}pZXRra0~UWo3y`PeT>pL ztCdpTeSz+v@0Yz>-B7M)h2JpQD&$=){GMZV8P)PX8#>h#3HYaOk;AQFG(v1rr{{Se ztyNSG3+B*3+mP+xZ^0bYZb$RT|E3G_Xbow(eq;u1hj3hR_&EWw#Krl`&-J0}$X$}s z_%_ti+0Yh{R0I{bx0QEqg%SEsv!@Jc4zwFv)0q8`MVsAn7eDfBK_hd>>G%(2Fc#}( z`Qi)-YGrz=!O2wzpUNI3zA|q?Q_1D#PuXi>s$e$Yuu{+(LL)D2! zy)?yEC+DFjcb`~^>I&p3%;(&WzX0FQB;30?v;;LZVT|Km7trj3H0#au52z}!eXKUm z9^!a+Gj7SBK-ugsgthD^Q1-Pc3jIVjXd%(xw>IWQv&(;3#D(6YjWgy48pxN>bh?(r zrHi)E+FI4Y_$>jgr%~Ox^Sm03F)26w@P3UNCuN?oKTLp16Y=8v4r0)FE53S2`!{+Q zN_vVrfDuLps1gYrMuSX}FGA^iQNQies_(IK(9Mu7n7*9@W9PT;79CtiT~}G`tBp%h zRPvQ$8WW_D&MCH|W1o&1RMgh2mF7{$rt*ID$pcXF=yBKtJcn_E9*y`*foLr1SF?s0 zCt(hFJA1%g5v{vU^fzwBLgHHG&Fk-vp;bA)XEBTgu$26eIc>fAnG#T zfBTH6M>v027j8nY?N9Eg>C-UAS|8GI<|xF=JZCy}dIxHw6ko4k z^ju`KIjGP*cvt)5S4hYy<7U^(L!!kosvrrFkrT3iQmvh&uU znDx}#GiKqaoz*r~Sc3+&8$G4oN%e&~<^CydDM7+K zE;N7h)*PCaCYCtoMh&x$N|G|2VK99-;9aiB;s4^iYNtlkoe`A(+b`tR9zqiW4Z;a0 z-63mNvFv)hD(Zf~^(I6x21cz+7@6ig(28#7_V1v`|G^nH#Ze)i6;wb`V;7Z{ih@Pi zhGnD}p-h#t`AN(Y>L*_bEazY#>{~QN{!dOodQnzk*rj}k{d()$otXFF7B42ctnnDN zY0wIshf4su9!B(Kc4$KGhY}9rL^&3tURL_ugiY8wRN86rr1u8U=ARF49+>GWmh_wFg=|lTC;~vMIBv|yaT>5gd0QC(MMHJ>(qGryUIZ{%G zQ2VZtbfxSZO3$MX-YDQg$^2&-zm#>M*^B0HrK46LdFA_kTBRabu*sJcxHSVC!bE+- zCpV!>>?hq$4m$Pcq)gQA3>{E*a%JIii+zj(i<|9aOWO zWK^e+ghujxXT=m^!A}J@eaf>(<8k@f6W6OyMYz=XJla5QUf!b8Ba|q=Po`=yVF}Ig zua0{MGoa@8D!ukvKhc0MwWqHtIhqI(HYoRALao_}dJotp(A2#rPxp_`qHf!?Z*A;X zQG*V*-3N;*RA#hup($n`4cC9P_>dQmT098*C^>E5sHEBtr zt{e`fXKI?LgZZlS(HT9%CvuJ^VE$MwM9DkN>~k|wt>ZWHK%-`wNXEf z_pco4)19TBoEd=53&$@&&|_4_#`_NN*SY4lIIVkT7IDJ>j#Y#tv{pc#7ir!^~I>)?BRu~$NXrNY{BDzUlJPAvQ!X{ z>p>HB5n?;CbW7BsPUkwUV;8x2wshnEnKqoG$Xl%F2Dg=!BjnvRekMD^R% zea9wbpt6-ZDEH=RXna#niboYt#h=q!Z(i0z_2<#k=bl$Wra=mO-uK67{8IaseA_MP zU~osz-yB67n6Ai>r#Q3`dT(wZ8-UQ`* zl?$3?zmQVrOo_&#S45^cxzNaK_3wp!wWwE|*HN)#6fLNTCA$)M-+qbPPL)3t4ZCes zyxng?-N#;jGhj|dc>3?r+l(!!baSEIpuie%rB~Y76C-FUI?VPM-x)Mqv$V!?&tE ztFO$msK##7`8>r#G*QOpC_F=g#$8Lh>GnI&kp66_;nNZ{zLg}37U%zqV+Em{ChKaD zwsej)wH~7uu9;UcjP!*3t<;xaen#-&;kuQoDO7O(%QyNUU)25k({}ze_y6Do?Z3DW zz5Xbh`p-F~FA1ov-!oMGOd1-CcM5qq@eg8bl*}&YaiceHXk6a09!BjNhVp{E8mL3M zUf}P?HqfQ^{xbtocl^GUeWukUMo=CmPwzN~lx zN?k+k=jr?RPuxH`ML!GNZqJ~RtRIuS&uUOxI0}n>dl4-QG~77+jSQ`*hU=c!m`5v) ze{3bGPoqluFQWQl6sVH)d-$bqZd3TSk{w8Q;bUG5y7U=uyjkp>ggz|R^4IWUMK)BZ<0^kEBvVE(=pO` zEQktbjidkaEkWdryR{cPLN!}?$5kF2K%*&KqUULTpwX&u0phMtXlhhV*)zcjRlP2C zNfOXN-?m)Vzqaf^<>2_|5wRIasQrb>1@FPolEp#Cs<+VC#u=^5rH7h^^tGmu2f|{- zr9^Q?sQ-2*k;wN&R9ZMK_0u#TRS5jp^BCuXd~abZgDf}Hs=M`q=(jA&IBD24dV~yR zrQY-xWxRn};*@vUy)Hx7bH^H&FRDSM)xV_ z1X?ln$&jic@G;W1`D3gaYB9L^JZwq?wOjmjC%H=CS^KDf+RSUnsU$l+$Mh9CD+3zi z1?Qknrt|{Y2pyC~hMo&C--98qm9uWR3zi1%4_=jLg&yOM*XK*_!w@&W%j_{r=qP?y zf7!1edQwz05)|J;_1(ywbfQ9(+PSM&`A`#er(d7tH<^PrWqLJ>Bn&;?M|_&!8bbGI zQmuTbGqk=_>WrSwfzCVX?4>v9pp|ckio#6~+N?6@CGz$G`Z!}E%GzM$R4B8xMk0(G z%e>3d(S-$*xpUfL=V59gsVToy4@Mea-4+z2g279^#VzaSp-)tz;7q>;G~3xJhS@qp z(`2qLtJrs_o6*<(NHd0Vh)DbnA0&mW4_Tw+Uo2qA`&!7@UKI(fb zi!f;={jny&8=gflZpE6rz%Wlw6s1)>bpBH6&alvg(gq4AP2CI_rsQd`%$z_o4CBnL zB|fNo$ZB#~Djf}7Pu%B86hV`j|Jt6LN}^6CcXuI`7BqCCs*v{YAgUPBd=~gX0me&N z*<(WIp_fPehI`x+jIp_C>}z!Ua7y>1X|jX4Flv4K=2&RqIIyc2z6_li zR(yjpj?j@*rxkSMI?T1(aM<)pz`T^g1#v?ssQg9a`rBj-dgi^iPV8*KI6IYnv}HO> zG(2yaUhaXJ6OYbP@xFqIvFAF9M_)l_Z58c^!#EUP+<(qSS`E>KFJId%Z9vCQ&DV#H zltG^Qs_!kwb;4X*#8>&j2X*v*|8@Cj8&vQQe7`I1hn{6=-*k_sCHTtCT-8ig?-YXmew9=#>_)U%5ld>M`d8}+j`Pb)@@Wt#@ttXU>Oa1 z2aEJSB1XlUF%W(9I+|O2A@+c78@0Wf|uwoO5N=sa0}4=9GwPg48RqfIlkaDZ5bRFA5Lz@-KGL#r^+? z5}9gSmVfm@M{Q}yig_nYScXhKx>fd{--l_qcASHDDKSs0k#|rZ^w_O>U>6#X8}Sn1VWFps;=(41JLTR zFKIxrj>;&xmHErG3H_izye~iw4U!gyav4`ay=)ub>lba1e`~ZSKK?kW|J5i{*wT*b z%+oke#QuVAqW&#+3rpxWE$=r!(+lN)obiViVrc)Byz$ZQ5lXi_7G`Kxgz6j39++=N zL6yukF}7EO2(F14q#TPw9s8b%d9ll=w1aEF#9a<`{OSvO`N#*wd@=pI)El3F50%=D(ox6~kw)-;bfPmiXJx8#OR=g8yi`c{Lggq>o?ae1!79mp++JEkpUm zJ6drEqTn)*?~>{82jrwk%;Mu7|6K%Dj@`Yv)olo@Ghk+O6-TCuQV)Y2BIr_1Qe5?wM ztd&j}A2vb@oQ}`FDw?2WaibdxYes0!miLb){Uww|7Uvcx8j9-j9{jzObqRHhelJma zo`I$-n5#QiI8X_FP?y4?Y1C7m;)07=QEi2biT2r2R1G<2yy&CRVCPRg{iZfFt4S(G zp3H>$`bVPae4!)7w<6Y?AW)pFHI~m&6h$(3KcNpz>#TMExq@%U3;%8=S@=<5= z{$?cUdlYG`^z?^~I(jbuWb8GwI`SPoYj;{u62^pz*SnpkP-piWuI;QD$Vi!svX^@S zP#h>G2E5wx(hvSSB~V9*1$;6&0A9v@@V8^_-8L`IaEU_ zH$OKo4VCBhZtig$s%&kBy)eHC+l* z#=j6f*eGCRcN8sG2YJrkh(^N(O#2b)H7N7^n|vSo2WXmMv$x&!C*(zrGAiARgElQP z2Woy}w7}}*c!u)|8k;+4YC2<%R&8(2sI|XAi-P7MB#)ZWd{3|chtCD5!0vBtcq%RQ z(GTsc`}0EquTFb*E(FCAr8fnE&koTwS>mI)zoqdhoH=HRoqf^ zAI(v4+_xFJhj8=v-%&Uk&7Qtm^cbB*t%s?8n$*8Q#l8WWE&LDAplF}tgf2arQ4Px| zH55mc%Z@jNDUPG8R$|rGDq$#;tao4br-jmk6$jIE=1}*oXRI$b54VrZ*2A^g&j~?o}F8Ay$*d4OS*GjmKx34T)Xz?x-g7Opu?+F`Usa? zed(1e3GL6ww!X*Sf$F0tea~HUN3~tyabLdXpz+;Ue)AG0G!ha^`FTMP_3k_n@LkeH z?N)6`w`hvdB<}~^Ix!bivhZTPF(?CSXJ6}{O}701$oT7^sNOgJA14F_5fKClkrqM3 zLTN8jLIDK~R1ic(rLh2MQ0Wk)K|s2@;ifxwm+oDBse|B~I;K>Y%C_N>*nAk-jlTyEGB&H7w8=HVFtb7^u0P8*3Zky7Nl zIPDI*tH(XdGLxV`hE?gxyJ0lV;t|xF>5giTGfvEj6(a0K=CmA}JJ1=MOG7EcjYfim zaC8r}5O%1fy!IG3%55;O=OvCnBVVo39W>TqJ*e}d^rSFqIHOMbOt1+mCk>Vth>f7B zR^IgB=|@X)rZ~iFQ0bhH#b)X>#+OsA|tzzGv0| zHAR1Z+3?^E!eD~S#aqSWp(;fG|U{Dh=yQa|7VpOl*`$P3_Ix6^blRkRW8!i2N zFBUAhhic`v=8r#nhWb9XWvbfApfvZ~__abySP$38xI^;|&AZZCoH#y<#+(H1Invpn zWn;%R4kUsWMKc1D{t%-Bx8~w+9p@n5c%0rgiyJL8p4zysMuhNujQ>g}V^LRB!TrWP ze>DB5GkwqT37U*!*D;q=fI2sI?nW0QG(1vZx5VF$YCEL96TAY@%tf3;T$dE!{$(3v zP4J?zZYNnAMKQpR6E2U0K0=#K?s)BQwy1x#lef~w8s(knSkVz%L*uuvEf+hwK@Up= zsrN%)Sm89QI5x5aO|j2<%VlJwNdLBz_W66ka{Is99=9whk_l146Qf)xlTo$@esdu_ zWw7g`vaP$w5ZmPp4#=~WtcYeH`IDK z4pDjdcRXJMP{S%-78_{>8_x_B$T;4?kcrjlZwEyPt70QMZ<&JHgfUvapI)J{Y!%|X z)-5zs{yCS*vlL;kdj8(NV~JLTBX^E5AE1F_qbKwWAEO?Zy0c;%FQAJ*ipsjqAMj#S z#@=sDV3I583ytOrRDOqxo^&J_CbAo)s05V}emXc`@{|PXykE-0SvH4S{J*vwD`iHh zb2%4IUd=tKd+#4+Oju~ASg5CHD@9c_wx^9R9!FU=Jl9AL!_jECY5l<&VKmIf@LP_O z`#<(v*Acc=E<+U@q92uazQRg1Lx9V1fJyRsEpa0fG|nhTzH$+VTEEklk?Z6^Vwsxx z)1Zt0!*KqN^Ic_lG&tT zc=}kY_7s|xdzg*#C}E7xKkkXHD2lF=yhml+i4r@{wpadChk?VMgvXqAD97j`5rexF z3d0ty%wajv1R>(s<0wb8vW))}J;aU{>{C_lym}0as)AXmK_ZZtKktDzx&-lzW7lZT zE~CLdt)=t2o#04fEwgZI8oJXb%dbo)!*qD=MTge+2pb*Xu5^(Jg3tbDD75c{Zp-yg zb`c-Yi~^=*{6{WyJQsDdv!g?pytglzbhClLV0r_ubsu#vI+`TXUZUkK;aT&vIT%}F$@TpG5+*;4eRONjg;I{c5>pqRBg}8Wa2)2LIXmq}8uN4% z&!x_Bd!-ZJ?g^jMHX(wV7q`SAO$Tlv!x)LAdgJ=s^yeJC~E*YN7=y>GlVL z6=+sD*eucB2!@xLzej59z!Wxq8IIFHPw!3zw}Tv70-`$Qf4XQk@#OZ{{uHeIm3-k= z_W|{%t@VrU-$c{8#WxN0n4#T6R6?h&08pNJ2=(z-Fv#&SOP_aR6{A=dyilLED0mLeAK-GxoCdIv!jJF z3QaU^{Jmi0h6obEmmOt|&`d${8w=+-=;ZB?v#8jC{vh2yUg3wR8QIcnth6I+k$2Ul z;Wy|H{iTpQG@+0YNLvA23_9*k1n^AtqU;1+U$1y_=x+XV z?0S$pSYNXfB4W`+Gm`S5?l-1kj4QxpzB?6FnLI4}Yx%lwIP6!P-}+O1_^)YO-lmw_f`~6taEw!pt3V zC4ww?H56Dq%bwk)QkLWN-_HqFYButdWwr?>JE zjXmXJn4qvkjVJ6Y-ff!#j>*=f=tMfC%2ycdJ>W+H3AnD{%u>{4PD6LY`dtyX(pwqu zPS*=q+H1w%smoD`{b#c){HuVK8g*jP5Jlyjd{rhysc1YavUHn$7FulS|30#y2W*|- z?L0idkh{&+FQ-S)sYCrk$+{RS4rh4YIrT#`=gqFH3JqvJDSjNY`5EQDJ;82YT?m!t zi8(?FX)sKhS$=Fn7zp|WA6G~{QKpyXehhk!IwLODo*w8%#nyQh(+)Ezz>Q{4P`wl7 zMloyAE(!m~($=axpAGAye8k~eKN|?$Y`S#!1gN0Hq58v}l6TNlKwwKc{DC@!WcLdM zYr!XbX85H~p<=`B;= zu_Bn_nsj{@#vkfQD%XGpC*!T-_SyL*Zy%v?m=j7 zxwLBRN(~cMs+bu&cQiy+hB=W>3T5htDq*iwphn+L&RT#o_46{pE=$0SIcHk;VIa!r#;?|k<= zh5n+?QU31G^T+b@D2h)Tdp%$e^<}v{bbc)a6I^7xH)weff&Go~^WJdi_MyQ92Tg#b zH!5u4dk57oqnHQ%H~?FvfRog|4Jq_QLI)u|V8>~~^rUAQiV9kn6nv?mb}#Y5Ugs&) zkV>y^ct;m}Zy1+Pm;6H5KR;5RNU}gtI#HZn5)N{7f08}p`vVP~SMO7OzJR*FyT{W? zJwnkbJs#wrx1f__!6PGh3H8e>Z5Oe5pjmGJF|z)0sG=+_k-*wO{S!|^CW--+sU+l( zkn|7b3XnP7k+4C@gT)^iu4E&^p}ULu?m8?O-zd#kCxh0SuwzSKOrhLS#Fa{p0K**7 zSNl$1N4>G4f@i&^U~=zl<-3|)C?RNf2-=JwCr7KaYT`mvA%fX6RIElr{rkj0nH*>& z#HK)ak`(HRMna`ulb{$*HboSRg(P7`wz!}E5U+QPUZPC_jdnWv%iYO=$r@uS^Vqv+ zIVK|eVd8JJ$bHp8e%2c;Yf^M9$CRPblCi3J5`UQL=~yDkxrxd(1#CvzacDO7Tj;$| zT{PYOX{79eBvg2Fo!Q!dkMKWt9ZnIB=F?pb|MAcu7+xI6$?RH$numHft$XT_RpMSt ziTr)Yk)3|aGExE^Xl8dvZWR%7pT!)T%Y~8#j^Zv11LXZOQg9f_L%mlmh?W1{gI1@Z z#XIkpV3hpONVO~+HUCK{EWUpMHRO;>=2+38A%%&yOeIECX2VY3g#YMiq1W2Gy47XfixF+VI69nw|7&o49-f>{=NK97PUj zfc*IPX%#o929BqGm&2ic)jVbymkROx!@lnCIiSE#;2pD4DYOW_G>fwnL%rcfoZ{K! zsJ28qL{FMjdUKY3S{ zkf%deqmJxarZDQb>6qg0u?=`tGPJ*>6=@;T`HV(!$=>=tCV8%DG=nVo?8lki9t! z!cg4vVvbKb&^S5PRHy5WdY1yh9xDqDL-S5_!5q*-R;J%~NQ_E-ZZQuKpG4imy<)Z% zB4{M{-$AlvAyofTc@_NSD(XmI5Po6$2lbm%6xlU8qM^xuI%!|IpnZgQE-FtBYTaUs zj%xx8mwe@Q{pW@J63Cp(zTu%;!A#--%tKfWi~D$55%k(tPBS{>qwZ&h$CzGtqK1z* zU4w}BP<2Uoxa!|TgdJjQnk?x6+&XL1%2Xqibrdj63UHx;j^>S}K`I#MGnH{@cZ9mt zl(?(E$^T>Kes}ZJ>}=FewemV7^EAp$eYx@sQ-FH@;usRxT~W{J9Ic7!E|hpb$3Hic z4vmgx5{_Nk{eKAoEsizmi^rhzE1QA!G6O1Sam$d13V=A7;&PrxO{nY2=ul498OW&B zo_;8jf^eOqwX~K3fK$73#iQXq%Kw{Z^uTQeRgx_ROD`%ycW=IhZM-hjDeU5wjI5w! z>NA<+k9io~Ci3ka4M+XAY7Q1Y@uI$f?Wi~AIMmBxP|vv=i8{af3+5Y^LT9o$ZHmY` zYOlR?zo9V))fzHiz-8PQq9h3Gq zjZLT!4GhXzIR`bGZxsS#?m_#E?(!8)7nJEJt7v(G40W#=1vM_-LBl&&M5Fv(qS^gA zzE1x^G(8hFJw){cEvP=)Y3(CMxbqym;ylf0ltK=`}G z#vGUAz*BZjz`%AH3RTG?H89GkhbX*HO2iiy4nk!UER+B*<8{KPtq~%aqt55Jx4`&8 zJ=2>m64dva^R=}TAJkR0obG3O1)0Crw)fdCpfQ7XWB)A@G}3wL<;RUN)Iu-HD5!N2 z5tuYv-Yc=gNXZ=`iI0CTf=Qh$22AU9L3e>;Xo@Fs zZ=GlhdPd%-E8UKSZV?iK*(ZP0&bKV1$wY(dn(*rqM|0kjy>77evMm}Th+3QaOI1+1`M+8&YAIB$+mChJaz;~Eu3pbtKhoooAhDCI6lkhs{`U~) zCDh&eGni__9wyxtMs7Ym4vTm8jT_XD!C1^K{DWR2s2Ww@Brr+>-ZZdi9$BH$KO0x# zb)KVf(u-o9!e3DrD#-t!$&CsJ`^`DlUD4wEGNdpXf%=mQ-+J@rBfnUKWv@OFLsH7Iq$QDjaPq3Zc3)YZ;m zs5#D1;*zWeDl~ld_@}rnRD4~My%6&mYAodVHjbI2-)Y`y*vH#Yx%5F|x(0^=ADM2+ zP@h10ky9u0>e*r1YN<)1zz+P1o~Z=oJUCkCgV#Fy(O}K!+3m^4j&Sk3OVpx4C`0Jj zX0L`XbP0FWJ7!U!%Cp(e?0P6sbF}+g{VQi7!Bv?mjqnR)QA}+{8y>A=-OblLp*Dam zifM28>kd=3ZOVg-c+`LXLXRYt3iX)1KN^95&>Y{?Irq<}&7po)M>5>gfIG@`~azq)*-DBqJ|J*l^2<#K;o}b1pILCHz92 zYG-xvKX9n+iR>t4ycJYr$VX_roP^TJL*lhRMyO}xQ513QHkw%x-4~fFM);xz0fl=j zXhZ)uC+;f~TE3@mna3%OR&15z&gJE!3657KwCi(-AXtP&hx`bCn|;?<%m?x-9?CDe z{zL==;U$mKU4+xco_P}V7)=@qxH+!&B0R5Ip~1NnsCe3U2Y>e+8qE*w6qpV~%|<*f z#G(z5kb*a+?D>GYPxgKC8Bu_mD`SOWlBZC|y*pN9#ibCH_HS{|MhKFF1C4d!Ls884 zvP9#jnyAC)ez@V>A2jyiY|bOLHmI&~amm{nM&&!reoOMTP`gqqRKh(9RbNu`3po1F zgy3J21wsP+5)IJ!mg)kXG;bna-*$pw&9nF3ezHcrFP9%Y)!IX;ls`PDSKmR~eap=p zVk4+lQ+lC&_edw@)24AnV=z8<{{EX0M`#(_lcpCCfu-!}1_Mh5nEt}&@U$ifR$0sw z161c=j53aVNQM>-+|9Nu&3z1n&SCe3%YFY9bhV>gc6VcYwMw1IfT!@fu(N$4|gUQ=+^%=wG0JGvDut?Pl zt)3-kd;n=ZM2*?uM>CxR^>N29qmI&7 ztppcVXd9bTsnUN1GjGYh7rt49uI930!`BqZy-(_M&qObpAuwOR)lCO2Znq;jpW~p` zIAGwcVJ9?LS8qQOHG*wo?&7zXd!@+f4U)vK)Ju{5&4%A8*J1lkAKO+RE3|y}9x>g2 z4TOkX(wixj(BW60)_ngQBr_oU(|=-7>q6c4(={fjx@&)R?sy^U5B~Y6+-n5pqhhV} zj`};=kLsO`a{zQ)t7ElLxr}nfoPux<5}~NQ;oZX62y~jVJURZh4NWx+**`R+ggREr znAW{KgfkY6`#eF4N}CS!v57CBMY>PP?BokHs9fZ%cdHS?cg-KN(fY!G+eQ8Bfl|&o%D&ty52=|@rc$)PjR92F7 zw&#qZ!PDBOjba`j%>zr*F=^5NmoRF*g+KKJP?tD4*$cvvE}u*Jv`8(3Mp?_0`h0az zLq4+lsC)@Vwi<+dRW?y;WUsEqJO|)1^~>cQlVCD;d^|nb4{C^QF(LWuP{&n%quO5% z+@C(Czd9xcn2gfom81O8^Vnj;ax@g8za+$8QOHCi3R47E1tU}=BT)E<*9>*fNDuow zGlCWF>+k2*B_O@~K8(inBHX5Ns3USlG0(nxNR|0Py2stcu&Mhfs{X3GlU*RnT^5xn z|JH??RUUDfly0F!TjR-6*=eZ!r+uStj0i%DByNd(!lUj-C+(*zDiERMQvA7M5`>Fr z$B8TzqS4lWUTYpbsF9_`b#Jf&^}INJHY>CSEqhndJ;;qJ=9!3^Pds>9l-dnZse+#USWmx#uA{NJwJCctoqw%83lV$@FM5%SC+ z1{#%S&N9DM1#FKm$&yM0iYCwB{fC^;7{BAdn0uE1IxOvnoDnZp?Ic86^+vGP}!j81CQCOsGE$ngRi>>!f$!DZ!(Rdxx+V{ zPbl+Hx3XM?9_4cwN(eaXF1LxMX(Y&mX53M+b+lcY+A!*S3?qC((2zv1k^aDe2$iQf`?}njSG%Xh@4MhD{z8Ino zz27=F--)2<3JI#@eJ)hq#c?iEQx)<=WY^_#`%tB{*kAGcZYal5oTQS+4}P3JvGSYc z1{73C>**&S<%(B)63cYSP%xa{@X3J(jc#1Ej!ch2qvsTGs_pks-6|`O-&7U)9Tjir zAwocZKUeWBWy?d-q67t>CjC)e_y`pXQK7&2WAVp#vr%qYW{Xm0ALpVfy&}GDMPa|3x^>Z&tJ`Ybf!FpE-}=0LzhRGk`v*^ zO!ue5C(+=q%GGbt$*AwSf+MNj7OFS<;^5D^j(ThrteX68p($r4aqPPwG;^{vtn~92 zRMFQby&WBbT7tgZ;<*@saM4m7E@#G2qu)+rHL(uDzy9m2VMdE)mzkLzpa3m<@E;rd z3V_23G!{(OqXL#biu|yb$X}UDw&Ou23UYr^Zb(vtu%fR8jha6peAr}-a>aWzmc~jQ zIzWr6XPAkTE6q_)Q+`%9uMcXT=N~!m&56o0E}bIE2u9s}mef-#(hxJvB=gxY6k*oS z{rd=(XgF?{aYXPLnqq0xu>6*cQnKH0cWe)%E{g20%bg-n?II?A%%c|a%-gS~>b?f- zah}o*g>}?GORupLT?qB(GN0b$+eC!MX;Iu?8dM;^(6%J~A(N>TSe{{i)D84Q!|+N0ix$EqdKy=W9?d5Q6<16r(e zA-it-3dK~h=9sBnf?TSYnpp}fRL|Gg#FRFMDgp~dBkqf#rZUc(EjtGYPmW<~eftx& z%5Y^*5DlP);^V1mKF3hAy5WhDBcJ~Nu|1b*U&ZPyDj|d%)98^#4NbQmlzx4S>bWYt zL<`r@=rI%f9ecLO+|v6dlWY!9VFvd2*W>BD5r0mf6=qOr&tV7rhN?Vsp%U zkiLU(LoHNi(i0J0^EO4aG7go@IS#&AvxmGOL(!V@7(@uU{qoO90CZ~}t~=P#p&_Cd z^ln5(&~aBK?6tlV8h`w7m+W3z3RjHQDNFb4H`EAG09(p}udijA1 z4I-4@l##32K%IN!TgLelXaGuy`)!s`osROWe<@#4=78}7%RX_0b9!T3H-8Lu2jFkX z_uHY-RpqS2S(7QpvLN6b%{&{(h@<54xU;+uboAN8@FL`192V=+~fNs+|8O zU@SY`y)N{j*}C!BNk)A%Ic{>x&0d4G!^PRd&~9wq$cV*D`1h7 zyo(y1Wo-B;{D8Vg$F^VjnW7Gk>^$}Uw1>_zS`5tuuumfx=O^Br?Un8AFx-cpOk zb(r*B-z^|q_LAt?b7QDltszrpuMpMebbTW{6GJUNR0J+e5@cjtSdOsFLgQbt;!n7! z&Fr^K0}23 zFz5LXM?T~uC5MLuC-_Bc$Kg%8(QqhcMmhio6~!ghGP6FYj(cVC@t1AL>CmFMP_A*5 zgFUzPRX(H9hvI=T_pYJFTh|#1yl`kVer`N(nFlSMjDGK#HU7?9LB|fP!G1Y5fTeNZ#Z4CSrr;L)odHI9H=!@AJ(amX-*UGhKS^9y!89*~NuP z%A=8xtnyk~b<{IpdL>f#BI^DZp6~&)hw9GYPD%0HMC}wDbj;R$XegwkGLJGAHIiOb zgOy(h=c^HP;))=eYd=jMHTM>3#nPL+hL3y^TNq`Mk{L>_%t>TF>_iyc=Pu<-HK^vD zs;c12V`%y(b0XFG7?k_Y=9bLJDzqn7+fqlCqb#Lx&RJ1jG-ql^Pj^`c&EKkVXV!g- zmZmS}C;8N&g+#C4ZPId39!dK`bU_Cic&K$gr`AT$3Q5vBQE z)M)oKj3R~sjj}&hnDs3~gySc!y}jyyVxNDt{hUk!DUJs``c4*T_V}ep${9vPkfd5r zwfKqfsh8xo@!e4U_-_5o%?{{FJ@H7m{63V-RAq22n4vC}rjy7s(l3TTXZOpU%z8xaze3%RqG zAUO1njzilOD5`sOxA0yps-=?;8pz;B$v(PLmCm$~#ZX(qJJ$nMwhQAjyhnAI`29mL zD--I(2C!*Ktf6S6QT^}zWrR2R=jPy8j;6nE{my3)gRb;kWg~`AH0$0-&6j)$W^Hfm zFgM;u-3B;msZ=$T=VtfIuC5c!%!@F8F>^zHCQlnrVI0tC#oB`r15aq|nQ{O7lzc`;5aZ(6P(## z%B@)S$>{~?y>(7kt3VA#RXWG)uKL50*>}m{C}&t)m2NjfsW2Y=&go+m7vN+k!ba#g zVf9kyQfD)Q`tn9{XRjC-lB7O&MLrCgUjC@vR~ZLveCy)|5ieN&Lfx_*)C*YbvNj`` zF|6-)7?DoDG zikOC}2zSi~GKSFi$d`wAObME#6-dHj)uB@>u}RYB0J_Gm9*^SnhXHSzsK>NMP`gh` z8zS-Zn`dhqMCoF=&48V^GWB4O2%?Um++DOVuYmm)APrp8<{B*W}gIOt<- z?+qZ|p(*_ku|jAVO#OS+GZ8AU-1i--DuCJWH#%EpjW9NFg7K+82~2IONjo+dLAk0) z$G-d;3=jEf`1O4S0^4qqrF10>8$USTo$d>R=PPe61Z2VBq(3+}=tJ#k-gRl~b(GI; zlO$D72YE|Rp1jQ0hn2`Jk%_{5SV?+ytm)Yv3>a!m+P48rGxFSS-4ukDxTy!3$EYDD zFXXb%jYX&t%N5kwA4LK4+sx0&-vHKmc7gWgC&1MfR?uA{hepiMxpSidkaL?fCO7pi z3|M`O+U2W(8Q&8or&_a6@0`@#-fw|0xIg`BVu%^Ge#nh!j8j0*GrfyT8j>(4Il;@B z5&&Jhih)j{Hqi6LbGV=%1Ea&N^I!RNp(gv!4Esp|SdeGT>*$DrCM$*B6dhWa@)^16 z7DNecRvfQ(PcZ<2htYJz2;okErB(UiJn&QHZpFlX- zY4+Z71~si434f{Yhs48QRGy3`fctZmq#>l*qF$abReCI{}aMi3@rQp*?*1K=~O3 z;Ij8;E=7HZ;RL-@E5jxj?$|ahD3*qmbvk8H+o}KIA?t&k>&OsRmf09ZpI!ufDbN0V z4Ha}BBJUkG0`xjw;wn010D@RVG4&xGEE~}o2aR??_0kWpF-5qwf9gN9H#D+xUp zHWxMz10xEWAHv@AOmD>iJao^$@z%APgi+QPqlUiSK;YmLUnaT>^LwJy)IQpPvn^OT zz49J%bQVXHWm{m{TFW3bZy8$1x!u$6)Bx_`MCZ%b0WdOt-l#QT8O8(zBv>O~!N9{> z*&Qtw=uEUMp1UUog!G-im7y`HXN~GIznV3Q@9I41y}^gFM4PMAlB;0-*j}4jp9S<| zoAKp=j4+vebuu<&4*FuvE|8PFgi)*hJD;v@1EGwWk9r^nx_7LF?y3p_LCC)>{L2pD zbscYSJ8UAKus3_wmWdFUcGma!s1&Riz0~n_Zb8lT$D=m~ieV#jIrQSUW|&Pq73*@{ z8%FNO7dlH7qpBqai%Fu>u;l#JWJ&!ObR2#v&-EMxjE=P+%|n0G|7fO9Z~F?A$2xe7 z8a{&|pPuNtsM&ZXrAT&VRtNuA3RMud5(z7j3^9j2Rwzvoz-LfEn} z9@-Hmz&QKzZDdozuw(OC?p8%uDtnNlvegFF&rCfjNM1ojei9QG86Px1z1oxWu?(%S zrM!B&d=_QAv|RHMJONp8iJfH!88FGCy>>Ng8G20=)F0a^K)0>bQ~n`cSb5+4Fqf4W z3MMMsL&szQdyk^<_Q_;O5H;N~eaQwhHT5nPr^=x2w^sg*E7oXSPn>(5lmYdp{`{@C zIfteQ@i!qd6!2`dG>3k^P_BIFQT!<#W=bU^kDncZ%18HkFEAfKN=@GB3^O9AVw(M% zT)PK2mS<|Ox>*2oVOMz>O9exjvhOPL`Jq?(E4|JxIcmv15PHD#3Tmy5RPL%-Lx;^N zkE?joqntJFs45LmNkehAEBG7~czk2*zWoXM-h8OKcG4I6RjodxUiL?0C)y=$h^?aT zk6F4QX}3`ipVJ-Tq6AdSJ69H;Sqbg5?-xS;Y(Qtglfw;VGMHVlOZ26?54k!>K8JY? z^}oJxhE&x5}x?w~A?p|b+!Y{F?+w=|)lyFZUuhYGb^cz4H3 ztQ+-Yr4v#<)uYre5-9H03rO_*G8AnphK6>n%L@t~p{eG?pTrX)X!hn*W9yJLG=5FK zUbkn28ov6vCSC4_G465hGZ+q3z&b>$%)|jb2Y3AzILx5?H@^Vg2S4OrW7ExC)Bv?5 zMX5F~deC%itgk_-AWAvwyz?*22vE3+$30vrq`n$)_o{ zc!X?TNO{Z4`JxK5i3aYfqj~Nr=uwhpjxZeJ)^C)xQBQO7#{(-9D>{RWC;s{5+~;pLPM)=@R(P#@ zOk4s&p_jnE@SL<7+Ic-~Jq=$%k(K3hx$a$4m_SzkEn{Fkw1=P`@gEY3$>IY(JRLi3n0m(sL?$i7D> zb(eo-uO{SXK#17t@sfkMmDsYMqxdP(>PIFCbolj&q{L!D+lu zoaHZPz!nHgA40Auyyr!O@-w$X{a0Y;_H7;=*@6Gz!R0@-9+9tMjqzI;spv)Y)M4OW z8m$BP>ua22B`^afsfwme?i-YRuKTnR^AT1ns^X;tPN3*x<_<63=b^ftzUee$XK)d+ z7-sN{g_Qu_kIk%)VS9K7-6r1X&=HqXKVr%EmxU`-E`XubURBO;h8xKX{AN{7Y^ z?|MfSd_vi;ZpIy)q6LR-(l`~LC>WUksmJ882;;dor)rfBQD_*gu@i4FOgv-~jy%%^ z<1=mc-+qTfI9uz}wJXpfhx} z@_&B+rgECwPaZn;a^jfeKcJ$*)CY9i)2Nn=oh!R{6?MowDpY2A4y6=lM=RYBG-E9Z z6}eVW%Pb%AFI5|LQb=+4-nf9e*gn0`t&xVA>(TFwbX`#2@aUIGv20kV`nc3d)BsC| zpVS{S@1qGb4=yU}B$&gdGnfaTK$9EXS>8NUFfkTU&Uk(itt<-E?`Dgjxfq?0d(z@) z^X)9VP;vr%yopt#@Ss6y!56Ns#T-J#`cLJ1pA*rTU@A*z$u%@;`S8H|)IDgGKlm^@ zk&QZezju|{rK8S)@GDEZ2T;@7KXdY$4D{war8MJ^Mja=0u|XOx(5kP#bkFk|iq-L8 zkq$G4Sn*I7t6>||f-P?J+ipXJcg}5`s=fq;MeDt6hN^&9US7t}ZNMP+z3MiFs|Z6n z5vjx`h3fm$BA&3Z!f?veQx+{f7^CyH%-e}X9da+qlUi*6+g020_~$G1_Z?klZHX)D zvsRKxCTt?C{XY(6UL(N&Xy!=2DTZ3m9h*KqMd+D2&&jAPiE>A|86DaJpyExyq~c^9 ziZOo{JJu$J@`4UWX8&zMZ3J!G;ISH1XL6Hcr2Q^r%@>+)5MM>rx7}9M$y)#umPZwx zXoF&i>CTjCi=f|9B=MJl7WI^^E6>MSpzcW`-Ut>gR9_i8G{%>OQpnl)uf3l>^5fQ7 ztpl&1?VvwBl=CTaj{mJ2^}P@>BT3yu&6Eg=jBgOBuyLJlQ0d5 z*8`zvDYy#MDeEse@c1?=Yzn($|4IoBwvE!WYn_6+yidWc9gDndhxR=NxpuF#>t;nOxAkMc!^_o$!VL5Z&x-{)%;A_CRm z7p}PqG)0@9qN;rpx($sz3`QzYvXti}cgHyxdr&D|Guw%}ST1#S8BwF|o5lHIgKMa! zs-oHSi#e+KS{r=jK{w=*J?x7Qql7x$GbC|vG7^Yu}dBjXmpe{d&h^tB? zFlKRv*>dv&l>Modzb(KEZRaCdS7bE+SBf{bGq?!21L7;&7W`0_x?HZsCxH5R3u|4) zZXoQ9Qxw7a&CvJw9r4ZCFu*Y7E4k!*K_8>=`srp>NR<@`vVJ;?s()3NG;?54fu7Tr z^spWj)bbVRzUPI;OtsrR?^VF{s|fpCfdtel{Py{pKLNv2Q8{fw2GB!zxi;rfj4;|N zY!_Fjfgm2QchYnX8U#-2%@H5@4l=9757XVUrL`O15y#h6fD{ z%fx@qIRjZH8|p=&uF&4U_H-{k5EUFOc3tN5K)sfB^Ecx8psrCrGw{b_)TZLB>L4ft zI6<##W==E{B(K+qwPJlW1EctMf0D~bH-7elSgQ|-GMUO_P{$olJ^NH7=Gf|a^>Z^Sw4uo6q zD{U{6L6uK*ymZ3Gp~1n|-k01M`i80P^NLwfb@JyO48y74TxB|?p<1tp!3w z{xY(b6f>yYYbAi$q!rc8W}7LF*#g%3P8K|;K!YV;&(BAsqWWbCYq4ja5GLK=Jw@jO zz{;C03moOoF7G!pMy}Pv%CnejXf%VESG;e=R4#ziLKdM z;Gop^z2FVm282yiyfpml$hTD7EVQmIhb;BoX}R|csObIajPEQl2s02M`B3p6O#L}- zGW_%dRQHZh@*Z|V{mxjy>JAPS#8xx1KcNJiWX08FIDV8nsvgk?y#88{7Emkq`QqmqyK=&SCI&{oGiAlvo~WsO-$2hl7;&(p$22IXXEzY%ar z5yylurR-kcF99OB?sA41uE0=1V+x~nACxD*Jk5R05#dM0zn>mbghnwJN$IHvP#Uk1 z*jXry#{3BF>Rr*O^Q%tGt)k}pFqT8t2 zcpi5Ue;3?VD--*6sk|+o1-avz&jwdr+ybqWqo4;Nc=AqX3@wH_pBa|4SxG6bX3H4_#xp)=$ zpn8fDMyEg`)VF$*vcgXcwa3*Y&*09XKCZN)U#@Pb-!mtvbz%u&7)@Oz&oZNWf&#D8 z$7a;5dtq^MyZ~ijWYe8hg-~1RSbr*&5E}LKqeOx_P+6BmT>bnVs-n|n)M27Vm4mtr z7nocSM%3&sS}j6@8>>IthL)l02eXy9x-|qS89R!3B*HMxF7CcfI-04 z$V%nhH(7~LL3z{*iUKr&@Xvh5`BAsw?UBoQyr}Qle8+XgP+ zQ~0zY@jT;E9TK$ed=Esp+Xe#78xNtRBJT!e%r3$>sI-(&sGzpnA--$xBvI2F1DXV2R4S+eJHO_7UEa_`GNbKkE3FF)F3Zh&ms9`Zp4G z7bRGd%pH&4fDk4n`Hi`EXlABjzU6HSv|PXU!pqPQDovi3msy-g1SwX24~r*gR4akY z)m0XzBX;$F&}pLl7M_>qG{>Pm%yl7%$`ExA_Q-4(=K|L1gdE3FevCE0VJEDVf%0w` z4{si-K-&NZ)=WkmwRC)I_?01m`f11KC9-dzu1GZrT{TYh$FBM3cm+Gc5<*U&tx-c2 zt{&TYz0aW#&+q=uoCumNq)`5qTTq#1A$e=J1}5+L{knSV0Zg}3km>pjLYsLT<7?Mo znDV-q_e<#zh8=zcA533>p@DieXC-c^*5p6cl5GveWW9g+lU-oJKQlL=<^-&Hsb3&p zb%UNvy{`2+D+m#FG{o9R0ik-;ioB2&CQe97Xaz{axbPS6jf5%axv?3W|LFyc>lx5p zCrgDH4PnW&#iRY<@IpRQLa17+Go9{kGpw0weFC>32-;-`cYV$YBMi%K?Ug@K^-!u$ zEMG6+FI~El{Du-*DCmiHnE~Z}99t`pTLe7G&mtE03FsDYjni?Lhiby*#N3ZhVbacu zTh7KC`aY{xIsHvU_AlDxwQn@Q{L9#doLAX^^iI49#QQ?NSow6MZ#+e9l(td^+N)>15S0ldUpVr`AVjVkUk*D)4tMS5Q3UpQ3d3I=b<%o_@A&yGIZYlRKRL} z6|io9zwhs|AOmO8260i3{&1g%JsA3e%PuW+APVk|Sq3?%8 zQmKGH*-<^{R0TPLO84*?RjA!Tv`9w;gSsgz1z630LG#;>NqsNW0iPyp=Qfpq8aihk zGa}4Te3+WL&W}$p5M>?Hpj(L=eZSW#6huIOo~rwGi)YB5ZupXJHYpn7d5joq%TX(> z9__P;FqpXPHr8Br9L;hj{}i$^L?y1Fw&Fp5U}YfYgER_-UcT~IC+2^mz6Y7frfJ7e zzFq*+ugg7vEpc85kKqz&h`9GolPO7~7ev-I`KCf8}(Zve_)c>Ie1O$?(T0dvsfhoaZ@=-u)!z ztbH81sp?y19a>Sjd&TL^XdEn$Jt`9Xv<|f#mwxd+{s7a&(!9&b0?@nGAH_x_iYmib z+lO5n0G&Rju|Gu#{b$3|yt~gJEW|5!j@$-9Yu~us>k`0r$W!mw3c%EoLC7?p0`wQF zz5i=XKp~!Ll>SjR(4KexX2hTxEHHe^Va4UbM%_Kx#{34DsTV$@F4_RS$^0v`RR3U< zB;-LJw+Gajz8lX|&Vechx{k9V_hHsg;B55QMl`fXEz18R65;!ML~yg+fLW}I``W7u zeH~S8*PfO_Ehn{%p+gs>M*3gZ^6!Q5EoQ?R>L}>(2q}-h{eQkk!W$HMMH!mQJe%zW zM`3ntYSuSk8&$;(3W63M7Mjk|T^kUA9c%qymGKE!pE1yl7{B`;H*l|b)|vfKfG z&+Ja{XL&#`mDl&kZ=01G77DFt?!l8nCm8-0-?t7V(AZY0!+(As zMqLx=RWs_4lUaLZ*f3KlDcOOfB?Y zLILunUQ!oaVA?{VOrIeD)w4a8;oc&G73njVP0oCQF|FIxYU1)}IL?q>YSRR|%O{O# zK5M}k&G*?si%RG%y|a_y%Ly$V&EGl&&q6$rf;-JuCRCF!|90*?CF(BQUVJXL4HILB zDuPa0Fx1as@#KpG>J{zp&b-MFGmjfNE`MMAKi^ll;83~^IOJW!n=K8!WXiF*C5Ev1 zyu9)~#R?3%yAHWo6hl}4iKdHmGBEH1cbxIeAPmskhPcI@VM|6O^{un-Tjsm=m7(u*@20Ak|ol@GlV2WxX$4B)o zOr{jih8(iNhU;w==8jZYRruo`QYHomffq<^6e!_R$b-3du_;BHrLh@>m9#uT#U&kEz36dHXR>Vn&#YKV9Y~!42cw zyGyUKZD3PhCg3uj88-8}Wvd?K!WOsG_t5$z*raw_4`I=V^*Qm^SY9DmGL4_ol4yr5 zCh6s{jBS`Io-mqPJnA1`2EAMk5!hn%^@&OR32UcXKEx>%z-s%CSd#NgurT`gc!3f% z?2CSR?m$5g>((c=Ee@Gs)hCaCBZYg_v>s226a^e&n}$7S;=mOI2u##pCW8h`l)=h)P#vkb13~?n7z00EirA81+nRJ;ipUq^A|reUR#(QP5C6V{e$`i|%)|Mx z@|aqWq{s>upAq8*SsxxfhobA}UvFUL$u$GwZ7P^I`Ov#1BnrEKgHJxK?UW)XJy`a; zdm0u*8!r0AQo)XbV~EqyJ}gS7`g)$4gQY9MqauB!QbgRjZ@alvV3z-}?N^iMuyJ3@ zcH688mNhQ6Qhq-T)9+Yjww>5v%Yt&^K{^BMhvt4}YiWUhvj?ZnOT34fH`Y2L4$ooC z^76OS0Ll9C$Mzp`;hAo zZP;cC?96*t1#4$9KJvNt??!8NFS12$cp*U%$hlqgy1xc#A$Ea z5#NVh&2q25!;>h$Y4dgDlPH)OAik@`>kVrn&j%mQyoJrVY_)^C*|4nB#~hwo1G^M+ zl`(J~wkhaq9nQ_cti=$s$~l08JDc~PPOeEE?~%H6+fPS|IAiC!F>S^FC0kBM;={?K zT%#Z)aen~jrq73#Uh{?_#e%Nb-{VrmAG#k*&PT&~tE>1BqX(?e^qjK!3jf1Jma|bV z&H&rbo?9r`#=x}V4dUid1z3J%DX5wh4~KbXf%COpn(KMmY(!nNvqPb#nGr zvh{D+&-%IVc)t>MO=DBPIemb6kCXwofI`^i-I7Mwqns){p7mG38dg49@|V2Tf<1q& zDd&_UGI8_i?2^JdY3!MtOgq>rX}`jHc?Xua4nNN_--pe~mdN%rci8zN;^;TRBt@K% zdy?dd8BE#ZI6l=L`RHZ)>_wh!*t{^FU9vG;h!vZ1E#VXf#?0E}|A_+6NC zks|wqyZ5gDxfJm?f!m)T1}f#LwW-xCU{{%(Z}d(eEc5w2#8r^Nu!#J}Ta~KN8((v< zc#<79+aAW^ANxoVJ*ud*EZ&AS@?a98xJ_8som3uoXVI|@FIZI6pY+|G{17iAN!&$xQrk(|?YstQ^UYdpl?)4$j*X=|^$4HKjLn0!g zQ%A?q-$V^Z$F-y5;OLaCk{%FtR89C#kN`oobZ`I11mLTZ{eC>QhVc_xUtPv)VeBD&A#>k57}wH`OeQse z$ zp$jmsCTsQj8aYfADpU?eOv3bC(W*P5G9mZM6c-08~Fnu}Ii$VXW*S;$gVN!Gd z<49XQg{wRxOc**onSG`PgyCjmaj^lID3jgbd@c)#{A7!cVUo?jFv|$%Kpf zXrmOSbq^26YM;QQI!1g!ObEuPRUO3RJ7Mx_)$0^vMVQ>`)Jk(EgNdldkH-ocVAQC@ zY1_9LMmbJv3_gAaqrvY-KbjZA_*vuN>=HQ`XES}oN-+ZCC-;O(uF%4Ss=NK_m!s>& z+_qn-^n!^D_X-sM7bb6B{);_k2vbB!EthbsFnR1w{ev#*XtN~29UdgZcngd6m1{?{t+9GTS#=mD%l}IDL}6j7{rC6n3jhB& z*7D+g$S-o3xE9T%Yw!TZ$L||w%3g!<=uba>)Euq1MT*0gX*^8-MC6!uW-RohsaY_?rbcA+ z;491oQkM^i7Q>_-ybrh>2cyczB%l8}s)HAEAG?BBVd7zkgXE7=7_DP4&&XMa@i2)Y zDqJEE_8YIV-w%fI&c^Dne`EibeWG8dlb*m(6q&S|ef|Fse=ASvllswflQEfeIuXN! z<=^c<^8*<5ogFxRRTl{Nw2$>Z=76!Y@(efc9C^aSt2C^HQ!ut0kB=SnhUsgLVF9O) z!-N+1+E;h2qyFR~XlA@T%4D28Rz(~zy6ux*Kd%qtD(8o2`9xqm$cHCHpc2NrsrM^C z9O*>Jt#+vwN4hcK^qV$r38v^u`&FihVA|uu_ZH1#Fn%kOO<;-?a2LMaS<7#NUavd- zBfnllw+N#_;^`mIu_Mn(^lb+^pXx2&dU+0dM#WQZ_CJ9h9Y><&+xvjMRVLDKNejB< zPHXxaJb}*Im9K2<&4BZ)%0FwO3|P?yZEHGy=p3NgGh>s49?5dMr}^KZRWqDQT$=(g zNf-K;2uskjHr(1qy9U@KT71r^J>X=Fb<@}Tp|hA=cRG#@aF5~+Zu7i_-l!gKzx*ZW zGM?AEo|*|=d0M8;0iU2_=niFE?DpL;Y`(+8b>efD=?@I_`53I#Nrn7d|h8u5U4CqX#ZPSF3WL z>dQ62brdo2t1Upkjwt%-AqM?cO}R>h2Eb^MKZ!n?MSXOwmrRbb<^Rjx{qnir0h7?5 z*6?{OX9RkVhfHghyan9qn-Ga43&3Rx3#HCxK{ti+X}XZ#&|zFZaWd@&^nWN#A0?B6 zfwsUziO?t*+)sYS6Y}>z;wHO;Z0O^lTWy6@*zzXyUV5~~qu~aa;g>oC@$aGM<1e5+ zsSX{UX_-8r0v(T<uM{!+T3V z`Wp0@^U?)z=|Oj#8ZLfb5W0UCc|7HM2tC-3?6PYGbH+#ilw#lL=V+gr%P5RA{4Zc_{Dj8?d)K)&%^sj;?>|C3)d3Xgn2L(!0w7 zeHBAuy9?{kQnV|ZHoyy=eaBM6gUq4tpFBl6W(shXQ@u(I`+z(26>bwyghACm>mS>n zK=;GXGLv0i&=a`#$~7k*dK@L+P720x z*ZD-k&^YG*%rj#ZI<1H*_3qw=&L{=KhN=5eUk@_;y=MtH4dMBRzG2Y+D3{jlRx$K` z>6a6GJaAMetkL1)+Z8YSlh=ndjkWhj~dkGS_Sr@dpp!@!>e3j8+j|FCa5T;?m& z3uu=cV>}b@1~|@tlrQZbKvbqIko_ILU$_RuowENSWIM`7@)5#)1%aS4LZ8Yr_Qnd1Dqzy`mt96(7EBq zZW7}P9T@5=+czoD8&=LRt!4;4S$aB2R!4p~vFVw8iW>Bo9O5}*j&wEU1DSb>A~YSa zHz(yLLoM^v=nY0rXsP-bY0O#*6`2kKoqvw>S)Lf@%2s;RM{3C?L$gqmUP#e2rwzqg z^&Ry$6Crc{uiHW@DO3c$kDW4Jf!bZCJW&BADE?+lv#;t2)yt8;KaN#Fjmt5$&>mRq6HlP&SckLN^ z0X17a5BL?YL&Iqayo4PaG|#d-2P>R~7Og8;pID^;L&&C8HD-iXt=?OR@fy@*QT9HE zb!aUW?T#P+cBJ#ejc=g~N^U*7af`DK;tKi%C7S^ny+4gPZxKV|$S?8IZj=9E>$Ro| zPBK2IeOtSgbM6r|+pjxa^x%Oe^&3?Zh6zyXdn0ZYuL(`_EKJod?9ebc_)g?4GgKSs zkA1j437C^1pCrENL1}!=&D{Rm|FMznO2g@eP-y7!`phzMA3AQAQi#{N;K zzk5K#*_bKrVIef%!a+sUJ8vRu34Sc zn$WQQO!>9hQ>e>OUrSA4>YmCfyRXMW!!NUfTG2pgco9~w77-5BbCMR4 zSH43ff#sioF%vYrH>JB6APOz7B}RmI9z)IV1*%JTHlVF+BlK!iC}4T5hps7wLEUXN z&b(w&Xp=Dgl>F%jRPkga8>4R%g*fuE2XL|H+_bk+j?b#Z)u0czXjTM*RWvDB0&3<>w59-)CyZqU= zpus%iXbzb`Jx93b%`Pvny7f?d#@kOw{r1|H}2U(yYINlb5F0jqcs|KS8VU{&KoY^TKm zo3XNIrR@eCv-0FgR~-Q-W|LYgXa?B&x5uRt{z2ob>ff@@1feZn#EbGBC15m$3hp-K zLfr=@$pQgZz>Jz<%e5+?BcP1+bxbmp*1T>uzoi3hDw?;-XK~OfR^y(mxC$*z2ii(M z75*=;Hs`0W+&J2IXPb~q2GG7HsOjXP2sMFcoh3HzK_-K80EuBGV5<%|x~gcPYF=iB zn7;uE?q5CB{hk9=}u0XxZ zg(`VRcW7_;m7@A<89GclRxcNjLVZjP@qqtrX!+1&9UYkhSnA|64eqxALq8F{8}0zj z4H$nH`5tKS9>_AkS`O_Qndn?&J9I|ARpiw&K&1tC=Ik` zoVa@H=P_sv!mJi^7D1ibZ3WV#G^h!F^+OQVK^H^M#Nf^$#GI4qMCU!BjP$F);`Jmb zQBK!W_o{*xnnK$5oDxv|csDHi^90n-#o$y9QlPf?f=%P_AT*7pOl_`RfV#;DEozhZ zfMKhovwYSD^;QkGycTs(m!#;JXLF=S!?l;QG~%GAa@Jb5A3y#a=_YIJ8Rl2eYGKwz`_uw3tK)q=*+GD%wLd*H z5(T(UNvRrlX{aJ2eOTDc4RtB|*CIFNp z{%nMr5DQ7VQWa>Z59i#Cz6*6TA4#_HAEDVwoAqtaQGFL{oPG1C7@8asYtBuNL-Wv7 z@g6GsAJ*tg1Ptk)g(feJCi~<9Xm4Z`y~iX8nEQ#lpFO`r!;Vofxo|WzT4~>ia{mIA z6JbO4?4yAFp>t+i(mE)R}zyP;5hgqzluAbZxuPD14@2tLPPA2_$5r zN|&MLc<78=o+h;QGV9q)zB;-z=h*3ZCv0*{7 z#P7%f=W5Q`UQ7zjb=a{iu_UN)yi@-~tN_}CbYG<BB77^v0eHF)`Z?x-(a zmu{?;LhbcMWlj}GsDD!axSnzgYMk|UqA#6>N;d_yoUccH{|~erpF2U-wXdw(f}fzl zq>F_AmL!xK)sAcPpNF){2iK^d>_YKJI&!loNBgB*SLCQ02$doU#K(5dL(Q~Cf^r=d zwD|0FMw=bo7tYI%{-!z9Up6)DQsw}hzmCYK8G_94X8Sm&>7)7F*Ze|P z>1du-22HFrLS;{7wIkzgXudvusq=#-l6tH3LpV5~z=T7k5UZ=>WCPUqI^Nu0XoUtM%U2KFmX3U04d&Sh z4K$K;aG#$og(ig}!S6}>Q2TSk9hZF^n#%{|%CZ0Fv)9KP7)1=BWu>^*P?jHB9~t-x zyQ)FmEBP}IpB(9Fs}#Fvgg;cgW#Uyz^Mtl7^6ZdJVrY2qf;C+&5NiLL{n70wK%;MM zzQ=86sLK@keqizQKh|WJ&b{7Tf~s)7eVP4gsAXTyC8OYgwrjQK?PPh-7L31FM|0HY zSoKqgWDc5RHW4|aa!WF3IAkkl4N(XG4;--fO8(@mh^v7=T04^o2>G+ur zz}~bC^C>vWS=@@rz4C)cIzc_~o4Xq-%CCH;J#`zJ{B!1!rwz3KkzdI#uKtg0`c#x- zE|Spv)KW|B^n?FlqY>j0%~M~fN;_cdv9^HbGbqk0<_=(Q6uf15(hjYeOBdOX?*KOH z`v`|G|507ObF+VRG+)GX8oqp}hN>xBf}&U$bgFOCuu$>>R!6k3>ZLD~Z=HR{9qwS9-1?}e6GB=iAS22EO0E6!Apj^<8-{guXSC~kdVs>g8? zntZ?J9KOkdHsOd5kN3$SGKEMWN?8EnniVn!!cIZRW?0?gi)G}xQ~BF2JPNtqXzo`V z9zuyT-xIw3G*K3gBjkA4Rfw%6DqkBQhvbDd;=JF95D`Pk*TbxUYzhrS=KL8U;?K)- z9q&6(yoOItOy@6DcGsZfpm7m&9HfsqDq&Cp^NE;l(X;63HMP^M2WAjPni}@GxB&TA z@z4)Mx}#rAmiywYArSYaY^s4f6lHodI0y6+kf*QR`_R=w; zDirMf_p*SdG{k#R3%xo_n0(Eo6f7Yi%Xe_C1N-saeI3n?< zNAt&PI=9{PO$@x|7dSQ<%lbcz%-TD%HQ)z<<}R{YlqC?z{!m2RAp_z|rUrscYtgGe z9i>B0pMt`b=m>Vg)O!uzG0Y%f3_q_F~Md`kGi)qVJQ3^7&P|e)<{|K(S;pEy| zhL9w&Ow5uT3Mq%PO}x3B;78{^*_%QRIXwwKbIDuao!5Jnv--W@A2VfJfBpsX`Ez+F zsP+@`i)N|~iVuU#-UH^(>Wq-I%AlzJs!#d&xz6 zQ=f78G2?!}^^OVp#Z1sK$}mN-b~evh?;4{tg{6mfI*aJXe*Nc`lt(C7N2p(rK^o=0 z>JytbjDgq#<=Br7KanqMrm`={qs%{p0{TL}kPwh=MEA7~#q`>(WYy`Szt^1b{`739 zq^<-{V#1GdxzF%9OnxJ+ zMHEBZm`gVSDDPxvIlhSu!laUaNVL2_z9~0e?#|~yQeNIAPV^6|2}Q&u&$ zI#!|JWU+Hpq6TF0y!Mtgz7DZ-H%Scdii11HDCv#MohaH}Ed5?b-M*lHj zgvaf!SQ`qvz*mszu>;A+kBOB1c?(gBt0tvfLJ&^$cOvQ~27<|`?uJZwK#I@I)qi2e zNBuNG|3zU0QnxGLRjQFg^ezwao{Tuei82bDoeTj-{rJ$UFE_#E`sAN~oowhQ`Fd`g z0W~CLxxZ@s&5RO~*SGoPOdxwCKd5tl4pP>7jqI07O4TgfZcwI)dGZSv3b^hVz`v}E<;g;BI=t7t*hWAuxYu>h?tf_I)=wmib4 z(vmNU&7CzUtNeTHDgHG`J>T;o%7Gmsf82Q~$utE?bxqk41E~=2QAxUS`XZ$0$4)-f z6Nkk1y;Bpqg%Ilg)IwO_8F`;P{(If<3rcu0l;w6T5ZqMHJj*UCfeKOA39aZANarGy zHcpj7pf}~Xdx{(c1-?vvo*no95ozl!>oxbfAR~BqmOw4?{}Q4q2vUsq{~$MMQI!`a zDkxp=wd3}18j88-%KZ@=fV^i2HzJqqk#A*X%T6>EWGa=#y`3XPRgZ|=&g@1(y2q3I zB|;b!tM%doVZa$VM*XZ?k-mW3A9ikxr@KSa!JVnk&7lyhX*?}WZwOJj^}C7w+Q{!& zYyK4LJ8;lui}+iXi$bnGNw%soMG0SC9RFr!f-?3Wt!YGeA=hv&j~9Q9U@TBuHvGjH z4At*lzcU{WLnPZmf_-){y!5yKN9qWS$mAw_jtRn0vU+}5!$TM`n=kq&TL9zkf!8m} zeSy)!QqydmXc+SyzwB=~3!|flC56gNKxnFaditz0^fkgnyP_KmdfBH;FrESePhJNX zf^p6RKYgn&cr(uJ^V=wP!*J;L zDP*vHkPgFpl5^~Ij7R_XW_bL@7Z_>0)1qSQ3USej5n58hUfTh-}I;J(C1AV zk!c?W`11udQZW`VG^c)d)6D{Ue&iPJ+;@YX>}07G4hWG==7^h;v4EHE(nP~cbPdmw!K{Y5vN8irY8RC3;x1ED+k&O^Rw7)TR; zRrOL6hL4S!$^Pk9xvI1;ndXYZ(q>E$nltTnB0NBo#)Yiq`6@*%&ACnTn+|p zJT6*TaKMP)PnXXAqW{a!3J2OQd@#_~^?9YG1x627KD3b%!{{Y70TbO_z^A6Q8BZ+& ze$?HrSF0WH7lX&snB4$h(8tCqE(L=tw8p%WCeZKtyU;Vf28N=VWaF+ULEoRLj3=l0 zq5nbX!`Hg6q4%QI_So*I4`kWg0a{D|C{Vr;xmp6tH4dv=8 z&S@CorM#ea_74nyKQX!Gd$d;y?TT%041mCNTc?D*3kYT5w>?zsfpEK)pDb4BKMs}~ zPCmgL-3R-a@IST|82%v9^tjpKq6A2@5l$Eym2X0n(|LU&-4 zOs9fy|7blcquiq*0|w{FNy7C?fl!-3C^V-5JYFknhu#|SYAhU$!`Uz*UNEyN`2a@f z%=go8)xzK)#evE{c^K}LcX8EV1N;Q>$=@1TFtp6AcSF$(Mo4-Dbo9>xUYs8zeDx6! z#0}dM@*-j6M;`-E=sm!vs1Gd3QNu{K4AJ`O>;G|3;Ot`_@>4KsCQN?Jh5dgx;BEAe zRVf_s9JkzQW#2=8$2oe-=vg2LEQC5+c^>K6jW;n}Hv#`N;k<{=k>2cx^h~rqgAr0_ zvNl@;!qEOI|4Jqdizh@@_zA)AWwMj!o(aMzwx4FSs0T(#Nz6%dM1YV|c`6~_0tmJ$ zSHs%@M#bI@#yn7gVN{Ia;R6^EdV5FMDjV?5qh(?0doao`#)QuD!0?+NF0_26P&*#d z#Qv=p>MXw2_mjv2dZsYzW-1RIzHQIk$4ntb(=AEng%(tdKJN`)4S}jdCt0@}ED zg|jmzp>gWnzFL|c)XjgGxpYYm>SBjNhUQkGUb4LXsmo2kZQVGz5%vK(swK~u=&wP0 zs_ijq{bXqBb$l-O3d56+52SM1m&kQ(7N6L zG`^%uc8ODlhHIEDY1tYm*(i^Q`|bsW7P>>l+K!N0m)zT3zyakwH_A!ZF;H>5o4iY~ z3NY8gYz2=mKzT@~WbjoFXba;0nNe&G%`&Dg$IjM4-u%@$+$mcqj`_J@SKRhLto}lO z;q-+=K>p?3*PbUrl~tN)=1vlzVZP8AE`O*?U=O_JZ3cC&Vn2oIdZ4Y-ts&2S1*$S> zGI@Ifp@N~{XTg~}P zO<7Z+s%kP6eN5z**p-A5B~~vBK1Haz<=w9@83DBw(!KhQkD<2RSBvkQIMnh5Oe!Dy z2DQdBoEsx*P#yA+eOaCzn)0})<2p}5Q-J+U%nKE0)7dtWm1u?foNw9fAHAVHh(3?} zj2pD|@CqFuJ%btctO64C?s^fqW z=4J~hj)WSkyS4bG70A>uES;(U0TrDAEZ^OophJ7w^Vxwt;6}~k%aux@CjIof`r~WR zq7na&<)TKyM6{52F>2oig!YNx=it>FK$rj)-~WtwFlL2B@Z+7#i9PD8qsN? zJZOKyUH%6f3GGA4uT)mUpd~AQ>IB^-XbW_@pCSGcnlEY<*_=#=y2pplQY{yu5X(kN z{Iwl$Ib|cK7UiHtZubn=H7{uWb~ri8Xb)JuZ&%BfZJ?txj{8f1Bh;E)YhK9Ih8D#~ z!_h5t(AmRS#b$g0YF>K=u(jm<$I355Rp;xcv_2wT0)Qw!h%gl~6BemOs-p*4qTtOB+HFJI|n1Pon;E z;yJ*iF5I@aI*EKP+}2PGvV*MW|L7BCF-Pn5Xyx%sD!`l?LvI;90JqB~!_^fHom$4? zzfG+FV-@$@#BbN5eAbviD66-&ZB16zM+j;}w0;UJ2t&g56FNotf}^^d(Z2~t`^#!w$o?c9 zaPQPSciR3z)7-~*qm439UBM|UPL~YL^bz)xA#Bk8^ZE7NzkmNPnMco;mIXjHZ)U(H ze9-?8%YXU=e`qXZjVIrVkS~Xl_vVEP=OmzP($v}q`x2`2C{y#*6`>(ChSRi~6Y5$f zSS9)W0JYPX|1NQd)_#tc&sc9mv&fcGCJ!E}qq^5_rl~_qJ??f0Q$JMWzAEdUKMB?R zTc4WxMxcrdeua(F00zH}r)Oe=ij9jyUpA$n(#lpZi(VG8QmAq)*uOx{!{M7tU7=7x zmCxZ*U&)B;I$(}r`GXL49!B&-HCqu!+5AUu_PsYDjTYeeJYeT zGQjLsc~bE7Q>aKGe{?G&1BzuCk4rtpLR$HB%jtKIAinc?)vmq~M1_elO9kU0y@E=y zyeH=@E? zlDAs1@LO0plr!WeG}oKGi1o38>eWQ623tF*C!tg6n0g3_kGnouE{H=V{l^f0p#jMC zaXypmeh0Gj4Ayo#_aN;ozC%vB9fBmxXnz`TLRR9Rs#_J6koQ2NJY+W*63mI)HomYz zj#^Xi&ScjAFthT);J?3ikfZT7!dK-4 z4Qc?rY1yz~R)Tz8lbLBAOUOOmm}zXR3K<&?46%=T{$qBS`t!^~7x>*me1ELK04n=- zQ|zMyAW6`@R&MqQRBt=(IDCqD_oB!T}-5qeS@@FyK~sUhLMM&C+7Cw?s~wN2F!~{Q8}dV$}WC(NersRTg_a% zB0+7Ya^9**3aX}iJ{iBwL;45YWnP+1ke?Z`c~-g>{`!9Yf`_Y6cv<+xtNXl=SG&xZ z!r}+{G>jXfHi_`vIXrW=I}*}QoDI@W@_kI!3+)1-+ph+X4@vW40~)w7)>^ z3GbMkzdTU%IPm+_yHfI>)KyT+447%!O^7B_Y(KHxHTGJdyt-PeGjS zF7Hm&dnnrD`*>joAdjMA?&mQd^zl`(-)|QR$djef75>2rftzDwKeLZ?dQM&G$$NXq zl)i(Vobf{LZJ!?d3gko1vtPb9>?9yGjcRC<*BweG?U+ixg+too`p;ZOj8HxLdo(0s z8w%64nTfH#px_w8NApfoNZMWsvYzXJ^!~VnI++hpz2Y?O`|Ek=1vV2JWZNd<;@)~TU?3y08KY);mx04$CoAAqb!XRdv83L?|CiUrl zLjKzNMK`&(P@o%~s%XXm^-H!1S(Eb6m=mUXXZ9cR(x1HiAgTdSK$}IM#T}>)YJT!K zN*i)}?)f$Fdq94g#)w|SMTj;az0tH=0gc@ClvS3+P?daxWae21lo0cAt(N9M*#!0V zUrh&)7bb09wXO)Y+St1j1LvTUTKiV**k>s6M;{Ju%0lki!%<@IQ;;jye8dDELf@#$lVjW<{! zgE2bKYIqZpSU9xiUwjAu;@5K5Qb{0g8pyWeEuoI-4eOcCBfpuM!oR8X;mD_Kj*?0{ zK6+}=#l%ygkh$4Op3M!}=Ktx4?7)XK$2m%rWL=i~}NX|LuSmYcgIp-V{L_|=~ zH}C(qyH0y&z5Vvt`>eIsz4z^}HQGm2jq1IRG5YAE_nI{)5?-$C*=W;5UYD6UXUKU& z4lDiT=bJww&+U$jbzULTDVt9VTsVVV@3pIY+cqQ2e=5agQ5o+XZiYBX)BeUq-@YDu zb@>qSY|E52GbJZNb`0Cv`H}GKYdwzzjVj^d)mJk1^Z;@-rtL_YLC86@Jgg;th#bG7 z_H94tf}C$#UhFD;g4p&8q^$*yko@9_@!{+&a@|zzyhS<^nU4~!j`{W=b+h!bO)tsw zx?_;-gu4LZb$luxctj!1Um{jxYy!dCSfVf4e?$IbM%m+4X?QLF<|UP3CrW8KzOxqx zp=@cBs4n#;Iw&ud&Rn7 zZRZfOql{EZ0+J|+h)(oBE{Eb>hfi^f@{{YI%`3Wt+~oY3U1yiq0c1^Yy=@(Q7HL=A z2ZBqB5Y#Gcx?u4OsrwJ@s;cBc;St*U^|LP#EE+zui>?M~76&(2+V4VI{ovVvxAsVo zkH5-#`8;fw$9iu*E{42M>FF0?6bMyn68*s}hIBm}7ri5*2&tL7sL6O8$u-+lTg$1C z=JZVQF2^)7eN}4ii~U5@7hbEaPqI+sl=mg|tRiuz41>Fyiq|__|`n)tST<*CeRV@9Q)PUYkYaQ2YiD%^(glAM?ea}W@e>0+ZJ!_%Bu7j;_uWCRPl?Vt(hAa8X4#nL zoRASrVP&_IyiafFzv0g+iu^di<*b)J$h0#`-LR_i8^<@Q7LC!5B0M#Wt8JB)u%`dv z&F*A?!Yf)mD)uSJ_?Z`aeE&&g_Y5%YbA5{Jg`kve`70=>XbAB)xrmI*iFf-Micl{7 zlg4@(e<^V^6!q8onWHgw7NS`C~O|Ki7g_{5J5kNe}TM$KP3QyoLOt zrppzIgD8x5I9Y!CI*L{EV%g1vQGC6s;Aqu-B-9o%PBVW-W{7~_7GYzg@EoY8^7bSg zPpP}->HZ|r0`>+MYY~LkC&u0B=Ld-Q*B%sSs=5>5E6Li|2eu*Y@==ZpjrWihBbgez zv=^B>lAbww`Jj;UwGY3-L1f)f(~Z7#ns9%jxoi@?Lc}ZG^N+|BMyjjCx8%5TL^w|5 zU)ouWIGJM~U%&f~z>T7vqFaiI_Z@TVjij82kZt=T-PAG&^Yw$`WB1n+QG;)S1XjZd z|MQexKL*JAPF1=#X9fdK37woBe#?n4_m^Csgv*fPO%V`#kP=Z#5lyeY2NG^aB#lN7 zUMD=H>+SYd2_TU6O+~=QafDd;JbdxO2C-LVbOSGnprG1thR5gz(p-phsnQKZQ1tUX z#baHB_nzX^ZE7|szN9+n_x?1BBojDacDy4r8GfF4DwjqCpDdLy_x=8#8A*?MTb=6N z5nJ~;EOnv-&X=u>rEhfL<(BHW6_o%aE#@c*I_@L;YYgTYt`SyGs$K_NDnK4{1HHj+ zKBPI?47yXlN8p5~SNzs5zwt}Qx9Qt-p)%uW9g7scEnZ*h#$9nV4d{T@H_UlfH=10lcI;7G|KXisY=l z3{Dc6NDf=Waln%w+21$*qm-RH7M8n+Mc;NO6Z z9Z~{MMN$#H_UFBpYod5D7VPqsuto&q$?JoS)QI?TdAsO4St7D&;gFD;8axK$?{MsV z30H~DQ;+*j5k@Ur&X+nBBSn2#Ya+l5g>{#0Lz2G`g_d3~)s#08*||Sjk6Mf)G{nY( zM_Li_$5gd^8!GW~H^q96ljA`LGLAl~Sz zTy4~Tq)-g|S@{ykRj7#hppitx>2PaHm24rB4a4izx@?J*v9c=n|My-IyYR>73z|OI;*l>~fM{A|y_L;hSa@l1~~%(m%>Y*mL8T zBf2-p@pNO37*jq{OM_b9?&Cz_T5;{#kLQp^BW~wWIjTf1IK|60pq4=HY;;~~d2ructK8}N7DB-FzO*PX(j`8D&8P!#!c8?g>>>=mz z*I0_LGU+3jA%fWaOCFIyDlIf8HIYHbF`GnNi_BgZPsikqM09mootWM3-#DExa9C%s zlStye!}8^D*6%pQ?4zRhxj>W_ZmB)JZw3WXJJ$7WUPhR2p3N%TQ^Z|MaMs`c1BK@6 zLZ;b1qTtcm&VVLk#Ec#nS!JL?63KhZjNV=ZI7D%CFf|cL2Wz97l^u|7yZNVRp$u|* zX7{ots-kG`$9(%O*HL)F>#2XkX{2oB`cPXT3s*Z%^ZOi*hz_}DNw;(qDj%{Wt_5`< z=wMLG=jsQFh9}xQ7yS8A$Nx<*Z0iU}dYAIPsz{^UaCBub zFB?q{Y}!8-TcN??QgteaCTb;`Z&|sRfOIQNjIz@UBv&TMyg?3htX;jyZRvsLoRs$) zZn~i{a6qxiNCh2x{hsXfI1G|Xos-$!Uud?msAWvHM$>7hUZE4>XiU7IB_P8KQt0Qr zD}~q5a*#R5H7FPzw5Wf))(kZ+v{o)p(?HUVYhBXzMI$vQXT0VOG*j&EJFu1lbtXwa z{0bLQ`m{`e!@UVD>JKPzI~|o$e4idO5+MDMF6P>})_ucG)UrxT z#60_oitz(hpLtV%$F1K@?OL7Y(R9?rJ;!ejqzeHPt3P~DR}eP$czXtFC^Rm!4s(&m zUF(`))JIh2sWwdcZbNJ9p}-zGOVqEqvnX=$A{yUNzG8j&smr zSsH4J?bukUEm2n=c3>u909D6cO{TE*qP{fnvR7FF+6%TP`ezNIO-KJb&HJ-xHe6(4 z3f+K){?IJzzK3X#{B*0eHXQXWmB-wKTTv|%sVdXWjHZtpmh0##(7d|s#(3T!YAGH7 zO+d20S=}!E3X;iIvn8ye-r2UBDXR#i{N8P}C)S{9vieTfj+-bAva1afO+e#Aow?T8 z?I7`Q9TetW0cqvz2}1rj8W(?-X7AdK*3@po{IL(3=;SVjW`0Af`p9OxBR|j>BrK=- z!iwwXpxQ(7f)5)-2$3*gC`|F<$z=+eXQ-GB&v2EmCCsP3N`uO&#!Bkqu`Tx^7F7-l*Lr# z?poV`>XRa$wb)!iQm`Buyj_6uNTJV1CduolrE#5MRuY;&*s>nHI)r8x_OqjBOHhB0 zcBYKO7OndXW{kAR{#EgKx}m@a$qnbK1vUe9q5M zGP)t)>tZDuXPGG6NxmqRr)`S)l7TYsr;27y8mLhXjrkg-gp%!IlF=RlD7DP74{7N{ zO=7yVrnv+f+?M;ly{$&kn@9PcwY(@SNT0p+Vh&Y{oqU696H$Lq^VIvw-Kgc?MYU;4 z7|o1Dp2pXUP`#;*ruoP@kh;4U9tnI!{kmg@BUbFFzqDcf;%Et4d;=q2?zoE9`kj-D z4;j#|vH8`Jf%j@2D7k%|Uya9;7KLG%+Qjjw6sy#ZQ}D|9{4zC!MH@ zN}SxT*jPTXUKEWI&6+*?B~fRkx}iHJAB|j{{8_C`Xggz5(l2L+RyL79 zM&4R9DVPxJBuvq$ZYU=6>jE;E(h6ky4N&Dw+RE@Fb zuaughY+t#>;F2LKW!79{wP8VHXjl3ZKQS~yaG;Ez0yT%!iqC#|3{nio*^y{A)N@3# z4*Bb$nm^)JyM6;|rmwl7R2)@}Zm0Hc>p}gS2YDqY6H&?GZT++6GO9M;DERSd6r{bO zxyq4~Xq3~qrvBs`>K6{iMO?B(1wJ`$e)$pg8y;@F-n|y3m$v9!_C5~ML#>ye0?F}w z@*Djk&xh$+VP~;k-@pi`z)ZH06UT0Z? z>QDivZ!T>hbq(F&cytA2o>v*S8g+s6x@vLvR5jVo&IR)WR4C;M{IF(H6osE=rEgvg zK~umz$7N=2G#gd@qLEGe9ao93XZu*+j@q?W+@xQ+s1_>7O3EVlS66s>s^vWD*3+DO zcb{AbZ>n&;a{dNL6V+nDqvUnWnw=?;;fUr_M@>&YVL{8S+Xm7lwZAbzcPnf@ECYr5 zTJuNu??8n|vZU{B9*_=qAN104MA^q(Tc_!_p^)=^QftvM6pY^8LgQV4YE|DG*#Wyy z`{rdw3QZjf`wue?Ju^hbI(E4=ge%Im60J9XSVejHLQrkXMb!Ggy6`4g0F}1M%3Hc$ zp^9)8RLKiO)s=V0B1D@|**^4&lo*A2m!GGY)V0xA_{6bw5G-^2`9U6)lI_7U)Ptz(;7RIe0jd;wc2N~QN6lAr z%>&BvXj+`E-yd=hWkbnkbT*HWYo)OmyI&P$CWk9DPIdprrToP#X`WW7yf+%Ir)~$* zOgYnuZMmo}^Lpd+fffby^TXYgEy%r}F++Rp9&*1hUv%&HK(7DXyXRwjP)ozYA?N6Z z>ic}nHOKW(-uUI`?RWiX*uf_*UF-(La5a9$Ys>-ZOmC~aTSei8X8~h zg3w~IxwKlk7L5gd$?0AKzj1XitJw{4any7EVp`ARh5C_lAMJV*~pRIZKg z{f%p9%6g=0NodK-S-&lH@9((DiZYyO!5$@oF(+T^zCg+63Z64tYEUQ2s`8fi4XV^{ zJl#ocjWV0-!kWY6`7b|y&!9yG6;%?4WSc!uI`?L;sF(mU7L+Ger9@FmVRc&TS}rR4 zif0>lljC-TR{aYpI*=|Mru=r2oX>qfl2)$J1d>hL4wjM;)QaiY^9`DyHdvh}&y^Yt ze2m-`wd8!k?f{->lJn9W{+!{k?-;OJd$7vrJBFnXS#I6+3S)0Ahvh%fV0c%=OOFO0 zj79DeXAbnkDF3J(>*NWHIy+a!`)tEtW-<@OD<=%z4tUdDJc8kKt}BcMUobRQRDaNI z5~JnM52TUvml0{IsKp>gjP`{4h}6Bn$mlmon*$__M)Q5zWOErKC+_Z9cUuzUdZ!~p zABto0(ebAbuQXw@Nhh;wq#l#*44*d-Nnv~_S!p%L0^`R6E81UIW5jLnj^QO`3=h{) z*_y1u$c+B!(aRq(q(O1%^r4R!mib2C?qr8Ci`GEf7X(J@5A&|;RKW1nHV-1;J;oT% zpH>Vo!KeehSCpg@##*cx{q?qE*sEYzRq+5u_g8aTzLmhp`IG0Q$2c*vqEoSUh6W=) ze>C`MiedP(q|IELIz}EpqP~{<; zBX=<>Akr(-U4?P}E$ax1Mht%Av3a(>A7jBi=4TteVYtAX?|Yju27ELFTw^a|OzSC| zFwGFglAI<4CFd~0v9ir7`4~oUXYL~3E492VQ zl=b*1#?$@p#PG>t)GVvA=G_NOT+)<2mGuh~N7qRV=Dx?^bV17bc}WZpQs_)2Kf&1I z$Ir35O3C(q)zui!!sr`9w~Hi^V z9~Ve}qX1+3!t|2wko(zR?R(2p9TWRh-AwnA=b2WxZuI?nj1Mfv&h28scmb&@)?E~1 zQ|z5b-6t{5I%~d^vI!$5R(w_qGZ=L{DE^9p7ULF9^NH~)m{`l~KC~>4F`>-#PyGoP z&#m$^zg>=rL%G6l_|!3$a7wtWp_lCMY!>Z5Ph+$r@-TaWA;y;@H(5P8it#9;iToRn zF(J6NK-~Q_CKMKHPO#m;cx6OV@yt_<-L*a{c_IemGbW`E+Ql*cH1hh>EmjzprZ28} z;)3x)<#jHP{4rLsK1#Q94r6O36E4~mU}W`HB6s?2j2&2vuWe2H5AHp!_fa+#7AsFGFIVLo)2g7$PX_#IFVC+}HSc_m1hE0Tz zRB&G<`|}RYxBQwI_6_Zt%~ru!vtaSQEG~@AtbXVA%OKky=KQN=0OLm$Gt$etF!EyM zh-_;MMlJIe+0=V50*%F;r`}=kEG2!T+%b%mc>jnLeuUwmC*Mb9r7?1&`B={JXBfVq ze~DR^1w)FAN4VwhV)$^&;YUZkf8$Bd!k_9+n=qO(yR~LJJ4TJW*xYrBF)CbBO7Wr# z<1ZEUKNq~fSeK~U#n3biR+Dbief^Blu>R#)Z(vZw*T8zl6XPYD67RaEU|dC)-fy@I zgTus<;c5Ve85Y?ajZR=(W<*-$xt zVJP4B#mrm-M*YMOem{Bw!{L$a3PEicStn_*QmBXt^>ss2XBf!+)W}{Pal?49Vt>S? zh2MDeK(JQ+W_pYnH)*Xb$^DMU?H=tJKg^0zi%$lo`8P3~D0Cuxs{wia9-iycHpWQW z1?J5}3`W}SVtnK6%k%5bV)W>oBhOj|OecJQw`qJI2An5|1oc^rIFRHnN?#+d zzSVKJ_eyRfTTW(2?hR`<@7D?QLj2Q-*qY~%jm`j%P6>}5}-#`b82g({GM^Ke!c5{T5F;T|?3AwUa^cwhEe_a@5v7i3LgjL(yhF zLA2e?TMYhGjMg-|eaG9sqw7b~iJeKEAZ2mx)3TC5OUsF|Ux86*xkkS!c=J)ToN=T! zt(`^lC}eG|AE4Rd;pLZxd}x-ePvt%;gXWFmlJ+_QXmQFiRSGviW2~up*7zGVf9UAT znj_omxqWKq@F%pa9x#{ct3+$kergTbuOP*i+GPxo>!N$vbvx6^`GXp%X7}hE>Qi$* zKlLEj`DM0Kb{ERfeEL<%y220W$ds*aBfQZRkyrdOehDo%GB>Rt3eETO`8(x2(X6v} zZjE3rn!mN~%2FYZPZ!gxy;gR=+rQ{Mz`Z$60g^tBza|Vn=)1f?N2NU+AECpE>^3 z9j(7QnU5YRKxf9K>bRl=v@d<+42Y^h$7KIUulr1BNlrEuurqVxGggJr$y`%nsnj| zoF@y>^NNM`+vXQ&>+F6N9CsLv;gQWfCgghS(h z0yLf}k>|g&zQgzyI#ibqYkVcI&-7u1kF_gkI^MqdtGoiaUgJ8p`nC#9k%H12IrpN? z@A`zQ6@dnYZAPZfAIW}a_KxNjA37xld`CGY&^UQH-7_K)jql|c4I}5!eyQW^l<5q4 zTu%NP%Qrxql*5}tbmD09R(3p~!t@)rCS5I$+E$1bk4z!cm>zU^c$+yNAm{5vje(yY zg`>6ksS4HU5%jp!%UR`<=kts1`yDC0Xx^*-E{kYI$2s9tXR8xvtn8qZg#;QtY)kNL zyouKPjC$`D$I;{(8XD)kAFcF6Q}K`&Iv7|te*c_?j{VAt(egd$N_@IFdvP8ux~A4n zi;vOL+P_}t^dYnvG${UXY(*RW*<)o_)}d*B@NCeRM%0}stBUX}LJLt%|AOiUdNyx( zSr;qxAADSjyKn^nx?IO$IT%l8}VaxD(MP_)0B|k{V5HDWlvu+Y4IJ!1ws4Y@ZUgTYv?A5 zSS|S7&!`@st3lk4K80s9w~#hB-FuVt0y)|Wjm-YGgq6 zA+CA^M~Z&GBncYi0c-0Fr_T`!`9QnFE?X#+~8D4BD8HIXpC zzrtG}5J^8x1_+F^NBo(8r9V=DX&IJ+?t{W1|A{?~_hl?jA?3 zpXc%`H%Fwux6<$#zKcf*!BIJdrN83>&GPRb4y~Z{*5u;Q>+6J@xQN%YcyHuJbF3?1 z^@D5ou1+IrD-?d5uc`X70q%V7rkJ1AA;pzpPD3FG#dpWfKecv2alcY|iqXJt92D{S zQF|o|GFg{{7ugDsZ0bIb4oXDnY|hDH5=WRrE47o|K?L8GYH3@)3b(L!!n$q%X(7D* zRZ~$&tPkV;H1z_xF)vo5W1>;mQx&JQ$r~|7LuyME*N_fbm7NAVkxAqFhJ%6~MUpe+ zJjI_-q;oWuOWOrCr!;b3kJBSnPGgJgz6VHpVJv94n1!G_vw}ZLyOE-~CSCJ-F2a&G zse0;rBT0Hmy(M)LG2i{!Pf4Ffc=NYnh0-ke$X@i)X;vqXC#Ph?umXx5vc?!gXkg2B zEyOM57Q#0_ZlVxuz%9M;9nM|nku)@MpQBp{PCk}8F}0xx(R{(^@=zE)$x4lv!-k-G zWOV1}Ko1nk{&2md)r9=BPKNyT8Az5`_;q*b1aV#Z0+kq78IohZ1pderL{Ux8KKlnB z@G9td@&o^a@SQ$;bnPQ;q~}+)D48wdEvwqW*f|o4>30RM?brc=VYNo+B`dNoq|e-5 zPDf#TMTMEo50rQmu2NJDfryikvpk@OjGvFGt<-IiezvBHJAn?73|h6j8D)^TZzF&8 z;X%au9aoql@6*NB8{U{vzCcDFeV1QhB2r>b$=;WGf)$v{`e)Q;cZTXb5Q+~@+zxmL-$v6rJcnnH z%J)idx=#%s>Z#nyZ$u!b{h6E^X%cBe!#!fjCy}Q;vt`9Z8^j^mC$+q}2ys5J@#xMF zq%=F65s|x%{E35_xpCSE-+1wfz9R{#({Imm*oq?IWpGD}cN2=LaxEr9#NhWTjfE#p z5B_>TVy4)akZ^O5j&f}vLXNKauu(4LH%?!18KJ(-inP{%oU8MnuMqFC){k^d0s$Oe zZK7x2Ay#A;$EBC2QI$HpTRErTX$%jT=+9= z`zwH8DLR@{BRzk$9sekZ%(0iI-$-V^9Xs?dA85CY`YUbv|JjjXFnXmy`}%Lk6?I39 zq`s&9&GxyI(V<=8xkTx5k&*t>sp7N|IV)Dn1{!&9@_n18l-Pj!+?pUUIB}#T zh5o~G>i5Y@ZMc7cAjMvB4eezkl3SGz?fGC!k0okwa0q$Z^z$y zUZ12llhs7ov#&06k9dfjUwjK3zJ5gU3l>%JO~p_a?)>o1g7eR|^ZyhO8K&PvyWI`` zYCHZY5GjKS+F#EF6KRw6JCsgb{G07Ul)~RhJp1)`<;87D-Dm#Cm!m`~v3a>?%X1<* zHcF=ER~yl|MVo~wSc=Ht@>)$hex7JK#6Xd+B0{vC8?N#n5F?6@ykWSetV$F#WPG|? z%ld~K^q=jk*e_PDzD)YU|Gx@| zDy7%Qeq}@x$=?#Jy6Rks5{9JWb)}<3c^bQbpl%jXuRiBeGn+uvKQnEq4SztCnXr6% z^z0c?PHQtHReGKvWy_w84ZK05?(K3XZr=TkYX|AsEH7OlDu*0OQpHKXFxWK0>ko?8&4^+nj1IF0@^|ecw+CJS@M+6` z*Y1Dg{|}UAth>v7PXnn3Xd_G)ub}L}Hc`RC2*M?GA%0BgUzUF%PBoZP*^cpd=gZXg z$$Q!I{@wfYnzrbeC2_#(ySHtqr`2!g^GB=I7~+I~J0?ZKT-kFr>z)9Bdgn{JZnSsW^ERj*fq| zJ^#kP@&9EYD3^20lZW)r-cLAO3m3mhY4~^BrCfMiyQV(-@3!-Bet%2m3d?WyMW6CZ z9-{r5dCvbTKsFnlY1I9PNDVx~C{EA+pRW^fp9XfX`iA^j`iV5%2B!Uog#Ik~|140l zDJ=4eME~DwN94*JX_|Zz@UO7xUjZalvn;u-JN{ScC&E*k>@`CEWzVS*9kfBG|Lw`& zo%f3E8{JL!{vVe2Ov5soWe?>%c^3iM26MvO{qM}*nqS_+?A|g>x z$VBmXpGW?#eWJ0`J?Vh|<(@m>&96$aJ-OQd?EOTB*g;Y0>9If3rhnsqKOkjs&D~z( zdw-NXBJl8=nvOf||F9hfCwsUTx4-$L?D(TWgs{T0Xn)mTroTcn-`S_{A>p4ov5D`l z#~&s)<-D!yj~jp3{QprP(uIX8_Z2?*tL^yT6+~6Ep?*AFGm(-g-<%BNt%>LneJuD2?N7iop-FZ9F zjmuTVbAPnHKO1nC-;0{~-^~+3^g_lDQx5(WHvQl1APvxSXSz%yey%JxYvB*8*N~gM z^9#jkWfX=B2h7d4f^=!S_WD9Skiy&#-&44bDua^w7l-2hD1Co6kRerQNH^gBhsi5B zc0%wk-jr?H>V(E6*&y zzbgmX$GeIy+5E%bzxlgz9n2O#?A!Y1zfWAH$*m=txRodiSx+x_^ePcPcl2r!)z!ay zU)jv!q@nQJ|FWI}c1rKn@W1TyrvD5g(oC9h=bFgB+K>qNLy#CEM}8`Q9Z_l;$ho z5k~pD^TaM?8rAuif39_Z8$`kLuH&(^zlhj1>!bsDO8+W5{#792t(H2Ex&E$B`#1g^ z5V_w*KYbg%|99JkzV3fld;70j2Wd$xa-QFfi2TksJ0@Oh5Gi){CpvyL{%QKsYXen} zMECw#^8aceMu4^M4z1Q-rJr!A;juiF^LO80{HsBvD3cDbZ2xaRzb7J!!oSO2``vp% z|EGY+P}(~@lKF=}7e!6RQN<+vm&9A&3%t$#_J6ee{|v%@bBbSwa>1Xi=Qn+694%=* zYyWPZOr-rd{Q2n}#eaoO{|Jb;aWA<~6yE&L=V80+Zo(nwKfHb?{Ma-z4;5|vqvifl zAnb$oQd);}{>|%2E>4A|AO7a|i~q}d3fA*?T{Ca`@5=e3fO6qqZmfH9|7H3jB5dl} zwbuQ;c0{IrzPz}#@ZW3qU)CEg7RPn5_|+dJ@89@0{#OE$;|g=_Id}cT_gUs&eX=2{nHw*Ga>AA1`lN}`+*?Qh(moW+*+Hj~I0&$Uyd_999JC28#%6o_gkWv*1( zD1vBt?f4Oa5O4qE?dY2dkV2QAneA)Mk8{$l^GCrS{4YQGU4hGaGZnUv1xC1>%G14VeQ} zoPV_)|HdB+!tWe&!fyY6I$uDF_WPva3*vvIP5%stn1^)9*Cd6J{Pe}}Th-tF?#JJ} zFX{Mx9o+}g|EN9`HVU5Oy8WlU5BR?ekdWT()hPFey-)QI>(3U-h+LX#{;Tx=QGor! z;`OIp|FqAMkX`2+$1Hkqrjbtb-vp6d=&4Kgoym6cj857$LrFv>GzP=!54^ zTBYt|G*9@o^9Ejwd`>TGuC&AG#@E}2%{F5+e?%#XiwYylOTi5fy)be_>13cZ6GkR_ zH)N{c!(hbBfMdmNj6FDi>9rv<#^^V6nDc31%$K^Gv4I-n*-i>sDOWH~_0=oyKKN`Izma*W&mN@1C}+nZ?uVrq zbFhC~_4qr+PDdB8uI0wa&6wK?kFH{PJSu}WnH7^W(=5^oyD+thP&3-tfr*!2SetG! zVp3_Z3jeJsOq@HF>U~QJV=-W^%t{P|~^)^tn6M>>0w;n#E<{3A12=|JUCR(jBz5RJMnG>CaA)%{-R~TSd+yPZQfmsnaG}x z7vjhGtLi6xE?F$MBg8U-oUU#PIgVVwo3HG2;Ju?X!b17@Mtl@J z+>F2rgMsAvE)o1;MWF$n;3m~>H5Rndob8lVy4kFfYFb8nW=cl z^Rzm8p3XA^V_J1$%@T1K<8kL>(N4fH$E3C6(_a`(HIzKR{uo9x1*lway~Z%~)SDT} z{!qihdJy!!cRf#Da72zQEiMO?!uv1uXiDf#^1y91o^WdBINqnyN; zf$@?Pear0b|Kq%r5}gBvpLX!9^U}j8KPh{+qAsS?-g^1c|HL%EYOwV1bF$qLM?cKy zk=I3s?M6>>egqDWf&TDJsJ9e z7K2mbdavk1Fn(r({Z5|*Ob$7|4prZZ$wWu)hQ&vi46}|i$(zCWc!i{YLL^2L9}$uF ziZN1usV0Xtz>it^BO6hitvyV{mzk*Ogn#n0Wpx zOno#Jqm~{toM%!n?D8gY@Amf?j&6t_%u)CcPBJmyFrkJC&N?l1XD0Ia=6>Z|BF7V! z+D1)EDU3F!)tl`L#VBK0ba(y|M(NrgKjmrt9S`#}%8$!AVyKPlf$zFO42^8>EZX-O zgXgjtD#Xk&uEM(ajW_Q-JYXG6pQsb{HxOspK3jz-X3kYuasXa(sWH^m*9f`E5Ur4%B@T54xfljwT`ASNGW1(Ij6N zY1(Lk)>zgHR6%2?^K6S(Ddj{{ZK`pEjvG2^eyCVGvZKrAX@no685*_ttT|3;pt-rd zpPFd^?MyTE%Vt?UH8#f*CGwVvK9w`f(+6Q=es-Mj*wXRh5aFFAvbKzgTL zolnvE+NEv#qhIJcrd3~lC=*Qw4Vrbn?m&x{)Z~7lakR{8Gkldki$3G!`!AMl(dRcl z(M|48PjEzZ$_ak-_U&i#TRwy?KeqAq!4-6Qjc>NHG(@)pXZBI&Z|LmsANOcFiFV~Q z2FX-Ow8fX4l0SbHt;#R9DGr*UdDDfYk<+7SDtN7RBbWv)53e{sx1T_>K2vI+_a!tw zk9E=dz5%sf8Jx*W+d$IEe)J=T3k~xZuc>ZXi~6T#MwCKd(Ci`-U#&@=&nNGS9j>OK zm2RiP8P`U%)Z9MEv)vyZ+ZW>sn)A@U*)Z<>-YtXu>B?2b)$jGtm|>zP*Qb8sjr*tE*_MjNW_vIuF|X!>;~3 zZ~^Tc=T6u}7ofG4C7n8!3r&HyFJx}pg{HN;U2cUoq0XlAqV7WlGzol1NoNq+i7QDq zr>a4UweKF=$&E&Hui*-{nKRu>l zdK8WAdBd9b9-xV1!b2^m9!*TF`YC~XP#^U|N8*POy3(2jHcNz}6V*zNL zeKjKEIE|)rA9krD{fBLL%G#pXY!2thkIJNjB`g-0L@3Op(p4I-oo}-HB zV;UZ1;?hL#!F6)%@1Bw8Rl}I4>k?XehQr>PP@=<6(dUMi+aFWkaO$BogZk5T z?O=4sHf%9=JxgA<%k=W1H_(#Eypefl7}~s)5;u=0pl#Y>ZQyYMG>k0YkBmNm%H3+x z1}^hxo}uL$9d$y}-aAKPI#|%&sCIic|1CN;7V4RJhN6}4)Xxe|Wi+$42m8@Qkp1FI zqjT>Sv{=6DxXUMu7IWV1GL4jIE%KY$8xW5c9Z3&At3I?4p`ZAdV$gCh%}<~83EBll zUQ>NaK*ObHk2eMELxZFDi^#yOsP2j_%<)r0sZGIArolcGUX_+tt?Ea0OKB2+!A?{> zGu5#ZO+m}?Hq!%-TTo#=Hn@4mR*;x@qp5r3k^Jd^ug1U`5Edrd?H9kJ?(h!J@v5U} zx~|bzQy_!fn)odDmYXOY)lZDxvj~#Kg4E|$ZIG%in1}RyLj^}xacW^YN*nq8KkOvO z`$UeuOxIA9&{^{xuDS|h`S38;oeES?t{jz}P$sVv%GyNfL=;Nybu;l(N3*7vT0H=%cbxkyDzibHe7pbFfH{gg zOy6ernxKfSRM_wM1Zo|eIA>gSQ2SQg*kPR-io|1GR~Of#bkqD}kG7x4(_+Xc-ejSX z@4%NVS2@D!`A?xUG$f?Br&Awsib8hGCPOafW@Pwv9p3w`8CfxQKHn`|P<7c)GL2jZ zReA}@ol;Uloy(QWAKurYu5V2fTWl_BZ^jBxh1^GdS8{~s%rMHUv_^i=&ZA1yUYtXy z2Q`r;S0<>l$@B6xUiU27ANErHu($n%@`>+G+mHF7u((L?5o0WB3ffLah}NM*E;3SD z#}dVItJM3_?jk?Xpxh_q1PXYRW4guHqb$pQdq`mqvVYxmY)Xzqjm>S##vd-id(%b?KAp87<1_@8QdoCTQdp^oe^kUqP)TLaRn_~_Zn3N@}jxO zN%Op>1X?acy}Wvn6Imw{f|wackgGSt*JNCQ@D71*Ph8xP^c)t?f)ak?coWKrS07zb z#GvGw9I+ooMOT-d87xu4QhK{vvJ+*`Eyb7qs8uU%-7cwwil;h9+@Ca{`g(Pa`nz6~(wy`3yIhUN8{NI? zZ<|s3SleMHOdr+hC!$o&??R=G0Y`T?fqI&PZ>g^(P@+I#8PF_s`R9m)nQ>(2j3MaKPG2NjELQC(?XE!A0xf=_97lJzmj@ws`b>(N7Gdt5EN$RmXM z>z-jHaptH$6loFL^&ZiorNuh+574;(IiG#cH0m;X{7;w*qhU%c#NXBr2^(6EIJIm; zd5!mn1D)2W))9Pm=f+-Ct*sp4=lY2nmX^g|bO+El=$5=)RSqP^+)Hv-$I;~6=ookR zE1K=+-d*N(MiE?R;Z;=eYTtPI+`{~U-aKNg8Vl&EaP8{QCMN1R(kRcQm0Qny7(d z6i1pJDA0XO&cpqGXYBGNLu{A1^D#CYf&OqfHjn6J#ay$#YVftCt6=fCYvtG%xpmclBtecSmiY+_o z_$dWY?l^Pa&R8Cm0y~|3Ojl4=H#>gjXC_MK7Qb&W(L|Md(ENbsFse=nt@*N)j8xXk zr`gwTCa>%EJxezR&~QB7v{Xd_b-%bHZVC^hkebgoF2n;ZB`tE)@p@>!VCsFZQyr~4 zo;^DxZHh8lf1zFPw}2!sy)oMSI~pPmxJ!LMjOH@$M!WoDsK^#?b%Q!8<|ry^vwTp& zz7jrExPXda9nVopden^D{q($h8l+*xO<#<(Q3F;goAbL-X;u6EsW91}Dfu?v%uYh{ z?njOnUgV?I;fvvN96PEWeeyKFLe6WyKe-nxn2M@;O_A4JSIBj$+k@!#aul1Ny1erJ zB+7Z{n6~!PqIl|YIsXe^RM85~s!e`CHGTansrQzss8V{JM9u>$9^Bt$$;yqo0j^6* zp5-XN(emJh>^U^PVrrJoH9*4+PN&`5LLj#S&BTjO@R4*Ky6eve-ce&_m z6WuyA3Y@!;#>bAD19vrf*A1aoZ+TT&PYTt(t4Y<%;i#>tR7haGgVquAp%X#RP;}pY zao5aysy=F72XSB0}s{&a3&Ixz`_M|0_X9OpqwJT5>V@C=PoD{*b+im1Ij z^+m2~5e+9q9AzWo!p`eVs-Ad`UU6*pDL7tG$xnxPD`T?nB%|!3eZAl<--!T|lE7d*YQL zX0%*fH*Ku@6DjAssJWM;QGCVJYTm66<+@dYY6DBZ<0i4TN=4ZLRM^t|=pDU=N{I)z znJ$GQzMHG5NxKL|QX_I_XmwHTbg5av<`Bv}DWbWzje~UYg88cpd(kM7cc=QXIU0jM z+*F|=+aY{rmQqt4^}EJ<2OfukbV}cUbqz1-o+g;H+$G1+(oZ@LlM<+C&b|DO%Lx^0 zzfIcdXN&=#291*0DuZI%)Q{-!4>D zgghUP9NCkF>dVK6-6zk3 zwBf=pUYtR3?LyTPJ_A(bUU=B4F^igvbN4i-FQ6tczpXIg0;=Zt2b=14pjzTp#V|TW(XvTr`R&XsPTR5`Vcl$KdtVhl5!%WNG zswm$0usn13W>ns2<2Zf-Ta2aCNH36M>Dg4EIW~|9@Tg(K8i@$c!-1G+fGk8lKoCkEG7%<6{g|MA*y+uGYOj;4e_ecWih9KA!#$Igcd} z@7}f?mtxI@-rGy@Ngtev(BmaUctZ$cZnb*JUmqsyTA80({D?r*saKtB!J^1VTaDpW zF(T~#o5Oq@Jw!C81*^-)Er^}jkX)(om`Ey5-*?Mciil4ziLO(WB2qhzg+jPoiKHrn z)a0WpL~JEpFa_fzf`fN%4A3p=!5`841DQ>P6PGmq-Q=TV{@(_`QWjZ4@ZX)R-TSfSu9wI`KNrn3pE26$n_u7vf zCemLH?Cupm0Gnpsg&~bS#LL_q#zB>ru(1#Is5D6<;=V2jtZkVme5g;`oRwTh#0|OS zJDUU(sX0+~cz+m18}fLB#vdTfwA@%oBnF8FKeG+%AHn;HbBV}-e8R%)?Dfln3ao7h^ zaI0c;RCGxr?z&a14)3QxQbcR^{$00`OndNE{KrT{8c@+Zt0^Z6MY9flN&SfgiZd>! z?6U~N%;4poP){Nt?{%4n=oI{PSmta>DTrIoYLz#zO%NgPpWEg*7ZAY-0~9`U9PoTe zRC7JsKm=`gf9CokLA;TgY#06}OGFqL2eNWsBb;Nm$y292CyMHYD`urci4f&Or zgvLK~EWbKL6kNQ0wro!lvS`kzXzATYe5~d3lRvwO7XUXv$iE2_1BSb{5Miq~TpcN{ z5a}sgCl^;05v|GMUOAq@+e09&T#}4qF{rqUd>}w)bG5boyc00KG<+rwn zwi9M4Goe>5QsR}Lsp~+EF5%Jac`=nY3)XGp4}B*t5dKdM3oniAA{04a@b6B@A_Bjh zw0*UIHv$Ff_1Rlh5G`o(=1k}yq7RfOWN0`Nt~|vLGqo=gxx8oiB0LolG^)F6Ohtik zQ;RmY9z6wboy@G3ZHz>qIqRj?v-gRJA>q#{(+$XW^>8)v3`9!Zvke#T{6JiHv>AQN zQN%dXYfFoEAd8b>=e7=~c0EpRd7V0Z$y=Ib}IxB&Pl`7t};f5O&3r0U9`go3+ndulY&TT57;H4H2pgc z>8&#N79E9My7lItM}^?MZQ=WaOIdI;U*EU)2{oa!oAAh(dO;YP)U+{Fk^L~t_!p1k z5<=%(4U3m85F~kV=XK#FB%VLOBhbW3ykPaw(b_*jBu$<2xHITPyl>`JT6pdZ!%Jdz zFD?ck$}sBr$2|-PN|jQb6$g>_+VAaSSsEfn>B^FNl`Rpz+vdo&G#T>xidME+r%k*W zeRv>he-H8YeP-=F>og+K`R8%DHDP$hTJyrig`RNBPzXrh$^6cbfLL`vlCt^akE zC{nj`x$doq+a+baAID~hAhYe#Uqz@0G12-MRdH+Lg)_6}`*TBZ8ce;&r6mPzn(S*f zX7>=ZcfdGTqL(OgGIn?5S0~aZ_4yf{bBJK8nRrX%2&D7u=k+$BLu&F$i_L*FykvZO zwrbB;^w|oi=6nA@_l;cr5k7Tv@jF@YUb}++Wj2}7Gr|~TJhQM(IU7Cqzcb6oGGWk@ z_mH%%9l54P`>Kl~f;uF!Q+0A*MGMLO}Pi`C$#lU0)gUaS> z=rp&qRlKW&UjD*&>>LB=e|}^qFJBRQ>FRjU-G#o~Vp?(6Ul`mTc(CH56?(buVbLWK z-TjY?FY1!ef8^8a@vaecs_8$M30p$HgpJXu(`(S{mE5~8^Cbq(3!&++LthoxGyKV}u^?9)c;_oQd~^?NYXcfjdcp*H$j=M8v` zhR_?ysQoEP4IbG35O-;}i4<`PELZe?*>#SM}i^&!V?JzC&A22<;7FQbx)3=vqEcpVb#jo{yFI zRkk^FG57Bp7E{O2h^_M)4q5aWJE#44LyO)WvV2PwztD4uw``I;7G2U0!$}+8VCbHz zjnw!N44gB`_DdT^|BGd>cTZW+Ln-`ZOW`U84$-K;OVmQQly=RFLUFWmHm1(kt70fI z%7I>;2gAnE;|vO$(eLlRbhG^m29rV$H3{rR7tO2vOq;%-=cD^oT2&GBJykkUE0lxY zb04+#q`kv{+J3f#?lkmN@NHaT%)mfF+CpsD3G~ZfJYZk+G(Q&?la0Y?=7RU{gUI?!d$P{V zV4&}26>Xh826fKPd|5Atwx90IZ0fTZDd}ELn4G|nq^F$PH*O5ph4gRqEkMsoq=Kh@ z4f=1|m)zp*!a&8)7oWpI7&Lu8NSkMj!8?4J{;b{@&U8ySCHWE^UNu&yG)mBamr(ERhx00!I+6LqiH&?iWpV3~aeeL5S-TW~Q3Pe}~t zil?GSQL>r2O$t4pgHM@8z0l_!`1I_NUi3^k&R*L+i^1jZma9fx7_z@2r2J()25!Nr zq|gxk4%Egs63Wo;^8T|VFCY5%&6xgBT8E*-hefYB8Dm(dxl1o|5F>5dGuU#NFiKH* z(p9V-LzzBtu{GA{@PB4uV^WF^U#qJCJYCb^#)z*9y%n|JGvCG%O{J6Q zKbCiNj-w1i59~8*J=UWKYui~QZlnF(nRN#}MbPc?N;u3ff$Sf=)7(1!7#Q5`P!Z&h zL8^;=x@+ywZ&&m^!1*xxf^)Al#K@ul6tnZ82wHTz-gQX6&Vqrqk`~bow=hr>ecpca zYx4ZbNM2x~$(kvZ)79I5x z*JaRiFl_jE3^~r3u77-ehX{HbZ>mL}O-3K{q5W|$$$ll_bZsSg7X}*r3(GR~(VkQ? zpT9)~ZJowqn#;d- zL(U4j&uZBYv?K{y2+6%hlim$$qa%7Kze-~eBl#HBXTDCXX%|N$WlPlCmk&{$n7U)X zju^SFMvp3aTuP-rbBzywM#-rH@;qnpGz(Q!5vwU`Ej% z8(Xw~S}Qf6l8%-t>An+;mr*%0d_Dd|F$zsj`Z&F+Kz;X|oITxX)Gxlg?tEw?YEu~X zWdt-(#NQ|4{X7j-y|;|cYYBm5)f2n7eg~3k_f)ZdWk+18=1O{1ByvBmD?b>PgQCK9 zd(=Y|k$=}UaJAeU09D%Np2xJ;qFUO4W>rH5DN`@ao_e1_=9aWrc~T_OS7#m+ z7M(-W zXqzBZt0_3iiQ>-hQMp3sgBA^hV|Om*SAtI1}hYw7#Es98qJ^q!%%H=d}rXA4`G778NFmuelMk6h^^ zOx_zVgT$@9YUb668bRe$hGsPs-ln~!I(!jLYfYrKgx^4otf-ip-W^nx%kN) zZhdAu%TRSEW<&0jF{%{%*FSksi*nNwGC%pcP;%p?(qjWx)Q?wPO~@so+?s0T+D0W5 zsj~TRy0!?Ctvbi?3+yP*80OxxR|%z^Puo_La!|H)Q*~KO9dh1M(ox>DL;cfJ(U**s zKzc3cye%pYRRTLVZZ%m!&BryRY{`nKGi_j<8Q6oOVmX=Pq*Bx}X0T8HY6D3sFfv_g z618U&j)`vPLZNiWWns%ND4`6mN_p@VMK@o*l%Q8e=~Y@jIazuXomRISw(&siXWB0> zX_`Ue*|PPrmI3NlSvuzZrcrNI>Sedf`ZsQnJ}iak=wKXitR)>Lpyb7|ngraGZF&hK}r? zQ=jET#@kR+FFG-#b_#Xcbo-0Xo<_--o{rBc2b8Mn-K%OAMD@BF`?=klP`5MCeuXeY zJ%z+Yn+AO}N^X(dYS@A1w;%TF#BqVNQ?cq31uM!W+#(Cw$I0texm{6z zK-uvfTR*?1Ko*@)`z5WPDA2jkxVYI0)th^H^1t?>P-O7TEtUcl1Z8Z>NTVj#ZwBHN z9*>c`=B6+8iA+?;uU9;&>5Eh<_q1E&`HAnbvf4h`filhq$}B}kQ59Wc78A;jMswC) zU+ra7CS0%N+7yi9gJp}|UfWP)J260e%^8IWcW=(#RY9?ubxfJ)3d)s^KmFowh;r7j zwa>@pQE@Re>6+R)RDbK#uI6_~iHPvAhRa&0%Uk|6$C1jSYb=?SDd)K>3i?Q!$Vxx1Ap{wBDCIz1lAg^VW-oVkX`x7><>?AMUqyEbk2 zIb{STXdCW4>w#?HaJM-pT_SQz@e5amImFVeZb^+bAVRt%9&w4}B1`Mtu-9o{5IoV9 z5*rE-XklQeO6`c4#7{Agtga$eL!Y^sixW}VyPRb$Op$Sf?OjMyK3pv9?Je~A5l5Zb z#J`>giTBStym2c<`jxkIQ_B5>jWW$HBf$^I(al&KwaP%=nbSU}7P$~BW21bwYAZ^P z?P>SFm4%zH<3e7U^q}Z-e(Tj39+YIP?f#ZyhT_-ZSw1jE^C~8veL(UQOWeEW zaHQp?TTSiwiLB4fV#+VwQM!q>Lm@>B#C#i_>+DA&YFlJg4_6S<8_SjS=K_(_#@M|h z+Y#Q2+oVhPP$B$5FJ*w64g-Z`Dj`kHTj=h11X4dfucD(lK-gX~YT(kRN3ko_#x1iSQ8;vJ z(_QnM_~85E$Z7s!I8U%Ch3m}0@}#_Bo+dXrP6!FhRd*q+N%%sP%5h}hHMgdp;3tBP zC#|<>U_{W*=UjKmb$9i#m}N;`AtG6yP3Y`S9>knn;*RAkMtc9oLW}ZMWHUYd6nBsh z35!%64Q$-V`|NV9i&g=to0P78+;63xV(2s#`foH#3_X0})%##|`K*0&ut-O`#*`3w*%z&%!VCYs2uFj_e^0V3(< z&3bkk1r%(#dS;tuDYCnIvR4Di>nQrdF`-Mb$T;(JEO}=Kavz>v%g)G&VArlI*Rg_E z^~_RdSazaFwEThgwNaF*cl7t<(ErAz8*WQ2I0+EmKlfx=j$J1_8=S=W->njXhk`R2 z!;itgYTx+!bPZ(N({Ns%ltP+8Mp7V^-0%2Js$h#yqBU|-k}kzDUPqE3^Em~cN)#+n z`R%>Pg2L_Z@0@B{M1t5^W~ZWcNGfN1_0oL|MfaYr>pB&Tn2o1GZ`|fW!Q7GIrZ0Rj zj%sqw^^_o@{9Wr7p9aI`?2pQ!s42qz8^w!W_H5)e&L7LRj6tl1Vh8JSJ|x<=&WFmR zBI?)e@`itsqa;O)nvSvb(GRILBe=^rN!5F3VjMtuA zwn5P~2knD}eF%Rfsq{_i67r1gzOWmdfW708r&7NQa%5iSudf$GO!Z6kmnr8Fv(7}( zI_x^UWmWfH7wklmena&4XO!gi?|ilDN)3vbmpuCP)lkfQj7_aB10}?xm*lN_V&$4OTRuqqOd|rNTXCLLl%;gZ&052I7B3r z=e9U8&l2%{me(VEh7ludq(tw^2*O-&YiD;H3I$jLJP+t1tJzOd(wPP+k55{kKf;D= ziW!gUH}r^lV`%(xXC?xu2er3tW`NgZ&u6nWQpkB3HE=$B1sON$UmrVbfWnl|;+3>t zQR=W-ue^UJQdwzl;~aQHfxYn8~rewZ7&Kgx!dU%*rSZ6m1`sW zW)yq8?kWfPQhbs9ws|LRydY^Zkd?5fNo7eOCMx^lJ*v7Rsxja@*c220s^+NpB|| zIyFnU%28P@n*Bg!YxrF~&RlYR@J3fjsvl*+RQIxd$#HPUNukaQ49Iz9=gq-cg?#IE zv3h4C@cv-7!TT9jc-iPbJMPwvu&0dHW;)qO^L6FFT*!mi%(a&Kd3{K7epkZRk_~^Y z^IN1haH5o7b?xvmF9h@bY-(2gfJo+LC&HB(k(zWeE1A0x8P2VG@0l5*R7LLCt$ahm z8;(~6$3w~cI4@HvE7@=R%r6=8T}MLyOx9K3SBUpwNi=rKLiUbJ>~3T9@byuO{-wZ( zbnZ6q=x^jW8tOKDP>g>hg8bG zZD^f?TPp2k{9nf}ye}J&QQ9jcbcN$OV3`$%Cj0u%TY@AzzNw7E+%W(Y?6=E+> z^c)gRh8L5W+#<6Y9@yWJ(;k&ZB^`lSFD*nFUV0NrTaF-wdnfl={6c`CAl2JJ8$w^7 zBV$9k0%0gadk{4#$RW?wJ?(0wCEZo;JnJ^-ivde(?n8G zb0S-1E6O}K*RWj*LWz_{TIssONJgnet+6+f+pc~2dXEc{v~xrNeGqakn0s(D>La}& zS^WEcb;MhZpPT4fKnYXu(|qno6fW&BY8|CQrFh%vwP$8PGN`bw9_~VIqAbt&x&>6J z2Oqcj@;~PJbKj!1Ap&)Be${V_M&=$?=FGYl1hjfDaBfOKYA-W;n<+W2TwXfL^)3KO zTfM8R9B(46h2fC!Ob#;EG-nUJUXKD&VqC7RC{ji1J zN5;pp-693d$ZYPLWvP6QWSjW4pQOT3wC2z{Ew1OtJe|9zZTEYGRe9a`I`$s7nKjk< zMGXiI@m8nF#Y4aG_03EPEaaU!hggWVo5(2&owpQp>ELXsq-H^+{7q!&sbZa$-m zblcB_{nah7AMKWp2%ABcGrLRZTpCips^!gUN1=GZtBlnl1|RbGefIXPAS`sv$9XTQ zz}bH0gTTuW#9s``c7FOC1^$X0nzd~x-rts?acK|YGtF!c$5A1-{_DO1O%n1JPnYmr z{eq&t`QUw;6v&pN-T1V)9jUygLc+Z@$P+gyyd&0*T+!0W{W50Ar=OMHwX%X7@7J6T znX)KM;t5|2)Irfvg#y_EOH>az@XNN+BFc->byLnVGM1i7-89&TbeH_1dcG?NcN`CC zY4Af7=NkQwDisKgQi#iC$meFdMy31qzw zT67b9j^aJ5lA60$QNVN2ywZvT>8A2>cCnl&l-`(``Yx z>gwDPm?9BD_m}QGPst}jEBWqda|NLA4AtOF+jk;)+gko`ZA&7WUF~X1$sr;jF44xm zm<>J&krU$YZo?zp&))Tw2cjPzKC#1dl1Os2A@#98BRoo+6u0%bA>lJaWFg}sa-a5@ zl?2)l?+l(CW^<1vte$PB7mL40eAqV^=5)b@2)!@RQ}xq;NT92Kbmn>nqJ~X-b$4jP zV{LgxgVX@w`O@CgKIp_CpfuT96Z= z$tq$VfYkn^gPu3ak-5!0J9b(FaqB|WRWyzubjnvKyu=ZqG+MjMw}c?i`V0T~r+(z_ zYvFjaE*+6qP2|LI6%lH(A4l7%5LLkOL_MDx>6L>6Gu*kz>8<#(M7xOmU;(PcwjrcH zib!KLY9~AwiE3u?5#;PK2#b?Cg(#WB8m*BYvPJDf(Eu6O&8cr*bg^S-Y&g`LX!-NoBhSe_~q#3cXlsf zZ{v7oy-PU~v^TtBwiQE^k=kH9IbX;qee*8tJv*|MBx>uv`67Ppp(qMVK@{xWD9x<7 zhzRep*zcWLh&&dVz%iAHWVwW!u}^vldkgsk{aiZ`bJO5u>mzw0RPSc)%=$^fO;Yao z@r~kyu|%nJnprQbAFI4~xMdBWOOs+F`638nXK{P~HIInw2;l9itt3(tbk2ra8zJ;d zTxADW3j7`he+oJA2yyR4iPo482p$b79vkK$!je1U^Qzp5xS?*jXe$f&Y&E{Hw`K%7 zW+!52eHMuz8MCkgetII@&v2_+f-3P&#p0+KA0twv9ks@IcoCG4Z*F+g1i_z=d(f1= zMu>lZV6Sk4T+>=JP3%(nG1@8^RL1P@k}D zdu+uk-H*aC(&GLsa{T5oJhm%!56oP5jOLs+AZ%^w4rOR>K$;ufLr-}}!h^JIN7WvM z#El$s=@%X%;Rt(ZI>Qvw_Y1j~6gwkEZh^Y|`V%C%75T54s39n@@8f!l=kW2TD=kd( zM38xKa`nCeq`jE;(6Np|x|_f*?UU4xWzrE6mXFHzzB?D$z1LsVTTzvz5Y7nOZSukz0;p{#Izi0}9;n!={+1%!5^ zDNXH+y3$=VH~Dj(3l~94W!n*T7->!W}ZqIMQni~pI_Lg(Z zJB7w(3q!i6HmEJ=T6gNWEb4tXjf_WjqxxZh^?ScFAiep_rZmQm=86fOoHGNcw6R}n zIc^o$#OS0&M?C=?;@TZu}xIz}U=i>SYNTCAc$2hFCwkJ^SaP}vsr zj?v;Qa(@)BE!MC=F+;#E4sI!QS}+HRy4s>eL}b%ko})6N^dusOHg(iYYGvsemSOSf&6qhS9x3@jR%#ynX+WRu*c? z+s72sr%|gNvTy0}0GcY^p1=6vJQ_nXuT=#(qVclLx1fFIs8_tQwerC{NVpL`h7OQu zlpZ_pGX<&poq8bZYg_C~+L%ESe~_SWsffzsYJSq`YN!`K{aXEC59;_+UGp8n(89@?xs#JT zpFW%257H~6u7scQ$4|0fsPuCiihM*v?#*k$O}9akI>I@j%z#GqUC&l19)LvGwM&%3 z6Af;Kw8pn)P?l>~*1M4pjW2ylxE$nAS45@s?wU24p9%N#PTxh-k3;OHxmQthxpSS# z3@=E1FAc^sl+cu8ta5Wo9wnPDUw^}R4#hucgGQ(yqG;h^bJXiF6ir{zo4><>#z)_$ z&wWlo&F=krQ#rXP@eF*$JGX?UH!#YT{D6wnTRx3PFrqDxg|0rT(wbrs?L5A#CUYB5R_#(V7kC$?li}(oC2~;F z7hIJv<$T=3G_dk10n$ilTdc-HkjyQa+bcb3UR`My-9Xd@Pz4ZEVXIj8J=Aa1);h z^Y6I)oWbkJ4g<7pVL18n#}ib4891MMR2HofcDIi2dy2-RKS$$sJw`R>aOOVQ2WULg zB&uVQkGkxrd$$$He%+;FXjxK>def(=40rudzr~X(mvSEU{yltc(|geDGxLByqZ*`D zr-W>0Y1Gb=#wAA@L8=vS+;I0k8edrSdgyDTR(Wt^F10>dZg9N$M0XEu`wiL;JkLiH z{Wi;WQQJ`3V%)XUts8Y*^d;JzE@)D|PVJSPiCT)+_0=4#XnUX-_?=n=CBhCHZcr|x zZgwo;m-!efzpMXB*eHz#_nqg9?0=$!=c9OIFo6~gzb)Ht(xaAZhV_^GMpRwpHu^Lf zfT|RUOD$uE(I8y<=GA9Oa@;ecXF8{a+PV#A7F?3iZW#7SPIDQg+rIK@jB;o`<0@fy zQxHv08h+g6ut0;=RFBia8Z^E-Rn9c857HHG8ojQ0G;;Zm48}bKshM#TI5|+2c`ZpV zR|}2VxwDm=kI^`Dz&u9$K3U%z7rN47^15eKUFva1ZKsI!S%xY!-Qv0A@Nft6qV%+Q zG~`fra&H_%WHai$AM-6y%AvYw_v)ztB~)0ys-oaGM6JDioY}@g)F=zr|D=}%X(d8! zryC1MZeFdg>jY4C?O@S$gUu-0;&(wUJ`aUY?*!b4Splid$tc^y6OFeTAOC!?0~P(H zyLPH`qmK0p?_Eh16n_i8a{j_I5Zsp=b=KcQwdqgxtf5>K340ws`coeD7brMs5(0w2&+b?{1=7UCo2Ax5+GE`N^@^4u221$g5d5891lr{L&#lHsX z=Q?N3ttYR;$;T?+JkFtv^uZ}msty&Rf>)x?_JgF8pdqJ_h{EtYa+xQmQ4s9i(sZ*4 z#0~G;9a;h?$|{dH8%;vZc7xn!&60Qi% zp>d*)$xZnlO4m+BGi+5y{X5(ub&8|>&~(h}K58^r9;zwIJBb=6^R<*^MyUE`d?stI z7}b3{Lw39?LCwjS1hp7Nke+PdTVjerMSjDcE|nP6kSGj4&R3&6?6cVOeT%3`v{5yT z&qrm?+ye_uS2VCNQZBFEjq(F`x5l#GM%jmflpC(=k=tvwrsFXe8ra1zm9>SS!lg)d zNVf#l{6={eYr8;l^?8#L%}5@%z;C?2)}x*>{g|X)2ddMzUQp$oMfs_G>#H>mAXybE zH(cRFrN)(6i6OFIM>Gq&WKg2eJg@3~A0H};ZoCVy9Y^h!mN%bY45KFdj0)%XFw{C* z7SWlUL%n2~BF$noYKwn;FI;+#N)x(>Z&J*t=l45sYFQ6er&wr`{Yj|4;CyTB>Lrwz z3`C5ql}43@#zXUK6eu6uXM1wC9wlG6-5$vIApia)*?z?`G@Q8c&`vW6wbYyE<}Jig zcIG_C?EO9Db-b@zqoDy+gQLN@1yZQXQ%xFQ>_Y~P-212R#8K+lRJvBo0L7J2oTm(F zQ0C=fTX@wN)$t+clwHX4{+&_RZeJ}5jRSclX_!!dB77p)a~ytz(qpEvc@&CIU+DPZ zj8YAU@PfdND3vLiM&mCO?){R(yIv9bBxZh-d?Aoxt04H*54D*aK3@YhYHuyL_>Je2 z^NpA{+DG(It>|&1>`@6hFF3p}_Yf;;Wbeef`*)xw^rvd*eos_ycf59sZx*%vc7{7+ z_)wn1(~?v991Y%<+;eG~s2kfnnDna_jj9`OHtH#$ZsR)6w(0^je%ibL?4$xnf-Aw< zB^OZp=3V)S6?xxuouoOYPL1MMo9~oV-$LolpPK0<-^lyGs{TD&VU+*6N_^dS426C2 z_CsUss5|R3uXKVEq@u6=oofP6x2~BhE7u&=DTRkck1hNMlV(4zP>|yov-axGulG=y zcz0As=nZN`A3yIcH$e?rmb~g{P|hPl3c4MIvh`Gq_HskNDeQJL?wjb3c;SOuQs-xDY?^(0& zJ#xSO`MaAhp#8n-!*9W7(P)^m?d?HwTs5GVSF$F@)hwx%6OwCCablipZ^|VSu zeJaYRalDuQA+rG`GiM98>bax7E6;Jr^ArmG*C*cE_6p_Mqz6^o#!)U*Det>XLVfr0 zv5Lk#}J;ofVz>Vtn6Ct%lyHRnw z&fb`r4i%d`DwR3wP%V-oQ1d|pHGIjW*j_diC1<=hV)j4{L$FKdgaj&dYRB3wWKi93 zJV@Ay9t~2pex%FY5Iw7$RmKSqq=S$ZbSbL>huksF_xK*zUtu)nIfLJk zj~LBb{PsYG4Wr*E1t-XHV|Y{i%V(NB7k!c#RRY)%#rOSs3$h2-_i6hq2c&MK;kfn5gE|GrIi)LzW9$ zy$;o5EU1jD^uR3)Cz%yoi+9K9ott|UJhx(aHdp_UE+0lrEoe14wJ?^%$-o?6hVfBV z{aOi6jIEVlr0!|M@Hf5C4@*uM*}CT5p`LyWpXgY7c!dU|W2bU8BpNXM(Zh1LG95-7 z{14A9OJRgrWAF@pG$!JVk2~GGf{{m5k^AM&V>nMu;j+CdM(P|ty|;D2#2^iCD2Fm8 z2B@soT`$0x+0Ce>2X`@|8BsYZqK%Qg<-@sm?qEn~ZGhgXwHWEu`?2QGK8&rik+WW& z!pO;2-BFvCG3;_gS-xZsMsyV`2<|%=Q>jw9Tf>1dn#=_cDtZjHM#Zc@p@-2MX$Ptm z$n#5oXD4;@0gMhb@TzX#gt0x=r@VV-F!a4+S4M0nM#?s*O|DPFaA~jVo9K5K4{()j z*)WQc+%-8d-TW9oY~MigZo$~C?rTR=BQbh`YrV^JBaEFBwq`L=#>mEr9eJn7;}ta= z*O8-&QO;40#NKxp?f7clbx#N*ytF|)YPuLxF14q;EQ#SCtd#x%Nf_DLDh>%&4E3m4 z_=c5XCQrll+2byZ@ia01qzc8DuFM|ZjRP37^`lIt;K0b!3TNIE>==6^cchS1hEcV& zph6ipjNIAtL@c!%;~~PHO)-*~5DdK#Q)7TJQ-fu9_DYNyDjvTwL$=c){MR1C7K|Ph ziK0t+g0cMNoB>_39YG_v+}UqqTv7G@lX?S;iWZ8MU3retiEekw6gP}L&*VQycO2s; z;lXl;D=}(+L4UV|8^%))tUq-98b$(CG6%@@`zX!pu;Am@F}_>3%qz4SW6rr9Lou8f zlVkoNDZK|{XJQZ0RAyr&@xXCT-*gNYtLU-mJtL2=qsW=8Aq-FKI2onFfMNRt7H^fO zWIkt9Ty`B}52uqO+sWg2)oFdo#taNgZ0vb6P4>$U9_LoZ7Z~3v6<+Cj1LHC!M@pW5 zAo~gNjq=GF3@bEX_Jn9K!~tw`L)R(YKPHWuMDnEX&2LOtb2QTHF_rdU>nUif?^6z+bL6*y5(E+1_f@@s3=`p5n~hRs!O%AC zXM&7#n0PlBwvR>#!v{+g__xMk(6;bgwXq3CR7Z%ocMBLk#An;5dl-|xC%6rjMKJOu zHCRH%3d6y-Sr6ZK!{}?v-py;1Fn&i#G1IOWW0AY*gI^xRnBZpZ!0&}q>93gb#EpR*KQ z$@B3-IrRV~CXa-72+xt%En808eOhk}YnE>Fx~?P#2P~}Df3Z!L%%*Ix&&6J3??yggn~=VJQG7%x&yu~ z<{0bk95IpHhw+OuOq??Q7=7on$oqe_cOCFly>A=|k+hR2+DV8)L(fg6q0p8{$}F3t zC`o&eh?0t~L}c%9uD$mrqpT#+r0M_m`$fX#UM}kQzu(X2{T$~V&+~nsbu3k6!H*G@Zbf`VJ0RVp_ffPw(VG|yl|$T4f&92mVB z@@)5edRr$!VMfKm+EbSxH^(u8pzQ-W;_*T>i`Sv&Zr`YWM0pT;P*@GcZKo=ko` z%?nD|mwOl~dqdHAKEEZ7PoStoY$bR4Hz@hKIDGTUMksRr>d zrhoWCfIPL4GP5>2LxF|&T1$}}D3aQnec9mxCS_K?PFV$b)P^XSJ8VGYzY)k6XiWFBL_JxjH{&W4@1r)89AC+Hjw+uzIEdS z^jsKa5`N$c21VRU#%&IG1iAL(7d$yw2l+QNa#~I(LN23_D#ODR$g^T%$hq+t@++f? zCV1CDcJWB2uStucz%)%dPGV3uCb6K zvfMx>H5GC)375p@@ZSE@DdYuCYi$u&1bLG=+jw-@Am2V@oJ7KN z$bWCU|Gl*sWZ5|#e($pv3O9|9XFPuhiugU&l}H3ZQSJ1vd0I!I^dQ8n4So+f@qCrW z0h1wngn6l%ycpyq)D&ckSwo&_PMpH(Y$#!;|1SUOK9n#Y-gy1P4#>SCoy6N*i{hdB zmDKppP?&8tJ>A6$@}?!#9SbOcyfN3U-qF2)+>46BnLKMCSD*Xj+j-oOvx9yoqoge4 zF9`l@MZXua#tY}nmra3Or_!(n(dm%8Ve9k&&wR)|wKr*hUJ_&!`5xKNGaK^qEzffY zG(w&$kHYT29LOaIe!!jeMf*?P`GyE;`=R)Bf=hb7%8W7)ubZ1!^Aa8Ys+^MtdQ0QC4 z$(Z{H3j77Du*@k?nDV)mj%zaHop$nMdAzWG_A-9N8-F-(E zZzzyTd$g7<7xG?MXSj>c zfvh+31RbSysJC&4g9pn zH*d^43;rYC(ln250{3O&C!H+z0fAJ77n;6KSC=<2R42su>5-FhPl zLZIla2%{hb&vTtAVZ#bhw!8BkcN#)~rrbj7$qo?ar6^>$F=CvPFhx-z#+peBaP~!R0gfy?);ykk$a9 zW#1dE-!FkM_lL7ncuzpA_59@TRx2S)Z;hGuqR9{-k)L*sAOOCMd+_Vdq5V2bh1|LE z3b3ZU`yAS5;E5YfcY&G$SewA?hWDo+g1LHP1MN--RBu)gt9=JSuM|(2T%8S0xWw~K z(M}N9DE}-zS_=XyFD$TnZwPLC-0zRLAO}G%3SVs`n8B?=c1QE84G^e2`PfX4nc!Pg zKr{KAK0J1L;dNJ|3ZlN#aZWmS0ix<>7EN&w1m}BNX&gq9;Q7{e;hK!;@aWjcS-Z}e zLL|MA;>xuzu;Ybnp)3uDAZFAt#;Azp5Oarh``LI)@N!G5mH6ZjXJ)3BmFI1S&>Zvc z{##4HbM}{_48;u)mE}?+>be1feRl+D8!m>3DJCz9Z*ahq__gznmrjQml{YDKoGrl1 zY@f;bbsHddtkizfg%NN+COB^-8(_<|!}hHnPk^u}Vcts%j{(7H_NZIsh464e#ACu? zZ7{WvS$1#f9!NCtO6Vr*G6UT|x7_=BBMv2!^<; zG_IVJ_JaT0g;^6y1Ry?GO1-rt*!A^|pPU|y zf!l^*wTid&A+T!u<-;LW5Xi)}Um{EbB3QT!rh1Ko$G7zAL{qmz$eI@A*~_)1f61I>yC5PyMc-3c5&~H00wNOPAnXvozDFY?T-h^{Cg|jM z6hAK}3FXj&=h((F*~7kYoAXr0sPp^~WTPm!sy-Wh9Lu;r%j!T#!n5yZ7&n3UH>V;A z%heG1WyPa;p;8c8lNNbkxdcR)S67LcS^^AbeBU z1Ns_$R7Z}zcC+~ok>^Dlb}mr|!kxREqBd3#&gNAAHYgap?DFO>W;_9YZ$<7YzBPeR zMoke0xnl4>Yje@-Mhb+gCm!Vu-U^AMx812x^a78~Std)~D!|!b`{dcUWFYL9ysPqN zJ;bIQT3Uvl)9vI(I#^ zJ^eWhv#Cq5*u}00gs&V;SW6HDZ`|R!XNf0-JM1;RF#8yUy|oPavd;i~=2*-ZFUtcHVSE1!7>9)67TPA>JVK)9kuN z@SM1vhhsbqgwJjpXW_jW-15CO4jak?p(Q1bmv5mCl%O(+Waq9U%eh~9(@73yXpOk?5x1y<}p}+Xs_zrs~@j*?Z*N_ zGaP8&mv_wD__XjC-!oZK`B(^94kd|2~6o&??96wJ4sq(pgj828&j5hzOXSA z%QAVkWTQC&OHP_lJwC}EyFI$d-X{G!(RFUJGE14nOb4t#E<)Pw`4USHkDwhiKfWZ7lAt<`Z|1E0~8=b+oYLfb(InfkjN5 z7>8>Z4USUlV?G)0`_*5bdiAvBT8in3UiqcSGNv4RNIQOBhTADh$?c{m}0PGJE}MF6AwQY%{6nDlr%3E9ySX9-InD24i~_I zKbHCEcQ#VzV;K7>HkP%5nA83l8(0LA`>PjAddDte7<(Iwxa7jIvusR%xnmZ|W6|Gk zM`@SVU~$eZHI3GHFmH7_j@$Tqm`9Z7oC!NLaU-`oBS` z7#2X_tHslpElMaRkKh;YmNL$y<2+H_zTm5}8~EOTGAG^n5T*3=$s=Ne&k|cDPl(}d zS-j@DHKfUYY>;I!0w-slyeZ=g`dlBnsnzUIvh*)`T5c0Av^haskm3nW>nw1soHpBg z=|Qr2g-tCQ88~qZx$7te$eT5u;o>+R2!6L%i04cM5KaWmZ(G^ze{6#fbNG<}Mt-v8 z$Kq2i-n=JGe0-0%)?79|NT(}5FLzHD;^$kg4BO`1r`*&BzRgVcO(1&&pVPq#K8SLv zcP+ZX0;wmD2{yL*Lz)8Xag&kikTKb)`b%mWq|-K?TUf;cF;zVCnpQGFj6^f9eWksLse7D>^Qq#1RWIkCw zt~pg8-9`HRdizz?`EOFJ(M`jbu6DE4GzGDCjq{@sC3wc;BgVWjZ#y9HaoSNYJnHAk(6o7Z3iyD~zwEi<9x_m1GM_uBMGWuKqV{AmEk zip3%vgfkSA=Ow3Q;!x&1P&t^7`=pJ(O+QJIvazo&K&ml z4uEj1oc`J}C8FaOM~mXV#myQ@P6GkldOdFRwxtHc&11NLNiY3!K>V6>w|mCDI^J=9-;*Wvm9hDN3Af9;!?Zmvt&Qa0{|^>0$K9_d zNmV2cHxDZQZeTH+z4@!w9RNR9Pu|k1>HU^NSnz4NuAns~x&2ANuDfp2*1z;}xOqU7 zGZXz(b+O^*@m~cN@X%+{@sV{{z_x0)2c!R5J44*pgbyF=zCvv6D9*%)8b~k>d~jjT zQ;6EmE_UJ}ez^G!7ria9$DS8EXkH1ZXN>#1TT#fyx&T)oq-TjbVuao zus=^jTEebMjv8f%-T8%|aBD1NeOj1{julSvkqI_#3Hydc-57Jh|fFn?!;#0Xe^2K-WO3$4J?$wsaD)GS4`gfrb(HU6Ov)J$KN3UQ`>~l`b zmg2gtck!5+%D{B0-})mhWa~x6$^N@KEO6YsLr!^)ShSG75l^!g<}od2)I$EIe)Gs| z8?VP|JQnl!5_x@ok8!v0sLhgCM`u@5i+B4R8}ltKN!jHtPANUZ4J^gC(xv$RD9pz=@M6>QZuj|E6lNZKb;qcF z%lC^?+FR4G35yI74Em<=5W8)7V++qb#Xi?vzXK9$td8|pFUkDEvuOWmUD?D`8_B&ciLz5qpCi?ZwI38R*zue+d!&ZDh3AZ@vCFuhZ|do zjf1<`!B0AeyZL{p0k(NLi|F`SC??NqEn}TaNMXmhufO-HQSSfw_ig`QfIUn(zcp8f zVtaxPSiSN) zI~B8y2ubFXA^AO7%zNQn&2x8dlBw+M`g@7lAk*; z@8ndWrtFUQc`&c(89w_YWwG$E$2YHhzC^MdFPfN0Mp@=={lOc8uQl+I{JAH1%hv5L zr9OuaH!v4V&7eiuPlie#7+41`Q}QGEdl)g_96mMu)*6cQFpoPUKr87*X}OdFM9wgo z#T(vH_rQbcvdhHsnZwEHzX;5I)3fmH<`lcn94H|CNZ?}K3AW&~#{CGLLchP?3k%!n zs3FI_4I>2juiSNfXU8$}(?0m{ITT`+J-keR<`O*6R_Cmqy_k}F=n3F8I)5ymM`7PH zsTfSah4+cf!AYbZBhsk9Rs~sg2sGjcB7JC@rr)7;FxI z!X7D&-u5&Yanc_il#)#e9mHf2%PnGgM`})Xl|?D^#GjJ#NSWVPd<}NJ`me?JK-LWQ z^?_0tN`H}(BjoU*^!1pMb*(oYr10yB%TUMDP~RW*RO@@=Lu}rk3QG8|uYGsDCibM4 zk}*Vy>mE7$dfH!q@HfT}72QE<9VNAIFk)e#^=dHhQz&;N=CU<^+Z9P;zqO=}z^K>ZuNiH8s$?Q!Yx!1A3El-J|zd7(#d($43-?)UdH+(n^HW<)%!PsoH!y!W`F!J z)HbBVJ}C`SWd6x^>Tmw_cTa;6zr#d(0*@K1t?tiej{J)^Dy;8y!edWSn z>K-Tt%3&z>K&%E(8?{ke&#gD~HBK%DDv#291`7k>In*{EOq|u z*?J({`WvgH%o#|G^p;1Ya_Vhge*;LVC6tg)Lqod!{%|2y7fFdda_TCn90%K`z3J?0 zEhRXSYcFDJDS?5;3c2Hy1|{_MRm&)OZ!r*lRP-O@)X(r`)ChFd?m90vPZOKJH-VPj%CD3!y##q6ID$35Xsm-rCXmXJY7WPFH!I`+6GdNoG%Ti1m@ex4#&utw^yGDKfh1BxYYyK(4PT zf&SQy*q-{sncO((%ie>fx4%06A21ZQ>@Rw&5q}!~WNuXSj-Kj1v9aFz|JE4jZU2;# z+1I>*UJIy=+NiC2``hrhai%5mGdXK}Ti2T(2Wl%)VuiNL+`f1W7S}%k{oMm4Y(i=K zkrI1<8Ysn;l-fwCdiponwMBZDJ`nz}mN^A|7Z zp;M@*PT`(9m$Y{>s~D&%Ya4bF*wG`@tw*?9PludQYFf&M8lA+ncL;Uu5boOXOU4mB zLsg^BGJbXlb?p%D+R-6{MNi`x+M+=xDZjdex_1e8@A@T6*;rRo#i;YHesu|T?-K6b zg=GEi!-<`oprWa!ws-}1hwvW8gnAhh?q#fF598WB)m2&70U=@o!o&tTbd3G!$gV27 z^a~N`7bepGOa4zMca#5nzYvjrVIut<^2c|$zN?0ABSJ(+go%#)($f(Z-Sl)F5h6Mw zOmw6p*4Wzj+YuLw{&n5Yezsrz|5&_x_dkYecl)pIpF8V5@RQ2VfzkhJ`%QRzUuVf< ze)jz?w!QavnJoVZ`)xVvzg@qt{@MBaV%C3_b)ETd=kGJwe$MIW{@tSNT`l_4`0YNK z(#5jGhdYO2`|#9mmL@*ocjtFhg3gvFGS-vk$-jGo$Y{?xCv@^mm!V0&d8p^Xo`p{O z&0{?e_PlaR7Y}v}|Le&~-ExC_zP7TaPW$p{-94QP=S?9V(e(-PU!C{JZX-`#;*YpYb=c-Elt#l@2Hy zs%mNKsJ7qD{L}d(UfWA-yYQ|vSvv+g&1TlrQPDi8Y@};oNb}F#ye$vd}4Bl=^-|+FP?qP?`s{o$G+sS6X_?He}DHkQ2wN@?|R;K-^BEE zjhC+LyY>^~*%yCeJjt~esc}n;FR^$abv?QJ>1$u4<}0PfNj(zdMQ%M9==%QJyDuK3 z^6Ppe*I(rF>Tf=f>xcf1_r;r7-JsOI2Acom##>)`KyJQwl{?UV^~ImmaY|jk`jSg( z9qsRa`g{E$w?6lGAARKqxpkD({3DfrU+emk*VlbVU-gsH{K!3$o6n^3?aM9$-Nyj0 zYdw7W-u?;v_x5KL8Y-xuf(k0Apn?i2sGx$1Aw%EKC^&q4+4mDCJ#hFK;U`)T3~~6J zZx(yYq;UAyGsS|@BIw-V^5s*7IDB;S@fmMk;P9!-is!Dqj>88F9jO@QfWudP(i7sL z!{PHrHJB{7LFa3phP+Hb=X;bcy?Kel=U#uHJ(>}R&vMN48ubo`&yUGG@Eyb9>sQ4V zn4o#3>G;#*599EKpEpP?mc!x8Gp0<^&_l;8{X>^yaQHwzo4iU@9KMKU<4Tci96n=v zxmb)W4*$aT%F60Q96oVI%1JsOq)&62=<~@qd?k~9(v4~yK5C**Lt;FV^MUjDshw!v zWaapCw{iG%&39kJX5;V?T#++^9C3JG9N)`Rr_g?i3CcW3Pqv)+j`4Lkdvv^{f327>-WZ23OIRj6h6jgF3A`!0cLomsMex&YT}d4NrS*t{XGu8x=SlBR zW^P4%w@rAYSc~?x{$)lBJvt^D`t0?>;nQ;O^Wo7x$}S$&yWNI(y}$E(g#`|eIo{;H z%7*m#H!z%)Kz53#ElmE7>}~$$a~0Z0QV#wd{}#k=we7AA;yC;>og&AV25A1OZKob_ zpz~4dZe}b%`%uU}b7AK9vhe@86(y5w-})_gom7 zg+use=OU^$5A#@okbkl&MK z1I~?Yz~RGn5?w^c;qZi;!n=%+TtDN*(aBSA_<~dM=^5%cd=TfmuYtwLp9=%Zjzs_P zhnM#<6&yZ6%qTlk9?1#O&d}FD@-Nq`MIyVVI{2B~+J@}23YTP_f&8;o!gbMd96pX= z=l2ymkiBC9MyVnH#eWWp**71>4}RNv^NolXLk7oc0pyn@i)Tb0LFX%s-KCIyvugwb zg41yL>Ws_ubt*5SpjK_2uIS6kipgl6)v%QZJt{dA|$U^PRGg zS2^^YujKmLI(O72gPzY29l?|nk{R{wNMZZ!^H$ItvC zr4iY?aO(G2D4w1>@D?|rI#Bwak0l7%rR4p|arwyql@}i`3Qa}+KVYG@<|yJZG9iOi z42O?Q&p7Z9*(ZK77thDbkfMRAeKw0FBZil>ruhel0B`Iop};hNhqlvj1hFKm#Wz}0xxNE5Vv z#d_20QK&xcTg7)A^~xx}ve}E9Z=?7uxXvI}q=f8^yM9I66NmR| zS!>9F)@RbtkAI2kbo7+@yB5qv@t~q)gpEReGs|R1c13zk!!Rzi|D0L->n)KVvOLC_ z&p~w|S3!UIR8;RvA1z?=_eFUXHc>tj)x*l2&vl#8KJv>=3fJF5eiuE>$MO`_6KAF8 z{Oghbl0H;%qByVd7IMI}QQn%J*$JbO9c!LCrK5UO80cvC7}clBmqKOq>FC@wvDOXo z%bsZb%I^)Tn@K#c=Apcfm1Dys(SDwBh(zs2_6ckGdQ#@cbzo2HvoSy7Ic!w<5_GJu z@xB%=isVfinUu5{<)^NgCl1xc-#OMWB397c_o(7TIlcPW;)s$Sy}7 zhR#RVxu@#R7A&Z~WN@AcIE4JzlyOg&#~S66<)K&7sE$+^)LAdlNA{U;{gun{ANe7w zHxcoPH)P@qNB*wVNx8&=u7{B)xZ29kqj_6PlBJOUe5Sm(-tZ8`t&`|E8v2P{1 z9!9@@`|K>LD^I?RgX~;nXF=D~O=nQNjIy?wfUa|OjH-6^m(V_iFL5*PLC1GeZ+%hT zhPMW3>!5uUn}&(BG9f?4RM@RX*STlQE3N90K1}Pgtuu=2%s}~SR|QnB#g1*)N7t2D zhCO-JZb+XUyT%l>|CldqE2U9Ba75^?b{s<%ZKWOv9Q-lg zb066~d&Y7M`Mb!bmQ5U8&%=#hhcC`Y{tR2Lpn~MaCytd_c@p`%_1ors$iG1xqgToC zqc~wP%h-kNlyYI}_5idW&re^j3M->{$^A6zI2!j-n^Sc>@_=bp6B1uN_n6MfR8_srD85w;sMunS$z^-{&=w8_|Bk zW=uO_i0ndOqMK8TuGjG=TvpT~KPJwqkex__c$Y1F?SS+qHEKH4(W3ocGSJC6hj?>% z7CuJ&vX`4&S%~_Js^#kWf7qMuj_)Cq=f%1r=ij5eBy5QG--Y6=*vLjk)fDm7X!93e ziQ-L$K0g-aYh1{PO#UoXFKyS*??--3HmtvV))L7VN@He1bvJW^gR>!u$2=}JK3yv` z&S&^C4b`QHl;zVZ(fwhX;H`r+Xg>iPE>@(X`<0Xr2R8Decn!Bw&}K*XG1;_xzR~@t zPd-5-ZlZjxUMoa!Dnk3t&uY_~hve(tD$zl47jt3PEG?85b#zsayiuKvHFTISfUX;9 z+xEI%S3~+^+G?Cpo$#P96m>;@uH0a5C1sB6a;@%N`Aigt&p#isMfM0fGRMpl)%A+$ z)AfVaA-UIit%J~gT63+*n;aC!PaPI9E<^Uqklyk&2GzODNgj7rq3eBtt=Al;8gwqt z=yMC@cfQ?R(`I!2%1Xvvh;K%G51y0wgzOgDn()|UD)M(0i^w))pF~2&eo>T9rA~|r z+fSqU5ey>=(EVOrh@Ale)ypJYMXMIFS9Qe;{UzwS7;W{!@*uizc_H9DQwQCLmillO z??U-oB>(dCWON^pGg(y59>sU!$-JHJNIpS&-OVY;Pm!_}Y5XW(eZ2Vg-$L~@zMAm` z7m72&?y*gk`%vBdqHjz<_ZfNC=cFuA-p1(4sdJ+`Scuo4e=3OP@t®W@ks5ZAUD z)s>uW!AnDsUyB6=mTtR<qpWe1};k+HI%MS0S){G&WSs*fJNEj&gj zpXxq|JI+V;^lPq;S%~UrwYTzqE41!uvB7>#bp0t_!F+oSCl3F{V!wmak38P9Y-|XM z>xR@1$Cjdf`0?_ZPeAoQ%SGy;2eMnfS9K%JTf|4*kT(tGXXImJ`{^iN3bGX*SJ(Ic zj6yT!$2l}-mZjUYEr%xVnfjKZ?eBt(_&HA7>4Ar})A>JRzt;Tr&f19f_u!0ljg+;N zR5XoM4b)Y24yv}lkTyYE*+j|6Kvh*qMODv8LrFu^$gtyOI!zrV)dOnUnl#;ChHHNf zZ`6;q|153qXxGvHmNA2>4mv;9{sP>;0)M_7XLv+gTiM{)Pa}-|XH!3i1o;>9i|`9~ zQQQ6=F`cGL``dUbs)h%D{yalZ*U(7SKvUO1>8E6+p579i)qNVV*92!0k@(}KK~;m! zhMe1r(C)LRb)Vh!%|XszQ?yl;b$Z+hcb7TDwlSk8S>0L9A||f;RQ4`YyRv67P(G?; tsI0B0)v;uh&JiO+BuZJm{iV|b>e_}%C|Z8JqWdET{s)sVE2OQf1OOwe0T}=Q diff --git a/dev/fixtures/compliance/cmp_wenchuan_nuts_betabern.rds b/dev/fixtures/compliance/cmp_wenchuan_nuts_betabern.rds deleted file mode 100644 index e84593ed9ca90c91d121f1c3d7120141f8baacdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199846 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 D+coYW diff --git a/dev/fixtures/compliance/cmp_wenchuan_nuts_blumecapel.rds b/dev/fixtures/compliance/cmp_wenchuan_nuts_blumecapel.rds deleted file mode 100644 index 1f7bb111dab704c54862b1233d36c168e04abc60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137008 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

    }mjCCMs$ImpzWC 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_hmc_bernoulli.rds b/dev/fixtures/compliance/bgm_wenchuan_hmc_bernoulli.rds deleted file mode 100644 index c8af4f3d5d6093d1473ff6011d2c167945a3902d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3720 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_hmc_blumecapel.rds b/dev/fixtures/compliance/bgm_wenchuan_hmc_blumecapel.rds deleted file mode 100644 index 58f412fef05052cb59d18642f61ca9fb8de8a02d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35155 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 E091j`n*aa+ diff --git a/dev/fixtures/compliance/bgm_wenchuan_mh_blumecapel.rds b/dev/fixtures/compliance/bgm_wenchuan_mh_blumecapel.rds deleted file mode 100644 index 66984110c53d08a7f9647820d83bdcd3896a0d82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18665 zcmV(&K;ge1iwFP!000001MS=gJk|UEIB=^WGD6x@Mn*}py-yhpDy1nS*|IVdS|SON zkx)n(6%kqCEqm{Cj=j$^N(pU$_g+5d-ag;+RekUM-uwOidp#cSp6B!4pMBod;~ZN+ zM@Pp<$25n5j&aV^N4hzO52=bu)6p?-O>MAGC61{?Psc>ZJms=eCYE|mMpg!<4*FJl zmZo~AEF3J24D@Y`EWWBKI#pA4&C%(qYqmLxtl7IuWX+CW>WeD<(m-U*DSbO53o|Pt zg)LK4_+_|XCcrk8SV41V&>r$itNQLZBzmx{T09X7o3E|)js3g`_T>lHb|2giJ>JaA6u9~pwpigl zy5Yx=aePG;HtIew0|Bo6(ew|p!3~Ce<~Mgwf-A>Xu8}|I2Ygp>yM>!IfiTv9F~Pu- zARtRFW$DRg;4gcAMO^I};J4?kbLjS1;6dk*wNJ$hcs>0XXg6F3JUs*jxz$aPah`7o zopbNPc97D4NH^+m5y)yx#@yx_1_?Tx3@1yBL6+XdzL#pHAj6-B z1(+Qr<6EUOKVxKWzI~8*b1z0!cymO>u3F5Nz%0*~mj1~8yk05lckm4tcs(IqjvbH$ zuYuI81+wrk>Qp*BH7!)gxjlq8RHZ%!n>|S`NbOWcESEDBugLgCjF!G zDcuKP)a6QnLURHb(RnH!;A;y;*7$31Z_l8kV`BK-#WcrC-_po#`U;yfoylZrq;G|M zHn20A{>)%!h&0nPGB%#6a?n)Y{_B1XEcET{zPfT380y>Wiy7Na4f$1dW?O3~vENUH zb-G}YnU%e*gPobR)f&NHE@*vQq3IHy-<6zk&^NTzw>LAGDP%XaHPW}V`?}4dnQT-8 zHsh)JntolMb2=AY-NDAr$R1UFIu}))!^YHkYNobdH{e3@(M|Lnt<4PWQB&eV@_*Na zj_%7>_c=Qt9eO3Jvvd^Tj@uni&B+5LjPXY=Q^rC4ylXBZy>`I<3GcG44+TMwZ}s5l z8WvEqQPeuQ+7Gyf43}nJ<^{nwyho)3WPp*=G1=@h^q_HEvh>2ObD(Cvjs6Z9en2wX zlN&6X2Abui60&x?gWIp9>Ewy?k@4@^E(#pOT7$H-hb0$ZZ2?b5KbsnGl>jfvmGLHg z4j@$c*v6D-F%aB^*D}7h20SccJN_U!9^7W?(a#o00dc!0Rs>Hh2G^g2N8K;~2t3-3 zEZCE!2OjUg?0PCqA9&x$Ee->Lb0JTQ82*d1mU07rb^ zBA!EiK+{^r>Os&IkaB>(YBK03xU_%&s?9r?!IQ@yBX`y-fQNVT$)|j;0DEo6%MTjX z&y0@|9T)Vz^URHNkmx2j*y^7p{~w9NGUdTidHz-j(1r`zPs6A004?mG15v76l`_@A+W1 zOg%R?cxT?wlLBvsKg<`4y8}j6^6`|c-vve%s;*ff^aPCf-%HzvNdzNoRTn)ytHFmm zL>>9|7%;+J8!>N}33%Ow;g|2+4o14gbUqyS10xNbOSaYA`0d7~pZqtE6zXH-_YW6Z zj}(TPu4q0*7-wp*&)hr6qe1ky8-C`gK+XU4#ztrVdIQhg&D8Aa+Z0_eeKSrMu>LmM zA3C4O`+d)B(|LdFb|&|aeX{)8*&muO{4MK`t*0~p*m&Wu&AzVrTjn2YvQO7RvZ;@h znO7h?7@_+$z^mK8L>L%epkNb&Ux?(#{kqLTtvBegD)Yb)NX7qB&fd2J$6nUgxepzak(cZ;$Uj=Brd*$w>%`r3MU-)%i z^X>u9z>UZ5HVJ{a9)5EymNr#n+tB{tWzmXrAareAV&|<~5Nnt7={_F9%|NZz#zQ_-b zPd&cBJ<`wqRuOad;%_=?Om9!;Pah9zz3$%>pU&TNkw!h6uePV%`^WKTt_#d@qh|k9 zVlYNY?S>=MP%)BkUUy~f{2iRgw)6BjCwY&p2;GRqXl_0g`uT_y#`pp2`4mhwQV(cH z9LvcQ`1<<8Xh#l_yy6yrJwA9_c{8F@&QGn!+Xdly77igi@yU(b!_0l6S zA~t5(=spQv?>}#n+%R?D*Vk>o7|=wm*Ig>CkgSio{$E!K$oN<_fAvaX{*G75W>Lk> zzuyo?HpG8lBL4f5pRb{R+G~j6k1N-i73=g$6P6*SgcI8srR3XUzS>buj1mCuq*^ z5AD1^9;$iNqrvg(Fw@xv`csPyaiKqKZV~$3G2@$geth$4V7eaCZno9IOn=k$kao0I z4Kw4;^fz6PI?u0G6*Kdj8F!|?>3T@J>D33aA2ait85g}unT}shDAVLuCwlI0`Ew@! zyC?Q9>>hnZj7F?`yw7&Gsj62icbUoB~Upq7ISNTZ0=`WASejxMv z>dPkeOXhU^|8+$$p9G|K%J3m|1H@kbla2eWIY75I-?k$z#-MRzqpy#l5@=cEy|M1t zRg|qbg)C)4CdzKFp}J<-y(rr@#&z6E4MJ>M_?D%)b}zsm3@*gA>!NI`aWU_vn}^uV znBjQcCK_euC!PIrwcVhzxv2@BwxXJqg})eC_aED(9a3xPLXU{`C_b@jPaa~^=~o^4 zQthD8DfIIR%_hVqy16{T86?EYgX4+xnMYBUyZ5x1IZuK{qbo;O6fmM}s4y9KI_!^# z9l5O){k(NnYgTniu#}h1YSZYY_ncv@0N-tEdIn>Hh&#$FXt1FH;O@D3LB4m0ZPIp} zWj5Z3b?e{Nrql?~w7%P@rs~vw#NLYxB4n8(RF&lDgXYx(ti=J%=o|%_Hr2htPcGSx z67Nb0ZZq3T)4KFVgVTYkKWxR;-epl3W5muZD|uncNyH9|F-FPj6oBt4R-5O(l%}}q zE-CYK7AWhLx(+Gatp^QW9Ep3tIUY)QRD3|JvcxYD9_zh=8dxY!F5XU7BR%u zAeCiU&5T*?kP_6o5WzO9U2{L*eoSgbY~3VHQAj%jY9CK(xh);|X4{tK-Mw4HgV@5| zW^=N04ZuBGqh{3b1hK7{mv5Dp9jI1q7_qd{L)m^O{5|i9XNXNCSHCMUg*3&^^?V8~`?4@~yVN7h;#lrs{NY3}~}ImHT!y91(xz5`L%FVZ{9?r`%jX{YWr>`1&bq3(a75EIM-lRpCFv(zj7dSW|mbN^|3J&IlMzeA2 zqP@O*@9GXeIMnZ}$hPP?;$Rhw;`!(Uhl0wzTrSm8y~pJ!m0Cd4!5bY6`t}ZpLvcdl z!!LLc2UmUAEc5`t!Sd}pG5m#7<3v0>YlB4`+Q;~A`<*yAl&6Sk-!V*Eajr3V;3(R2 zlEXNbQaEJe_IAt%P(4$4jPAWW;^4^|oKBzy9JuNJiDbtL2h%rcrf>#OwLg{iSpEYX zz;N66-sgdoL>>nBYvzz#rq@zpbO4esrSs;#p{KgEoRd+{km|_8tsz%sQBv3*s0@PVE=(NPqsE zU5J$H@pwb>TEqdLBTBo;4RFxANJ_%B9IdS#@I3rxR>_kCn=9iSAo=5q2+`O9lmnAi zOmRA6aFE|EG4rN596Z>Z7TrUJL#&_DlH8`Q+c(=+uV1_maqz9i)`S&daFA>C1vg|v z`%bM~EHf2xC}f^XUG#CpVRp^u?D~apNU&$gUC|ymoc!WdjCv+jP3B@Z_DHn$oma$* z6;Te&)pO^_v_KqQzcRDm;|Su=CHGvBTeqjqLk&oqn?!ZfYq%vo6LDZfl6?!K1lrEr zvf;#d#6h4;G+%HR4y?b!QO7Vy>3bWrV#g38o$XUP6RO`xCv z;^1U@z=OBRhy!gUCsfH(^Z(>&a_^lV9PBZvY*{;XUw%1NGnsZ0Quu8-Z*sXqGHdt3 z6K@EReEat4=vM=f!oabjz$O~4$EP5N1qzUSZ9a4fzeLl4E2W{GhEw-_51CN4ZU_!W zw_=}3J%NL9$NR9o+*JK2xf!wN5r@{}w4T45+CN3p!m7xr>t-2qv}pQ$suvcR-OzJJ z96Z+A#;5a|stqN6o~t~{p`a_#@)NdjP<@|eU%?ZULo#i2=^xqP0Nbb65|W~DKqDdG z^5p?UN~@&ORZ{Mhl(*Qt+mMv_W#h+Ahi|qk#y8WFHI=4qbj^%LUbkVLF3$Vj1qZ~o zTihXJ#+CoE9a^G;9E+~dv}eKT5C^(?ns%6MGP|!tfW6guCV?x0VE@vsoLek&Q1)H2 z+{+Yd2MLN3hW@d^v}HIjROmVad$+N_+QHTb`?qtcn|&Zn^}pcQ$!q0^-3R5Nb5J1c zy{M_S->3<81SZ)zx@E#PH6H$8v%+t-^JvJ06UtfNY}Zc46-#g6Vf&K&C+wEA#qF`z z+PI;Nw&L5FIOnF)wAa{ITAg7Kv3uECD8_7xvbQ5h+{`=|_U!Xxo@3rJtKC-hU5U*n zVfX4Y^g&5D*j<@(fNtCKSta=2sxc9%o;uEJ;zc$rMeMw`xkW;K?yR=VANM9xf)G1b ze&AH+TZ~BjF#2daGYR%HYOYt|<%E5;`yL;l$RPF}dHZRcEpc`&ee=)nNq~LY^p7L^ z&d{_cs@@#W;QYh(Ib!y2rsN~`zB#kshW#C4w?8|3gGCfgTZ3#bw8sY`_B1HX(|Fm3 z*v{RtyGBmsyKPZf%Dk=gAtJUVTI&4H0@!kKcoj$dGpbE}0rW=vu;tO^8}A!+{&Mjq z*AvC^&1vhYrg6cTg0eL!CO#wB1hH$_GEDq*3L?uABFb(-Wrm)F6xh?7 zOV@LMBg%f8R_xXgJnSj2TB$8?19qn<^UQD9jIz)8*)6lr2`IaDr3U7kXu?+bDMuLx zP_~3_rc^xbg@l8}heWG)Blhup@;USB;rH9<>VsLHK-*J?7HZ8?LF{KYe9bp%iAa2* zi5FzkqiXdeaDjaeO2T8hPJz2@D2YqnW0nePLIUyBg#5roNMcyGq2y&N?7xT0jaa#R zcJDBTQ~YnizT$~>bf)iNUlQ}?CMk)j`RR6zzLA>UmG3@9l~uyN>IjAMdT~hLAX*A7 zyn$9dQY=$p81~QcJ;ML-B5ge-8+j>RkRbnn@I2=wB-q$DFXv#UDRKL8BcFm?Nc5t6 ztEQ{{!xB=XW6rCwqE#r=f2`~bi5FKJFAcj433diAIEQeMXuDw(mV*Tn6<3txt$YKC zySX#g>L)^?NzEBXZWfdz)r$SM1snErsM0vbWWDGC-22a*}iQ zm+zL~hz&ZCwiosnUSls+N`n2CF?AoG`OPX}pPRT#0Uu&NUaxdmSOyYEOWQo(M#KKP zcjf&4Q`d_##~kDJ7O?+9VesCm_vP0TS{@zO`l1VoA!}sZdNO8}w6Q4i+T&)FWcK~9 z&Q}RTQf{!7m5T?;{(~x`&$ve+ftgq7u^u}lDU?lgs|q`vd_w>zSY0aw%-$y z&dV&{)R9eFzGtW9nRh@EQQa^+@i8J%pgx%>+e}rq2?ohC!oJ`wB+1t2-)wL2aNU8I zxhVUi()O*Mvly{&4cV_idI+)q#dC7g-Ro$tD1X#HVe-xP?O->H&}2i|Q^(|GEVBXj z8VU!`zT03^_H86dZD>jrQ3E@aT_bFka89|JeOW#7}`-mpl8n-XXI3nItYxVAV(g-!3 z-1`RB?uBWGMVYpx-=HOk>+EH2#kjy!I?{(oXhG9L+liq)^OI(^>D@J+-rL!;+OShc z%;LEP)z#GSa*_Tje&z5Vij-J!_zn7salTYoWg7C_GgJsm8eU(YpqRqKv(-6TE)uZ#10jnsSq^1MTW&1JhJkOk zGQy?!<%4~Q#S*oiSR5Oyd@ujuNMsId8ucl&-N%oJOYz$L60;FDBtOyS$TNVA4~x}~ zpI8EGyQ|8R*_vUy(3M__{u`9IC_2ePmJrx57rUU1dys0{5`vW% zQ{@8ADj=2!JFVBAyBx70>y3(!Pr?0vq%U@;AxnqAU_md>7X3iwHaU99FG4hM19Jy{}ow z;M;Y{5Z$jzfrTzByY`7%AwH8zZs2k}gfeA+d%1q`bHpNvXIHP+Y=SAH3j+N717TT{ zrRw{1Ewu0ba7J}^VKryFv5bu|V#U#;JDSfF!+f1%{+!Q}V433kMI85<5u28)=&cP8 znAOIO=dXn_KBH;V8{d%KuU^3Vo0F$RcOFDpYHWM1z2Xweb5TbTJ)0<2SFt zg55rf*$slQ!KSNZZKn`Tn_gX=FzIDRY;dJJqu}rfF|GxM39kEqSRocL?x-(`IGDlZ zF`l1Hwf4{v=}au*P)hc*TD~t+qA-O(Atv=vlH#ms&gH8cB34c z6mXa$CQNm)bktT>^Y3=}bIF!&(KT>5=76Tahe^RTlt@Hl+QbtO^eQ!gA|)4rKb zrvtte4`C_XSWDGuzk(CYs9!R+^zV-Q>Yv1gE!dBLO z4Xlu2eZw_ScIvz`UW_(Aafj;4bLNu=_Cm6RIw7{y2a;MsV)Nej@ zUmZK7e>a<|-4>zpLmp`NVs|A!c1B5@s7WvtH$|ibnKd@p6A;OdTYZk#jZke%weyrc z0ZA3-7sw7_(aL&=%<;X7c9YP4*&9iSLA0qg$sxQvZx+1ai;^$wzJ5jORLD#4)D>XEGL z#$eF4m~=>D=RVN2wy)B5e>!4E=COB&#-Ac$4_**Ywzfvuy<;eA**gZ5t(m*y=V?3w z?d!&421dm|+Y8QJjXAa`JF@sb7@vBL5;uq6O4#f(V(U^X)=3sksyW^USLNjp2}aib zBNq?Tv=UV!udxc9+_ntV5*gnV`AkZ>2t3511ci%F( z(6pIrY2HKIFNocK1Pz|Jp;_&Jxpvc-!WYCoqx> z<-OVVh!2q%e#<>f{TAq(h*U}pM zJHDrS|L-T2vK+BpE*roOw=H4HSSJ$eq6?$ERzui{y7 z=NQVS2}erj+k8YUJ6)cZtt7ztRd-^^=V!I~L)-X?o4qKz>pIWY=jnj%=P_+`O8THD z|8RU+krn6)T5T26c@43fe}w7u^7Wv}Of%W_V-#rFKd`aP>=k0$dLbKDlRlK)re_1r zrPu@fyyp?8{D`14=DynXPl1Ttml)zD-ry1Y`PYV}s##Lq*~DFR(-9CBjl>_|nR-qn zpMCZ2WD3gewrn1)>Zn=mdZark^ZE--n+(o-jo!4RY2C@eEpwYR5UVVfmoDKsK-E&j zHnGwhG`99Gh`8|#v7*S2kVM@uH{x@hJ8mat!S0F4hi&dUq5{lV!!Q)id~{_4}hP}~~}`x;;B@X46WYX3qIeV%xppzt-{FV-2lvcpIg<7wUUCzD$~$xnSB z6<+*+^pPKuv3(adpSVGlF)Wm&{T@}NtW!naci=$&op+rTQ`_Uu#P7HtMM)9eQ`9M$ zO;s+zb@em)*!Evve7}{zbYv#|o z0!da`o&n07kh16&eoS&J)kw!xgV+j4IbV16z)cTGsYqVUyIl+p?i`ao`Q8BzjHKTD zeC`3&qL0;g4*095cQW3Id}aVC@r4A;suDrR31`PF~N?4=V;5$cZMF9gh+1LkS0Ce0m%@rcaK>E zB`HK6FBCWRJv|a@C9=O5kpSZoKIAQhggwpmBiSbqiK- za&bYz2ImB(xlbVRsIteSb0LsmM?SBqIzUsR?E-6#m;yx7#lfgsAz6^PP)5lzUK5cN zH(Ha#$2q%%HAeW_)~Wpx%GOcSrtNiwg0&40l8&Wd*R3yuWKrhm%ku&dDHg|tG?YUS zNnw;#s$04dDcWOkD+aY8h1;IL-|8YH1?X6sSh^yT&7U{!_bs9-`D$P8n*XaqO6OLU71s23TyWWua}Xc+VF~C(8+TiC9bv4^M24>SkLVyB`gL!MY4VpB}|r!V9AG;M3Xd|R{eCCU~|V#7dS7RuIrhg^;@ETU=WF?W$q zk>M!YuRLGr>Zl0YmXvFXtYn(i&II?wLu{LZEHFyPWf02Ux$dU!dz*D6D@5;urCAK)eY_@LUcqk+JL@^JAB|N1ux+xpwsV+e&nk{#!BIyFJIW3m z|0Ck2xwDFEsr_PTWQ?*dxY_-x;wZ%0By20Z?SR-~L*hx*$0D}nQnvQ>zCqb5E6;tj zoR6kG8cQ!__9>$5h}a_>d#C=#4PL2kSJ;f$v&vVmt=0&3&OaNj#jAo6N2Wi>$oY&F-St*O$7tp=?cGv)G_nkG79)%P>9i{%%P-m}=ENgrXI8vN(Bv zDOE8SySef3 z_N*)Hk9d~n!816!ibp(NS2)jV-`)Ve4CYU;|I{{%CsvOUd%Dit9n0%N>}`zT+#*2- zdtpkURpc3(_IZ%D(KW7xeI#c=XRgzT{dLMwHX>8&t2n!geTNzm`%}+f*QZN|#P}rJ z%qBY6-@caR?VbXvXC%+zt`;Ho(fi2-U0U(i>9i)M#bgk%*K6yQH@r%;-vo)LUOx;Va#3A(T8nlR6{{NgXG> zH$n?sa!d+}Y1*Ir&^d|i6eMIZ?zyEm9}?Q~oCnJMU~dp>`huZ5Xz%WdxTdlVu}?nv zS+h(ST6)1YbNL#o*SB`v_A7zCS?5!m=Bz;3Gi2uBx?5>RaNGXo=k$;y5FUH-^984K zFff*I==mkSuLZ?>{N^>@*8<5JQMz>*Y={Y}oId;;g5dq&EP4KOmLTB;q4-+hCz|^C zl}qZ=`y*!58yE@H*|W6 zhdLrYmV4fdIVFu4*tkG-ceVq{rvpM_qT0;xfxBDmk~yDY`kVW!)byXg7lP6I!e11_ z96?3#bmweXSlL^%USKO?V!}iFMS3+b-KtIv@>>x@GbC-+$2>rcc|7<;t?THYEyxbY=vtRqGb7BbBf8fHzC(Ob8Xo)lj4;Xq z@7)I-B@+?DGZp!xY+l3UJPQrwq;EGNId%1!SDO*@&q`ffaY>rC+S~Ol$Y*8*ekC@% z){>ei_e2}Mv|+KH5k4O93}K56Lrl&rVR@9<2@?1|9?MbL1LC(B%+XRz0&ztfLW^8d z5TkI1V`bSgz$4l9)g@eUh<TmR0BH}-(^=EITOcAc5kRAKVLqe;m$eZdwxd|4$Dls1oP z)e5O2mUPPqn9gwqX^l3UIBOKZgHOaTjP`19hkd`V!8U!6w!~H@J}>1zHVo{vAF)%L z5vJ2|e`KOqAO;>89tMOjh%x$5z~S8u5Luh-ySycRM%ZfY+_*i~fuBl)HD4Q-RYfG^V zBjPGE_fYDOKpfXcp3f}>u=$mxMpw}!#0{v8DseT!=8M&Bot?H2cZg}A(CH&etej}? z6K`3F74FXBXF5NtxMDs3N9SW;t3&Kk`W+(QVB#KDCqcBhvZeusg|JOe>Hf)q!N1Mc z5EY>%VGCfJZTZ2{J#n*&7w6aGX*Gp-dD)Y@g67X^%hrRfp}x8(@#ofPd1Uj!X4cq9 z9iAT80?wWZrmUcS4t7+#4QqIhM9gZlHfwCCw?9qWnili0 z9M*;{dAD!ZcE5owKAfxi9>&8qXLps%yNhA_aznwKP3_-oYoNPp*f~~|?TNyEt2g-0 zYMbx9Ws9)4XuIiR>VBh>h%G{WFOErvBR03?JD$5hfUU6+$MhIE5L;S|kLcTDX8aew z_*F*t%P){4zmdg~3CdT6)jjjY)3jmi)AqtAo&YNw%lMXV0ZN=h?Yp5lXtoBF`G@s--A1W;udic)`vEEDyxoRVJcz{A0ui|>%z#)_9QJYXB0%KK zOr&Sn08s8cHkGsXr779WvS|s6 z#jFzRuCEu6YWrph=9b%iOy8pNo+>ZK%XjftjWx_qe3_mac$AG3*WYgoxzz4mOMCRRc0Rk*{bN4~Q?6(n#~% zP?B;;0f%qT1LQer3z=6u02Fd0r+5FhSta!m2tg(50j2!&ZpPf*v?c4k4fxy-2F}gj z(ZR3|C1v2t4I9d8KsnR5%U{%qrUQa-WO3zQM2gh?8}U44-z@27LMv~qEuiQuJ0(q* z0tV?*6g*!#qa?S#vTQK62K~kE0n5AlK!1I~!jLFl(D%OnzV9w)CM%D!>Q zhr(tofKV(V-fy8r)jdD+?Z(I7Y=2OI_5uBfNL%XN8F>ZMeg5(Abuln-fuzYI(0yi=x=M%~%Fe;XaOKFeZ?-Ly_36Tb0mKeA@8z{7+W?MI z6|_9n4-tQHzSgTzAC%ajPgSd%tUxp8B=3Bl0mPQ98xKw}&jnpa^VH@YJWEr&Ty73q zV+~^4>l1c&dOATfS%xdx>LX~$ASq`0?gs4%$CeieNB^+6ha2U)eIJ5$?c*;geU_jZ zu(lsO*blH9B|nGulz}FTWAXzF)4!}0mcSxv3 zeYZ_Thfa66o6)o`Br=-)2L^ zVR$IzPlZ8)(b_p=qkD)=ezqjdSI<#4VB)-nk9C83@{7Y=+*9-Az3b*^>(q>k%`diAaMI#Vv(=QxSb^3x5ub-90d375ij!tl?fZ+>&L)<7F# zS9Hm1xHcEDRn6~NU2)5-Vg-^@Yzy)baXsXs!mDneKHB+&IV2)Bw2h4HSSSD*9!6cN z6kZP+jlV3W|KKyLEiTe3ytiu*+pL0@ei2Co_@WZwGzQCAZFXDdA*n15aD?8E-iK=t zo88yt-w@ZB)i#a#o!sCsBCg4BCw=Y?fKTR#kZj;Y*)DA8x2L^uR&lspxhy44G;Mo` zF+1#5I3x0_#xF7qtLX9DQI_1h_F=r54iqK0SDKC@((dVY)qoBKe(oYru7H? zmfsN=`^&BJrYMbYE=5^KWGh(PUJDvzg|v&hpCZkjX$;d?;kq~H@7OvI1=72yLuQ4doVaZ&{bpWyMWa|czWf2qxLfsDw>1_+HYcYZX{`-TkdTxNK2AOs97T!cz3{EGWoJgP5 z%5zN-UzA@V7O;skt{8L%#i_|_wU%+yv>IseM6I;{cJ%9x=D^5w3&xDfXt7B0T^h!HoA2oG6HT-qg#SQfFa9Ag}mfylu-P*ajd{&nii@&Ob^`2kFt>@A#&`j0cfomytit@d6aEQ_F?f`@t}3x zGR&oGyrAU-oh32J1ns&{=em2&eY5ymK|)vb7^$u`*K8{?22I+g@%Pj(1MD41ng`^DSPd{+q&Zu;j$Oj()P)vesRkkh&471!X@wa&1#Vc z=5*ko1!BGh>layy9mv|a0H2$lgtGAP>6)tTqo6=eiu^8m62NM8@)K)_GXJv9%E^g$tyRn}Bpba77)GoUX)<7cKDGX4rO&hMrBuoKd2VpHOa-Y64Wx$d)SgCK;ve;8)H{DqpW6;@g7yWkFx%_@(t&9 zXT(}xO7w08;Mr^F$T}fZ>1#k>!K3wC}1dSiBhFH$`2X$9f zN7neCMy$_k$gWzPiP)t4Y{5LYa)3=yXo`Nf4rP;O#U01c&!FMs!ikcd%-?OJLH&e0 z-UHO@9C2K{ng_A&78lt;K>vqrwDjAGX?ugRf!<54@v#nQ@Q4iG9&!@Y%eb!)w)aGd zOG#5z!P_I^53e1&cWx8FU5x6uE3XM~nHLk*$#??1WXuC+cnV-oO7zxB34{7Dxx#B} zxDe}{6uKCm8X}fpKX%aXhEX#F+g%^{F91s zrrGMjOB0nV6j==a8*};@|GNR)_K8RZ9q;S1kE7XyOYbKY<+dz56=!pE%-g=yOFaZH6Rtq%|y z<2CdQ7Xf0Eop#nv4M2DuESDZU{=*X0Ubnpza6;LCXMdp{RQ+aqB=WlUV>**=urhh*_FBAlRmBfUlUC=2LImdIb$Rq&Tf`10QV$@~gsu}7t< z?p>`r=+!v1FXlr6=qv{8#x+ydUGJx6)36nYJuzBh_L+-8S6LYGZM-JvuJv|xX*Nad zxki3hjya67Lt50Io9Kzyy@-(!?@$an4G(MK8pRO1Uwaytr(qDg_KFKgsjNWkyk40Q zz0?qNhs@8fH`t5V!{8`f8Wse)N|-lpE^MJ`XX4y*G0S-nTXW7nV~CYP*>Nd@rzkD~ zwBLP_nf64~c1fjzcif2G!)7|ij=2wUXxyuaw6$}yc<&>N| z_*Fo~3I4)tB@<9bzhm*Pz%j(yHFBa@rstr-r@K!^Cks?32Qo*UlR&I*HDr(8S_kT? z_}DkrN}z1;uUyH{YKB;smztgS8jtqyQ}f-)j#RT!t(l8Af%5E{)E&3|X<8OE8QGC-YU>n%_@ z?rVhG;|wYT@0QQs$3xY-=FtXSDNwieX2e15C{Vw>E2 z77c3dNEWVhD@Cj{nJYD1#RD2W^R_LY2nTrMOSxy3v!HCui7;xJXNFkaEusCC5{g*g z`eL8V99~dAa+y9xJQCD<+{F`zjX{mHEL>T^g2tNMv(pPJboQtJR!LI-P7aRgA9vHsYO>m7(?7W!TJF`H3VX3^Dz z>{vrJe?figrM)OimDen|DV9sqic!qfxc;S}Y-d_pz#dspdijc{Zo4xmKA@oy)hLHp z6_$J9GKUCgOkYBHjuQg7unDH>ZG)ihqMT-StqNilW{6+2+XiLjep^hwkR&J>3DJI) zzKNza=S-w3w`zi_NR|YFxT$gD9QMiOhN7(H-rBbp79iGLdJ}NEaso8;j`=qbZlkPg z2-RaF>* z9}cL3`a4m|KD$1ltZo>u^k@nM4Qf(~W(7wO8)YmOp6A4X28}Q8D5uA#&dW!E0-5)S z^@N3orHw~HEq04%ppH7q=ew_WR;aszjCB=Rn+3QLi`kqKC%dX>`l9XCfh}9TXqq@* zT-jZq{O?>_{SyMD&$+WSzENUk8=k{|wl=Nv`#b0KGkyk$*eB-UaBK13J&(UTK*o}n zW;xks|Fr&G8!8kuIsVVx-{9&#QOCvfhrYYreSI$xn|QguVorY;CvF!u-F;R1Up>zM zYJj*C%_|w{L;m!BQ%GC5-eS3EmOon~@5kS8>(3q+HBRdJz&XYj1`%JB2p-3ld_q~g zmRa)AxO7YH+g*$N*d4 ze%O8$&~@ zOEg%UWD)VId2zjODFC-1;q5Iq(l^@_oP7P};d$R|eTQF#%Y*fxS@W>%3Va4=NpLM& zRCo^5U;OxvLc}08rmlHMl<)@l1_!32Q9BTuOJ8PsE{jIlwj=oDQHh{gZ5}t>EXAD& zaBufs=POMGEw#(Z5oK22Y{QlE!qX>q1MHq1-W>{oh&b+4o+cJ!l#Q{qgQnKYX0<79 zvY@+g!8hBmHLri?@hs3{(UMb=r30D`tDJjSkIrh_uKZG^U|mFf^2aR+HbDT-bd7O7 znRiyPEUfpMtUiJ|cOkp#u71RZi}OD19^yq=_r}96aK8!41~~>Ji4)48(L1lV$6f~! z>+yyAw*Lgck}JELOCo66`XEruRQd)Yj$wO!1=ALkjWP!JuJL!HtY5p4v&7mKG^}4} zTE)?ZSa;X@2u9Ek;P|8uIp*vGP5U=)9V}Tw(?+kW`7+BwzFBzHttpQgAw4Nq#Kcxc+vH?9%V?K7*bCzMvdR$mKR90aw{t$j`K0s;dfzwn$6b_2FARbkFqh07j}3Cf~J)gTDV>3X0_3FkI9Gpx*xV# zoppl%+XdP>csv)zDgykKU{G>t&XrODB*thf+O=~R_#BJJ^&=g1SQm!O&kf!y)KC+9dEkO0DBG#>609BWx zJBnQ%fU;4LA#)`Sl+Ii8fzMb6RL<)@w(~U$VpRtB>s7mp5F6)KsrtWC2bCM$EE0KE z%xX2;QpS0X#VE^fIcha9LzES}&4tMfO(;uxudFVpCxC*)feM!lFHkrsel&&12P*qH z1x5|9pzgXvi-`6?#0KMiO6#6Q)3ko&%Hp1W29%Wo=Zo#LV?agbh5qCAmuOmPaPxL# zYQQ&JEAApwlwJ<%_z&@%zV3>$CZ(m0HLv2kt!GYr#CT@jtTqI_-5f&+r0oqw7N*6g z5bIBu_Sv%OQdNKYG}C`2V&jF~^U5x723TIj2kFoKf7qt$m+f5Wp8`D3BOghjB1Bw% zo4;Af6;P}H?mc&2En+oW#-!9iUzFGtS%DzO{z+eX;W(;q!G51F#9qWo;A1@9Fw|H;zwkd)BEz67MUJ3*Kk^J|C zlb53;W!Now@5%wlibXAv^ofYXN(^DatqQrS*^@-i@> zB1f2O2GQpjjHGP>FS;AD9O^6~`<)c~YT8xw>N zk`Vg`myFBBvmp}c>vQLhh66(T;w1jvv49}Lkr|>Dfs&}Jg}Z)>6A)e*uiGtgg0>)e za>T3#5bLGbmIZ~QB*k5w_xVKtN^(f|iFk?QC@DSG&jg+B0aBLvfr-vlh{V>`Bi-KH z5eZk$Z+A`LLmMv}=i%K2h>ycJ?B_J3DqF~~^SLP^Vf?7;X^W|TtKDDb6{R7PQ!+nB zc1`)Vq3_B1UaBh(3FKmhsj@!p(Z}FvO3Ydw^LBD8O44x#y^^`1Xm^+U9}GVR$fCVt zPE|&LqQLtm{1_)7FMQ2(=DZ{zg(j!bCw&HFw}p6|&Lcp=j2`nySEpLJkk4?f4Ithg z@s8jmBND8+hH&AJr`nqphrbvAq$-02f}e8$C0d2!j*A)MfU$7|xUP?KsIY;-o6?Rr zDB3I7SEAYMKrddOT!%{sjyjZQ1K8 zxeRg8Y}<=wbeVTtI0Xidnu?5<)_=2u&r5uRRvraI`Zr4&O7!~d&p{mMPhawOG7u$&t;hJeoH!tjE70+H$pNy$vJJii$y6uSb-z^l zh&GvU>GPMzfILUvD6MHPAir99q}e_e4Cq{`XMMX0kYCsO?0iuIDA{RS3v{1-vt<6j zyApL;fPC57D6CorC5f-~mDVo7**#a3q<*Ru5WC7hjf=_7YIAhbRc%c*&;sAfo-^A- zQ#^S+N$)r?_e4Mtpc|@m$r}qcBHe|1CvaZ zC)vU7a5-Yrubt%|c16p^lPT4!Cjo7yLm9*XH6VROcR)loD0^kejwe4Q+ z2KXAA9JuYe#I}QO7z?$%D6w7JHQY=$0^EM3Pwa_ypt+`T{X+#8s?hgl z(V8ffICjI{(BiwGrNnm6(sR|I{qD~8v+Ya<7GW|LpiSeU#qb;wXytJ)4Iwe2%_3N*s1*Qwc<`a^ zjhu*BeN$^WCwHp#JkLX?)*X%Y`fCautN@lpd6D^hNksgRbFKfOxuEghO`Z1#3{c_{ z%s<{*|8jQk7v8~>rtb3zSstg*QP8x?l|fuK8WGELC92?l<*eeDrJZr{TZY(ln0$on0U|b(^~SBt43y0ew<~w-V4-P?YS!5&)}x?V|H!->(oCSGDE6IOn&EegyX^4s zy2>7^cN}c}bjm?1-Q3k$@Asj^NnQNd=XV0&6*rmO@j8gu>bziED6cqZ%Q`by%%=%j ziC%^=$L=DwMe00tsw@Vrl`DrDy>}uOZt&VY*Z2Zj>vNP3le7LiBuJlwIs7_oC&bp(Oudi)Rpb4)1NbV4 z53;M||JTP&5D9JFzl7%h69TF8ZST47If%-CI^6cOpgZNSo!ws_;OY7BLt}gaU;B5@ z>+cGX*MMEDbfuY=sQU5TwtL=S_5O~z{<{Fto47Wd-E-wn>n~-zAx1i>3=W%KEAcyKPCRvy#A?k{X65IdQASQ^ZI@K-S_9u^fUdF6Wu>x4nNb+ z^nWG&-9i7AKjX*apKuJnbq@c{x&FJceq1X<1O<%{i)cJQo|CN7r{3qjl-Io5}l>HU)qsREKoX1~v48FCm+3Nkf@;_m||L*_5 z{~>YwIvx`p^OW;8i;0VE6O;I@IsN2xG5d5egPGy)Zi*2m!?2T;AtZnt| z94syMZJqTj_06oNOP8TbZS>7-oy_cvrfV!m*D$j(G&9h*x3-q zD*CGPC0`YP-7~wbzSFPW=^2<#{V6^(;4j%TUH!3$`>xPxd)QI-BW@pid=+`;wTUc06b#7*DWj9@e^^}RFot~qSt=&}SFX!$5 M0U)?e5^(MS0BfIecmMzZ diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_bernoulli.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_bernoulli.rds deleted file mode 100644 index be04aa43545f6790a9905ec8fb19f80cd3972baf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59635 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 Qe~a7y1>T>LK2l==0ASusj{pDw diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_betabern.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_betabern.rds deleted file mode 100644 index f3ea5378127f8388b34e05fae2884055cb3e9063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60552 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 ?^r? zlGV?Xcux?lJhVn7=m-LK+MnVmQ$aA$E4<)YC$UaqqRjKpf~cCeVWX@bh_*I6aD@>2 zz-9Aj9Zy9Ndw(DdabE%a@t@&8RP#a9TuaJqO#nnFOLqEwn?V>mN&h`o5yY#17IBqS z0bXX2?s_RPZjS_Mu8A`N!8n>1UG@fo!Y%)#qt+nK$1Ip>{m25b`0`81 zZ|8t;kiz{t^AiwZRYu-dbpZD~!=t@t8N@~3-&l0b2f~_SgN{oJ;IWsN$3ujOIJy0$ zaElQ{=VLn0$h-rwV|l}PeJv14AGGc~9Zu{!L)m;J8Gk5&UpJ~Lg{a4pg1+PX1rYTo z+>^fa7(~Yvp561w2Rz$ol(@bTh(4RmJ45dcq8u3;znLF_s8p;mo{bB{-kkZVn@+@k z_7LOJ=yM_-Z7<#vmm>BZ1?Hp@Ng~ePY02KL1F^oAH4)t+Af%A*8Au`al~co1ReXJb zUl6EcLDsHHp{>wOS;7M34&bQ?sEwC9Xc5pg4Q@kOpsFA*naANgN91|q}PQ@C^Y zfyf@SNbO&`#Qq~vw`#WlViC$d&L=|w=QGB^vsViU5pt}Lek1_?eDhoO>;@14_s2>V z*8q2~=-%rCT7cg}ACws^4Y&i7H{e`-5?4PAK)a-xoX@2LM_H=MsgZ=&~$*Q<<<{5^fTh|?O^M0G_soD@awcS z8djexDLc3i{dit6wR^mWpPv%yztOj);iiwe>$Uh< za&V~qPC|QV^GVcb#H}n~(1=E^u@-*Q`-Dc8wk}q@6h=e4bZ%oI=h2|VsG6JCOVnY1 z`Iwu}Ycw$1sj`AuqMo#%O;!~t)TeCwm3(>yrDumy@@HxCyn7+@wi&e@L+4**bfQ)_<6A5r+R^w;3Hg!_ zjc9bQ3@P@!1Pv73b(OVgLSy=NP61?#X!_(GanswDXj-s0_R^KlXawgh)a^otMmNMl z1k+EVjt4PK`(oqK2;JeR8)?31QmnB2vqu1$dOCfb>wy89JgUjL)2f3e<8lKIo=-zV zc3ZvG-Fn1)Xb3AG_drwCB`Z9X1!yStF^=!&V>H3&xtDqQCK_F&^4p(v0F8{g>m_d{ zpmFvqymX;VXd>@ETaXx_fnBl}5$iT+P~pQE1;G`~FdlmI@YD#Jw%}p$<6}S*Ci?Q( z`W0w^<9_}T@X?exKyM|9u@A<@;<| zCUhJPj~!mg62FMXwuSoZ2N0SHykOiTqKBq*NJKu61)#~q36Em@9W<_WWL7Kv3L3XR zbNXJ>ejuP$MXI=_c}K4Ut9 zCIp0XdiI@1!vcj=cWsAIBc+t{`gK3la@AyUj6W9@t9c9YshmgC2OsrZaK4PD{gR(M zPt2mJt6y4E`*qOx`pmHlnJ#FgngT_6=%UfjSM9I9<3M`Xe#~^?I_kK;NiryR6?J>wWZv8DfjYgv z@_flUg}Q}Xo6->#8h+JPeTa!4bsgFFIb+)ewX*h{w9%77U72ieBb$TKuxZ>yY&076 z&ps}*J)DI4lFO`2Q&|4c9wz1BII}xwFp(l7^)?5ZYT|L$tF%T_UI!LGWy9-;2ZKm7|lM@W!B%ZLlfQa?pltpp`Z7DJa=mrM5Dg8_lhUm z(bUhe?QsinG%m5ReL8wSnp{4R#hXcnW?m0};#%uQ3wvY@=8CSOd4rhmX~uMDs8;fU zg}x1%ieM%A=-Gw7eQ*-;DmjNnl1Dga>t3Syqm)C|E{SMv){)W5SQgDBKX0u$Sc_)A z@!jyPJBkL6n``(?ssU5H#8b5hJz$|bL%6=~56t@xzfyft0(3KOqd`ZSfqvgNY06YJ zV5rKZ*oxT?441sMydGHt%`6+4L{=OyfvEVay^6p@b#X|WxKC%2p#9YQ`64i}4hSr( z!~r9nKw*~xFVOD{oGS}R1=5UEHruq=x%cs+m+D+?Xwd7i>GFR_L1C3 zt&khg_|j#1Q7;0GmCBjZ!tp>`?YcysDG1c{47DU02Z8Y=O{42`E?{Ayw<2jU0M;wY zwVPEm#B)``SzK%eFqOMYsgFGc=Bo@Y?fhN9R7eqEZz=!`uCa~{?>_*&&%yD$$a0|l zv9h+vI12QZo$KKW&A>E}8sy%09#~hhz4Qp8i+cqC* z02XEr!|B^qz#_h69;4j>%xt%l)Jdd(K8sV&WnBaqEG2cDybl4r;xk|8{9>S$4hppE zIzX$X=C>3eL%-|!2PQKC19!am%smkn75hJL3Q%7z!1r1-6S0ZOpikA z+nTe9&v}!YPv--h^uFXTjc0*bkb~xG;3Hrtl|CGQtPL3TL#LW2?gP`!dX=%IO<>9- z^EO`L1*UhY4(_=}fTd@3&eFjU*mNJ7MV=M~Mv0!a?Ll{7usTgD5KIotqf&c*Pq6{B z+jzHXTR5XBVaUoQ>&XX3d|jo5dw1T zz^btS;l0;6z@kiN{;G5m=#y0LjJk^eqwtEi%>5!@8KHETIY|qwhvyxAOIv`&L!a%U z&k0~(l_oX2>jTLC# zyTp8RC&r~#{+JRz2pH6Y`?zMsfrVDh@L8V?FlHQH=q|AUdKL<2|LQfMQRxy4{#^pp zLmaoaBb_^H4$LxW=#oZ-~^V}uc9AX-2>)x2Wx6`Q-I~-{Ork)C16gVHwu}q z0cIVRsQyqhV7~1Z{UqoRFmnkm#YnFLDe{b@jR$B}QS>k!cNd0Z`Mz6#Xu zS;VFh+-4$r(9i+^}MS#A9HG?{d4`|Ur}hfW`aJ`d6K0 zV0F(bXAgKpjMo_6Bi0S*_9z`;%-?gsIq~L`Kz-rjT5lG|9&R$Yb3Dd z4wJJcIs&WnWY)DGL_fI|NGfUSfRVAiQq=Yi5tl5L;3!;z&pzNa3CiJ zc%#gR1a!uMx8@?v0~%@IeTSCg$c_SUH~X{ROal;@Y(9?9E(bxGbHU$u8h}6Orm7&L zD+u(=36VA{0v~?>O5nM_e!lyIDtBH1@143|_S=KNGb8)b_sKWlJv!?Q zledBU(URoZr4-;H*DO7Acow*M}qxxexV%cav7={7P40of>#~lQW(o2-C$pL@GzF=;jDG)4+ zZ06+M3xX#E4_TD|BKk2e<+P`iXlIE=*v1kBd~(yNCcFdcl^ ziIbRz&UEI5(gYB?eE*!`-eM52mATO4G7kdL(TThgL_dVT?og||^65bbrkX!kw??2i=Fw^VI<7@>GeqM5V}QsCymQx# z`BRDcbRRgs)-(XTN2I3M9piwv{erI04{P8F@5r1K_BCi7~e%fpAc?nAG`3Vm${nMJ=!cU-0E8MxvR(A3LynJ<@=fKRR9Ja!C*t z^`Gtdm>YE*zfRj>CV7AKS!zb5c`Ikzq-c(5Y+k^{Og-INP2f&jpi-`i2`pe^U*wz5XKXjJ6M2l+L~ft zrZf;_PTST|Tn4<_80t%01^m&+r{@a_fbg8}j&y$;NSy4i=-0jik`yX6Z%^}s_>Yvl zH*q+S@XtD9>9Pp~{(=4Z!mL2pOFLaq+zsN74w@9uN&`O6S^bK|2f&XRv7Ovb06ZZ* z_}CEz5PP*(!tM845Q}yVkTZ8o|GDZA7J*{V&MV2wZ46skrNPPKiw6;Z-eCG zgTO028X$>F58c+S0tq$W8YY3)AgPTcRc?-g#FNa2!*li^UZVeK(Yh7H6P1TKyB-5! zrT&vlUIXAww5L`ZaUiC7Y;Ql)E22JMpZD~1Af-9#9YogxQrByfEccdx*sb1F``0WW zE_!&$-a!mR5~E6bSdu_wNk^;v@KKNyjJFP5Ea5-bK67Zw#j=Et!u^_gyvPKnohF0%>ZrsSU+P3VBo#V35E$_ON7 z#A>{V`*q2~59ZVwMnRHJD8Jg(6(p%2jYB3ENVpg#j|Gf@)Zwtxt_DQE3eQy?Rx<-} zuJBJM4u1!6FSiRZgpVK>sVmujAaT1Y-|cr7i052x5m?z?*SJg&O|l2}aIlVit0QsJ@1GpBN5UIHm@*(QUOUTcNK&Rvia z(0qzMXa3j!iL#Sf1t59sQ(&$@8%U{KAHQCA76`Sg5}L*>Abok4o>Dvoq?W~NA4gFE zVNLv{K);=5G6V#ImiZOeEg*0e-;0-sC-#e+VLk^< zASlL7yAk&>;u62TguLbfkAcL6l(&GtQW3tE(hi~qIf@UtMnNpb-DRcjCy1`R!!gfZ z2eHyg=AG4bAbe&$&f&-ec&^Qn;+s0e`qJfjND&T%6lzU;zXK5B_e3{V662K@TK3M@ z0PwZf>^)P?0Dj%>6PMTu;0waYkERZSShcR|sm9Vj6p!zkqZEt)!UZ?Yw|jz!I25>@ z5}XE-TR%@8V`TuTL;GqU#qEGNbr}c$-4j4~!zs&Vss;q<0)Ii@Qjoy2Rt!B|1j(xp z)L9*AK_WW5gO)uGB(n~3D$pMSN&ors?7|R`3M(-*OCeJE2ZGD`?ZmolO|pMQ#7F7$ z6WwKBkZ6kK_=OuI=IwIjw~$?sTIYzVer^tu;)|m)Mn)iQG{!Gfq7TyAx6Zbn3j@ic zbPp?;%0cQ})(Nw~gFu)S4!VC#5D1yKqcbD|0UvvFA?A=RNLkDT-P2J8nO8j4Q{OIv zJfELhl3b|gZPr9iX4ZTWCnlXTfhX9pzM59pOSL=!eNc z+wv!|C@i40%<}*ps{2|tSr6w?O^0eb^UFAt^8P?xN3$8K*mCZ@q3VI!+CLq-xJ8Oa zD=Bb39~)6ugPQC4*&FD`25*r}eJtwdkLHlm%tzl2mXb&W(xV3Fhd~^|wWzx5gsg?M zJnAS@7CWjpfO|^}s76YRBu(l7YQKJBZ>;h->MDGC#X(IBwW;}e zSzN9|&F4v|^o`lk$2h~#k)0OQ*(w(7J(Py-ME6}jQ9OxSxPR(opPR-i+p;XCG9RFJ zD)s5#53R694y`?hjRR2otT!d8mpmFdF~W5qNClM(Nm|>U+>2T(CH+6MTc9#}joasz z*HOng5#c`FI+WkwR;zjT4Qg?*RXB&fqb?iVy^Y8!ESOEMqI87`_3O6Y{>T)MK)X+c zL9iB$jCQ)3XkAAwM_L{q@is@jocc+$*X2>u()m&PTaj3jM4dBf9S!QM(R?TI5JMmR z%{FBEt%-Sj(iwT{3F^L|X;^O(hvl(ZeU~NKi<)antBUp&pr$Y*pVmDVXlUEMM_{S} z)zdO+jObUR@{J&u<%atx?|kDbr^^deZmLgB$eBiU^^t2A7xK_xgGCwhb!Idn-1b@S z-FcL}RsQ@#We94W^f+*Y!vS^PIW~FUbqY1`bX==6=R)-tU4LKMpN$$Q5B$0skb*k> zsm8clI#I<9PoL@pQSAApH`ljy%uw&Vj$BvkBh#t?g!IvLsU^A6>CI$ z6`@wvmaV2D)ITb}-+7r8)s5?#-s>zxl{Ft(=*)^yn$q*9YEhX8p5^Z*f4GGz^0qj= ze$t^%`4QHWV{T{=qgMA{eU3(lvja9CV<_1sY2&a<8tUZ_d93cDjJnd<5^C}(P}3#u znMb+T(C8#f(x%K|G|psywv_2Q8u{vMX?327pV*mFiO|52F^|fyv?3-HH zLn9_$%-salFol*HeXd78UL93yO}K2OQK4@VSJ!!iy-?FnfnU8`ME-%&{1eWCMEvu~Jj%#JJ>M!ql_<$j7e%#+ zrPW>3Gg)%v?qm_Ft4ln#9a)AtN24j<%8Vm7OH%o%Lr$o}@z9<^$`sVzZjwICpN^Vb zN}HV3HPN?|CHBuR-bRgqTJkMV{81-nne@$N8Fh;sAvlpLqLx>J#q<{Bs4L~%*Wl;N z*vIeZq=VcEs6%fteTeq-FW~G^U}Zkc;D!{-daEp^0e^11%b4o3OTdr-W5HMA)@^JVg!74txp&ZD_Fe zy7PpoX0ee(scVRL{a-6(bXX5mOOjLwOqw zJ&u=n5VZ#l))?09+&+LjukmSi_j{pgmbf>5-1Vp}HA(ZU$2s)v;;8^DK-9mglO~r? z*DFOyuY0YiFH-uD_o1tQ=+~#IOuv0t(2yQ&|52SG1bxx6e$o3;V-aU@&GrInd}Zyu zGRKb+?{9cr{`dlw1&+R66Uah!^B;aZc=8kZoeAb@s8~Zyq$2WZuV0~&s+S{QIJi(F z%L`JKPj;xQ*Rl0scn0dG6uKY5(29l{4Nbt?3Bj^`E%U-{)F3=@=N(Hw>OQ38JXmuT zL2%AiQNt8!nd@$O7}14le{{K=d0L9Pv%Y8cxpAZKY~1Je@iC)zS-DFWPvxP?4XdBp zISHt<=CSgb8yx6eQB(UX?F2NEMYi~Q=_%%aCFJHk)@anDAAEeZ5uxC+rw+MfUr_JI zlv889Q>f>Oey5JDDbP7RjPW~_3p9h2C%MPXfkvc0Ib3K5DB~Y%>wotEa$EP1Fr`JH zaMWxwJ}nKj(hR{4E=E9^VJzt7RRMIH@6PT&hmOxPh7_!BQvM49MN$-oMfL z1eBT-`x0)m0rjJgZ<$i*fIR0k<5cStpq6&%l=wOZR99v`8I@E4-76h=yEGl3ZOT8H z>6Zpn{#LOXfvrH(lF0lqd=qGLjGA#i;y~*`Q$m=j2dcXor@h)Rpb9__SRSDN?V}1 zsdn+e4{D%sjaXCcKLM2Xo=Y5MY(Qx=vod0N97w+oQO`Y>1^R63<%PzdKoM7_LTma7 zXpCA%9+!Lqx2ftt_uP??)D!}$%u#;IfK;G7q<*JUNdd^p-moSr z5ba*AA(@Lk33Tc6*@hloKxG(x!J+G~kQt%?sFOV4YK05>yj{~o9s^fwB``u16ya-Tl zs0Ry1X9M-!$q%t2NkI8xqnP(a1yD~4EvPEQ18qUVLRhdM&@q!8M6G;4L%K#qI28gk z5P9yA!~js!R=&;lX#wh;*vdTOIi2PTsiR~0F`!}4k?ORj0$MA2HKPh{;yk4ViRWZM zed<145yuKp6>pklxxNFM-`P|m8%{tb!!wf9{gP;}yH}ju5@@q8Q%vBLfxa(8`o6?- zpb5UTZ!Y#4(0bv!#?ddJ<U9U-9m9!#yXl>|&>gMq)z zz5`=sVfx6^4q$YyIQZanI*_{jRvMgO1xl4|(OX>XK-taqgW;YzP{obcyQ`D~6me>hvdCJ(gah4=ma3V|l^Hno@%5jTZ)$19@F0@YMs zUnCDP&QGK>hYIt6cE5D-O*Ue^u$)pnf;R@*Pv0!5wDf^qk0vJOYy;3{uDSLp*Z_4> z_wx)XIiP-F@-vt;7N}w)Epc_EK*Lgb(~oHcD8AjQW+SWs<=J|k*Xe#hWBF-WYOWTj zDT-M3t&#xU>yMqwF~s^lMwP#MatlaHR!+-PT>?tWUh2@FIG{*B8PvMp7bs&sojGnI z2$X|+KPJte0}9FYS9@Y*fRg)Z*v3gypw3T_mdrg0bf2ea#OdjQ@&d(ZgGDINY!Y5d zJ4yqMp2Bne_r&^H5UISJDF|erXmQ;iuLGs(gNVU*oj~oFo7dVq3N#kvmL6yls5Ni> zSdW(ja>E_|M_HLbSMZu|lzAK&?(plT3$+0Ghae@PBMC&DeyLE$i31(&=h)0?4`Lm9 zzrNhh22@$>JZD2{fb4eCfPRt?(BJTB&>QdphVJ!@_9|Z>zdm);@=O#^Nt8B4Nsj>4 zoAg7k;aRJYroiyfBTb=m)w(?}fRWwS{geXAyz*O8vNk}&IQTVfzb-Ib>mm7aX%lEOuFJ5Tum`e2T1_+FQ$S5R z_EFQ<1t_CQWb+#wfjn+`rR-A|P&V^Qmqe)mb$3x(L)S~7u5^CVc;ygKwa%DyjyD3e z94c?PT>_Myfh@NiVt^683XT}R2huuiWYzozP& zfYYOEN`|W!xGeAXF)2I-9;Q%7e#SoFz8gPVX-SmVoqt|2?g=~#i^Dc$(!iOVD8dsq z3S8{`M`jZq0FP$N&z(|c;0&gk(g+&>t|ndK#<2syE&9>Gi%7Y+L#f;hJOTgoilVJLV0eI8tf7;Kn0B`aaJj2uy@Y)A#y}45ce4@chcT7!zuPEAM zdzBfu>e<;Y4deq)`0r|Si8H_zw6IyhfCnz!xibsqM}hO_^NMd5I)T4L!u{wTZD1Q? z8j;$y2A;-+?9k79f$!Ah+}DZs!1ckb$w;pmc&bqG0V7f1`quBW5nl>ixG}Or$*sWo z?%u1wC-%S>(aQKDd<}Sa=j*uFRe|SjubQvUHt?#>lt{EP1NVZqHRpqyz#|s5cx6)* zc;ET_ZlDqY-X`Xv=%1Rvmv|-7;tefuTIv0ee!2ld6ty=*Kd1s*7w^YpOFVF2%)Cw| zyAOCqb$@rxumWfQr!Q=^o51fFayK=e2Dm((EW-2xi1B`3_F6m)xF2}i^W^dYueYR9 zuO%Pw>_#gWIei4~3uhcJMREaGa@Z%f#kU}^-4h{pIRN-SZtp(qaRn~J1F{vKZ-8gd z*!sqTJaAXX%w#)01l|Dg!Qw)H;M(hV`ML56a9^psex+Uocs9SSsegG1yh>LlL#OkVX;5*qLYuM8TynA;mT0Dk6Y2&Krqs% z&|38_@Sp#L$cMpjD}pnXD7oxgN{E<-Z8*<&F&AV()>o`SAhOCp*AZ z%OG!aivT=X!t^ARbHM9cQ%ZUx3pg2j#!~&>0QY=+$pGI`;2upa)lanm?p}^|UzI1o zldN`UdUXbP=2yv%4u=5$T8_Qtjs3u@BfIM6kOe$bqam?2F2ED%H#5#q3;e8_o_-l- zz!$J%UvxDAxU5a)wB*8pJ2)99FXjV09Pdf4u89Hf6~~ykqyga8QSfYkpxp zTnM~2_xMN*?*Nau$+1t{#QKxs^Vr5u0CzKu!9JrL;B1Lk{TM{dhlbj=S63u(v6AJV zx_KG6T5#comz#h~O!-ctwi<9Bzw|Neo+@xv%atyeb^zyh-m7Gan!x*#M!aE02)KXd z9c*v31Mac+iV2oBz;h*=Af@*WxFaTymWhM`d$OCvmpTG)>kT^2GMfX>aX~xnkn6x> zGnufd69YVD40S3JTfpJ#VG&141N_%7+gp6S2E6lrp=wczz(tw=rbps7aB832x4?f8 zc#V%R&2O;+&uvq|)b2aLg^BZU38Vr$jZb8KkT(%eJv%=+M1fz@=NtL2D&XQ`XukPA z6u5@cJGuObdHJZeEGuE+yM>m-?(xCpI+Hk`7K#u z9X_<7OgRtS@@@EWox{L=w7J}ENe6h$qz_MNUj(kF*;;Sk`GDZ1lj`y5sX%Tyo&+)VWsb8UoxuoC+1%%wPxpbqOzYsvv}RbT6} z3*P|G&uf3|*>@1r$4|t*I1OTo@A=!^KL9~OC@7Vu74W^G?|E&=fza415y$-;#0B#B z-cV|QXoIfqN_sZnwGw+-^7{aP&Uk=Yaux6$?Gb*h-vQ6$-8s(f1Nab=^0`1gz*9h% zD^4B6ALiV)y~+vV1?1quKnwU+$FD{ib^<|(byqy$BS;1tr&fmufw*IUgOL{j@W!=^ z!soUC-w?NLg~@<;VZ^J!kZK?VL~(eE?E`V~o99&v)qwE$v0uVKArMj@vg5SYfRNPX zQ?5J%;z85VQN%jH|FW<3x}6P#{Kt9B`TGEGe|bP4%@6RnDWTlxQ4lk^t86-b5~S!W z9VlwXLG%e%N~@j_lb>^dMu zdW(~%^e%|)QQF_OY6B7rd8a-lvVla!i%ZodZh+r>-kyMe3gYY`^VfA}0B?DzguPh| z#52NQy-|t*f(!$xlV>py%$7JvcQrwB-${vn;yz1^r?zrYt41|$c)$;Bg5L*j0dU)FbB$_M^v+TCFW@0=K-m%%{ z8US$*UfJy*w}9})r|CD=0)*hIu6dzTfEVe#yON&`QncJESqlar;Un;I@_ZkNHI8hi zUM(QTYZW`oK+F?b{~daH5ybh(s=EW30pIx3;07BG26F@`2OYbrZSME&DSzF9sq&^w)wQ~2=A(6 z|RIo``q2=W-py-K8dzwzWaxskT}Bae5HFw8rf=unCguPSqn7y&$>Y zqT<*r29m#ivvJGsf=oQKH6pnWl2ul&r-E*Sh;FC$#f>K*n(y*aVlD;5lAO+1Dp&)) zbiMjsnj8>Ll2;zmxDAA!1(Pp_l0bBV*Hxn<4+vp5!qz*9ajRINwi>4aaneI1aScSA zMkZ4{o4x_!*vheIHLpQpUSA|Z_ZNuMrPVw4Xo0xN!ETW|CjkF>*t)IuJxH#ty4X2n zfOyT3Td4s=`%GLh(&A)5pnW6uJcksS{JU zfdyiHbV!HRs{=vBHmlG+5%95(-%G##4I&O^Cr`8<12M_Sa5e?<#Pl{;Z;ME8sfSHnZ$C>0pQaL zc5DOe05213+s^3^5&mq^KvMi#s-eIFNF24UN%0B;(F)U2=NuLw zR40y+yO z;mYu1vI`kNxO0AAKFbLZ-*@7Ev|9j(y*qKcNtq2KooUZ~d5{7k84$Veq(6wqtf{ka zQi51G=U{N~ULc4+2um~_B(BHd`2qTK*x+yV5OKN#SdYQ=eF^)rvGN1I4}@x$VJ(rp zz8CMOqe7eF_~_mMtjUorrC;DYR`_(>sB^OntNbX(9;NXX>yv1*WTc43$}C1ncj9I##NL z$6D_&#AuWqz}mxjOdXk0v7Vk%va*>XZ07xtlTA%J)^fzZnD=cQ*8C;w#oJ>kSW(p6 za+D zu*!`hJ)w)#SdP@5$DfW|!x}m_4(@Tz!YZDde(^50#;OW$hxc6J!@5E*cim(w$BL(2 z4Z{V?vC`{3@9t3Hu%?&gn+mr_(d(62`s1C7*vwXqlmv5`v^FFJlZp_<|3Z4TUN z3^ez|nkOt`g`5*A-9>w`XjjJki$+>lWyE;o_oN9_7C>>-OmPrvd=u_JMQe!F6;~f~ zY}k(#|4h}U(~H3Bg!zznZxPn(qFK@Qf(u*VRjTP{xYx0rTvj-fnfc7p`=e5{{CC~IDa1eFApe^f7@Mc?1hUMNd!Fwc;VP6Z?R6}@UQA+0ObJF`QSeeI_0g<=#-S~-SwJi0!z=Z-suGDwwK z=d-bn*ga;e4G3H)UA&)7V#hofBBM^#z00x#L)c5O4hH-(~2np*tHZhbuy} z-XhUa+Sv0CF5S9wBij}e(>d|$a#s=d80#;Tp zp~muCBgMk3Sc~M9^Avrb(aV^PFN~i)pf6La_n&co#D28DpxTnGz=~VGUd()AhhAq$ zd^qYDg;hjwH&)#Ih$R7^7FXOOtaN>sVn3WjIUN~NCKLBiyJ?Yasl*`^bs=v$!h!<( z>U^o|Zp(Lsh7CwW6x*=TLyJb57nZPk*{P1Rae~-~hnKn@Hf5uP*~OHw#k=T5`f#|B z*cyrz=q$BTGQ;Yd%udoAypD|=vb`rGy@Had?^gsa?)*)$E^&&`+7H)IK-{A&;nzG^ z^ObX+zinmFo#3>JcT+g*L&OI?|2?JHu+5Po!$O3OJ-a?<93_gia#9zr$UVZEcq1l@ z=`gI*t3QoJFc78Tt;uZC0c%YBuIey$0_!WxHSYPGj5UP?sqNyuuvQN9VwWWYtkvM` zx6x}{Sk*w@gy9Q0EOAzu)wA>}maF*n(E9>ks5hfaW(C#}Ay6o{%w4SFTaJc>nTJ7W*nRPgYw$O09)p9yo z-~Y+eKu8R2CstHBMw6i3n0DLcyksETi`p1$#(~s{e>Pfb5=h)W@e%rd1Nq)1H7}J3 zAU}IeezevRt&?9LN)J4WHlmGNvZ{%8?Z+273+mBUYGwGNh&Z%mk&ta)y@_@dI7O?N zuAz+{lFP46lFw??B?jZP^k16>Ty(F-R1@M%&{@zHHj&5&as=wHA^?Yx$HHZp1$Z61hb|(<*Wx z(KbJ|-FO)7ToUuRQfQBM)^o(Pn_JMD`Nz!9zb>GaaRWbQ+HYw6ZN7PD&k$OlwYYGP zg$Jz`>gP9-6{AgG8gEm^O0;HukR?Sn3ayphQ}!u%fL3aTY`=M05!V^~Vmnv@?evU^ z1!~+yD`LH(uBETg>bA3aW6)`|d(K;2R6iN58l}qnjbB7tr1o`$WO1}cQmg3p`8wLo zQmtF^H%7a^Vxnybp=cwyQorUA50EnU&Yv>810?q{b0p$q7ZY8R!#sflC(c+*Gg0L;OI> zCb+6$Qx250yghn5k!Vfw@Tas}!$8WQ?|L$s97s#ZxH-%?(JE!K$JOX)`E|y-MZ6?R=x_{ zB}pto^Fyf?ZQ>Qg{I=6*oBu}3ejPH|_hitjjP;M?XSu|B$h&dlNgY}@@Yz`?B|}^F zxI~|~J!tK&iVG#}1+?4hcicqyA^JUOycJ#450s{=ZAo`*fz0P|U?Tr1Ae}vv-(yC^ zV_caarDHeRQWt8dzGR8E_dJn)(e@H;Jl-F!^KleyyQa%c^XH(=NG9*E-$cc%$u#>{Fd=uYmORIo3}>(!_k}?z!^$5RlpI zR}1J5M4M)@-@C%D0husY%aMo=#Ja2=KI5u`mTp#xUL$VZDDkCm<47-BS1Vg>&npFz za)yv^$r?b?;NujlD1)||ldMLbTtu6CeePclu%Vrh7}2moA|9>#na|AR0*R5Gzk=6o zAUn<3{>^9-$m8}kBwXwS(tK&ohlYDmDCma< z+R=LD5Z#=?CA4NQey@OH9<5$Js-Y{IgSJZwE?6!{q8$&tV93@-yFK5mtB-i2o$u9k z6p2wlmb;W`tKN)u&6jcyr)r>;=I1tk=h@M39)&MHucFXuvdU4OfmO7e>90sr!-h5n z6*Y>pCeX5M+!4oe7qpYd!;XJ^8~s-Hu}wT-hSoxw;d+fUkWA=vKA%-Zo1QmQvrgSd z+ftPd8%JIP>mi*>gJoBMmF1zLpi4HeC|6YZS^ff6w#*kg6n(%(xuhZbNC{YW#|Bjv zn}H>x@{=B32bgb7KYBVG2FzhjM=WJ!fH7*uFpGf~SU&7IZp;z^ECxd!+826&?LvI4 zLfa2uQcfv4GR1&>?xJa$)e^8csLe}EM+2*|@PN*J6JVvk z6mn3e4Ori{7R~3>1GDTKsxM#P0?TW25+zzYV12~iR+sn|n9hui*hbg@OU&iT5a&2x zar*S4^M)a?4Co3sJG=+hy%`3TE}wyQWbU;{Z7Z;R8ZbW=s0b`JUqXIUhyknm+2G3G zGQdPuc7A?_7za5`J?-j)z}nM)_~;#9U>CnAb9T}lSUd9fb#w0!^~e0CqBQ~*zK49m zf<%8~bdQs!768j)9g`^|Bd`WYu}eJ-0=A-WnwE|~fVI2q^nugnz<%iDh);n%Flcsn z$t(5%(=XiG5fvOTPCuR1lFbB`6Wk`>L=Av(Az|jpAt7M47VNCy^#hhC$0jAy*n#Ev z8_uPgd|-UkeKhOV3~_ymcG9l}ft7WDnj)qK=&0Vot886hl!@-Sc;FteUO&O8`*jXj z%-pZ;|J4f2Pp`QU#>s&>RQLGEh%>OU>)zV?$^_WYCl4ptX#tCIYHq!q9I*3GTd&eC z09(%#Mb&jxV6&L%_`>%PSn5Q$!R>5cAU9E4;f` z30UJjTGr$*5%ZxMig!%}cI?t^dkHFFUg6H$^ODA2G}I4 z(nHR)0o!de)7w}nFvs4qUJ!pptdp(oXTL*=exex0=sMLaNq$G z;NYk_Vx%(-9M8OtBsISRHuru{0~caFEc))druzg~Nmsah`3HlvTo423QXndjA?vCyosrAGan5DmS={PrzFXN_3S*Y9y1X?3M~`0 z#P=%u(do5t?-C-8{JIy;IuY}mo76^91?&!rI(Hu)0!FR4A0&3~V(s zY!CBlfITyxti`7i*q4*}KJ0!2_LeV(j}MOmyXlYv(|H46`_!{u=3ETynm-GjjtK*c zX~7BcZwbI8u}?dFmssCJJsgXA8AM#QtXjPa2R3DEgFpph-G09o_wdJ6VATq`X{AyP zOpS2_>TkQiXsI!2#>4@v#~!}6&|>~W*{MH>vZ#Ck)+nEpm4ZZIGUYzG66XUfFC(?f z7vqVz&ZIm4&=8mp2V}J$j0a}^=f9pjXb0wm{uvn`Jz(X?UBBIYjELi)>rYjTfDPp) z&(#JJ;}Vx8m~@(m$NeX3+=+2Za2d4|CC)F~&&Wv12dpAr7&^6yxO!gSGUnP3Y;xJR z=9Y(vee2PeinBx<^!+OLlkfsovWgEyb3cGd^OLqZ$7^7?c~oD*kceA;XGe|G*MK=C z?-d%p3CwfHFGXnB0fUFjdGuuuuqJ%}QK}u0wT=IvurO;fyjq$Rqmup zz{TDQRyuSHaLSP$DuPEr=pD1*GihnSNk(Rs+Vz7FkNPi<06h?4N~;i)zpK0t3xF1(*R^G3HP~KCO2LcU%qbo|9 z)^rA(muJ+N(i-6K-#crXE&%S#k43{CUJy~)m6Ff80l3YfJ!d_#0GEWYP~!VfL{@nH zAPoly>}$Puo;Dmr6mw`4rUe1_Ywta=(c2)(9<3O%_Z5ijA7yLwZ2=K7I=ds8T_DVv z6;-cE1-QjzmC`W;BJ$+7w-ShUjvd{2$^Q^Uvi(f(?6V-MtmJe`FB(M8clWIfih+<} zuQY{PHwbq3%#!4*fV6P3Ga+qnzE>9@r;e?0_T z`=#Yf(&r#_P3es_#WTPStv=_I2>}sv*Xw}NAny+njUOK`P~FjzDb=A^16W2_T*#Xu?0~Ef!n!< z*+A5_E~xH|FNioY^?$q42RQWI*e-OGsJ~nC7fm4GwlTddkp;kIftZy#vwdX3~kDOn_rCSIE8G0U~?ChQ2I51Cff2%Ba1yAgbw1 zeeit&h}`t=totNF#FKlju4pBQX`A07A@&XY+B}~}xDIhWx3Sd~A`ZXW$BTvKgUFS@ zD@L>|fXf~|WVUPoxO%c?f@2Ke=p|!A-b#b$l&;X=18NYXwWPG)Lk^-kD_Vo&+92xS z@$K%7We|0`^yTe5KM3U%W-^mo050T=VwAuP;M_DKl4dnQq#&t4@v{Snu1iFc9cu!S zGs$?jNK+6N_;qf(*a?JcLjpJ%`$52B^nA;86%d@CxNhL50Rq$8ItRDqL5Q}KkYZE= z!dW(Dj5n?UuKXOUv^*&Y*Iv=gQ@jttPt6|Ao)ZAvO!3dv^$ZYIXbQ=g@deS;pCT_W z7=xJG>bC<*#5^v0IZhihf#|)o<&=lLAe?;2U9FcMaFcsjCGVdEoE8<^x@acgy863m zPZROdeK3{wy*l7rYyH)IlR#*7AM-VeBCJ^g)@^DQ?JBV)a zo>kuS7(~LEs%oxO633S!Vl7UCNHcG)XJI0U!1dh#Jv+dSP8RV!P6pfu^84J8L_AP! zr-#pSfM^nRa;MJ$5M8U)k*|*-*41Dhf2ci(c8`soG$7{5aFF2+cL9h#)ypsUYXMxC zy1vWDn;=}Y@jbn82Sl-fgKlRJ0Zu)Nxz6ATh*I924ht*>+#a>|krraVC^xwLtn~;8 zzgK#4WY07RQ@l^i3?}xY`E#pR%KH9LQG=6GZKgaRD$tj8@#zI(-possd7=Qfmy_e# zIbvKt7WFf{%?BJ?u%us*J>X~-wH7=$0cU)QtMeBkKHu5nbmRtz^th|tK1>c`^a4=> z#Qi3YFMQbGj2qwzajbiMFW!gVV$AA}pzsufk30T*AKpCjr8A|2gj@`}zNB21W| zmL%GFXeEBza}q?$z6z#ZJOj9!x4t_ueg)ygDTS^{E)2odHpC zhe`Jv7zlGoU3}8_7WFagx0HTNjmBiK`NG^pOzG; zS6_PgX>|=6w^w?(;JX)1d5d(>Gae{@9Xhv&X5TIOotv*iKfjCy z+i0Ce8N`YTK%$aY7T8<9aHUx6lIb zUWXrF_oJZ#k$s#=&(TQa?%u(AZZy~?-owL4j~2CZS`E7g&=gg9Idx?$n%6p9L+6`@ z%H13Da*yt!iK&XPpzvxmd%hsnaab8md9`-=%sHX)#_+nt!7?-uD65#{Ly1P(i=FpO z>_=Vd?&Jp_WTFvaCE@m^yQt^pk(3oDTJ*DKs^WX>7U~HODR4P+5)Ha3x*CP5qv>Pm z%guMbpq>f&dzgP-ZB@6hB@)-XATadu2D;_)bUfO z|BRkW^1g61~%Dls6{q!%DYM z)1*LI`t&2zuk)oDBrl`Z_nFSwp2euGZYb@n*L^fSvu``&+cN43h*LJ}7C-}iNHvWy z5Dje=>041eAmS%em42iLEm?^Sp6A#?%hx$?`xlm?zG*J1ZH+f*%9dg%{ANCyF)X=v z_7M;2#nnouJ*GnA=dZllyj+KR~l0mLlJJ_g^UVl?2b)T-pMF5FjsHH#!MDjmeQ(&m~3+n`bJoC7bdXVJu28_8?#r_tD6D_yb=Yp7F~QPoV?08KVo zm6=IXpkcYMhPlInXficfJ48baI*OM0Od4KCKZ{SFO4qxSFDMDAl~2=nhcsQn2|m>Tn%hTKP! z`y!-#zYL(sjUn&)S=eo+r+tqT6ZqE58sDN2 zPp>#B-c>-OxWvIM4skSDnBT!YUuNUqu}!<^WELkl^{ z_FX{z?|t9PpLn3&#ej2337^miZbeqsstJu4MzGe&4xqu?fm1X`i18f! zD1aUppfQ^8P7i~A)KuM}o6|9a##~uM0(ipEl)-ZEw9p!wE@DmKq_rjHX`AlG$s#l! zP_^g2+Y!{cQ*%mFi->Pzdi)o;A{uqR9(#B1C)7xp&*FJL5&c+<5eVKq1GN5U<#?y& zfUe2>Zf4bKpmPi28s=OEx+80cwzP)F#MXq7fO8x#-y|S4uWjJxFOHI!L$VoF~Qssmz;q5gaaP8mIahu z;yf|+nLuls7HAVre4ZjP{QNs5urSHLp_@AaRQ8;+83p4&b92as=kYQy9;a4ldV~QZ zUr8d17a1@J;|H=O`hb@ENyk&VWuU6DpR{{H)bDHB|8cwnXx21QW9C_)xqVKpOzHwK z94LI2W^xATl{hcAhJFD0v^>*PO%7n5*JIpx@_(VvZ8y`}5|pqaW>o9`TbLV{Qa`qs9ED z_uqgzp3Vp38VB0xBlaQBegkRU&hlg+572AHivQ+g0~!-MiZp?{K<8I=jh7=5=m$N+ z9uUtr^had)M_7LVo$_%bO@(rx6{d+~j&}sQ_GRmO_jI63w$%#?xB%38{%fheM89_S zXQv5h0j+1Mu6o!6F%AbyaMyi-@~hS{GU_a#h`l9yLFffgwOsH=D|>*7OjIBI1~4>h+zsKx;hsilKrYXay$Yincm| zLFC|u)L<0QXJ(yyc#Q<;7k8Tjk2(RP)FV;}O-7(MzE?hyOvLYC##8^M&p=CI@jl&6 z2B;$A3?8-j0d;72)Ye!zF}_Dt10)B5DekQ1_pbs#Q}#L7Qz8dwG>QrjY8(uGte$ei0mx+0WF>0c;*~29~v3- zPdq;X9gWEsW#30Ycm2GLom(Z)qN7*B2suFa`O50xd0U{jOd#oVya4o?&dwUcdc=BO z%RHay4fI@3n4R9F0%MLL>4D(_pgV72oZNpMXzaCYUtORj;S-=(^MYH=x@DsB|$v~)*4X}$pZ*Zhh5 z@B0FSB|FzLw-V4xEDj1OTnD-XFB*bsE&}anV-01dJkVEt{4lC`8tC8IB#qt>0|so( ztypFOXs*`DbU*@X7>VDpn)FECrn>X^C1g|13seb*HgS{(w) zV##Q}s;7S_z0&WHQ;%hdcF4BHZ{7o%YS)+a1tvi2ixW{y-T`{=k9$coHh|WrJh}T= z0MJ@6@RWC-2I}ATyJ=5v0L@_y`Xj1TK)2=|#&ORaXy*dQK9EfS)w-AcV3Ib_jzkyD zN9PmcwqCKvVjgH>`DK+q8WQaZB5vaupgek;WZ*yqP)lC$}nTu?s+p;ar6yqk;N`VAL?}5ujbyD2R=60EVW{t2tdZK$nt& zpK|C2>aVxHyxEQ+;(2l=cbo!f1|&iwjgJFW{&}9k%)>xSX`lO8>LXCPMivHV0|>C5 z(%F!f1D>O6Tlt#Vz?&J!+c)C`yt+O7V~d%<=W+m>mMjCF_JJz>?Ox!cZ>JAE77e@( z%}$hiM}en;nxL@R3%qYeGGbE&K%l_;i$%H~@K?oro$F5lK8oLcS5u;a4-@rNx>pT+ zQ!k#*Kh_2wTj%W1fmYyo=@XH{?*e>{)1tF`7=d5k!!#y%U50f zju|+-1Fh?C9RuFP!tl@+6d({#_d#bf4}^FW?m9%?1nxksbMNt?z)hpg!W4EL_&>KE zevdB&{`gWR)rWUMfWW3_p6v*HPgA!VEZzdQin>*RWghVEz2{nFxCY!>MGE`(9|rC- z@&1_)ynxT3t?%NwV<0dtrul~J9tebp-zbZH4}w)pW6oCwfcxfB5O4no@QC!k^|)3H zTsI>%+T*VSck0%$XU}PX>!4)StNQoA)tR?@{M`z0L;bI(Z_|PMi9mZ&gAZ_(kY^e7 zKLTEJ9f^_%QQ#wQ*U+VE0&ZQ_F1359z&m^4HDeYh@Or04ByJxCp1K1C%B7XSuS|CF zW>!D&hMzB2OVa`#v%^0n5(a?xK%Mq-zb~-&i}9Rxy$#&eyx%jJ$$AVfPg9sa;*%t8fl@ zmW|8(&YuJBo!Fl|1#Q6R9Cu2{F=JP?2c7C_tMHqOBLbJB6_ySj8 z=5dF~YT)gW?)jkX0K5Ye7HxNwf%^c9ou&;PvA$Y-@#KoYGp>4uU9O&3k0<2HE8hT5 zmV6CE;TZ6kTJ631nh*G1KBpK^r~{r6zAKuGlEnHlm^Bf-1^h?J`zVdbL4c)+>cxF6 z5MY1YzZG$VxSrt+X@w`iKm2m8WRqB57LElazdL}>BEBov-x9dpuUMzwxCDH2O`m;C za)Ix%-E)d;4&Z*!t8Kfn0-PVC?ppER1QObt3|z-9L0nZD&w;J$c*T-D(PaCIvPnQ9XKFGz`xXH^2O zwk?y~-9cg7c<@!Hy>$42d%^pucg{oL;Y_nQJvRj$vt%VoJL$mr$#a<^w;MPdo}^`|6W8nI z$9~*dA2{165^u&3?L`Lou~uIKp3Z6R*~jOBr_CX5>%cm(&zS10?3)8#$*@AFGzSp4 zc)L8zs2lk7*2ykbc>wo}!e_$mH7)`_tsh>ty$3fZNoBKb`$9@SGkyoOVkL zxI7>142!A*Vd>^dIR6tMXikz1rpE!k^pW{ULKcYgwmkcIR22w09CbMLEg;+p&M-cg z4g}qqCpWs}fIxQd#;a-?!2h#-~&npArOJeL1VFZNkQ(9W9%OF0QyPvhW4J6@CIL(btkdO$P%yS>|i0?eOvPVV{#P-&BncJKJ{AmRT4Uext zc+6LKwr>y!2K>*(l8T6NTb`uMk_O4c72=#8JRs@C@cXL^El6sSJ!|wj40uTgANOJ= z5bLrM5a50UVk~d7!X&ojV_v+QtH&MljGDe*whOvT4l03Gg%So-4KM zAT~BvwN$161i5Rsm&)FPxapNDQ(EV^rv z0@5x1&pzjU_c`A_XMcOYeZKSWab457W{o-G9%IgVxm?=b@fIGsgbEm~m2UoMLizdq zdl2g@819Tl{TT~U0rlzibI*%W{>|!3+in=%u8zMml&nJe83HtO%yB3mm&!>;nRJv7 zS0!_<@n&gFwql_@CS8;4+O)~6_+p3}+Q*D$>6ww-^h&WG~VChW^5OGEk68*};O z9;1BWq~*?nBj_RS)RC<0c$7b?-=)v(1uAe*dozo^4?VR1Aa9K1Ui8r0I~U#V7^8=R zg5C-qD@XaiDcD35BG47;WRH(+OADYpQN1|lwv#9?6Dso2CL85TAd~ZBd5H4$E_`ga zE=2hi7$*X?)6qkelYCzX3{if;<&}r7E-3#Q*Nah~B~ZSHsq`m)>__>Iw%m0P#-aRd zor#Z{l~94WsWT*l_Nc(>4ehwpbX36e9i>AzhHI`P@3?scP=RyC!h=)!sGt%qT_kM{ z6_^U3csjF<&8zS`lfH@aet6C4_9+47Re07D!aIoaNqFlx@>HX|C1h2My`orL_pZty z-B>@1r)%I-R3Kq6vpF^g<)yn6pP2a5|6@`dGvf0Bq|;_mF|oI8f`ul6|dK>X*LFa7GB)-WtiGg@iYch{i&2PO8N$-r>19AXri^aAC( zaX0SAff|%=1YaHJABFNoG1tw&FYM}a%1}Omw0_96=ewn)Z z0_ER-?7|_{w>`*@0>&~f~b|{Y-;-U7yALW(5FXY3TgmOnb zPI9R`jPj&e?>(~;fbu#J-yIwa#`5@CC${w>lyCg|?KhIfD8J##r}5JtQN9o~F{k4$ z%3nVhE=!q$`RikXaRlansS9iS*1A#N*TxJFzLKEaTi^XNVo{V=NI7$th(5|kOwU(- z3zJuQC-hrZG0IDs#ou@gfx$baoF#KB&>e4;su(d2U9xwMKgg(tmcx6|Id(qeZKL5} z&$mjz#l0o<8&!l>|95Ll$-#gN?;14iO8|UwSoJX?f z;ZnR9p8|c9y*DTDGl=)MB_58q>rnG;jV8E6YltVo&q4t={$)E@|)g-Xdl@wenl zfTJSmnn;L)*C!CbZ7q&-b%X+1M6vcXJM^*(2>Qj`c&U2T{IS z$wBCU$1|bObri}XmNKQx@}NhM^{{tnAXMOIXCA5VL8^qCGkCfVBgv8J!^erk0GX&{ z%2LgN{#bsJlV+qaA|tsKEEWR;3=#P+l%GMpaUe|)ggm3ILO0y83_)sT|d3-0OM11u6B}dpygWqGUX{0db0L@^E+pWU+%CYS>iudvU#YWAE`W2U2zV2&sA6mDAPfY)SkHZ`Yx#9aj$;z5ukUsW&^JR z4b)3+DBTe11j0M#i|QXA!0?n&!%AodR1jY}yz@8)y6BIiRta|@`C^>hz{693Q`*D# zWSbXSy)}>-E;1N$;QD@j;tKSgzjlYJhXRJQvhUnxItU{?Z38OV0Id)EPP=>3LQ`?O zSm<{aBv{b)WPCsvWD7ZhClX#z>6$Vx_>2@LT1CCqRJ>u5G&-%L_ZW1#%vR`iy@0yHb3U~8*3fe2b49M$ z5y0DcMbMrU0enB_9_f9;P*&ki$MA6k2G+(H(hB0Cv+irx^bG=Zr|2k?Dd+=1eEq|s zLCG31iHG&_FeJyUtk+dLj<^wB?-ug1(6Qvzwk!T3%=ZixSYN zq#mYu?Fy8yQE2iXKL@zOyz;3%6p|)oiM{9j4lucb9syHVEJu(JD{!G)*x?eXt>Z1d6Oq-h# z-4ucf=L4EKkKADREyKLYWi4o}IH%Lx(~cA+vlHAV zbvP}*=M~hcU5fmkW(gzS2@Y#c1CUCj%fHf34fUeTX6dqo|ESX{OQfCXVWcNAxJH5o z`WC`u9~ehN4H77j}dEZC)tV z?&nZM!~9l{ZvY0!X~`RJk3q{M=@}zcJLrDyf@d+0MNk@DhqCgoNRjH+^jb6}Ok_B( z21(1pi2JVN291_5Ho{YO(lu#Vb&R1h!smVHU12EwluX{9b`?6V z9;#_F--h1))i0)Yc&K+V(u(4jfSwC6YSW=q(DpIfX{o*lTDG|cm|w*~W2x(L{&F9{ zbEFUS$zyosZ9M*M(+I|9Yc7$lh(Vj6?5Yg=8nUQBALwa)9$7RN>wU{2h0Lq5s&Uit zBCFj}PswXykQJVM8NEUaWYy%9z>On|$lUj1yDpc^BlB$~CR;*t$eNn^Vg1X8kuAGD zBs_OEk%gN*YjZ!EkY%~X#8s|kWWGT8iueQ-GLN38;wF|smiK+Rb1Y&SS)6RkdO+fU zEZz-}Biu|!);u(%Qd%vLl}twFif}z-nT+oi{sIlM(Xd4yt+WeSSq}~>-Moh^vn>gh zo2np-PmB6m+}x3kptkU~3=(9~t8*&u$th&XSoVsb@pELIpT=AChc&VyBl_NRCmC5u zmW{u=F@r2oD)djAWFYfm`-OPb-y;h#HHN-I1;~<`zRY>1eaN~9^=(uaj;s||y068xAS;T)&gqZ&klFqB-nbUBBdgo7ZM7xGkOgXz`ijIm$mZn3 zQ=k31k0=d^Wcz;SS}Cem|0{Y^2<|= zx@lzD&zxZ4M2;*K(tSE*orP?v37q97)PmzV=xA|x|1d%19wi)%kCCIn61(R`NRb;W{v?+)=YEPNhWQ}F-H`x1w&o@24U%1ec;2vZZ4nrI`7<0!A; zdw*p4&_k(Ic5`Iy4XYq3B91I7K8R?Z}^WgZX+YZ z7R{cOM95I*kHYKqX~^6wcQ=}yGsp(flXhw8O=SI2IN451E3%x{xOQMO5n1&1ynN8L z8CeZBevaPEM-~sfamfjjLFV>7>aW>dNM7GmjT&C zTGUHVTOn)A`DB`bg~)2{*AL2%4i1qGklcn zkn=TUsV%-k=~6zj5v^JI$;%zte0@%vmbnO7A>ZSe8SjKFzj#l7f_MvA3S5q2t@J`x zLI|%ZtHh9L#`m6D7hfSi==kWu4~HY$28|*sE|$nRN2M` zX+w6Zk_UY1{E!6+i>xa|PRLrDP!aX}2xL{Z{n*0$A!H-fg6aul95Q$BkoV*pEDt?c zZv0wgge;Uv%Ic52M!qG;9lNMZg{*%R_jqNkk1S0VUby-q;OBaAtE&5Rs{yj`amng* zybdxS*yD#zeMZ)I`@H8;zk#fCmPT*9zKraITIFBYI*#m!FyB;GO+~ic4TCr4&LN8p zo)2bXT9CB^@eQ?ouWzxJhE6iA}Y{%5?Pew^yW+8#O!lIsY*2xS>IVcfU-i=`uWaHMB zT{FQES$N;&VUNf1-dP-l$&YSi?cT1A{j*HSH-0-^y^k1PyjhlZc!ZGErPuzq&g@2( z`L%Ui*Ex{oVx&nC6}2uJB7SL$tTPD=b7bDYWgQ%CDcMu z%7-j+6PX<-g=a|vQ(XwQzKsF3RYR%P8BbY7Frn0JPVrOOqbPO%b?$<0yp$8Do%b07{wG67?vR5v4v%H5OZKhf+p8vN}3fic(P)_3WuWg;J>; z)=sSafl@`c4Vl%AqLjYqN$2AGDEaQMLp$x%DB0>Ilp?+!rIfxT@adu%N;?|C;eVS0 zr70M_B~eg-QZ=pjtVCO&)YE=p8EuLv&Axy|bJ9a7amMUH@diCs zQg)T4z6sAlsTs3XPiVQL6qRutOXegf-Bvc$*{)qE!$MyAg?;)cU3A#M+e_zB;wnM+ zSNn-kqTt(ph=@8$!O>l^9`_ifR90!-X*9@c-ds(1SoZz%*fDK2TEQPA)x11 zhLYXAJZG~1B1%4#aLQQQQ@o$0U=%nyYl4Dt%q z$Pc$%n;*CZf{O~!6Qi$jf z7Fw)OD#gH<&!(&>X;SFvANSu2p#(#DJ2wZbV6szeFkgbne~GwM5CPl`kL9twKpCIagN1{83sx z*G~6HCzLiU&Oj&H0HsN#-(&pr0ZL_gtm|q-HcFvC7T6H^5hYJgQ91i?2&L)AuZPa- zq2z03>FghNP>L-46}m-jlsq`K`GzwVzhprUwx)+rYQ;zS!=x8b+Dj7^8Ul4F^^gje zefKDalN%02yRA?PKK~N~D=8?YO{?)iVq*-Ss(1G<>Y(Jhcqx)DB9vCnh$(PC0j1&P z7G-(5h>|}rR9)v0N2$W~_If;NM5#ZeUI;&+fzopDi%Fk&h*AvfyCh8qDEW(Yx_v`w zC^-i~Nb99BN|Jn(w0Q)N?qYG$-()C288)fwF5HAUAl~kE0EZr!nBhy2hX;+krWl;P3(|jym8r+$BkN!u!ytS_T9K&~ftEK~` z0ZMtJ`kC`a;ZOPKtS-MgN^Ly+cu$K8%HR*-4yVOXx}`HBiVtH^I{ycigZj-VC4F$; zDGg1O((jx+c@GxvM@9s415HuVAGIG1Nv2WCbh1;&pOB$+qGu&N-&>*d+Io`)Ymz9@ z!Amq}Y)DX2QzO4!{8;|_5#6uca1JGlS+Cfa(TP$vg@|^Dxu8@-&(EK}@(raz&ys)Y z%0kIh&u6;y*rKEtsOnEOoj|EqjZ9xRoI**|&S!r&u0p8@&M8CZlTfNr&y?BNmnh}& z8X?+@ZIsHfB59MH1to9vzf++84kbIH%X&V(8>OXYE_M&Vp=`Z{xnC@JQMT%tcUP}( zqAZyys?W6iP!20ibWJn~WtV>=XFGTbWqF!;_mC_f%F-^XXH|6rWvyb^D$72DatIyO z@LqRBITD`Ki(lG@vg73{7jC{n*&VgGLhUc3EO>dGL##2%VqBbCtdh)1-VCGcCxcEO2{S<1Uuq2t7qFuo_TpQ{XR9!|)Y5!E)}!p~5_bli zs!@)J0#8-rb10kFW^ulJAj%%n$o4h+0m@11yFrBXqHIc>5vgZfP&TzSw#zTFQMM-f z*7J_TCvtNX#u zY=s4sv;QihmBoW{wrQKdVLg;n?3>?;)en?|<>s;Fo@$iYpHg~TKoVt*?&s1caHA}N z(Y&_A<)6^L%de({q#!lJ2jVyP(YHaP5}LLn!ku zDO!QWt0+5VXPhvfEXwAD>Z$OkqU@KFUr`8mpd4*F&ou*GQFi^_X8N26ls%~9dGZx^ zl-Ys0h_zB2WpjNHDR@r~WzFHJ4GpkGS^Q`|>Qu#|?8#Z8hD@O-+k$Z%pC&!ZvEtj2 zZMTH7J)38W|8xgsN;xloIl2aubE)TqkvYntuKQ@?z8A`|(Din^Hx%W}-nnYrxPh|w zJaaYt>G$i3&JOuMI)mXvv%50G5amGq@?DixP>!5%E78axl*4d}T*>kz%JF4@_04`~ zlu27r&gUEsWiUtV=DmziRuz?J3L`@(`);*&uTQ0+?58slbF`#U_JwK!?a(&L*5Gr^ z?J9z@780Kp9B)He`8UuR4PTUbM2;m#PZ4E*r1AN7H9g9zMzk%FO^vd9+i1=8RiJEc z_S0Nvwoy)UodK7?a&-6g_aRTol~HzFG3TM91t`bJ+^g@pODL!Q8ckFB36#@b>|3H$ zFv`j88gko@3}rhw;K3ZLgt9h_vsACJp{%RD|RQ+BZ?Q*F-a>)N3gFvn!`fWoA)!xAAI* zE3dJ**}WxRriQZK%;v7GCPCR4&-gx-)kaw#eQ=r>$;a?$8YiTOpu5RP$xeqoK{-+B zul39C|kXpo>;#I%HlYB)#2S6 zl+|W{DmYaPWzlR&5r3(H?v-BN3>3PJat%mUS#A)aoYzzX*J?ZyaiUuj2}~#lggXi?aG@+4ezgvFU;SLO#hklxN17aEH9cXZ zRdfVptx)3AvhYILhwk)e88xBoT(9WaXSC7X0>QYLY;$xsQOaEvoClQEr~LBv~#n{^PsHXC3v@dPolf`C*7-6K8)_>5X99~ zHKUBSBIh3OGDVphuN%$@9z|KbPg(dWI-xAC$gMrzlPHI-6jS^jK9oZ{02Nsq!s0-u zc{DH#Wj*>x_F4%G%A%XRZBM6$a>Og|=U%^rGF9pD=M3#Z*%uSN(q}ACjy)$#_H6W_ z>a($dJ7|usoHt)oIu6%&9>{VXS&S^zCuHRVSraMbSL`H&@A4Eh%^jN_@ z6V+ga6DvDdlYxkcHV>w`9n}TTo`%WDC0kX}0+?hejGr1KhSB$h$NTqxgHe+zBUX`O z7>!oZ69=x|S862zLO`FdQ}PQSD6Tmy-#7{5 z_q;3`QdEJ^S{(oJQVdKKIa=?v(TB+y`f;f$VVF>;>&oi02SUs4sHsLK7$XinG)h?k z1kyry&!hpv#mA0Se`0_M(*wNw(sO~J$M$l601*&Wjz~P|OoTCZw#!RNfk0qn*zndg zhsn78Bph08Fh1X`o72DsU+=o4E#)%9aJx6t8-+bEd39;{Fl`A8 ??ROyf;D`=S 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 diff --git a/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel.rds b/dev/fixtures/compliance/bgm_wenchuan_nuts_blumecapel.rds deleted file mode 100644 index f21e41fe214e63bc95a19e61159ab378fec329c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40781 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