| model: |
| n_regions: 414 |
| local_core: learned |
| family_state: true |
| family_cores: {} |
| family_allow_derived_partition: false |
| d_key: 16 |
| d_value: 16 |
| d_grid: 12 |
| d_context: 4 |
| d_prediction: 8 |
| state_dependent_variance: true |
| scale_prolongations: [] |
| hidden: 1408 |
| n_local_layers: 3 |
| region_embed: 192 |
| context_dim: 128 |
| message_dim: 12 |
| n_delay_bins: 8 |
| n_spectral_modes: 8 |
| n_adaptation: 2 |
| n_uncertainty: 4 |
| dt_model: 0.008 |
| hemo_ratio: 25 |
| bold_predict_frames: 1 |
| bold_every: 1 |
| residual_rho_max: 0.35 |
| residual_init_scale: 0.05 |
| encoder_channels: 192 |
| encoder_layers: 3 |
| dropout: 0.0 |
| control_graph: none |
| scalar_state_ablation: false |
| dense_coupling_ablation: false |
| n_eeg_channels: 64 |
| n_behaviour: 2 |
| montages: |
| sleepedf_real: |
| kind: bipolar |
| channels: |
| - EEG Fpz-Cz |
| - EEG Pz-Oz |
| ds000117_real: |
| kind: digitised |
| positions_file: configs/montages/ds000117_eeg.json |
| channels: |
| - EEG001 |
| - EEG002 |
| - EEG003 |
| - EEG004 |
| - EEG005 |
| - EEG006 |
| - EEG007 |
| - EEG008 |
| - EEG009 |
| - EEG010 |
| - EEG011 |
| - EEG012 |
| - EEG013 |
| - EEG014 |
| - EEG015 |
| - EEG016 |
| - EEG017 |
| - EEG018 |
| - EEG019 |
| - EEG020 |
| - EEG021 |
| - EEG022 |
| - EEG023 |
| - EEG024 |
| - EEG025 |
| - EEG026 |
| - EEG027 |
| - EEG028 |
| - EEG029 |
| - EEG030 |
| - EEG031 |
| - EEG032 |
| - EEG033 |
| - EEG034 |
| - EEG035 |
| - EEG036 |
| - EEG037 |
| - EEG038 |
| - EEG039 |
| - EEG040 |
| - EEG041 |
| - EEG042 |
| - EEG043 |
| - EEG044 |
| - EEG045 |
| - EEG046 |
| - EEG047 |
| - EEG048 |
| - EEG049 |
| - EEG050 |
| - EEG051 |
| - EEG052 |
| - EEG053 |
| - EEG054 |
| - EEG055 |
| - EEG056 |
| - EEG057 |
| - EEG058 |
| - EEG059 |
| - EEG060 |
| - EEG065 |
| - EEG066 |
| - EEG067 |
| - EEG068 |
| - EEG069 |
| - EEG070 |
| - EEG071 |
| - EEG072 |
| - EEG073 |
| - EEG074 |
| ds004024_rest_real: |
| kind: monopolar |
| channels: |
| - Fp1 |
| - Fpz |
| - Fp2 |
| - AF7 |
| - AF3 |
| - AFz |
| - AF4 |
| - AF8 |
| - F7 |
| - F5 |
| - F3 |
| - F1 |
| - Fz |
| - F2 |
| - F4 |
| - F6 |
| - F8 |
| - FT7 |
| - FC5 |
| - FC3 |
| - FC1 |
| - FCz |
| - FC2 |
| - FC4 |
| - FC6 |
| - FT8 |
| - T7 |
| - C5 |
| - C3 |
| - C1 |
| - Cz |
| - C2 |
| - C4 |
| - C6 |
| - T8 |
| - TP9 |
| - TP7 |
| - CP5 |
| - CP3 |
| - CP1 |
| - CPz |
| - CP2 |
| - CP4 |
| - CP6 |
| - TP8 |
| - TP10 |
| - P7 |
| - P5 |
| - P3 |
| - P1 |
| - Pz |
| - P2 |
| - P4 |
| - P6 |
| - P8 |
| - PO7 |
| - PO3 |
| - POz |
| - PO4 |
| - PO8 |
| - O1 |
| - Oz |
| - O2 |
| - Iz |
| use_bf16: true |
| compile: false |
| posterior: |
| summary_channels: 128 |
| summary_layers: 4 |
| flow_layers: 6 |
| flow_hidden: 256 |
| n_bands: 7 |
| n_pcs: 16 |
| dropout: 0.0 |
| nuisance_dim: 0 |
| cond_norm: dataset_std_v2 |
| lr_scale: 5.0 |
| data: |
| sim_index_fast: data/sim_corpus_414/index_fast.json |
| sim_index_slow: /data/scwbd/sim_corpus/index_slow.json |
| real_eeg_root: data/eegmmidb/1.0.0 |
| real_sleep_root: data/sleep-edfx/1.0.0/sleep-cassette |
| ds000117_root: data/ds000117/1.1.0 |
| ds004024_root: data/ds004024/1.0.0 |
| ds000113_root: data/ds000113 |
| bold_roots: {} |
| enable_perturbation: true |
| window: 64 |
| context: 24 |
| fs_hz: 125.0 |
| batch: 8 |
| num_workers: 4 |
| pin_memory: false |
| val_fraction: 0.05 |
| real_test_fraction: 0.25 |
| split_policy: stable_hash_v2 |
| seed: 20260807 |
| train: |
| run_name: scwbd-004 |
| out_dir: checkpoints/scwbd-004 |
| report_dir: reports/training |
| seed: 20260809 |
| device: cuda |
| anatomy_force_fallback: false |
| amp_dtype: bfloat16 |
| cuda_reserve_gb: 80.0 |
| max_wall_seconds: 165600 |
| max_steps_per_stage: null |
| bold_lr_scale: 1.0 |
| resume: true |
| stages: |
| - name: T1_measured_founding |
| steps: 4000 |
| lr: 0.0006 |
| weight_decay: 0.01 |
| warmup: 200 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 500 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 0.0 |
| lambda_anat: 0.0 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.1 |
| lambda_posterior: 0.0 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: regional + interface, measured only |
| admits: |
| - 1 |
| tier_permissions: |
| 1: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - observation.* |
| - eeg.* |
| - eeg_montages.* |
| - bold.* |
| - behaviour.* |
| objective: |
| - likelihood |
| - forecast |
| - port |
| rationale: 'As 003, with one difference that is not a curriculum change: `bold.*` |
| now reaches a Balloon-Windkessel integrator that actually runs, so log_kappa, |
| log_gamma, log_tau, alpha and neural_gain receive gradient from this stage |
| instead of sitting bit-identical to their initialisation for the whole run.' |
| - name: T2_calibration |
| steps: 600 |
| lr: 0.0003 |
| weight_decay: 0.01 |
| warmup: 60 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 300 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 0.0 |
| lambda_anat: 0.0 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.3 |
| lambda_posterior: 0.0 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: instrument nuisance |
| admits: |
| - 1 |
| - 2 |
| tier_permissions: |
| 1: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - observation.* |
| - eeg.* |
| - eeg_montages.* |
| - bold.* |
| - behaviour.* |
| 2: |
| - eeg.log_gain |
| - eeg.offset |
| - eeg.log_noise |
| - eeg.nuisance* |
| - eeg_montages.*.log_gain |
| - eeg_montages.*.offset |
| - eeg_montages.*.log_noise |
| - eeg_montages.*.nuisance* |
| objective: |
| - likelihood |
| - calibration |
| rationale: 'Per-channel gain, offset and noise floor across four montages. |
| Admitted late and narrowly: a calibration source has tiny measurement variance |
| and would win a pure inverse-variance contest.' |
| - name: T3_population_prior |
| steps: 800 |
| lr: 0.0003 |
| weight_decay: 0.01 |
| warmup: 80 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 400 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 0.0 |
| lambda_anat: 0.05 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.1 |
| lambda_posterior: 0.0 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: anatomical prior |
| admits: |
| - 1 |
| - 2 |
| - 3 |
| tier_permissions: |
| 1: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - observation.* |
| - eeg.* |
| - eeg_montages.* |
| - bold.* |
| - behaviour.* |
| 2: |
| - eeg.log_gain |
| - eeg.offset |
| - eeg.log_noise |
| - eeg.nuisance* |
| - eeg_montages.*.log_gain |
| - eeg_montages.*.offset |
| - eeg_montages.*.log_noise |
| - eeg_montages.*.nuisance* |
| 3: |
| - coupling.gain_* |
| - coupling.global_scale |
| objective: |
| - likelihood |
| - forecast |
| - anatomy |
| rationale: The 9-family partition and the connectome scale enter after the |
| measured sources have fixed the representation they modulate. |
| - name: T4_simulator |
| steps: 5000 |
| lr: 0.0002 |
| weight_decay: 0.01 |
| warmup: 250 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 500 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 0.0 |
| lambda_anat: 0.05 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.1 |
| lambda_posterior: 1.0 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: simulator-conditioned inference |
| admits: |
| - 1 |
| - 2 |
| - 3 |
| - 4 |
| tier_permissions: |
| 1: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - observation.* |
| - eeg.* |
| - eeg_montages.* |
| - bold.* |
| - behaviour.* |
| 2: |
| - eeg.log_gain |
| - eeg.offset |
| - eeg.log_noise |
| - eeg.nuisance* |
| - eeg_montages.*.log_gain |
| - eeg_montages.*.offset |
| - eeg_montages.*.log_noise |
| - eeg_montages.*.nuisance* |
| 3: |
| - coupling.gain_* |
| - coupling.global_scale |
| 4: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - posterior.* |
| objective: |
| - likelihood |
| - forecast |
| - slice |
| - posterior |
| rationale: 'The amortised posterior is founded here and only here; no measured |
| recording carries a theta label. Tier 4 does NOT reach `eeg.*`, `eeg_montages.*`, |
| `bold.*` or `behaviour.*`: a simulator may not calibrate an instrument.' |
| - name: T5_measured_return |
| steps: 3000 |
| lr: 0.00012 |
| weight_decay: 0.01 |
| warmup: 150 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 500 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 1.0 |
| lambda_anat: 0.02 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.1 |
| lambda_posterior: 0.2 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: return to measured |
| admits: |
| - 1 |
| - 2 |
| tier_permissions: |
| 1: |
| - family_local.* |
| - family_residual.* |
| - coupling.* |
| - msg_readin.* |
| - assimilate.* |
| - context.* |
| - family_readout.* |
| - observation.* |
| - eeg.* |
| - eeg_montages.* |
| - bold.* |
| - behaviour.* |
| - tms_drive.* |
| 2: |
| - eeg.log_gain |
| - eeg.offset |
| - eeg.log_noise |
| - eeg.nuisance* |
| - eeg_montages.*.log_gain |
| - eeg_montages.*.offset |
| - eeg_montages.*.log_noise |
| - eeg_montages.*.nuisance* |
| objective: |
| - likelihood |
| - forecast |
| - perturbation |
| rationale: The 1 -> 4 -> 1 return, so the final population weights are conditioned |
| on evidence rather than on the generator. `tms_drive.*` is granted here |
| and nowhere else. |
| - name: T6_individual |
| steps: 1200 |
| lr: 0.0006 |
| weight_decay: 0.01 |
| warmup: 60 |
| grad_clip: 1.0 |
| batch: null |
| log_every: 20 |
| ckpt_every: 300 |
| enabled: true |
| lambda_slice: 1.0 |
| lambda_obs: 1.0 |
| lambda_forecast: 1.0 |
| lambda_perturb: 0.0 |
| lambda_anat: 0.0 |
| lambda_scale: 0.05 |
| lambda_homeo: 0.02 |
| lambda_cal: 0.1 |
| lambda_posterior: 0.0 |
| lambda_kl: 0.01 |
| lambda_residual: 0.02 |
| lambda_port: 0.02 |
| extra: |
| curriculum: |
| scope: person and session effects, population weights frozen |
| admits: |
| - 1 |
| individualize: true |
| tier_permissions: |
| 1: |
| - individualizer.* |
| - eeg.log_gain |
| - eeg.offset |
| - eeg.log_noise |
| - eeg.nuisance* |
| - eeg_montages.*.log_gain |
| - eeg_montages.*.offset |
| - eeg_montages.*.log_noise |
| - eeg_montages.*.nuisance* |
| objective: |
| - likelihood |
| - forecast |
| rationale: '75 of sleep-edfx''s 78 participants were recorded on two consecutive |
| nights, and it is the only corpus here with a second session of the same |
| person. The effect is fitted on the training nights and scored on the held-out |
| one by `session_individualisation`, per participant with a cluster bootstrap |
| over participants. A learning rate at the T1 level rather than a decayed |
| one, because these tensors start at zero and have 1,200 steps to leave it |
| -- the population weights they modulate are frozen, so there is nothing |
| for a large step to destabilise. The falsifier is stated in the evaluation |
| and not softened here: if the between-participant spread of the applied |
| theta shift is at or near zero on a split built to let it be non-zero, the |
| third capability is unsupported and the site says so.' |
| arm: |
| role: treatment |
| controls_for: '' |
| justification: 'Heterogeneous region-indexed state with per-family operators (`family_state: |
| true`), as 003. 004 changes the BOLD likelihood and adds a fitted person effect; |
| neither touches the arm.' |
| mixture_cards: configs/curriculum/source_cards |
| notes: 'SC-WBD-004. Two structural changes on 003: the measured fMRI likelihood integrates |
| the Balloon-Windkessel ODE across the interval a BOLD frame covers rather than indexing |
| 8 neural steps against 8 TRs, and a person/session effect is fitted in a sixth stage |
| on sleep-edfx''s two-night structure. The BOLD horizon is REDUCED to `bold_predict_frames` |
| of 8 target frames to pay for the first; that reduction belongs on the model card |
| next to any fMRI number.' |
|
|