← Back to all sparks
T

tulpa

ANALYTICS
Velocity7.5

Template Unified Latent Process Architecture for Bayesian Hierarchical Models

The 0.0.x train stops at CRAN: tulpa's engine ships to the ecosystem it already anchors.

bayesian-inferencecran-releaser-packagesspatial-modelingdiagnostics
Current state
tulpa is the C++/R Bayesian spatial inference engine sitting under gcol33's family of ecological occupancy packages, tagging 0.0.x releases several times a week. 0.1.0 is its first CRAN release, and the notes state outright that the engine surface is unchanged from 0.0.198 — the work is packaging discipline: local T bindings rebound to n_t/n_times, OpenMP teams capped under R CMD check, the pkgdown deploy narrowed, an aspell dictionary added. The window behind it splits between the S3 generics conversion and numerical-correctness work in the nested-Laplace grid.
Where it's heading
Two moves in nine days point at the same destination: the generics conversion made tulpa extensible by downstream packages, and CRAN admission makes it installable by them. The current cadence — several tags a week, some existing only to record a measurement that produced no code change — does not survive CRAN's submission overhead, so the release rhythm has to slow whether or not the project intends it. The correctness work still clusters on the joint nested-Laplace driver, and 0.1.0 extends the same diagnostics habit with .NL_AXIS_SD_REASONS, a closed vocabulary for an outer axis whose grid does not contain its own posterior mode.
Prediction
Expect tulpaObs to follow tulpa onto CRAN, since it is the consumer whose registrations the engine has spent this window unblocking, and expect the version line to move in larger, less frequent steps now that each one carries a submission.

Recent moves

  1. 11h ago

    First CRAN release: engine surface unchanged from 0.0.198

    ⚡ SPARK

    The engine a whole package family depends on becomes installable from CRAN, and the notes say plainly that nothing about its surface changed from 0.0.198. Read against the generics conversion eight days earlier, it completes a pair: one release made tulpa extensible, this one makes it obtainable. The remaining items are CRAN's own conditions — thread caps under R CMD check, a package dictionary, a narrowed pkgdown deploy.

    View source ↗
  2. 4d ago

    tulpa_re_aghq() exposes the mode/theta cross-Hessian

    Adds blup_cross, the per-group cross-Hessian block needed to draw a group's BLUP jointly with theta instead of independently, plus the full per-group joint covariance across random-effect terms. It declines to NA rather than silently returning zero where no analytic theta_score exists. This is the engine-side unblock for the last family registration downstream, and fits the pattern of exposing internals that consumers previously had to reconstruct.

    View source ↗
  3. 7d ago

    Dense batched joint path could silently drop a grid cell

    The batched joint driver's dense branch was solving through the fixed-ridge-only path rather than the PD-escalating one its sparse branch and the single-species driver already used, so an indefinite Hessian could produce NaN, drop that outer-grid cell's weight, and shift every reported summary. The fix aligns the dense branch with the rest. It lands in the same coupled-driver area as the determinism work earlier in the window.

    View source ↗
  4. 8d ago

    Calibration and goodness-of-fit entry points become S3 generics

    ⚡ SPARK

    The move that reframes tulpa from a library you call to a layer you extend: sbc(), pit_residuals(), test_dispersion(), test_outliers() and test_zero_inflation() now dispatch, with existing bodies demoted to default methods. It is the upstream half of the breaking cleanup tulpaObs shipped a minute later, and it sets the extension contract the rest of the diagnostics layer will likely follow.

    View source ↗
  5. 9d ago

    CUDA backend had two definitions; link order decided if it ran

    The batched-CUDA entry points were defined twice — real implementations in one header, FALSE-returning stubs in another — so which one survived was an ODR coin flip resolved by the linker, and nothing could report what had been built. With a single definition, GPU acceleration engages when a device is present and degrades cleanly when it isn't. A build-level defect, but the user-visible effect is that the GPU path is now reliably reachable.

    View source ↗
  6. 9d ago

    Hyperparameter bounds now flag when they leave the node range

    An interval endpoint past the outermost grid node is an extrapolation rather than a bound the design supports, and theta_ci_outside_nodes now records that per axis instead of leaving the two indistinguishable on the fit. The companion finding keeps max_sd_u at 3 on evidence, after establishing that earlier inconclusive ladders were measuring the extrapolation rather than the ceiling. Continues the engine's habit of recording a limitation rather than papering over it.

    View source ↗