{
  "_notes": [
    "Single-rep checkpointed run of the production bilateral img+cd ensemble",
    "at the refuge_efficientnet_v2_m backbone. Per-fold tower and stage_models",
    "state_dicts are saved under {output_root}/{run_name}/binary/checkpoints/",
    "fold{N}/ for downstream explainability (Grad-CAM, attribution, etc.).",
    "",
    "Same architecture as ensemble_fused.json — only changes are:",
    "  • img.args.backbone = refuge_efficientnet_v2_m",
    "  • save_checkpoints   = true",
    "  • run_name           = experiments/explainability/ensemble_v2m_ckpt"
  ],
  "run_name": "experiments/explainability/ensemble_v2m_ckpt",
  "num_classes": 2,
  "label_filter": [0, 1],
  "split_identity_level": 1,
  "eval_stage": "hb",
  "save_predictions": true,
  "save_checkpoints": true,
  "seed": 1234,
  "folds": 5,
  "fold_seed": 100,
  "output_root": "v4/results",
  "out_dir_tags": ["binary"],
  "data": {
    "module": "v4.classes.profiles.v4papila",
    "args": {
      "image_dir": "Papila/FundusImages",
      "clinical_dir": "Papila/ClinicalData",
      "label_col": "Diagnosis",
      "iop_corr_method": "ratio",
      "iop_drop_raw": true,
      "exclude_cols": ["Axial_Length"],
      "in_memory_cache": true
    }
  },
  "towers": [
    {
      "name": "img",
      "module": "v4.classes.towers.image_tower",
      "class": "ImageEncoder",
      "data_source": "image",
      "args": {
        "backbone": "refuge_efficientnet_v2_m",
        "freeze_ratio": 0.0,
        "augment": true
      }
    },
    {
      "name": "cd",
      "module": "v4.classes.towers.clinical_tower",
      "class": "ClinicalEncoder",
      "data_source": "matrix",
      "args": { "hidden_dim": 128 }
    }
  ],
  "stages": [
    { "name": "cd_warm", "type": "warm", "tower": "cd", "head_name": "cd_aux", "level": "eye", "epochs": 40 },
    { "name": "img_aux", "type": "head", "input": "img", "train_with": "nt", "bcd": true },
    { "name": "cd_aux",  "type": "head", "input": "cd",  "train_with": "nt", "bcd": true },
    {
      "name": "nt",
      "type": "fusion",
      "module": "v4.classes.bridges.fusion_bridge",
      "class": "FusionBridge",
      "inputs": ["img", "cd"],
      "level": "eye",
      "epochs": 36,
      "train_towers": true,
      "warmup": { "tower_epochs": 3, "fused_epochs": 3 },
      "args": { "fusion_dim": 256 }
    },
    { "name": "nt_head", "type": "head", "input": "nt", "train_with": "nt" },
    {
      "name": "hb",
      "type": "fusion",
      "module": "v4.classes.bridges.hyperbridge",
      "class": "HyperBridge",
      "inputs": { "a": "nt", "b": "nt" },
      "level": "patient",
      "epochs": 10,
      "args": { "hidden_dim": 256, "mode": "embedding_mlp" }
    },
    { "name": "hb_head", "type": "head", "input": "hb", "train_with": "hb", "args": { "dropout": 0.3 } }
  ],
  "training": {
    "lr": 1e-4,
    "batch_size": 8,
    "bcd_prob": 0.5,
    "tune_binary_threshold": true
  }
}
