Skip to content

tulpaObs 0.0.230

Choose a tag to compare

@gcol33 gcol33 released this 15 Aug 13:06
· 7 commits to main since this release
  • ms_abun() registered for sbc() (#220, the 27th and
    final family of the original registration scope). Needed TWO upstream
    tulpa engine changes before it could even be attempted:

    1. tulpa#398 (blup_cross): exposes tulpa_re_aghq()'s per-group
      mode/theta cross-Hessian.
    2. A second gap found while wiring this family: tulpa_re_aghq() also
      only ever exposed the per-RE-TERM DIAGONAL of a group's posterior
      covariance (blup_var). ms_abun()'s lambda (abundance) and p
      (detection) arms share a per-species grouping factor with real
      cross-arm posterior covariance -- the same lambda/p identifiability
      ridge tobs()'s penalized-EM exists to break for occupancy psi/p --
      so drawing a species' abundance and detection deviations
      independently would repeat the #226 bug one level deeper (inside a
      species instead of between the community mean and a species). Fixed
      upstream by adding blup_cov_g/blup_cross_g (the full per-group
      joint covariance/cross-Hessian, unsliced by RE term), validated
      against a closed-form joint-Hessian construction on a toy model with
      deliberately collinear RE terms.

    ms_community$Cinv/Bf now thread off blup_cov_g/blup_cross_g
    (R/ms_abun.R), matching the convention every other sbc()-registered
    community family uses. Only reachable via the AGHQ/joint_fd engine
    (control = list(optimizer = "joint_fd", n.quad > 1)) -- the default
    n.quad = 1 Laplace-EM path (a different, faster engine entirely) does
    not expose Cinv/Bf at all, and errors with a pointer rather than
    silently drawing an independent (mu, b_s).

    Registered at reduced n.sim = 15 (distsamp_open's own precedent for the
    identical cost problem, see 0.0.227 below): a n.sim = 100 run at
    standard settings was projected to take >12h; the actual n.sim = 15 run
    completed in 39.9 min. Posterior calibrates cleanly (min p_unif 3.9e-3,
    0/40 quantities below 1e-3); narrow control's minimum p_unif is 2.9e-12
    (comfortably below the 1e-3 pass bar every sibling family uses), though
    one narrow-arm quantity did not fail as comprehensively as siblings'
    (max p_unif 1.3e-2 there, vs ~1e-6 to 1e-15 elsewhere) -- not
    re-investigated given the ~40min cost of a re-run, and does not weaken
    the primary (posterior) calibration signal.

    All 27 originally-scoped families are now registered for sbc().

  • Engine pin raised to tulpa 0.0.198 (Imports floor and Remotes tag
    together, as .github/scripts/check-engine-pin.R requires). That release
    carries both engine changes the ms_abun() registration above depends on:
    blup_cross (gcol33/tulpa#398) and the full per-group joint covariance
    blup_cov_g/blup_cross_g. The floor and the tag had also drifted apart
    from each other (0.0.197 vs v0.0.196), which the pin check fails on.


Tagged before CI ran green. Every workflow run from 2026-08-11 to 2026-08-15
stopped at pak dependency resolution, so the test suite had not executed
against this code. Three defects were sitting behind that, all of them
test-side or in generated documentation: the sbc() registry test's
rank-enumerating slice helper, that test's missing ms_abun()
.sbc_reg_means() branch, and a stale man/dot-tobs_community_em.Rd.
Package behaviour is unaffected.

Use v0.0.232, the first version in this sequence with smoke (4936
assertions, 0 failures, 0 errors) and R CMD check (Status: OK) both
passing.