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.'