PULSE
June 11, 2026 ยท View on GitHub
Authors: Yenho Chen, Maxwell A. Xu, James M. Rehg, Christopher J. Rozell
Code for PULSE (ICML 2026), a self-supervised pretraining method for physiological time-series based on preserving dynamical systems structure while filtering irrelevant noise. This is accomplished through a cross-reconstruction objective that estimates dynamics given a time series, then uses those dynamics to reconstruct a different randomly sampled time-series from the same system. In doing so, we separate transferable from non-transferable information in time-series data, improving label efficiency and transfer learning performance across a wide range of real-world datasets.
Paper: arxiv.org/pdf/2512.00239
Setup
We use cuML (RAPIDS 25.8) for faster evaluation. All commands should be run from the repo root.
git clone https://github.com/yenhochen/PULSE.git
cd PULSE
conda env create -f environment.yaml
conda activate pulse
export PYTHONPATH=$(pwd)
Data
For reproducibility, we include scripts to download and process the datasets in data/process/.
# HAR (other datasets: data/process/{ecg,ppg,sleepeeg,...}_processdata.py)
# Output: data/har/processed/
python -m data.process.har_processdata
# Synthetic analysis (optional): Lorenz, Thomas, Hindmarsh-Rose trajectories
# Output: data/analysis/{system}/noise-{level}/{params}/
sh data/process/analysis/build.sh
Quick start (linear probe)
Example command to pretraing PULSE on HAR and run downstream for the linear-probe eval. Model configurations are located at configs/linear_probe/:
python scripts/run/pretrain.py -c configs/linear_probe/har/pulse.yaml -s 0 \
-sd experiments/har/pulse/seed_0
Transfer learning
Transfer learning datasets are directly from (TFC-pretraining on Figshare). We also include the following scripts to download them here.
python -m data.process.download_transfer_data
# โ data/epilepsy/processed/ and data/gesture/processed/
Here are example commands for transfer learning experiments from pretraining on HAR and fine-tuning on Gesture.
# Pretrain on source domain (HAR)
# Output: experiments/transfer/har/pulse/seed_0/
python scripts/run/pretrain.py -c configs/transfer_pretrain/har/pulse.yaml -s 0 \
-sd experiments/transfer/har/pulse/seed_0
# Fine-tune on target domain (Gesture)
python scripts/run/transfer.py -c configs/transfer/gesture.yaml \
-p experiments/transfer/har/pulse/seed_0/checkpoint_best -s 0
Layout
configs/ experiment YAML
data/process/ preprocessing
pulse/ PULSE modules
trainers/ model trainers
utils/ data, eval, I/O
scripts/run/ pretrain, transfer, semisupervised
scripts/gen/ batch command generators
test_scripts/ pipeline sanity check (see test_scripts/README.md)
Outputs are written to experiments/{dataset}/{model}/seed_{N}/.