A parameter order that silently permutes a model's predictive draws. A CI step that stays green when its command fails. An error guard that can never fire. I work on spiking neural networks, computational neuroscience and efficient inference, and most of what I do comes down to one question: is the number this tool gives me actually true?
I'm self-taught: oncology, then bioinformatics, then AI for proteins, and now neuromorphic computing. With no lab behind me, I built my track record where anyone can check it: in other people's code, reviewed and merged by their maintainers.
Where my work sits: recording brains, chips that compute on events, and models that only activate what they need.
| Project | What I fixed or built |
|---|---|
| PyTorch ExecuTorch Meta · on-device inference |
#20685 · Runtime Mixture-of-Experts expert-sort for the MLX backend's decode path: two custom ops, a wire-compatible FlatBuffer field, C++ interpreter changes, and a stride bug traced down into MLX's matmul.cpp. 💬 "Tested locally. Improves Qwen3.5 perf from 73 tok/sec to 80 tok/sec. Great job!" — reviewer |
| HSSM Brown University · cognitive modelling |
#1371 · The racing_diffusion_3 parameter order didn't match the simulator's. Fits looked fine; posterior-predictive draws were silently wrong. Fix plus a test over 21 model/likelihood pairs. 💬 "Looks good, and thanks for catching the issue." — maintainer |
| pyhgf computational psychiatry |
#451 · Fixed the batched weight gradient of binary layers in rshgf.DeepNetwork, a bug that changed the results of releases 0.3.1 and 0.3.2. The maintainer kept the regression test: it fails on the old code and passes on the fix. |
| Brian2 spiking network simulator |
#1861 · Removed a ~80 ms gc.collect() from every Network.run() when the warning it served is disabled, with a regression test. 💬 "This makes perfect sense to me, and everything looks good." — maintainer |
| python-neo electrophysiology I/O |
#1891 · Spike2 (CED) files stopped loading with sonpy ≥ 1.9.12, which ships three import layouts by version and platform. Restored reading and re-enabled the CED tests. Invited onto the project's authors list. 💬 "Looks great. Thanks." — maintainer |
| DeepLabCut pose estimation |
#3445 · pandas 3 Copy-on-Write: made ten in-place mutations of read-only arrays safe across eight modules. 💬 "great PR, thanks for your contribution!" — maintainer |
| PyHealth UIUC · clinical ML |
#1179 · Support for the MEDS medical-event data standard: a typed Parquet scan path, a schema guard, tests, docs and a MIMIC-IV demo (+1.5k lines). |
| SpikingJelly SNN framework |
#692 · LIAFNode could not be initialised because of a dead assertion. Fixed, closing #655. |
2026-11-04pytorch/executorch #24202: Raise InternalError for non-CPU constant storage in the emitter2026-11-04fangwei123456/spikingjelly #808: Fix empty intervals and boundary rounding in time-based frame splitting2026-11-04fangwei123456/spikingjelly #809: Download the SSC archives in SpikingSpeechCommands2026-10-29ComputationalPsychiatry/pyhgf #451: Fix the batched weight gradient of binary layers in rshgf.DeepNetwork (changes results of 0.3.1 and 0.3.2)2026-10-29ComputationalPsychiatry/pyhgf #450: Fix add_edges dropping value children, ignoring coupling_fn and mismatching coupling strengths
Refreshed daily by GitHub Actions · last run 2026-11-05
In review right now (17):
- HSSM #1455 fix(hssm): reorder fixed-vector parameters with the rows _rearrange_data moves
- HSSM #1454 fix(rldm): give the angle LAN -1/1 choices for 0/1 responses
- HSSM #1450 fix(utils): find missing-RT rows by the rt column in _rearrange_data
- ssm-simulators #417 Fix racing_diffusion_model stopping rule on same-step crossings
- HSSM #1448 fix(utils): index log-likelihood draws by position, not coordinate value
- NIR #201 fix: Use full kernel shape in Conv2d output shape inference
- executorch #24484 [XNNPACK] Compose stacked activations in FuseActivationPass instead of overwriting
- brian2 #1928 Fix
linspaceandwheredropping units when a plain0is combined with a quantity
| Project | Field | Merged (live) |
|---|---|---|
| PyTorch ExecuTorch | on-device inference runtime (Meta) | |
| pyhgf | hierarchical Gaussian filters, computational psychiatry | |
| Brian2 | spiking neural network simulator | |
| HSSM | hierarchical sequential sampling models (Brown) | |
| python-neo | electrophysiology file I/O | |
| PyHealth | clinical machine learning (UIUC) | |
| SpikingJelly | spiking neural network framework | |
| NeuroConv | neurophysiology data to NWB | |
| DeepLabCut | markerless pose estimation |
All merged pull requests, one line each
| Project | PR | What it does |
|---|---|---|
| ExecuTorch | #20685 | MLX backend: runtime MoE expert-sort for the decode path |
| ExecuTorch | #22372 | Vulkan quantizer: preserve node output dtype when lifting scalars to attributes |
| ExecuTorch | #22373 | Make inoperative error guards raise (ExportSession, XNNPACK node visitor, Samsung conv1d) |
| ExecuTorch | #23798 | Fix bf16 positional-embedding interpolation on CPU |
| ExecuTorch | #24203 | Enforce per-dimension upper bounds for DYNAMIC_BOUND inputs in set_input |
| ExecuTorch | #24202 | Raise InternalError for non-CPU constant storage in the emitter |
| pyhgf | #451 | Fix the batched weight gradient of binary layers in rshgf.DeepNetwork |
| pyhgf | #450 | Fix add_edges dropping value children, ignoring coupling_fn and mismatching coupling strengths |
| pyhgf | #449 | Fix remove_node on nodes with several edges |
| pyhgf | #448 | Use all volatility and value children in the unbounded volatility update |
| Brian2 | #1861 | Skip gc.collect() in Network.run() when unused-object warnings are disabled |
| Brian2 | #1885 | Developer guidelines: drop ruff-enforced rules, fix stale references |
| Brian2 | #1896 | Store Cython random-number buffers by value, fixing restore after a buffer refill |
| HSSM | #1371 | Align racing_diffusion_3 parameter order with ssm-simulators |
| HSSM | #1411 | Suggest a stable sort in the balanced-panel error message |
| HSSM | #1415 | Use a stable sort in test_sorted_data_passes |
| python-neo | #1891 | Restore CED/Spike2 reading under sonpy ≥ 1.9.12, re-enable its tests |
| python-neo | #1911 | CI: drop Python 3.9 from the NeoPlexon2Test matrix |
| python-neo | #1912 | CI step no longer stays green when git ls-remote fails |
| PyHealth | #1179 | MEDS dataset support with a typed Parquet scan path |
| PyHealth | #1187 | PTB-XL ECG dataset support |
| PyHealth | #1344 | Normalise URL paths with posixpath in clean_path |
| SpikingJelly | #692 | Fix LIAFNode initialisation (closes #655) |
| SpikingJelly | #808 | Fix empty intervals and boundary rounding in time-based frame splitting |
| SpikingJelly | #809 | Download the SSC archives in SpikingSpeechCommands |
| NeuroConv | #1855 | Fix an unsatisfiable Spike2 dependency marker |
| DeepLabCut | #3445 | pandas 3 Copy-on-Write guards across eight modules |
Always up to date: every merged PR outside my own repos.
- pytorch/pytorch #200949 —
grid_sampleon CPU returns wrong values for fp16/bf16 when a gather offset exceeds 32,767 (int16 offset overflow in the vectorized kernel). Labelled "module: correctness (silent)". - brian2 #1893 —
restore(restore_random_state=True)uses a dangling pointer after a RNG buffer refill (Cython target). Maintainer: "I agree with the analysis and the proposed solution." Fixed in #1896, merged. - ml-explore/mlx-lm #1700 — fused Metal KL/JS kernels reused one threadgroup buffer for max and sum exchanges without a barrier; my fix (#1719) was reproduced independently on an M5 Max (26/50 → 0/50 mismatches). Closed by the maintainers for review capacity, not on technical grounds.
- PCNtoolkit #600 — MLL/MSLL used the posterior mean of log p instead of log p(y | D, x) (Jensen bias). Collaborator: "To me it makes sense… I would change it."
My own repositories say what has been validated and what hasn't. A clean negative result counts as a result.
| Repository | What it is | Live status |
|---|---|---|
| neurovis3d | diagnostics for spiking neural networks (snnTorch) | |
| tpl-lab | pre-registered falsification test on Allen Neuropixels data | |
| kinoscope | kinase-inhibitor affinity, leakage-free evaluation | |
| discoursekit | linguistic measures for discourse research |
| Spiking & neuroscience | snnTorch · SpikingJelly · Brian2 · Neo · NeuroConv / NWB · Allen Neuropixels · HSSM · pyhgf |
| Inference & systems | PyTorch · ExecuTorch (XNNPACK, Vulkan, MLX backends) · MLX · dynamic shapes · quantisation paths |
| Health & bio data | PyHealth · MEDS · PTB-XL · MIMIC-IV · RDKit · ESM-2 · PyTorch Geometric |
| Engineering practice | pytest & Hypothesis · mypy --strict · ruff · CI · packaging · pre-registration |
Full-time roles in neuromorphic and event-driven computing, neurotech and BCI, computational-neuroscience tooling, or ML inference. I'm also open to contracts: bugs that falsify results, scientific-stack migrations (pandas 3, NumPy 2, Python 3.14, Cython), correctness and evaluation reviews of ML and scientific code.
Based in France (CET). French native, English for written work. Long term, I want to bring computational models closer to clinical medicine.
The fastest way to reach me is email. I'm glad to start with a written exchange or a short trial task on your codebase.

