{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "92e85840",
   "metadata": {},
   "source": [
    "# Fusion Experiments\n",
    "\n",
    "This is where I finally compare the unimodal branches against the synthetic multimodal setup, with repeated seeds so I am not over-reading one lucky run. I am running both the same-label pairing and a random-pairing control on purpose. If the apparent fusion gain only survives when the labels are artificially aligned, then that tells me something important about the setup rather than about multimodal learning.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Notebook Purpose\n",
    "\n",
    "This notebook runs the exploratory fusion experiments on the synthetic pairs. It compares tabular-only, image-only, early-fusion, and late-fusion baselines across same-label and random-pairing strategies.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Why This Matters\n",
    "\n",
    "Fusion metrics are only meaningful when compared against unimodal baselines and pairing controls. Repeating experiments across seeds helps separate stable behaviour from one-off pairing artifacts.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Load Fusion Inputs\n",
    "\n",
    "This setup cell loads the published Wisconsin data and the saved patient-level image embeddings. It also defines the repeated seeds used for controlled comparison.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d26cbd0c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-19T22:42:27.067739Z",
     "iopub.status.busy": "2026-04-19T22:42:27.067471Z",
     "iopub.status.idle": "2026-04-19T22:42:30.266089Z",
     "shell.execute_reply": "2026-04-19T22:42:30.265646Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Project root: /Users/sergeysotskiy/Documents/UNI/year 3/Dissertation/dissertation_project\n",
      "Outputs: /Users/sergeysotskiy/Documents/UNI/year 3/Dissertation/dissertation_project/outputs\n"
     ]
    }
   ],
   "source": [
    "from __future__ import annotations\n",
    "\n",
    "import json\n",
    "import random\n",
    "import sys\n",
    "from pathlib import Path\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "SEED = 42\n",
    "random.seed(SEED)\n",
    "np.random.seed(SEED)\n",
    "plt.style.use('seaborn-v0_8-whitegrid')\n",
    "\n",
    "CWD = Path.cwd().resolve()\n",
    "if (CWD / 'src').exists() and (CWD / 'data').exists():\n",
    "    PROJECT_ROOT = CWD\n",
    "elif (CWD.parent / 'src').exists() and (CWD.parent / 'data').exists():\n",
    "    PROJECT_ROOT = CWD.parent\n",
    "elif (CWD.parent.parent / 'src').exists() and (CWD.parent.parent / 'data').exists():\n",
    "    PROJECT_ROOT = CWD.parent.parent\n",
    "else:\n",
    "    raise RuntimeError(f'Could not resolve dissertation_project root from {CWD}')\n",
    "\n",
    "REPO_ROOT = PROJECT_ROOT.parent\n",
    "OUTPUTS = PROJECT_ROOT / 'outputs'\n",
    "FIGURES = OUTPUTS / 'figures'\n",
    "METRICS = OUTPUTS / 'metrics'\n",
    "REPORTS = OUTPUTS / 'reports'\n",
    "MODELS = PROJECT_ROOT / 'models'\n",
    "DATA_ROOT = PROJECT_ROOT / 'data' / 'dataset_cancer_v1' / 'dataset_cancer_v1'\n",
    "WISCONSIN_ROOT = PROJECT_ROOT / 'notebook_Wisconsin'\n",
    "\n",
    "for path in [FIGURES, METRICS, REPORTS]:\n",
    "    path.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "if str(PROJECT_ROOT) not in sys.path:\n",
    "    sys.path.append(str(PROJECT_ROOT))\n",
    "\n",
    "print('Project root:', PROJECT_ROOT)\n",
    "print('Outputs:', OUTPUTS)\n",
    "\n",
    "from src.fusion import (\n",
    "    load_wisconsin_dataframe,\n",
    "    run_late_fusion_experiment,\n",
    "    run_logistic_fusion_experiment,\n",
    "    summarise_experiment_rows,\n",
    ")\n",
    "from src.pairing import build_random_pairs, build_same_label_pairs\n",
    "\n",
    "wisconsin = load_wisconsin_dataframe(WISCONSIN_ROOT / 'brca.csv')\n",
    "image_embeddings = pd.read_csv(REPORTS / 'breakhis_patient_level_embeddings.csv')\n",
    "seeds = [11, 21, 31, 41, 51]\n",
    "rows = []\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Run Repeated Fusion Experiments\n",
    "\n",
    "This cell executes the main fusion comparison. For each pairing strategy and seed, it evaluates tabular-only, image-only, early fusion, and late fusion, then saves both raw metric rows and summarized statistics.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "82e819ab",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-19T22:42:30.267917Z",
     "iopub.status.busy": "2026-04-19T22:42:30.267806Z",
     "iopub.status.idle": "2026-04-19T22:42:31.614415Z",
     "shell.execute_reply": "2026-04-19T22:42:31.613904Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pairing_type</th>\n",
       "      <th>experiment</th>\n",
       "      <th>metric</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>accuracy</td>\n",
       "      <td>0.970175</td>\n",
       "      <td>0.010002</td>\n",
       "      <td>0.956140</td>\n",
       "      <td>0.982456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>brier_score</td>\n",
       "      <td>0.022838</td>\n",
       "      <td>0.009095</td>\n",
       "      <td>0.014408</td>\n",
       "      <td>0.033308</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>f1_score</td>\n",
       "      <td>0.959143</td>\n",
       "      <td>0.013240</td>\n",
       "      <td>0.941176</td>\n",
       "      <td>0.975610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>precision</td>\n",
       "      <td>0.971290</td>\n",
       "      <td>0.025303</td>\n",
       "      <td>0.930233</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>recall</td>\n",
       "      <td>0.947619</td>\n",
       "      <td>0.010648</td>\n",
       "      <td>0.928571</td>\n",
       "      <td>0.952381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>random</td>\n",
       "      <td>early_fusion</td>\n",
       "      <td>roc_auc</td>\n",
       "      <td>0.994775</td>\n",
       "      <td>0.004828</td>\n",
       "      <td>0.988757</td>\n",
       "      <td>0.999339</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>accuracy</td>\n",
       "      <td>0.585965</td>\n",
       "      <td>0.036905</td>\n",
       "      <td>0.526316</td>\n",
       "      <td>0.622807</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>brier_score</td>\n",
       "      <td>0.262869</td>\n",
       "      <td>0.017066</td>\n",
       "      <td>0.245995</td>\n",
       "      <td>0.289266</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>f1_score</td>\n",
       "      <td>0.346602</td>\n",
       "      <td>0.073730</td>\n",
       "      <td>0.228571</td>\n",
       "      <td>0.426667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>precision</td>\n",
       "      <td>0.411399</td>\n",
       "      <td>0.076043</td>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.484848</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>recall</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.070630</td>\n",
       "      <td>0.190476</td>\n",
       "      <td>0.380952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>random</td>\n",
       "      <td>image_only</td>\n",
       "      <td>roc_auc</td>\n",
       "      <td>0.492427</td>\n",
       "      <td>0.057517</td>\n",
       "      <td>0.405589</td>\n",
       "      <td>0.553571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>accuracy</td>\n",
       "      <td>0.971930</td>\n",
       "      <td>0.009609</td>\n",
       "      <td>0.964912</td>\n",
       "      <td>0.982456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>brier_score</td>\n",
       "      <td>0.079885</td>\n",
       "      <td>0.006062</td>\n",
       "      <td>0.072742</td>\n",
       "      <td>0.085690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>f1_score</td>\n",
       "      <td>0.960488</td>\n",
       "      <td>0.013813</td>\n",
       "      <td>0.950000</td>\n",
       "      <td>0.975610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>precision</td>\n",
       "      <td>0.995000</td>\n",
       "      <td>0.011180</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>recall</td>\n",
       "      <td>0.928571</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.904762</td>\n",
       "      <td>0.952381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>random</td>\n",
       "      <td>late_fusion</td>\n",
       "      <td>roc_auc</td>\n",
       "      <td>0.990410</td>\n",
       "      <td>0.005424</td>\n",
       "      <td>0.984788</td>\n",
       "      <td>0.996693</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>random</td>\n",
       "      <td>tabular_only</td>\n",
       "      <td>accuracy</td>\n",
       "      <td>0.982456</td>\n",
       "      <td>0.006203</td>\n",
       "      <td>0.973684</td>\n",
       "      <td>0.991228</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>random</td>\n",
       "      <td>tabular_only</td>\n",
       "      <td>brier_score</td>\n",
       "      <td>0.016562</td>\n",
       "      <td>0.005778</td>\n",
       "      <td>0.011597</td>\n",
       "      <td>0.023761</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pairing_type    experiment       metric      mean       std       min  \\\n",
       "0        random  early_fusion     accuracy  0.970175  0.010002  0.956140   \n",
       "1        random  early_fusion  brier_score  0.022838  0.009095  0.014408   \n",
       "2        random  early_fusion     f1_score  0.959143  0.013240  0.941176   \n",
       "3        random  early_fusion    precision  0.971290  0.025303  0.930233   \n",
       "4        random  early_fusion       recall  0.947619  0.010648  0.928571   \n",
       "5        random  early_fusion      roc_auc  0.994775  0.004828  0.988757   \n",
       "6        random    image_only     accuracy  0.585965  0.036905  0.526316   \n",
       "7        random    image_only  brier_score  0.262869  0.017066  0.245995   \n",
       "8        random    image_only     f1_score  0.346602  0.073730  0.228571   \n",
       "9        random    image_only    precision  0.411399  0.076043  0.285714   \n",
       "10       random    image_only       recall  0.300000  0.070630  0.190476   \n",
       "11       random    image_only      roc_auc  0.492427  0.057517  0.405589   \n",
       "12       random   late_fusion     accuracy  0.971930  0.009609  0.964912   \n",
       "13       random   late_fusion  brier_score  0.079885  0.006062  0.072742   \n",
       "14       random   late_fusion     f1_score  0.960488  0.013813  0.950000   \n",
       "15       random   late_fusion    precision  0.995000  0.011180  0.975000   \n",
       "16       random   late_fusion       recall  0.928571  0.023810  0.904762   \n",
       "17       random   late_fusion      roc_auc  0.990410  0.005424  0.984788   \n",
       "18       random  tabular_only     accuracy  0.982456  0.006203  0.973684   \n",
       "19       random  tabular_only  brier_score  0.016562  0.005778  0.011597   \n",
       "\n",
       "         max  \n",
       "0   0.982456  \n",
       "1   0.033308  \n",
       "2   0.975610  \n",
       "3   1.000000  \n",
       "4   0.952381  \n",
       "5   0.999339  \n",
       "6   0.622807  \n",
       "7   0.289266  \n",
       "8   0.426667  \n",
       "9   0.484848  \n",
       "10  0.380952  \n",
       "11  0.553571  \n",
       "12  0.982456  \n",
       "13  0.085690  \n",
       "14  0.975610  \n",
       "15  1.000000  \n",
       "16  0.952381  \n",
       "17  0.996693  \n",
       "18  0.991228  \n",
       "19  0.023761  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for pairing_name, builder in [('same_label', build_same_label_pairs), ('random', build_random_pairs)]:\n",
    "    for seed in seeds:\n",
    "        paired = builder(wisconsin, image_embeddings, random_state=seed).paired\n",
    "        experiments = {\n",
    "            'tabular_only': run_logistic_fusion_experiment(paired, random_state=seed, feature_prefixes=('tab_',)),\n",
    "            'image_only': run_logistic_fusion_experiment(paired, random_state=seed, feature_prefixes=('img_img_emb_',)),\n",
    "            'early_fusion': run_logistic_fusion_experiment(paired, random_state=seed),\n",
    "            'late_fusion': run_late_fusion_experiment(paired, random_state=seed),\n",
    "        }\n",
    "        for experiment_name, result in experiments.items():\n",
    "            for metric_name, metric_value in result.metrics.items():\n",
    "                rows.append(\n",
    "                    {\n",
    "                        'pairing_type': pairing_name,\n",
    "                        'seed': seed,\n",
    "                        'experiment': experiment_name,\n",
    "                        'metric': metric_name,\n",
    "                        'value': metric_value,\n",
    "                    }\n",
    "                )\n",
    "results_df = pd.DataFrame(rows)\n",
    "results_df.to_csv(METRICS / 'synthetic_fusion_experiments.csv', index=False)\n",
    "summary_df = summarise_experiment_rows(results_df)\n",
    "summary_df.to_csv(METRICS / 'synthetic_fusion_summary.csv', index=False)\n",
    "summary_df.head(20)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Plot Accuracy And ROC-AUC Comparisons\n",
    "\n",
    "This cell turns the repeated-seed summary into a comparison figure. Accuracy and ROC-AUC are shown side by side because a single metric is not enough to interpret classifier behaviour.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "08b82ccd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-19T22:42:31.615840Z",
     "iopub.status.busy": "2026-04-19T22:42:31.615730Z",
     "iopub.status.idle": "2026-04-19T22:42:31.827808Z",
     "shell.execute_reply": "2026-04-19T22:42:31.827277Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAHqCAYAAAB/bWzAAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbP1JREFUeJzt3QeYXVW5P+AFCSVUKYIVuKBU6VFBYkUQbDRBQGlKs1AEL1JEQFCKV70qKk28IGBBEKWKCDZUUKRIL9IVpbeEhIT5P7/lf49nJpMyJDOzM/O+zzOEOXWfc9bs8+1vf+tbc3V1dXUVAAAAAABaYe6h3gAAAAAAAP5D0hYAAAAAoEUkbQEAAAAAWkTSFgAAAACgRSRtAQAAAABaRNIWAAAAAKBFJG0BAAAAAFpE0hYAAAAAoEUkbQGYo3V1dQ31JgAAwGwnzoWRTdIWBskOO+xQVlpppbLttttO8zaf+tSn6m0OPPBAnwvMwFNPPVUOOOCA8uc//3m2vFf52/vGN77R2vf9qquuqtuYfwFgoM2psWu+y7NNvX/WWmut8q53vat89atfLZMnT57qfrfddluNK97ylreU173udeVtb3tb2W+//cr1118/zef661//Wv77v/+73naNNdYo73znO8uhhx5a7r///n5t8z333FO38Y1vfGOZNGnSVNc/8MAD9fpzzz23XzHCCy+8UM4+++zyoQ99qD72OuusU7bYYovyve99r8/noT0eeuihsvvuu5cHH3xwlh9rRuOnDbJt2cZsK/Afozv+Hxhgc889d7nuuuvql/DLXvayHteNHz++XHHFFT4DmEm33HJL+elPf1q22mor7xkADIA5OXb94Q9/2OP3xx9/vFxwwQXlhBNOqEnbJFsbiScOOeSQsuqqq9ZE9Ctf+cr6mn/84x+X7bbbrt52l1126fF4Z555ZvniF79Yk6H7779/WWqppcq9995bvvOd75RLL720nHbaaWXllVeeqW0955xzygorrFDvf8kll5T3v//9s/z6J0yYUPbcc8+adM5r2HXXXcs888xT/vjHP5bjjjuu/OY3vynf/OY3y7zzzjvLz8Xs9/vf/778+te/9tbCCCdpC4MogeCdd95Zg7Gdd965x3UJeseMGVMWWWQRnwkAAENuTo5dU1nb29vf/vZayZeqviZpe/PNN9eE7WabbVaOPPLImqhuJHn6hS98oRx77LG1CvBNb3pTvfyaa66pl6eCNfdtJIGbatvNN9+8HHzwwTNV2ThlypRy3nnnlQ9+8IPl2muvLT/4wQ9mS9L26KOPLn/5y19qVW3nezFu3LiaTE6iOc+14447zvJzATAwtEeAQbTAAguUt771rTXw7e2iiy6qU7ZGjx491bSmk046qWy00UZ1qlZuk+Crd7CX27z3ve+tU7MSmGUqW86kd04Vy2P86le/Ku973/u6HytB4oxkWtWWW25ZHzePn6D24osv7nGbv/3tb+WTn/xkecMb3lBe//rXlz322KPcdddd3dc/88wzNRB+85vfXB8n1ZHZlulNTW+mtzUy9W6nnXYqhx12WJ3e9e53v7u+9scee6wcccQRNRDP68o2fOITn5hqek1ea6aErbnmmnUa25e//OU6NeyOO+6oz9O7IuMf//hHWWWVVcrPfvazab43l112Wdl+++3L2muvXZ97k002qZUXnf71r3+Vz3zmM2X99devt/vwhz9cg/LO13788cfX9zjvb/6/mSq39957lw022KC+Z5mmmIOETqkYSWCf+6233nrl05/+dPnnP//Zff2NN95Y37N11123PncOuFIxMz3T2p6///3vdZpg3t+8h3ncHOj0nnp14YUX1sqO5n1OFUfGce8x9Z73vKd7+mE+63yWMzvuMv2vOcjIv3lvOj+T3G/11Vev791RRx1Vq4E6XX311fXgKNuYv4NUM8zIc889Vw4//PDuaZP5rFNN0+mJJ54on/vc5+pBXZ5/m222KX/4wx/6/TcdOZDKdXntGTN5/3s/TqZ4vuMd76iPk38zpp9//vkZvhYAGM6x6/QstNBCZa655ur+PZW3eZ2f/exneyRsG0nuvvzlL6/xTCPf/wsvvHCNi3pbfPHFa8y64YYbThV/9OV3v/tdjRUTDyWmS6yXRPmsSGyc6t3E230lr/O+f+QjHylLL730gB4DNLHhd7/73Ro3Je7KdjWtJT760Y92t21I7JiYvFOqlXO/xFQ5hkgclmOKxpVXXlljrcS4ee6PfexjPY4/epve9tx+++1127Mt+cmxRGebi6YFRT6vJOvzfmy88cblrLPOmu3jP8n+gw46qP5/xlFn+5GZiaFT6d0cH+TY59Zbby0zM2aSyE/snPc7n3Xvv7UZHQvExIkTayV39hvZxvztZl/R+z361re+Vbc/j/Pxj3+8PPnkk/2Ou2FE6AIGxYc//OH6c/HFF3ettNJKXf/4xz+6r3v66ae7Xve613X96U9/6nr729/e9ZnPfKb7ukMPPbRrtdVW6/r617/e9dvf/rbrK1/5StfKK6/cdfzxx3ff5phjjulac801u04//fSuq666qutnP/tZ17ve9a6uN7zhDV3jx4+vt8n9c5s8/o9+9KOuK6+8susjH/lI14orrth15513TnO7zzjjjPp83/zmN7v++Mc/dv385z/v+sAHPtC16qqrdr+Ghx56qGvs2LFd73nPe7ouvPDCriuuuKJryy237Npggw26Hn/88a7Jkyd3bb311l2vf/3ru773ve/V5/70pz9dHyOvObId2cZO+T2XN/K+5D677bZb1+9///uuyy67rOuFF16o27PRRht1XXDBBXUbTzvttK611167vr7O15HHOuSQQ7p+85vfdJ155pn1/cj7G9m+7bbbrsfzf+tb3+paZ511uiZMmNDne5PXmcc86qij6vZcfvnlXbvuumu97Lrrrqu3eeaZZ7re8Y53dL31rW/tOuecc7p+97vf1e1aa621uu6+++7u157P+NRTT62Pefvtt3fdcccd9TVsscUWXRdddFHXL37xi64ddtih3i6fcfz5z3/uWmWVVbq+8Y1v1Nd93nnn1ff8Qx/6UPe4euMb39i1zz771Pc8j73NNtvU1/TUU09N8zPva3seffTRrje/+c1dG2+8cR1f2Z6M57yOZvzcf//99b4ZC/vvv3/Xr3/96+7xetxxx3U//gknnFD/Bo488sg6pk866aSu1Vdfveuggw6a6XGX19Z8pvk371dk23JZ8/xnnXVWHXc77bRTHStx44031tf30Y9+tOtXv/pVvX/ep77GYKeMlfz9NOMsryn3+fGPf1yvf+6557re//73d73pTW+qf2N57L322qtuc8ZHf/6m83eSx/7CF75Qb5Pnyn1yWZ67eR/z2vL8GRN5HzMevva1r03zNQDAcI9dm/jx+eef7/6ZOHFijVfzXZnXkuePKVOm1Lho7733nu57kVgv93vsscdqPJG4JfHV7JBYITF05LUn/kuM1KmJsRJL9iWxQWeMkFglvycWebFmxzFAs915TYlXLrnkknrfP/zhD3WM5PNMPJ/7JobKZ9F8tueff369TTNGvv/979e484ADDqjX33fffV1r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AFpE0hYAAAAAoEUkbQEAhoFzzz23vOMd7xjqzQAAgBdFPNvT6PIiTZo0qWy55Zbl0EMPLW984xv7vM3NN99cDjvssHL77beX17zmNeWII44or3vd617sUwIATNNyB144qO/OPce8Z1Cfj9lPPAsAtIl4llmutJ04cWLZb7/9yh133DHN24wfP77svvvuZezYsTVTvvbaa5c99tijXg4AAENJPAsAwLBK2t55551lm222Kffdd990b3fRRReV+eabrxxwwAFlhRVWKIccckhZcMEFyyWXXDIr2wsAMEd64IEHykorrVS++c1vlte//vV1BtIJJ5xQWxpkJtK4cePK8ccf3337HXbYoXz7298uH/3oR8saa6xR3vWud5Xf/va33df/85//LLvuumtZa621yhZbbDFVbHbXXXfV+66zzjrlzW9+c33sF154oV73jW98o8ZoRx55ZD2xnm343e9+V84444zypje9qay33nrl9NNPL8OVeBYAoP/Esy1P2l599dW1HcIPf/jD6d7u+uuvL+uuu26Za6656u/5NwcN11133YvfWgCAOdxf/vKXcs4555QllliinHbaaeULX/hCPan9iU98oiZTb7rppu7bJqn7nve8p1xwwQVl5ZVXrm2pmsTrPvvsU///7LPPLrvttlt9rMZjjz1Wtt9++7LUUkvV69OuKgnZzkRsTrAvvPDC5ac//WlNCu+77741cfu9732vJoyPPfbY+jjDkXgWAODFE8+2tKdtDgBmxsMPP1z72HbKwcn0WioAAAx3O+20U1lmmWVqC6lU2K6//vr18u22265W4SZWWm211eplb33rW+saAvGxj32sbLbZZjXGeuqpp8q1115brrjiivKKV7yivPa1ry033nhj94ymJHnHjBlTK2lHjx5dZz3lfnn8nXfeud5mscUWq4nfnFhPpe7FF19cZ0a9+tWvrhW6X//618u9995bFl988TLciGcBAF488WzLFyKbkQkTJpR55523x2X5PQs+TMuUKVPqDwOreY+91wwWY47BZLwxmGOtP+OtqZB9+ctfXm+fFgmZmfSlL32p/O1vfyu33HJLTaxOnjy5Xt/V1VWTu81jL7DAAt29WLPI66KLLlqWXnrp7uuT6E3iNb9n+v+qq65aE7LN9WuuuWZ9/Mcff7xuy6te9arubWpitpe97GX19vPMM0/9/bnn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AADDLml73HHHlRtvvLGcdtpp5bDDDivHH398ueSSS6a63R133FH233//sscee5Sf/vSnZZVVVqn/P2HChNm17QAA0G/iWQAAhlXSdvz48eXss88uhxxySFlttdXKRhttVHbddddy5plnTnXbK6+8srzmNa8pm2++eVlmmWXKfvvtVx5++OFy5513zs7tBwCAmSaeBQBg2CVtb7311jJ58uTa7qCx7rrrluuvv7688MILPW77kpe8pCZor7nmmnrdueeeWxZaaKGawAUAgKEgngUAYE4wuj83TqXsYostVuadd97uy5ZccsnaF+yJJ54oiy++ePfl7373u8vll19ett9++zJq1Kgy99xzlxNPPLEsuuiis/cVAADATBLPAgAw7JK26UfbmbCN5vdJkyb1uPzxxx+vQfHnPve5suaaa5bvf//75aCDDio/+clPyhJLLNHn40+ZMqX+wEAyxobmPR9VRibjDWOO4Wwo9nGz+pwDHc8222j/z0AyvgbfSI5nw5jDeGO4mtLieLZfSdv55ptvqmC2+X3++efvcfn//M//lBVXXLF86EMfqr8feeSRZdNNNy3nnHNO2X333ft8/Ntvv70/mwMvynXXXeedGwLrjtB33XjDmGM4mxP3cQMdz4aYloE2J/7tDQcjNZ4NYw7jjeHquhZ/p/Yrabv00kvXioP0tR09+t93TfVBAtxFFlmkx21vuummssMOO3T/nvYIK6+8cvn73/8+zcdPULzAAguUQXX2JYP7fAy5tdZaa6g3YcSpZ5HOLyPSkI43+7cRyZhjuI+3LCQ2K0nRgY5nhySmtb8fccSzg28kx7MhvsB4Y7haq8XxbL+StqusskoNbpOFHjt2bL0sC42tvvrqNYjttNRSS5W77rqrx2V33313ve20pPdtfmAgGWMMJuONwWbMMdzH26w+50DHs802+ltkIBlfDDZjDuON4WpUi+PZnpHpDIwZM6Zsvvnm5fDDDy833HBDueyyy8qpp55adtxxx+4qheeee67+/zbbbFN+9KMflfPOO6/ce++9dXpZqhK22GKLF/N6AABglolnAQCYE/Sr0jay+EKStjvttFNZaKGFyl577VU23njjet24cePK0UcfXbbccsvy7ne/uzz77LPlxBNPLA899FCtajjttNOmu2gDAAAMNPEsAADDLmmb6oRjjz22/vR222239fh96623rj8AANAW4lkAANquX+0RAAAAAAAYWJK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAALSJpCwAAAADQIpK2AAAAAAAtImkLAAAAANAikrYAAAAAAC0iaQsAAAAA0CKStgAAAAAAc3LSduLEieXggw8uY8eOLePGjSunnnrqNG972223le22266sscYa5X3ve1/54x//OKvbCwAAs0Q8CwDAsEvaHnfcceXGG28sp512WjnssMPK8ccfXy655JKpbvf000+Xj3zkI+U1r3lNOf/888tGG21UPvnJT5ZHH310dm07AAD0m3gWAIBhlbQdP358Ofvss8shhxxSVltttZqI3XXXXcuZZ5451W1/8pOflAUWWKAcfvjhZdllly177713/TcJXwAAGAriWQAA5gSj+3PjW2+9tUyePLmsvfba3Zetu+665YQTTigvvPBCmXvu/+SAr7766rLhhhuWUaNGdV92zjnnzK7tBgCAfhPPAgAw7JK2Dz/8cFlsscXKvPPO233ZkksuWfuCPfHEE2XxxRfvvvz++++vvWwPPfTQcvnll5dXvvKV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6P7cePz48eXss88uJ598cllttdXqzx133FHOPPPMsskmm/S47QUXXFDWW2+9suOOO9bfl1122XL55ZeXiy++uKy88sqz91UAAMBMEM8CADDskrapkp08eXJtd9BYd911ywknnFBeeOGFMvfc/ync3WKLLcrzzz8/1WM8/fTTs7rNAADwoohnAQAYdu0RHn744bLYYouVeeedt/uyJZdcsvYFe+KJJ3rcdoUVVuhRUZuK3D/84Q9l/fXXnx3bDQAA/SaeBQBg2FXaTpgwoUfCNprfJ02aNM37PfbYY2WvvfYq66yzTtlwww2nebspU6bUHxhIxhiDyXhjsBlzDPfxNqvPOdDxbLON/hYZSMYXg82Yw3hjuJrS4ni2X0nb+eabb6pgtvl9/vnn7/M+jzzySNlll11KV1dX+frXv96jhUJvt99+e382B16U6667zjvHoDHeGGzGHMbb0MazIaZloNnXM9iMOYw3hqvrWpwj6lfSdumlly6PP/547Ws7evTo7ilmCXAXWWSRqW7/z3/+s3shstNPP70svvji0338FVdcsSywwAJlUJ19yeA+H0NurbXWGronN95GHOMNY47hbCj2cVlIbFaSogMdzw5JTCu+GHGGNL4IY27EEdNivDFcrdXieLZfSdtVVlmlBrfJQo8dO7Zeds0115TVV199qoqDbMCuu+5aL0+A+9KXvnSGjz9q1Kj6AwPJGGMwGW8MNmOO4T7eZvU5BzqebbbR3yIDyfhisBlzGG8MV6NaHM/2ayGyMWPGlM0337wcfvjh5YYbbiiXXXZZOfXUU7urD1Kl8Nxzz9X/P/HEE8t9991Xjj322O7r8vP000/3/9UAAMBsIJ4FAGBO0K9K2zjooINq0nannXYqCy20UF2QYeONN67XjRs3rhx99NFlyy23LD//+c9rAnfrrbfucf8tttiiHHPMMbPvFQAAQD+IZwEAGHZJ21QnpHq2qaDtdNttt3X//yWX6BULAED7iGcBAGi7frVHAAAAAABgYEnaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAQItI2gIAAAAAtIikLQAAAABAi0jaAgAAAAC0iKQtAAAAAECLSNoCAAAAALSIpC0AAAAAwJyctJ04cWI5+OCDy9ixY8u4cePKqaeeOs3b3nzzzWXrrbcua665Ztlqq63KjTfeOKvbCwAAs0Q8CwDAsEvaHnfccTX5etppp5XDDjusHH/88eWSSy6Z6nbjx48vu+++e03unnvuuWXttdcue+yxR70cAACGingWAIBhlbRNwvXss88uhxxySFlttdXKRhttVHbddddy5plnTnXbiy66qMw333zlgAMOKCussEK9z4ILLthnghcAAAaDeBYAgGGXtL311lvL5MmTa9VsY9111y3XX399eeGFF3rcNpflurnmmqv+nn/XWWedct11182ubQcAgH4RzwIAMOyStg8//HBZbLHFyrzzztt92ZJLLln7gj3xxBNT3XappZbqcdkSSyxRHnrooVndZgAAeFHEswAAzAlG9+fGEyZM6JGwjeb3SZMmzdRte98umirdZ599tkyZMqUMpv96Sb/egmFj/HyvLSPVlKefHrLnHqnjbSSPOeNtaIzU8RbG3OAz3gbXc889V//tPctrqOPZoYxpxRcjz1Du60fymLO/HxojdbyN5DEnnh0axlv74tl+7f3So7Z3kNr8Pv/888/UbXvfLlKpG/fdd18ZbP+z0ZJlJLqlnFhGrNtvH7KnHqnjbUSPOeNtSIzY8RbG3KAz3oZG4seFFlqo3/cbqHi22aahiGnFFyPQEO7rR/KYs78fGiN1vI3oMSeeHRLGW/vi2X4lbZdeeuny+OOP1762o0eP7p5ilsB1kUUWmeq2jzzySI/L8nvvlgmx6KKLluWWW64GxnPP3a+ODQAAjCCpSEiAm/jxxRioeDbEtAAAzK54tl9J21VWWaUGt1lMbOzYsfWya665pqy++upTJVvXXHPNcvLJJ5eurq66CFn+/ctf/lL23HPPqTdi9Oja7xYAAGbkxVTYDnQ8G2JaAABmVzzbr7LWMWPGlM0337wcfvjh5YYbbiiXXXZZOfXUU8uOO+7YXaXQ9GXYZJNNylNPPVW+8IUvlDvvvLP+m75gm266aX+eEgAAZhvxLAAAc4K5ulIy0A9JvCZpe+mll9as8Ec/+tGy88471+tWWmmlcvTRR5ctt9yy/p7E7mGHHVbuuuuuet0RRxxRVl111YF5JQAAMBPEswAADLukLQAAAAAAA8eqX8Bs5TwQMFz3bfZvACOD/T0wXIlp5yyStsN0FbopU6YM9WYwTD355JPl/vvvn+b1Wajlscce6x6LMLuDjKz4DgOpr31X9m35AQaPmJaBIp5lqIlpGQxi2jmfpO0w/IPMysejRo0a6s1hmNprr73K5z73uTJp0qQ+vwwuvvjisvXWW9f/770KN7xYzRhL0iyrs8cDDzzgDWW2ueOOO8pb3/rWum/Lvqt3kPv000/XxVfT0z9UYcHAEdMy0MSzDBUxLQNNTDu8yKgMI02CLFWQSartt99+5aKLLqqXObhkVjXVjTvttFO5+eabyz//+c/6+29+85seydl//OMfZezYsTXBATNjWvunzsubMfbII4/URS3XXHPNsttuu5UzzjijxwkEeLEWWWSR8txzz5Vzzjmne8yNHz+++/rHH3+8nH322WXhhReuv6u6hYEjpmWgiGcZSGJa2kBMO7xI2s6BXwK9p4rl8lz2+9//vvzoRz8qRx55ZPnXv/5Vnn/++Zq4vfLKKx1cMkvBbcZYU9244YYb1iTZ1VdfXa6//vpaqfDVr361Jjua2+fEQRIb2iMwI0899VTdPzVjJf92ViA0/v73v5fDDjusHHzwwXX/993vfre85S1vKd/5znfqiQN4MTrH20tf+tLyvve9r/zgBz+ovx9++OHlU5/6VPdtl1lmmfLEE0+U+eabr/u+wIsjpmWwiWcZaGJahpKYdviStG2xHBwee+yx3QeQjc72B+nHlMRGLrvgggvKl7/85fKyl72snHDCCeUb3/hGede73lWTGk1CDWZ2p98cUCVZmzGWMZQTAfHOd76z/PSnP63VjkcffXS5/PLL6wmDWH755WtFWjNWYVpuuumm8oY3vKE8+uij3WMl/+Yn+79LLrmk3HLLLfXyBRdcsO73fve735WNN964rLPOOuWggw4qyy23XLnmmmt6VETCzC6+0Iy35v832WSTctttt9V92Hvf+956YiotEbLvyxhbZZVVyl133VVvr9IWZp6YlqEgnmWwiGkZCmLakUFGpeWBxoorrlg22GCDHgeIOWDcZ5996uWppD3zzDPr5VtuuWUZM2ZMefnLX979GLvsskutiLzvvvuG6FUwJ0ryIuMtFbWZfp5ERsbchRdeWK//8Ic/XP70pz/Vfjmbbrpp2WyzzcrJJ59c7r777vLss8/WxEbTPgGm5bWvfW1Nwi6xxBLdswcmTpxYjjrqqPL2t7+9fPOb36yV3F/4whfqNJ9x48bV4GTZZZftfox111233H777d2JNJiRzgXF/vCHP9SZAtdee20dg6uttlo9EZBK7rR5yfjLCarzzz+/7hdz8mqppZbqfhxg5ohpGQriWQaLmJahIKYdGSRtW6iZcrn44ouXLbbYorz61a/u7tmYSp8TTzyxJi5yoLnyyiuXs846qxxzzDE1eZHfOxfnWWuttcqiiy5afv3rXw/Z62HOW7U0lY9f+9rXaiI2U88/+MEP1hMChxxySLn33ntrhe2SSy5Zfv7zn9cvi1133bVe9u1vf7v2u00/26WXXlovZaYab52tXeadd946jv761792zx5Im5ecEMjYO/fcc8vee+9de3OfdtppZdVVV63jLH1FG+94xzvqjIOMO+gt4613G4O02vjzn/9cZ6Psv//+5Yorrqj/fu9736v7uVTYZuxFFlVMy4SvfOUrZcKECbWncpOs1R4BZkxMy2AQzzLYxLQMNjHtyCVp28Idf+eU8ocffrj2cUzFWZPQSALj05/+dJ1W/N///d/lE5/4RPnxj39cp3PmsiwElemdjc0337xOM7YwFL0l+dD0qk3V7GOPPVb/P5WPqUD71re+VcdPKrZzYmCllVYqp59+er1NTihkXDX3yZicZ555elR2q0Sjcx+X8dAkZxupkE1i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",
      "text/plain": [
       "<Figure size 1400x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_plot_df = summary_df[summary_df['metric'] == 'accuracy']\n",
    "roc_plot_df = summary_df[summary_df['metric'] == 'roc_auc']\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n",
    "for ax, metric_df, title in [\n",
    "    (axes[0], accuracy_plot_df, 'Mean accuracy across repeated seeds'),\n",
    "    (axes[1], roc_plot_df, 'Mean ROC-AUC across repeated seeds'),\n",
    "]:\n",
    "    pairings = metric_df['pairing_type'].unique()\n",
    "    experiments = metric_df['experiment'].unique()\n",
    "    width = 0.8 / len(pairings)\n",
    "    x = np.arange(len(experiments))\n",
    "    for idx, pairing in enumerate(pairings):\n",
    "        subset = metric_df[metric_df['pairing_type'] == pairing].set_index('experiment').reindex(experiments)\n",
    "        ax.bar(x + (idx - (len(pairings)-1)/2)*width, subset['mean'], width=width, label=pairing)\n",
    "    ax.set_xticks(x, experiments)\n",
    "    ax.set_title(title)\n",
    "    ax.legend()\n",
    "    plt.setp(ax.get_xticklabels(), rotation=20, ha='right')\n",
    "fig.tight_layout()\n",
    "fig.savefig(FIGURES / 'fusion_experiment_comparison.png', dpi=300)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## Stability Table\n",
    "\n",
    "This pivot table exposes mean and standard deviation together. It is useful for discussing whether a result is consistent across seeds or sensitive to synthetic pairing choices.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "240950c1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-19T22:42:31.829053Z",
     "iopub.status.busy": "2026-04-19T22:42:31.828957Z",
     "iopub.status.idle": "2026-04-19T22:42:31.838822Z",
     "shell.execute_reply": "2026-04-19T22:42:31.838422Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"6\" halign=\"left\">mean</th>\n",
       "      <th colspan=\"6\" halign=\"left\">std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>metric</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>brier_score</th>\n",
       "      <th>f1_score</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>roc_auc</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>brier_score</th>\n",
       "      <th>f1_score</th>\n",
       "      <th>precision</th>\n",
       "      <th>recall</th>\n",
       "      <th>roc_auc</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pairing_type</th>\n",
       "      <th>experiment</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"4\" valign=\"top\">random</th>\n",
       "      <th>early_fusion</th>\n",
       "      <td>0.970175</td>\n",
       "      <td>0.022838</td>\n",
       "      <td>0.959143</td>\n",
       "      <td>0.971290</td>\n",
       "      <td>0.947619</td>\n",
       "      <td>0.994775</td>\n",
       "      <td>0.010002</td>\n",
       "      <td>0.009095</td>\n",
       "      <td>0.013240</td>\n",
       "      <td>0.025303</td>\n",
       "      <td>0.010648</td>\n",
       "      <td>0.004828</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>image_only</th>\n",
       "      <td>0.585965</td>\n",
       "      <td>0.262869</td>\n",
       "      <td>0.346602</td>\n",
       "      <td>0.411399</td>\n",
       "      <td>0.300000</td>\n",
       "      <td>0.492427</td>\n",
       "      <td>0.036905</td>\n",
       "      <td>0.017066</td>\n",
       "      <td>0.073730</td>\n",
       "      <td>0.076043</td>\n",
       "      <td>0.070630</td>\n",
       "      <td>0.057517</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>late_fusion</th>\n",
       "      <td>0.971930</td>\n",
       "      <td>0.079885</td>\n",
       "      <td>0.960488</td>\n",
       "      <td>0.995000</td>\n",
       "      <td>0.928571</td>\n",
       "      <td>0.990410</td>\n",
       "      <td>0.009609</td>\n",
       "      <td>0.006062</td>\n",
       "      <td>0.013813</td>\n",
       "      <td>0.011180</td>\n",
       "      <td>0.023810</td>\n",
       "      <td>0.005424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tabular_only</th>\n",
       "      <td>0.982456</td>\n",
       "      <td>0.016562</td>\n",
       "      <td>0.975727</td>\n",
       "      <td>0.995122</td>\n",
       "      <td>0.957143</td>\n",
       "      <td>0.995040</td>\n",
       "      <td>0.006203</td>\n",
       "      <td>0.005778</td>\n",
       "      <td>0.008521</td>\n",
       "      <td>0.010908</td>\n",
       "      <td>0.010648</td>\n",
       "      <td>0.005192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"4\" valign=\"top\">same_label</th>\n",
       "      <th>early_fusion</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.001411</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000826</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>image_only</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.001878</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.001485</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>late_fusion</th>\n",
       "      <td>0.998246</td>\n",
       "      <td>0.004930</td>\n",
       "      <td>0.997590</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.995238</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.003923</td>\n",
       "      <td>0.001582</td>\n",
       "      <td>0.005388</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010648</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tabular_only</th>\n",
       "      <td>0.982456</td>\n",
       "      <td>0.016562</td>\n",
       "      <td>0.975727</td>\n",
       "      <td>0.995122</td>\n",
       "      <td>0.957143</td>\n",
       "      <td>0.995040</td>\n",
       "      <td>0.006203</td>\n",
       "      <td>0.005778</td>\n",
       "      <td>0.008521</td>\n",
       "      <td>0.010908</td>\n",
       "      <td>0.010648</td>\n",
       "      <td>0.005192</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                               mean                                            \\\n",
       "metric                     accuracy brier_score  f1_score precision    recall   \n",
       "pairing_type experiment                                                         \n",
       "random       early_fusion  0.970175    0.022838  0.959143  0.971290  0.947619   \n",
       "             image_only    0.585965    0.262869  0.346602  0.411399  0.300000   \n",
       "             late_fusion   0.971930    0.079885  0.960488  0.995000  0.928571   \n",
       "             tabular_only  0.982456    0.016562  0.975727  0.995122  0.957143   \n",
       "same_label   early_fusion  1.000000    0.001411  1.000000  1.000000  1.000000   \n",
       "             image_only    1.000000    0.001878  1.000000  1.000000  1.000000   \n",
       "             late_fusion   0.998246    0.004930  0.997590  1.000000  0.995238   \n",
       "             tabular_only  0.982456    0.016562  0.975727  0.995122  0.957143   \n",
       "\n",
       "                                          std                                  \\\n",
       "metric                      roc_auc  accuracy brier_score  f1_score precision   \n",
       "pairing_type experiment                                                         \n",
       "random       early_fusion  0.994775  0.010002    0.009095  0.013240  0.025303   \n",
       "             image_only    0.492427  0.036905    0.017066  0.073730  0.076043   \n",
       "             late_fusion   0.990410  0.009609    0.006062  0.013813  0.011180   \n",
       "             tabular_only  0.995040  0.006203    0.005778  0.008521  0.010908   \n",
       "same_label   early_fusion  1.000000  0.000000    0.000826  0.000000  0.000000   \n",
       "             image_only    1.000000  0.000000    0.001485  0.000000  0.000000   \n",
       "             late_fusion   1.000000  0.003923    0.001582  0.005388  0.000000   \n",
       "             tabular_only  0.995040  0.006203    0.005778  0.008521  0.010908   \n",
       "\n",
       "                                               \n",
       "metric                       recall   roc_auc  \n",
       "pairing_type experiment                        \n",
       "random       early_fusion  0.010648  0.004828  \n",
       "             image_only    0.070630  0.057517  \n",
       "             late_fusion   0.023810  0.005424  \n",
       "             tabular_only  0.010648  0.005192  \n",
       "same_label   early_fusion  0.000000  0.000000  \n",
       "             image_only    0.000000  0.000000  \n",
       "             late_fusion   0.010648  0.000000  \n",
       "             tabular_only  0.010648  0.005192  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stability_view = summary_df.pivot_table(index=['pairing_type', 'experiment'], columns='metric', values=['mean', 'std'])\n",
    "stability_view\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "699c3508",
   "metadata": {},
   "source": [
    "## What the numbers actually say\n",
    "\n",
    "The same-label pairing scored high enough to make me suspicious, which is exactly why I kept the random control in place. Once the label alignment is broken, the fusion numbers drop sharply. For me that is the clearest result in the whole synthetic study. Most of what looks like a multimodal gain here is really coming from the pairing rule, not from the model discovering anything especially deep across modalities. That is a stronger and more interesting conclusion than pretending the setup proved a real multimodal advantage.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "codex_research_commentary": true
   },
   "source": [
    "## How This Notebook Supports The Dissertation\n",
    "\n",
    "This notebook supplies the evidence for the exploratory fusion branch. Its results should be discussed as method-comparison evidence under synthetic constraints, not as proof of clinical multimodal performance.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (dissertation_dl)",
   "language": "python",
   "name": "dissertation_dl"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
