Skip to main content

Implementation of Diffusion decision model with across-trial variability in boundary separation

PyPI Python License: MIT tests

Diffusion decision model with across-trial variability in boundary separation (sa), drift (sv), and non-decision time (st). This codebase presents the DDM-SA as a fully differentiable PyTensor likelihood for gradient-based Bayesian estimation.

The likelihood is analytic (Navarro–Fuss density; drift variability integrated in closed form, uniform variability by Gauss–Legendre quadrature), so NUTS gets exact gradients. It is validated against the Fortran implementation the model was originally developed in; the Fortran programs, the data, and reference results ship in this repository so every validation is reproducible from a clone.

Install

From PyPI:

pip install saddm               # core: numpy, scipy, pytensor
pip install "saddm[sampling]"   # + pymc, arviz, numpyro (pinned jax)
pip install "saddm[hssm]"       # + hssm

From a clone, for development or to run the verification and examples:

pip install -e ".[test]"        # + pytest, numba (reference backend)
pip install -e ".[hssm]"        # everything the examples need

The sampling and hssm extras pin jax==0.5.3 / numpyro==0.19.0 deliberately: newer jax silently freezes numpyro's NUTS at its initial point.

Quickstart

from saddm import make_ddmsa_model, sample_ddmsa, sample_ddmsa_exact

data  = sample_ddmsa_exact(a=1.1, z=0.5, v=1.5, t=0.25,
                           sv=0.8, sa=0.5, st=0.08, n_trials=2000)
idata = sample_ddmsa(make_ddmsa_model(data), backend="numpyro")

saddm.ddmsa_logp(rt, response, a, z, v, t, sv, sa, st, sz) is the per-trial log-likelihood; every parameter may be a scalar or a per-trial vector.

With HSSM, register saddm.ddmsa_logp as a loglik_kind="analytical" likelihood; examples/estimate_HSSM_saddm.py is the minimal adapter.

Layout

path contents
saddm/ ddmsa.py: the likelihood and PyMC glue. core.py/integrator.py/model.py: the Numba reference implementation (reference extra).
tests/ test_ddmsa.py: verification suite — s = 1 closed forms, agreement with the Numba/Fortran reference, finite-difference gradients, corner finiteness, per-trial broadcasting, backend agreement, static-zero collapse (run directly with --sample for an end-to-end NUTS check). Remaining test_*.py cover the Numba reference.
verification/ parameter_recovery.py: 100-config NUTS recovery study. recovery_figure.py, compare_to_fortran.py, likelihood_figure.py: analysis and figures (read results/reference/ by default; set RESULTS for a fresh run).
examples/ HSSM applications: flat fit on cavanagh_theta, the per-subject + k-sweep replication of the Fortran intertemporal-choice analysis, hierarchical variants, and the random-effects figure.
fortran/ The Fortran programs that produced the benchmarks, with build notes.
data/itc_amasino/ Amasino et al. (2019) trials, the Fortran benchmarks, and the exact k-sweep permutation files.
results/reference/ Reference outputs: recovery, ITC, hierarchical, and cavanagh results with figures. Everything else under results/ is gitignored, and every script writes there by default.

Citation

@unpublished{shevlin2026little,
  author = {Shevlin, Blair R. K. and Fernandez, Kiant{\'e} and Ratcliff, Roger and Krajbich, Ian},
  title  = {A little goes a long way: Fitting one-shot decisions with cognitive models},
  note   = {Manuscript in preparation},
  year   = {2026},
}

Blair R. K. Shevlin* and Kianté Fernandez* contributed equally.

:Author: Kianté Fernandez, Blair R K Shevlin, Roger Ratcliff, Ian Krajbich

:Contact: kiante@ucla.edu, blair.shevlin@mssm.edu, ratcliff.22@osu.edu, krajbich@ucla.edu

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

saddm-0.1.1.tar.gz (24.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saddm-0.1.1-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file saddm-0.1.1.tar.gz.

File metadata

  • Download URL: saddm-0.1.1.tar.gz
  • Upload date:
  • Size: 24.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for saddm-0.1.1.tar.gz
Algorithm Hash digest
SHA256 cd46dd87c3d15ad45847a6717c6cf302a4de3dd664ab67b72f4b5d5dc1ab0715
MD5 50eec0d3dd2255919b77ae44f6bf6c5c
BLAKE2b-256 c9e4b40bc354792f431d32c3b6598415276e8242efaccba6c6721e228082a107

See more details on using hashes here.

Provenance

The following attestation bundles were made for saddm-0.1.1.tar.gz:

Publisher: publish.yml on kiante-fernandez/saddm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file saddm-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: saddm-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 14.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for saddm-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 95957801dcec3ffceb9edc4f053a8714a677335084a6a5a9c4b011af69d03ac6
MD5 c34a1d4e8520579ae5577c6c9e7613fd
BLAKE2b-256 6877d681ec0728d30be380d638f8c3ef0c7e204a5b0dc15ae0a1cbb86cbf5c8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for saddm-0.1.1-py3-none-any.whl:

Publisher: publish.yml on kiante-fernandez/saddm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.0

2 files

This release

0.1.1 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page