33Development version, opened after 0.2.0.0 went to CRAN on 2026-08-03. Nothing
44released from this line yet.
55
6+ ## Breaking changes
7+
8+ * bgms requires R (>= 4.2). The package builds with C++20, which is reliably
9+ available on Windows from Rtools42, and its dependencies already required
10+ more than the declared 3.5; the DESCRIPTION floor now states what an
11+ installation actually needs.
12+
13+ * The ` summary() ` tables of a ` bgmCompare ` fit follow the same rownames
14+ contract as ` bgm() ` tables, so ` extract_rhat() ` and ` extract_ess() ` return
15+ named vectors; difference rows come contrast-major (all rows of one contrast
16+ together) in both selection branches; and the slab block no longer carries
17+ an ` Rhat ` column, which was structurally ` NA ` there. Code that indexed these
18+ tables by position may need adjusting.
19+
20+ ## Bug fixes
21+
22+ * ` predict() ` returned ordinal responses as the internal 0-based codes rather
23+ than the categories of the data. ` type = "response" ` now maps predictions
24+ back through the fit's recode map (including the Blume-Capel reference
25+ shift), and probability columns are labelled with the original categories.
26+
27+ * Predictions for rows of ` newdata ` carrying ` NA ` or an unseen category in a
28+ conditioning variable were computed from corrupt internal codes. Those
29+ entries now come back ` NA ` , with one warning naming the variables involved;
30+ rows without such values are unchanged.
31+
32+ * ` predict() ` errored on single-row ` newdata ` with ` type = "response" ` (a
33+ dimnames mismatch specific to the one-row case).
34+
35+ * ` simulate() ` 's ordinal full conditional subtracts the running maximum before
36+ exponentiating, so extreme parameter draws no longer overflow, and an
37+ interrupted parallel simulation errors instead of returning empty matrices.
38+
39+ * ` extract_centrality() ` on mixed discrete-continuous fits summed the wrong
40+ columns: pairwise draws are stored block-ordered (discrete, cross,
41+ continuous pairs) and the strength sums indexed them as if they were
42+ variable-ordered. Mixed-fit centrality values change; discrete-only and GGM
43+ fits were indexed correctly.
44+
45+ * The posterior-mean precision matrix is the same matrix on every surface that
46+ reports one. ` predict() ` , ` simulate() ` , and ` extract_precision() ` build its
47+ diagonal as the posterior mean of the precision-diagonal draws, ` E[K_jj] ` .
48+ It was the reciprocal of the posterior-mean residual variance — a harmonic
49+ mean of the same draws, which pairs an understated diagonal with
50+ arithmetic-mean off-diagonals and need not stay positive definite. Diagonal
51+ entries grow slightly; ` extract_partial_correlations() ` changes accordingly.
52+
53+ * ` prior_sensitivity_check() ` 's importance weights carried only part of the
54+ prior ratio, biasing the reweighted points between anchors (anchor points
55+ are direct refits and were exact throughout). Two corrections: when the vary
56+ mode also moves the precision-diagonal rate — the default
57+ "slab-and-diagonal" resolution for GGM and mixed fits — the weights now
58+ include the diagonal-prior ratio; and for mixed fits the diagonal statistic
59+ in that ratio is read on the scale the sampler stores it (it entered with
60+ the wrong sign and half the magnitude). Validated against direct refits at a
61+ doubled scale: the largest inclusion-probability error fell from 0.050 to
62+ 0.015 in the GGM check and from 0.051 to 0.006 in the mixed check, with most
63+ edges inside twice the refit's own Monte Carlo error. The importance ESS is
64+ computed from the corrected weights, so between-anchor points that
65+ previously looked well-supported can now honestly report a small ESS and be
66+ masked by ` ess_floor ` .
67+
68+ * A saturated anchor — a reweighted inclusion probability at exactly 0 or 1 —
69+ no longer takes over the pooled sensitivity curve: the inverse-variance
70+ pooling weight uses an add-half smoothed probability. Pooled values in
71+ non-saturated configurations move by less than one percent.
72+
73+ * The stability interval starts from the chosen-scale verdict — the one the
74+ table and ` print() ` report — rather than the pooled-curve verdict; the two
75+ can disagree in borderline cases.
76+
77+ * ` prior_sensitivity_check() ` input handling: single-indicator fits no longer
78+ lose a dimension and error; slab families other than normal and Cauchy stop
79+ with a clear message before any refit; a missing or non-positive chosen
80+ scale is caught up front; and when a failed convergence gate is overridden
81+ so the 1x anchor still contributes, ` $grid ` records the true gate result
82+ together with a ` forced ` flag.
83+
84+ * ` calibration_check() ` rejects ` newdata ` values outside the fit's support,
85+ naming the variable and the offending values; both branches previously
86+ failed silently (` NA ` through the isotonic fit in the ordinal branch, silent
87+ clamping in the Blume-Capel branch).
88+
89+ * The Z-ratio truncation check runs on every table build; it was gated
90+ together with the ` alpha != 1 ` shape warning, so the default-shape cells it
91+ was built for went unchecked. The shape warning keeps its gate.
92+
93+ * Deployed correction-table slopes for the hierarchical and SBM graph priors
94+ are computed after aggregating tied grid points: isotonic regression
95+ produces runs of equal fitted density, and taking the slope over the tied
96+ values biased it — a quarter of a nat on the measured cell.
97+
98+ * Correction-table cache keys include the base seed, so a table computed under
99+ one seed is not reused under another; a failed cache write warns and
100+ continues instead of erroring the fit; and table builds size their core
101+ count independently of the chain sampler's configuration and announce it.
102+
103+ * Every chain the package launches resolves its acceptance target from one
104+ helper: 0.44 for adaptive-Metropolis, 0.80 for NUTS, none for exact Gibbs.
105+ The prior-only reference chains in ` sample_ggm_prior() ` and behind
106+ ` extract_prior_inclusion_probabilities() ` previously fell back to the
107+ compiled default of 0.80 — the NUTS target — and tuned their Metropolis
108+ proposals differently from the fitted chains they mirror.
109+
110+ * NUTS diagnostics tolerate non-finite energy values: E-BFMI is computed over
111+ the finite draws and the warmup-incomplete flag no longer compares against
112+ ` NA ` .
113+
114+ * Adaptive-Metropolis diagnostics labelled the between-model move rate as the
115+ acceptance rate. The acceptance probability the sampler records is now the
116+ acceptance column; the move rate keeps its own column under its own name.
117+
118+ * Named ` newdata ` columns that do not match the fit's variables stop with an
119+ error (unnamed input keeps a warning); the legacy category-recode fallback
120+ errors instead of silently shifting categories; ` nsim ` and ` iter ` are
121+ validated at entry; and ` sample_graph_prior() ` 's joint-specification
122+ metadata reports the effective Bernoulli prior used for conditioning.
123+
6124## Diagnostics
7125
8126* ` fit$nuts_diag$warmup_check ` reports two new per-chain fields. ` energy_tau ` is
@@ -65,9 +183,8 @@ released from this line yet.
65183 ssgraph 1.16 were run on the vignette's own data, one at a time on one
66184 machine, each at its defaults and at its documentation's recommended
67185 settings. The vignette reports the headline numbers; the full protocol,
68- seeded runner scripts, and tables live in the bgms-docs repository beside
69- the site's comparison page, so the comparison can be re-baked when a
70- competitor's version moves. Neither competitor enters the package's
186+ seeded runner scripts, and tables live with the site's comparison page, so
187+ the comparison can be re-baked when a competitor's version moves. Neither competitor enters the package's
71188 dependencies. The README summarizes the result in two sentences.
72189
73190* ` prior_sensitivity_check() ` 's Details said the refit gate leans on per-chain
@@ -84,6 +201,24 @@ released from this line yet.
84201 states that the muted background holds robust and unlabelled scale-dependent
85202 edges alike, and that ` print() ` carries the counts and the names.
86203
204+ * The ADHD dataset's DOI link renders correctly (the identifier was
205+ double-prefixed) and the licence links are wrapped as URLs.
206+
207+ * ` calibration_check() ` 's manual page describes the 95% PIT band as pointwise;
208+ it said simultaneous, which the construction is not.
209+
210+ ## Other changes
211+
212+ * The configure scripts stop at the first broken step: an unavailable ` Rscript `
213+ or an empty generated source list ends the build with a one-line message,
214+ where they previously exited successfully and left ` make ` to fail later with
215+ an unrelated error. ` src/sources.mk ` has a single writer.
216+
217+ * Unreachable code was removed across ` src/ ` and ` R/ ` : a drifting ~ 190-line
218+ duplicate of the bgmCompare gradient, three orphaned OMRF methods, unused
219+ sampler plumbing, and small R-side leftovers. Sampler output is bit-identical
220+ before and after the removals.
221+
87222# bgms 0.2.0.0
88223
89224This release rebuilds most of the package on top of 0.1.6.3. ` bgm() ` now fits
0 commit comments