I build and maintain open-source Python tools for computational and cognitive neuroscience. Two of them sit at the heart of most of my research: braincoder, for neural encoding and decoding models, and bauer, for Bayesian cognitive models of choice.
braincoder fits encoding models to neural data (for now, fMRI) and then inverts those models to decode stimulus information back out of the brain. By inverting an encoding model, we can track, from moment to moment, which information the brain has access to and with how much uncertainty.
It wraps stimulus handling, model definition, HRF convolution, and optimization into a single Keras 3-based toolkit. You can pick a ready-made model (Gaussian population receptive field, HRF-aware, linear) or write your own, and run the same code on TensorFlow, JAX, or PyTorch. It powers the encoding-model work across my numerical-cognition and value projects.
bauer (Bayesian Estimation of Perceptual, Numerical and Risky choice) is a PyMC-based library for fitting hierarchical Bayesian cognitive models to behavioural decision-making data. It covers three task families (psychometric, magnitude comparison, and risky choice), built on a shared Bayesian-observer front-end, with each participant getting their own parameters regularised by a group-level distribution.
bauer now reaches beyond modelling choices alone. On top of the same cognitive front-end it offers sequential-sampling likelihoods, the drift-diffusion model (DDM) and the race-diffusion model (RDM), so a model is informed by reaction times as well as the choices people make. A single model can then speak to both what people choose and how long they take to decide, helping to separate, for example, perceptual acuity from response caution.