Skip to content

Commit 3ca0e3e

Browse files
docs: NEWS for 0.2.0.1, vignette comparison link, style pass
Brief 99 of the August 2026 audit. Report: dev/review-2026-08/reports/(NEWS pass, dev/review-2026-08/FIX-STAGE.md) Constituent changes: - docs(NEWS): record the 0.2.0.1 fixes and infrastructure changes - docs(vignette): fold the comparison material onto the live page link - chore(style): reflow a data.frame chunk in the fast-ggm vignette
1 parent 497875b commit 3ca0e3e

2 files changed

Lines changed: 148 additions & 10 deletions

File tree

NEWS.md

Lines changed: 138 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,124 @@
33
Development version, opened after 0.2.0.0 went to CRAN on 2026-08-03. Nothing
44
released 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

89224
This release rebuilds most of the package on top of 0.1.6.3. `bgm()` now fits

vignettes/fast-ggm.Rmd

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,7 @@ data.
355355
How does the fast route compare with these two packages? A measured comparison
356356
is maintained on the package website's
357357
[comparison page](https://bayesian-graphical-modelling-lab.github.io/bgms/guide/fast-ggm.html),
358-
with the full protocol, seeded scripts, and complete tables
359-
[in its repository](https://github.com/Bayesian-Graphical-Modelling-Lab/bgms-docs/tree/main/benchmarks/ggm-comparison).
358+
together with the full protocol, seeded scripts, and complete tables.
360359
It lives there rather than here because its results depend on the current
361360
versions of the other packages, which change more quickly than `bgms` releases.
362361

@@ -390,11 +389,15 @@ comparison section above.
390389

391390
```{r, echo = FALSE}
392391
data.frame(
393-
field = c("CPU", "cores available", "threads used", "chains",
394-
"operating system", "R", "bgms", "run"),
395-
value = c(B$machine$cpu, B$machine$cores_total, B$machine$threads,
396-
B$machine$chains, B$machine$os, B$machine$r_version,
397-
B$machine$bgms_version, B$machine$date)
392+
field = c(
393+
"CPU", "cores available", "threads used", "chains",
394+
"operating system", "R", "bgms", "run"
395+
),
396+
value = c(
397+
B$machine$cpu, B$machine$cores_total, B$machine$threads,
398+
B$machine$chains, B$machine$os, B$machine$r_version,
399+
B$machine$bgms_version, B$machine$date
400+
)
398401
)
399402
```
400403

0 commit comments

Comments
 (0)