Reference implementation for the MICCAI 2026 paper Latent Pathology–Age Decoupling in Functional Connectivity Graphs for Multi-task Schizophrenia Assessment.
LPAD is a dual-stream graph framework that
- decouples disease-specific from age-related variation in functional connectivity (FC) representations via a cosine-orthogonality loss and a continuous-anchor supervised contrastive loss, then
- selectively reintroduces age as a subordinate contextual signal through a lightweight gated modulation (CIGM) before the eight prediction heads.
Implemented components map to paper sections:
| Section | Component | File |
|---|---|---|
| 2.1 | Dual-stream GPSConv-GINE → GATConv encoder | lpad/model.py:DualStreamEncoder |
| 2.1, Eq. 1 | Latent orthogonality loss | lpad/losses.py:orthogonality_loss |
| 2.1, Eq. 2 | VL-anchored supervised contrastive loss | lpad/losses.py:supcon_loss_continuous |
| 2.2, Eqs. 3–5 | Clinically-Informed Gated Modulation | lpad/model.py:CIGM |
| 2.3, Eq. 6 | Homoscedastic uncertainty weighting | lpad/losses.py:UncertaintyWeightedRMSE |
| 2.3 | Manifold mixup (post-pooling) | lpad/model.py:LPAD.forward |
LPAD/
├── lpad/
│ ├── config.py # Config dataclass, task list, indices
│ ├── data.py # FC -> PyG graph + COBRE loader
│ ├── losses.py # L_ortho, L_supcon, uncertainty weighting
│ ├── model.py # DualStreamEncoder, CIGM, LPAD
│ └── trainer.py # 5-fold CV trainer with JSONL logging
├── scripts/
│ └── train_cobre.py # Command-line entry point
├── requirements.txt
└── README.md
conda create -n lpad python=3.10
conda activate lpad
pip install -r requirements.txt
# torch-geometric extras (sparse / scatter / cluster) per the official guideThe COBRE arrays produced by the preprocessing pipeline are expected under a
single directory, e.g. /data/.../COBRE:
COBRE/
├── X.npy # (N, 264, 264) Power-264 FC matrices
├── Y_age.npy # auxiliary age regression target
├── Y_positive.npy # PANSS POS
├── Y_negative.npy # PANSS NEG
├── Y_total.npy # PANSS TOT
├── Y_general.npy # PANSS GEN
├── Y_PS.npy # MCCB processing speed
├── Y_BACS.npy # BACS Symbol Coding T-score, used as the paper's "ATT" task
├── Y_WM.npy # MCCB working memory
└── Y_VL.npy # MCCB verbal learning (used as supcon anchor)
cd LPAD
python scripts/train_cobre.py \
--data-root /path/to/COBRE \
--output-dir runs/lpad_cobre_seed42 \
--seed 42Outputs written to --output-dir:
train.log– human-readable logepochs.jsonl– per-epoch training loss and per-task metricssummary.json– mean ± std Pearson, MAE, RMSE across foldscheckpoint_fold*.pt– best-epoch model state per fold
The default hyperparameters (Adam, lr 5e-4, batch size 20, 60 epochs, λ₁=0.05, λ₂=0.10, mixup α=1.0, TopK ratio 0.9) reproduce the COBRE numbers reported in Tables 1–3.
@inproceedings{lpad2026,
title = {Latent Pathology--Age Decoupling in Functional Connectivity Graphs
for Multi-task Schizophrenia Assessment},
booktitle = {MICCAI},
year = {2026},
}