{"cells":[{"cell_type":"markdown","id":"11a71a20","metadata":{"id":"11a71a20"},"source":["# LogMiniLM — Lightweight Semantic Transformer for BGL Log Anomaly Detection\n","\n","This notebook implements the renamed final model **LogMiniLM**.\n","\n","**Reproducibility-fixed version:** this notebook locks random seeds, uses deterministic DataLoader settings, disables AMP by default, and saves results under the corrected `logminilm_cache` folder. The model replaces the previous name and uses a lightweight semantic-Transformer pipeline for BGL log anomaly detection.\n","\n","## Main idea\n","\n","LogMiniLM combines:\n","\n","1. **Metadata-reduced log text** as model input.\n","2. **MiniLM semantic embeddings** for normalized log messages.\n","3. **Unique-message encoding** to avoid embedding repeated messages many times.\n","4. **Cached MiniLM embeddings** to reduce repeated compute.\n","5. **384 → 128 projection** to reduce the Transformer input size.\n","6. **Compact Transformer encoder** for sequence-level anomaly detection.\n","7. **Fixed 10-line windows with step size 10**.\n","8. **Temporal 80/20 split** for realistic future-log evaluation.\n","\n","## Confirmed final setting\n","\n","| Item | Setting |\n","|---|---|\n","| Model name | LogMiniLM |\n","| Dataset | BGL |\n","| Window size | 10 |\n","| Step size | 10 |\n","| Split | Temporal 80/20 |\n","| MiniLM model | all-MiniLM-L6-v2 |\n","| Projection dimension | 128 |\n","| Transformer layers | 1 |\n","| Attention heads | 2 |\n","| Feedforward dimension | 256 |\n","\n","## Expected thesis role\n","\n","LogMiniLM is the **final proposed detection model** before the XAI stage.\n"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"4OnEPHIYCtQR","executionInfo":{"status":"ok","timestamp":1783280634583,"user_tz":-180,"elapsed":17106,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"outputId":"fd708a2d-d45d-498e-a166-5bf392180f76"},"id":"4OnEPHIYCtQR","execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}]},{"cell_type":"markdown","id":"f3c44739","metadata":{"id":"f3c44739"},"source":["## Step 0 — Install and import libraries\n","\n","This step installs and imports the required libraries.\n","\n","### Input\n","No dataset is processed yet.\n","\n","### Output\n","Python libraries become available for parsing logs, generating MiniLM embeddings, training the Transformer model, and evaluating binary anomaly detection.\n"]},{"cell_type":"code","execution_count":2,"id":"3be1bd91","metadata":{"id":"3be1bd91","executionInfo":{"status":"ok","timestamp":1783280638478,"user_tz":-180,"elapsed":3891,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}}},"outputs":[],"source":["!pip -q install sentence-transformers\n"]},{"cell_type":"code","execution_count":3,"id":"0f5a72c4","metadata":{"id":"0f5a72c4","executionInfo":{"status":"ok","timestamp":1783280675901,"user_tz":-180,"elapsed":37418,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}}},"outputs":[],"source":["import os\n","\n","# =========================\n","# Reproducibility environment variables\n","# =========================\n","# These must be set before CUDA operations. In Colab, run cells from the top after a runtime restart.\n","os.environ[\"PYTHONHASHSEED\"] = \"42\"\n","os.environ[\"CUBLAS_WORKSPACE_CONFIG\"] = \":4096:8\"\n","\n","import re\n","import gc\n","import random\n","from pathlib import Path\n","from collections import Counter\n","\n","import numpy as np\n","import pandas as pd\n","\n","import torch\n","import torch.nn as nn\n","from torch.utils.data import Dataset, DataLoader\n","\n","from sentence_transformers import SentenceTransformer\n","from sklearn.metrics import (\n","    accuracy_score,\n","    precision_score,\n","    recall_score,\n","    f1_score,\n","    confusion_matrix,\n","    classification_report,\n",")\n"]},{"cell_type":"markdown","id":"80d8eb30","metadata":{"id":"80d8eb30"},"source":["## Step 1 — Configuration\n","\n","All important experiment parameters are collected in one place.\n","\n","### Important code behavior\n","\n","- `WINDOW_SIZE = 10`: every 10 consecutive logs become one sequence.\n","- `STEP_SIZE = 10`: the next sequence starts after 10 logs, so there is no overlap.\n","- `TRAIN_RATIO = 0.80`: the first 80% of sequences are used for training and the final 20% for testing.\n","- `PROJECTION_DIM = 128`: MiniLM embeddings are reduced from 384 dimensions to 128 before the Transformer.\n","\n","### Example\n","\n","If the first 30 logs are available:\n","\n","```text\n","Sequence 1 = logs 0–9\n","Sequence 2 = logs 10–19\n","Sequence 3 = logs 20–29\n","```\n"]},{"cell_type":"code","execution_count":4,"id":"677f407f","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"677f407f","executionInfo":{"status":"ok","timestamp":1783280676285,"user_tz":-180,"elapsed":404,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"outputId":"dcf1e504-3898-4fe9-8e87-4c6d2cb85cb2"},"outputs":[{"output_type":"stream","name":"stdout","text":["Device: cuda\n","GPU: Tesla T4\n","Seed: 42\n","AMP enabled: False\n","Cache directory: /content/drive/MyDrive/logminilm_cache\n"]}],"source":["# =========================\n","# Reproducibility\n","# =========================\n","SEED = 42\n","\n","def reset_all_seeds(seed=SEED):\n","    \"\"\"Reset Python, NumPy, and PyTorch seeds.\"\"\"\n","    random.seed(seed)\n","    np.random.seed(seed)\n","    torch.manual_seed(seed)\n","    if torch.cuda.is_available():\n","        torch.cuda.manual_seed(seed)\n","        torch.cuda.manual_seed_all(seed)\n","\n","reset_all_seeds(SEED)\n","\n","torch.backends.cudnn.deterministic = True\n","torch.backends.cudnn.benchmark = False\n","\n","# Disable TF32 to reduce small GPU numerical differences.\n","if torch.cuda.is_available():\n","    torch.backends.cuda.matmul.allow_tf32 = False\n","    torch.backends.cudnn.allow_tf32 = False\n","\n","# warn_only=True avoids crashing if a Colab/PyTorch operation has no fully deterministic implementation.\n","torch.use_deterministic_algorithms(True, warn_only=True)\n","\n","# =========================\n","# Dataset path\n","# =========================\n","# Update this path if your BGL.log file is inside a subfolder.\n","BGL_PATH = \"/content/drive/MyDrive/bgl_data/BGL.log\"\n","\n","# Set to None for the full BGL dataset.\n","# For quick testing only, use a number such as 100000.\n","MAX_LINES = None\n","\n","# =========================\n","# Sequence construction\n","# =========================\n","WINDOW_SIZE = 10\n","STEP_SIZE = 10\n","TRAIN_RATIO = 0.80\n","\n","# =========================\n","# MiniLM semantic encoder\n","# =========================\n","MINILM_MODEL_NAME = \"sentence-transformers/all-MiniLM-L6-v2\"\n","ENCODE_BATCH_SIZE = 256\n","\n","# =========================\n","# LogMiniLM model settings\n","# =========================\n","PROJECTION_DIM = 128\n","NUM_TRANSFORMER_LAYERS = 1\n","NUM_ATTENTION_HEADS = 2\n","FEEDFORWARD_DIM = 256\n","DROPOUT = 0.1\n","\n","# =========================\n","# Training settings\n","# =========================\n","BATCH_SIZE = 256\n","EPOCHS = 10\n","LEARNING_RATE = 1e-3\n","ANOMALY_WEIGHT_MULTIPLIER = 2.0\n","\n","# Keep AMP disabled for the final thesis run because mixed precision can create small GPU-to-GPU differences.\n","USE_AMP = False\n","\n","# =========================\n","# Cache/output paths\n","# =========================\n","# Correct lowercase spelling: logminilm = LogMiniLM.\n","CACHE_DIR = Path(\"/content/drive/MyDrive/logminilm_cache\")\n","CACHE_DIR.mkdir(parents=True, exist_ok=True)\n","\n","UNIQUE_TEXTS_PATH = CACHE_DIR / \"bgl_unique_normalized_messages.csv\"\n","EMBEDDINGS_PATH = CACHE_DIR / \"bgl_minilm_unique_embeddings.npy\"\n","EVENT_ID_PATH = CACHE_DIR / \"bgl_line_event_ids.npy\"\n","LABELS_PATH = CACHE_DIR / \"bgl_line_labels.npy\"\n","METADATA_PATH = CACHE_DIR / \"bgl_metadata_for_alerts_light.parquet\"\n","\n","RESULTS_PATH = CACHE_DIR / \"logminilm_results.csv\"\n","PREDICTIONS_PATH = CACHE_DIR / \"logminilm_predictions_for_xai.csv\"\n","TOP_XAI_CANDIDATES_PATH = CACHE_DIR / \"logminilm_top_xai_candidates.csv\"\n","MODEL_PATH = CACHE_DIR / \"logminilm_model.pt\"\n","\n","# =========================\n","# Device\n","# =========================\n","device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n","print(\"Device:\", device)\n","if torch.cuda.is_available():\n","    print(\"GPU:\", torch.cuda.get_device_name(0))\n","print(\"Seed:\", SEED)\n","print(\"AMP enabled:\", USE_AMP)\n","print(\"Cache directory:\", CACHE_DIR)\n"]},{"cell_type":"markdown","id":"965b191e","metadata":{"id":"965b191e"},"source":["### Reproducibility note\n","\n","output folder name:\n","\n","```text\n","/content/drive/MyDrive/logminilm_cache\n","```\n","\n","If you previously used `/content/drive/MyDrive/logminiml_cache`, this notebook will create a new corrected cache folder and may regenerate embeddings the first time.\n"]},{"cell_type":"code","execution_count":5,"id":"39fa64e5","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"39fa64e5","executionInfo":{"status":"ok","timestamp":1783280676293,"user_tz":-180,"elapsed":7,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"outputId":"9e61c2eb-ac9a-44f7-e597-c8bf4c5c29d6"},"outputs":[{"output_type":"stream","name":"stdout","text":["Confirmed sequence setting: window_size=10, step_size=10\n"]}],"source":["# Safety check: this notebook is fixed to 10-line non-overlapping windows.\n","assert WINDOW_SIZE == 10, f\"Expected WINDOW_SIZE=10, got {WINDOW_SIZE}\"\n","assert STEP_SIZE == 10, f\"Expected STEP_SIZE=10, got {STEP_SIZE}\"\n","print(f\"Confirmed sequence setting: window_size={WINDOW_SIZE}, step_size={STEP_SIZE}\")\n"]},{"cell_type":"markdown","id":"4feb2365","metadata":{"id":"4feb2365"},"source":["## Step 2 — Mount Google Drive and verify the dataset\n","\n","The notebook expects `BGL.log` in Google Drive. This cell safely mounts Drive only if needed.\n","\n","### Input\n","Expected dataset path:\n","\n","```text\n","/content/drive/MyDrive/bgl_data/BGL.log\n","```\n","\n","### Output\n","A confirmation that the file exists.\n","\n","### Common issue\n","If the file is in a folder, update `BGL_PATH`, for example:\n","\n","```python\n","BGL_PATH = \"/content/drive/MyDrive/bgl_data/BGL.log\"\n","```\n"]},{"cell_type":"code","execution_count":6,"id":"d3e6243e","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"d3e6243e","executionInfo":{"status":"ok","timestamp":1783280676486,"user_tz":-180,"elapsed":192,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"outputId":"f3f586a0-a3c0-444d-8524-e6cb73f6af29"},"outputs":[{"output_type":"stream","name":"stdout","text":["Google Drive is already mounted.\n","BGL file exists: True\n"]}],"source":["from google.colab import drive\n","\n","# Safe Drive mount: avoids failing when Drive is already mounted.\n","if not os.path.exists(\"/content/drive/MyDrive\"):\n","    drive.mount(\"/content/drive\")\n","else:\n","    print(\"Google Drive is already mounted.\")\n","\n","print(\"BGL file exists:\", os.path.exists(BGL_PATH))\n","if not os.path.exists(BGL_PATH):\n","    raise FileNotFoundError(\n","        f\"BGL file not found at: {BGL_PATH}\\n\"\n","        \"Update BGL_PATH to the real location of BGL.log in your Drive.\"\n","    )\n"]},{"cell_type":"markdown","id":"4d598c60","metadata":{"id":"4d598c60"},"source":["## Step 3 — Parse BGL raw logs\n","\n","Each BGL log line contains a label and several metadata fields.\n","\n","### BGL label rule\n","\n","```text\n","- = Normal\n","Any other label = Anomaly\n","```\n","\n","### Example raw line\n","\n","```text\n","- 1117838570 2005.06.03 R02-M1-N0-C:J12-U11 2005-06-03-15.42.50.675872 R02-M1-N0-C:J12-U11 RAS KERNEL INFO instruction cache parity error corrected\n","```\n","\n","### Parsed output example\n","\n","| Field | Example |\n","|---|---|\n","| label | 0 |\n","| source | RAS |\n","| component | KERNEL |\n","| severity | INFO |\n","| event_message | instruction cache parity error corrected |\n","\n","The model will not use timestamp or node directly as input, but these fields are preserved for alert reporting and XAI.\n"]},{"cell_type":"code","execution_count":7,"id":"682151e3","metadata":{"id":"682151e3","colab":{"base_uri":"https://localhost:8080/","height":230},"executionInfo":{"status":"ok","timestamp":1783280720719,"user_tz":-180,"elapsed":44213,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"outputId":"1c36d968-2f2b-41b2-8025-64ce57d2c292"},"outputs":[{"output_type":"stream","name":"stdout","text":["Parsed rows: 4713493\n","Line label distribution: Counter({0: 4365033, 1: 348460})\n"]},{"output_type":"display_data","data":{"text/plain":["   line_index raw_label  label unix_timestamp        date  \\\n","0           0         -      0     1117838570  2005.06.03   \n","1           1         -      0     1117838570  2005.06.03   \n","2           2         -      0     1117838570  2005.06.03   \n","\n","                  node                   full_time        repeated_node  \\\n","0  R02-M1-N0-C:J12-U11  2005-06-03-15.42.50.363779  R02-M1-N0-C:J12-U11   \n","1  R02-M1-N0-C:J12-U11  2005-06-03-15.42.50.527847  R02-M1-N0-C:J12-U11   \n","2  R02-M1-N0-C:J12-U11  2005-06-03-15.42.50.675872  R02-M1-N0-C:J12-U11   \n","\n","  source component severity                             event_message  \n","0    RAS    KERNEL     INFO  instruction cache parity error corrected  \n","1    RAS    KERNEL     INFO  instruction cache parity error corrected  \n","2    RAS    KERNEL     INFO  instruction cache parity error corrected  "],"text/html":["\n","  <div id=\"df-c53a7350-612f-4d77-a333-7385a74f40a6\" class=\"colab-df-container\">\n","    <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>line_index</th>\n","      <th>raw_label</th>\n","      <th>label</th>\n","      <th>unix_timestamp</th>\n","      <th>date</th>\n","      <th>node</th>\n","      <th>full_time</th>\n","      <th>repeated_node</th>\n","      <th>source</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>0</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>1117838570</td>\n","      <td>2005.06.03</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>2005-06-03-15.42.50.363779</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>1</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>1117838570</td>\n","      <td>2005.06.03</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>2005-06-03-15.42.50.527847</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>2</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>1117838570</td>\n","      <td>2005.06.03</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>2005-06-03-15.42.50.675872</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-c53a7350-612f-4d77-a333-7385a74f40a6')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-c53a7350-612f-4d77-a333-7385a74f40a6 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-c53a7350-612f-4d77-a333-7385a74f40a6');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(df\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"line_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 2,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0,\n          1,\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"unix_timestamp\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"1117838570\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"date\",\n      \"properties\": {\n        \"dtype\": \"object\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"2005.06.03\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"R02-M1-N0-C:J12-U11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"2005-06-03-15.42.50.363779\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"repeated_node\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"R02-M1-N0-C:J12-U11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"source\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"RAS\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"KERNEL\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"instruction cache parity error corrected\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["def parse_bgl_line(line, line_index):\n","    '''Parse one BGL raw log line into structured fields.\n","\n","    Expected BGL layout:\n","    label unix_timestamp date node full_time repeated_node source component severity message...\n","    '''\n","    parts = line.strip().split()\n","    if len(parts) < 10:\n","        return None\n","\n","    raw_label = parts[0]\n","    label = 0 if raw_label == \"-\" else 1\n","\n","    return {\n","        \"line_index\": line_index,\n","        \"raw_label\": raw_label,\n","        \"label\": label,\n","        \"unix_timestamp\": parts[1],\n","        \"date\": parts[2],\n","        \"node\": parts[3],\n","        \"full_time\": parts[4],\n","        \"repeated_node\": parts[5],\n","        \"source\": parts[6],\n","        \"component\": parts[7],\n","        \"severity\": parts[8],\n","        \"event_message\": \" \".join(parts[9:]),\n","    }\n","\n","records = []\n","with open(BGL_PATH, \"r\", errors=\"ignore\") as f:\n","    for i, line in enumerate(f):\n","        if MAX_LINES is not None and i >= MAX_LINES:\n","            break\n","        parsed = parse_bgl_line(line, i)\n","        if parsed is not None:\n","            records.append(parsed)\n","\n","df = pd.DataFrame(records)\n","\n","print(\"Parsed rows:\", len(df))\n","print(\"Line label distribution:\", Counter(df[\"label\"]))\n","display(df.head(3))\n"]},{"cell_type":"markdown","id":"38aaa3d8","metadata":{"id":"38aaa3d8"},"source":["## Step 4 — Build metadata-reduced model input and normalize it\n","\n","The model input is built from event-related fields only:\n","\n","```text\n","source + component + severity + event_message\n","```\n","\n","This excludes direct shortcut fields such as `date`, `full_time`, and `node`.\n","\n","### Normalization examples\n","\n","| Before | After |\n","|---|---|\n","| `RAS KERNEL INFO CE sym 2, at 0x0b85eee0, mask 0x05` | `ras kernel info ce sym <num> at <hex> mask <hex>` |\n","| `socket to 172.16.96.116:33569` | `socket to <ip> <num>` |\n","\n","### Why normalize?\n","\n","Normalization reduces memorization of unique values such as addresses, IDs, timestamps, and random numbers.\n"]},{"cell_type":"code","execution_count":8,"id":"64537460","metadata":{"id":"64537460","executionInfo":{"status":"ok","timestamp":1783280816034,"user_tz":-180,"elapsed":95311,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":327},"outputId":"860e4b3d-19ac-4285-cc3a-41533fd7fd09"},"outputs":[{"output_type":"stream","name":"stdout","text":["Example from the dataset\n","Before: RAS KERNEL INFO instruction cache parity error corrected\n","After : ras kernel info instruction cache parity error corrected\n","\n","Synthetic normalization example\n","Before: RAS KERNEL INFO CE sym 2, at 0x0b85eee0, mask 0x05 socket to 172.16.96.116:33569\n","After : ras kernel info ce sym <num> at <hex> mask <hex> socket to <ip> <num>\n"]},{"output_type":"display_data","data":{"text/plain":["   label source component severity                             event_message  \\\n","0      0    RAS    KERNEL     INFO  instruction cache parity error corrected   \n","1      0    RAS    KERNEL     INFO  instruction cache parity error corrected   \n","2      0    RAS    KERNEL     INFO  instruction cache parity error corrected   \n","3      0    RAS    KERNEL     INFO  instruction cache parity error corrected   \n","4      0    RAS    KERNEL     INFO  instruction cache parity error corrected   \n","\n","                                     model_text_norm  \n","0  ras kernel info instruction cache parity error...  \n","1  ras kernel info instruction cache parity error...  \n","2  ras kernel info instruction cache parity error...  \n","3  ras kernel info instruction cache parity error...  \n","4  ras kernel info instruction cache parity error...  "],"text/html":["\n","  <div id=\"df-7583d939-7e08-48ce-80cd-e0fa0c0c6f62\" class=\"colab-df-container\">\n","    <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>label</th>\n","      <th>source</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","      <th>model_text_norm</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>0</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>0</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>0</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>0</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>0</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-7583d939-7e08-48ce-80cd-e0fa0c0c6f62')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-7583d939-7e08-48ce-80cd-e0fa0c0c6f62 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-7583d939-7e08-48ce-80cd-e0fa0c0c6f62');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(df[[\\\"label\\\", \\\"source\\\", \\\"component\\\", \\\"severity\\\", \\\"event_message\\\", \\\"model_text_norm\\\"]]\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"source\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"RAS\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"KERNEL\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"instruction cache parity error corrected\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"model_text_norm\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"ras kernel info instruction cache parity error corrected\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["def normalize_log_text(text):\n","    '''Normalize a log text string while preserving the semantic meaning.\n","\n","    The goal is to replace variable values with general placeholders so the\n","    model focuses on event meaning rather than memorizing IDs or numbers.\n","    '''\n","    text = str(text).lower()\n","\n","    # Replace IP addresses before replacing generic numbers.\n","    text = re.sub(r\"\\b\\d{1,3}(?:\\.\\d{1,3}){3}\\b\", \" <ip> \", text)\n","\n","    # Replace dates/times if they appear inside the message text.\n","    text = re.sub(r\"\\b\\d{4}[.-]\\d{2}[.-]\\d{2}\\b\", \" <date> \", text)\n","    text = re.sub(r\"\\b\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?\\b\", \" <time> \", text)\n","\n","    # Replace hexadecimal values such as 0x00004ed8.\n","    text = re.sub(r\"0x[0-9a-fA-F]+\", \" <hex> \", text)\n","\n","    # Replace BGL-like node IDs if they appear inside message text.\n","    text = re.sub(r\"r\\d{2}-m\\d-n[a-f0-9]-[ci]:j\\d{2}-u\\d{2}\", \" <node> \", text)\n","\n","    # Replace standalone numbers.\n","    text = re.sub(r\"\\b\\d+\\b\", \" <num> \", text)\n","\n","    # Clean punctuation spacing while keeping placeholder tokens such as <hex>.\n","    text = re.sub(r\"[^a-zA-Z0-9_<>]+\", \" \", text)\n","    text = re.sub(r\"\\s+\", \" \", text).strip()\n","    return text\n","\n","# Build model input text without timestamp/node shortcut fields.\n","df[\"model_text\"] = (\n","    df[\"source\"].astype(str) + \" \" +\n","    df[\"component\"].astype(str) + \" \" +\n","    df[\"severity\"].astype(str) + \" \" +\n","    df[\"event_message\"].astype(str)\n",")\n","\n","df[\"model_text_norm\"] = df[\"model_text\"].apply(normalize_log_text)\n","\n","print(\"Example from the dataset\")\n","print(\"Before:\", df.loc[0, \"model_text\"])\n","print(\"After :\", df.loc[0, \"model_text_norm\"])\n","\n","print(\"\\nSynthetic normalization example\")\n","sample_text = \"RAS KERNEL INFO CE sym 2, at 0x0b85eee0, mask 0x05 socket to 172.16.96.116:33569\"\n","print(\"Before:\", sample_text)\n","print(\"After :\", normalize_log_text(sample_text))\n","\n","display(df[[\"label\", \"source\", \"component\", \"severity\", \"event_message\", \"model_text_norm\"]].head(5))\n"]},{"cell_type":"markdown","id":"2df7fb78","metadata":{"id":"2df7fb78"},"source":["## Step 5 — Encode only unique normalized messages\n","\n","This is the main efficiency improvement in LogMiniLM.\n","\n","Instead of encoding every log line with MiniLM, the notebook encodes only the unique normalized messages.\n","\n","### Example\n","\n","If the same normalized message appears 10,000 times:\n","\n","```text\n","ras kernel info instruction cache parity error corrected\n","```\n","\n","MiniLM encodes it once, and all repeated lines reuse the same `event_id`.\n","\n","### Output\n","\n","- `unique_texts`: list of unique normalized messages.\n","- `line_event_ids`: for each log line, an integer pointing to its unique message.\n","- `line_labels`: normal/anomaly label for each line.\n"]},{"cell_type":"code","execution_count":9,"id":"70c1bb8e","metadata":{"id":"70c1bb8e","executionInfo":{"status":"ok","timestamp":1783280831317,"user_tz":-180,"elapsed":15255,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"22d3ef58-b482-4fce-a99f-5cb706d6db4a"},"outputs":[{"output_type":"stream","name":"stdout","text":["Total log lines: 4713493\n","Unique normalized messages: 47012\n","Reduction ratio: 100.26 log lines per unique message\n","\n","Example mapping\n","Normalized text: ras kernel info instruction cache parity error corrected\n","Event ID: 45962\n","\n","Saved unique texts: /content/drive/MyDrive/logminilm_cache/bgl_unique_normalized_messages.csv\n","Saved line event IDs: /content/drive/MyDrive/logminilm_cache/bgl_line_event_ids.npy\n","Saved lightweight metadata: /content/drive/MyDrive/logminilm_cache/bgl_metadata_for_alerts_light.parquet\n"]}],"source":["unique_texts = pd.Series(df[\"model_text_norm\"].unique()).sort_values().reset_index(drop=True)\n","text_to_event_id = {text: idx for idx, text in enumerate(unique_texts)}\n","\n","line_event_ids = df[\"model_text_norm\"].map(text_to_event_id).astype(np.int32).values\n","line_labels = df[\"label\"].astype(np.int8).values\n","\n","print(\"Total log lines:\", len(df))\n","print(\"Unique normalized messages:\", len(unique_texts))\n","print(\"Reduction ratio:\", round(len(df) / max(len(unique_texts), 1), 2), \"log lines per unique message\")\n","\n","example_idx = 0\n","print(\"\\nExample mapping\")\n","print(\"Normalized text:\", df.loc[example_idx, \"model_text_norm\"])\n","print(\"Event ID:\", int(line_event_ids[example_idx]))\n","\n","# Save reusable mapping outputs.\n","unique_texts.to_frame(name=\"model_text_norm\").to_csv(UNIQUE_TEXTS_PATH, index=False)\n","np.save(EVENT_ID_PATH, line_event_ids)\n","np.save(LABELS_PATH, line_labels)\n","\n","# Save lightweight metadata for later XAI and alert reporting.\n","# raw_log is intentionally excluded to reduce memory/storage usage.\n","metadata_cols = [\n","    \"line_index\", \"raw_label\", \"label\", \"date\", \"full_time\", \"node\",\n","    \"source\", \"component\", \"severity\", \"event_message\", \"model_text_norm\"\n","]\n","df[metadata_cols].to_parquet(METADATA_PATH, index=False)\n","\n","print(\"\\nSaved unique texts:\", UNIQUE_TEXTS_PATH)\n","print(\"Saved line event IDs:\", EVENT_ID_PATH)\n","print(\"Saved lightweight metadata:\", METADATA_PATH)\n"]},{"cell_type":"markdown","id":"cd2f9bdb","metadata":{"id":"cd2f9bdb"},"source":["## Step 6 — Generate or load cached MiniLM embeddings\n","\n","MiniLM converts each unique normalized message into a semantic vector.\n","\n","### Input\n","\n","```text\n","unique_texts = [message_1, message_2, ..., message_N]\n","```\n","\n","### Output\n","\n","```text\n","unique_embeddings shape = [number_of_unique_messages, 384]\n","```\n","\n","### Example\n","\n","If `event_id = 25`, then line 25 does not store text directly during training. Instead, it points to:\n","\n","```python\n","unique_embeddings[25]\n","```\n","\n","which is a MiniLM semantic vector.\n"]},{"cell_type":"code","execution_count":10,"id":"d370c48c","metadata":{"id":"d370c48c","executionInfo":{"status":"ok","timestamp":1783280834972,"user_tz":-180,"elapsed":3654,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"c920a5ae-04c2-4fdb-8859-d47971e6874d"},"outputs":[{"output_type":"stream","name":"stdout","text":["Loading valid cached embeddings from: /content/drive/MyDrive/logminilm_cache/bgl_minilm_unique_embeddings.npy\n","Unique embeddings shape: (47012, 384)\n","Embedding dtype: float32\n","First embedding first 5 values: [ 0.00211342  0.009814   -0.09476357 -0.0665199   0.03991342]\n"]}],"source":["def load_or_create_minilm_embeddings(unique_texts, embeddings_path):\n","    '''Load cached MiniLM embeddings if valid; otherwise encode and save them.'''\n","    if embeddings_path.exists():\n","        cached = np.load(embeddings_path).astype(np.float32)\n","        if cached.shape[0] == len(unique_texts):\n","            print(\"Loading valid cached embeddings from:\", embeddings_path)\n","            return cached\n","        else:\n","            print(\"Cached embeddings exist but do not match current unique_texts.\")\n","            print(\"Cached rows:\", cached.shape[0], \"Current unique messages:\", len(unique_texts))\n","            print(\"Recomputing embeddings...\")\n","\n","    print(\"Encoding unique normalized messages with MiniLM...\")\n","    encoder = SentenceTransformer(MINILM_MODEL_NAME, device=str(device))\n","    embeddings = encoder.encode(\n","        unique_texts.tolist(),\n","        batch_size=ENCODE_BATCH_SIZE,\n","        show_progress_bar=True,\n","        convert_to_numpy=True,\n","        normalize_embeddings=False,\n","    ).astype(np.float32)\n","\n","    np.save(embeddings_path, embeddings)\n","    print(\"Saved embeddings to:\", embeddings_path)\n","\n","    # Free the encoder model after embedding generation to reduce GPU/RAM use.\n","    del encoder\n","    gc.collect()\n","    if torch.cuda.is_available():\n","        torch.cuda.empty_cache()\n","\n","    return embeddings\n","\n","unique_embeddings = load_or_create_minilm_embeddings(unique_texts, EMBEDDINGS_PATH)\n","\n","print(\"Unique embeddings shape:\", unique_embeddings.shape)\n","print(\"Embedding dtype:\", unique_embeddings.dtype)\n","print(\"First embedding first 5 values:\", unique_embeddings[0, :5])\n"]},{"cell_type":"markdown","id":"41034541","metadata":{"id":"41034541"},"source":["## Step 7 — Build fixed 10-line sequences\n","\n","Each sequence contains 10 consecutive log events.\n","\n","### Sequence label rule\n","\n","```text\n","If any log line inside the sequence is anomalous → sequence label = 1\n","Otherwise → sequence label = 0\n","```\n","\n","### Example\n","\n","```text\n","Line labels: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]\n","Sequence label = 1\n","```\n","\n","because at least one event is anomalous.\n"]},{"cell_type":"code","execution_count":11,"id":"92d69a49","metadata":{"id":"92d69a49","executionInfo":{"status":"ok","timestamp":1783280838182,"user_tz":-180,"elapsed":3184,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":501},"outputId":"82a80070-d033-4cbc-f1d6-7c1a8ded7223"},"outputs":[{"output_type":"stream","name":"stdout","text":["X_ids shape: (471349, 10)\n","y_seq shape: (471349,)\n","Sequence label distribution: Counter({np.int8(0): 432326, np.int8(1): 39023})\n","\n","Example sequence\n","Event IDs: [45962 45962 45962 45962 45962 45962 45962 45962 45962 45962]\n","Sequence label: 0\n","Line range: [0 9]\n"]},{"output_type":"display_data","data":{"text/plain":["   line_index  label                   full_time                 node  \\\n","0           0      0  2005-06-03-15.42.50.363779  R02-M1-N0-C:J12-U11   \n","1           1      0  2005-06-03-15.42.50.527847  R02-M1-N0-C:J12-U11   \n","2           2      0  2005-06-03-15.42.50.675872  R02-M1-N0-C:J12-U11   \n","3           3      0  2005-06-03-15.42.50.823719  R02-M1-N0-C:J12-U11   \n","4           4      0  2005-06-03-15.42.50.982731  R02-M1-N0-C:J12-U11   \n","5           5      0  2005-06-03-15.42.51.131467  R02-M1-N0-C:J12-U11   \n","6           6      0  2005-06-03-15.42.51.293532  R02-M1-N0-C:J12-U11   \n","7           7      0  2005-06-03-15.42.51.428563  R02-M1-N0-C:J12-U11   \n","8           8      0  2005-06-03-15.42.51.601412  R02-M1-N0-C:J12-U11   \n","9           9      0  2005-06-03-15.42.51.749199  R02-M1-N0-C:J12-U11   \n","\n","  severity                             event_message  \\\n","0     INFO  instruction cache parity error corrected   \n","1     INFO  instruction cache parity error corrected   \n","2     INFO  instruction cache parity error corrected   \n","3     INFO  instruction cache parity error corrected   \n","4     INFO  instruction cache parity error corrected   \n","5     INFO  instruction cache parity error corrected   \n","6     INFO  instruction cache parity error corrected   \n","7     INFO  instruction cache parity error corrected   \n","8     INFO  instruction cache parity error corrected   \n","9     INFO  instruction cache parity error corrected   \n","\n","                                     model_text_norm  \n","0  ras kernel info instruction cache parity error...  \n","1  ras kernel info instruction cache parity error...  \n","2  ras kernel info instruction cache parity error...  \n","3  ras kernel info instruction cache parity error...  \n","4  ras kernel info instruction cache parity error...  \n","5  ras kernel info instruction cache parity error...  \n","6  ras kernel info instruction cache parity error...  \n","7  ras kernel info instruction cache parity error...  \n","8  ras kernel info instruction cache parity error...  \n","9  ras kernel info instruction cache parity error...  "],"text/html":["\n","  <div id=\"df-34229f8f-fa9f-45fa-a008-67b61daa9427\" class=\"colab-df-container\">\n","    <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>line_index</th>\n","      <th>label</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","      <th>model_text_norm</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.50.363779</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>1</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.50.527847</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>2</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.50.675872</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>3</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.50.823719</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>4</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.50.982731</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>5</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.51.131467</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>6</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.51.293532</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>7</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.51.428563</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>8</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.51.601412</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>9</td>\n","      <td>0</td>\n","      <td>2005-06-03-15.42.51.749199</td>\n","      <td>R02-M1-N0-C:J12-U11</td>\n","      <td>INFO</td>\n","      <td>instruction cache parity error corrected</td>\n","      <td>ras kernel info instruction cache parity error...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-34229f8f-fa9f-45fa-a008-67b61daa9427')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-34229f8f-fa9f-45fa-a008-67b61daa9427 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-34229f8f-fa9f-45fa-a008-67b61daa9427');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"]])\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"line_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 0,\n        \"max\": 9,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          8,\n          1,\n          5\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"2005-06-03-15.42.51.601412\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"R02-M1-N0-C:J12-U11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"instruction cache parity error corrected\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"model_text_norm\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"ras kernel info instruction cache parity error corrected\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["def build_fixed_line_sequences(event_ids, labels, window_size=10, step_size=10):\n","    '''Build non-overlapping fixed-line windows from event IDs and labels.'''\n","    X, y, ranges = [], [], []\n","\n","    for start in range(0, len(event_ids) - window_size + 1, step_size):\n","        end = start + window_size\n","\n","        # Model input: event IDs for the 10 log lines.\n","        seq_ids = event_ids[start:end]\n","\n","        # Sequence label: anomalous if any log inside the window is anomalous.\n","        seq_labels = labels[start:end]\n","        seq_label = 1 if seq_labels.max() == 1 else 0\n","\n","        X.append(seq_ids)\n","        y.append(seq_label)\n","        ranges.append((start, end - 1))\n","\n","    return np.array(X, dtype=np.int32), np.array(y, dtype=np.int8), np.array(ranges, dtype=np.int32)\n","\n","X_ids, y_seq, seq_ranges = build_fixed_line_sequences(\n","    line_event_ids,\n","    line_labels,\n","    window_size=WINDOW_SIZE,\n","    step_size=STEP_SIZE,\n",")\n","\n","if len(X_ids) == 0:\n","    raise ValueError(\"No sequences were created. Check dataset size, WINDOW_SIZE, and STEP_SIZE.\")\n","\n","print(\"X_ids shape:\", X_ids.shape)\n","print(\"y_seq shape:\", y_seq.shape)\n","print(\"Sequence label distribution:\", Counter(y_seq))\n","\n","print(\"\\nExample sequence\")\n","print(\"Event IDs:\", X_ids[0])\n","print(\"Sequence label:\", int(y_seq[0]))\n","print(\"Line range:\", seq_ranges[0])\n","\n","display(df.iloc[seq_ranges[0][0]:seq_ranges[0][1] + 1][[\n","    \"line_index\", \"label\", \"full_time\", \"node\", \"severity\", \"event_message\", \"model_text_norm\"\n","]])\n"]},{"cell_type":"markdown","id":"87c40b8a","metadata":{"id":"87c40b8a"},"source":["## Step 8 — Temporal 80/20 split\n","\n","The split is chronological:\n","\n","```text\n","Train = first 80% of sequences\n","Test  = final 20% of sequences\n","```\n","\n","This is more realistic than random splitting because production systems train on historical logs and detect future logs.\n","\n","### Output\n","\n","The cell prints the normal/anomaly distribution in train and test sets. The test set must contain both classes for valid metrics.\n"]},{"cell_type":"code","execution_count":12,"id":"4d11794e","metadata":{"id":"4d11794e","executionInfo":{"status":"ok","timestamp":1783280838349,"user_tz":-180,"elapsed":166,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"2e501710-28c0-46cb-b1ee-568dae687296"},"outputs":[{"output_type":"stream","name":"stdout","text":["Train shape: (377079, 10) Counter({np.int8(0): 343721, np.int8(1): 33358})\n","Test shape: (94270, 10) Counter({np.int8(0): 88605, np.int8(1): 5665})\n","\n","Temporal split example\n","Last training sequence line range: [3770780 3770789]\n","First testing sequence line range: [3770790 3770799]\n"]}],"source":["split_idx = int(len(X_ids) * TRAIN_RATIO)\n","\n","X_train, X_test = X_ids[:split_idx], X_ids[split_idx:]\n","y_train, y_test = y_seq[:split_idx], y_seq[split_idx:]\n","ranges_train, ranges_test = seq_ranges[:split_idx], seq_ranges[split_idx:]\n","\n","print(\"Train shape:\", X_train.shape, Counter(y_train))\n","print(\"Test shape:\", X_test.shape, Counter(y_test))\n","\n","# Safety check: binary metrics are meaningful only if test has normal and anomaly samples.\n","test_counts = Counter(y_test)\n","if test_counts[0] == 0 or test_counts[1] == 0:\n","    raise ValueError(\n","        f\"Invalid temporal test distribution: {test_counts}. \"\n","        \"The test set must contain both normal and anomaly sequences.\"\n","    )\n","\n","print(\"\\nTemporal split example\")\n","print(\"Last training sequence line range:\", ranges_train[-1])\n","print(\"First testing sequence line range:\", ranges_test[0])\n"]},{"cell_type":"markdown","id":"62e6dbee","metadata":{"id":"62e6dbee"},"source":["## Step 9 — Create PyTorch datasets and dataloaders\n","\n","The model receives event ID sequences, not raw text.\n","\n","### Input example\n","\n","```text\n","[12, 12, 12, 45, 87, 87, 91, 91, 91, 91]\n","```\n","\n","Each integer points to a MiniLM embedding in the cached embedding matrix.\n","\n","### Output example\n","\n","Each dataloader batch returns:\n","\n","```text\n","event_ids: [batch_size, 10]\n","labels:    [batch_size]\n","indices:   [batch_size]\n","```\n"]},{"cell_type":"code","execution_count":13,"id":"851cac7d","metadata":{"id":"851cac7d","executionInfo":{"status":"ok","timestamp":1783280838815,"user_tz":-180,"elapsed":464,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"627eb9ff-b86e-4781-b679-ec6c6ad679f6"},"outputs":[{"output_type":"stream","name":"stdout","text":["Train batches: 1473\n","Test batches: 369\n","\n","Example batch shapes\n","event_ids: torch.Size([256, 10])\n","labels: torch.Size([256])\n","indices: torch.Size([256])\n"]}],"source":["class EventIdSequenceDataset(Dataset):\n","    \"\"\"Dataset returning event-ID sequences and binary labels.\"\"\"\n","\n","    def __init__(self, X_ids, y):\n","        self.X_ids = torch.tensor(X_ids, dtype=torch.long)\n","        self.y = torch.tensor(y, dtype=torch.float32)\n","\n","    def __len__(self):\n","        return len(self.y)\n","\n","    def __getitem__(self, idx):\n","        return self.X_ids[idx], self.y[idx], idx\n","\n","train_dataset = EventIdSequenceDataset(X_train, y_train)\n","test_dataset = EventIdSequenceDataset(X_test, y_test)\n","\n","# Reset seeds immediately before DataLoader creation.\n","reset_all_seeds(SEED)\n","loader_generator = torch.Generator()\n","loader_generator.manual_seed(SEED)\n","\n","pin_memory = device.type == \"cuda\"\n","train_loader = DataLoader(\n","    train_dataset,\n","    batch_size=BATCH_SIZE,\n","    shuffle=True,\n","    generator=loader_generator,\n","    num_workers=0,          # deterministic in Colab; avoids worker seed differences\n","    pin_memory=pin_memory,\n",")\n","test_loader = DataLoader(\n","    test_dataset,\n","    batch_size=BATCH_SIZE,\n","    shuffle=False,\n","    num_workers=0,\n","    pin_memory=pin_memory,\n",")\n","\n","print(\"Train batches:\", len(train_loader))\n","print(\"Test batches:\", len(test_loader))\n","\n","batch_event_ids, batch_labels, batch_indices = next(iter(train_loader))\n","print(\"\\nExample batch shapes\")\n","print(\"event_ids:\", batch_event_ids.shape)\n","print(\"labels:\", batch_labels.shape)\n","print(\"indices:\", batch_indices.shape)\n"]},{"cell_type":"markdown","id":"67a381e3","metadata":{"id":"67a381e3"},"source":["## Step 10 — Define the LogMiniLM model\n","\n","LogMiniLM uses cached MiniLM embeddings as a frozen semantic embedding layer.\n","\n","### Forward pass\n","\n","```text\n","event IDs\n","  ↓\n","MiniLM embedding lookup [batch, 10, 384]\n","  ↓\n","Projection layer [batch, 10, 128]\n","  ↓\n","Position embedding\n","  ↓\n","Transformer encoder\n","  ↓\n","Mean pooling\n","  ↓\n","Binary classifier\n","  ↓\n","Anomaly logit\n","```\n","\n","### Why freeze MiniLM embeddings?\n","\n","The embeddings are already generated and cached. Freezing them keeps training lightweight and reduces GPU memory use.\n"]},{"cell_type":"code","execution_count":14,"id":"97e5f701","metadata":{"id":"97e5f701","executionInfo":{"status":"ok","timestamp":1783280839435,"user_tz":-180,"elapsed":619,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"fdec2095-e3f8-4d3b-e0bc-85c923ebc28c"},"outputs":[{"output_type":"stream","name":"stdout","text":["LogMiniLM(\n","  (semantic_embedding): Embedding(47012, 384)\n","  (projection): Linear(in_features=384, out_features=128, bias=True)\n","  (transformer): TransformerEncoder(\n","    (layers): ModuleList(\n","      (0): TransformerEncoderLayer(\n","        (self_attn): MultiheadAttention(\n","          (out_proj): NonDynamicallyQuantizableLinear(in_features=128, out_features=128, bias=True)\n","        )\n","        (linear1): Linear(in_features=128, out_features=256, bias=True)\n","        (dropout): Dropout(p=0.1, inplace=False)\n","        (linear2): Linear(in_features=256, out_features=128, bias=True)\n","        (norm1): LayerNorm((128,), eps=1e-05, elementwise_affine=True)\n","        (norm2): LayerNorm((128,), eps=1e-05, elementwise_affine=True)\n","        (dropout1): Dropout(p=0.1, inplace=False)\n","        (dropout2): Dropout(p=0.1, inplace=False)\n","      )\n","    )\n","  )\n","  (norm): LayerNorm((128,), eps=1e-05, elementwise_affine=True)\n","  (classifier): Sequential(\n","    (0): Dropout(p=0.1, inplace=False)\n","    (1): Linear(in_features=128, out_features=1, bias=True)\n","  )\n",")\n","Total parameters: 18,236,033\n","Trainable parameters: 183,425\n","\n","Example model output before training\n","Logits: [-1.063254   -0.30308527]\n","Probabilities: [0.25668812 0.42480344]\n"]}],"source":["class LogMiniLM(nn.Module):\n","    '''Lightweight semantic Transformer for BGL log anomaly detection.\n","\n","    The model name is LogMiniLM. It uses MiniLM semantic embeddings and a compact\n","    Transformer encoder for sequence-level binary classification.\n","    '''\n","\n","    def __init__(\n","        self,\n","        embedding_matrix,\n","        projection_dim=128,\n","        window_size=10,\n","        num_heads=2,\n","        num_layers=1,\n","        feedforward_dim=256,\n","        dropout=0.1,\n","    ):\n","        super().__init__()\n","\n","        # Frozen semantic lookup table: event_id -> MiniLM embedding.\n","        embedding_tensor = torch.tensor(embedding_matrix, dtype=torch.float32)\n","        self.semantic_embedding = nn.Embedding.from_pretrained(embedding_tensor, freeze=True)\n","\n","        # Reduce MiniLM dimension from 384 to 128 for lighter Transformer compute.\n","        original_dim = embedding_tensor.shape[1]\n","        self.projection = nn.Linear(original_dim, projection_dim)\n","\n","        # Learnable position embeddings so the model knows event order inside the window.\n","        self.position_embedding = nn.Parameter(torch.zeros(1, window_size, projection_dim))\n","\n","        encoder_layer = nn.TransformerEncoderLayer(\n","            d_model=projection_dim,\n","            nhead=num_heads,\n","            dim_feedforward=feedforward_dim,\n","            dropout=dropout,\n","            batch_first=True,\n","            activation=\"gelu\",\n","        )\n","        self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)\n","\n","        self.norm = nn.LayerNorm(projection_dim)\n","        self.classifier = nn.Sequential(\n","            nn.Dropout(dropout),\n","            nn.Linear(projection_dim, 1),\n","        )\n","\n","    def forward(self, event_ids):\n","        # event_ids shape: [batch, window_size]\n","        x = self.semantic_embedding(event_ids)       # [batch, window, 384]\n","        x = self.projection(x)                       # [batch, window, 128]\n","        x = x + self.position_embedding[:, :x.size(1), :]\n","        x = self.transformer(x)                      # [batch, window, 128]\n","        x = self.norm(x)\n","        pooled = x.mean(dim=1)                       # [batch, 128]\n","        logits = self.classifier(pooled).squeeze(-1) # [batch]\n","        return logits\n","\n","# Reset seeds immediately before model initialization.\n","reset_all_seeds(SEED)\n","\n","model = LogMiniLM(\n","    embedding_matrix=unique_embeddings,\n","    projection_dim=PROJECTION_DIM,\n","    window_size=WINDOW_SIZE,\n","    num_heads=NUM_ATTENTION_HEADS,\n","    num_layers=NUM_TRANSFORMER_LAYERS,\n","    feedforward_dim=FEEDFORWARD_DIM,\n","    dropout=DROPOUT,\n",").to(device)\n","\n","num_params = sum(p.numel() for p in model.parameters())\n","trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)\n","\n","print(model)\n","print(\"Total parameters:\", f\"{num_params:,}\")\n","print(\"Trainable parameters:\", f\"{trainable_params:,}\")\n","\n","# Example forward pass before training.\n","model.eval()\n","with torch.no_grad():\n","    example_logits = model(batch_event_ids[:2].to(device))\n","    example_probs = torch.sigmoid(example_logits).detach().cpu().numpy()\n","print(\"\\nExample model output before training\")\n","print(\"Logits:\", example_logits.detach().cpu().numpy())\n","print(\"Probabilities:\", example_probs)\n"]},{"cell_type":"markdown","id":"e2efdae9","metadata":{"id":"e2efdae9"},"source":["## Step 11 — Handle class imbalance\n","\n","BGL is imbalanced: normal sequences are much more common than anomalous sequences.\n","\n","LogMiniLM uses `BCEWithLogitsLoss` with `pos_weight` so anomaly sequences receive higher weight during training.\n","\n","### Example\n","\n","If the training set has:\n","\n","```text\n","normal = 360,000\n","anomaly = 17,000\n","```\n","\n","then the anomaly class receives a higher weight to reduce the chance of predicting everything as normal.\n"]},{"cell_type":"code","execution_count":15,"id":"d449ef67","metadata":{"id":"d449ef67","executionInfo":{"status":"ok","timestamp":1783280839437,"user_tz":-180,"elapsed":10,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"1b79651c-900b-45dc-c1c1-648daf50e50b"},"outputs":[{"output_type":"stream","name":"stdout","text":["Train normal sequences: 343721\n","Train anomaly sequences: 33358\n","Base pos_weight: 10.304005036273157\n","Final pos_weight: 20.608010072546314\n"]},{"output_type":"stream","name":"stderr","text":["/tmp/ipykernel_1650/2851797770.py:16: FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please use `torch.amp.GradScaler('cuda', args...)` instead.\n","  scaler = torch.cuda.amp.GradScaler(enabled=(device.type == \"cuda\" and USE_AMP))\n"]}],"source":["num_pos = int((y_train == 1).sum())\n","num_neg = int((y_train == 0).sum())\n","\n","base_pos_weight = num_neg / max(num_pos, 1)\n","pos_weight_value = base_pos_weight * ANOMALY_WEIGHT_MULTIPLIER\n","\n","print(\"Train normal sequences:\", num_neg)\n","print(\"Train anomaly sequences:\", num_pos)\n","print(\"Base pos_weight:\", base_pos_weight)\n","print(\"Final pos_weight:\", pos_weight_value)\n","\n","criterion = nn.BCEWithLogitsLoss(\n","    pos_weight=torch.tensor([pos_weight_value], device=device, dtype=torch.float32)\n",")\n","optimizer = torch.optim.AdamW(model.parameters(), lr=LEARNING_RATE, weight_decay=1e-4)\n","scaler = torch.cuda.amp.GradScaler(enabled=(device.type == \"cuda\" and USE_AMP))\n"]},{"cell_type":"markdown","id":"4e47dc47","metadata":{"id":"4e47dc47"},"source":["## Step 12 — Train LogMiniLM\n","\n","The training loop uses deterministic settings. Mixed precision is disabled by default for the final reproducible thesis run.\n","\n","### Input\n","Batches of event ID sequences:\n","\n","```text\n","event_ids shape = [batch_size, 10]\n","labels shape    = [batch_size]\n","```\n","\n","### Output\n","The cell prints one loss value per epoch. The loss should generally decrease.\n"]},{"cell_type":"code","execution_count":16,"id":"22cead4b","metadata":{"id":"22cead4b","executionInfo":{"status":"ok","timestamp":1783280959992,"user_tz":-180,"elapsed":120560,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"16b0c34e-f0aa-4ff1-f0ef-9a8ab8a7f7a0"},"outputs":[{"output_type":"stream","name":"stderr","text":["/tmp/ipykernel_1650/2874382427.py:13: FutureWarning: `torch.cuda.amp.autocast(args...)` is deprecated. Please use `torch.amp.autocast('cuda', args...)` instead.\n","  with torch.cuda.amp.autocast(enabled=(device.type == \"cuda\" and USE_AMP)):\n","/usr/local/lib/python3.12/dist-packages/torch/autograd/graph.py:869: UserWarning: Memory Efficient attention defaults to a non-deterministic algorithm. To explicitly enable determinism call torch.use_deterministic_algorithms(True, warn_only=False). (Triggered internally at /pytorch/aten/src/ATen/native/transformers/cuda/attention_backward.cu:900.)\n","  return Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass\n"]},{"output_type":"stream","name":"stdout","text":["Epoch 01/10 - loss: 0.034339\n","Epoch 02/10 - loss: 0.004984\n","Epoch 03/10 - loss: 0.010508\n","Epoch 04/10 - loss: 0.002538\n","Epoch 05/10 - loss: 0.004580\n","Epoch 06/10 - loss: 0.002371\n","Epoch 07/10 - loss: 0.007343\n","Epoch 08/10 - loss: 0.002788\n","Epoch 09/10 - loss: 0.003924\n","Epoch 10/10 - loss: 0.003350\n"]}],"source":["def train_one_epoch(model, loader, optimizer, criterion):\n","    '''Train the model for one epoch and return average loss.'''\n","    model.train()\n","    total_loss = 0.0\n","    total_count = 0\n","\n","    for event_ids, labels, _ in loader:\n","        event_ids = event_ids.to(device, non_blocking=True)\n","        labels = labels.to(device, non_blocking=True)\n","\n","        optimizer.zero_grad(set_to_none=True)\n","\n","        with torch.cuda.amp.autocast(enabled=(device.type == \"cuda\" and USE_AMP)):\n","            logits = model(event_ids)\n","            loss = criterion(logits, labels)\n","\n","        scaler.scale(loss).backward()\n","        scaler.step(optimizer)\n","        scaler.update()\n","\n","        total_loss += loss.item() * labels.size(0)\n","        total_count += labels.size(0)\n","\n","    return total_loss / max(total_count, 1)\n","\n","# Reset seeds immediately before training.\n","reset_all_seeds(SEED)\n","\n","for epoch in range(1, EPOCHS + 1):\n","    loss = train_one_epoch(model, train_loader, optimizer, criterion)\n","    print(f\"Epoch {epoch:02d}/{EPOCHS} - loss: {loss:.6f}\")\n"]},{"cell_type":"markdown","id":"2e1680f2","metadata":{"id":"2e1680f2"},"source":["## Step 13 — Evaluate with threshold sweep\n","\n","The model outputs anomaly probabilities.\n","\n","A threshold converts probability into a class label:\n","\n","```text\n","probability >= threshold → anomaly\n","probability < threshold  → normal\n","```\n","\n","Because anomaly detection is imbalanced, the notebook tests several thresholds and selects the best F1-score.\n","\n","### Output\n","A table containing accuracy, precision, recall, F1-score, and confusion matrix values for each threshold.\n"]},{"cell_type":"code","execution_count":17,"id":"bb71bcdf","metadata":{"id":"bb71bcdf","executionInfo":{"status":"ok","timestamp":1783280962734,"user_tz":-180,"elapsed":2740,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":841},"outputId":"8e37af40-416c-4678-adc7-7bdc29e8937f"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved results to: /content/drive/MyDrive/logminilm_cache/logminilm_results.csv\n"]},{"output_type":"display_data","data":{"text/plain":["    accuracy  precision    recall        f1     tn   fp   fn    tp      model  \\\n","0   0.998366   0.990390  0.982348  0.986352  88551   54  100  5565  LogMiniLM   \n","1   0.998356   0.990214  0.982348  0.986265  88550   55  100  5565  LogMiniLM   \n","2   0.998335   0.989861  0.982348  0.986090  88548   57  100  5565  LogMiniLM   \n","3   0.998303   0.989333  0.982348  0.985828  88545   60  100  5565  LogMiniLM   \n","4   0.998303   0.989333  0.982348  0.985828  88545   60  100  5565  LogMiniLM   \n","5   0.998303   0.989333  0.982348  0.985828  88545   60  100  5565  LogMiniLM   \n","6   0.998282   0.988982  0.982348  0.985654  88543   62  100  5565  LogMiniLM   \n","7   0.998239   0.988279  0.982348  0.985305  88539   66  100  5565  LogMiniLM   \n","8   0.998228   0.988104  0.982348  0.985217  88538   67  100  5565  LogMiniLM   \n","9   0.998175   0.987227  0.982348  0.984781  88533   72  100  5565  LogMiniLM   \n","10  0.998154   0.986877  0.982348  0.984607  88531   74  100  5565  LogMiniLM   \n","11  0.997995   0.984259  0.982348  0.983302  88516   89  100  5565  LogMiniLM   \n","12  0.996425   0.957889  0.983760  0.970652  88360  245   92  5573  LogMiniLM   \n","\n","    window_method  threshold  window_size  step_size  projection_dim  \\\n","0   fixed_10_line       0.90           10         10             128   \n","1   fixed_10_line       0.80           10         10             128   \n","2   fixed_10_line       0.70           10         10             128   \n","3   fixed_10_line       0.50           10         10             128   \n","4   fixed_10_line       0.45           10         10             128   \n","5   fixed_10_line       0.60           10         10             128   \n","6   fixed_10_line       0.40           10         10             128   \n","7   fixed_10_line       0.35           10         10             128   \n","8   fixed_10_line       0.30           10         10             128   \n","9   fixed_10_line       0.25           10         10             128   \n","10  fixed_10_line       0.20           10         10             128   \n","11  fixed_10_line       0.15           10         10             128   \n","12  fixed_10_line       0.10           10         10             128   \n","\n","    transformer_layers  attention_heads  feedforward_dim  train_sequences  \\\n","0                    1                2              256           377079   \n","1                    1                2              256           377079   \n","2                    1                2              256           377079   \n","3                    1                2              256           377079   \n","4                    1                2              256           377079   \n","5                    1                2              256           377079   \n","6                    1                2              256           377079   \n","7                    1                2              256           377079   \n","8                    1                2              256           377079   \n","9                    1                2              256           377079   \n","10                   1                2              256           377079   \n","11                   1                2              256           377079   \n","12                   1                2              256           377079   \n","\n","    test_sequences  unique_messages  \n","0            94270            47012  \n","1            94270            47012  \n","2            94270            47012  \n","3            94270            47012  \n","4            94270            47012  \n","5            94270            47012  \n","6            94270            47012  \n","7            94270            47012  \n","8            94270            47012  \n","9            94270            47012  \n","10           94270            47012  \n","11           94270            47012  \n","12           94270            47012  "],"text/html":["\n","  <div id=\"df-f01a7924-6e3f-4fe1-8ead-86a9f16c3307\" class=\"colab-df-container\">\n","    <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>accuracy</th>\n","      <th>precision</th>\n","      <th>recall</th>\n","      <th>f1</th>\n","      <th>tn</th>\n","      <th>fp</th>\n","      <th>fn</th>\n","      <th>tp</th>\n","      <th>model</th>\n","      <th>window_method</th>\n","      <th>threshold</th>\n","      <th>window_size</th>\n","      <th>step_size</th>\n","      <th>projection_dim</th>\n","      <th>transformer_layers</th>\n","      <th>attention_heads</th>\n","      <th>feedforward_dim</th>\n","      <th>train_sequences</th>\n","      <th>test_sequences</th>\n","      <th>unique_messages</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>0.998366</td>\n","      <td>0.990390</td>\n","      <td>0.982348</td>\n","      <td>0.986352</td>\n","      <td>88551</td>\n","      <td>54</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.90</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>0.998356</td>\n","      <td>0.990214</td>\n","      <td>0.982348</td>\n","      <td>0.986265</td>\n","      <td>88550</td>\n","      <td>55</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.80</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>0.998335</td>\n","      <td>0.989861</td>\n","      <td>0.982348</td>\n","      <td>0.986090</td>\n","      <td>88548</td>\n","      <td>57</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.70</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>0.998303</td>\n","      <td>0.989333</td>\n","      <td>0.982348</td>\n","      <td>0.985828</td>\n","      <td>88545</td>\n","      <td>60</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.50</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>0.998303</td>\n","      <td>0.989333</td>\n","      <td>0.982348</td>\n","      <td>0.985828</td>\n","      <td>88545</td>\n","      <td>60</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.45</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>0.998303</td>\n","      <td>0.989333</td>\n","      <td>0.982348</td>\n","      <td>0.985828</td>\n","      <td>88545</td>\n","      <td>60</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.60</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>0.998282</td>\n","      <td>0.988982</td>\n","      <td>0.982348</td>\n","      <td>0.985654</td>\n","      <td>88543</td>\n","      <td>62</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.40</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>0.998239</td>\n","      <td>0.988279</td>\n","      <td>0.982348</td>\n","      <td>0.985305</td>\n","      <td>88539</td>\n","      <td>66</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.35</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>0.998228</td>\n","      <td>0.988104</td>\n","      <td>0.982348</td>\n","      <td>0.985217</td>\n","      <td>88538</td>\n","      <td>67</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.30</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>0.998175</td>\n","      <td>0.987227</td>\n","      <td>0.982348</td>\n","      <td>0.984781</td>\n","      <td>88533</td>\n","      <td>72</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.25</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>0.998154</td>\n","      <td>0.986877</td>\n","      <td>0.982348</td>\n","      <td>0.984607</td>\n","      <td>88531</td>\n","      <td>74</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.20</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>11</th>\n","      <td>0.997995</td>\n","      <td>0.984259</td>\n","      <td>0.982348</td>\n","      <td>0.983302</td>\n","      <td>88516</td>\n","      <td>89</td>\n","      <td>100</td>\n","      <td>5565</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.15</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","    <tr>\n","      <th>12</th>\n","      <td>0.996425</td>\n","      <td>0.957889</td>\n","      <td>0.983760</td>\n","      <td>0.970652</td>\n","      <td>88360</td>\n","      <td>245</td>\n","      <td>92</td>\n","      <td>5573</td>\n","      <td>LogMiniLM</td>\n","      <td>fixed_10_line</td>\n","      <td>0.10</td>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>128</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>256</td>\n","      <td>377079</td>\n","      <td>94270</td>\n","      <td>47012</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f01a7924-6e3f-4fe1-8ead-86a9f16c3307')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-f01a7924-6e3f-4fe1-8ead-86a9f16c3307 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-f01a7924-6e3f-4fe1-8ead-86a9f16c3307');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_1321624f-e822-44ee-99fe-c23b481123a4\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('results_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_1321624f-e822-44ee-99fe-c23b481123a4 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('results_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"results_df","summary":"{\n  \"name\": \"results_df\",\n  \"rows\": 13,\n  \"fields\": [\n    {\n      \"column\": \"accuracy\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.000516897429795503,\n        \"min\": 0.9964251617693858,\n        \"max\": 0.9983663943990665,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          0.9982391004561366,\n          0.9983663943990665,\n          0.9979951203988544\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"precision\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.008655255406163681,\n        \"min\": 0.9578893090409075,\n        \"max\": 0.99038974906567,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          0.988279168886521,\n          0.99038974906567,\n          0.9842589317297489\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"recall\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0003916682762402277,\n        \"min\": 0.9823477493380406,\n        \"max\": 0.9837599293909973,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.9837599293909973,\n          0.9823477493380406\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"f1\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.004178773128273904,\n        \"min\": 0.9706522685709309,\n        \"max\": 0.9863523573200993,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          0.9853045325779037,\n          0.9863523573200993\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"tn\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 50,\n        \"min\": 88360,\n        \"max\": 88551,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          88539,\n          88551\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"fp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 50,\n        \"min\": 54,\n        \"max\": 245,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          66,\n          54\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"fn\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 2,\n        \"min\": 92,\n        \"max\": 100,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          92,\n          100\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"tp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 2,\n        \"min\": 5565,\n        \"max\": 5573,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          5573,\n          5565\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"model\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"LogMiniLM\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"window_method\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"fixed_10_line\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"threshold\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.25178847451270664,\n        \"min\": 0.1,\n        \"max\": 0.9,\n        \"num_unique_values\": 13,\n        \"samples\": [\n          0.15\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"window_size\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 10,\n        \"max\": 10,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          10\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"step_size\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 10,\n        \"max\": 10,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          10\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"projection_dim\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 128,\n        \"max\": 128,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          128\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"transformer_layers\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"attention_heads\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 2,\n        \"max\": 2,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"feedforward_dim\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 256,\n        \"max\": 256,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          256\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"train_sequences\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 377079,\n        \"max\": 377079,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          377079\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"test_sequences\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 94270,\n        \"max\": 94270,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          94270\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"unique_messages\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 47012,\n        \"max\": 47012,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          47012\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Best threshold: 0.9\n","Best F1-score: 0.9863523573200993\n","Best accuracy: 0.9983663943990665\n","\n","Classification report at best threshold\n","              precision    recall  f1-score   support\n","\n","      Normal       1.00      1.00      1.00     88605\n","     Anomaly       0.99      0.98      0.99      5665\n","\n","    accuracy                           1.00     94270\n","   macro avg       0.99      0.99      0.99     94270\n","weighted avg       1.00      1.00      1.00     94270\n","\n","\n","Prediction probability statistics\n","Min: 5.8975033e-06\n","Max: 0.9999958\n","Mean: 0.05997713\n"]}],"source":["def predict_probabilities(model, loader):\n","    '''Return probabilities, true labels, and local test indices.'''\n","    model.eval()\n","    all_probs = []\n","    all_labels = []\n","    all_indices = []\n","\n","    with torch.no_grad():\n","        for event_ids, labels, batch_indices in loader:\n","            event_ids = event_ids.to(device, non_blocking=True)\n","            logits = model(event_ids)\n","            probs = torch.sigmoid(logits).detach().cpu().numpy()\n","\n","            all_probs.append(probs)\n","            all_labels.append(labels.numpy())\n","            all_indices.append(batch_indices.numpy())\n","\n","    return (\n","        np.concatenate(all_probs),\n","        np.concatenate(all_labels).astype(int),\n","        np.concatenate(all_indices).astype(int),\n","    )\n","\n","\n","def evaluate_binary(y_true, y_pred):\n","    '''Compute binary classification metrics with a stable confusion matrix.'''\n","    cm = confusion_matrix(y_true, y_pred, labels=[0, 1])\n","    tn, fp, fn, tp = cm.ravel()\n","    return {\n","        \"accuracy\": accuracy_score(y_true, y_pred),\n","        \"precision\": precision_score(y_true, y_pred, zero_division=0),\n","        \"recall\": recall_score(y_true, y_pred, zero_division=0),\n","        \"f1\": f1_score(y_true, y_pred, zero_division=0),\n","        \"tn\": int(tn),\n","        \"fp\": int(fp),\n","        \"fn\": int(fn),\n","        \"tp\": int(tp),\n","    }\n","\n","probs, true_labels, test_indices = predict_probabilities(model, test_loader)\n","\n","thresholds = [0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.60, 0.70, 0.80, 0.90]\n","rows = []\n","\n","for th in thresholds:\n","    preds = (probs >= th).astype(int)\n","    metrics = evaluate_binary(true_labels, preds)\n","    metrics.update({\n","        \"model\": \"LogMiniLM\",\n","        \"window_method\": \"fixed_10_line\",\n","        \"threshold\": th,\n","        \"window_size\": WINDOW_SIZE,\n","        \"step_size\": STEP_SIZE,\n","        \"projection_dim\": PROJECTION_DIM,\n","        \"transformer_layers\": NUM_TRANSFORMER_LAYERS,\n","        \"attention_heads\": NUM_ATTENTION_HEADS,\n","        \"feedforward_dim\": FEEDFORWARD_DIM,\n","        \"train_sequences\": len(y_train),\n","        \"test_sequences\": len(y_test),\n","        \"unique_messages\": len(unique_texts),\n","    })\n","    rows.append(metrics)\n","\n","results_df = pd.DataFrame(rows).sort_values(\"f1\", ascending=False).reset_index(drop=True)\n","results_df.to_csv(RESULTS_PATH, index=False)\n","\n","print(\"Saved results to:\", RESULTS_PATH)\n","display(results_df)\n","\n","best_row = results_df.iloc[0]\n","best_threshold = float(best_row[\"threshold\"])\n","print(\"\\nBest threshold:\", best_threshold)\n","print(\"Best F1-score:\", best_row[\"f1\"])\n","print(\"Best accuracy:\", best_row[\"accuracy\"])\n","\n","best_preds = (probs >= best_threshold).astype(int)\n","print(\"\\nClassification report at best threshold\")\n","print(classification_report(true_labels, best_preds, target_names=[\"Normal\", \"Anomaly\"], zero_division=0))\n","\n","print(\"\\nPrediction probability statistics\")\n","print(\"Min:\", probs.min())\n","print(\"Max:\", probs.max())\n","print(\"Mean:\", probs.mean())\n"]},{"cell_type":"markdown","id":"99211d27","metadata":{"id":"99211d27"},"source":["## Step 14 — Save prediction outputs for XAI\n","\n","For XAI, each sequence prediction must be linked back to the original log lines.\n","\n","### Saved fields\n","\n","- sequence local test index\n","- start and end line numbers\n","- start and end time\n","- start and end node\n","- true label\n","- predicted label\n","- anomaly probability\n","- threshold\n","\n","### Memory-safe design\n","\n","This step does not reload the full raw log file. It uses the lightweight metadata already saved earlier.\n"]},{"cell_type":"code","execution_count":18,"id":"e3cdf67b","metadata":{"id":"e3cdf67b","executionInfo":{"status":"ok","timestamp":1783280974915,"user_tz":-180,"elapsed":12176,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":431},"outputId":"d7328a43-4c59-4706-b9c3-b196a2c09472"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved predictions for XAI to: /content/drive/MyDrive/logminilm_cache/logminilm_predictions_for_xai.csv\n"]},{"output_type":"display_data","data":{"text/plain":["   sequence_local_test_index  start_line  end_line  \\\n","0                          0     3770790   3770799   \n","1                          1     3770800   3770809   \n","2                          2     3770810   3770819   \n","3                          3     3770820   3770829   \n","4                          4     3770830   3770839   \n","\n","                   start_time                    end_time  \\\n","0  2005-11-03-15.11.48.359543  2005-11-03-15.11.48.503398   \n","1  2005-11-03-15.11.48.526458  2005-11-03-15.11.48.681992   \n","2  2005-11-03-15.11.48.701875  2005-11-03-15.11.48.837286   \n","3  2005-11-03-15.11.48.857521  2005-11-03-15.11.49.004952   \n","4  2005-11-03-15.11.49.019234  2005-11-03-15.11.49.168828   \n","\n","            start_node             end_node  true_label  predicted_label  \\\n","0  R66-M1-ND-C:J11-U01  R66-M1-ND-C:J08-U11           0                0   \n","1  R66-M1-ND-C:J08-U11  R66-M1-ND-C:J14-U01           0                0   \n","2  R66-M1-ND-C:J14-U01  R66-M1-ND-C:J04-U01           0                0   \n","3  R66-M1-ND-C:J04-U01  R66-M1-NF-C:J09-U11           0                0   \n","4  R66-M1-NF-C:J09-U11  R66-M1-NF-C:J05-U01           0                0   \n","\n","   anomaly_probability  threshold  \n","0             0.000006        0.9  \n","1             0.000006        0.9  \n","2             0.000006        0.9  \n","3             0.000006        0.9  \n","4             0.000006        0.9  "],"text/html":["\n","  <div id=\"df-3aa53e85-ed7d-4034-ad05-4655a323fa63\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>start_line</th>\n","      <th>end_line</th>\n","      <th>start_time</th>\n","      <th>end_time</th>\n","      <th>start_node</th>\n","      <th>end_node</th>\n","      <th>true_label</th>\n","      <th>predicted_label</th>\n","      <th>anomaly_probability</th>\n","      <th>threshold</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>0</td>\n","      <td>3770790</td>\n","      <td>3770799</td>\n","      <td>2005-11-03-15.11.48.359543</td>\n","      <td>2005-11-03-15.11.48.503398</td>\n","      <td>R66-M1-ND-C:J11-U01</td>\n","      <td>R66-M1-ND-C:J08-U11</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>0.000006</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>1</td>\n","      <td>3770800</td>\n","      <td>3770809</td>\n","      <td>2005-11-03-15.11.48.526458</td>\n","      <td>2005-11-03-15.11.48.681992</td>\n","      <td>R66-M1-ND-C:J08-U11</td>\n","      <td>R66-M1-ND-C:J14-U01</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>0.000006</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>2</td>\n","      <td>3770810</td>\n","      <td>3770819</td>\n","      <td>2005-11-03-15.11.48.701875</td>\n","      <td>2005-11-03-15.11.48.837286</td>\n","      <td>R66-M1-ND-C:J14-U01</td>\n","      <td>R66-M1-ND-C:J04-U01</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>0.000006</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>3</td>\n","      <td>3770820</td>\n","      <td>3770829</td>\n","      <td>2005-11-03-15.11.48.857521</td>\n","      <td>2005-11-03-15.11.49.004952</td>\n","      <td>R66-M1-ND-C:J04-U01</td>\n","      <td>R66-M1-NF-C:J09-U11</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>0.000006</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>4</td>\n","      <td>3770830</td>\n","      <td>3770839</td>\n","      <td>2005-11-03-15.11.49.019234</td>\n","      <td>2005-11-03-15.11.49.168828</td>\n","      <td>R66-M1-NF-C:J09-U11</td>\n","      <td>R66-M1-NF-C:J05-U01</td>\n","      <td>0</td>\n","      <td>0</td>\n","      <td>0.000006</td>\n","      <td>0.9</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-3aa53e85-ed7d-4034-ad05-4655a323fa63')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-3aa53e85-ed7d-4034-ad05-4655a323fa63 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-3aa53e85-ed7d-4034-ad05-4655a323fa63');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"print(\\\"FP count:\\\", len(fp_df), \\\"FN count:\\\", len(fn_df), \\\"Top TP saved:\\\", len(tp_top_df))\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 0,\n        \"max\": 4,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          1,\n          4,\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 3770790,\n        \"max\": 3770830,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          3770800,\n          3770830,\n          3770810\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 15,\n        \"min\": 3770799,\n        \"max\": 3770839,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          3770809,\n          3770839,\n          3770819\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"2005-11-03-15.11.48.526458\",\n          \"2005-11-03-15.11.49.019234\",\n          \"2005-11-03-15.11.48.701875\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"2005-11-03-15.11.48.681992\",\n          \"2005-11-03-15.11.49.168828\",\n          \"2005-11-03-15.11.48.837286\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"R66-M1-ND-C:J08-U11\",\n          \"R66-M1-NF-C:J09-U11\",\n          \"R66-M1-ND-C:J14-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"R66-M1-ND-C:J14-U01\",\n          \"R66-M1-NF-C:J05-U01\",\n          \"R66-M1-ND-C:J04-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"predicted_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"anomaly_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4.926790553988818e-08,\n        \"min\": 5.923002390773036e-06,\n        \"max\": 6.0395054788386915e-06,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          5.923002390773036e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"threshold\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9,\n        \"max\": 0.9,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved top XAI candidates to: /content/drive/MyDrive/logminilm_cache/logminilm_top_xai_candidates.csv\n","FP count: 54 FN count: 100 Top TP saved: 100\n"]}],"source":["y_pred_best = (probs >= best_threshold).astype(int)\n","\n","# Use lightweight metadata. If df is still available, use it directly; otherwise load the lightweight parquet.\n","if \"df\" in globals():\n","    metadata_df = df[[\n","        \"line_index\", \"raw_label\", \"label\", \"date\", \"full_time\", \"node\",\n","        \"source\", \"component\", \"severity\", \"event_message\", \"model_text_norm\"\n","    ]]\n","else:\n","    metadata_df = pd.read_parquet(METADATA_PATH)\n","\n","prediction_rows = []\n","for local_idx, prob, y_true, y_pred in zip(test_indices, probs, true_labels, y_pred_best):\n","    start_line, end_line = ranges_test[local_idx]\n","    start_meta = metadata_df.iloc[start_line]\n","    end_meta = metadata_df.iloc[end_line]\n","\n","    prediction_rows.append({\n","        \"sequence_local_test_index\": int(local_idx),\n","        \"start_line\": int(start_line),\n","        \"end_line\": int(end_line),\n","        \"start_time\": start_meta[\"full_time\"],\n","        \"end_time\": end_meta[\"full_time\"],\n","        \"start_node\": start_meta[\"node\"],\n","        \"end_node\": end_meta[\"node\"],\n","        \"true_label\": int(y_true),\n","        \"predicted_label\": int(y_pred),\n","        \"anomaly_probability\": float(prob),\n","        \"threshold\": best_threshold,\n","    })\n","\n","predictions_df = pd.DataFrame(prediction_rows)\n","predictions_df.to_csv(PREDICTIONS_PATH, index=False)\n","\n","print(\"Saved predictions for XAI to:\", PREDICTIONS_PATH)\n","display(predictions_df.head())\n","\n","# Save a small high-value subset for quick XAI inspection.\n","# Priority: false positives, false negatives, and highest-probability anomaly predictions.\n","fp_df = predictions_df[(predictions_df.true_label == 0) & (predictions_df.predicted_label == 1)].copy()\n","fn_df = predictions_df[(predictions_df.true_label == 1) & (predictions_df.predicted_label == 0)].copy()\n","tp_top_df = predictions_df[(predictions_df.true_label == 1) & (predictions_df.predicted_label == 1)].sort_values(\n","    \"anomaly_probability\", ascending=False\n",").head(100)\n","\n","top_xai_df = pd.concat([fp_df, fn_df, tp_top_df], ignore_index=True)\n","top_xai_df.to_csv(TOP_XAI_CANDIDATES_PATH, index=False)\n","print(\"Saved top XAI candidates to:\", TOP_XAI_CANDIDATES_PATH)\n","print(\"FP count:\", len(fp_df), \"FN count:\", len(fn_df), \"Top TP saved:\", len(tp_top_df))\n"]},{"cell_type":"markdown","id":"3c2e0b99","metadata":{"id":"3c2e0b99"},"source":["## Step 15 — Save the trained model checkpoint\n","\n","The checkpoint is used in the XAI stage.\n","\n","### Saved content\n","\n","- LogMiniLM model weights\n","- model configuration\n","- best threshold\n","- best metrics\n","- cache paths\n"]},{"cell_type":"code","execution_count":19,"id":"08036205","metadata":{"id":"08036205","executionInfo":{"status":"ok","timestamp":1783280978874,"user_tz":-180,"elapsed":3950,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"fb34f107-c14f-4afd-d407-457bf13c1b36"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved LogMiniLM checkpoint to: /content/drive/MyDrive/logminilm_cache/logminilm_model.pt\n"]}],"source":["checkpoint = {\n","    \"model_state_dict\": model.state_dict(),\n","    \"config\": {\n","        \"model_name\": \"LogMiniLM\",\n","        \"minilm_model_name\": MINILM_MODEL_NAME,\n","        \"window_size\": WINDOW_SIZE,\n","        \"step_size\": STEP_SIZE,\n","        \"split\": \"temporal_80_20\",\n","        \"projection_dim\": PROJECTION_DIM,\n","        \"num_transformer_layers\": NUM_TRANSFORMER_LAYERS,\n","        \"num_attention_heads\": NUM_ATTENTION_HEADS,\n","        \"feedforward_dim\": FEEDFORWARD_DIM,\n","        \"dropout\": DROPOUT,\n","        \"best_threshold\": best_threshold,\n","    },\n","    \"best_metrics\": best_row.to_dict(),\n","    \"paths\": {\n","        \"unique_texts_path\": str(UNIQUE_TEXTS_PATH),\n","        \"embeddings_path\": str(EMBEDDINGS_PATH),\n","        \"event_id_path\": str(EVENT_ID_PATH),\n","        \"labels_path\": str(LABELS_PATH),\n","        \"metadata_path\": str(METADATA_PATH),\n","        \"predictions_path\": str(PREDICTIONS_PATH),\n","        \"top_xai_candidates_path\": str(TOP_XAI_CANDIDATES_PATH),\n","    },\n","}\n","\n","torch.save(checkpoint, MODEL_PATH)\n","print(\"Saved LogMiniLM checkpoint to:\", MODEL_PATH)\n"]},{"cell_type":"markdown","id":"a11b352f","metadata":{"id":"a11b352f"},"source":["## Step 16 — Thesis-ready summary\n","\n","Use this wording in the thesis methodology/results section:\n","\n","> LogMiniLM was designed as a lightweight semantic Transformer model for log anomaly detection. The model first applies metadata-reduced preprocessing, where timestamp and node information are preserved for reporting but excluded from direct model input to reduce shortcut learning. Normalized log messages are then deduplicated so that MiniLM embeddings are generated only once for each unique normalized message. These cached embeddings are mapped back to log lines through event identifiers. A projection layer reduces the MiniLM embedding dimension from 384 to 128 before a compact Transformer encoder models the fixed 10-line log sequences. The final classifier predicts whether each sequence is normal or anomalous, and a threshold sweep is used to select the best F1-score.\n","\n","### Final selected pipeline\n","\n","```text\n","Raw BGL logs\n","  ↓\n","Label extraction and metadata separation\n","  ↓\n","Normalize model input text\n","  ↓\n","Encode unique normalized messages with MiniLM\n","  ↓\n","Cache semantic embeddings\n","  ↓\n","Build fixed 10-line sequences\n","  ↓\n","Temporal 80/20 split\n","  ↓\n","384 → 128 projection\n","  ↓\n","Compact Transformer encoder\n","  ↓\n","Binary classification head\n","  ↓\n","Threshold sweep and anomaly prediction\n","  ↓\n","Prediction outputs for XAI\n","```\n","\n","### Selected output files\n","\n","```text\n","logminilm_results.csv\n","logminilm_predictions_for_xai.csv\n","logminilm_top_xai_candidates.csv\n","logminilm_model.pt\n","bgl_metadata_for_alerts_light.parquet\n","```\n"]},{"cell_type":"markdown","id":"86d1e6a7","metadata":{"id":"86d1e6a7"},"source":["## Step 17 — XAI setup: event-level occlusion explanation\n","\n","This section explains **why LogMiniLM predicts a 10-line sequence as anomalous**.\n","\n","The main method is **event-level occlusion**:\n","\n","1. Take a predicted anomalous sequence.\n","2. Replace one log event at a time with a neutral baseline event.\n","3. Recompute the anomaly probability.\n","4. Measure the probability drop.\n","5. Rank events by contribution.\n","\n","A larger probability drop means the removed event was more important for the anomaly decision."]},{"cell_type":"code","execution_count":20,"id":"e67d5930","metadata":{"id":"e67d5930","executionInfo":{"status":"ok","timestamp":1783280978936,"user_tz":-180,"elapsed":58,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":449},"outputId":"81acec75-27a8-453a-e1e7-20c208207228"},"outputs":[{"output_type":"stream","name":"stdout","text":["TP candidates: 5565\n","FP candidates: 54\n","FN candidates: 100\n","Selected XAI candidates: 140\n"]},{"output_type":"display_data","data":{"text/plain":["   sequence_local_test_index  start_line  end_line  \\\n","0                      40735     4178140   4178149   \n","1                      38707     4157860   4157869   \n","2                      42976     4200550   4200559   \n","3                      36874     4139530   4139539   \n","4                      49134     4262130   4262139   \n","\n","                   start_time                    end_time  \\\n","0  2005-11-15-23.50.59.129341  2005-11-16-04.28.19.059020   \n","1  2005-11-12-01.30.05.814458  2005-11-12-01.30.08.352498   \n","2  2005-11-20-21.04.48.732599  2005-11-20-21.31.26.022597   \n","3  2005-11-10-17.47.04.270667  2005-11-10-19.08.43.269604   \n","4  2005-11-26-18.53.45.551371  2005-11-26-19.38.03.957158   \n","\n","            start_node             end_node  true_label  predicted_label  \\\n","0  R52-M0-NC-I:J18-U11  R44-M1-N7-C:J02-U11           1                1   \n","1  R43-M0-N1-C:J11-U01  R43-M0-N1-C:J11-U01           1                1   \n","2  R17-M0-N8-I:J18-U01  R52-M0-N2-C:J13-U11           1                1   \n","3  R65-M1-N6-C:J17-U01  R06-M0-N1-C:J07-U11           1                1   \n","4  R13-M0-N0-I:J18-U11  R03-M1-NF-C:J07-U01           1                1   \n","\n","   anomaly_probability  threshold  \n","0             0.999996        0.9  \n","1             0.999996        0.9  \n","2             0.999996        0.9  \n","3             0.999996        0.9  \n","4             0.999996        0.9  "],"text/html":["\n","  <div id=\"df-5bf4a8e4-fe21-477a-9f20-0849d714dbb2\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>start_line</th>\n","      <th>end_line</th>\n","      <th>start_time</th>\n","      <th>end_time</th>\n","      <th>start_node</th>\n","      <th>end_node</th>\n","      <th>true_label</th>\n","      <th>predicted_label</th>\n","      <th>anomaly_probability</th>\n","      <th>threshold</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>2005-11-15-23.50.59.129341</td>\n","      <td>2005-11-16-04.28.19.059020</td>\n","      <td>R52-M0-NC-I:J18-U11</td>\n","      <td>R44-M1-N7-C:J02-U11</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>2005-11-12-01.30.05.814458</td>\n","      <td>2005-11-12-01.30.08.352498</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>42976</td>\n","      <td>4200550</td>\n","      <td>4200559</td>\n","      <td>2005-11-20-21.04.48.732599</td>\n","      <td>2005-11-20-21.31.26.022597</td>\n","      <td>R17-M0-N8-I:J18-U01</td>\n","      <td>R52-M0-N2-C:J13-U11</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>2005-11-10-17.47.04.270667</td>\n","      <td>2005-11-10-19.08.43.269604</td>\n","      <td>R65-M1-N6-C:J17-U01</td>\n","      <td>R06-M0-N1-C:J07-U11</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.9</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>49134</td>\n","      <td>4262130</td>\n","      <td>4262139</td>\n","      <td>2005-11-26-18.53.45.551371</td>\n","      <td>2005-11-26-19.38.03.957158</td>\n","      <td>R13-M0-N0-I:J18-U11</td>\n","      <td>R03-M1-NF-C:J07-U01</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.9</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5bf4a8e4-fe21-477a-9f20-0849d714dbb2')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-5bf4a8e4-fe21-477a-9f20-0849d714dbb2 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-5bf4a8e4-fe21-477a-9f20-0849d714dbb2');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(xai_candidates\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4745,\n        \"min\": 36874,\n        \"max\": 49134,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          38707,\n          49134,\n          42976\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 47452,\n        \"min\": 4139530,\n        \"max\": 4262130,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          4157860,\n          4262130,\n          4200550\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 47452,\n        \"min\": 4139539,\n        \"max\": 4262139,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          4157869,\n          4262139,\n          4200559\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"2005-11-12-01.30.05.814458\",\n          \"2005-11-26-18.53.45.551371\",\n          \"2005-11-20-21.04.48.732599\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"2005-11-12-01.30.08.352498\",\n          \"2005-11-26-19.38.03.957158\",\n          \"2005-11-20-21.31.26.022597\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"R43-M0-N1-C:J11-U01\",\n          \"R13-M0-N0-I:J18-U11\",\n          \"R17-M0-N8-I:J18-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"R43-M0-N1-C:J11-U01\",\n          \"R03-M1-NF-C:J07-U01\",\n          \"R52-M0-N2-C:J13-U11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"predicted_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"anomaly_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"threshold\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9,\n        \"max\": 0.9,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# XAI output paths\n","# ============================================================\n","XAI_LOCAL_PATH = CACHE_DIR / \"logminilm_xai_local_event_importance.csv\"\n","XAI_GLOBAL_PATH = CACHE_DIR / \"logminilm_xai_global_summary.csv\"\n","XAI_FAITHFULNESS_PATH = CACHE_DIR / \"logminilm_xai_faithfulness.csv\"\n","XAI_CASE_STUDY_PATH = CACHE_DIR / \"logminilm_xai_case_study.csv\"\n","\n","# Number of sequences to explain.\n","# Increase this if you want more global XAI coverage, but it will take longer.\n","MAX_XAI_SEQUENCES = 100\n","\n","# Select correctly detected anomaly sequences first because they are the main explanation target.\n","tp_candidates = predictions_df[\n","    (predictions_df[\"true_label\"] == 1) &\n","    (predictions_df[\"predicted_label\"] == 1)\n","].sort_values(\"anomaly_probability\", ascending=False)\n","\n","# Also keep some false positives and false negatives for error analysis if available.\n","fp_candidates = predictions_df[\n","    (predictions_df[\"true_label\"] == 0) &\n","    (predictions_df[\"predicted_label\"] == 1)\n","].sort_values(\"anomaly_probability\", ascending=False)\n","\n","fn_candidates = predictions_df[\n","    (predictions_df[\"true_label\"] == 1) &\n","    (predictions_df[\"predicted_label\"] == 0)\n","].sort_values(\"anomaly_probability\", ascending=False)\n","\n","xai_candidates = pd.concat([\n","    tp_candidates.head(MAX_XAI_SEQUENCES),\n","    fp_candidates.head(20),\n","    fn_candidates.head(20),\n","], ignore_index=True)\n","\n","print(\"TP candidates:\", len(tp_candidates))\n","print(\"FP candidates:\", len(fp_candidates))\n","print(\"FN candidates:\", len(fn_candidates))\n","print(\"Selected XAI candidates:\", len(xai_candidates))\n","display(xai_candidates.head())\n"]},{"cell_type":"markdown","id":"1db93992","metadata":{"id":"1db93992"},"source":["## Step 18 — Choose a neutral baseline event for masking\n","\n","For occlusion, we need to replace one event at a time with a neutral event.\n","\n","We use the **most frequent event ID appearing in normal training sequences** as the baseline. This is a simple and reproducible masking strategy."]},{"cell_type":"code","execution_count":21,"id":"aff91312","metadata":{"id":"aff91312","executionInfo":{"status":"ok","timestamp":1783280979000,"user_tz":-180,"elapsed":63,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"f7a9586d-77d2-4926-c7a5-bb1d0e67b0ee"},"outputs":[{"output_type":"stream","name":"stdout","text":["Baseline event ID: 27136\n","Baseline normalized text: ras kernel info generating core <num>\n"]}],"source":["# ============================================================\n","# Find a neutral baseline event ID from normal training sequences\n","# ============================================================\n","normal_train_sequences = X_train[y_train == 0]\n","if len(normal_train_sequences) == 0:\n","    raise ValueError(\"No normal training sequences found. Cannot build neutral baseline event.\")\n","\n","flat_normal_event_ids = normal_train_sequences.reshape(-1)\n","baseline_event_id = int(pd.Series(flat_normal_event_ids).value_counts().idxmax())\n","baseline_text = unique_texts.iloc[baseline_event_id]\n","\n","print(\"Baseline event ID:\", baseline_event_id)\n","print(\"Baseline normalized text:\", baseline_text)\n","\n","# Thesis note:\n","# This baseline represents a common normal event and is used as the neutral replacement\n","# during occlusion-based explanation.\n"]},{"cell_type":"markdown","id":"e469fab6","metadata":{"id":"e469fab6"},"source":["## Step 19 — Event-level occlusion function\n","\n","For each event position in the 10-line sequence:\n","\n","```text\n","importance = original anomaly probability - masked anomaly probability\n","```\n","\n","If importance is high, that event strongly supports the anomaly prediction."]},{"cell_type":"code","execution_count":22,"id":"35e344f8","metadata":{"id":"35e344f8","executionInfo":{"status":"ok","timestamp":1783280979111,"user_tz":-180,"elapsed":149,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":363},"outputId":"4daf11e0-52e6-4879-dd6e-25baa7e9a14b"},"outputs":[{"output_type":"display_data","data":{"text/plain":["   event_position  original_event_id  masked_event_id  original_probability  \\\n","0              10              26276            27136              0.999996   \n","1               1              26897            27136              0.999996   \n","2               2              26897            27136              0.999996   \n","3               3              26897            27136              0.999996   \n","4               5              26897            27136              0.999996   \n","5               4              26897            27136              0.999996   \n","6               6              26897            27136              0.999996   \n","7               7              26897            27136              0.999996   \n","8               8              26897            27136              0.999996   \n","9               9              27106            27136              0.999996   \n","\n","   masked_probability  importance_drop  \n","0            0.000009         0.999987  \n","1            0.999996         0.000000  \n","2            0.999996         0.000000  \n","3            0.999996         0.000000  \n","4            0.999996         0.000000  \n","5            0.999996         0.000000  \n","6            0.999996         0.000000  \n","7            0.999996         0.000000  \n","8            0.999996         0.000000  \n","9            0.999996         0.000000  "],"text/html":["\n","  <div id=\"df-85d804e9-10f3-442f-8219-79ffa2df1a43\" class=\"colab-df-container\">\n","    <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>event_position</th>\n","      <th>original_event_id</th>\n","      <th>masked_event_id</th>\n","      <th>original_probability</th>\n","      <th>masked_probability</th>\n","      <th>importance_drop</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>10</td>\n","      <td>26276</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.000009</td>\n","      <td>0.999987</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>1</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>2</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>3</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>4</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>6</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>7</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>8</td>\n","      <td>26897</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>9</td>\n","      <td>27106</td>\n","      <td>27136</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-85d804e9-10f3-442f-8219-79ffa2df1a43')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-85d804e9-10f3-442f-8219-79ffa2df1a43 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-85d804e9-10f3-442f-8219-79ffa2df1a43');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_2d51de9c-91a4-454e-88d8-82f3e6bae226\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('example_explanation')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_2d51de9c-91a4-454e-88d8-82f3e6bae226 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('example_explanation');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"example_explanation","summary":"{\n  \"name\": \"example_explanation\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          8,\n          1,\n          4\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_event_id\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 214,\n        \"min\": 26276,\n        \"max\": 27106,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          26276,\n          26897,\n          27106\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_event_id\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 27136,\n        \"max\": 27136,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          27136\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162235909200338,\n        \"min\": 9.030490218719933e-06,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162235909200338,\n        \"min\": 0.0,\n        \"max\": 0.999986797184647,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["def predict_sequence_probability(model, sequence_event_ids):\n","    \"\"\"Predict anomaly probability for one sequence of event IDs.\"\"\"\n","    model.eval()\n","    seq_tensor = torch.tensor(sequence_event_ids, dtype=torch.long).unsqueeze(0).to(device)\n","    with torch.no_grad():\n","        logits = model(seq_tensor)\n","        prob = torch.sigmoid(logits).item()\n","    return float(prob)\n","\n","\n","def explain_sequence_by_occlusion(model, sequence_event_ids, baseline_event_id):\n","    \"\"\"Return event-level occlusion importance for a single sequence.\"\"\"\n","    sequence_event_ids = np.array(sequence_event_ids, dtype=np.int64)\n","    original_prob = predict_sequence_probability(model, sequence_event_ids)\n","\n","    explanation_rows = []\n","    for position in range(len(sequence_event_ids)):\n","        masked_sequence = sequence_event_ids.copy()\n","        original_event_id = int(masked_sequence[position])\n","        masked_sequence[position] = baseline_event_id\n","\n","        masked_prob = predict_sequence_probability(model, masked_sequence)\n","        importance = original_prob - masked_prob\n","\n","        explanation_rows.append({\n","            \"event_position\": int(position + 1),\n","            \"original_event_id\": original_event_id,\n","            \"masked_event_id\": int(baseline_event_id),\n","            \"original_probability\": float(original_prob),\n","            \"masked_probability\": float(masked_prob),\n","            \"importance_drop\": float(importance),\n","        })\n","\n","    return pd.DataFrame(explanation_rows).sort_values(\n","        \"importance_drop\", ascending=False\n","    ).reset_index(drop=True)\n","\n","# Quick test on the highest-probability anomaly candidate.\n","if len(tp_candidates) > 0:\n","    example_local_idx = int(tp_candidates.iloc[0][\"sequence_local_test_index\"])\n","    example_seq = X_test[example_local_idx]\n","    example_explanation = explain_sequence_by_occlusion(model, example_seq, baseline_event_id)\n","    display(example_explanation)\n","else:\n","    print(\"No true-positive anomaly candidates found for quick XAI test.\")\n"]},{"cell_type":"markdown","id":"d2f68209","metadata":{"id":"d2f68209"},"source":["## Step 20 — Generate local XAI explanations with metadata\n","\n","This step attaches each event importance score to operational metadata:\n","\n","- timestamp\n","- node\n","- component\n","- severity\n","- original event message\n","- normalized model input\n","\n","This makes the explanation useful for investigation and thesis case studies."]},{"cell_type":"code","execution_count":23,"id":"20b083b1","metadata":{"id":"20b083b1","executionInfo":{"status":"ok","timestamp":1783280983230,"user_tz":-180,"elapsed":4119,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"d751b6fd-45b5-46fd-9c1b-649bd96daa18"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved local XAI explanations to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_local_event_importance.csv\n","Saved faithfulness results to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_faithfulness.csv\n","Local XAI rows: 1400\n","Faithfulness rows: 140\n"]},{"output_type":"display_data","data":{"text/plain":["    sequence_local_test_index  start_line  end_line  event_position  \\\n","0                       40735     4178140   4178149              10   \n","1                       40735     4178140   4178149               1   \n","2                       40735     4178140   4178149               2   \n","3                       40735     4178140   4178149               3   \n","4                       40735     4178140   4178149               5   \n","5                       40735     4178140   4178149               4   \n","6                       40735     4178140   4178149               6   \n","7                       40735     4178140   4178149               7   \n","8                       40735     4178140   4178149               8   \n","9                       40735     4178140   4178149               9   \n","10                      38707     4157860   4157869               1   \n","11                      38707     4157860   4157869               2   \n","12                      38707     4157860   4157869               3   \n","13                      38707     4157860   4157869               4   \n","14                      38707     4157860   4157869               5   \n","15                      38707     4157860   4157869               6   \n","16                      38707     4157860   4157869               7   \n","17                      38707     4157860   4157869               8   \n","18                      38707     4157860   4157869               9   \n","19                      38707     4157860   4157869              10   \n","\n","    line_index  true_label  predicted_label  original_probability  \\\n","0      4212619           1                1              0.999996   \n","1      4212610           1                1              0.999996   \n","2      4212611           1                1              0.999996   \n","3      4212612           1                1              0.999996   \n","4      4212614           1                1              0.999996   \n","5      4212613           1                1              0.999996   \n","6      4212615           1                1              0.999996   \n","7      4212616           1                1              0.999996   \n","8      4212617           1                1              0.999996   \n","9      4212618           1                1              0.999996   \n","10     4192330           1                1              0.999996   \n","11     4192331           1                1              0.999996   \n","12     4192332           1                1              0.999996   \n","13     4192333           1                1              0.999996   \n","14     4192334           1                1              0.999996   \n","15     4192335           1                1              0.999996   \n","16     4192336           1                1              0.999996   \n","17     4192337           1                1              0.999996   \n","18     4192338           1                1              0.999996   \n","19     4192339           1                1              0.999996   \n","\n","    masked_probability  importance_drop  original_event_id raw_label  \\\n","0             0.000009         0.999987              26276    KERNMC   \n","1             0.999996         0.000000              26897         -   \n","2             0.999996         0.000000              26897         -   \n","3             0.999996         0.000000              26897         -   \n","4             0.999996         0.000000              26897         -   \n","5             0.999996         0.000000              26897         -   \n","6             0.999996         0.000000              26897         -   \n","7             0.999996         0.000000              26897         -   \n","8             0.999996         0.000000              26897         -   \n","9             0.999996         0.000000              27106         -   \n","10            0.000010         0.999986              26276    KERNMC   \n","11            0.999996         0.000000              24083         -   \n","12            0.999996         0.000000              26283         -   \n","13            0.999996         0.000000              26738         -   \n","14            0.999996         0.000000              24085         -   \n","15            0.999996         0.000000              23064         -   \n","16            0.999996         0.000000              23069         -   \n","17            0.999996         0.000000              26751         -   \n","18            0.999996         0.000000              26773         -   \n","19            0.999996         0.000000              24076         -   \n","\n","    line_label                   full_time                 node source  \\\n","0            1  2005-11-16-04.28.19.059020  R44-M1-N7-C:J02-U11    RAS   \n","1            0  2005-11-15-23.50.59.129341  R52-M0-NC-I:J18-U11    RAS   \n","2            0  2005-11-15-23.50.59.152914  R52-M0-NC-I:J18-U01    RAS   \n","3            0  2005-11-15-23.50.59.176578  R52-M0-N4-I:J18-U11    RAS   \n","4            0  2005-11-15-23.50.59.230469  R52-M0-N8-I:J18-U11    RAS   \n","5            0  2005-11-15-23.50.59.200558  R52-M0-N4-I:J18-U01    RAS   \n","6            0  2005-11-15-23.50.59.259949  R52-M0-N8-I:J18-U01    RAS   \n","7            0  2005-11-15-23.50.59.284077  R52-M0-N0-I:J18-U11    RAS   \n","8            0  2005-11-15-23.50.59.314055  R52-M0-N0-I:J18-U01    RAS   \n","9            0  2005-11-16-03.58.32.641155  R05-M1-N1-C:J10-U11    RAS   \n","10           1  2005-11-12-01.30.05.814458  R43-M0-N1-C:J11-U01    RAS   \n","11           0  2005-11-12-01.30.05.951269  R43-M0-N1-C:J11-U01    RAS   \n","12           0  2005-11-12-01.30.06.152663  R43-M0-N1-C:J11-U01    RAS   \n","13           0  2005-11-12-01.30.06.384104  R43-M0-N1-C:J11-U01    RAS   \n","14           0  2005-11-12-01.30.06.557534  R43-M0-N1-C:J11-U01    RAS   \n","15           0  2005-11-12-01.30.06.717795  R43-M0-N1-C:J11-U01    RAS   \n","16           0  2005-11-12-01.30.06.946548  R43-M0-N1-C:J11-U01    RAS   \n","17           0  2005-11-12-01.30.07.373685  R43-M0-N1-C:J11-U01    RAS   \n","18           0  2005-11-12-01.30.08.277866  R63-M0-N8-C:J17-U01    RAS   \n","19           0  2005-11-12-01.30.08.352498  R43-M0-N1-C:J11-U01    RAS   \n","\n","   component severity                                      event_message  \\\n","0     KERNEL    FATAL                            machine check interrupt   \n","1     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","2     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","3     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","4     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","5     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","6     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","7     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","8     KERNEL     INFO  ciod: generated 128 core files for program /g/...   \n","9     KERNEL     INFO  data cache flush parity error detected. attemp...   \n","10    KERNEL    FATAL                            machine check interrupt   \n","11    KERNEL    FATAL                    instruction address: 0x0014c98c   \n","12    KERNEL    FATAL          machine check status register: 0x81000000   \n","13    KERNEL    FATAL                summary...........................1   \n","14    KERNEL    FATAL                instruction plb error.............0   \n","15    KERNEL    FATAL                data read plb error...............0   \n","16    KERNEL    FATAL                data write plb error..............0   \n","17    KERNEL    FATAL                tlb error.........................0   \n","18    KERNEL     INFO  6 ddr errors(s) detected and corrected on rank...   \n","19    KERNEL    FATAL                i-cache parity error..............0   \n","\n","                                      model_text_norm  \n","0            ras kernel fatal machine check interrupt  \n","1   ras kernel info ciod generated <num> core file...  \n","2   ras kernel info ciod generated <num> core file...  \n","3   ras kernel info ciod generated <num> core file...  \n","4   ras kernel info ciod generated <num> core file...  \n","5   ras kernel info ciod generated <num> core file...  \n","6   ras kernel info ciod generated <num> core file...  \n","7   ras kernel info ciod generated <num> core file...  \n","8   ras kernel info ciod generated <num> core file...  \n","9   ras kernel info data cache flush parity error ...  \n","10           ras kernel fatal machine check interrupt  \n","11         ras kernel fatal instruction address <hex>  \n","12  ras kernel fatal machine check status register...  \n","13                     ras kernel fatal summary <num>  \n","14       ras kernel fatal instruction plb error <num>  \n","15         ras kernel fatal data read plb error <num>  \n","16        ras kernel fatal data write plb error <num>  \n","17                   ras kernel fatal tlb error <num>  \n","18  ras kernel info <num> ddr errors s detected an...  \n","19        ras kernel fatal i cache parity error <num>  "],"text/html":["\n","  <div id=\"df-677bb11c-6c1b-47d6-859a-97e7bbeb4997\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>start_line</th>\n","      <th>end_line</th>\n","      <th>event_position</th>\n","      <th>line_index</th>\n","      <th>true_label</th>\n","      <th>predicted_label</th>\n","      <th>original_probability</th>\n","      <th>masked_probability</th>\n","      <th>importance_drop</th>\n","      <th>original_event_id</th>\n","      <th>raw_label</th>\n","      <th>line_label</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>source</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","      <th>model_text_norm</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>10</td>\n","      <td>4212619</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000009</td>\n","      <td>0.999987</td>\n","      <td>26276</td>\n","      <td>KERNMC</td>\n","      <td>1</td>\n","      <td>2005-11-16-04.28.19.059020</td>\n","      <td>R44-M1-N7-C:J02-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>ras kernel fatal machine check interrupt</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>1</td>\n","      <td>4212610</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.129341</td>\n","      <td>R52-M0-NC-I:J18-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>2</td>\n","      <td>4212611</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.152914</td>\n","      <td>R52-M0-NC-I:J18-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>3</td>\n","      <td>4212612</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.176578</td>\n","      <td>R52-M0-N4-I:J18-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>5</td>\n","      <td>4212614</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.230469</td>\n","      <td>R52-M0-N8-I:J18-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>4</td>\n","      <td>4212613</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.200558</td>\n","      <td>R52-M0-N4-I:J18-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>6</td>\n","      <td>4212615</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.259949</td>\n","      <td>R52-M0-N8-I:J18-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>7</td>\n","      <td>4212616</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.284077</td>\n","      <td>R52-M0-N0-I:J18-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>8</td>\n","      <td>4212617</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26897</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-15-23.50.59.314055</td>\n","      <td>R52-M0-N0-I:J18-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","      <td>ras kernel info ciod generated &lt;num&gt; core file...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>9</td>\n","      <td>4212618</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>27106</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-16-03.58.32.641155</td>\n","      <td>R05-M1-N1-C:J10-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>data cache flush parity error detected. attemp...</td>\n","      <td>ras kernel info data cache flush parity error ...</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>1</td>\n","      <td>4192330</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000010</td>\n","      <td>0.999986</td>\n","      <td>26276</td>\n","      <td>KERNMC</td>\n","      <td>1</td>\n","      <td>2005-11-12-01.30.05.814458</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>ras kernel fatal machine check interrupt</td>\n","    </tr>\n","    <tr>\n","      <th>11</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>2</td>\n","      <td>4192331</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>24083</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.05.951269</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction address: 0x0014c98c</td>\n","      <td>ras kernel fatal instruction address &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>12</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>3</td>\n","      <td>4192332</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26283</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.152663</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check status register: 0x81000000</td>\n","      <td>ras kernel fatal machine check status register...</td>\n","    </tr>\n","    <tr>\n","      <th>13</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>4</td>\n","      <td>4192333</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26738</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.384104</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>summary...........................1</td>\n","      <td>ras kernel fatal summary &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>14</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>5</td>\n","      <td>4192334</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>24085</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.557534</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction plb error.............0</td>\n","      <td>ras kernel fatal instruction plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>15</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>6</td>\n","      <td>4192335</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>23064</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.717795</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data read plb error...............0</td>\n","      <td>ras kernel fatal data read plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>16</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>7</td>\n","      <td>4192336</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>23069</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.946548</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data write plb error..............0</td>\n","      <td>ras kernel fatal data write plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>17</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>8</td>\n","      <td>4192337</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26751</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.07.373685</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>tlb error.........................0</td>\n","      <td>ras kernel fatal tlb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>18</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>9</td>\n","      <td>4192338</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>26773</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.08.277866</td>\n","      <td>R63-M0-N8-C:J17-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>6 ddr errors(s) detected and corrected on rank...</td>\n","      <td>ras kernel info &lt;num&gt; ddr errors s detected an...</td>\n","    </tr>\n","    <tr>\n","      <th>19</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>10</td>\n","      <td>4192339</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>0.000000</td>\n","      <td>24076</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.08.352498</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>i-cache parity error..............0</td>\n","      <td>ras kernel fatal i cache parity error &lt;num&gt;</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-677bb11c-6c1b-47d6-859a-97e7bbeb4997')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-677bb11c-6c1b-47d6-859a-97e7bbeb4997 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-677bb11c-6c1b-47d6-859a-97e7bbeb4997');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(faithfulness_df\",\n  \"rows\": 20,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1040,\n        \"min\": 38707,\n        \"max\": 40735,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          38707,\n          40735\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 10403,\n        \"min\": 4157860,\n        \"max\": 4178140,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          4157860,\n          4178140\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 10403,\n        \"min\": 4157869,\n        \"max\": 4178149,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          4157869,\n          4178149\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 2,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          8,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"line_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 10403,\n        \"min\": 4192330,\n        \"max\": 4212619,\n        \"num_unique_values\": 20,\n        \"samples\": [\n          4212619,\n          4192337\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"predicted_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.30778934638130334,\n        \"min\": 9.030490218719933e-06,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          9.030490218719933e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3077893463813035,\n        \"min\": 0.0,\n        \"max\": 0.999986797184647,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0.999986797184647\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_event_id\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1411,\n        \"min\": 23064,\n        \"max\": 27106,\n        \"num_unique_values\": 12,\n        \"samples\": [\n          26773\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"line_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 1,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 20,\n        \"samples\": [\n          \"2005-11-16-04.28.19.059020\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 12,\n        \"samples\": [\n          \"R43-M0-N1-C:J11-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"source\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"RAS\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"KERNEL\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 12,\n        \"samples\": [\n          \"6 ddr errors(s) detected and corrected on rank 0, symbol 35, bit 0\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"model_text_norm\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 12,\n        \"samples\": [\n          \"ras kernel info <num> ddr errors s detected and corrected on rank <num> symbol <num> bit <num>\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["   sequence_local_test_index  start_line  end_line  true_label  \\\n","0                      40735     4178140   4178149           1   \n","1                      38707     4157860   4157869           1   \n","2                      42976     4200550   4200559           1   \n","3                      36874     4139530   4139539           1   \n","4                      49134     4262130   4262139           1   \n","\n","   predicted_label  original_probability  top_event_position  \\\n","0                1              0.999996                  10   \n","1                1              0.999996                   1   \n","2                1              0.999996                  10   \n","3                1              0.999996                   7   \n","4                1              0.999996                   3   \n","\n","   top_event_importance_drop  top_event_masked_probability  \n","0                   0.999987                      0.000009  \n","1                   0.999986                      0.000010  \n","2                   0.999989                      0.000006  \n","3                   0.999989                      0.000006  \n","4                   0.000002                      0.999994  "],"text/html":["\n","  <div id=\"df-8214722e-b0ee-4032-a27d-840ddfd93028\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>start_line</th>\n","      <th>end_line</th>\n","      <th>true_label</th>\n","      <th>predicted_label</th>\n","      <th>original_probability</th>\n","      <th>top_event_position</th>\n","      <th>top_event_importance_drop</th>\n","      <th>top_event_masked_probability</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>40735</td>\n","      <td>4178140</td>\n","      <td>4178149</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>10</td>\n","      <td>0.999987</td>\n","      <td>0.000009</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>1</td>\n","      <td>0.999986</td>\n","      <td>0.000010</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>42976</td>\n","      <td>4200550</td>\n","      <td>4200559</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>10</td>\n","      <td>0.999989</td>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>7</td>\n","      <td>0.999989</td>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>49134</td>\n","      <td>4262130</td>\n","      <td>4262139</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>3</td>\n","      <td>0.000002</td>\n","      <td>0.999994</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8214722e-b0ee-4032-a27d-840ddfd93028')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-8214722e-b0ee-4032-a27d-840ddfd93028 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-8214722e-b0ee-4032-a27d-840ddfd93028');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(faithfulness_df\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4745,\n        \"min\": 36874,\n        \"max\": 49134,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          38707,\n          49134,\n          42976\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 47452,\n        \"min\": 4139530,\n        \"max\": 4262130,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          4157860,\n          4262130,\n          4200550\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end_line\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 47452,\n        \"min\": 4139539,\n        \"max\": 4262139,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          4157869,\n          4262139,\n          4200559\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"predicted_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 1,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_event_importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.44720731357379806,\n        \"min\": 2.0265579223632812e-06,\n        \"max\": 0.9999894805519034,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          0.9999861766164031\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_event_masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.44720731357379806,\n        \"min\": 6.347122962324647e-06,\n        \"max\": 0.9999938011169434,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          9.651058462623041e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Generate local XAI explanations\n","# ============================================================\n","local_rows = []\n","faithfulness_rows = []\n","\n","# Ensure metadata exists.\n","if \"metadata_df\" not in globals():\n","    if \"df\" in globals():\n","        metadata_df = df[[\n","            \"line_index\", \"raw_label\", \"label\", \"date\", \"full_time\", \"node\",\n","            \"source\", \"component\", \"severity\", \"event_message\", \"model_text_norm\"\n","        ]]\n","    else:\n","        metadata_df = pd.read_parquet(METADATA_PATH)\n","\n","for _, cand in xai_candidates.iterrows():\n","    local_idx = int(cand[\"sequence_local_test_index\"])\n","    start_line = int(cand[\"start_line\"])\n","    end_line = int(cand[\"end_line\"])\n","    true_label = int(cand[\"true_label\"])\n","    predicted_label = int(cand[\"predicted_label\"])\n","    original_prob_from_eval = float(cand[\"anomaly_probability\"])\n","\n","    seq_event_ids = X_test[local_idx]\n","    exp_df = explain_sequence_by_occlusion(model, seq_event_ids, baseline_event_id)\n","\n","    # Top event faithfulness for this sequence.\n","    top_row = exp_df.iloc[0]\n","    faithfulness_rows.append({\n","        \"sequence_local_test_index\": local_idx,\n","        \"start_line\": start_line,\n","        \"end_line\": end_line,\n","        \"true_label\": true_label,\n","        \"predicted_label\": predicted_label,\n","        \"original_probability\": float(top_row[\"original_probability\"]),\n","        \"top_event_position\": int(top_row[\"event_position\"]),\n","        \"top_event_importance_drop\": float(top_row[\"importance_drop\"]),\n","        \"top_event_masked_probability\": float(top_row[\"masked_probability\"]),\n","    })\n","\n","    # Add metadata per event.\n","    for _, row in exp_df.iterrows():\n","        event_position = int(row[\"event_position\"])\n","        line_number = start_line + event_position - 1\n","\n","        meta = metadata_df.iloc[line_number]\n","        local_rows.append({\n","            \"sequence_local_test_index\": local_idx,\n","            \"start_line\": start_line,\n","            \"end_line\": end_line,\n","            \"event_position\": event_position,\n","            \"line_index\": int(meta[\"line_index\"]),\n","            \"true_label\": true_label,\n","            \"predicted_label\": predicted_label,\n","            \"original_probability\": float(row[\"original_probability\"]),\n","            \"masked_probability\": float(row[\"masked_probability\"]),\n","            \"importance_drop\": float(row[\"importance_drop\"]),\n","            \"original_event_id\": int(row[\"original_event_id\"]),\n","            \"raw_label\": meta[\"raw_label\"],\n","            \"line_label\": int(meta[\"label\"]),\n","            \"full_time\": meta[\"full_time\"],\n","            \"node\": meta[\"node\"],\n","            \"source\": meta[\"source\"],\n","            \"component\": meta[\"component\"],\n","            \"severity\": meta[\"severity\"],\n","            \"event_message\": meta[\"event_message\"],\n","            \"model_text_norm\": meta[\"model_text_norm\"],\n","        })\n","\n","local_xai_df = pd.DataFrame(local_rows)\n","faithfulness_df = pd.DataFrame(faithfulness_rows)\n","\n","local_xai_df.to_csv(XAI_LOCAL_PATH, index=False)\n","faithfulness_df.to_csv(XAI_FAITHFULNESS_PATH, index=False)\n","\n","print(\"Saved local XAI explanations to:\", XAI_LOCAL_PATH)\n","print(\"Saved faithfulness results to:\", XAI_FAITHFULNESS_PATH)\n","print(\"Local XAI rows:\", len(local_xai_df))\n","print(\"Faithfulness rows:\", len(faithfulness_df))\n","\n","display(local_xai_df.head(20))\n","display(faithfulness_df.head())\n"]},{"cell_type":"markdown","id":"43881c3f","metadata":{"id":"43881c3f"},"source":["## Step 21 — Global XAI summary\n","\n","The global summary aggregates the most influential events across many anomalous predictions.\n","\n","This helps answer:\n","\n","```text\n","Which components, severities, and message patterns most often drive anomaly decisions?\n","```"]},{"cell_type":"code","execution_count":24,"id":"36f0b01b","metadata":{"id":"36f0b01b","executionInfo":{"status":"ok","timestamp":1783280983898,"user_tz":-180,"elapsed":666,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"a6905ff2-75fd-4d4d-dbd5-a51fe0717b86"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved global XAI summary to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_global_summary.csv\n"]},{"output_type":"display_data","data":{"text/plain":["     component severity                                      event_message  \\\n","325    MONITOR  FAILURE  monitor caught java.lang.IllegalStateException...   \n","321    MONITOR  FAILURE                Temperature Over Limit on link card   \n","324    MONITOR  FAILURE  monitor caught java.lang.IllegalStateException...   \n","250     KERNEL    FATAL      idoproxy communication failure: socket closed   \n","183  BGLMASTER  FAILURE     ciodb exited abnormally due to signal: Aborted   \n","263     KERNEL    FATAL                            machine check interrupt   \n","296     KERNEL     INFO  ciod: Received signal 15, code=0, errno=0, add...   \n","319    MONITOR  FAILURE              Link PGOOD error latched on link card   \n","299     KERNEL     INFO  ciod: Received signal 15, code=0, errno=0, add...   \n","265     KERNEL    FATAL  machine check interrupt (bit=0x10): L2 dcache ...   \n","318    MONITOR  FAILURE  Hardware monitor caught java.net.SocketExcepti...   \n","262     KERNEL    FATAL                instruction plb error.............0   \n","215     KERNEL    FATAL  Power Good signal deactivated: R73-M1-N4. A se...   \n","206     KERNEL    FATAL  Power Good signal deactivated: R73-M1-N1. A se...   \n","213     KERNEL    FATAL  Power Good signal deactivated: R73-M1-N2. A se...   \n","297     KERNEL     INFO  ciod: Received signal 15, code=0, errno=0, add...   \n","233     KERNEL    FATAL                data read plb error...............0   \n","231     KERNEL    FATAL                           data TLB error interrupt   \n","267     KERNEL    FATAL  machine check interrupt (bit=0x1d): L2 dcache ...   \n","219     KERNEL    FATAL  Power Good signal deactivated: R73-M1-N8. A se...   \n","\n","     frequency  mean_importance  max_importance  mean_original_probability  \n","325         40     2.801418e-07    1.430511e-06                   0.999996  \n","321         25     2.162734e-03    1.497604e-02                   0.135839  \n","324         21     1.248859e-07    2.384186e-07                   0.999996  \n","250         15     4.701023e-01    9.999897e-01                   0.999996  \n","183         15     3.333304e-01    9.999897e-01                   0.999996  \n","263         14     9.999880e-01    9.999895e-01                   0.999996  \n","296         12     1.790368e-04    5.748123e-04                   0.210993  \n","319          7     3.371420e-04    4.786402e-04                   0.128181  \n","299          7     1.192093e-07    1.192093e-07                   0.999995  \n","265          6     6.666598e-01    9.999891e-01                   0.999996  \n","318          6     4.371007e-07    8.344650e-07                   0.999996  \n","262          6     1.192093e-07    1.192093e-07                   0.999996  \n","215          5     1.283062e-02    3.328049e-02                   0.077871  \n","206          5     2.107574e-03    3.289331e-03                   0.072901  \n","213          5     1.811462e-03    2.379924e-03                   0.072901  \n","297          5     8.789897e-05    4.390180e-04                   0.829379  \n","233          5     1.192093e-07    1.192093e-07                   0.999996  \n","231          4     9.999878e-01    9.999886e-01                   0.999996  \n","267          4     9.999866e-01    9.999892e-01                   0.999996  \n","219          4     1.542203e-02    5.376190e-02                   0.098871  "],"text/html":["\n","  <div id=\"df-55cf7cb6-9148-49e5-8e36-aa30048d0dcc\" class=\"colab-df-container\">\n","    <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>component</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","      <th>frequency</th>\n","      <th>mean_importance</th>\n","      <th>max_importance</th>\n","      <th>mean_original_probability</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>325</th>\n","      <td>MONITOR</td>\n","      <td>FAILURE</td>\n","      <td>monitor caught java.lang.IllegalStateException...</td>\n","      <td>40</td>\n","      <td>2.801418e-07</td>\n","      <td>1.430511e-06</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>321</th>\n","      <td>MONITOR</td>\n","      <td>FAILURE</td>\n","      <td>Temperature Over Limit on link card</td>\n","      <td>25</td>\n","      <td>2.162734e-03</td>\n","      <td>1.497604e-02</td>\n","      <td>0.135839</td>\n","    </tr>\n","    <tr>\n","      <th>324</th>\n","      <td>MONITOR</td>\n","      <td>FAILURE</td>\n","      <td>monitor caught java.lang.IllegalStateException...</td>\n","      <td>21</td>\n","      <td>1.248859e-07</td>\n","      <td>2.384186e-07</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>250</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>idoproxy communication failure: socket closed</td>\n","      <td>15</td>\n","      <td>4.701023e-01</td>\n","      <td>9.999897e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>183</th>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","      <td>15</td>\n","      <td>3.333304e-01</td>\n","      <td>9.999897e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>263</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>14</td>\n","      <td>9.999880e-01</td>\n","      <td>9.999895e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>296</th>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","      <td>12</td>\n","      <td>1.790368e-04</td>\n","      <td>5.748123e-04</td>\n","      <td>0.210993</td>\n","    </tr>\n","    <tr>\n","      <th>319</th>\n","      <td>MONITOR</td>\n","      <td>FAILURE</td>\n","      <td>Link PGOOD error latched on link card</td>\n","      <td>7</td>\n","      <td>3.371420e-04</td>\n","      <td>4.786402e-04</td>\n","      <td>0.128181</td>\n","    </tr>\n","    <tr>\n","      <th>299</th>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","      <td>7</td>\n","      <td>1.192093e-07</td>\n","      <td>1.192093e-07</td>\n","      <td>0.999995</td>\n","    </tr>\n","    <tr>\n","      <th>265</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x10): L2 dcache ...</td>\n","      <td>6</td>\n","      <td>6.666598e-01</td>\n","      <td>9.999891e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>318</th>\n","      <td>MONITOR</td>\n","      <td>FAILURE</td>\n","      <td>Hardware monitor caught java.net.SocketExcepti...</td>\n","      <td>6</td>\n","      <td>4.371007e-07</td>\n","      <td>8.344650e-07</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>262</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction plb error.............0</td>\n","      <td>6</td>\n","      <td>1.192093e-07</td>\n","      <td>1.192093e-07</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>215</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>Power Good signal deactivated: R73-M1-N4. A se...</td>\n","      <td>5</td>\n","      <td>1.283062e-02</td>\n","      <td>3.328049e-02</td>\n","      <td>0.077871</td>\n","    </tr>\n","    <tr>\n","      <th>206</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>Power Good signal deactivated: R73-M1-N1. A se...</td>\n","      <td>5</td>\n","      <td>2.107574e-03</td>\n","      <td>3.289331e-03</td>\n","      <td>0.072901</td>\n","    </tr>\n","    <tr>\n","      <th>213</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>Power Good signal deactivated: R73-M1-N2. A se...</td>\n","      <td>5</td>\n","      <td>1.811462e-03</td>\n","      <td>2.379924e-03</td>\n","      <td>0.072901</td>\n","    </tr>\n","    <tr>\n","      <th>297</th>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","      <td>5</td>\n","      <td>8.789897e-05</td>\n","      <td>4.390180e-04</td>\n","      <td>0.829379</td>\n","    </tr>\n","    <tr>\n","      <th>233</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data read plb error...............0</td>\n","      <td>5</td>\n","      <td>1.192093e-07</td>\n","      <td>1.192093e-07</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>231</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data TLB error interrupt</td>\n","      <td>4</td>\n","      <td>9.999878e-01</td>\n","      <td>9.999886e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>267</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x1d): L2 dcache ...</td>\n","      <td>4</td>\n","      <td>9.999866e-01</td>\n","      <td>9.999892e-01</td>\n","      <td>0.999996</td>\n","    </tr>\n","    <tr>\n","      <th>219</th>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>Power Good signal deactivated: R73-M1-N8. A se...</td>\n","      <td>4</td>\n","      <td>1.542203e-02</td>\n","      <td>5.376190e-02</td>\n","      <td>0.098871</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-55cf7cb6-9148-49e5-8e36-aa30048d0dcc')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-55cf7cb6-9148-49e5-8e36-aa30048d0dcc button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-55cf7cb6-9148-49e5-8e36-aa30048d0dcc');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"    print(\\\"No faithfulness rows available\",\n  \"rows\": 20,\n  \"fields\": [\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"MONITOR\",\n          \"KERNEL\",\n          \"BGLMASTER\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"FAILURE\",\n          \"FATAL\",\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 20,\n        \"samples\": [\n          \"monitor caught java.lang.IllegalStateException: while executing I2C Operation caught java.net.SocketException: Broken pipe and is stopping\",\n          \"data TLB error interrupt\",\n          \"ciod: Received signal 15, code=0, errno=0, address=0x000001b3\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"frequency\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 9,\n        \"min\": 4,\n        \"max\": 40,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          5,\n          25,\n          12\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"mean_importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3812811830006365,\n        \"min\": 1.1920928955078125e-07,\n        \"max\": 0.9999879620894002,\n        \"num_unique_values\": 18,\n        \"samples\": [\n          2.8014183044433595e-07,\n          0.0021627336740493775,\n          1.1920928955078125e-07\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"max_importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4666816972423858,\n        \"min\": 1.1920928955078125e-07,\n        \"max\": 0.9999897194425102,\n        \"num_unique_values\": 18,\n        \"samples\": [\n          1.430511474609375e-06,\n          0.01497603952884674,\n          1.1920928955078125e-07\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"mean_original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.42975123015499717,\n        \"min\": 0.07290121614933014,\n        \"max\": 0.999995794892311,\n        \"num_unique_values\": 18,\n        \"samples\": [\n          0.999995794892311,\n          0.13583919107913972,\n          0.9999954700469971\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Faithfulness summary\n"]},{"output_type":"display_data","data":{"text/plain":["       top_event_importance_drop\n","count               1.400000e+02\n","mean                3.316054e-01\n","std                 4.693754e-01\n","min                 0.000000e+00\n","25%                 6.854534e-07\n","50%                 3.118140e-06\n","75%                 9.999863e-01\n","max                 9.999897e-01"],"text/html":["\n","  <div id=\"df-517d362f-ff69-4505-a778-c643ecb9ccff\" class=\"colab-df-container\">\n","    <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>top_event_importance_drop</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>count</th>\n","      <td>1.400000e+02</td>\n","    </tr>\n","    <tr>\n","      <th>mean</th>\n","      <td>3.316054e-01</td>\n","    </tr>\n","    <tr>\n","      <th>std</th>\n","      <td>4.693754e-01</td>\n","    </tr>\n","    <tr>\n","      <th>min</th>\n","      <td>0.000000e+00</td>\n","    </tr>\n","    <tr>\n","      <th>25%</th>\n","      <td>6.854534e-07</td>\n","    </tr>\n","    <tr>\n","      <th>50%</th>\n","      <td>3.118140e-06</td>\n","    </tr>\n","    <tr>\n","      <th>75%</th>\n","      <td>9.999863e-01</td>\n","    </tr>\n","    <tr>\n","      <th>max</th>\n","      <td>9.999897e-01</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-517d362f-ff69-4505-a778-c643ecb9ccff')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-517d362f-ff69-4505-a778-c643ecb9ccff button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-517d362f-ff69-4505-a778-c643ecb9ccff');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"    print(\\\"No faithfulness rows available\",\n  \"rows\": 8,\n  \"fields\": [\n    {\n      \"column\": \"top_event_importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 49.357755116915996,\n        \"min\": 0.0,\n        \"max\": 140.0,\n        \"num_unique_values\": 8,\n        \"samples\": [\n          0.3316053837158149,\n          3.118139829894062e-06,\n          140.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Global XAI summary\n","# ============================================================\n","# Focus on positive importance only. Negative values mean masking increased probability.\n","positive_xai = local_xai_df[local_xai_df[\"importance_drop\"] > 0].copy()\n","\n","if len(positive_xai) == 0:\n","    print(\"No positive importance scores found. Global summary will be empty.\")\n","    global_summary_df = pd.DataFrame()\n","else:\n","    global_summary_df = (\n","        positive_xai\n","        .groupby([\"component\", \"severity\", \"event_message\"], dropna=False)\n","        .agg(\n","            frequency=(\"event_message\", \"count\"),\n","            mean_importance=(\"importance_drop\", \"mean\"),\n","            max_importance=(\"importance_drop\", \"max\"),\n","            mean_original_probability=(\"original_probability\", \"mean\"),\n","        )\n","        .reset_index()\n","        .sort_values([\"frequency\", \"mean_importance\"], ascending=[False, False])\n","    )\n","\n","global_summary_df.to_csv(XAI_GLOBAL_PATH, index=False)\n","\n","print(\"Saved global XAI summary to:\", XAI_GLOBAL_PATH)\n","display(global_summary_df.head(20))\n","\n","print(\"\\nFaithfulness summary\")\n","if len(faithfulness_df) > 0:\n","    display(faithfulness_df[[\"top_event_importance_drop\"]].describe())\n","else:\n","    print(\"No faithfulness rows available.\")\n"]},{"cell_type":"markdown","id":"a09ef43c","metadata":{"id":"a09ef43c"},"source":["## Step 22 — XAI case study\n","\n","This step extracts one clear anomaly case and ranks the ten events by importance.\n","\n","Use this table in the thesis to show a local explanation example."]},{"cell_type":"code","execution_count":25,"id":"a7eaaee8","metadata":{"id":"a7eaaee8","executionInfo":{"status":"ok","timestamp":1783280984383,"user_tz":-180,"elapsed":482,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":918},"outputId":"d46bd865-b157-4f6f-ab64-8d33f990921f"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved XAI case study to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_case_study.csv\n","Case study sequence local test index: 40735\n"]},{"output_type":"display_data","data":{"text/plain":["   importance_rank  event_position  importance_drop  original_probability  \\\n","0                1              10         0.999987              0.999996   \n","1                2               1         0.000000              0.999996   \n","2                3               2         0.000000              0.999996   \n","3                4               3         0.000000              0.999996   \n","4                5               5         0.000000              0.999996   \n","5                6               4         0.000000              0.999996   \n","6                7               6         0.000000              0.999996   \n","7                8               7         0.000000              0.999996   \n","8                9               8         0.000000              0.999996   \n","9               10               9         0.000000              0.999996   \n","\n","   masked_probability                   full_time                 node  \\\n","0            0.000009  2005-11-16-04.28.19.059020  R44-M1-N7-C:J02-U11   \n","1            0.999996  2005-11-15-23.50.59.129341  R52-M0-NC-I:J18-U11   \n","2            0.999996  2005-11-15-23.50.59.152914  R52-M0-NC-I:J18-U01   \n","3            0.999996  2005-11-15-23.50.59.176578  R52-M0-N4-I:J18-U11   \n","4            0.999996  2005-11-15-23.50.59.230469  R52-M0-N8-I:J18-U11   \n","5            0.999996  2005-11-15-23.50.59.200558  R52-M0-N4-I:J18-U01   \n","6            0.999996  2005-11-15-23.50.59.259949  R52-M0-N8-I:J18-U01   \n","7            0.999996  2005-11-15-23.50.59.284077  R52-M0-N0-I:J18-U11   \n","8            0.999996  2005-11-15-23.50.59.314055  R52-M0-N0-I:J18-U01   \n","9            0.999996  2005-11-16-03.58.32.641155  R05-M1-N1-C:J10-U11   \n","\n","  component severity raw_label  \\\n","0    KERNEL    FATAL    KERNMC   \n","1    KERNEL     INFO         -   \n","2    KERNEL     INFO         -   \n","3    KERNEL     INFO         -   \n","4    KERNEL     INFO         -   \n","5    KERNEL     INFO         -   \n","6    KERNEL     INFO         -   \n","7    KERNEL     INFO         -   \n","8    KERNEL     INFO         -   \n","9    KERNEL     INFO         -   \n","\n","                                       event_message  \n","0                            machine check interrupt  \n","1  ciod: generated 128 core files for program /g/...  \n","2  ciod: generated 128 core files for program /g/...  \n","3  ciod: generated 128 core files for program /g/...  \n","4  ciod: generated 128 core files for program /g/...  \n","5  ciod: generated 128 core files for program /g/...  \n","6  ciod: generated 128 core files for program /g/...  \n","7  ciod: generated 128 core files for program /g/...  \n","8  ciod: generated 128 core files for program /g/...  \n","9  data cache flush parity error detected. attemp...  "],"text/html":["\n","  <div id=\"df-2704b27c-4387-404a-ba21-9679d97d9df8\" class=\"colab-df-container\">\n","    <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>importance_rank</th>\n","      <th>event_position</th>\n","      <th>importance_drop</th>\n","      <th>original_probability</th>\n","      <th>masked_probability</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>raw_label</th>\n","      <th>event_message</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>10</td>\n","      <td>0.999987</td>\n","      <td>0.999996</td>\n","      <td>0.000009</td>\n","      <td>2005-11-16-04.28.19.059020</td>\n","      <td>R44-M1-N7-C:J02-U11</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>KERNMC</td>\n","      <td>machine check interrupt</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.129341</td>\n","      <td>R52-M0-NC-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>2</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.152914</td>\n","      <td>R52-M0-NC-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>3</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.176578</td>\n","      <td>R52-M0-N4-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>5</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.230469</td>\n","      <td>R52-M0-N8-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>6</td>\n","      <td>4</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.200558</td>\n","      <td>R52-M0-N4-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>7</td>\n","      <td>6</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.259949</td>\n","      <td>R52-M0-N8-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>8</td>\n","      <td>7</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.284077</td>\n","      <td>R52-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>9</td>\n","      <td>8</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-15-23.50.59.314055</td>\n","      <td>R52-M0-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: generated 128 core files for program /g/...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>10</td>\n","      <td>9</td>\n","      <td>0.000000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-16-03.58.32.641155</td>\n","      <td>R05-M1-N1-C:J10-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>data cache flush parity error detected. attemp...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-2704b27c-4387-404a-ba21-9679d97d9df8')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-2704b27c-4387-404a-ba21-9679d97d9df8 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-2704b27c-4387-404a-ba21-9679d97d9df8');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"    print(\\\"No true-positive anomaly candidates found\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"importance_rank\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          8,\n          1,\n          4\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162235909200338,\n        \"min\": 0.0,\n        \"max\": 0.999986797184647,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          0.999986797184647\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162235909200338,\n        \"min\": 9.030490218719933e-06,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"2005-11-15-23.50.59.314055\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"R52-M0-N0-I:J18-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 1,\n        \"samples\": [\n          \"KERNEL\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"machine check interrupt\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Save one thesis-friendly XAI case study\n","# ============================================================\n","if len(tp_candidates) > 0:\n","    # Use highest-probability true-positive anomaly as the case study.\n","    case_local_idx = int(tp_candidates.iloc[0][\"sequence_local_test_index\"])\n","    case_df = local_xai_df[local_xai_df[\"sequence_local_test_index\"] == case_local_idx].copy()\n","    case_df = case_df.sort_values(\"importance_drop\", ascending=False).reset_index(drop=True)\n","    case_df.insert(0, \"importance_rank\", np.arange(1, len(case_df) + 1))\n","\n","    case_df.to_csv(XAI_CASE_STUDY_PATH, index=False)\n","    print(\"Saved XAI case study to:\", XAI_CASE_STUDY_PATH)\n","    print(\"Case study sequence local test index:\", case_local_idx)\n","    display(case_df[[\n","        \"importance_rank\", \"event_position\", \"importance_drop\",\n","        \"original_probability\", \"masked_probability\", \"full_time\", \"node\",\n","        \"component\", \"severity\", \"raw_label\", \"event_message\"\n","    ]])\n","else:\n","    print(\"No true-positive anomaly candidates found. Cannot create a TP case study.\")\n"]},{"cell_type":"markdown","id":"11775798","metadata":{"id":"11775798"},"source":["## Step 23 — Optional visualization for one local explanation\n","\n","The bar chart shows the importance of each event in the selected 10-line sequence.\n","\n","Higher bars mean the event contributed more strongly to the anomaly prediction."]},{"cell_type":"code","execution_count":26,"id":"ba441595","metadata":{"id":"ba441595","executionInfo":{"status":"ok","timestamp":1783280984618,"user_tz":-180,"elapsed":228,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":407},"outputId":"b59776c8-8908-46a6-c151-72980e84747b"},"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x400 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA90AAAGGCAYAAABmGOKbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUbpJREFUeJzt3Xl8TPf+x/H3CFkkEjQSoSG2KmprlMbeSqW22sXSirWbPeVertq6iCqqm621VUu5FC1KNbXUvqa171tbQpBFkJCc3x+9mV9HEjKRYxp9PR+PeTzM93zPOZ9zZibmPd+zWAzDMAQAAAAAAHJcHkcXAAAAAADAw4rQDQAAAACASQjdAAAAAACYhNANAAAAAIBJCN0AAAAAAJiE0A0AAAAAgEkI3QAAAAAAmITQDQAAAACASQjdAAAAAACYhNANAA+pOXPmyGKx6PTp03bPu379elksFq1fvz7H68Lfm8Vi0ejRox1dxl0FBASoW7dupi0/N+yDnNawYUM1bNjQ0WXck9mvPQCYgdANAFmUFmJ37dr1QNfbsGFDWSwWlStXLsPpa9eulcVikcVi0eLFi02ro1u3bvLw8Lhrn7R9ZLFYtGnTpnTTDcOQv7+/LBaLmjdvfs91pm17Ro/HH38829uSk6ZMmaI5c+Zkub+j3kdmuHz5soYMGaLy5cvL1dVVhQsXVkhIiFasWOHo0nKl0aNHZ/p+t1gsunDhgqNLfCC2bNmi0aNHKzY21tGlAECOyOvoAgAA9+bq6qrjx49rx44dqlmzps20r776Sq6urrp586ZN+0svvaSOHTvKxcXF7vXVr19fN27ckLOzc7brnT9/vurWrWvTvmHDBv3222921fToo48qIiIiXbuXl1e2astpU6ZMkbe39z9u9O3IkSNq1KiRLl26pO7du6tGjRqKjY3VV199pRYtWmjw4MF6//33HV1mtty4cUN58zruK9LUqVMz/IGrYMGCD74YB9iyZYvGjBmjbt26pdvmI0eOKE8exowA5C6EbgDIBcqUKaPbt29rwYIFNqH75s2bWrp0qZo1a6YlS5bYzOPk5CQnJ6dsrS9PnjxydXXNdr1NmzbVf//7X3300Uc24WX+/PkKDAxUTExMlpfl5eWlF198Mdu1IOfdunVL7dq109WrV7Vx40bVqlXLOm3QoEHq0qWLJkyYoBo1aig0NNSBlWbP/bz3c0K7du3k7e3t0Br+rrLzIyIAOBo/FQJADtu7d6+aNGkiT09PeXh4qFGjRtq2bVu6fr/++qsaNGggNzc3Pfroo3rnnXc0e/bsTM/D7tSpkxYuXKjU1FRr23fffafr16+rQ4cO6fpndE53QECAmjdvrk2bNqlmzZpydXVV6dKl9cUXX9jMe7/ndHfq1EmXL1/W2rVrrW3JyclavHixOnfunK1lZmbx4sWyWCzasGFDumnTp0+XxWLR/v37rW2HDx9Wu3btVLhwYbm6uqpGjRr69ttvbeZL23ebN29WeHi4ihQpInd3d7Vu3VqXLl2y9gsICNCBAwe0YcMG6yHAOXVe7O+//64ePXrI19dXLi4uqlSpkmbNmmWdHh0drbx582rMmDHp5j1y5IgsFos++eQTa1tsbKwGDhwof39/ubi4qGzZsnrvvfds3k9ZtWTJEu3fv19Dhw61CdzSnz/2TJ8+XQULFkx3XvTNmzc1evRoPfbYY3J1dZWfn5/atGmjEydOWPukpqbqww8/VOXKleXq6qoiRYro+eefv+vh+GmHZd8po8/Arl27FBISIm9vb7m5ualUqVLq0aOHzXwZndOdlc91Vt839yssLEyurq46dOiQTXtISIgKFSqkP/74w6aejRs36pVXXtEjjzwiT09Pde3aVVevXr3rOpKTkzVy5EgFBgbKy8tL7u7uqlevntatW2fT7/Tp07JYLJowYYJmzJihMmXKyMXFRU899ZR27txp0/fXX39Vt27dVLp0abm6uqpo0aLq0aOHLl++bO0zevRoDRkyRJJUqlQp6+cq7TXM6JzukydPqn379ipcuLDy58+vp59+WitXrrTpk/Y3bdGiRXr33Xf16KOPytXVVY0aNdLx48fvvsMB4D4x0g0AOejAgQOqV6+ePD099a9//Uv58uXT9OnT1bBhQ23YsMEaUH7//Xc988wzslgsGjZsmNzd3fX555/fdRSnc+fOGj16tNavX69nn31W0p8jx40aNZKPj0+Wazx+/LjatWunnj17KiwsTLNmzVK3bt0UGBioSpUq3d8O+J+AgAAFBQVpwYIFatKkiSTp+++/V1xcnDp27KiPPvooy8tKSUnJcGTczc1N7u7uatasmTw8PLRo0SI1aNDAps/ChQtVqVIlPfHEE5L+fH3q1Kmj4sWLa+jQoXJ3d9eiRYvUqlUrLVmyRK1bt7aZv1+/fipUqJBGjRql06dPa/Lkyerbt68WLlwoSZo8ebL69esnDw8PDR8+XJLk6+ub9R2ViejoaD399NOyWCzq27evihQpou+//149e/ZUfHy8Bg4cKF9fXzVo0ECLFi3SqFGj0m23k5OT2rdvL0m6fv26GjRooN9//12vvPKKSpQooS1btmjYsGE6f/68Jk+ebFd93333nSSpa9euGU738vJSy5YtNXfuXB0/flxly5ZVSkqKmjdvrsjISHXs2FEDBgxQQkKC1q5dq/3796tMmTKSpJ49e2rOnDlq0qSJevXqpdu3b+vnn3/Wtm3bVKNGDTv3pK2LFy+qcePGKlKkiIYOHaqCBQvq9OnT+uabb+46X1Y/12nu9b65lytXrqRry5s3r/VQ6w8//FA//fSTwsLCtHXrVusPHT/88IPmzZunYsWK2czbt29f648gR44c0dSpU3XmzBlrEM1IfHy8Pv/8c3Xq1Em9e/dWQkKCZs6cqZCQEO3YsUPVqlWz6T9//nwlJCTolVdekcVi0fjx49WmTRudPHlS+fLlk/Tn9SdOnjyp7t27q2jRojpw4IBmzJihAwcOaNu2bbJYLGrTpo2OHj2qBQsW6IMPPrCO+BcpUiTDOqOjo1W7dm1dv35d/fv31yOPPKK5c+fqhRde0OLFi9N9pseNG6c8efJo8ODBiouL0/jx49WlSxdt3779nq8LAGSbAQDIktmzZxuSjJ07d2bap1WrVoazs7Nx4sQJa9sff/xhFChQwKhfv761rV+/fobFYjH27t1rbbt8+bJRuHBhQ5Jx6tQpa3uDBg2MSpUqGYZhGDVq1DB69uxpGIZhXL161XB2djbmzp1rrFu3zpBk/Pe//01X71+XVbJkSUOSsXHjRmvbxYsXDRcXF+ONN96wtqUtb926dda2sLAww93dPcv76JNPPjEKFChgXL9+3TAMw2jfvr3xzDPPWOto1qzZXZeVtu2SMny88sor1n6dOnUyfHx8jNu3b1vbzp8/b+TJk8d46623rG2NGjUyKleubNy8edPalpqaatSuXdsoV65cuu0IDg42UlNTre2DBg0ynJycjNjYWGtbpUqVjAYNGtxzWzLaR5np2bOn4efnZ8TExNi0d+zY0fDy8rLu0+nTpxuSjH379tn0q1ixovHss89an7/99tuGu7u7cfToUZt+Q4cONZycnIyzZ89a2yQZo0aNuus2VKtWzfDy8rprn0mTJhmSjG+//dYwDMOYNWuWIcmYNGlSur5p+/inn34yJBn9+/fPtI9h/Pn+CQsLsz4fNWqUkdFXmjs/A0uXLr3nvjeM9Psgq59re943GUnbjowe5cuXt+m7Zs0aQ5LxzjvvGCdPnjQ8PDyMVq1aZbj9gYGBRnJysrV9/PjxhiRj+fLl1rYGDRrYvI9v375tJCUl2Szv6tWrhq+vr9GjRw9r26lTpwxJxiOPPGJcuXLF2r58+XJDkvHdd99Z29Let3+1YMGCdH+T3n///XR/u9Lc+doPHDjQkGT8/PPP1raEhASjVKlSRkBAgJGSkmIYxv//TatQoYLNdn344YcZfoYAICdxeDkA5JCUlBT98MMPatWqlUqXLm1t9/PzU+fOnbVp0ybFx8dLklavXq2goCCb0aLChQurS5cud11H586d9c0331gP1XZycko3knMvFStWVL169azPixQpovLly+vkyZN2LedeOnTooBs3bmjFihVKSEjQihUrsnVoeUBAgNauXZvuMXDgQGuf0NBQXbx40eZw+MWLFys1NdV6TvGVK1f0008/qUOHDkpISFBMTIxiYmJ0+fJlhYSE6NixY/r9999t1v3yyy/bjATWq1dPKSkpOnPmjN3bkVWGYWjJkiVq0aKFDMOw1hkTE6OQkBDFxcVpz549kqQ2bdoob968NiOo+/fv18GDB23Opf7vf/+revXqqVChQjbLCw4OVkpKijZu3GhXjQkJCSpQoMBd+6RNT3vPL1myRN7e3urXr1+6vmn7eMmSJbJYLOlG7v/a536kjRSvWLFCt27dytI89nyu09zv+2bJkiXp3u+zZ8+26dO4cWO98soreuutt9SmTRu5urpq+vTpGS7v5Zdfto42S9Jrr72mvHnzatWqVZnW4OTkZL2QYmpqqq5cuaLbt2+rRo0a1vffX4WGhqpQoUI22yzJ5u+Km5ub9d83b95UTEyMnn76aUnKcJlZsWrVKtWsWdPmoo0eHh56+eWXdfr0aR08eNCmf/fu3W0uEJlRnQCQ0zi8HAByyKVLl3T9+nWVL18+3bQKFSooNTVV586dU6VKlXTmzBkFBQWl61e2bNm7rqNjx44aPHiwvv/+e3311Vdq3rz5PcPPnUqUKJGurVChQvc8x9NeRYoUUXBwsObPn6/r168rJSVF7dq1s3s57u7uCg4Ovmuf559/Xl5eXlq4cKEaNWok6c9DrKtVq6bHHntM0p+H1RuGoREjRmjEiBEZLufixYsqXry49fmd+yotVNxrX6WkpKQ7h7dw4cJZuhr8pUuXFBsbqxkzZmjGjBmZ1ilJ3t7eatSokRYtWqS3335b0p/bnTdvXrVp08ba/9ixY/r1118zPUQ3bXlZVaBAgXteDC8hIcHaV5JOnDih8uXL3/Wq4CdOnFCxYsVUuHBhu+rJqgYNGqht27YaM2aMPvjgAzVs2FCtWrVS586dMz21w57PdZrsvm/S1K9fP0sXUpswYYKWL1+uqKgozZ8/P9PTTO683aCHh4f8/PwyvHbEX82dO1cTJ07U4cOHbX6kKFWqVLq+WdnmK1euaMyYMfr666/Tvefi4uLuWktmzpw5k+7wfunP1yZtetrpJVmtEwByGqEbAHIRPz8/NWzYUBMnTtTmzZvTXbE8KzK7orlhGPdbXjqdO3dW7969deHCBTVp0sS0Wx65uLioVatWWrp0qaZMmaLo6Ght3rxZY8eOtfZJu2DY4MGDFRISkuFy7vzRI7v76ty5c+mCybp167J0kbW0Ol988UWFhYVl2KdKlSrWf3fs2FHdu3dXVFSUqlWrpkWLFqlRo0Y2oS01NVXPPfec/vWvf2W4vLQfJrKqQoUKioqK0tmzZzP8EUf686JZ0p9HVpgts1HwlJSUdP0WL16sbdu26bvvvtOaNWvUo0cPTZw4Udu2bbvnfeiz6kF9xvbu3WsNr/v27VOnTp1ybNlffvmlunXrplatWmnIkCHy8fGRk5OTIiIibC58lyYr29yhQwdt2bJFQ4YMUbVq1eTh4aHU1FQ9//zz2bqgX3Y8yL9/AJCG0A0AOaRIkSLKnz+/jhw5km7a4cOHlSdPHvn7+0uSSpYsmeEVc7NyFd3OnTurV69eKliwoJo2bXr/hZuodevWeuWVV7Rt27YsX0Qqu0JDQzV37lxFRkbq0KFDMgzD5hDrtEOD8+XLd8+Rc3tkFPiKFi1qc+V2SapatWqWllekSBEVKFBAKSkpWaqzVatWeuWVV6z79+jRoxo2bJhNnzJlyujatWs5tt3NmzfXggUL9MUXX+jNN99MNz0+Pl7Lly/X448/bv0ho0yZMtq+fbtu3bplc6jznXWuWbNGV65csWu0O220MjY21uaHncwO53766af19NNP691339X8+fPVpUsXff311+rVq1e6vvZ8rh+kxMREde/eXRUrVlTt2rU1fvx4tW7dWk899VS6vseOHdMzzzxjfX7t2jWdP3/+rn8/Fi9erNKlS+ubb76xeY9ndOh/Vly9elWRkZEaM2aMRo4caVPbnew5laBkyZKZvjZp0wHA0TinGwByiJOTkxo3bqzly5fbHLYZHR2t+fPnq27duvL09JT05619tm7dqqioKGu/K1eu6Kuvvrrnetq1a6dRo0ZpypQpWTpc2ZE8PDw0depUjR49Wi1atDB1XcHBwSpcuLAWLlyohQsXqmbNmjajzT4+PmrYsKGmT5+u8+fPp5s/u7d0cnd3V2xsrE2bq6urgoODbR5/Pd/1bpycnNS2bVvrbbnuVWfBggUVEhKiRYsW6euvv5azs7NatWpl06dDhw7aunWr1qxZk255sbGxun37dpZqS9OuXTtVrFhR48aNS3crr9TUVL322mu6evWqTUBr27atYmJibG5jliZtlLFt27YyDCPD26DdbSQy7crnfz03PTExUXPnzrXpd/Xq1XTLSbuuQlJSUobLtudz/SD9+9//1tmzZzV37lxNmjRJAQEBCgsLy3A7ZsyYYXN4+NSpU3X79m3rnQUykjYi/Nf9tX37dm3dujVb9Wa0PEkZXjnf3d1dktJ9rjLStGlT7dixw6auxMREzZgxQwEBAQ/kSAsAuBdGugHATrNmzdLq1avTtQ8YMEDvvPOO1q5dq7p16+r1119X3rx5NX36dCUlJWn8+PHWvv/617/05Zdf6rnnnlO/fv2stwwrUaKErly5cteRHi8vr3T3EH5Qbt26pXfeeSdde+HChfX6669nOE9mh0hnVVxcnL788ssMp7344ovWf+fLl09t2rTR119/rcTERE2YMCFd/08//VR169ZV5cqV1bt3b5UuXVrR0dHaunWrfvvtN/3yyy921xcYGKipU6fqnXfeUdmyZeXj42O9pdvd3O19NG7cOK1bt061atVS7969VbFiRV25ckV79uzRjz/+mO6WUqGhoXrxxRc1ZcoUhYSEpDuMf8iQIfr222/VvHlz6+3hEhMTtW/fPi1evFinT5/O0jnEaZydnbV48WI1atRIdevWVffu3VWjRg3FxsZq/vz52rNnj9544w117NjROk/Xrl31xRdfKDw8XDt27FC9evWU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UJC+//57R5f1UBk3bpwsFosGDhzo6FJytdGjR8tisdg8Hn/8cUeXlev9/vvvevHFF/XII4/Izc1NlStX1q5duxxdVq4VEBCQ7n1qsVjUp08fR5eWa6WkpGjEiBEqVaqU3NzcVKZMGb399tvikkr3JyEhQQMHDlTJkiXl5uam2rVra+fOnY4uK1e513d9wzA0cuRI+fn5yc3NTcHBwTp27Jhjin0IELqRocTERFWtWlWffvqpo0t5aGzYsEF9+vTRtm3btHbtWt26dUuNGzdWYmKio0vLtR599FGNGzdOu3fv1q5du/Tss8+qZcuWOnDggKNLeyjs3LlT06dPV5UqVRxdykOhUqVKOn/+vPWxadMmR5eUq129elV16tRRvnz59P333+vgwYOaOHGiChUq5OjScq2dO3favEfXrl0rSdwx5j689957mjp1qj755BMdOnRI7733nsaPH6+PP/7Y0aXlar169dLatWs1b9487du3T40bN1ZwcLB+//13R5eWa9zru/748eP10Ucfadq0adq+fbvc3d0VEhKimzdvPuBKHw5cvRz3ZLFYtHTpUrVq1crRpTxULl26JB8fH23YsEH169d3dDkPjcKFC+v9999Xz549HV1Krnbt2jU9+eSTmjJlit555x1Vq1ZNkydPdnRZudbo0aO1bNkyRUVFObqUh8bQoUO1efNm/fzzz44u5aE1cOBArVixQseOHZPFYnF0OblS8+bN5evrq5kzZ1rb2rZtKzc3N3355ZcOrCz3unHjhgoUKKDly5erWbNm1vbAwEA1adJE77zzjgOry53u/K5vGIaKFSumN954Q4MHD5YkxcXFydfXV3PmzFHHjh0dWG3uxEg34CBxcXGS/gyJuH8pKSn6+uuvlZiYqKCgIEeXk+v16dNHzZo1U3BwsKNLeWgcO3ZMxYoVU+nSpdWlSxedPXvW0SXlat9++61q1Kih9u3by8fHR9WrV9dnn33m6LIeGsnJyfryyy/Vo0cPAvd9qF27tiIjI3X06FFJ0i+//KJNmzapSZMmDq4s97p9+7ZSUlLk6upq0+7m5sYRRDnk1KlTunDhgs13AC8vL9WqVUtbt251YGW5V15HFwD8E6WmpmrgwIGqU6eOnnjiCUeXk6vt27dPQUFBunnzpjw8PLR06VJVrFjR0WXlal9//bX27NnD+XE5qFatWpozZ47K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Te1Xr1616degQQNjwIABhmEYxtGjRw1JxubNm63TY2JiDDc3N2PRokWGYRjG7NmzDUnG8ePHrX0+/fRTw9fXN9NtvXPd2VnGX2W2j5977jnj5Zdftmk7cOCAIck4ePBgpsv76z4wDMMoWbKk8cEHH1ifSzLefPNN6/Nr164Zkozvv//eMAzDePvtt43GjRvbLPPcuXOGJOPIkSMZrrNy5crG6NGjM5x2r+UlJCQYzs7O1tfEMAzj8uXLhpubm812SDKWLl1qsxwvLy9j9uzZhmEYxrx584zy5csbqamp1ulJSUmGm5ubsWbNGsMw/nyflixZ0rh9+7a1T/v27a2fmyNHjhiSjLVr12ZrWwAADw7ndAMA7tszzzyjqVOn2rSlnbOcN29edejQQV999ZVeeuklJSYmavny5fr6668lScePH9f169f13HPP2cyfnJys6tWr27RVqVLF+m8/Pz9J0sWLF1WiRAm76q1atary589vfR4UFKRr167p3LlziouL061bt1SnTh3r9Hz58qlmzZo6dOiQJOm1115T27ZttWfPHjVu3FitWrVS7dq17arhrw4dOqS8efOqVq1a1rZHHnlE5cuXt65TkvLnz68yZcpYn/v5+enixYt2rSsnlmGvn3/+WU2aNLE+nz59urp06ZKlef/6mru7u8vT09Na7y+//KJ169ZZR3f/6sSJE3rsscfStffv31+vvfaafvjhBwUHB6tt27bWddxreTdu3FBycrLN61S4cGGVL18+S9uS5pdfftHx48dVoEABm/abN2/qxIkT1ueVKlWSk5OT9bmfn5/27dsnSYqKipKTk5MaNGiQ6Trs3TcAAHMQugEA983d3V1ly5bNdHqXLl3UoEEDXbx4UWvXrpWbm5v16uZph52vXLlSxYsXt5nvzoux5cuXz/pvi8Ui6c/zwR+0Jk2a6MyZM1q1apXWrl2rRo0aqU+fPpowYYKp6/3r9kt/7gPDMB74Mu5UtGhRRUdH27SlPS9atKgCAgJsbqHm6+ub5WVnVG/aa37t2jW1aNFC7733Xrr50n6UuVOvXr0UEhKilStX6ocfflBERIQmTpyofv363XN5x48fz1LNGe3Tv54mcO3aNQUGBuqrr75KN+9fLyZ3t213c3O7aw3Z2TcAAHMQugEApqtdu7b8/f21cOFCff/992rfvr01UFSsWFEuLi46e/ZspqN2WeHs7KyUlJQs9f3ll19048YNa3DZtm2bPDw85O/vL29vbzk7O2vz5s0qWbKkpD8D086dO20ullWkSBGFhYUpLCxM9erV05AhQzIM3WnnOd+ttgoVKuj27dvavn27dcT88uXLOnLkiCpWrJilbXKkoKAgDR8+XLdu3bK+rmvXrlX58uWtF9S7248y2fXkk09qyZIlCggIUN68Wf9K4+/vr1dffVWvvvqqhg0bps8++0z9+vW75/LKlCmjfPnyafv27dajK65evaqjR4/avHeLFClic3G6Y8eO6fr16zZ1L1y4UD4+PvL09MzOpqty5cpKTU3Vhg0bFBwcnG56dvcNACDncSE1AMB9S0pK0oULF2wed14luXPnzpo2bZrWrl1rc2hxgQIFNHjwYA0aNEhz587ViRMntGfPHn388ceaO3dulmsICAjQqVOnFBUVpZiYGCUlJWXaNzk5WT179tTBgwe1atUqjRo1Sn379lWePHnk7u6u1157TUOGDNHq1at18OBB9e7dW9evX1fPnj0lSSNHjtTy5ct1/PhxHThwQCtWrFCFChUyXFfJkiVlsVi0YsUKXbp0yeaCcmnKlSunli1bqnfv3tq0aZN++eUXvfjiiypevLhatmyZ5X1gluPHjysqKkoXLlzQjRs3FBUVpaioKOtFvzp37ixnZ2f17NlTBw4c0MKFC/Xhhx8qPDzc1Lr69OmjK1euqFOnTtq5c6dOnDihNWvWqHv37pn+yDFw4ECtWbNGp06d0p49e7Ru3Trra3ev5Xl4eKhnz54aMmSIfvrpJ+3fv1/dunVTnjy2X6eeffZZffLJJ9q7d6927dqlV1991WbUukuXLvL29lbLli31888/69SpU1q/fr369++v3377LUvbHhAQoLCwMPXo0UPLli2zLmPRokXZ3jcAAHMQugEA92316tXy8/OzedStW9emT5cuXXTw4EEVL17c5nxpSXr77bc1YsQIRUREqEKFCnr++ee1cuVKlSpVKss1tG3bVs8//7yeeeYZFSlSRAsWLMi0b6NGjVSuXDnVr19foaGheuGFFzR69Gjr9HHjxqlt27Z66aWX9OSTT+r48eNas2aNddTW2dlZw4YNU5UqVVS/fn05OTlZz1G/U/HixTVmzBgNHTpUvr6+6tu3b4b9Zs+ercDAQDVv3lxBQUEyDEOrVq1Kd4ixI/Tq1UvVq1fX9OnTdfToUVWvXl3Vq1fXH3/8IUny8vLSDz/8oFOnTikwMFBvvPGGRo4cadc9urOjWLFi2rx5s1JSUtS4cWNVrlxZAwcOVMGCBdMF4TQpKSnq06eP9X322GOPacqUKVle3vvvv6969eqpRYsWCg4OVt26dRUYGGizjokTJ8rf31/16tVT586dNXjwYJtrCOTPn18bN25UiRIl1KZNG1WoUEE9e/bUzZs37Rr5njp1qtq1a6fXX39djz/+uHr37q3ExMRs7xsAgDksxv2eyAUAQC7SrVs3xcbGpruPMpBdDRs2VLVq1WzuMQ4AQBp+6gQAAAAAwCSEbgAAAAAATMLh5QAAAAAAmISRbgAAAAAATELoBgAAAADAJIRuAAAAAABMQugGAAAAAMAkhG4AAAAAAExC6AYAAAAAwCSEbgAAAAAATELoBgAAAADAJIRuAAAAAABM8n+WDFKktvgHsAAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# Optional visualization: event importance for the case study.\n","# This cell is safe to skip if you only need CSV outputs.\n","\n","if \"case_df\" in globals() and len(case_df) > 0:\n","    import matplotlib.pyplot as plt\n","\n","    plot_df = case_df.sort_values(\"event_position\")\n","\n","    plt.figure(figsize=(10, 4))\n","    plt.bar(plot_df[\"event_position\"].astype(str), plot_df[\"importance_drop\"])\n","    plt.xlabel(\"Event position in 10-line sequence\")\n","    plt.ylabel(\"Importance drop\")\n","    plt.title(\"LogMiniLM Event-Level Occlusion Explanation\")\n","    plt.tight_layout()\n","    plt.show()\n","else:\n","    print(\"No case_df available for plotting.\")\n"]},{"cell_type":"markdown","id":"0d4c1102","metadata":{"id":"0d4c1102"},"source":["## Step 24 — Thesis-ready XAI summary\n","\n","Run this cell to print a concise summary that can be copied into the thesis."]},{"cell_type":"code","execution_count":27,"id":"20d4a60e","metadata":{"id":"20d4a60e","executionInfo":{"status":"ok","timestamp":1783280984636,"user_tz":-180,"elapsed":17,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"ab9ecf8c-0166-44f9-ffaf-3b6f5b8d5a3f"},"outputs":[{"output_type":"stream","name":"stdout","text":["XAI method: Event-level occlusion-based explanation\n","Explained sequences: 140\n","Local XAI output: /content/drive/MyDrive/logminilm_cache/logminilm_xai_local_event_importance.csv\n","Global XAI output: /content/drive/MyDrive/logminilm_cache/logminilm_xai_global_summary.csv\n","Faithfulness output: /content/drive/MyDrive/logminilm_cache/logminilm_xai_faithfulness.csv\n","Case study output: /content/drive/MyDrive/logminilm_cache/logminilm_xai_case_study.csv\n","\n","Faithfulness scores based on top-event probability drop\n","Mean drop: 0.3316053837158149\n","Median drop: 3.118139829894062e-06\n","Max drop: 0.9999897194425102\n","\n","Thesis-ready wording:\n","Event-level occlusion-based explanation was applied to interpret LogMiniLM predictions.\n","For each predicted anomalous sequence, one log event was masked at a time using a common normal baseline event, and the anomaly probability was recalculated.\n","The importance of each event was measured as the decrease in anomaly probability after masking.\n","Events producing the largest probability drops were considered the most influential contributors to the anomaly decision.\n","The explanation was linked back to operational metadata, including timestamp, node, component, severity, and message content, to support human interpretation and incident investigation.\n","\n"]}],"source":["print(\"XAI method: Event-level occlusion-based explanation\")\n","print(\"Explained sequences:\", len(faithfulness_df))\n","print(\"Local XAI output:\", XAI_LOCAL_PATH)\n","print(\"Global XAI output:\", XAI_GLOBAL_PATH)\n","print(\"Faithfulness output:\", XAI_FAITHFULNESS_PATH)\n","print(\"Case study output:\", XAI_CASE_STUDY_PATH)\n","\n","if len(faithfulness_df) > 0:\n","    mean_drop = faithfulness_df[\"top_event_importance_drop\"].mean()\n","    median_drop = faithfulness_df[\"top_event_importance_drop\"].median()\n","    max_drop = faithfulness_df[\"top_event_importance_drop\"].max()\n","    print(\"\\nFaithfulness scores based on top-event probability drop\")\n","    print(\"Mean drop:\", mean_drop)\n","    print(\"Median drop:\", median_drop)\n","    print(\"Max drop:\", max_drop)\n","\n","print(\"\"\"\n","Thesis-ready wording:\n","Event-level occlusion-based explanation was applied to interpret LogMiniLM predictions.\n","For each predicted anomalous sequence, one log event was masked at a time using a common normal baseline event, and the anomaly probability was recalculated.\n","The importance of each event was measured as the decrease in anomaly probability after masking.\n","Events producing the largest probability drops were considered the most influential contributors to the anomaly decision.\n","The explanation was linked back to operational metadata, including timestamp, node, component, severity, and message content, to support human interpretation and incident investigation.\n","\"\"\")\n"]},{"cell_type":"markdown","id":"e8c9e2af","metadata":{"id":"e8c9e2af"},"source":["## Step 25 — Top-k occlusion faithfulness\n","\n","This step checks whether masking multiple important events gives stronger evidence than masking only the top event. It saves `logminilm_xai_topk_faithfulness.csv`."]},{"cell_type":"code","execution_count":28,"id":"495b9ebe","metadata":{"id":"495b9ebe","executionInfo":{"status":"ok","timestamp":1783280991156,"user_tz":-180,"elapsed":6523,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":223},"outputId":"e09501be-f310-4e2f-e8b1-9c4f166f3cd1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved top-k faithfulness to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_topk_faithfulness.csv\n"]},{"output_type":"display_data","data":{"text/plain":["   count      mean       std           min           25%       50%       75%  \\\n","k                                                                              \n","1  140.0  0.331605  0.469375  0.000000e+00  6.854534e-07  0.000003  0.999986   \n","2  140.0  0.332825  0.468646  0.000000e+00  7.152557e-07  0.000005  0.999987   \n","3  140.0  0.354907  0.475355  0.000000e+00  6.854534e-07  0.000008  0.999988   \n","5  140.0  0.369261  0.479473  1.192093e-07  9.536743e-07  0.000384  0.999987   \n","\n","       max  \n","k           \n","1  0.99999  \n","2  0.99999  \n","3  0.99999  \n","5  0.99999  "],"text/html":["\n","  <div id=\"df-41250f64-b524-4f4c-91b0-6f57edcf0013\" class=\"colab-df-container\">\n","    <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>count</th>\n","      <th>mean</th>\n","      <th>std</th>\n","      <th>min</th>\n","      <th>25%</th>\n","      <th>50%</th>\n","      <th>75%</th>\n","      <th>max</th>\n","    </tr>\n","    <tr>\n","      <th>k</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>1</th>\n","      <td>140.0</td>\n","      <td>0.331605</td>\n","      <td>0.469375</td>\n","      <td>0.000000e+00</td>\n","      <td>6.854534e-07</td>\n","      <td>0.000003</td>\n","      <td>0.999986</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>140.0</td>\n","      <td>0.332825</td>\n","      <td>0.468646</td>\n","      <td>0.000000e+00</td>\n","      <td>7.152557e-07</td>\n","      <td>0.000005</td>\n","      <td>0.999987</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>140.0</td>\n","      <td>0.354907</td>\n","      <td>0.475355</td>\n","      <td>0.000000e+00</td>\n","      <td>6.854534e-07</td>\n","      <td>0.000008</td>\n","      <td>0.999988</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>140.0</td>\n","      <td>0.369261</td>\n","      <td>0.479473</td>\n","      <td>1.192093e-07</td>\n","      <td>9.536743e-07</td>\n","      <td>0.000384</td>\n","      <td>0.999987</td>\n","      <td>0.99999</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-41250f64-b524-4f4c-91b0-6f57edcf0013')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-41250f64-b524-4f4c-91b0-6f57edcf0013 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-41250f64-b524-4f4c-91b0-6f57edcf0013');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \")\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"k\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 1,\n        \"max\": 5,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          2,\n          5,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"count\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 140.0,\n        \"max\": 140.0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          140.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"mean\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.018219979636622828,\n        \"min\": 0.3316053837158149,\n        \"max\": 0.3692606504189013,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.3328247273179711\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"std\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.005143345875040322,\n        \"min\": 0.46864560413891615,\n        \"max\": 0.47947299224136825,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.46864560413891615\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"min\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5.960464477539063e-08,\n        \"min\": 0.0,\n        \"max\": 1.1920928955078125e-07,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.1920928955078125e-07\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"25%\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.2990531157078367e-07,\n        \"min\": 6.854534149169922e-07,\n        \"max\": 9.5367431640625e-07,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          6.854534149169922e-07\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"50%\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.00018945745278090123,\n        \"min\": 3.118139829894062e-06,\n        \"max\": 0.0003842217524834268,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          4.706886329586268e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"75%\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 9.626191189310385e-07,\n        \"min\": 0.9999863317584641,\n        \"max\": 0.9999884223140043,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.9999865061081437\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"max\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8.690770415780243e-08,\n        \"min\": 0.9999897194425102,\n        \"max\": 0.9999898896849118,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.9999897243978921\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 25 — Top-k occlusion faithfulness\n","# ============================================================\n","\n","TOP_K_VALUES = [1, 2, 3, 5]\n","TOPK_FAITHFULNESS_PATH = CACHE_DIR / \"logminilm_xai_topk_faithfulness.csv\"\n","\n","topk_rows = []\n","\n","for _, cand in xai_candidates.iterrows():\n","\n","    local_idx = int(cand[\"sequence_local_test_index\"])\n","    start_line = int(cand[\"start_line\"])\n","    end_line = int(cand[\"end_line\"])\n","    true_label = int(cand[\"true_label\"])\n","    predicted_label = int(cand[\"predicted_label\"])\n","\n","    seq_event_ids = np.array(X_test[local_idx], dtype=np.int64)\n","\n","    exp_df = explain_sequence_by_occlusion(\n","        model,\n","        seq_event_ids,\n","        baseline_event_id\n","    )\n","\n","    original_prob = float(exp_df[\"original_probability\"].iloc[0])\n","\n","    ranked_positions = (\n","        exp_df\n","        .sort_values(\"importance_drop\", ascending=False)\n","        [\"event_position\"]\n","        .astype(int)\n","        .tolist()\n","    )\n","\n","    for k in TOP_K_VALUES:\n","\n","        masked_seq = seq_event_ids.copy()\n","\n","        for pos in ranked_positions[:k]:\n","            masked_seq[pos - 1] = baseline_event_id\n","\n","        masked_prob = predict_sequence_probability(model, masked_seq)\n","        probability_drop = original_prob - masked_prob\n","\n","        topk_rows.append({\n","            \"sequence_local_test_index\": local_idx,\n","            \"start_line\": start_line,\n","            \"end_line\": end_line,\n","            \"true_label\": true_label,\n","            \"predicted_label\": predicted_label,\n","            \"k\": k,\n","            \"original_probability\": original_prob,\n","            \"topk_masked_probability\": float(masked_prob),\n","            \"topk_probability_drop\": float(probability_drop),\n","        })\n","\n","topk_faithfulness_df = pd.DataFrame(topk_rows)\n","topk_faithfulness_df.to_csv(TOPK_FAITHFULNESS_PATH, index=False)\n","\n","print(\"Saved top-k faithfulness to:\", TOPK_FAITHFULNESS_PATH)\n","\n","display(\n","    topk_faithfulness_df\n","    .groupby(\"k\")[\"topk_probability_drop\"]\n","    .describe()\n",")\n"]},{"cell_type":"markdown","id":"ee0e88c2","metadata":{"id":"ee0e88c2"},"source":["## Step 26 — Select strongest XAI case study\n","\n","This step selects the sequence whose top event caused the largest anomaly probability drop."]},{"cell_type":"code","execution_count":29,"id":"c7036fd4","metadata":{"id":"c7036fd4","executionInfo":{"status":"ok","timestamp":1783280991179,"user_tz":-180,"elapsed":23,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"0fd2672e-cc17-4d54-bff9-4bce2840596a"},"outputs":[{"output_type":"stream","name":"stdout","text":["Selected strong XAI case study\n","Sequence local test index: 50689\n","Start line: 4277680\n","End line: 4277689\n","Original probability: 0.9999958276748657\n","Top event position: 1.0\n","Top event importance drop: 0.9999897194425102\n","Top event masked probability: 6.108232355472865e-06\n"]}],"source":["# ============================================================\n","# Step 26 — Select strongest XAI case study\n","# Select a sequence where the explanation is highly faithful\n","# ============================================================\n","\n","if len(faithfulness_df) == 0:\n","    raise ValueError(\"faithfulness_df is empty. Run Step 20 before this step.\")\n","\n","strong_case = faithfulness_df.sort_values(\n","    \"top_event_importance_drop\",\n","    ascending=False\n",").iloc[0]\n","\n","case_local_idx = int(strong_case[\"sequence_local_test_index\"])\n","case_start_line = int(strong_case[\"start_line\"])\n","case_end_line = int(strong_case[\"end_line\"])\n","\n","print(\"Selected strong XAI case study\")\n","print(\"Sequence local test index:\", case_local_idx)\n","print(\"Start line:\", case_start_line)\n","print(\"End line:\", case_end_line)\n","print(\"Original probability:\", strong_case[\"original_probability\"])\n","print(\"Top event position:\", strong_case[\"top_event_position\"])\n","print(\"Top event importance drop:\", strong_case[\"top_event_importance_drop\"])\n","print(\"Top event masked probability:\", strong_case[\"top_event_masked_probability\"])\n"]},{"cell_type":"markdown","id":"c1d70f67","metadata":{"id":"c1d70f67"},"source":["## Step 27 — Build thesis-ready strong case study table\n","\n","This step creates the full 10-event explanation table for the selected strong case."]},{"cell_type":"code","execution_count":30,"id":"75209c7b","metadata":{"id":"75209c7b","executionInfo":{"status":"ok","timestamp":1783280991573,"user_tz":-180,"elapsed":393,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"01f48397-6598-4541-8fc8-1d81815130ca"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved strong XAI case study to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_strong_case_study.csv\n"]},{"output_type":"display_data","data":{"text/plain":["   importance_rank  event_position  importance_drop  original_probability  \\\n","0                1               1          0.99999              0.999996   \n","1                2               2          0.00000              0.999996   \n","2                3               3          0.00000              0.999996   \n","3                4               4          0.00000              0.999996   \n","4                5               5          0.00000              0.999996   \n","5                6               6          0.00000              0.999996   \n","6                7               7          0.00000              0.999996   \n","7                8               8          0.00000              0.999996   \n","8                9               9          0.00000              0.999996   \n","9               10              10          0.00000              0.999996   \n","\n","   masked_probability                   full_time                 node  \\\n","0            0.000006  2005-11-29-18.25.57.724442                 NULL   \n","1            0.999996  2005-11-29-18.25.58.002310  R40-M0-N0-I:J18-U11   \n","2            0.999996  2005-11-29-18.25.58.230781  R20-M1-N0-I:J18-U11   \n","3            0.999996  2005-11-29-18.25.58.336082                 NULL   \n","4            0.999996  2005-11-29-18.25.58.395008  R20-M1-N0-I:J18-U01   \n","5            0.999996  2005-11-29-18.25.58.554821  R30-M0-N0-I:J18-U11   \n","6            0.999996  2005-11-29-18.25.58.755983  R30-M0-N0-I:J18-U01   \n","7            0.999996  2005-11-29-18.25.58.957316  R50-M1-N0-I:J18-U11   \n","8            0.999996  2005-11-29-18.25.59.160673  R50-M1-N0-I:J18-U01   \n","9            0.999996  2005-11-29-18.25.59.391256  R20-M1-N8-I:J18-U01   \n","\n","   component severity  raw_label  \\\n","0  BGLMASTER  FAILURE  MASABNORM   \n","1     KERNEL     INFO          -   \n","2     KERNEL     INFO          -   \n","3       MMCS     INFO          -   \n","4     KERNEL     INFO          -   \n","5     KERNEL     INFO          -   \n","6     KERNEL     INFO          -   \n","7     KERNEL     INFO          -   \n","8     KERNEL     INFO          -   \n","9     KERNEL     INFO          -   \n","\n","                                       event_message  \n","0     ciodb exited abnormally due to signal: Aborted  \n","1  ciod: Received signal 15, code=0, errno=0, add...  \n","2  ciod: Received signal 15, code=0, errno=0, add...  \n","3                          ciodb has been restarted.  \n","4  ciod: Received signal 15, code=0, errno=0, add...  \n","5  ciod: Received signal 15, code=0, errno=0, add...  \n","6  ciod: Received signal 15, code=0, errno=0, add...  \n","7  ciod: Received signal 15, code=0, errno=0, add...  \n","8  ciod: Received signal 15, code=0, errno=0, add...  \n","9  ciod: Received signal 15, code=0, errno=0, add...  "],"text/html":["\n","  <div id=\"df-020ee1b3-d5c8-45c8-b4e7-8d38ea42a78b\" class=\"colab-df-container\">\n","    <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>importance_rank</th>\n","      <th>event_position</th>\n","      <th>importance_drop</th>\n","      <th>original_probability</th>\n","      <th>masked_probability</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>raw_label</th>\n","      <th>event_message</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.99999</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.57.724442</td>\n","      <td>NULL</td>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>MASABNORM</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>2</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.002310</td>\n","      <td>R40-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>3</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.230781</td>\n","      <td>R20-M1-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>4</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.336082</td>\n","      <td>NULL</td>\n","      <td>MMCS</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciodb has been restarted.</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>5</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.395008</td>\n","      <td>R20-M1-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>6</td>\n","      <td>6</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.554821</td>\n","      <td>R30-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>7</td>\n","      <td>7</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.755983</td>\n","      <td>R30-M0-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>8</td>\n","      <td>8</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.957316</td>\n","      <td>R50-M1-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>9</td>\n","      <td>9</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.59.160673</td>\n","      <td>R50-M1-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.59.391256</td>\n","      <td>R20-M1-N8-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-020ee1b3-d5c8-45c8-b4e7-8d38ea42a78b')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-020ee1b3-d5c8-45c8-b4e7-8d38ea42a78b button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-020ee1b3-d5c8-45c8-b4e7-8d38ea42a78b');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_433626a1-c110-4ec6-840c-7d2c58822c7b\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('case_table')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_433626a1-c110-4ec6-840c-7d2c58822c7b button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('case_table');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"case_table","summary":"{\n  \"name\": \"case_table\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"importance_rank\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162245150191095,\n        \"min\": 0.0,\n        \"max\": 0.9999897194425102,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          0.9999897194425102\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.3162245150191095,\n        \"min\": 6.108232355472865e-06,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"2005-11-29-18.25.59.160673\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 9,\n        \"samples\": [\n          \"R50-M1-N0-I:J18-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"BGLMASTER\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"ciod: Received signal 15, code=0, errno=0, address=0x000001f5\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 27 — Build thesis-ready strong case study table\n","# ============================================================\n","\n","case_xai_df = local_xai_df[\n","    local_xai_df[\"sequence_local_test_index\"] == case_local_idx\n","].copy()\n","\n","if len(case_xai_df) == 0:\n","    raise ValueError(\"No local XAI rows found for case_local_idx. Check Step 20 output.\")\n","\n","case_xai_df = case_xai_df.sort_values(\n","    \"importance_drop\",\n","    ascending=False\n",").reset_index(drop=True)\n","\n","case_xai_df.insert(\n","    0,\n","    \"importance_rank\",\n","    range(1, len(case_xai_df) + 1)\n",")\n","\n","case_table = case_xai_df[[\n","    \"importance_rank\",\n","    \"event_position\",\n","    \"importance_drop\",\n","    \"original_probability\",\n","    \"masked_probability\",\n","    \"full_time\",\n","    \"node\",\n","    \"component\",\n","    \"severity\",\n","    \"raw_label\",\n","    \"event_message\"\n","]]\n","\n","CASE_STUDY_STRONG_PATH = CACHE_DIR / \"logminilm_xai_strong_case_study.csv\"\n","case_table.to_csv(CASE_STUDY_STRONG_PATH, index=False)\n","\n","print(\"Saved strong XAI case study to:\", CASE_STUDY_STRONG_PATH)\n","display(case_table)\n"]},{"cell_type":"markdown","id":"59fb76f6","metadata":{"id":"59fb76f6"},"source":["## Step 28 — Show top-5 influential events\n","\n","This is the shorter table that is usually best for the thesis."]},{"cell_type":"code","execution_count":31,"id":"0d66ead4","metadata":{"id":"0d66ead4","executionInfo":{"status":"ok","timestamp":1783280992056,"user_tz":-180,"elapsed":480,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":501},"outputId":"6caf94c3-c7ec-412e-90a3-392119e90d76"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved top-5 case study to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_strong_case_study_top5.csv\n"]},{"output_type":"display_data","data":{"text/plain":["   importance_rank  event_position  importance_drop  original_probability  \\\n","0                1               1          0.99999              0.999996   \n","1                2               2          0.00000              0.999996   \n","2                3               3          0.00000              0.999996   \n","3                4               4          0.00000              0.999996   \n","4                5               5          0.00000              0.999996   \n","\n","   masked_probability                   full_time                 node  \\\n","0            0.000006  2005-11-29-18.25.57.724442                 NULL   \n","1            0.999996  2005-11-29-18.25.58.002310  R40-M0-N0-I:J18-U11   \n","2            0.999996  2005-11-29-18.25.58.230781  R20-M1-N0-I:J18-U11   \n","3            0.999996  2005-11-29-18.25.58.336082                 NULL   \n","4            0.999996  2005-11-29-18.25.58.395008  R20-M1-N0-I:J18-U01   \n","\n","   component severity  raw_label  \\\n","0  BGLMASTER  FAILURE  MASABNORM   \n","1     KERNEL     INFO          -   \n","2     KERNEL     INFO          -   \n","3       MMCS     INFO          -   \n","4     KERNEL     INFO          -   \n","\n","                                       event_message  \n","0     ciodb exited abnormally due to signal: Aborted  \n","1  ciod: Received signal 15, code=0, errno=0, add...  \n","2  ciod: Received signal 15, code=0, errno=0, add...  \n","3                          ciodb has been restarted.  \n","4  ciod: Received signal 15, code=0, errno=0, add...  "],"text/html":["\n","  <div id=\"df-a33fb35d-1789-4221-9c8e-22abfe9e0b76\" class=\"colab-df-container\">\n","    <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>importance_rank</th>\n","      <th>event_position</th>\n","      <th>importance_drop</th>\n","      <th>original_probability</th>\n","      <th>masked_probability</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>raw_label</th>\n","      <th>event_message</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.99999</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.57.724442</td>\n","      <td>NULL</td>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>MASABNORM</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>2</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.002310</td>\n","      <td>R40-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>3</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.230781</td>\n","      <td>R20-M1-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>4</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.336082</td>\n","      <td>NULL</td>\n","      <td>MMCS</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciodb has been restarted.</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>5</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.999996</td>\n","      <td>2005-11-29-18.25.58.395008</td>\n","      <td>R20-M1-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-a33fb35d-1789-4221-9c8e-22abfe9e0b76')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-a33fb35d-1789-4221-9c8e-22abfe9e0b76 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-a33fb35d-1789-4221-9c8e-22abfe9e0b76');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_4ed44d58-99de-4061-9177-9f8006e6b927\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('top5_case')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_4ed44d58-99de-4061-9177-9f8006e6b927 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('top5_case');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"top5_case","summary":"{\n  \"name\": \"top5_case\",\n  \"rows\": 5,\n  \"fields\": [\n    {\n      \"column\": \"importance_rank\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 1,\n        \"max\": 5,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          2,\n          5,\n          3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 1,\n        \"max\": 5,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          2,\n          5,\n          3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4472089978948793,\n        \"min\": 0.0,\n        \"max\": 0.9999897194425102,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          0.9999897194425102\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"masked_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4472089978948792,\n        \"min\": 6.108232355472865e-06,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"2005-11-29-18.25.58.002310\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"R40-M0-N0-I:J18-U11\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"BGLMASTER\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"ciod: Received signal 15, code=0, errno=0, address=0x000001f5\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 28 — Top 5 influential events for thesis\n","# ============================================================\n","\n","top5_case = case_table.head(5).copy()\n","\n","TOP5_CASE_PATH = CACHE_DIR / \"logminilm_xai_strong_case_study_top5.csv\"\n","top5_case.to_csv(TOP5_CASE_PATH, index=False)\n","\n","print(\"Saved top-5 case study to:\", TOP5_CASE_PATH)\n","display(top5_case)\n"]},{"cell_type":"markdown","id":"b8880811","metadata":{"id":"b8880811"},"source":["## Step 29 — Generate written explanation automatically\n","\n","This cell prints a paragraph that can be adapted into Chapter 4."]},{"cell_type":"code","execution_count":32,"id":"c17427d1","metadata":{"id":"c17427d1","executionInfo":{"status":"ok","timestamp":1783280992087,"user_tz":-180,"elapsed":34,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"ef6a254f-cd4b-430b-d24c-3fe68d5ac172"},"outputs":[{"output_type":"stream","name":"stdout","text":["Thesis-ready case study explanation:\n","\n","\n","A representative true-positive anomaly sequence was selected for local explanation using event-level occlusion.\n","The original anomaly probability of the sequence was 0.999996.\n","The most influential event was located at position 1 in the 10-line sequence.\n","\n","The event was:\n","Component: BGLMASTER\n","Severity: FAILURE\n","Raw label: MASABNORM\n","Message: ciodb exited abnormally due to signal: Aborted\n","\n","After masking this event with a neutral normal baseline event, the anomaly probability decreased to 0.000006.\n","This produced an importance drop of 0.999990, indicating that this event had a strong causal influence on the LogMiniLM anomaly prediction.\n","The explanation was also mapped back to operational metadata, including timestamp and node, making the prediction interpretable for investigation.\n","\n"]}],"source":["# ============================================================\n","# Step 29 — Generate thesis-ready textual explanation\n","# ============================================================\n","\n","top_event = case_table.iloc[0]\n","\n","original_prob = float(top_event[\"original_probability\"])\n","masked_prob = float(top_event[\"masked_probability\"])\n","importance_drop = float(top_event[\"importance_drop\"])\n","\n","print(\"Thesis-ready case study explanation:\\n\")\n","\n","print(f\"\"\"\n","A representative true-positive anomaly sequence was selected for local explanation using event-level occlusion.\n","The original anomaly probability of the sequence was {original_prob:.6f}.\n","The most influential event was located at position {int(top_event[\"event_position\"])} in the 10-line sequence.\n","\n","The event was:\n","Component: {top_event[\"component\"]}\n","Severity: {top_event[\"severity\"]}\n","Raw label: {top_event[\"raw_label\"]}\n","Message: {top_event[\"event_message\"]}\n","\n","After masking this event with a neutral normal baseline event, the anomaly probability decreased to {masked_prob:.6f}.\n","This produced an importance drop of {importance_drop:.6f}, indicating that this event had a strong causal influence on the LogMiniLM anomaly prediction.\n","The explanation was also mapped back to operational metadata, including timestamp and node, making the prediction interpretable for investigation.\n","\"\"\")\n"]},{"cell_type":"markdown","id":"f99a345d","metadata":{"id":"f99a345d"},"source":["## Step 30 — Optional bar chart for strong XAI case study\n","\n","This creates a PNG chart that can be used in the thesis or slides."]},{"cell_type":"code","execution_count":33,"id":"627b4701","metadata":{"id":"627b4701","executionInfo":{"status":"ok","timestamp":1783280992928,"user_tz":-180,"elapsed":843,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":424},"outputId":"f2e6e7ff-9970-476a-ca6c-e36e7433909a"},"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x400 with 1 Axes>"],"image/png":"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BQAAAABAfuBw6H7iiSfUsWNHzZ8/X//973/13//+V59//rk6d+6sJ5980hk1AgAAAACQJzl8n+5p06apT58+atu2ra5cufLXRAoWVOfOnTVmzJhcLxAAAAAAgLzK4T3dPj4+mjJliv744w9t375d27dv15kzZzRlyhQVKlTI4QImT56s8PBweXl5qXbt2tq0adMN+587d07dunVTiRIl5OnpqXvvvVeLFy92eL4AAAAAADibw3u6MxUqVEhVq1a9rZnPnTtXvXv31rRp01S7dm1NmDBBsbGx2rdvn4oVK2bXPy0tTY8++qiKFSumzz77TCVLltSvv/6qgICA26oDAAAAAABnuOXQnRvGjx+vrl27qmPHjpL+OnR90aJF+uCDD9SvXz+7/h988IHOnDmj77//Xu7u7pKk8PDwO1kyAAAAAAA55vDh5bklLS1NW7duVUxMzP+KKVBAMTEx2rBhQ5bjfPnll4qKilK3bt0UHBysypUra8SIEUpPT79TZQMAAAAAkGMu29N9+vRppaenKzg42KY9ODhYe/fuzXKcX375Rd9++63atWunxYsX68CBA3rhhRd05coVDR48OMtxUlNTlZqaan2enJycewsBAAAAAMANuGxP963IyMhQsWLF9M477ygyMlJxcXEaMGCApk2blu04iYmJ8vf3tz5CQ0PvYMUAAAAAgH+yWwrdM2fOVN26dRUSEqJff/1VkjRhwgR98cUXOZ5GUFCQ3NzcdOLECZv2EydOqHjx4lmOU6JECd17771yc3OztlWoUEHHjx9XWlpaluP0799f58+ftz6OHDmS4xoBAAAAALgdDofuqVOnqnfv3mrcuLHOnTtnPZ86ICBAEyZMyPF0PDw8FBkZqZUrV1rbMjIytHLlSkVFRWU5Tt26dXXgwAFlZGRY237++WeVKFFCHh4eWY7j6ekpPz8/mwcAAAAAAHeCw6F74sSJevfddzVgwACbPc41a9bUzp07HZpW79699e677+rDDz/Unj179PzzzyslJcV6NfP27durf//+1v7PP/+8zpw5o5deekk///yzFi1apBEjRqhbt26OLgYAAAAAAE7n8IXUDh06pBo1ati1e3p6KiUlxaFpxcXF6dSpUxo0aJCOHz+u6tWra+nSpdaLq/32228qUOB/vwuEhoZq2bJl6tWrl6pWraqSJUvqpZde0iuvvOLo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a2ymNWDAAI0bN05btmxRwYIF1alTJ0lSXFycXn75ZVWqVEnHjh3TsWPH7IL+tVauXKk9e/Zo9erV+vjjjzV//nwlJCRYh//nP//R559/rg8//FDbtm1TmTJlFBsbqzNnzkiSBg4cqN27d2vJkiXas2ePpk6dqqCgILv5hIaG6vPPP5ck7du3T8eOHdObb76ZZU0dOnTQli1b9OWXX2rDhg0yxqhx48Y2IevSpUsaO3asZs6cqbVr1+q3335Tnz59brj+r5cb07jehg0b9NBDD8nDw8PaFhsbq3379uns2bO3Ne2EhAS1atVKP/74oxo3bqx27dpZX4dz586pQYMGqlGjhrZs2aKlS5fqxIkTatWqVbbT69atm1JTU7V27Vrt3LlTo0aNUuHChXM8vb59+2rNmjX64osv9M0332j16tXatm2bQ8t05coVxcbGytfXV999953Wr19v/QHk2h9/Vq1apYMHD2rVqlX68MMPNWPGDJvg3r59e3388cd66623tGfPHr399tsOLQsA4A4xAADchvj4eOPm5mYKFSpk8xg+fLgxxpgrV66YoKAg89FHH1nHadOmjYmLizPGGHP58mXj4+Njvv/+e5vpdu7c2bRp08YYY8yqVauMJLNixQrr8EWLFhlJ5s8//zTGGDN48GBTrVq1HNVbpEgRk5KSYm2bOnWqKVy4sElPTzcXL1407u7uZvbs2dbhaWlpJiQkxIwePdoYY0yzZs1Mx44ds5z+oUOHjCSzfft2m9rPnj1r069evXrmpZdeMsYY8/PPPxtJZv369dbhp0+fNt7e3mbevHnGGGOmT59uJJkDBw5Y+0yePNkEBwdnu6zXz/tWpnGt7Nbxo48+ap599lmbtp9++slIMrt37852eteuA2OMCQsLM2+88Yb1uSTz2muvWZ9fvHjRSDJLliwxxhgzbNgw07BhQ5tpHjlyxEgy+/bty3KeVapUMUOGDMly2M2md+HCBePh4WF9TYwx5o8//jDe3t42yyHJLFiwwGY6/v7+Zvr06cYYY2bOnGnKlStnMjIyrMNTU1ONt7e3WbZsmTHmr+00LCzMXL161drn6aeftr5v9u3bZySZ5cuX39KyAADuHM7pBgDctvr162vq1Kk2bZnnLBcsWFCtWrXS7Nmz9cwzzyglJUVffPGFPvnkE0nSgQMHdOnSJT366KM246elpalG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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved case study plot to: /content/drive/MyDrive/logminilm_cache/logminilm_xai_strong_case_study_plot.png\n"]}],"source":["# ============================================================\n","# Step 30 — Bar chart for strong XAI case study\n","# ============================================================\n","\n","import matplotlib.pyplot as plt\n","\n","plot_df = case_table.sort_values(\"event_position\")\n","\n","plt.figure(figsize=(10, 4))\n","plt.bar(\n","    plot_df[\"event_position\"].astype(str),\n","    plot_df[\"importance_drop\"]\n",")\n","\n","plt.xlabel(\"Event position in 10-line sequence\")\n","plt.ylabel(\"Importance drop\")\n","plt.title(\"Event-Level Occlusion Explanation for Selected Anomaly Sequence\")\n","plt.tight_layout()\n","\n","CASE_STUDY_PLOT_PATH = CACHE_DIR / \"logminilm_xai_strong_case_study_plot.png\"\n","plt.savefig(CASE_STUDY_PLOT_PATH, dpi=300, bbox_inches=\"tight\")\n","plt.show()\n","\n","print(\"Saved case study plot to:\", CASE_STUDY_PLOT_PATH)\n"]},{"cell_type":"markdown","id":"07cfa4fc","metadata":{"id":"07cfa4fc"},"source":["## Step 31 — Install and import SHAP\n","\n","SHAP is added as a supporting event-level explanation method. Occlusion remains the primary XAI method."]},{"cell_type":"code","execution_count":34,"id":"49bd2cd8","metadata":{"id":"49bd2cd8","executionInfo":{"status":"ok","timestamp":1783281001251,"user_tz":-180,"elapsed":8322,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"90150765-3342-4031-bb5f-8d7a5f507b0c"},"outputs":[{"output_type":"stream","name":"stdout","text":["SHAP imported successfully.\n"]}],"source":["# ============================================================\n","# Step 31 — Install and import SHAP\n","# ============================================================\n","\n","!pip install shap -q\n","\n","import shap\n","import numpy as np\n","import pandas as pd\n","import torch\n","import matplotlib.pyplot as plt\n","\n","SHAP_LOCAL_PATH = CACHE_DIR / \"logminilm_shap_event_level_explanations.csv\"\n","SHAP_CASE_PATH = CACHE_DIR / \"logminilm_shap_case_study.csv\"\n","SHAP_COMPARE_PATH = CACHE_DIR / \"logminilm_shap_occlusion_comparison.csv\"\n","\n","print(\"SHAP imported successfully.\")\n"]},{"cell_type":"markdown","id":"6cdaadfd","metadata":{"id":"6cdaadfd"},"source":["## Step 32 — Select sequences for SHAP\n","\n","SHAP is slower than occlusion, so this step explains the strong case plus a small set of high-confidence true-positive anomaly sequences."]},{"cell_type":"code","execution_count":35,"id":"71d5802a","metadata":{"id":"71d5802a","executionInfo":{"status":"ok","timestamp":1783281001272,"user_tz":-180,"elapsed":16,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"fc778b6b-853b-4ddb-b285-b2df45814b15"},"outputs":[{"output_type":"stream","name":"stdout","text":["Number of sequences selected for SHAP: 11\n","Selected SHAP sequence indices: [50689, 40735, 38707, 42976, 36874, 49134, 39251, 42484, 48879, 51808, 42503]\n"]}],"source":["# ============================================================\n","# Step 32 — Select sequences for SHAP explanation\n","# ============================================================\n","\n","# Explain the strong case study first.\n","strong_case_idx = case_local_idx\n","\n","# Also explain a few high-confidence true-positive anomalies.\n","SHAP_NUM_TP = 10\n","\n","tp_for_shap = (\n","    predictions_df[\n","        (predictions_df[\"true_label\"] == 1) &\n","        (predictions_df[\"predicted_label\"] == 1)\n","    ]\n","    .sort_values(\"anomaly_probability\", ascending=False)\n","    .head(SHAP_NUM_TP)\n",")\n","\n","shap_sequence_indices = [strong_case_idx] + [\n","    int(x) for x in tp_for_shap[\"sequence_local_test_index\"].tolist()\n","]\n","\n","# Remove duplicates while preserving order.\n","shap_sequence_indices = list(dict.fromkeys(shap_sequence_indices))\n","\n","print(\"Number of sequences selected for SHAP:\", len(shap_sequence_indices))\n","print(\"Selected SHAP sequence indices:\", shap_sequence_indices)\n"]},{"cell_type":"markdown","id":"12cc5ae5","metadata":{"id":"12cc5ae5"},"source":["## Step 33 — Define SHAP event-level prediction function\n","\n","For SHAP, each feature is an event position in the 10-line sequence. SHAP uses a binary mask: `1` means keep the original event, and `0` means replace it with the neutral baseline event."]},{"cell_type":"code","execution_count":36,"id":"facce1e5","metadata":{"id":"facce1e5","executionInfo":{"status":"ok","timestamp":1783281001284,"user_tz":-180,"elapsed":9,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"1bce1232-ad6f-4899-bec1-13a64c89fcaa"},"outputs":[{"output_type":"stream","name":"stdout","text":["SHAP event-level prediction function is ready.\n"]}],"source":["# ============================================================\n","# Step 33 — SHAP prediction function for event-level masking\n","# ============================================================\n","\n","def predict_probability_from_event_ids(sequence_event_ids):\n","    \"\"\"Predict anomaly probability for one sequence of event IDs.\"\"\"\n","    model.eval()\n","\n","    seq_tensor = torch.tensor(\n","        sequence_event_ids,\n","        dtype=torch.long\n","    ).unsqueeze(0).to(device)\n","\n","    with torch.no_grad():\n","        logits = model(seq_tensor)\n","        prob = torch.sigmoid(logits).item()\n","\n","    return float(prob)\n","\n","\n","def make_shap_mask_predict_fn(original_sequence_event_ids, baseline_event_id):\n","    \"\"\"\n","    Create a SHAP-compatible prediction function for one sequence.\n","\n","    SHAP input:\n","        mask_matrix shape = number_of_samples × 10\n","\n","    Each mask value:\n","        1 = keep original event\n","        0 = replace event with neutral baseline event\n","\n","    Output:\n","        anomaly probability for each masked version\n","    \"\"\"\n","\n","    original_sequence_event_ids = np.array(\n","        original_sequence_event_ids,\n","        dtype=np.int64\n","    )\n","\n","    def shap_predict_fn(mask_matrix):\n","        mask_matrix = np.array(mask_matrix)\n","\n","        outputs = []\n","\n","        for mask_row in mask_matrix:\n","            # Convert SHAP mask values to binary keep/remove decisions.\n","            binary_mask = (mask_row >= 0.5).astype(int)\n","\n","            perturbed_sequence = original_sequence_event_ids.copy()\n","\n","            for pos in range(len(perturbed_sequence)):\n","                if binary_mask[pos] == 0:\n","                    perturbed_sequence[pos] = baseline_event_id\n","\n","            prob = predict_probability_from_event_ids(perturbed_sequence)\n","            outputs.append(prob)\n","\n","        return np.array(outputs)\n","\n","    return shap_predict_fn\n","\n","\n","print(\"SHAP event-level prediction function is ready.\")\n"]},{"cell_type":"markdown","id":"91bb8008","metadata":{"id":"91bb8008"},"source":["## Step 34 — Run event-level SHAP\n","\n","This computes SHAP values for the selected sequences. Increase `SHAP_NSAMPLES` only if you need more stable SHAP estimates and have enough time."]},{"cell_type":"code","execution_count":37,"id":"177459ec","metadata":{"id":"177459ec","executionInfo":{"status":"ok","timestamp":1783281029010,"user_tz":-180,"elapsed":27725,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000,"referenced_widgets":["8af634f39e5c4827a9d885e9645643dd","f7e276f867a64174a27a074ff72fb900","e683c3cf89484861a9f753b814acee11","1ee8ae5f1e024cfeb18ddc35dd30e293","720187adbfb0427796d9aa2c2ba2ac3f","4ed8007d13e94e489d2d3a2cde6b8a9d","9c8081a6c88045209b409c0500d7d08e","be45fa442b7348aca954eb16e2338578","6a1701302c0143f5ba9ae9d309cedcbc","7c1cccff5bd9431dafa0a4808b8dbc31","fdf8fac8f87e4eac9e109416c3a48f9e","cc879f93dc8747cc86a690eebeef0925","df395090c5a04268af330fc6c24667e0","d9f506e52b924b48b921d537dfd7404a","dc21f359139b49bf804ff7676df76481","dcc1bd09f7224a54b05be933ee976836","7f75354390ee4eed944c3b244d7ca16d","ab673b4fc3594b038036a07f02803a25","dd8606c7196742f4809608081373726f","f465b7be7835490980e6d86a14f6b434","77935337572d4d45b312413f3e4fc0db","0f94c5129ebe4ee89e40be2a5363b98f","c92b1817dc6e47d0b59152db12c647f9","fd72d236c9834e81bb4be8e2f3fbf487","ec2dc8dbde7f463aaea156c3afda7102","61b84a2c7e254bb3a315025816199714","0172f67343254e259e2b845ba79812d3","770e62fb435e4081ad8dea0325b6af6d","02d03a9ffb054f088e8211671b42370b","3cc025375e704ba3a0600a41e2c73a52","904a2b0763de4c26bfb929474aa33c5d","64466d879ed1432a9770f021cab5e78b","1280ecb796ad43abac6ab207732d17c0","d83bf77ac2df49908594f54ad82afe9e","09a3d888edb64e29b3085f36e7e85579","84ed9f65fbd54855be3e5e2b623e3996","7450400ac5004568a8c3644dc825f8e6","2282990403134bcea9173277e9337da8","0483fa635ada47c8a17b9d27af1ad0db","b493ecfae8af423b91ac03b5c3d997b6","c9d6824fd74a4025a39efe2b9d8d56b5","f8145ff96a594d4cb9c4b7f9cb225835","972ae3307def4be4a1e1d1c0a2edff34","2d74425dfea74792ab8b1cd00fdf9e71","54c025fe2a704de38c5d5b76729118f1","ae0a4e2b0aad4a969e3f829bdd006ac9","38cd49f14f194a6bbc02e55ae8fef25a","10950d20d67241bfa7805ddf79fb91d4","a376e3c350c3414d8614b9b228f50ed2","05b465b2f35449e0b799091ade16e074","e5028b4d75e64fb89c77e0ed58b0eb92","a24f0dc02b3d4f76b4e3854f7a83bede","ea92f5bad99c49ffb3d3d6fbe4777609","1a6e1ac3a77745bb926c58330e8d8b7d","52844bfb43c04934ae23185fbaba8f4e","fd695e5b263c4fafb6a84a30ff3b2a21","641f1838f3494b6a8b287f53c6359a69","1dbaa7fc73ad46e9b5168d6f5bedaad0","3b789ff576984d02a20a48088f911259","9d92bbf515bf4f21942fe06d6d05d86d","41b74d976bd848389e8efff7caa6bea5","7c2f5a3f3d9543de8cba8d6587637a6c","8e68f1f1ef6e40e4a142bcf360c2a220","a1f7c17ad454497687d8bde8b179ce94","c9b830566c2446a0bb524427814f1d88","0f745eb44ae74c2c925dccae76810c24","176d89b066cb476dba0f0f6d7ba88a2f","14f238a6089941599dc5e9eb84a2ea2a","c2f818dfce004da69acc6d672b4737cf","7eedadcc447b4dfc859cab5d7080c878","1c900dfc11314fa48d212a676bf2f3ac","6552e4e7ead749b0bdd3126e56cd828b","9d9b5969064b4a3da43de4c7156c7d77","48e5c17070c14b9d8cfab38e452d7d60","4d8ae037a9ec47158867f7a1c80ab3b1","dce64355bc654213a3dee72454e793e3","b823c73ac5a749338d59a8ccc827c99b","f618f71d4ad24c04ac698f2446d658a7","a72773276679461d9e32b45ee287b120","e47e898f3cc94e528f10724a6ab1c7d9","75f00e8b87aa4a80ac58ad3e37d1f376","24b74e2e69ba4b668136e292796db969","75952dcc7e3e4549aa85f8b1c07b6540","92e4c1f23348408093cb06e6a7ff23b4","0ffee8569754427fa29bb169d967af6e","ff4f103aaaf3421fbf4704bb08e93940","29f3350631f140de8e1b4848353c5756","f80e990834264029882dbc7d1347cfca","07e28888b39a4480905835d693bad57c","605af382b4484b108c73c941fa49f643","38696b785c254251bb63cde8a6306417","5d945754f3784cedbf72ba680ef34947","3ecf11df35274b1b95a79871e10fe1ea","fd0163558cb0484497bbbb4b16ff9a5e","da1e3757457d4630889e502952017040","6270bffc8b2747398e091f4c422a379a","3dd424ae9a3e43cc8d169a918bd67527","b03c96941c624caf8f9136fcb77fa181","d9abaa4975f640a8a3391821873182d7","5356813178d64b009b2a4c95f7b2a172","a3268c2c6dd948649285980e89d4082a","b14cc40f317e4194bc0bfcf7e4fdc508","0d0cdd328e764f91beeb8aac1f64f174","d1d2c51e0fac482b877bd930ddd0fc25","070940cd688042ecb9220ef1b040e5c6","57679875b2c74fe59359b9a022b8920c","47f370b1a13549cf852d73acdbac3c9c","238d5ab3463d44caa73e6d6fa0485b3c","938fafbc6ffd428f826f62fb8262ff2a","656d673fee37477d90ca4680785912c0","f1094ec673a24391865ac2502e362ddf","7539889f1b6a4b4f8b7e3ad1b28f5e65","96849986fc1346e6be9738b0970dc757","82b64ef4d5624db482f4444036544e2f","6c82fdc707764d4cb759be3114cd335e","d9e79848d3cb488b930090a517fdbae4","ee27ef2f6a3843fa9808d762f1780e66","835506ebe21848539db986f9456eb599","23557540dcf640fe824f0ce9218b8932","30614e39443d4bef952578ac5d7be36a","bc65d13c90d34facabd8adaf0913ad0f"]},"outputId":"2669346c-06a9-4ff9-d678-491adb37877e"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 1/11\n","Local test index: 50689\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"8af634f39e5c4827a9d885e9645643dd"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 2/11\n","Local test index: 40735\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"cc879f93dc8747cc86a690eebeef0925"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 3/11\n","Local test index: 38707\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c92b1817dc6e47d0b59152db12c647f9"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 4/11\n","Local test index: 42976\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"d83bf77ac2df49908594f54ad82afe9e"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 5/11\n","Local test index: 36874\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"54c025fe2a704de38c5d5b76729118f1"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 6/11\n","Local test index: 49134\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"fd695e5b263c4fafb6a84a30ff3b2a21"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 7/11\n","Local test index: 39251\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"176d89b066cb476dba0f0f6d7ba88a2f"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 8/11\n","Local test index: 42484\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f618f71d4ad24c04ac698f2446d658a7"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 9/11\n","Local test index: 48879\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"07e28888b39a4480905835d693bad57c"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 10/11\n","Local test index: 51808\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5356813178d64b009b2a4c95f7b2a172"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Running SHAP for sequence 11/11\n","Local test index: 42503\n"]},{"output_type":"display_data","data":{"text/plain":["  0%|          | 0/1 [00:00<?, ?it/s]"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f1094ec673a24391865ac2502e362ddf"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Saved SHAP explanations to: /content/drive/MyDrive/logminilm_cache/logminilm_shap_event_level_explanations.csv\n"]},{"output_type":"display_data","data":{"text/plain":["    sequence_local_test_index  event_position  event_id  original_probability  \\\n","0                       36874               7     26276              0.999996   \n","1                       36874               1     46961              0.999996   \n","2                       36874               2     46961              0.999996   \n","3                       36874               3     46961              0.999996   \n","4                       36874               4     46961              0.999996   \n","5                       36874               5     27111              0.999996   \n","6                       36874               6     27111              0.999996   \n","7                       36874               8     24083              0.999996   \n","8                       36874               9     26283              0.999996   \n","9                       36874              10     26738              0.999996   \n","10                      38707               1     26276              0.999996   \n","11                      38707               2     24083              0.999996   \n","12                      38707               3     26283              0.999996   \n","13                      38707               4     26738              0.999996   \n","14                      38707               5     24085              0.999996   \n","15                      38707               6     23064              0.999996   \n","16                      38707               7     23069              0.999996   \n","17                      38707               8     26751              0.999996   \n","18                      38707               9     26773              0.999996   \n","19                      38707              10     24076              0.999996   \n","20                      39251               2     21532              0.999996   \n","21                      39251               1     21532              0.999996   \n","22                      39251               3     21533              0.999996   \n","23                      39251               4     21533              0.999996   \n","24                      39251               7     21531              0.999996   \n","25                      39251               9     21531              0.999996   \n","26                      39251               8     21531              0.999996   \n","27                      39251               6     21531              0.999996   \n","28                      39251               5     21531              0.999996   \n","29                      39251              10     21531              0.999996   \n","\n","    shap_expected_value  shap_value  abs_shap_value  \n","0              0.000006    0.999990        0.999990  \n","1              0.000006    0.000000        0.000000  \n","2              0.000006    0.000000        0.000000  \n","3              0.000006    0.000000        0.000000  \n","4              0.000006    0.000000        0.000000  \n","5              0.000006    0.000000        0.000000  \n","6              0.000006    0.000000        0.000000  \n","7              0.000006    0.000000        0.000000  \n","8              0.000006    0.000000        0.000000  \n","9              0.000006    0.000000        0.000000  \n","10             0.000006    0.999990        0.999990  \n","11             0.000006    0.000000        0.000000  \n","12             0.000006    0.000000        0.000000  \n","13             0.000006    0.000000        0.000000  \n","14             0.000006    0.000000        0.000000  \n","15             0.000006    0.000000        0.000000  \n","16             0.000006    0.000000        0.000000  \n","17             0.000006    0.000000        0.000000  \n","18             0.000006    0.000000        0.000000  \n","19             0.000006    0.000000        0.000000  \n","20             0.000006    0.256233        0.256233  \n","21             0.000006    0.253184        0.253184  \n","22             0.000006    0.240135        0.240135  \n","23             0.000006    0.239978        0.239978  \n","24             0.000006    0.017578        0.017578  \n","25             0.000006   -0.016194        0.016194  \n","26             0.000006    0.013627        0.013627  \n","27             0.000006    0.008823        0.008823  \n","28             0.000006   -0.007161        0.007161  \n","29             0.000006   -0.006213        0.006213  "],"text/html":["\n","  <div id=\"df-6cad889a-ee2d-4d3a-b42f-7065ea3a23a3\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>event_position</th>\n","      <th>event_id</th>\n","      <th>original_probability</th>\n","      <th>shap_expected_value</th>\n","      <th>shap_value</th>\n","      <th>abs_shap_value</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>36874</td>\n","      <td>7</td>\n","      <td>26276</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>36874</td>\n","      <td>1</td>\n","      <td>46961</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>36874</td>\n","      <td>2</td>\n","      <td>46961</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>36874</td>\n","      <td>3</td>\n","      <td>46961</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>36874</td>\n","      <td>4</td>\n","      <td>46961</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>36874</td>\n","      <td>5</td>\n","      <td>27111</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>36874</td>\n","      <td>6</td>\n","      <td>27111</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>36874</td>\n","      <td>8</td>\n","      <td>24083</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>36874</td>\n","      <td>9</td>\n","      <td>26283</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>36874</td>\n","      <td>10</td>\n","      <td>26738</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>38707</td>\n","      <td>1</td>\n","      <td>26276</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","    </tr>\n","    <tr>\n","      <th>11</th>\n","      <td>38707</td>\n","      <td>2</td>\n","      <td>24083</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>12</th>\n","      <td>38707</td>\n","      <td>3</td>\n","      <td>26283</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>13</th>\n","      <td>38707</td>\n","      <td>4</td>\n","      <td>26738</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>14</th>\n","      <td>38707</td>\n","      <td>5</td>\n","      <td>24085</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>15</th>\n","      <td>38707</td>\n","      <td>6</td>\n","      <td>23064</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>16</th>\n","      <td>38707</td>\n","      <td>7</td>\n","      <td>23069</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>17</th>\n","      <td>38707</td>\n","      <td>8</td>\n","      <td>26751</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>18</th>\n","      <td>38707</td>\n","      <td>9</td>\n","      <td>26773</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>19</th>\n","      <td>38707</td>\n","      <td>10</td>\n","      <td>24076</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>0.000000</td>\n","    </tr>\n","    <tr>\n","      <th>20</th>\n","      <td>39251</td>\n","      <td>2</td>\n","      <td>21532</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.256233</td>\n","      <td>0.256233</td>\n","    </tr>\n","    <tr>\n","      <th>21</th>\n","      <td>39251</td>\n","      <td>1</td>\n","      <td>21532</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.253184</td>\n","      <td>0.253184</td>\n","    </tr>\n","    <tr>\n","      <th>22</th>\n","      <td>39251</td>\n","      <td>3</td>\n","      <td>21533</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.240135</td>\n","      <td>0.240135</td>\n","    </tr>\n","    <tr>\n","      <th>23</th>\n","      <td>39251</td>\n","      <td>4</td>\n","      <td>21533</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.239978</td>\n","      <td>0.239978</td>\n","    </tr>\n","    <tr>\n","      <th>24</th>\n","      <td>39251</td>\n","      <td>7</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.017578</td>\n","      <td>0.017578</td>\n","    </tr>\n","    <tr>\n","      <th>25</th>\n","      <td>39251</td>\n","      <td>9</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.016194</td>\n","      <td>0.016194</td>\n","    </tr>\n","    <tr>\n","      <th>26</th>\n","      <td>39251</td>\n","      <td>8</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.013627</td>\n","      <td>0.013627</td>\n","    </tr>\n","    <tr>\n","      <th>27</th>\n","      <td>39251</td>\n","      <td>6</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.008823</td>\n","      <td>0.008823</td>\n","    </tr>\n","    <tr>\n","      <th>28</th>\n","      <td>39251</td>\n","      <td>5</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.007161</td>\n","      <td>0.007161</td>\n","    </tr>\n","    <tr>\n","      <th>29</th>\n","      <td>39251</td>\n","      <td>10</td>\n","      <td>21531</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.006213</td>\n","      <td>0.006213</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6cad889a-ee2d-4d3a-b42f-7065ea3a23a3')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-6cad889a-ee2d-4d3a-b42f-7065ea3a23a3 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-6cad889a-ee2d-4d3a-b42f-7065ea3a23a3');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","summary":"{\n  \"name\": \"display(shap_xai_df\",\n  \"rows\": 30,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1034,\n        \"min\": 36874,\n        \"max\": 39251,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          36874,\n          38707,\n          39251\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 2,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          1,\n          5\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_id\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8221,\n        \"min\": 21531,\n        \"max\": 46961,\n        \"num_unique_values\": 15,\n        \"samples\": [\n          26751,\n          24076,\n          26276\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"shap_expected_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 6.246241810003994e-06,\n        \"max\": 6.246241810003994e-06,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          6.246241810003994e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"shap_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.25903674430261375,\n        \"min\": -0.016194381948662556,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 12,\n        \"samples\": [\n          -0.007161292294530952\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"abs_shap_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.25824054194422225,\n        \"min\": 0.0,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 12,\n        \"samples\": [\n          0.007161292294530952\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 34 — Run event-level SHAP\n","# ============================================================\n","\n","shap_rows = []\n","\n","# SHAP background:\n","# all-zero mask means all events are replaced by the neutral baseline event.\n","background_mask = np.zeros((1, WINDOW_SIZE))\n","\n","# SHAP explains the full original sequence:\n","# all-one mask means all original events are kept.\n","full_mask = np.ones((1, WINDOW_SIZE))\n","\n","# Higher nsamples = more stable but slower.\n","SHAP_NSAMPLES = 500\n","\n","for seq_num, local_idx in enumerate(shap_sequence_indices, start=1):\n","\n","    print(f\"\\nRunning SHAP for sequence {seq_num}/{len(shap_sequence_indices)}\")\n","    print(\"Local test index:\", local_idx)\n","\n","    sequence_event_ids = np.array(X_test[local_idx], dtype=np.int64)\n","\n","    original_prob = predict_probability_from_event_ids(sequence_event_ids)\n","\n","    shap_predict_fn = make_shap_mask_predict_fn(\n","        sequence_event_ids,\n","        baseline_event_id\n","    )\n","\n","    explainer = shap.KernelExplainer(\n","        shap_predict_fn,\n","        background_mask\n","    )\n","\n","    shap_values = explainer.shap_values(\n","        full_mask,\n","        nsamples=SHAP_NSAMPLES\n","    )\n","\n","    # shap_values may come as list or ndarray depending on SHAP version.\n","    if isinstance(shap_values, list):\n","        shap_values_array = np.array(shap_values[0]).reshape(-1)\n","    else:\n","        shap_values_array = np.array(shap_values).reshape(-1)\n","\n","    expected_value = explainer.expected_value\n","\n","    if isinstance(expected_value, (list, np.ndarray)):\n","        expected_value = float(np.array(expected_value).reshape(-1)[0])\n","    else:\n","        expected_value = float(expected_value)\n","\n","    for pos in range(WINDOW_SIZE):\n","        event_id = int(sequence_event_ids[pos])\n","        shap_value = float(shap_values_array[pos])\n","\n","        shap_rows.append({\n","            \"sequence_local_test_index\": int(local_idx),\n","            \"event_position\": int(pos + 1),\n","            \"event_id\": event_id,\n","            \"original_probability\": float(original_prob),\n","            \"shap_expected_value\": float(expected_value),\n","            \"shap_value\": shap_value,\n","            \"abs_shap_value\": abs(shap_value),\n","        })\n","\n","shap_xai_df = pd.DataFrame(shap_rows)\n","\n","shap_xai_df = shap_xai_df.sort_values(\n","    [\"sequence_local_test_index\", \"abs_shap_value\"],\n","    ascending=[True, False]\n",").reset_index(drop=True)\n","\n","shap_xai_df.to_csv(SHAP_LOCAL_PATH, index=False)\n","\n","print(\"\\nSaved SHAP explanations to:\", SHAP_LOCAL_PATH)\n","display(shap_xai_df.head(30))\n"]},{"cell_type":"markdown","id":"4fe63544","metadata":{"id":"4fe63544"},"source":["## Step 35 — Attach metadata to SHAP explanations\n","\n","This maps SHAP values back to timestamp, node, component, severity, label, and event message."]},{"cell_type":"code","execution_count":38,"id":"8494fd6c","metadata":{"id":"8494fd6c","executionInfo":{"status":"ok","timestamp":1783281029123,"user_tz":-180,"elapsed":110,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"f1abc1b3-a894-4bdc-c6b9-1ae388d6a3f1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved SHAP metadata explanations to: /content/drive/MyDrive/logminilm_cache/logminilm_shap_event_level_explanations.csv\n"]},{"output_type":"display_data","data":{"text/plain":["    sequence_local_test_index  start_line  end_line  event_position  \\\n","0                       36874     4139530   4139539               7   \n","1                       36874     4139530   4139539               1   \n","2                       36874     4139530   4139539               2   \n","3                       36874     4139530   4139539               3   \n","4                       36874     4139530   4139539               4   \n","5                       36874     4139530   4139539               5   \n","6                       36874     4139530   4139539               6   \n","7                       36874     4139530   4139539               8   \n","8                       36874     4139530   4139539               9   \n","9                       36874     4139530   4139539              10   \n","10                      38707     4157860   4157869               1   \n","11                      38707     4157860   4157869               2   \n","12                      38707     4157860   4157869               3   \n","13                      38707     4157860   4157869               4   \n","14                      38707     4157860   4157869               5   \n","15                      38707     4157860   4157869               6   \n","16                      38707     4157860   4157869               7   \n","17                      38707     4157860   4157869               8   \n","18                      38707     4157860   4157869               9   \n","19                      38707     4157860   4157869              10   \n","20                      39251     4163300   4163309               2   \n","21                      39251     4163300   4163309               1   \n","22                      39251     4163300   4163309               3   \n","23                      39251     4163300   4163309               4   \n","24                      39251     4163300   4163309               7   \n","25                      39251     4163300   4163309               9   \n","26                      39251     4163300   4163309               8   \n","27                      39251     4163300   4163309               6   \n","28                      39251     4163300   4163309               5   \n","29                      39251     4163300   4163309              10   \n","\n","    line_index  true_label  predicted_label  original_probability  \\\n","0      4172982           1                1              0.999996   \n","1      4172976           1                1              0.999996   \n","2      4172977           1                1              0.999996   \n","3      4172978           1                1              0.999996   \n","4      4172979           1                1              0.999996   \n","5      4172980           1                1              0.999996   \n","6      4172981           1                1              0.999996   \n","7      4172983           1                1              0.999996   \n","8      4172984           1                1              0.999996   \n","9      4172985           1                1              0.999996   \n","10     4192330           1                1              0.999996   \n","11     4192331           1                1              0.999996   \n","12     4192332           1                1              0.999996   \n","13     4192333           1                1              0.999996   \n","14     4192334           1                1              0.999996   \n","15     4192335           1                1              0.999996   \n","16     4192336           1                1              0.999996   \n","17     4192337           1                1              0.999996   \n","18     4192338           1                1              0.999996   \n","19     4192339           1                1              0.999996   \n","20     4197771           1                1              0.999996   \n","21     4197770           1                1              0.999996   \n","22     4197772           1                1              0.999996   \n","23     4197773           1                1              0.999996   \n","24     4197776           1                1              0.999996   \n","25     4197778           1                1              0.999996   \n","26     4197777           1                1              0.999996   \n","27     4197775           1                1              0.999996   \n","28     4197774           1                1              0.999996   \n","29     4197779           1                1              0.999996   \n","\n","    shap_expected_value  shap_value  ...  event_id  raw_label line_label  \\\n","0              0.000006    0.999990  ...     26276     KERNMC          1   \n","1              0.000006    0.000000  ...     46961          -          0   \n","2              0.000006    0.000000  ...     46961          -          0   \n","3              0.000006    0.000000  ...     46961          -          0   \n","4              0.000006    0.000000  ...     46961          -          0   \n","5              0.000006    0.000000  ...     27111          -          0   \n","6              0.000006    0.000000  ...     27111          -          0   \n","7              0.000006    0.000000  ...     24083          -          0   \n","8              0.000006    0.000000  ...     26283          -          0   \n","9              0.000006    0.000000  ...     26738          -          0   \n","10             0.000006    0.999990  ...     26276     KERNMC          1   \n","11             0.000006    0.000000  ...     24083          -          0   \n","12             0.000006    0.000000  ...     26283          -          0   \n","13             0.000006    0.000000  ...     26738          -          0   \n","14             0.000006    0.000000  ...     24085          -          0   \n","15             0.000006    0.000000  ...     23064          -          0   \n","16             0.000006    0.000000  ...     23069          -          0   \n","17             0.000006    0.000000  ...     26751          -          0   \n","18             0.000006    0.000000  ...     26773          -          0   \n","19             0.000006    0.000000  ...     24076          -          0   \n","20             0.000006    0.256233  ...     21532   APPTORUS          1   \n","21             0.000006    0.253184  ...     21532   APPTORUS          1   \n","22             0.000006    0.240135  ...     21533          -          0   \n","23             0.000006    0.239978  ...     21533          -          0   \n","24             0.000006    0.017578  ...     21531          -          0   \n","25             0.000006   -0.016194  ...     21531          -          0   \n","26             0.000006    0.013627  ...     21531          -          0   \n","27             0.000006    0.008823  ...     21531          -          0   \n","28             0.000006   -0.007161  ...     21531          -          0   \n","29             0.000006   -0.006213  ...     21531          -          0   \n","\n","                     full_time                 node source component severity  \\\n","0   2005-11-10-19.08.42.823869  R06-M0-N1-C:J07-U11    RAS    KERNEL    FATAL   \n","1   2005-11-10-17.47.04.270667  R65-M1-N6-C:J17-U01    RAS    KERNEL     INFO   \n","2   2005-11-10-17.47.04.357428  R07-M0-N6-C:J11-U01    RAS    KERNEL     INFO   \n","3   2005-11-10-17.47.04.470849  R30-M0-N7-C:J09-U01    RAS    KERNEL     INFO   \n","4   2005-11-10-17.47.04.578589  R04-M0-N0-C:J08-U01    RAS    KERNEL     INFO   \n","5   2005-11-10-19.08.29.538386  R06-M0-NB-C:J07-U01    RAS    KERNEL     INFO   \n","6   2005-11-10-19.08.37.793404  R20-M1-NF-C:J11-U11    RAS    KERNEL     INFO   \n","7   2005-11-10-19.08.42.952446  R06-M0-N1-C:J07-U11    RAS    KERNEL    FATAL   \n","8   2005-11-10-19.08.43.117186  R06-M0-N1-C:J07-U11    RAS    KERNEL    FATAL   \n","9   2005-11-10-19.08.43.269604  R06-M0-N1-C:J07-U11    RAS    KERNEL    FATAL   \n","10  2005-11-12-01.30.05.814458  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","11  2005-11-12-01.30.05.951269  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","12  2005-11-12-01.30.06.152663  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","13  2005-11-12-01.30.06.384104  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","14  2005-11-12-01.30.06.557534  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","15  2005-11-12-01.30.06.717795  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","16  2005-11-12-01.30.06.946548  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","17  2005-11-12-01.30.07.373685  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","18  2005-11-12-01.30.08.277866  R63-M0-N8-C:J17-U01    RAS    KERNEL     INFO   \n","19  2005-11-12-01.30.08.352498  R43-M0-N1-C:J11-U01    RAS    KERNEL    FATAL   \n","20  2005-11-14-17.38.29.843917  R41-M0-N8-C:J14-U01    RAS       APP    FATAL   \n","21  2005-11-14-17.38.29.731276  R41-M0-NB-C:J11-U11    RAS       APP    FATAL   \n","22  2005-11-14-17.38.29.954557  R41-M0-NB-C:J11-U11    RAS       APP    FATAL   \n","23  2005-11-14-17.38.30.037702  R41-M0-N8-C:J14-U01    RAS       APP    FATAL   \n","24  2005-11-14-17.38.30.194405  R41-M0-NB-C:J11-U11    RAS       APP    FATAL   \n","25  2005-11-14-17.38.30.428293  R41-M0-NB-C:J11-U11    RAS       APP    FATAL   \n","26  2005-11-14-17.38.30.380086  R41-M0-N8-C:J14-U01    RAS       APP    FATAL   \n","27  2005-11-14-17.38.30.157365  R41-M0-N8-C:J14-U01    RAS       APP    FATAL   \n","28  2005-11-14-17.38.30.074956  R41-M0-NB-C:J11-U11    RAS       APP    FATAL   \n","29  2005-11-14-17.38.30.528268  R41-M0-N8-C:J14-U01    RAS       APP    FATAL   \n","\n","                                        event_message  \\\n","0                             machine check interrupt   \n","1      total of 1 ddr error(s) detected and corrected   \n","2      total of 1 ddr error(s) detected and corrected   \n","3      total of 1 ddr error(s) detected and corrected   \n","4      total of 1 ddr error(s) detected and corrected   \n","5   ddr: activating redundant bit steering for nex...   \n","6   ddr: activating redundant bit steering for nex...   \n","7                     instruction address: 0x0014c9bc   \n","8           machine check status register: 0x81000000   \n","9                 summary...........................1   \n","10                            machine check interrupt   \n","11                    instruction address: 0x0014c98c   \n","12          machine check status register: 0x81000000   \n","13                summary...........................1   \n","14                instruction plb error.............0   \n","15                data read plb error...............0   \n","16                data write plb error..............0   \n","17                tlb error.........................0   \n","18  6 ddr errors(s) detected and corrected on rank...   \n","19                i-cache parity error..............0   \n","20  external input interrupt (unit=0x02 bit=0x00):...   \n","21  external input interrupt (unit=0x02 bit=0x00):...   \n","22           Torus non-recoverable error DCRs follow.   \n","23           Torus non-recoverable error DCRs follow.   \n","24                             DCR 0x2DD : 0x00000000   \n","25                             DCR 0x2DE : 0x00000000   \n","26                             DCR 0x2DD : 0x00000000   \n","27                             DCR 0x2DC : 0x00000000   \n","28                             DCR 0x2DC : 0x00000000   \n","29                             DCR 0x2DE : 0x00000000   \n","\n","                                      model_text_norm  \n","0            ras kernel fatal machine check interrupt  \n","1   ras kernel info total of <num> ddr error s det...  \n","2   ras kernel info total of <num> ddr error s det...  \n","3   ras kernel info total of <num> ddr error s det...  \n","4   ras kernel info total of <num> ddr error s det...  \n","5   ras kernel info ddr activating redundant bit s...  \n","6   ras kernel info ddr activating redundant bit s...  \n","7          ras kernel fatal instruction address <hex>  \n","8   ras kernel fatal machine check status register...  \n","9                      ras kernel fatal summary <num>  \n","10           ras kernel fatal machine check interrupt  \n","11         ras kernel fatal instruction address <hex>  \n","12  ras kernel fatal machine check status register...  \n","13                     ras kernel fatal summary <num>  \n","14       ras kernel fatal instruction plb error <num>  \n","15         ras kernel fatal data read plb error <num>  \n","16        ras kernel fatal data write plb error <num>  \n","17                   ras kernel fatal tlb error <num>  \n","18  ras kernel info <num> ddr errors s detected an...  \n","19        ras kernel fatal i cache parity error <num>  \n","20  ras app fatal external input interrupt unit <h...  \n","21  ras app fatal external input interrupt unit <h...  \n","22  ras app fatal torus non recoverable error dcrs...  \n","23  ras app fatal torus non recoverable error dcrs...  \n","24                      ras app fatal dcr <hex> <hex>  \n","25                      ras app fatal dcr <hex> <hex>  \n","26                      ras app fatal dcr <hex> <hex>  \n","27                      ras app fatal dcr <hex> <hex>  \n","28                      ras app fatal dcr <hex> <hex>  \n","29                      ras app fatal dcr <hex> <hex>  \n","\n","[30 rows x 21 columns]"],"text/html":["\n","  <div id=\"df-a96005a6-33a6-47c4-8dfb-cca08842f0a1\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>start_line</th>\n","      <th>end_line</th>\n","      <th>event_position</th>\n","      <th>line_index</th>\n","      <th>true_label</th>\n","      <th>predicted_label</th>\n","      <th>original_probability</th>\n","      <th>shap_expected_value</th>\n","      <th>shap_value</th>\n","      <th>...</th>\n","      <th>event_id</th>\n","      <th>raw_label</th>\n","      <th>line_label</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>source</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>event_message</th>\n","      <th>model_text_norm</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>7</td>\n","      <td>4172982</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.999990</td>\n","      <td>...</td>\n","      <td>26276</td>\n","      <td>KERNMC</td>\n","      <td>1</td>\n","      <td>2005-11-10-19.08.42.823869</td>\n","      <td>R06-M0-N1-C:J07-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>ras kernel fatal machine check interrupt</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>1</td>\n","      <td>4172976</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>46961</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-17.47.04.270667</td>\n","      <td>R65-M1-N6-C:J17-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>total of 1 ddr error(s) detected and corrected</td>\n","      <td>ras kernel info total of &lt;num&gt; ddr error s det...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>2</td>\n","      <td>4172977</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>46961</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-17.47.04.357428</td>\n","      <td>R07-M0-N6-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>total of 1 ddr error(s) detected and corrected</td>\n","      <td>ras kernel info total of &lt;num&gt; ddr error s det...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>3</td>\n","      <td>4172978</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>46961</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-17.47.04.470849</td>\n","      <td>R30-M0-N7-C:J09-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>total of 1 ddr error(s) detected and corrected</td>\n","      <td>ras kernel info total of &lt;num&gt; ddr error s det...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>4</td>\n","      <td>4172979</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>46961</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-17.47.04.578589</td>\n","      <td>R04-M0-N0-C:J08-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>total of 1 ddr error(s) detected and corrected</td>\n","      <td>ras kernel info total of &lt;num&gt; ddr error s det...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>5</td>\n","      <td>4172980</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>27111</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-19.08.29.538386</td>\n","      <td>R06-M0-NB-C:J07-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ddr: activating redundant bit steering for nex...</td>\n","      <td>ras kernel info ddr activating redundant bit s...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>6</td>\n","      <td>4172981</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>27111</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-19.08.37.793404</td>\n","      <td>R20-M1-NF-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>ddr: activating redundant bit steering for nex...</td>\n","      <td>ras kernel info ddr activating redundant bit s...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>8</td>\n","      <td>4172983</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>24083</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-19.08.42.952446</td>\n","      <td>R06-M0-N1-C:J07-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction address: 0x0014c9bc</td>\n","      <td>ras kernel fatal instruction address &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>9</td>\n","      <td>4172984</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26283</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-19.08.43.117186</td>\n","      <td>R06-M0-N1-C:J07-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check status register: 0x81000000</td>\n","      <td>ras kernel fatal machine check status register...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>36874</td>\n","      <td>4139530</td>\n","      <td>4139539</td>\n","      <td>10</td>\n","      <td>4172985</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26738</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-10-19.08.43.269604</td>\n","      <td>R06-M0-N1-C:J07-U11</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>summary...........................1</td>\n","      <td>ras kernel fatal summary &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>1</td>\n","      <td>4192330</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.999990</td>\n","      <td>...</td>\n","      <td>26276</td>\n","      <td>KERNMC</td>\n","      <td>1</td>\n","      <td>2005-11-12-01.30.05.814458</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>ras kernel fatal machine check interrupt</td>\n","    </tr>\n","    <tr>\n","      <th>11</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>2</td>\n","      <td>4192331</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>24083</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.05.951269</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction address: 0x0014c98c</td>\n","      <td>ras kernel fatal instruction address &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>12</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>3</td>\n","      <td>4192332</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26283</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.152663</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check status register: 0x81000000</td>\n","      <td>ras kernel fatal machine check status register...</td>\n","    </tr>\n","    <tr>\n","      <th>13</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>4</td>\n","      <td>4192333</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26738</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.384104</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>summary...........................1</td>\n","      <td>ras kernel fatal summary &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>14</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>5</td>\n","      <td>4192334</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>24085</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.557534</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>instruction plb error.............0</td>\n","      <td>ras kernel fatal instruction plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>15</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>6</td>\n","      <td>4192335</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>23064</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.717795</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data read plb error...............0</td>\n","      <td>ras kernel fatal data read plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>16</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>7</td>\n","      <td>4192336</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>23069</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.06.946548</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>data write plb error..............0</td>\n","      <td>ras kernel fatal data write plb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>17</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>8</td>\n","      <td>4192337</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26751</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.07.373685</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>tlb error.........................0</td>\n","      <td>ras kernel fatal tlb error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>18</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>9</td>\n","      <td>4192338</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>26773</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.08.277866</td>\n","      <td>R63-M0-N8-C:J17-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>6 ddr errors(s) detected and corrected on rank...</td>\n","      <td>ras kernel info &lt;num&gt; ddr errors s detected an...</td>\n","    </tr>\n","    <tr>\n","      <th>19</th>\n","      <td>38707</td>\n","      <td>4157860</td>\n","      <td>4157869</td>\n","      <td>10</td>\n","      <td>4192339</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.000000</td>\n","      <td>...</td>\n","      <td>24076</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-12-01.30.08.352498</td>\n","      <td>R43-M0-N1-C:J11-U01</td>\n","      <td>RAS</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>i-cache parity error..............0</td>\n","      <td>ras kernel fatal i cache parity error &lt;num&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>20</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>2</td>\n","      <td>4197771</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.256233</td>\n","      <td>...</td>\n","      <td>21532</td>\n","      <td>APPTORUS</td>\n","      <td>1</td>\n","      <td>2005-11-14-17.38.29.843917</td>\n","      <td>R41-M0-N8-C:J14-U01</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>external input interrupt (unit=0x02 bit=0x00):...</td>\n","      <td>ras app fatal external input interrupt unit &lt;h...</td>\n","    </tr>\n","    <tr>\n","      <th>21</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>1</td>\n","      <td>4197770</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.253184</td>\n","      <td>...</td>\n","      <td>21532</td>\n","      <td>APPTORUS</td>\n","      <td>1</td>\n","      <td>2005-11-14-17.38.29.731276</td>\n","      <td>R41-M0-NB-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>external input interrupt (unit=0x02 bit=0x00):...</td>\n","      <td>ras app fatal external input interrupt unit &lt;h...</td>\n","    </tr>\n","    <tr>\n","      <th>22</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>3</td>\n","      <td>4197772</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.240135</td>\n","      <td>...</td>\n","      <td>21533</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.29.954557</td>\n","      <td>R41-M0-NB-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>Torus non-recoverable error DCRs follow.</td>\n","      <td>ras app fatal torus non recoverable error dcrs...</td>\n","    </tr>\n","    <tr>\n","      <th>23</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>4</td>\n","      <td>4197773</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.239978</td>\n","      <td>...</td>\n","      <td>21533</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.037702</td>\n","      <td>R41-M0-N8-C:J14-U01</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>Torus non-recoverable error DCRs follow.</td>\n","      <td>ras app fatal torus non recoverable error dcrs...</td>\n","    </tr>\n","    <tr>\n","      <th>24</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>7</td>\n","      <td>4197776</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.017578</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.194405</td>\n","      <td>R41-M0-NB-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DD : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>25</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>9</td>\n","      <td>4197778</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.016194</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.428293</td>\n","      <td>R41-M0-NB-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DE : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>26</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>8</td>\n","      <td>4197777</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.013627</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.380086</td>\n","      <td>R41-M0-N8-C:J14-U01</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DD : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>27</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>6</td>\n","      <td>4197775</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>0.008823</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.157365</td>\n","      <td>R41-M0-N8-C:J14-U01</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DC : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>28</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>5</td>\n","      <td>4197774</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.007161</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.074956</td>\n","      <td>R41-M0-NB-C:J11-U11</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DC : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","    <tr>\n","      <th>29</th>\n","      <td>39251</td>\n","      <td>4163300</td>\n","      <td>4163309</td>\n","      <td>10</td>\n","      <td>4197779</td>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>-0.006213</td>\n","      <td>...</td>\n","      <td>21531</td>\n","      <td>-</td>\n","      <td>0</td>\n","      <td>2005-11-14-17.38.30.528268</td>\n","      <td>R41-M0-N8-C:J14-U01</td>\n","      <td>RAS</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>DCR 0x2DE : 0x00000000</td>\n","      <td>ras app fatal dcr &lt;hex&gt; &lt;hex&gt;</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>30 rows × 21 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-a96005a6-33a6-47c4-8dfb-cca08842f0a1')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-a96005a6-33a6-47c4-8dfb-cca08842f0a1 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-a96005a6-33a6-47c4-8dfb-cca08842f0a1');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe"}},"metadata":{}}],"source":["# ============================================================\n","# Step 35 — Attach metadata to SHAP event explanations\n","# ============================================================\n","\n","# Build a lookup from predictions_df for start/end lines.\n","pred_lookup = predictions_df.set_index(\"sequence_local_test_index\")\n","\n","shap_meta_rows = []\n","\n","for _, row in shap_xai_df.iterrows():\n","\n","    local_idx = int(row[\"sequence_local_test_index\"])\n","    event_position = int(row[\"event_position\"])\n","\n","    pred_row = pred_lookup.loc[local_idx]\n","\n","    start_line = int(pred_row[\"start_line\"])\n","    end_line = int(pred_row[\"end_line\"])\n","    true_label = int(pred_row[\"true_label\"])\n","    predicted_label = int(pred_row[\"predicted_label\"])\n","\n","    line_number = start_line + event_position - 1\n","\n","    meta = metadata_df.iloc[line_number]\n","\n","    shap_meta_rows.append({\n","        \"sequence_local_test_index\": local_idx,\n","        \"start_line\": start_line,\n","        \"end_line\": end_line,\n","        \"event_position\": event_position,\n","        \"line_index\": int(meta[\"line_index\"]),\n","        \"true_label\": true_label,\n","        \"predicted_label\": predicted_label,\n","        \"original_probability\": float(row[\"original_probability\"]),\n","        \"shap_expected_value\": float(row[\"shap_expected_value\"]),\n","        \"shap_value\": float(row[\"shap_value\"]),\n","        \"abs_shap_value\": float(row[\"abs_shap_value\"]),\n","        \"event_id\": int(row[\"event_id\"]),\n","        \"raw_label\": meta[\"raw_label\"],\n","        \"line_label\": int(meta[\"label\"]),\n","        \"full_time\": meta[\"full_time\"],\n","        \"node\": meta[\"node\"],\n","        \"source\": meta[\"source\"],\n","        \"component\": meta[\"component\"],\n","        \"severity\": meta[\"severity\"],\n","        \"event_message\": meta[\"event_message\"],\n","        \"model_text_norm\": meta[\"model_text_norm\"],\n","    })\n","\n","shap_meta_df = pd.DataFrame(shap_meta_rows)\n","\n","shap_meta_df = shap_meta_df.sort_values(\n","    [\"sequence_local_test_index\", \"abs_shap_value\"],\n","    ascending=[True, False]\n",").reset_index(drop=True)\n","\n","shap_meta_df.to_csv(SHAP_LOCAL_PATH, index=False)\n","\n","print(\"Saved SHAP metadata explanations to:\", SHAP_LOCAL_PATH)\n","display(shap_meta_df.head(30))\n"]},{"cell_type":"markdown","id":"3260b4ad","metadata":{"id":"3260b4ad"},"source":["## Step 36 — SHAP case study for the strongest anomaly\n","\n","This creates a SHAP table for the same strong case selected in Step 26."]},{"cell_type":"code","execution_count":39,"id":"725505bd","metadata":{"id":"725505bd","executionInfo":{"status":"ok","timestamp":1783281029578,"user_tz":-180,"elapsed":452,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"81628df5-7083-4405-ef30-1a0ebace6881"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved SHAP case study to: /content/drive/MyDrive/logminilm_cache/logminilm_shap_case_study.csv\n"]},{"output_type":"display_data","data":{"text/plain":["   shap_rank  event_position  shap_value  abs_shap_value  \\\n","0          1               1     0.99999         0.99999   \n","1          2               2     0.00000         0.00000   \n","2          3               3     0.00000         0.00000   \n","3          4               4     0.00000         0.00000   \n","4          5               5     0.00000         0.00000   \n","5          6               6     0.00000         0.00000   \n","6          7               7     0.00000         0.00000   \n","7          8               8     0.00000         0.00000   \n","8          9               9     0.00000         0.00000   \n","9         10              10     0.00000         0.00000   \n","\n","   original_probability  shap_expected_value                   full_time  \\\n","0              0.999996             0.000006  2005-11-29-18.25.57.724442   \n","1              0.999996             0.000006  2005-11-29-18.25.58.002310   \n","2              0.999996             0.000006  2005-11-29-18.25.58.230781   \n","3              0.999996             0.000006  2005-11-29-18.25.58.336082   \n","4              0.999996             0.000006  2005-11-29-18.25.58.395008   \n","5              0.999996             0.000006  2005-11-29-18.25.58.554821   \n","6              0.999996             0.000006  2005-11-29-18.25.58.755983   \n","7              0.999996             0.000006  2005-11-29-18.25.58.957316   \n","8              0.999996             0.000006  2005-11-29-18.25.59.160673   \n","9              0.999996             0.000006  2005-11-29-18.25.59.391256   \n","\n","                  node  component severity  raw_label  \\\n","0                 NULL  BGLMASTER  FAILURE  MASABNORM   \n","1  R40-M0-N0-I:J18-U11     KERNEL     INFO          -   \n","2  R20-M1-N0-I:J18-U11     KERNEL     INFO          -   \n","3                 NULL       MMCS     INFO          -   \n","4  R20-M1-N0-I:J18-U01     KERNEL     INFO          -   \n","5  R30-M0-N0-I:J18-U11     KERNEL     INFO          -   \n","6  R30-M0-N0-I:J18-U01     KERNEL     INFO          -   \n","7  R50-M1-N0-I:J18-U11     KERNEL     INFO          -   \n","8  R50-M1-N0-I:J18-U01     KERNEL     INFO          -   \n","9  R20-M1-N8-I:J18-U01     KERNEL     INFO          -   \n","\n","                                       event_message  \n","0     ciodb exited abnormally due to signal: Aborted  \n","1  ciod: Received signal 15, code=0, errno=0, add...  \n","2  ciod: Received signal 15, code=0, errno=0, add...  \n","3                          ciodb has been restarted.  \n","4  ciod: Received signal 15, code=0, errno=0, add...  \n","5  ciod: Received signal 15, code=0, errno=0, add...  \n","6  ciod: Received signal 15, code=0, errno=0, add...  \n","7  ciod: Received signal 15, code=0, errno=0, add...  \n","8  ciod: Received signal 15, code=0, errno=0, add...  \n","9  ciod: Received signal 15, code=0, errno=0, add...  "],"text/html":["\n","  <div id=\"df-8230301c-0cd0-4198-8c4d-f768c274160b\" class=\"colab-df-container\">\n","    <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>shap_rank</th>\n","      <th>event_position</th>\n","      <th>shap_value</th>\n","      <th>abs_shap_value</th>\n","      <th>original_probability</th>\n","      <th>shap_expected_value</th>\n","      <th>full_time</th>\n","      <th>node</th>\n","      <th>component</th>\n","      <th>severity</th>\n","      <th>raw_label</th>\n","      <th>event_message</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>1</td>\n","      <td>0.99999</td>\n","      <td>0.99999</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.57.724442</td>\n","      <td>NULL</td>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>MASABNORM</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>2</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.002310</td>\n","      <td>R40-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>3</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.230781</td>\n","      <td>R20-M1-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>4</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.336082</td>\n","      <td>NULL</td>\n","      <td>MMCS</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciodb has been restarted.</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>5</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.395008</td>\n","      <td>R20-M1-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>6</td>\n","      <td>6</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.554821</td>\n","      <td>R30-M0-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>7</td>\n","      <td>7</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.755983</td>\n","      <td>R30-M0-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>8</td>\n","      <td>8</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.58.957316</td>\n","      <td>R50-M1-N0-I:J18-U11</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>9</td>\n","      <td>9</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.59.160673</td>\n","      <td>R50-M1-N0-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>10</td>\n","      <td>10</td>\n","      <td>0.00000</td>\n","      <td>0.00000</td>\n","      <td>0.999996</td>\n","      <td>0.000006</td>\n","      <td>2005-11-29-18.25.59.391256</td>\n","      <td>R20-M1-N8-I:J18-U01</td>\n","      <td>KERNEL</td>\n","      <td>INFO</td>\n","      <td>-</td>\n","      <td>ciod: Received signal 15, code=0, errno=0, add...</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8230301c-0cd0-4198-8c4d-f768c274160b')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-8230301c-0cd0-4198-8c4d-f768c274160b button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-8230301c-0cd0-4198-8c4d-f768c274160b');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_394cb7b7-4336-4886-9124-b6fbeb0dbbaf\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('shap_case_table')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_394cb7b7-4336-4886-9124-b6fbeb0dbbaf button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('shap_case_table');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"shap_case_table","summary":"{\n  \"name\": \"shap_case_table\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"shap_rank\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"shap_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.31622447137668813,\n        \"min\": 0.0,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          0.9999895814330557\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"abs_shap_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.31622447137668813,\n        \"min\": 0.0,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0.0,\n          0.9999895814330557\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"original_probability\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 0.9999958276748657,\n        \"max\": 0.9999958276748657,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0.9999958276748657\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"shap_expected_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.0,\n        \"min\": 6.246241810003994e-06,\n        \"max\": 6.246241810003994e-06,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          6.246241810003994e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"full_time\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"2005-11-29-18.25.59.160673\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"node\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 9,\n        \"samples\": [\n          \"R50-M1-N0-I:J18-U01\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"BGLMASTER\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"INFO\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"raw_label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"-\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"event_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5,\n        \"samples\": [\n          \"ciod: Received signal 15, code=0, errno=0, address=0x000001f5\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 36 — SHAP case study for the strongest anomaly\n","# ============================================================\n","\n","shap_case_df = shap_meta_df[\n","    shap_meta_df[\"sequence_local_test_index\"] == case_local_idx\n","].copy()\n","\n","shap_case_df = shap_case_df.sort_values(\n","    \"abs_shap_value\",\n","    ascending=False\n",").reset_index(drop=True)\n","\n","shap_case_df.insert(\n","    0,\n","    \"shap_rank\",\n","    range(1, len(shap_case_df) + 1)\n",")\n","\n","shap_case_table = shap_case_df[[\n","    \"shap_rank\",\n","    \"event_position\",\n","    \"shap_value\",\n","    \"abs_shap_value\",\n","    \"original_probability\",\n","    \"shap_expected_value\",\n","    \"full_time\",\n","    \"node\",\n","    \"component\",\n","    \"severity\",\n","    \"raw_label\",\n","    \"event_message\"\n","]]\n","\n","shap_case_table.to_csv(SHAP_CASE_PATH, index=False)\n","\n","print(\"Saved SHAP case study to:\", SHAP_CASE_PATH)\n","display(shap_case_table)\n"]},{"cell_type":"markdown","id":"d5ce415c","metadata":{"id":"d5ce415c"},"source":["## Step 37 — Compare SHAP with occlusion\n","\n","This checks whether SHAP and occlusion identify the same top event."]},{"cell_type":"code","execution_count":40,"id":"710a2d9e","metadata":{"id":"710a2d9e","executionInfo":{"status":"ok","timestamp":1783281030079,"user_tz":-180,"elapsed":499,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":778},"outputId":"99340ef5-7532-4775-8233-4380d677b589"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved SHAP vs Occlusion comparison to: /content/drive/MyDrive/logminilm_cache/logminilm_shap_occlusion_comparison.csv\n","Top-event agreement rate: 0.8181818181818182\n"]},{"output_type":"display_data","data":{"text/plain":["    sequence_local_test_index  top_shap_event_position  top_shap_value  \\\n","0                       50689                        1        0.999990   \n","1                       40735                       10        0.999990   \n","2                       38707                        1        0.999990   \n","3                       42976                       10        0.999990   \n","4                       36874                        7        0.999990   \n","5                       49134                        3        0.346090   \n","6                       39251                        2        0.256233   \n","7                       42484                        1        0.999990   \n","8                       48879                        2        0.168177   \n","9                       51808                       10        0.999990   \n","10                      42503                        1        0.999990   \n","\n","    top_shap_abs_value top_shap_component top_shap_severity  \\\n","0             0.999990          BGLMASTER           FAILURE   \n","1             0.999990             KERNEL             FATAL   \n","2             0.999990             KERNEL             FATAL   \n","3             0.999990             KERNEL             FATAL   \n","4             0.999990             KERNEL             FATAL   \n","5             0.346090             KERNEL             FATAL   \n","6             0.256233                APP             FATAL   \n","7             0.999990             KERNEL             FATAL   \n","8             0.168177                APP             FATAL   \n","9             0.999990             KERNEL             FATAL   \n","10            0.999990             KERNEL             FATAL   \n","\n","                                     top_shap_message  \\\n","0      ciodb exited abnormally due to signal: Aborted   \n","1                             machine check interrupt   \n","2                             machine check interrupt   \n","3                             machine check interrupt   \n","4                             machine check interrupt   \n","5   machine check interrupt (bit=0x10): L2 dcache ...   \n","6   external input interrupt (unit=0x02 bit=0x00):...   \n","7   machine check interrupt (bit=0x1d): L2 dcache ...   \n","8   ciod: Error reading message prefix on CioStrea...   \n","9       idoproxy communication failure: socket closed   \n","10  machine check interrupt (bit=0x1d): L2 dcache ...   \n","\n","    top_occlusion_event_position  top_occlusion_importance_drop  \\\n","0                              1                   9.999897e-01   \n","1                             10                   9.999868e-01   \n","2                              1                   9.999862e-01   \n","3                             10                   9.999895e-01   \n","4                              7                   9.999895e-01   \n","5                              3                   2.026558e-06   \n","6                              3                   4.291534e-06   \n","7                              1                   9.999860e-01   \n","8                             10                   8.344650e-07   \n","9                             10                   9.999897e-01   \n","10                             1                   9.999862e-01   \n","\n","   top_occlusion_component top_occlusion_severity  \\\n","0                BGLMASTER                FAILURE   \n","1                   KERNEL                  FATAL   \n","2                   KERNEL                  FATAL   \n","3                   KERNEL                  FATAL   \n","4                   KERNEL                  FATAL   \n","5                   KERNEL                  FATAL   \n","6                      APP                  FATAL   \n","7                   KERNEL                  FATAL   \n","8                   KERNEL                  FATAL   \n","9                   KERNEL                  FATAL   \n","10                  KERNEL                  FATAL   \n","\n","                                top_occlusion_message  same_top_event  \n","0      ciodb exited abnormally due to signal: Aborted               1  \n","1                             machine check interrupt               1  \n","2                             machine check interrupt               1  \n","3                             machine check interrupt               1  \n","4                             machine check interrupt               1  \n","5   machine check interrupt (bit=0x10): L2 dcache ...               1  \n","6            Torus non-recoverable error DCRs follow.               0  \n","7   machine check interrupt (bit=0x1d): L2 dcache ...               1  \n","8   machine check interrupt (bit=0x10): L2 dcache ...               0  \n","9       idoproxy communication failure: socket closed               1  \n","10  machine check interrupt (bit=0x1d): L2 dcache ...               1  "],"text/html":["\n","  <div id=\"df-d71ccb5c-e4f9-4f3b-bd8c-1611ac092477\" class=\"colab-df-container\">\n","    <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>sequence_local_test_index</th>\n","      <th>top_shap_event_position</th>\n","      <th>top_shap_value</th>\n","      <th>top_shap_abs_value</th>\n","      <th>top_shap_component</th>\n","      <th>top_shap_severity</th>\n","      <th>top_shap_message</th>\n","      <th>top_occlusion_event_position</th>\n","      <th>top_occlusion_importance_drop</th>\n","      <th>top_occlusion_component</th>\n","      <th>top_occlusion_severity</th>\n","      <th>top_occlusion_message</th>\n","      <th>same_top_event</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>50689</td>\n","      <td>1</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","      <td>1</td>\n","      <td>9.999897e-01</td>\n","      <td>BGLMASTER</td>\n","      <td>FAILURE</td>\n","      <td>ciodb exited abnormally due to signal: Aborted</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>40735</td>\n","      <td>10</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>10</td>\n","      <td>9.999868e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>38707</td>\n","      <td>1</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>1</td>\n","      <td>9.999862e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>42976</td>\n","      <td>10</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>10</td>\n","      <td>9.999895e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>36874</td>\n","      <td>7</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>7</td>\n","      <td>9.999895e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>49134</td>\n","      <td>3</td>\n","      <td>0.346090</td>\n","      <td>0.346090</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x10): L2 dcache ...</td>\n","      <td>3</td>\n","      <td>2.026558e-06</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x10): L2 dcache ...</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>39251</td>\n","      <td>2</td>\n","      <td>0.256233</td>\n","      <td>0.256233</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>external input interrupt (unit=0x02 bit=0x00):...</td>\n","      <td>3</td>\n","      <td>4.291534e-06</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>Torus non-recoverable error DCRs follow.</td>\n","      <td>0</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>42484</td>\n","      <td>1</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x1d): L2 dcache ...</td>\n","      <td>1</td>\n","      <td>9.999860e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x1d): L2 dcache ...</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>48879</td>\n","      <td>2</td>\n","      <td>0.168177</td>\n","      <td>0.168177</td>\n","      <td>APP</td>\n","      <td>FATAL</td>\n","      <td>ciod: Error reading message prefix on CioStrea...</td>\n","      <td>10</td>\n","      <td>8.344650e-07</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x10): L2 dcache ...</td>\n","      <td>0</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>51808</td>\n","      <td>10</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>idoproxy communication failure: socket closed</td>\n","      <td>10</td>\n","      <td>9.999897e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>idoproxy communication failure: socket closed</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>42503</td>\n","      <td>1</td>\n","      <td>0.999990</td>\n","      <td>0.999990</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x1d): L2 dcache ...</td>\n","      <td>1</td>\n","      <td>9.999862e-01</td>\n","      <td>KERNEL</td>\n","      <td>FATAL</td>\n","      <td>machine check interrupt (bit=0x1d): L2 dcache ...</td>\n","      <td>1</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d71ccb5c-e4f9-4f3b-bd8c-1611ac092477')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-d71ccb5c-e4f9-4f3b-bd8c-1611ac092477 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-d71ccb5c-e4f9-4f3b-bd8c-1611ac092477');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_cbe73e07-337e-4a39-ad87-c0edf4fb40ac\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('shap_occ_compare_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_cbe73e07-337e-4a39-ad87-c0edf4fb40ac button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('shap_occ_compare_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"shap_occ_compare_df","summary":"{\n  \"name\": \"shap_occ_compare_df\",\n  \"rows\": 11,\n  \"fields\": [\n    {\n      \"column\": \"sequence_local_test_index\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5229,\n        \"min\": 36874,\n        \"max\": 51808,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          49134,\n          50689,\n          51808\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 5,\n        \"samples\": [\n          10,\n          2,\n          7\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.34940009525980154,\n        \"min\": 0.1681770841108384,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.3460898227095557,\n          0.1681770841108384,\n          0.9999895814330557\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_abs_value\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.34940009525980154,\n        \"min\": 0.1681770841108384,\n        \"max\": 0.9999895814330557,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.3460898227095557,\n          0.1681770841108384,\n          0.9999895814330557\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"BGLMASTER\",\n          \"KERNEL\",\n          \"APP\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"FATAL\",\n          \"FAILURE\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_shap_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 7,\n        \"samples\": [\n          \"ciodb exited abnormally due to signal: Aborted\",\n          \"machine check interrupt\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_occlusion_event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          10,\n          3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_occlusion_importance_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4670926174349683,\n        \"min\": 8.344650268554688e-07,\n        \"max\": 0.9999897194425102,\n        \"num_unique_values\": 11,\n        \"samples\": [\n          2.0265579223632812e-06,\n          0.9999897194425102\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_occlusion_component\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"BGLMASTER\",\n          \"KERNEL\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_occlusion_severity\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"FATAL\",\n          \"FAILURE\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"top_occlusion_message\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 6,\n        \"samples\": [\n          \"ciodb exited abnormally due to signal: Aborted\",\n          \"machine check interrupt\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"same_top_event\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 1,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          0,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}}],"source":["# ============================================================\n","# Step 37 — Compare SHAP ranking with occlusion ranking\n","# ============================================================\n","\n","comparison_rows = []\n","\n","for local_idx in shap_sequence_indices:\n","\n","    # Top SHAP event.\n","    shap_seq = shap_meta_df[\n","        shap_meta_df[\"sequence_local_test_index\"] == local_idx\n","    ].copy()\n","\n","    shap_seq = shap_seq.sort_values(\n","        \"abs_shap_value\",\n","        ascending=False\n","    )\n","\n","    if len(shap_seq) == 0:\n","        continue\n","\n","    top_shap = shap_seq.iloc[0]\n","\n","    # Top occlusion event.\n","    occ_seq = local_xai_df[\n","        local_xai_df[\"sequence_local_test_index\"] == local_idx\n","    ].copy()\n","\n","    occ_seq = occ_seq.sort_values(\n","        \"importance_drop\",\n","        ascending=False\n","    )\n","\n","    if len(occ_seq) == 0:\n","        continue\n","\n","    top_occ = occ_seq.iloc[0]\n","\n","    comparison_rows.append({\n","        \"sequence_local_test_index\": int(local_idx),\n","        \"top_shap_event_position\": int(top_shap[\"event_position\"]),\n","        \"top_shap_value\": float(top_shap[\"shap_value\"]),\n","        \"top_shap_abs_value\": float(top_shap[\"abs_shap_value\"]),\n","        \"top_shap_component\": top_shap[\"component\"],\n","        \"top_shap_severity\": top_shap[\"severity\"],\n","        \"top_shap_message\": top_shap[\"event_message\"],\n","\n","        \"top_occlusion_event_position\": int(top_occ[\"event_position\"]),\n","        \"top_occlusion_importance_drop\": float(top_occ[\"importance_drop\"]),\n","        \"top_occlusion_component\": top_occ[\"component\"],\n","        \"top_occlusion_severity\": top_occ[\"severity\"],\n","        \"top_occlusion_message\": top_occ[\"event_message\"],\n","\n","        \"same_top_event\": int(\n","            int(top_shap[\"event_position\"]) == int(top_occ[\"event_position\"])\n","        )\n","    })\n","\n","shap_occ_compare_df = pd.DataFrame(comparison_rows)\n","\n","shap_occ_compare_df.to_csv(SHAP_COMPARE_PATH, index=False)\n","\n","print(\"Saved SHAP vs Occlusion comparison to:\", SHAP_COMPARE_PATH)\n","\n","if len(shap_occ_compare_df) > 0:\n","    agreement_rate = shap_occ_compare_df[\"same_top_event\"].mean()\n","    print(\"Top-event agreement rate:\", agreement_rate)\n","\n","display(shap_occ_compare_df)\n"]},{"cell_type":"markdown","id":"e4fef8da","metadata":{"id":"e4fef8da"},"source":["## Step 38 — Optional SHAP bar chart for case study\n","\n","This chart shows whether each event pushes the prediction toward anomaly or normal."]},{"cell_type":"code","execution_count":41,"id":"f1c890c5","metadata":{"id":"f1c890c5","executionInfo":{"status":"ok","timestamp":1783281031025,"user_tz":-180,"elapsed":944,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":424},"outputId":"2a7da077-ee84-4645-efa1-3581072de2a5"},"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x400 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA90AAAGGCAYAAABmGOKbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAWXlJREFUeJzt3XmcjfX///HnmRmzmM0+xhgzjH3XiBDCIFuIGktZU4pKQlS2lElFlC0KEYVEC2ISWqjsWbJGZBn7DCMzzLx/f/Sb83WcGWaYy2l8Hvfb7dxuzvu8r+t6Xde5zjHPc13X+7IZY4wAAAAAAEC2c3N1AQAAAAAA3K0I3QAAAAAAWITQDQAAAACARQjdAAAAAABYhNANAAAAAIBFCN0AAAAAAFiE0A0AAAAAgEUI3QAAAAAAWITQDQAAAACARQjdAOBi3bp1U3h4uKvLuOutWbNGNptNa9ascXUpNzRr1izZbDYdOnToji/76tWrGjRokEJDQ+Xm5qY2bdrc8Rpul81m04gRI1xdRpa58n3/Lzp06JBsNptmzZrl6lIA4LYRugE4SPvDL6PHL7/84uoStW7dOo0YMULnz5/P9DQ2m019+/a1rqg7IDU1VbNnz1bNmjWVL18++fv7q3Tp0urSpYvD+5IWLj///PN059OtWzf5+flluJwaNWrIZrNpypQp6b5+/T7i7e2t0qVLq2/fvoqLi7vpetxo/+rdu/dNp79bjB49WkuWLHF1GQ5mzJiht99+W+3bt9fHH3+sF154wdLlZXaf/q+4dOmSRowY8Z/54WbQoEGy2WyKjo52dSk5wvbt29W+fXuFhYXJ29tbISEhaty4sd5//31XlwbgLufh6gIA/De99tprKl68uFN7yZIlXVCNo3Xr1mnkyJHq1q2b8uTJ4+py7pjnnntOkyZNUuvWrdW5c2d5eHhoz549Wr58uUqUKKH77rvvtpexb98+bdiwQeHh4Zo7d66efvrpDPum7SOXL1/WTz/9pClTpmjZsmXasWOHcufOfcPlNG7cWF26dHFqL1269G2vQ04xevRotW/f3ulo8uOPP64OHTrIy8vrjtf0/fffKyQkRO++++4dWd6d2Kez06VLlzRy5EhJ0gMPPODSWowx+vTTTxUeHq6vv/5aFy5ckL+/v0tr+i9bt26dGjRooGLFiqlXr14qXLiwjhw5ol9++UUTJkzQs88+6+oSAdzFCN0A0tWsWTNVr17d1WXg/4uLi9PkyZPVq1cvTZs2zeG18ePH69SpU9mynE8++USFChXS2LFj1b59ex06dCjDU9+v3UeeeOIJ5c+fX+PGjdOXX36pjh073nA5pUuX1mOPPZYtNd9t3N3d5e7u7pJlnzx5Mlt/yEpNTVVycrK8vb2dXrtT+/Tdas2aNfr777/1/fffq2nTpvriiy/UtWtXV5f1n/XGG28oMDBQGzZscNrHT5486ZqiAPzP4PRyAFl25coV5cuXT927d3d6LSEhQd7e3howYIC9LSkpScOHD1fJkiXl5eWl0NBQDRo0SElJSQ7Tpp0CvmTJElWsWFFeXl6qUKGCvv32W3ufESNGaODAgZKk4sWL209Lzo7rIFNTUzV+/HhVqFBB3t7eCgoK0lNPPaVz587Z+7Rs2VIlSpRId/patWo5/VDxySefKDIyUj4+PsqXL586dOigI0eOZLm2gwcPyhijOnXqOL1ms9lUqFChLM8zPfPmzVP79u3VsmVLBQYGat68eZmetmHDhvZab9cff/whHx8fp6PhP/30k9zd3fXSSy/Z28LDw9WyZUutXLlSVatWlbe3t8qXL68vvvjipsv58ccf9cgjj6hYsWL2ffOFF17QP//849Av7ZT8o0ePqk2bNvLz81PBggU1YMAApaSkOPR95513VLt2beXPn18+Pj6KjIx0OtXfZrMpMTFRH3/8sX0f7tatm6SMr+2dPHmyKlSoIC8vLxUpUkR9+vRxusTigQceUMWKFbVr1y41aNBAuXPnVkhIiN56660bboe062dXr16tnTt32mtKO406MTFRL774okJDQ+Xl5aUyZcronXfekTHGab369u2ruXPn2mu99vN7razu0+fPn1e/fv3sNZQsWVJjxoxRamrqDddNko4ePaoePXooKCjI/r0yY8YMp36XL1/WiBEjVLp0aXl7eys4OFgPP/ywDhw4oEOHDqlgwYKSpJEjR9q30bXXj+/evVvt27dXvnz55O3trerVq+urr75yWs7OnTvVsGFD+fj4qGjRonr99dcztR7Xmjt3rsqXL68GDRooKipKc+fOdeqTdqnJggUL9MYbb6ho0aLy9vZWo0aNtH//fqf+CxcutH9fFShQQI899piOHj3q0Cfts3D48GG1bNlSfn5+CgkJ0aRJkyT9ewp3w4YN5evrq7CwMKfvkLNnz2rAgAGqVKmS/Pz8FBAQoGbNmmnbtm03XN+ZM2fKZrNpy5YtTq+NHj1a7u7uTrVe68CBA6pQoUK6Pyql9/2Z2e/uadOmKSIiQj4+PqpRo4Z+/PFHPfDAAw5nQmT0mc5onIlff/1VDz74oAIDA5U7d27Vr19fP//8s0OfESNGyGazaf/+/fazvgIDA9W9e3ddunQp3fWpUaOGcufOrbx586pevXpauXKlQ5/ly5erbt268vX1lb+/v1q0aKGdO3c6zQvALTAAcI2ZM2caSea7774zp06dcnicPn3a3q9Hjx4mT548JikpyWH6jz/+2EgyGzZsMMYYk5KSYpo0aWJy585t+vXrZz744APTt29f4+HhYVq3bu0wrSRTpUoVExwcbEaNGmXGjx9vSpQoYXLnzm1f9rZt20zHjh2NJPPuu++aOXPmmDlz5piLFy/ecL0kmT59+tywzxNPPGE8PDxMr169zNSpU81LL71kfH19zb333muSk5ONMcbMnj3bSDK//fabw7SHDh0ykszbb79tb3v99deNzWYz0dHRZvLkyWbkyJGmQIECJjw83Jw7d87er2vXriYsLOyGtR07dsxIMi1atDCJiYk37Lt69WojycyYMcPpPTx16pTp0KGD8fX1dZrul19+MZLMjz/+aIz59z0uX768U7+0fSTtPU4zYcIEI8lMnTr1hvVJMj179ky3tmv3p7fffttIMl9++aUxxpiLFy+aiIgIU758eXP58mV7v7CwMFO6dGmTJ08eM3jwYDNu3DhTqVIl4+bmZlauXOm0XVavXm1ve/bZZ03z5s3N6NGjzQcffGB69uxp3N3dTfv27R1q7tq1q/H29jYVKlQwPXr0MFOmTDHt2rUzkszkyZMd+hYtWtQ888wzZuLEiWbcuHGmRo0aRpL55ptv7H3mzJljvLy8TN26de378Lp16xy278GDB+39hw8fbiSZqKgo8/7775u+ffsad3d3h33TGGPq169vihQpYkJDQ83zzz9vJk+ebBo2bGgkmWXLlmX4nly8eNHMmTPHlC1b1hQtWtRe04kTJ0xqaqpp2LChsdls5oknnjATJ040rVq1MpJMv379nN7bcuXKmYIFC5qRI0eaSZMmmS1btqS7zKzs04mJiaZy5comf/785uWXXzZTp041Xbp0MTabzTz//PNONQwfPtz+/MSJE6Zo0aImNDTUvPbaa2bKlCnmoYcesn+HpLl69app1KiRkWQ6dOhgJk6caGJiYkzDhg3NkiVLzMWLF82UKVOMJNO2bVv7Ntq2bZsxxpgdO3aYwMBAU758eTNmzBgzceJEU69ePWOz2cwXX3xhX87x48dNwYIFTd68ec2IESPM22+/bUqVKmUqV67s9L5n5PLlyyZPnjxm1KhRxph/v5fc3d3N8ePHHfql7fPVqlUzkZGR5t133zUjRowwuXPnNjVq1HDom7bf3Xvvvebdd981gwcPNj4+Pul+X3l7e5vy5cub3r17m0mTJpnatWsbSWbmzJmmSJEiZuDAgeb99983FSpUMO7u7ubPP/+0T79hwwYTERFhBg8ebD744APz2muvmZCQEBMYGGiOHj1q73fw4EH7PI0xJiEhwfj4+JgXX3zRaXuUL1/eNGzY8IbbrEmTJsbf399s3779pts3s9/dH374oZFkateubd577z3Tr18/kydPHlOiRAlTv359p217/Xub3nfSqlWrjKenp6lVq5YZO3aseffdd03lypWNp6en+fXXX+390r4TqlWrZh5++GEzefJk88QTTxhJZtCgQQ7LGTFihL3Ot99+20yYMMF06tTJvPTSS/Y+s2fPNjabzTz44IPm/fffN2PGjDHh4eEmT548mdonAdwYoRuAg7Q/DtJ7eHl52futWLHCSDJff/21w/TNmzc3JUqUsD+fM2eOcXNzswe5NFOnTjWSzM8//2xvk2Q8PT3N/v377W3btm0zksz7779vb0sLY1n5Q+BmofvHH380kszcuXMd2r/99luH9vj4eOPl5eX0h99bb71lbDab+euvv4wx/4Zwd3d388Ybbzj02759u/Hw8HBoz0zoNsaYLl26GEkmb968pm3btuadd94xf/zxh1O/tD/kbvRIL3T37dvXhIaGmtTUVGOMMStXrjSSnELT9T/MHDlyxHz22Wcmf/78xsfHx/z99983XI8b1fXpp5/a+6WkpJj777/fBAUFmdOnT5s+ffoYDw8Pp7AfFhZmJJlFixbZ2+Lj401wcLCpVq2a03a59g/cS5cuOdUXExPj8F4a8+97JMm89tprDn3Twsy1rp9ncnKyqVixolMo8PX1NV27dnVa/vV/oJ88edJ4enqaJk2amJSUFHu/iRMn2n9cSVO/fn0jycyePdvelpSUZAoX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WFiYvvvuO6f7QO/evduhvux0/T4dERGhixcvZnldCxYsKH9/f6WkpNx02oiICP3666+6cuVKhmeiZPSepb0vuXLluulywsLC7EcWr7Vnz54bTpdm7ty5qlixooYPH+702gcffKB58+Y5he6buXYfu/5o5549e7L1Pf7888/VoEEDffTRRw7t58+fV4ECBW46fZcuXTR27Fh9/fXXWr58uQoWLJjhDx2ZkfbD4fHjxyVl/rs7bZvs27fPYZtduXJFBw8edPjxOe3o8/V3G7j+LJG0S6sCAgKy7XMdERGh1NRU7dq1K8Mgn7bcQoUKWf59Avyv4ppuALfMzc1N7du319dff605c+bo6tWrDqeWS/8eOT169KimT5/uNP0///yjxMTELC/X19dXkvMfMJGRkYqKirI/MntdaVqdKSkpGjVqlNNrV69edVpWdHS0jh07pg8//FDbtm1zWu+HH35Y7u7uGjlypNMRB2OMzpw5k+naJOnEiRPatWuXU3tycrJWrVolNze3Wz6StnjxYiUmJqpPnz5q376906Nly5ZatGiR0y3erHbw4EENHDhQ7dq108svv6x33nlHX331lWbPnu3U99ixY1q8eLH9eUJCgmbPnq2qVatmeGQ87QjRte+PMUYTJky45Zrd3d1ls9kcjmAdOnRIS5Yscerr6+vrtF+lJyoqSp6ennrvvfccav3oo48UHx+vFi1a3HK9mdG8eXOlpKRo4sSJDu3vvvuubDabmjVrdkvzzco+/eijj2r9+vVasWKFU//z58/r6tWr6S7D3d1d7dq106JFi7Rjxw6n16+9F3i7du10+vRpp/WU/m8fyZ07t32Z1ypUqJAeeOABffDBB/bwltFymjdvrl9++UW//fabw+sZnWVzrSNHjuiHH37Qo48+mu5ntXv37tq/f79+/fXXm87rWtWrV1ehQoU0depUh8/58uXL9ccff2TrPubu7u70nbhw4cIb3u7rWpUrV1blypX14YcfatGiRerQoUOmjsSuXr063aO/y5Ytk/R/p9Zn9ru7evXqKliwoKZOnepwWdOsWbOc9o+0UHvt2AMpKSlOlzxERkYqIiJC77zzji5evOhU663cu75NmzZyc3PTa6+95nQmQdr6NW3aVAEBARo9erSuXLmSLcsF4Igj3QDStXz5cvuRrGvVrl3b4WhbdHS03n//fQ0fPlyV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xcTEqHjx4vLx8VGVKlX0+eef2/unHS1etWqVqlevrty5c6t27dras2ePJGnWrFkaOXKktm3bZj/SPmvWrHRr7datm9q0aaORI0eqYMGCCggIUO/evZWcnGzvk5SUpOeee06FChWSt7e37r//fm3YsMH++rlz59S5c2cVLFhQPj4+KlWqlP1Hh2tPLz906JAaNGggScqbN69sNpu6desmyfnU6nPnzqlLly7KmzevcufOrWbNmmnfvn3212fNmqU8efJoxYoVKleunPz8/PTggw/q+PHjGb4v1x9lv5V5SNJ7772nPn36qESJEum+PnfuXCUnJ2vGjBmqUKGCOnTooOeee07jxo274Xyvd/3p5TabTR9++KHatm2r3Llzq1SpUvrqq68cptmxY4eaNWsmPz8/BQUF6fHHH9fp06czXMZff/2lVq1aKW/evPL19VWFChW0bNmyTM8vMTFRXbp0kZ+fn4KDgzV27Fin99Jms2nJkiUOy82TJ4/DPnnkyBE9+uijypMnj/Lly6fWrVvr0KFD9tfT9tN33nlHwcHByp8/v/r06aMrV67Y+yQlJemll15SaGiovLy8VLJkSX300Ue3vG0AANYgdAMALNW5c2d9/fXXunjxor1txYoVunTpktq2bStJiomJ0ezZszV16lTt3LlTL7zwgh577DGtXbvWYV6vvPKKxo4dq40bN8rDw0M9evSQJEVHR+vFF19UhQoVdPz4cR0/ftwp6F9r1apV+uOPP7RmzRp9+umn+uKLLzRy5Ej764MGDdKiRYv08ccfa/PmzSpZsqSaNm2qs2fPSpKGDh2qXbt2afny5frjjz80ZcoUFShQwGk5oaGhWrRokSRpz549On78uCZMmJBuTd26ddPGjRv11Vdfaf369TLGqHnz5g4h69KlS3rnnXc0Z84c/fDDDzp8+LAGDBhww+1/veyYx/XWr1+vevXqydPT097WtGlT7dmzR+fOnbuteY8cOVKPPvqofv/9dzVv3lydO3e2vw/nz59Xw4YNVa1aNW3cuFHffvut4uLi9Oijj2Y4vz59+igpKUk//PCDtm/frjFjxsjPzy/T8xs4cKDWrl2rL7/8UitXrtSaNWu0efPmLK3TlStX1LRpU/n7++vHH3/Uzz//bP8B5Noff1avXq0DBw5o9erV+vjjjzVr1iyH4N6lSxd9+umneu+99/THH3/ogw8+yNK6AADuEAMAwG3o2rWrcXd3N76+vg6PN954wxhjzJUrV0yBAgXM7Nmz7dN07NjRREdHG2OMuXz5ssmdO7dZt26dw3x79uxpOnbsaIwxZvXq1UaS+e677+yvL1261Egy//zzjzHGmOHDh5sqVapkqt58+fKZxMREe9uUKVOMn5+fSUlJMRcvXjS5cuUyc+fOtb+enJxsihQpYt566y1jjDGtWrUy3bt3T3f+Bw8eNJLMli1bHGo/d+6cQ7/69eub559/3hhjzN69e40k8/PPP9tfP336tPHx8TELFiwwxhgzc+ZMI8ns37/f3mfSpEkmKCgow3W9ftm3Mo9rZbSNGzdubJ588kmHtp07dxpJZteuXRnO79ptYIwxYWFh5t1337U/l2ReffVV+/OLFy8aSWb58uXGGGNGjRplmjRp4jDPI0eOGElmz5496S6zUqVKZsSIEem+drP5XbhwwXh6etrfE2OMOXPmjPHx8XFYD0lm8eLFDvMJDAw0M2fONMYYM2fOHFOmTBmTmppqfz0pKcn4+PiYFStWGGP+3U/DwsLM1atX7X0eeeQR++dmz549RpKJjY29pXUBANw5XNMNALhtDRo00JQpUxza0q5Z9vDw0KOPPqq5c+fq8ccfV2Jior788kt99tlnkqT9+/fr0qVLaty4scP0ycnJqlatmkNb5cqV7f8ODg6WJJ08eVLFihXLUr1VqlRR7ty57c9r1aqlixcv6siRI4qPj9eVK1dUp04d++u5cuVSjRo19Mcff0iSnn76abVr106bN29WkyZN1KZNG9WuXTtLNVzrjz/+kIeHh2rWrGlvy58/v8qUKWNfpiTlzp1bERER9ufBwcE6efJklpaVHfPIqh9//FHNmjWzP//ggw/UuXPnTE177Xvu6+urgIAAe73btm3T6tWr7Ud3r3XgwAGVLl3aqf25557T008/rZUrVyoqKkrt2rWzL+Nm8/vnn3+UnJzs8D7ly5dPZcqUydS6pNm2bZv2798vf39/h/bLly/rwIED9ucVKlSQu7u7/XlwcLC2b98uSdq6davc3d1Vv379DJeR1W0DALAGoRsAcNt8fX1VsmTJDF/v3Lmz6tevr5MnTyo2NlY+Pj720c3TTjtfunSpQkJCHKa7fjC2XLly2f9ts9kk/Xs9+J3WrFkz/fXXX1q2bJliY2PVqFEj9enTR++8846ly712/aV/t4Ex5o7P43qFCxdWXFycQ1va88KFCys8PNzhFmpBQUGZnnd69aa95xcvXlSrVq00ZswYp+nSfpS53hNPPKGmTZtq6dKlWrlypWJiYjR27Fg9++yzN53f/v37M1Vzetv02ssELl68qMjISM2dO9dp2msHk7vRuvv4+NywhlvZNgAAaxC6AQCWq127tkJDQzV//nwtX75cjzzyiD1QlC9fXl5eXjp8+HCGR+0yw9PTUykpKZnqu23bNv3zzz/24PLLL7/Iz89PoaGhKlCggDw9PfXzzz8rLCxM0r+BacOGDQ6DZRUsWFBdu3ZV165dVbduXQ0cODDd0J12nfONaitXrpyuXr2qX3/91X7E/MyZM9qzZ4/Kly+fqXVypVq1aumVV17RlStX7O9rbGysypQpYx9Q70Y/ytyqe+65R4sWLVJ4eLg8PDL/J01oaKh69+6t3r17a8iQIZo+fbqeffbZm84vIiJCuXLl0q+//mo/u+LcuXPau3evw75bsGBBh8Hp9u3bp0uXLjnUPX/+fBUqVEgBAQG3suqqVKmSUlNTtXbtWkVFRTm9fqvbBgCQ/RhIDQBw25KSknTixAmHx/WjJHfq1ElTp05VbGysw6nF/v7+GjBggF544QV9/PHHOnDggDZv3qz3339fH3/8caZrCA8P18GDB7V161adPn1aSUlJGfZNTk5Wz549tWvXLi1btkzDhw9X37595ebmJl9fXz399NMaOHCgvv32W+3atUu9evXSpUuX1LNnT0nSsGHD9OWXX2r//v3auXOnvvnmG5UrVy7dZYWFhclms+mbb77RqVOnHAaUS1OqVCm1bt1avXr10k8//aRt27bpscceU0hIiFq3bp3pbWCV/fv3a+vWrTpx4oT++ecfbd26VVu3brUP+tWpUyd5enqqZ8+e2rlzp+bPn68JEyaof//+ltbVp08fnT17Vh07dtSGDRt04MABrVixQt27d8/wR45+/fppxYoVOnjwoDZv3qzVq1fb37ubzc/Pz089e/bUwIED9f3332vHjh3q1q2b3Nwc/5xq2LChJk6cqC1btmjjxo3q3bu3w1Hrzp07q0CBAmrdurV+/PFHHTx4UGvWrNFzzz2nv//+O1PrHh4erq5du6pHjx5asmSJfR4LFiy45W0DALAGoRsAcNu+/fZbBQcHOzzuv/9+hz6dO3fWrl27FBIS4nC9tCSNGjVKQ4cOVUxMjMqVK6cHH3xQS5cuVfHixTNdQ7t27fTggw+qQYMGKliwoD799NMM+zZq1EilSpVSvXr1FB0drYceekgjRoywv/7mm2+qXbt2evzxx3XPPfdo//79WrFihf2oraenp4YMGaLKlSurXr16cnd3t1+jfr2QkBCNHDlSgwcPVlBQkPr27Ztuv5kzZyoyMlItW7ZUrVq1ZIzRsmXLnE4xdoUnnnhC1apV0wcffKC9e/eqWrVqqlatmo4dOyZJCgwM1MqVK3Xw4EFFRkbqxRdf1LBhw7J0j+5bUaRIEf38889KSUlRkyZNVKlSJfXr10958uRxCsJpUlJS1KdPH/t+Vrp0aU2ePDnT83v77bdVt25dtWrVSlFRUbr//vsVGRnpsIyxY8cqNDRUdevWVadOnTRgwACHMQRy586tH374QcWKFdPDDz+scuXKqWfPnrp8+XKWjnxPmTJF7du31zPPPKOyZcuqV69eSkxMvOVtAwCwhs3c7oVcAADkIN26ddP58+ed7qMM3KoHHnhAVatWdbjHOAAAafipEwAAAAAAixC6AQAAAACwCKeXAwAAAABgEY50AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGCR/weS+UKRy8BOzQAAAABJRU5ErkJggg==\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved SHAP case study plot to: /content/drive/MyDrive/logminilm_cache/logminilm_shap_case_study_plot.png\n"]}],"source":["# ============================================================\n","# Step 38 — Optional SHAP bar chart for case study\n","# ============================================================\n","\n","if len(shap_case_table) > 0:\n","\n","    plot_df = shap_case_table.sort_values(\"event_position\")\n","\n","    plt.figure(figsize=(10, 4))\n","    plt.bar(\n","        plot_df[\"event_position\"].astype(str),\n","        plot_df[\"shap_value\"]\n","    )\n","\n","    plt.axhline(0, linewidth=1)\n","    plt.xlabel(\"Event position in 10-line sequence\")\n","    plt.ylabel(\"SHAP value\")\n","    plt.title(\"Event-Level SHAP Explanation for Selected Anomaly Sequence\")\n","    plt.tight_layout()\n","\n","    SHAP_CASE_PLOT_PATH = CACHE_DIR / \"logminilm_shap_case_study_plot.png\"\n","    plt.savefig(SHAP_CASE_PLOT_PATH, dpi=300, bbox_inches=\"tight\")\n","    plt.show()\n","\n","    print(\"Saved SHAP case study plot to:\", SHAP_CASE_PLOT_PATH)\n","\n","else:\n","    print(\"No SHAP case study available for plotting.\")\n"]},{"cell_type":"markdown","id":"1b571dd9","metadata":{"id":"1b571dd9"},"source":["## Step 39 — Thesis-ready SHAP summary\n","\n","This prints the supporting SHAP outputs and the agreement rate between SHAP and occlusion."]},{"cell_type":"code","execution_count":42,"id":"c7169377","metadata":{"id":"c7169377","executionInfo":{"status":"ok","timestamp":1783281031046,"user_tz":-180,"elapsed":17,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"5e4267a1-6195-43f0-f41c-a1dcd6eede9d"},"outputs":[{"output_type":"stream","name":"stdout","text":["SHAP event-level explanation completed.\n","Saved SHAP local explanations: /content/drive/MyDrive/logminilm_cache/logminilm_shap_event_level_explanations.csv\n","Saved SHAP case study: /content/drive/MyDrive/logminilm_cache/logminilm_shap_case_study.csv\n","Saved SHAP vs Occlusion comparison: /content/drive/MyDrive/logminilm_cache/logminilm_shap_occlusion_comparison.csv\n","SHAP-Occlusion top-event agreement rate: 0.8181818181818182\n","\n","Thesis-ready wording:\n","\n","SHAP was applied as a supporting XAI method at the event level.\n","Each position in the 10-line LogMiniLM input sequence was treated as an interpretable feature.\n","For each selected sequence, SHAP estimated the contribution of keeping each event relative to a neutral baseline sequence.\n","Positive SHAP values indicate events that push the model toward an anomaly prediction, while lower or negative values indicate weaker or normalizing contributions.\n","The SHAP explanations were mapped back to operational metadata including timestamp, node, component, severity, label, and event message.\n","Finally, SHAP rankings were compared with occlusion-based rankings to check whether both explanation methods identified the same influential events.\n","\n"]}],"source":["# ============================================================\n","# Step 39 — Thesis-ready SHAP summary\n","# ============================================================\n","\n","print(\"SHAP event-level explanation completed.\")\n","print(\"Saved SHAP local explanations:\", SHAP_LOCAL_PATH)\n","print(\"Saved SHAP case study:\", SHAP_CASE_PATH)\n","print(\"Saved SHAP vs Occlusion comparison:\", SHAP_COMPARE_PATH)\n","\n","if \"shap_occ_compare_df\" in globals() and len(shap_occ_compare_df) > 0:\n","    agreement_rate = shap_occ_compare_df[\"same_top_event\"].mean()\n","    print(\"SHAP-Occlusion top-event agreement rate:\", agreement_rate)\n","\n","print(\"\"\"\n","Thesis-ready wording:\n","\n","SHAP was applied as a supporting XAI method at the event level.\n","Each position in the 10-line LogMiniLM input sequence was treated as an interpretable feature.\n","For each selected sequence, SHAP estimated the contribution of keeping each event relative to a neutral baseline sequence.\n","Positive SHAP values indicate events that push the model toward an anomaly prediction, while lower or negative values indicate weaker or normalizing contributions.\n","The SHAP explanations were mapped back to operational metadata including timestamp, node, component, severity, label, and event message.\n","Finally, SHAP rankings were compared with occlusion-based rankings to check whether both explanation methods identified the same influential events.\n","\"\"\")\n"]},{"cell_type":"markdown","id":"99357d24","metadata":{"id":"99357d24"},"source":["# Part 4 — Thesis Charts and Figure Export\n","\n","These steps generate presentation-ready charts for the earlier pipeline stages, detection results, and XAI validation. Run them after the detection evaluation and XAI/SHAP sections have completed.\n","\n","The figures are saved under `logminilm_cache/figures/` in Google Drive."]},{"cell_type":"markdown","id":"c4f87788","metadata":{"id":"c4f87788"},"source":["## Step 40 — Figure directory and chart helpers\n","\n","This step creates a dedicated folder for thesis figures and defines a small helper for saving charts consistently."]},{"cell_type":"code","execution_count":43,"id":"377a1841","metadata":{"id":"377a1841","executionInfo":{"status":"ok","timestamp":1783281031055,"user_tz":-180,"elapsed":8,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"484f6420-3bf3-4e8f-9b0e-4a87775e293a"},"outputs":[{"output_type":"stream","name":"stdout","text":["Figures will be saved to: /content/drive/MyDrive/logminilm_cache/figures\n"]}],"source":["# ============================================================\n","# Step 40 — Figure directory and chart helpers\n","# ============================================================\n","\n","import matplotlib.pyplot as plt\n","import numpy as np\n","import pandas as pd\n","from pathlib import Path\n","\n","FIGURES_DIR = CACHE_DIR / \"figures\"\n","FIGURES_DIR.mkdir(parents=True, exist_ok=True)\n","\n","print(\"Figures will be saved to:\", FIGURES_DIR)\n","\n","\n","def save_current_figure(filename):\n","    \"\"\"Save the current matplotlib figure as a high-resolution PNG.\"\"\"\n","    path = FIGURES_DIR / filename\n","    plt.savefig(path, dpi=300, bbox_inches=\"tight\")\n","    print(\"Saved figure to:\", path)\n","    return path\n"]},{"cell_type":"markdown","id":"01f765d3","metadata":{"id":"01f765d3"},"source":["## Step 41 — BGL line-level class distribution\n","\n","This chart shows the original normal/anomaly imbalance before sequence construction."]},{"cell_type":"code","execution_count":44,"id":"d0741b4b","metadata":{"id":"d0741b4b","executionInfo":{"status":"ok","timestamp":1783281033203,"user_tz":-180,"elapsed":2147,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":537},"outputId":"690080a5-41f9-4aa2-fbdf-050e3fff97ab"},"outputs":[{"output_type":"stream","name":"stdout","text":["Line-level class distribution\n"]},{"output_type":"display_data","data":{"text/plain":["     class    count  percentage\n","0   Normal  4365033   92.607181\n","1  Anomaly   348460    7.392819"],"text/html":["\n","  <div id=\"df-deb4dfd0-73f4-4cc2-b4fd-e9028638c978\" class=\"colab-df-container\">\n","    <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>class</th>\n","      <th>count</th>\n","      <th>percentage</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>Normal</td>\n","      <td>4365033</td>\n","      <td>92.607181</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>Anomaly</td>\n","      <td>348460</td>\n","      <td>7.392819</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-deb4dfd0-73f4-4cc2-b4fd-e9028638c978')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-deb4dfd0-73f4-4cc2-b4fd-e9028638c978 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-deb4dfd0-73f4-4cc2-b4fd-e9028638c978');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_d82ed548-a4f3-4ce7-bdaf-93ee08cbe0cb\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('line_distribution_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_d82ed548-a4f3-4ce7-bdaf-93ee08cbe0cb button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('line_distribution_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"line_distribution_df","summary":"{\n  \"name\": \"line_distribution_df\",\n  \"rows\": 2,\n  \"fields\": [\n    {\n      \"column\": \"class\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"Anomaly\",\n          \"Normal\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"count\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 2840146,\n        \"min\": 348460,\n        \"max\": 4365033,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          348460,\n          4365033\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"percentage\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 60.25565340673668,\n        \"min\": 7.392818871270203,\n        \"max\": 92.60718112872979,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          7.392818871270203,\n          92.60718112872979\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/01_bgl_line_level_class_distribution.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 600x400 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAk4AAAGGCAYAAACNCg6xAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOXpJREFUeJzt3Xd8VFX+//H3pE0S0ugQWjAgEAgdFKIUiUSaIEpRVEDAsiBN+UJWBcECuICoFNGNiRUQAVlwpagUZYOAiCjSQo2CIBKSEFZKcn5/+MusYxK4AxNmgNfz8ZjHg3vuued+Zkgm79xz5sZmjDECAADARfl4ugAAAICrBcEJAADAIoITAACARQQnAAAAiwhOAAAAFhGcAAAALCI4AQAAWERwAgAAsIjgBAAAYBHBCfAC/fr1U1RUlKfL8Eo2m03PPvusW8e8Vl7vNWvWyGazac2aNcV+rmeffVY2m82pzWazaciQIcV+bklKSUmRzWbTgQMHrsj5gKIQnHBNyH9T/fOjXLlyatu2rT799NNCjzl27JjGjBmj2NhYhYSEKDAwUDVq1FD//v311VdfFTr+5s2bXa4tKipKnTt3vqTndSVcznPzNllZWRo/frwaNGigkJAQBQUFqV69eho9erQOHz7s6fIu6MCBA05fv/7+/ipTpoxatmypv//97zp06JDbzvXiiy/q448/dtt47uTNtQGS5OfpAgB3mjBhgqpXry5jjI4ePaqUlBR17NhRS5cudQovGzduVKdOnZSdna3evXvr0Ucfld1u1/79+/Xxxx8rJSVFa9euVatWra5I3W+++aby8vKuyLmuVfv27VN8fLwOHTqkHj166OGHH1ZAQIC2bdumpKQkLV68WLt37/Z0mRd17733qmPHjsrLy1NGRoY2bdqk6dOn65VXXlFSUpJ69+7t6NuqVSv997//VUBAgEvnePHFF3XPPfeoW7dulo95+umnNWbMGJfOcymKqu2BBx5Q7969Zbfbi70G4EIITrimdOjQQU2bNnVsDxgwQOXLl9fcuXMdwSkjI0PdunWTn5+ftm7dqtq1azuN8fzzz2vevHkKCgq6YnX7+/tfsXNdi86fP6/u3bvr6NGjWrNmjW655Ran/S+88IImT57soepc07hxY91///1ObQcPHlT79u3Vt29f1alTRw0aNJAk+fj4KDAwsFjrycnJUYkSJeTn5yc/P8/9yPD19ZWvr6/Hzg/kY6oO17SIiAgFBQU5veG//vrrOnLkiKZPn14gNEl/rNu499571axZsytW51/X3ORP20yZMkVvvPGGoqOjZbfb1axZM23atKnA8Tt37tQ999yjUqVKKTAwUE2bNtW//vUvt9b4888/66GHHlL58uVlt9tVt25dvfXWW479R48elZ+fn8aPH1/g2F27dslms2nGjBmOtpMnT2r48OGqUqWK7Ha7atSoocmTJ1/SlbeFCxfqu+++01NPPVUgNElSWFiYXnjhhQuOMWXKFLVs2VKlS5dWUFCQmjRpoo8++qhAv1WrVumWW25RRESEQkJCVKtWLf3973936vPaa6+pbt26Cg4OVsmSJdW0aVN98MEHLj+vfNWqVVNKSorOnj2rl156ydFe2BqnPXv26O6771aFChUUGBioypUrq3fv3srMzJT0x9d3Tk6O3n77bce0YL9+/ST9bx3Tjz/+qPvuu08lS5Z0vJ6FrXHK9/7776tWrVoKDAxUkyZNtG7dOqf9Ra0p++uYF6qtqDVOs2bNUt26dWW32xUZGanBgwfr5MmTTn3atGmjevXq6ccff1Tbtm0VHBysSpUqOb2WgFVcccI1JTMzU8ePH5cxRseOHdNrr72mU6dOOf0Gv3TpUgUFBal79+4erNSaDz74QNnZ2XrkkUdks9n00ksvqXv37tq3b5/jKtX27dsVFxenSpUqacyYMSpRooQ+/PBDdevWTQsXLtRdd9112XUcPXpUN998s2MxcNmyZfXpp59qwIABysrK0vDhw1W+fHm1bt1aH374ocaNG+d0/Pz58+Xr66sePXpIkk6fPq3WrVvr559/1iOPPKKqVavqP//5jxITEx2h1hX5IfGBBx645Of4yiuv6M4771SfPn109uxZzZs3Tz169NCyZcvUqVMnSX+81p07d1b9+vU1YcIE2e12paWlaf369Y5x3nzzTQ0dOlT33HOPhg0bpt9//13btm3T119/rfvuu++S62vRooWio6O1atWqIvucPXtWCQkJOnPmjB5//HFVqFBBP//8s5YtW6aTJ08qPDxc7777rgYOHKjmzZvr4YcfliRFR0c7jdOjRw/VrFlTL774oowxF6xr7dq1mj9/voYOHSq73a5Zs2bpjjvu0MaNG1WvXj2XnqOV2v7s2Wef1fjx4xUfH6/HHntMu3bt0uzZs7Vp0yatX7/e6UpuRkaG7rjjDnXv3l09e/bURx99pNGjRys2NlYdOnRwqU5c5wxwDUhOTjaSCjzsdrtJSUlx6luyZEnTsGHDAmNkZWWZX3/91fE4depUgfE3bdrkcm3VqlUznTp1umCfvn37mmrVqjm29+/fbySZ0qVLmxMnTjjalyxZYiSZpUuXOtratWtnYmNjze+//+5oy8vLMy1btjQ1a9a8aH1WntuAAQNMxYoVzfHjx53ae/fubcLDw83p06eNMcbMmTPHSDLff/+9U7+YmBhz2223Obafe+45U6JECbN7926nfmPGjDG+vr7m0KFDjjZJZty4cRd8Do0aNTLh4eEX7PNnf329jTGO55Dv7Nmzpl69ek51v/zyy0aS+fXXX4scu2vXrqZu3bqWa8mX/3/+j3/844JjSzKZmZnGGGNWr15tJJnVq1cbY4z59ttvjSSzYMGCC56rRIkSpm/fvgXax40bZySZe++9t8h9f5b/fbZ582ZH28GDB01gYKC56667HG2Fvd5FjVlUbflfp/v37zfGGHPs2DETEBBg2rdvb3Jzcx39ZsyYYSSZt956y9HWunVrI8m88847jrYzZ86YChUqmLvvvrvAuYALYaoO15SZM2dq1apVWrVqld577z21bdtWAwcO1KJFixx9srKyFBISUuDYBx54QGXLlnU8Ro8efSVLL1SvXr1UsmRJx/att94q6Y+F0JJ04sQJffHFF+rZs6eys7N1/PhxHT9+XL/99psSEhK0Z88e/fzzz5dVgzFGCxcuVJcuXWSMcZzj+PHjSkhIUGZmprZs2SJJ6t69u/z8/DR//nzH8T/88IN+/PFH9erVy9G2YMEC3XrrrSpZsqTTePHx8crNzS0w1XMxWVlZCg0Nvazn+ec1bRkZGcrMzNStt97qeG7SH1O/krRkyZIipxQjIiL0008/FTqlernyv26zs7ML3R8eHi5JWrFihU6fPn3J53n00Uct923RooWaNGni2K5ataq6du2qFStWKDc395JruJjPPvtMZ8+e1fDhw+Xj878fZYMGDVJYWJg++eQTp/4hISFOV54DAgLUvHlzx/cSYNU1E5zWrVunLl26KDIyUjab7ZI+zmqM0ZQpU3TjjTfKbrerUqVKF10XAe/SvHlzxcfHKz4+Xn369NEnn3yimJgYDRkyRGfPnpUkhYaG6tSpUwWOnTBhgiN0eYuqVas6beeHqIyMDElSWlqajDF65plnnEJf2bJlHdNlx44dU25urn755RenR/7rcTG//vqrTp48qTfeeKPAOfr37+84hySVKVNG7dq104cffug4fv78+fLz83OaGt2zZ4+WL19eYLz4+Hin8awKCwsrMkxYtWzZMt18880KDAxUqVKlVLZsWc2ePduxNkj6I8jGxcVp4MCBKl++vHr37q0PP/zQKUSNHj1aISEhat68uWrWrKnBgwc7TeVdjvyv26JCYvXq1TVy5Ej985//VJkyZZSQkKCZM2c6PQcrqlevbrlvzZo1C7TdeOONOn36tH799VeXzuuKgwcPSpJq1arl1B4QEKAbbrjBsT9f5cqVC6zRKlmypON7CbDqmlnjlJOTowYNGuihhx665LUrw4YN08qVKzVlyhTFxsbqxIkTOnHihJsrxZXk4+Ojtm3b6pVXXtGePXtUt25d1a5dW999953OnTvntAaifv36Hqy0cEV9isj8/3Un+T+wn3zySSUkJBTat0aNGkpPTy/ww3D16tVq06bNRWvIP8f999+vvn37Ftrnz69d79691b9/f23dulUNGzbUhx9+qHbt2qlMmTJOY95+++36v//7v0LHu/HGGy9a15/Vrl1b3377rdLT01WlShWXjpWkL7/8UnfeeadatWqlWbNmqWLFivL391dycrLTou6goCCtW7dOq1ev1ieffKLly5dr/vz5uu2227Ry5Ur5+vqqTp062rVrl5YtW6bly5dr4cKFmjVrlsaOHVvownlX/PDDDypXrpzCwsKK7DN16lT169dPS5Ys0cqVKzV06FBNnDhRGzZsUOXKlS2dx92fKC1qUXlxXpH6q4t9LwFWXTPBqUOHDhdc4HfmzBk99dRTmjt3rk6ePKl69epp8uTJjh8cO3bs0OzZs/XDDz84foNx5bcueK/z589L+t9v6507d9aGDRu0ePFi9ezZ05OlXbYbbrhB0h+3M8i/WlMYf3//AlfS8j/SfjFly5ZVaGiocnNzL3iOfN26ddMjjzzimK7bvXu3EhMTnfpER0fr1KlTlsazokuXLpo7d67ee++9AueyYuHChQoMDNSKFSuc7hOUnJxcoK+Pj4/atWundu3aadq0aXrxxRf11FNPafXq1Y7nU6JECfXq1Uu9evXS2bNn1b17d73wwgtKTEy8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wenVV19VdHS0WrRoocDAQAUGBiouLk41atTQK6+8Uhw1AgAAeAWX1zhFRERoyZIl2rNnj3bu3ClJqlOnjmrUqOH24gAAALzJJd3HSZJq1qypmjVrurMWAAAAr2YpOI0cOdLygNOmTbvkYgAAALyZpeD07bffWhrMZrNdVjEAAADezFJwWr16dXHXAQAA4PVc/lQdAADA9YrgBAAAYBHBCQAAwCKCEwAAgEWWglPjxo2VkZEhSZowYYJOnz5drEUBAAB4I0vBaceOHcrJyZEkjR8/XqdOnSrWogAAALyRpdsRNGzYUP3799ctt9wiY4ymTJmikJCQQvuOHTvWrQUCAAB4C0vBKSUlRePGjdOyZctks9n06aefys+v4KE2m43gBAAArlmWglOtWrU0b948SZKPj48+//xzlStXrlgLAwAA8DYu/5HfvLy84qgDAADA67kcnCRp7969mj59unbs2CFJiomJ0bBhwxQdHe3W4gAAALyJy/dxWrFihWJiYrRx40bVr19f9evX19dff626detq1apVxVEjAACAV3D5itOYMWM0YsQITZo0qUD76NGjdfvtt7utOAAAAG/i8hWnHTt2aMCAAQXaH3roIf34449uKQoAAMAbuRycypYtq61btxZo37p1K5+0AwAA1zSXp+oGDRqkhx9+WPv27VPLli0lSevXr9fkyZM1cuRItxcIAADgLVwOTs8884xCQ0M1depUJSYmSpIiIyP17LPPaujQoW4vEAAAwFu4HJxsNptGjBihESNGKDs7W5IUGhrq9sIAAAC8zSXdxykfgQkAAFxPXF4cDgAAcL0iOAEAAFhEcAIAALDIpeB07tw5tWvXTnv27CmuegAAALyWS8HJ399f27ZtK65aAAAAvJrLU3X333+/kpKS3HLyiRMnqlmzZgoNDVW5cuXUrVs37dq1yy1jAwAAuJvLtyM4f/683nrrLX322Wdq0qSJSpQo4bR/2rRplsdau3atBg8erGbNmun8+fP6+9//rvbt2+vHH38sMC4AAICnuRycfvjhBzVu3FiStHv3bqd9NpvNpbGWL1/utJ2SkqJy5crpm2++UatWrVwtDQAAoFi5HJxWr15dHHVIkjIzMyVJpUqVKrZzAAAAXKpLvnN4Wlqa9u7dq1atWikoKEjGGJevOP1ZXl6ehg8frri4ONWrV6/QPmfOnNGZM2cc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BCdcUf369ZPNZtOkSZOc2j/++GNuYgpAqamp8vX1VadOnTxdClAoghOuuMDAQE2ePFkZGRluG/Ps2bNuGwuA5yQlJenxxx/XunXrdPjwYU+XAxRAcMIVFx8frwoVKmjixIlF9lm4cKHq1q0ru92uqKgoTZ061Wl/VFSUnnvuOT344IMKCwvTww8/rJSUFEVERGjZsmWqVauWgoODdc899+j06dN6++23FRUVpZIlS2ro0KHKzc11jPXuu++qadOmCg0NVYUKFXTffffp2LFjxfb8ARTu1KlTmj9/vh577DF16tRJKSkpjn35U+aff/65mjZtquDgYLVs2VK7du1yGmP27NmKjo5WQECAatWqpXfffddpv81m05w5c9S5c2cFBwerTp06Sk1NVVpamtq0aaMSJUqoZcuW2rt3r+OYvXv3qmvXripfvrxCQkLUrFkzffbZZ0U+j4ceekidO3d2ajt37pzKlSunpKSky3iF4BUMcAX17dvXdO3a1SxatMgEBgaa9PR0Y4wxixcvNvlfjps3bzY+Pj5mwoQJZteuXSY5OdkEBQWZ5ORkxzjVqlUzYWFhZsqUKSYtLc2kpaWZ5ORk4+/vb26//XazZcsWs3btWlO6dGnTvn1707NnT7N9+3azdOlSExAQYObNm+cYKykpyfz73/82e/fuNampqaZFixamQ4cOjv2rV682kkxGRsYVeY2A61VSUpJp2rSpMcaYpUuXmujoaJOXl2eM+d/34U033WTWrFljtm/fbm699VbTsmVLx/GLFi0y/v7+ZubMmWbXrl1m6tSpxtfX13zxxReOPpJMpUqVzPz5882uXbtMt27dTFRUlLntttvM8uXLzY8//mhuvvlmc8cddziO2bp1q3n99dfN999/b3bv3m2efvppExgYaA4ePOjoU61aNfPyyy8bY4xZv3698fX1NYcPH3aqrUSJEiY7O7tYXjtcOQQnXFH5wckYY26++Wbz0EMPGWOcg9N9991nbr/9dqfjRo0aZWJiYhzb1apVM926dXPqk5ycbCSZtLQ0R9sjjzxigoODnd6sEhISzCOPPFJkjZs2bTKSHMcQnIAro2XLlmb69OnGGGPOnTtnypQpY1avXm2M+d/34Weffebo/8knnxhJ5r///a/j+EGDBjmN2aNHD9OxY0fHtiTz9NNPO7ZTU1ONJJOUlORomzt3rgkMDLxgrXXr1jWvvfaaY/vPwckYY2JiYszkyZMd2126dDH9+vW72EuAqwBTdfCYyZMn6+2339aOHTuc2nfs2KG4uDintri4OO3Zs8dpiq1p06YFxgwODlZ0dLRju3z58oqKilJISIhT25+n4r755ht16dJFVatWVWhoqFq3bi1JOnTo0OU9QQCW7dq1Sxs3btS9994rSfLz81OvXr0KTG3Vr1/f8e+KFStKkuP7uaj3jr++x/x5jPw/7xUbG+vU9vvvvysrK0vSH1OITz75pOrUqaOIiAiFhIRox44dF3yPGDhwoJKTkyVJR48e1aeffqqHHnrIwisBb0dwgse0atVKCQkJSkxMvKTjS5QoUaDN39/fadtmsxXalpeXJ0nKyclRQkKCwsLC9P7772vTpk1avHixJBacA1dSUlKSzp8/r8jISPn5+cnPz0+zZ8/WwoULlZmZ6ej35+/n/E/i5n8/W1XYGBca98knn9TixYv14osv6ssvv9TWrVsVGxt7wfeIBx98UPv27VNqaqree+89Va9eXbfeeqtLdcI7ecXfqsP1a9KkSWrYsKFq1arlaKtTp47Wr1/v1G/9+vW68cYb5evr69bz79y5U7/99psmTZqkKlWqSJI2b97s1nMAuLDz58/rnXfe0dSpU9W+fXunfd26ddPcuXNVu3bti46T/97Rt29fR9v69esVExNzWfWtX79e/fr101133SXpjytQBw4cuOAxpUuXVrdu3ZScnKzU1FT179//smqA9yA4waNiY2PVp08fvfrqq462J554Qs2aNdNzzz2nXr16KTU1VTNmzNCsWbPcfv6qVasqICBAr732mh599FH98MMPeu6559x+HgBFW7ZsmTIyMjRgwACFh4c77bv77ruVlJSkf/zjHxcdZ9SoUerZs6caNWqk+Ph4LV26VIsWLbrgJ+CsqFmzphYtWqQuXbrIZrPpmWeesXSVa+DAgercubNyc3OdwhyubkzVweMmTJjg9CbUuHFjffjhh5o3b57q1aunsWPHasKECerXr5/bz122bFmlpKRowYIFiomJ0aRJkzRlyhS3nwdA0ZKSkhQfH18gNEl/BKfNmzdr27ZtFx2nW7dueuWVVzRlyhTVrVtXc+bMUXJystq0aXNZ9U2bNk0lS5ZUy5Yt1aVLFyUkJKhx48YXPS4+Pl4VK1ZUQkKCIiMjL6sGeA+bMcZ4uggAAK41p06dUqVKlZScnKzu3bt7uhy4CVN1AAC4UV5eno4fP66pU6cqIiJCd955p6dLghsRnAAAcKNDhw6pevXqqly5slJSUuTnx4/aawlTdQAAABaxOBwAAMAighMAAIBFBCcAAACLCE4AAAAWEZwAAAAsIjgBuKY9++yzatiwoUvH2Gw2ffzxx5d13n79+qlbt26XNQYA70NwAnDFECYAXO0ITgAAABYRnAB4jbVr16p58+ay2+2qWLGixowZo/Pnzzv2Z2dnq0+fPipRooQqVqyol19+WW3atNHw4cMtn2PTpk26/fbbVaZMGYWHh6t169basmVLgX5HjhxRhw4dFBQUpBtuuEEfffSR0/709HT17NlTERERKlWqlLp27aoDBw5c6lMHcJUgOAHwCj///LM6duyoZs2a6bvvvtPs2bOVlJSk559/3tFn5MiRWr9+vf71r39p1apV+vLLLwsNPReSnZ2tvn376quvvtKGDRtUs2ZNdezYUdnZ2U79nnnmGd1999367rvv1KdPH/Xu3Vs7duyQJJ07d04JCQkKDQ3Vl19+qfXr1yskJER33HGHzp49e/kvBgCvxR/QAeAVZs2apSpVqmjGjBmy2WyqXbu2Dh8+rNGjR2vs2LHKycnR22+/rQ8++EDt2rWTJCUnJysyMtKl89x2221O22+88YYiIiK0du1ade7c2dHeo0cPDRw4UJL03HPPadWqVXrttdc0a9YszZ8/X3l5efrnP/8pm83mqCUiIkJr1qxR+/btL+elAODFCE4AvMKOHTvUokULRxCRpLi4OJ06dUo//fSTMjIydO7cOTVv3tyxPzw8XLVq1XLpPEePHtXTTz+tNWvW6NixY8rNzdXp06d16NAhp34tWrQosL1161ZJ0nfffae0tDSFhoY69fn999+1d+9el+oBcHUhOAG4rvTt21e//fabXnnlFVWrVk12u10tWrRwaYrt1KlTatKkid5///0C+8qWLevOcgF4GdY4AfAKderUUWpqqowxjrb169crNDRUlStX1g033CB/f39t2rTJsT8zM1O7d+926Tzr16/X0KFD1bFjR9WtW1d2u13Hjx8v0G/Dhg0FtuvUqSNJaty4sfbs2aNy5cqpRo0aTo/w8HCX6gFwdSE4AbiiMjMztXXrVqdHenq6/va3vyk9PV2PP/64du7cqSVLlmjcuHEaOXKkfHx8FBoaqr59+2rUqFFavXq1tm/frgEDBsjHx8dpeu9iatasqXfffVc7duzQ119/rT59+igoKKhAvwULFuitt97S7t27NW7cOG3cuFFDhgyRJPXp00dlypRR165d9eWXX2r//v1as2aNhg4dqp9++sltrxUA70NwAnBFrVmzRo0aNXJ6jB8/XpUqVdK///1vbdy4UQ0aNNCjjz6qAQMG6Omnn3YcO23aNLVo0UKdO3dWfHy84uLiVKdOHQUGBlo+f1JSkjIyMtS4cWM98MADGjp0qMqVK1eg3/jx4zVv3jzVr19f77zzjubOnauYmBhJUnBwsNatW6eqVauqe/fuqlOnjgYMGKDff/9dYWFhl/8iAfBaNvPn6+IAcBXJyclRpUqVNHXqVA0YMMDT5QC4DrA4HMBV49tvv9XOnTvVvHlzZWZmasKECZKkrl27ergyANcLghOAq8qUKVO0a9cuBQQEqEmTJvryyy9VpkwZT5cF4DrBVB0AAIBFLA4HAACwiOAEAABgEcEJAADAIoITAACARQQnAAAAiwhOAAAAFhGcAAAALCI4AQAAWERwAgAAsOj/AQvCZAEBU4ukAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 41 — BGL line-level class distribution\n","# ============================================================\n","\n","if \"metadata_df\" in globals() and \"label\" in metadata_df.columns:\n","    line_labels_source = metadata_df\n","elif \"df\" in globals() and \"label\" in df.columns:\n","    line_labels_source = df\n","else:\n","    raise ValueError(\"Could not find metadata_df or df with a 'label' column.\")\n","\n","line_label_counts = line_labels_source[\"label\"].value_counts().sort_index()\n","\n","line_distribution_df = pd.DataFrame({\n","    \"class\": [\"Normal\", \"Anomaly\"],\n","    \"count\": [\n","        int(line_label_counts.get(0, 0)),\n","        int(line_label_counts.get(1, 0)),\n","    ]\n","})\n","\n","line_distribution_df[\"percentage\"] = (\n","    line_distribution_df[\"count\"] / line_distribution_df[\"count\"].sum() * 100\n",")\n","\n","print(\"Line-level class distribution\")\n","display(line_distribution_df)\n","\n","plt.figure(figsize=(6, 4))\n","plt.bar(line_distribution_df[\"class\"], line_distribution_df[\"count\"])\n","plt.xlabel(\"Log label\")\n","plt.ylabel(\"Number of log lines\")\n","plt.title(\"BGL Line-Level Class Distribution\")\n","plt.tight_layout()\n","save_current_figure(\"01_bgl_line_level_class_distribution.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"3315716e","metadata":{"id":"3315716e"},"source":["## Step 42 — Sequence-level class distribution\n","\n","This chart shows the class distribution after converting raw logs into fixed 10-line sequences."]},{"cell_type":"code","execution_count":45,"id":"f43d0514","metadata":{"id":"f43d0514","executionInfo":{"status":"ok","timestamp":1783281036512,"user_tz":-180,"elapsed":3302,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":599},"outputId":"db633035-542a-4aaa-857e-92780956dc4f"},"outputs":[{"output_type":"stream","name":"stdout","text":["Sequence-level class distribution\n"]},{"output_type":"display_data","data":{"text/plain":["     split_class   count\n","0   Train Normal  343721\n","1  Train Anomaly   33358\n","2    Test Normal   88605\n","3   Test Anomaly    5665"],"text/html":["\n","  <div id=\"df-757a6d88-cecf-44c5-8693-a9a3fe30f4f1\" class=\"colab-df-container\">\n","    <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>split_class</th>\n","      <th>count</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>Train Normal</td>\n","      <td>343721</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>Train Anomaly</td>\n","      <td>33358</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>Test Normal</td>\n","      <td>88605</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>Test Anomaly</td>\n","      <td>5665</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-757a6d88-cecf-44c5-8693-a9a3fe30f4f1')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-757a6d88-cecf-44c5-8693-a9a3fe30f4f1 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-757a6d88-cecf-44c5-8693-a9a3fe30f4f1');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_13e4a946-cd17-4a45-934e-aa085f9f5b2d\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('sequence_distribution_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_13e4a946-cd17-4a45-934e-aa085f9f5b2d button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('sequence_distribution_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"sequence_distribution_df","summary":"{\n  \"name\": \"sequence_distribution_df\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"split_class\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"Train Anomaly\",\n          \"Test Anomaly\",\n          \"Train Normal\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"count\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 154485,\n        \"min\": 5665,\n        \"max\": 343721,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          33358,\n          5665,\n          343721\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/02_bgl_sequence_level_class_distribution.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 800x400 with 1 Axes>"],"image/png":"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\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 42 — Sequence-level class distribution\n","# ============================================================\n","\n","sequence_distribution_df = pd.DataFrame({\n","    \"split_class\": [\"Train Normal\", \"Train Anomaly\", \"Test Normal\", \"Test Anomaly\"],\n","    \"count\": [\n","        int(np.sum(y_train == 0)),\n","        int(np.sum(y_train == 1)),\n","        int(np.sum(y_test == 0)),\n","        int(np.sum(y_test == 1)),\n","    ]\n","})\n","\n","print(\"Sequence-level class distribution\")\n","display(sequence_distribution_df)\n","\n","plt.figure(figsize=(8, 4))\n","plt.bar(sequence_distribution_df[\"split_class\"], sequence_distribution_df[\"count\"])\n","plt.xlabel(\"Dataset split and class\")\n","plt.ylabel(\"Number of sequences\")\n","plt.title(\"BGL Sequence-Level Class Distribution\")\n","plt.xticks(rotation=20)\n","plt.tight_layout()\n","save_current_figure(\"02_bgl_sequence_level_class_distribution.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"a7e26e9e","metadata":{"id":"a7e26e9e"},"source":["## Step 43 — Threshold versus F1-score\n","\n","This chart justifies the selected decision threshold by showing how F1-score changes across thresholds."]},{"cell_type":"code","execution_count":46,"id":"d90f8033","metadata":{"id":"d90f8033","executionInfo":{"status":"ok","timestamp":1783281038174,"user_tz":-180,"elapsed":1661,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":459},"outputId":"b684e73b-ad99-4631-f35b-63ae149f1701"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/03_logminilm_threshold_vs_f1.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 800x400 with 1 Axes>"],"image/png":"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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Best threshold: 0.9\n","Best F1-score: 0.9863523573200993\n"]}],"source":["# ============================================================\n","# Step 43 — Threshold vs F1-score\n","# ============================================================\n","\n","plot_df = results_df.sort_values(\"threshold\").copy()\n","best_row = results_df.sort_values(\"f1\", ascending=False).iloc[0]\n","best_threshold = float(best_row[\"threshold\"])\n","best_f1 = float(best_row[\"f1\"])\n","\n","plt.figure(figsize=(8, 4))\n","plt.plot(plot_df[\"threshold\"], plot_df[\"f1\"], marker=\"o\")\n","plt.axvline(best_threshold, linestyle=\"--\")\n","plt.xlabel(\"Decision threshold\")\n","plt.ylabel(\"F1-score\")\n","plt.title(\"LogMiniLM F1-score Across Decision Thresholds\")\n","plt.tight_layout()\n","save_current_figure(\"03_logminilm_threshold_vs_f1.png\")\n","plt.show()\n","\n","print(\"Best threshold:\", best_threshold)\n","print(\"Best F1-score:\", best_f1)\n"]},{"cell_type":"markdown","id":"80a1f640","metadata":{"id":"80a1f640"},"source":["## Step 44 — Precision, recall, and F1-score across thresholds\n","\n","This chart shows the threshold sensitivity of the final model."]},{"cell_type":"code","execution_count":47,"id":"4e5434d4","metadata":{"id":"4e5434d4","executionInfo":{"status":"ok","timestamp":1783281040057,"user_tz":-180,"elapsed":1881,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":424},"outputId":"7d270611-8c09-4a02-8f5a-02216d56e8f5"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/04_logminilm_threshold_sensitivity.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 900x400 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA3kAAAGGCAYAAADGq0gwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAm+hJREFUeJzs3Xd8FNX6x/HP7qZ3A+kGCL1IRxBREI0GEAQvCope2k9UxIqKoAioKGJBsFyxIlIUFUT0KlxAUEEEBREQQUqkBJLQkpCEtN35/RGysCQhhSSbDd/367Wv7M6cmXlmCJAn55znmAzDMBAREREREZEawezsAERERERERKTiKMkTERERERGpQZTkiYiIiIiI1CBK8kRERERERGoQJXkiIiIiIiI1iJI8ERERERGRGkRJnoiIiIiISA2iJE9ERERERKQGUZInIiIiIiJSgyjJExGRQj766CNMJhP//PNPmY9dvXo1JpOJ1atXV3hclWHo0KH4+fk5Owy7yoinXr16DB06tMR2F/LnXp1MmjQJk8lUqrYXcs+lfa4iIlVNSZ6ISBUo+EHyt99+q9LrXnPNNZhMJho1alTk/uXLl2MymTCZTHzxxReVFkdpEpeCZ2QymVizZk2h/YZhEB0djclkonfv3qU6z/le9erVu9DbuqitWbOGnj17EhUVhZeXF3Xq1KFPnz7Mnz/f2aEV6YUXXmDx4sWVeo3t27czadIkl0+SRcT1uTk7ABERqVxeXl7s3r2bDRs20LFjR4d98+bNw8vLi6ysLIft//73v7ntttvw9PQs8/W6du3KqVOn8PDwKHe88+fP56qrrnLY/sMPP3Dw4MESY+ratStz5sxx2HbXXXfRsWNH7r77bvu26tR752o+//xzBg4cSJs2bXjooYe45JJLiI+P58cff+S9995j0KBBTo1v/PjxjB071mHbCy+8wC233EK/fv0ctl/I9/rOnTsxm8/8vnz79u0888wzXHPNNfolgog4lZI8EZEarkGDBuTl5fHJJ584JHlZWVl8+eWX3HjjjSxcuNDhGIvFgsViKdf1zGYzXl5e5Y63V69efP7557z++uu4uZ35b2r+/Pm0b9+eo0ePnvf4+vXrU79+fYdt9957L/Xr1+fOO+8sd1xFycvLw2azlTuhdVWTJk2iefPm/PLLL4XuPTk52UlRneHm5ubwvXM+F/K9Xp7EUESkKmi4pohINfL777/Ts2dPAgIC8PPz47rrruOXX34p1G7Lli1069YNb29vLr30UiZPnsysWbOKnVt0++23s2DBAmw2m33b119/TWZmJgMGDCjUvqh5SvXq1aN3796sWbOGjh074uXlRf369fn4448djr3QOXm33347x44dY/ny5fZtOTk5fPHFF5XaQ5SQkEC/fv3w8/MjJCSExx57DKvVat//zz//YDKZeOWVV5g+fToNGjTA09OT7du3A7Bjxw5uueUWgoOD8fLyokOHDixZssThGrm5uTzzzDM0atQILy8vatWqxVVXXeVwr6WNByAjI4NHH32U6OhoPD09adKkCa+88gqGYZR4v3/++SfXXnutw/fQ2d8f57Nnzx4uv/zyIpPb0NBQh882m43p06fTokULvLy8CAsL45577uHEiRMO7Ur7/VWaZ3junDyTyURGRgazZ8+2D9ctmEt37vd67969C/2SoEDnzp3p0KGDQ8xnn+fWW28FoHv37vbrrF69miFDhlC7dm1yc3MLnfOGG26gSZMmRV5PRKS8lOSJiFQTf/75J1dffTV//PEHY8aM4emnnyY+Pp5rrrmG9evX29slJCTQvXt3/vzzT8aNG8cjjzzCvHnzmDFjRrHnHjRoEIcPH3ZIvObPn891111X6Ify89m9eze33HIL119/Pa+++iqXXHIJQ4cO5c8//yzXPRelXr16dO7cmU8++cS+7bvvviM1NZXbbrutwq5zNqvVSlxcHLVq1eKVV16hW7duvPrqq7z77ruF2s6aNYs33niDu+++m1dffZXg4GD+/PNPrrjiCv766y/Gjh3Lq6++iq+vL/369ePLL7+0Hztp0iSeeeYZunfvzptvvslTTz1FnTp12LRpU5njMQyDm266iddee40ePXowbdo0mjRpwuOPP87o0aPPe7+JiYl0796dzZs3M3bsWB5++GE+/vjj834Pna1u3bqsXLmSgwcPltj2nnvu4fHHH6dLly7MmDGDYcOGMW/ePOLi4golPaX5/irtMzzbnDlz8PT05Oqrr2bOnDnMmTOHe+65p8i2AwcOJD4+nl9//dVh+759+/jll1+K/R7s2rUrDz74IABPPvmk/TrNmjXj3//+N8eOHWPZsmUOxyQmJvL9999XeA+ziAiGiIhUulmzZhmA8euvvxbbpl+/foaHh4exZ88e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/JClS5cW2v7QQw8xefJkli9fzlVXXcV9992Hm5sb77zzDtnZ2bz00kv2tmPGjGHu3Llcf/31PPDAA/j6+vL+++9Tp04djh8/ft7ehMDAQCZNmlQZt1ai3NxcJk+eXGh7cHAw9913X5HHDBkypLLDqhBvvfUWV111FS1btmTEiBHUr1+fpKQk1q1bx8GDB/njjz+A/CF711xzDe3btyc4OJjffvuNL774gvvvv7/M1+zTpw/du3fnqaee4p9//qF169b873//46uvvuLhhx+mQYMGxR47ZswY5syZQ48ePXjooYfw9fXl3XffpW7duqWa39a3b19iYmLo06cPDRo0ICMjgxUrVvD1119z+eWX25Pybt26cc899zBlyhQ2b97MDTfcgLu7O7t27eLzzz9nxowZZZ5rWd5n2L59e1asWMG0adOIjIwkJiaGTp06Fdu+V69e+Pv789hjj2GxWOjfv3+JsbVp0waLxcLUqVNJTU3F09OTa6+91r5MSUhICD169ODzzz8nKCiIG2+8sUz3LiJSWkryRESq0Ntvv13k9qFDh9KiRQt++uknxo0bx5QpU7DZbHTq1Im5c+c6/DAaHR3NqlWrePDBB3nhhRcICQlh1KhR+Pr68uCDD+Ll5VVVt1MmOTk5PP3004W2N2jQoNgkz1U0b96c3377jWeeeYaPPvqIY8eOERoaStu2bZkwYYK93YMPPsiSJUv43//+R3Z2NnXr1mXy5Mk8/vjjZb6m2WxmyZIlTJgwgQULFjBr1izq1avHyy+/zKOPPnreYyMiIli1ahUPPPAAL774IrVq1eLee+8lMjKS//u//yvx2u+//z5fffUVn332GYcOHcIwDOrXr89TTz3FE088gZvbmR8vZs6cSfv27XnnnXd48skncXNzo169etx555106dKlzPdd3mc4bdo07r77bsaPH8+pU6cYMmTIeZM8Ly8vbrrpJubNm0dsbGyp1pMMDw9n5syZTJkyhf/7v//DarWyatUqh2MHDx7MN998w4ABA/D09Cz9jYuIlIHJqIzZ8iIiUuUefvhh3nnnHdLT012qcIfIxeSrr76iX79+/Pjjjw7LRYiIVCQleSIiLujUqVMOhSyOHTtG48aNadeuHcuXL3diZCJyPr179+avv/5i9+7dZSoGIyJSFhquKSLigjp37sw111xDs2bNSEpK4oMPPiAtLa3I4ZAi4nyffvopW7Zs4b///S8zZsxQgicilUo9eSIiLujJJ5/kiy++4ODBg5hMJtq1a8fEiRNLVcJfRKqeyWTCz8+PgQMHMnPmTId5iyIiFU1JnoiIiIiISA2idfJERERERERqECV5IiIiIiIiNYgGhJeTzWbj0KFD+Pv7a/K0iIiIiIhUOsMwOHnyJJGRkZjNxffXKckrp0OHDhEdHe3sMERERERE5CJz4MABLr300mL3K8krJ39/fyD/AQcEBDg5GhERERERqUiZOXl0fH4lABueug4fD+enTmlpaURHR9tzkeI4P1IXVTBEMyAgQEmeiIiIiEgN45aTh9nTB8j/mb86JHkFSpoupsIrIiIiIiIiNYiSPBERERERkRpESZ6IiIiIiEgNUn0GloqIiIiIiFQTJkxEBXnb37sSJXkiIiIiIiLn8PawsHbstc4Oo1w0XFNERERERKQGUU+eiIiIiIjIOaw2gw3xx0k+mUWovxcdY4KxmF1j2KaSPBERERERkbMs3XaYSUv+JDEt274tItCLiX2a0+OyCCdGVjoarikiIiIi4iKsNoN1e47x1eYE1u05htVmODukGmfptsOMnLvJIcEDSEzNYuTcTSzddthJkZWeevJERERERFzA0m2Heebr7RxOzbJvc6XeJVdgtRk88/V2ikqdDcAEPPP1dq5vHl6th246Pcl76623ePnll0lMTKR169a88cYbdOzYsci2ubm5TJkyhdmzZ5OQkECTJk2YOnUqPXr0sLc5efIkTz/9NF9++SXJycm0bduWGTNmcPnll9vbGIbBxIkTee+990hJSaFLly68/fbbNGrUqNLvV0RERESkrAp6l85NPgp6l96+s53TEz3DMLDaDPJOv6xWgzybDavNIPfcz9aCtrYzx1jP/9lqM8iz2s68L+Jz/rnPOsZqkGtz/Jx39nVPx1HQJjUz1yGJLnSPwOHULDbEH6dzg1pV93DLyKlJ3oIFCxg9ejQzZ86kU6dOTJ8+nbi4OHbu3EloaGih9uPHj2fu3Lm89957NG3alGXLlnHzzTfz888/07ZtWwDuuusutm3bxpw5c4iMjGTu3LnExsayfft2oqKiAHjppZd4/fXXmT17NjExMTz99NPExcWxfft2vLy8qvQZiIiIiLg6Vy5QUV1YbQbZeVaycm1k51nJzrWRdfprZnYeTy7aVmzv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duzYgZ+fH/Xr17e3efzxxxk7diy33XYbLVu25N///jePPPIIU6ZMAbCfuyzXBRg3bhypqan214EDB8p13zVVZm4mX+7+EoBBTQcBYLUZbDtU0JOnJE9EREREpCo4Lcnz8PCgffv2rFy50r7NZrOxcuVKOnfufN5jvby8iIqKIi8vj4ULF9K3b1/7vszMTIeePQCLxYLtdEWcmJgYwsPDHa6blpbG+vXrz3tdT09PAgICHF5yxrfx33Iy5ySX+l3KVVFXAbD3SDqZOVZ8PCzUD1HRFRERERGRquC0OXkAo0ePZsiQIXTo0IGOHTsyffp0MjIyGDZsGACDBw8mKirK3gu3fv16EhISaNOmDQkJCUyaNAmbzcaYMWPs5+zTpw/PP/88derUoUWLFvz+++9MmzaN4cOHA2AymXj44YeZPHkyjRo1IiYmhqeffprIyEj69etX5c+gJjAMw15w5bamt2E25SfZBfPxLosMxGI2OS0+EREREZGy8nSz8MmIK+zvXYlTk7yBAwdy5MgRJkyYQGJiIm3atGHp0qX2oij79+936JXLyspi/Pjx7N27Fz8/P3r16sWcOXMICgqyt3njjTd4+umnue+++0hOTiYyMpJ77rmHCRMm2NuMGTOGjIwM7r77blJSUrjqqqtYunRpocqdUjqbkjfx94m/8bJ40a9hP/v2rafn412m+XgiIiIi4mIsZhOdG9RydhjlYjIMw3B2EK4oLS2NwMBAUlNTL/qhm4/98BjL/llG/0b9mXTlJPv2f/1nLZv2pzB9YBv6tY1yXoAiIiIiIjVAaXMQp/bkietLykhixb4VANze9Hb79jyrjT8P5S8z0VJFV0RERETExeRabXyyYT8At3esg7sLrfmsJE8uyOd/f47VsNIutB1NgpvYt+9KTic7z4afpxsxtXydGKGIiIiISNnlWm1M+OpPAG5pf6lLJXnlinTOnDl06dKFyMhI9u3bB8D06dP56quvKjQ4qd5yrDl8/vfnAAxqNshh39aCoitRAZhVdEVEREREpMqUOcl7++23GT16NL169SIlJQWr1QpAUFAQ06dPr+j4pBpbvm85x7OOE+odyrV1rnXYV1B0pdWlQU6ITERERETk4lXmJO+NN97gvffe46mnnsJiOVNKtEOHDmzdurVCg5PqrWDZhFub3Iq72d1h35bTSV5LVdYUEREREalS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iIiIiJSLzTDsxQxtzl1avMycmuQNHDiQI0eOMGHCBBITE2nTpg1Lly61F0XZv3+/w3y7rKwsxo8fz969e/Hz86NXr17MmTOHoKAge5vLL7+cL7/8knHjxvHss88SExPD9OnTueOOO+xtxowZQ0ZGBnfffTcpKSlcddVVLF26tEYsgJqRncfuI/lFVy5T0RURERERkYuOyTBcLC2tJkq72nxV2xB/nAHvrCMi0It1465zdjgiUg1kZWURHx9PTExMjfhlVnXxzz//EBMTw++//06bNm2q7LqrV6+me/funDhxwuGXnGVlMpn48ssvix3F4qz7cwb9HRGRomTm5NF8wjIAtj8bh4+HU/vHgNLnIC5VXVNKtrVgPp568UTExQ0dOhSTyWR/1apVix49erBly5YKu8akSZNKlcAMHTq0xgzpr04Mw2DChAlERETg7e1NbGwsu3btOu8xJ0+e5OGHH6Zu3bp4e3tz5ZVX8uuvv17weUVEahIleTWMvbKm5uOJSA3Qo0cPDh8+zOHDh1m5ciVubm707t3b2WGVm9VqxWazOTuMauOll17i9ddfZ+bMmaxfvx5fX1/i4uLIysoq9pi77rqL5cuXM2fOHLZu3coNN9xAbGwsCQkJF3ReEZGaREleDXOmsmaQcwMREakAnp6ehIeHEx4eTps2bRg7diwHDhzgyJEj9jYHDhxgwIABBAUFERwcTN++ffnnn3/s+1evXk3Hjh3x9fUlKCiILl26sG/fPj766COeeeYZ/vjjD3tv4UcffVQohkmTJjF79my++uore7vVq1fb9+/du5fu3bvj4+ND69atWbdunX3fRx99RFBQEEuWLKF58+Z4enqyf/9+srOzeeyxx4iKisLX15dOnTo5nHPfvn306dOHSy65BF9fX1q0aMG3337rENfGjRvp0KEDPj4+XHnllYUqS7/99ts0aNAADw8PmjRpwpw5c877rDds2EDbtm3x8vKiQ4cO/P777+dtf6EMw2D69OmMHz+evn370qpVKz7++GMOHTrE4sWLizzm1KlTLFy4kJdeeomuXbvSsGFDJk2aRMOGDXn77bfLfV4RkZpGSV4NcjIrl71HMgAN1xSRkmXm5BX7OrdUdEW0vVDp6enMnTuXhg0bUqtWLQByc3OJi4vD39+fn376ibVr1+Ln50ePHj3IyckhLy+Pfv360a1bN7Zs2cK6deu4++67MZlMDBw4kEcffZQWLVrYewsHDhxY6LqPPfYYAwYMcOhVvPLKK+37n3rqKR577DE2b95M48aNuf3228nLO3O/mZmZTJ06lffff58///yT0NBQ7r//ftatW8enn37Kli1buPXWW+nRo4d9SOGoUaPIzs7mxx9/ZOvWrUydOhU/Pz+HuJ566ileffVVfvvtN9zc3Bg+fLh935dffslDDz3Eo48+yrZt27jnnnsYNmwYq1atKvbZ9u7dm+bNm7Nx40YmTZrEY489VuKfyb333oufn995X8WJj48nMTGR2NhY+7bAwEA6derkkCifLS8vD6vVWmjenLe3N2vWrCn3eUVEihPs60Gwr4ezwygz588elAqzLSENgKggb5f8ZhSRqlUwmbwo3ZuEMGtYR/vn9s+t4FQxawR1iglmwT1n1hm9auoqjmfkFGr3z4s3ljnGb775xp4oZGRkEBERwTfffGOvvLxgwQJsNhvvv/8+JpMJgFmzZhEUFMTq1avp0KEDqamp9O7dmwYNGgDQrFkz+/n9/Pxwc3MjPDy82Bj8/Pzw9vYmOzu7yHaPPfYYN96Yf2/PPPMMLVq0YPfu3TRt2hTIT0T/85//0Lp1ayC/cvSsWbPYv38/kZGR9nMsXbqUWbNm8cILL7B//3769+9Py5YtAahfv36h6z7//PN069YNgLFjx3LjjTeSlZWFl5cXr7zyCkOHDuW+++4D8pcs+uWXX3jllVfo3r17oXPNnz8fm83GBx98gJeXFy1atODgwYOMHDmy2OcC8Oyzz5YqGSxKYmIigL2idoGwsDD7vnP5+/vTuXNnnnvuOZo1a0ZYWBiffPIJ69ato2HDhuU+r4hIUXw83Nj09PXODqNc1JNXg2xNSAE0H09Eao7u3buzefNmNm/ezIYNG4iLi6Nnz57s27cPgD/++IPdu3fj7+9v7zkKDg4mKyuLPXv2EBwczNChQ4mLi6NPnz7MmDGDw4cPV2iMrVq1sr+PiIgAIDk52b7Nw8PDoc3WrVuxWq00btzYocfrhx9+YM+ePQA8+OCDTJ48mS5dujBx4sQii82c77p//fUXXbp0cWjfpUsX/vrrryLv4a+//qJVq1YOPWSdO3cusu3ZQkNDadiw4XlfFW3OnDkYhkFUVBSenp68/vrr3H777Q5LLomIXOzUk1eDFCzW2FJJnoiUwvZn44rdZz7dK1Zg49OxxbQs3HbNE4V7isrL19fXIVF4//33CQwM5L333mPy5Mmkp6fTvn175s2bV+jYkJAQIL9n78EHH2Tp0qUsWLCA8ePHs3z5cq644ooKidHd3d3+vqA38eziKt7e3vbtkD800mKxsHHjRiwWi8O5Cnot77rrLuLi4vjvf//L//73P6ZMmcKrr77KAw88UOrrVoV7772XuXPnnrdNenp6kdsLekWTkpLsSWrB5/NVPG3QoAE//PADGRkZpKWlERERwcCBA+29neU9r4hITaIkrwaw2gw2xB/nl73HALgsQkmeiJSsLOv9VFbbsjKZTJjNZk6dOgVAu3btWLBgAaGhoeddL6ht27a0bduWcePG0blzZ+bPn88VV1yBh4cHVmvRw1DPVtp2pdG2bVusVivJyclcffXVxbaLjo7m3nvv5d5772XcuHG89957Dkne+TRr1oy1a9cyZMgQ+7a1a9fSvHnzYtvPmTPHPtwT4JdffinxOhcyXDMmJobw8HBWrlxpT77S0tJYv359icNEIf8XAL6+vpw4cYJly5bx0ksvVch5RUQKZOVaGfLhBgBmD++Il7ulhCOqDyV5Lm7ptsM88/V2DqeeKQv9+MI/eOamFvS4LOI8R4qIVH/Z2dn2eVQnTpzgzTffJD09nT59+gBwxx138PLLL9O3b1+effZZLr30Uvbt28eiRYsYM2YMubm5vPvuu9x0001ERkayc+dOdu3axeDBgwGoV68e8fHxbN68mUsvvRR/f388PT0LxVGvXj2WLVvGzp07qVWrFoGB5f9lWuPGjbnjjjsYPHgwr776Km3btuXIkSOsXLmSVq1aceONN/Lwww/Ts2dPGjduzIkTJ1i1apXDXMKSPP744wwYMIC2bdsSGxvL119/zaJFi1ixYkWR7QcNGsRTTz3FiBEjGDduHP/88w+vvPJKidcJDQ0lNDS01HGdzWQy8fDDDzN58mQaNWpETEwMTz/9NJGRkQ5rEl533XXcfPPN3H///QAsW7YMwzBo0qQJu3fv5vHHH6dp06YMGzasTOcVESmJzTBYH3/c/t6VKMlzYUu3HWbk3E2c+y2XnJbNyLmbePvOdkr0RMSlLV261D7kzt/fn6ZNm/L5559zzTXXAODj48OPP/7IE088wb/+9S9OnjxJVFQU1113HQEBAZw6dYodO3Ywe/Zsjh07RkREBKNGjeKee+4BoH///ixatIju3buTkpLCrFmzGDp0aKE4RowYYS/kkp6ezqpVq6hXr16572vWrFlMnjyZRx99lISEBGrXrs0VV1xhXwPQarUyatQoDh48SEBAAD169OC1114r9fn79evHjBkzeOWVV3jooYeIiYlh1qxZ9ud2Lj8/P77++mvuvfde2rZtS/PmzZk6dSr9+/cv9z2WxpgxY8jIyODuu+8mJSWFq666iqVLlzrMDdyzZw9Hjx61f05NTWXcuHEcPHiQ4OBg+vfvz/PPP+8wfLU05xURqclMhuFiaWk1kZaWRmBgIKmpqecdIlRZrDaDq6Z+79CDdzYTEB7oxZonrsViNhXZRkQuDllZWcTHxxMTE6MfckWKoL8jIlKUzJw8eyXq7c/GVep0hNIqbQ6iUlQuakP88WITPAADOJyaxYbTXcwiIiIiInJxUJLnopJPFp/glaediIiIiIjUDEryXFSof+mGk5S2nYiIiIiI1AxK8lxUx5hgIgK9KG62nQmICPSiY0xwVYYlIiIiIlJjeLtb8HahpRMKOH/2oJSLxWxiYp/mjJy7CRM4VNgsSPwm9mmuoisiIiIiIuXg4+HGX8/1cHYY5aKePBfW47II3r6zHeGBjkMywwO9tHyCiBSiYsoiRdPfDRGpadST5+J6XBbB9c3D2RB/nOSTWYT65w/RVA+eiBSwWPKHmeTk5ODt7e3kaESqn8zMTACHtfZERFyZkrwawGI20blBLWeHISLVlJubGz4+Phw5cgR3d3fMZg3iEIH8HrzMzEySk5MJCgqy/0JERAQgK9fKyLkbAXj7zvZ4udDcPCV5IiI1nMlkIiIigvj4ePbt2+fscESqnaCgIMLDw50dhohUMzbDYNXOI/b3rkRJnoj8f3v3HxRlnccB/L382gVdwFN+LIggqEBzKCrCgCWGNDmUR9YkTGTqaZ6HpuZ4l6N2+FvHs+S8EzNEaDouPJXUFIgk8c47GzoCz3DjEvDEUhwrf6AnsOzn/mjaicB0F3aXfXq/ZnaGffa7z/N+3u7gfHiWhX4C3NzcMHLkSLS3t9s7ClG/4urqyit4RKQ4HPKIiH4inJycoNHwb2cSEREpHX8xg4iIiIiISEE45BERERERESkIhzwiIiIiIiIF4e/kWei7P5x68+ZNOychIiIiIqK+dqfdAGPbt39H8+bNmzC42X90+m72kPt82qdK7reCenTp0iUEBQXZOwYREREREf3ENDc3Y+jQofd8nEOehYxGI7788ktotVqoVCp7x8HNmzcRFBSE5uZmeHp62juOorFr22HXtsOubYdd2w67ti32bTvs2nb6W9ciglu3biEgIABOTvf+zTv7X3N0UE5OTj86PduLp6dnv3gB/hSwa9th17bDrm2HXdsOu7Yt9m077Np2+lPXXl5e913DD14hIiIiIiJSEA55RERERERECsIhTyHUajWysrKgVqvtHUXx2LXtsGvbYde2w65th13bFvu2HXZtO47aNT94hYiIiIiISEF4JY+IiIiIiEhBOOQREREREREpCIc8IiIiIiIiBeGQ50B27tyJkJAQaDQaxMXFoaqq6p5r6+rq8MwzzyAkJAQqlQrZ2dm2C6oA5nSdm5uLRx55BIMGDcKgQYOQnJz8o+upK3O6Li4uRkxMDLy9vTFgwABER0fj7bfftmFax2ZO199XVFQElUqFp556yroBFcScrgsKCqBSqbrcNBqNDdM6NnNf19evX8fChQuh0+mgVqsxatQolJSU2CitYzOn68mTJ3d7XatUKjzxxBM2TOy4zH1dZ2dnIzw8HO7u7ggKCsLLL7+Mu3fv2iitYzOn646ODqxbtw5hYWHQaDQYM2YMysrKbJjWDEIOoaioSNzc3GTv3r1SV1cnL774onh7e0tLS0uP66uqqmT58uXyzjvviL+/v2zfvt22gR2YuV0/99xzsnPnTqmpqRG9Xi+zZ88WLy8vuXTpko2TOx5zuz5x4oQUFxfLuXPn5Pz585KdnS3Ozs5SVlZm4+SOx9yuv9PU1CSBgYHyyCOPSGpqqm3COjhzu87PzxdPT0+5fPmy6XblyhUbp3ZM5nbd1tYmMTExkpKSIqdOnZKmpiaprKyU2tpaGyd3POZ2/dVXX3V5TX/66afi7Ows+fn5tg3ugMzturCwUNRqtRQWFkpTU5O8//77otPp5OWXX7Zxcsdjbte//e1vJSAgQI4dOyYNDQ2Sk5MjGo1GPvnkExsnvz8OeQ4iNjZWFi5caLrf2dkpAQEBsnnz5vs+Nzg4mEOeGXrTtYiIwWAQrVYrb731lrUiKkZvuxYRGTt2rKxevdoa8RTFkq4NBoMkJCTInj17ZNasWRzyHpC5Xefn54uXl5eN0imLuV3v2rVLQkNDpb293VYRFaO336+3b98uWq1WWltbrRVRMczteuHChZKUlNRl27Jly2TixIlWzakE5nat0+nkT3/6U5dtTz/9tGRkZFg1pyX4dk0H0N7ejurqaiQnJ5u2OTk5ITk5GadPn7ZjMuXpi67v3LmDjo4O/OxnP7NWTEXobdcigoqKCtTX12PSpEnWjOrwLO163bp18PX1xdy5c20RUxEs7bq1tRXBwcEICgpCamoq6urqbBHXoVnS9ZEjRxAfH4+FCxfCz88PP//5z7Fp0yZ0dnbaKrZD6ov/G/Py8pCeno4BAwZYK6YiWNJ1QkICqqurTW8zbGxsRElJCVJSUmyS2VFZ0nVbW1u3t9O7u7vj1KlTVs1qCRd7B6D7u3btGjo7O+Hn59dlu5+fHz777DM7pVKmvuj6lVdeQUBAQJdvGtSdpV3fuHEDgYGBaGtrg7OzM3JycvDYY49ZO65Ds6TrU6dOIS8vD7W1tTZIqByWdB0eHo69e/di9OjRuHHjBrZt24aEhATU1dVh6NChtojtkCzpurGxER9++CEyMjJQUlKC8+fPIzMzEx0dHcjKyrJFbIfU2/8bq6qq8OmnnyIvL89aERXDkq6fe+45XLt2DQ8//DBEBAaDAQsWLMDKlSttEdlhWdL1448/jtdffx2TJk1CWFgYKioqUFxc3C9/UMQreUR9aMuWLSgqKsK7777LD06wEq1Wi9raWnz88cfYuHEjli1bhsrKSnvHUpRbt25h5syZyM3NxZAhQ+wdR/Hi4+PxwgsvIDo6GomJiSguLoaPjw92795t72iKYzQa4evrizfffBPjx49HWloaVq1ahTfeeMPe0RQtLy8PUVFRiI2NtXcURaqsrMSmTZuQk5ODTz75BMXFxTh27BjWr19v72iK84c//AEjR45EREQE3NzcsGjRIsyZMwdOTv1vpOKVPAcwZMgQODs7o6Wlpcv2lpYW+Pv72ymVMvWm623btmHLli04fvw4Ro8ebc2YimBp105OThgxYgQAIDo6Gnq9Hps3b8bkyZOtGdehmdt1Q0MDLly4gGnTppm2GY1GAICLiwvq6+sRFhZm3dAOqi++X7u6umLs2LE4f/68NSIqhiVd63Q6uLq6wtnZ2bQtMjISV65cQXt7O9zc3Kya2VH15nV9+/ZtFBUVYd26ddaMqBiWdP3qq69i5syZmDdvHgAgKioKt2/fxvz587Fq1ap+OYD0B5Z07ePjg0OHDuHu3bv46quvEBAQgBUrViA0NNQWkc3Cf3UH4ObmhvHjx6OiosK0zWg0oqKiAvHx8XZMpjyWdr1161asX78eZWVliImJsUVUh9dXr2uj0Yi2tjZrRFQMc7uOiIjA2bNnUVtba7r94he/wKOPPora2loEBQXZMr5D6YvXdWdnJ86ePQudTmetmIpgSdcTJ07E+fPnTT+0AID//Oc/0Ol0HPB+RG9e1/v370dbWxuef/55a8dUBEu6vnPnTrdB7rsfZIiI9cI6uN68rjUaDQIDA2EwGHDw4EGkpqZaO6757PzBL/SAioqKRK1WS0FBgZw7d07mz58v3t7epo/ZnjlzpqxYscK0vq2tTWpqaqSmpkZ0Op0sX75campq5PPPP7fXKTgMc7vesmWLuLm5yYEDB7p8XPStW7fsdQoOw9yuN23aJOXl5dLQ0CDnzp2Tbdu2iYuLi+Tm5trrFByGuV3/ED9d88GZ2/XatWvl/fffl4aGBqmurpb09HTRaDRSV1dnr1NwGOZ2ffHiRdFqtbJo0SKpr6+Xo0ePiq+vr2zYsMFep+AwLP0e8vDDD0taWpqt4zo0c7vOysoSrVYr77zzjjQ2Nkp5ebmEhYXJjBkz7HUKDsPcrj/66CM5ePCgNDQ0yN/+9jdJSkqS4cOHyzfffGOnM7g3DnkO5I9//KMMGzZM3NzcJDY2Vj766CPTY4mJiTJr1izT/aamJgHQ7ZaYmGj74A7InK6Dg4N77DorK8v2wR2QOV2vWrVKRowYIRqNRgYNGiTx8fFSVFRkh9SOyZyuf4hDnnnM6Xrp0qWmtX5+fpKSktIv/+ZSf2Xu6/qf//ynxMXFiVqtltDQUNm4caMYDAYbp3ZM5nb92WefCQApLy+3cVLHZ07XHR0dsmbNGgkLCxONRiNBQUGSmZnZLweP/sicrisrKyUyMlLUarUMHjxYZs6cKV988YUdUt+fSoTXcYmIiIiIiJSCv5NHRERERESkIBzyiIiIiIiIFIRDHhERERERkYJwyCMiIiIiIlIQDnlEREREREQKwiGPiIiIiIhIQTjkERERERERKQiHPCIiIiIiIgXhkEdERIoXEhKC7OzsPl/b1+x1bJVKhUOHDvVqH5MnT8bSpUt/dI09uyUi+inhkEdERHYxe/ZsqFQqqFQquLq6ws/PD4899hj27t0Lo9HYp8f6+OOPMX/+/D5fa6mCggJ4e3tb9RhERPTTxSGPiIjsZurUqbh8+TIuXLiA0tJSPProo1iyZAmefPJJGAyGPjuOj48PPDw8+nxtf9DR0WHvCERE1M9wyCMiIrtRq9Xw9/dHYGAgxo0bh5UrV+Lw4cMoLS1FQUGBad3169cxb948+Pj4wNPTE0lJSThz5kyXfb333nuYMGECNBoNhgwZgunTp5se+/7bBEUEa9aswbBhw6BWqxEQEIDFixf3uBYALl68iNTUVAwcOBCenp6YMWMGWlpaTI+vWbMG0dHRePvttxESEgIvLy+kp6fj1q1bPZ5zZWUl5syZgxs3bpiuZK5Zs8b0+J07d/DLX/4SWq0Ww4YNw5tvvml67MKFC1CpVNi3bx8SExOh0WhQWFgIANizZw8iIyOh0WgQERGBnJwc0/Pa29uxaNEi6HQ6aDQaBAcHY/PmzV1yXbt2DdOnT4eHhwdGjhyJI0eOdHn85MmTiI2NhVqthk6nw4oVK350EL969SqmTZsGd3d3DB8+3JSTiIisj0MeERH1K0lJSRgzZgyKi4tN25599llcvXoVpaWlqK6uxrhx4zBlyhR8/fXXAIBjx45h+vTpSElJQU1NDSoqKhAbG9vj/g8ePIjt27dj9+7d+Pzzz3Ho0CFERUX1uNZoNCI1NRVff/01Tp48iQ8++ACNjY1IS0vrsq6hoQGHDh3C0aNHcfToUZw8eRJbtmzpcZ8JCQnIzs6Gp6cnLl++jMuXL2P58uWmx1977TXExMSgpqYGmZmZ+PWvf436+vou+1ixYgWWLFkCvV6Pxx9/HIWFhfjd736HjRs3Qq/XY9OmTXj11Vfx1ltvAQB27NiBI0eO4K9//Svq6+tRWFiIkJCQLvtcu3YtZsyYgX//+99ISUlBRkaGqd8vvvgCKSkpmDBhAs6cOYNdu3YhLy8PGzZs6PEcgW/fjtvc3IwTJ07gwIEDyMnJwdWrV++5noiI+pAQERHZwaxZsyQ1NbXHx9LS0iQyMlJERP7+97+Lp6en3L17t8uasLAw2b17t4iIxMfHS0ZGxj2PFRwcLNu3bxcRkddee01GjRol7e3t911bXl4uzs7OcvHiRdPjdXV1AkCqqqpERCQrK0s8PDzk5s2bpjW/+c1vJC4u7p558vPzxcvLq8djP//886b7RqNRfH19ZdeuXSIi0tTUJAAkOzu7y/PCwsLkL3/5S5dt69evl/j4eBEReemllyQpKUmMRmOPeQDI6tWrTfdbW1sFgJSWloqIyMqVKyU8PLzL83fu3CkDBw6Uzs5OERFJTEyUJUuWiIhIfX19l45ERPR6vQAwdUtERNbDK3lERNTviAhUKhUA4MyZM2htbcXgwYMxcOBA062pqQkNDQ0AgNraWkyZMuWB9v3ss8/if//7H0JDQ/Hiiy/i3XffvefbDvV6PYKCghAUFGTa9tBDD8Hb2xt6vd60LSQkBFqt1nRfp9NZfNVq9OjRpq9VKhX8/f277SsmJsb09e3bt9HQ0IC5c+d26WfDhg2mfmbPno3a2lqEh4dj8eLFKC8v/9HjDhgwAJ6enqbj6vV6xMfHm/5NAGDixIlobW3FpUuXuu1Lr9fDxcUF48ePN22LiIjgh80QEdmIi70DEBER/ZBer8fw4cMBAK2trdDpdKisrOy27ruhwd3d/YH3HRQUhPr6ehw/fhwffPABMjMz8fvf/x4nT56Eq6urRXl/+DyVSmXxJ4Q+yL4GDBhg+rq1tRUAkJubi7i4uC7rnJ2dAQDjxo1DU1MTSktLcfz4ccyYMQPJyck4cOCAVc6BiIjsi1fyiIioX/nwww9x9uxZPPPMMwC+HVCuXLkCFxcXjBgxosttyJAhAL69ClVRUfHAx3B3d8e0adOwY8cOVFZW4vTp0zh79my3dZGRkWhubkZzc7Np27lz53D9+nU89NBDFp+jm5sbOjs7LX7+9/n5+SEgIACNjY3d+vluUAYAT09PpKWlITc3F/v27cPBgwdNv3N3P5GRkTh9+jRExLTtH//4B7RaLYYOHdptfUREBAwGA6qrq03b6uvrcf36dctPlIiIHhiv5BERkd20tbXhypUr6OzsREtLC8rKyrB582Y8+eSTeOGFFwAAycnJiI+Px1NPPYWtW7di1KhR+PLLL00fthITE4OsrCxMmTIFYWFhSE9Ph8FgQElJCV555ZVuxywoKEBnZyfi4uLg4eGBP//5z3B3d0dwcHC3tcnJyYiKikJGRgays7NhMBiQmZmJxMTELm+ZNFdISAhaW1tRUVGBMWPGwMPDo1d/tmHt2rVYvHgxvLy8MHXqVLS1teFf//oXvvnmGyxbtgyvv/46dDodxo4dCycnJ+zfvx/+/v4P/PbJzMxMZGdn46WXXsKiRYtQX1+PrKwsLFu2DE5O3X9eHB4ejqlTp+JXv/oVdu3aBRcXFyxdutSsK65ERGQ5XskjIiK7KSsrg06nQ0hICKZOnYoTJ05gx44dOHz4sOmthiqVCiUlJZg0aRLmzJmDUaNGIT09Hf/973/h5+cHAJg8eTL279+PI0eOIDo6GklJSaiqqurxmN7e3sjNzcXEiRMxevRoHD9+HO+99x4GDx7cba1KpcLhw4cxaNAgTJo0CcnJyQgNDcW+fft6dd4JCQlYsGAB0tLS4OPjg61bt/Zqf/PmzcOePXuQn5+PqKgoJCYmoqCgwHQlT6vVYuvWrYiJicGECRNw4cIFlJSU9Dig9SQwMBAlJSWoqqrCmDFjsGDBAsydOxerV6++53Py8/MREBCAxMREPP3005g/fz58fX17dZ5ERPRgVPL9914QERERERGRQ+OVPCIiIiIiIgXhkEdERERERKQgHPKIiIiIiIgUhEMeERERERGRgnDIIyIiIiIiUhAOeURERERERArCIY+IiIiIiEhBOOQREREREREpCIc8IiIiIiIiBeGQR0REREREpCAc8oiIiIiIiBSEQx4REREREZGC/B8HYBJ7d5fjogAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 44 — Precision, Recall, and F1 across thresholds\n","# ============================================================\n","\n","plot_df = results_df.sort_values(\"threshold\").copy()\n","\n","plt.figure(figsize=(9, 4))\n","plt.plot(plot_df[\"threshold\"], plot_df[\"precision\"], marker=\"o\", label=\"Precision\")\n","plt.plot(plot_df[\"threshold\"], plot_df[\"recall\"], marker=\"o\", label=\"Recall\")\n","plt.plot(plot_df[\"threshold\"], plot_df[\"f1\"], marker=\"o\", label=\"F1-score\")\n","plt.axvline(best_threshold, linestyle=\"--\", label=f\"Best threshold = {best_threshold:.2f}\")\n","plt.xlabel(\"Decision threshold\")\n","plt.ylabel(\"Metric value\")\n","plt.title(\"LogMiniLM Threshold Sensitivity\")\n","plt.legend()\n","plt.tight_layout()\n","save_current_figure(\"04_logminilm_threshold_sensitivity.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"04d20445","metadata":{"id":"04d20445"},"source":["## Step 45 — Confusion matrix\n","\n","This chart summarizes correct and incorrect predictions at the best threshold."]},{"cell_type":"code","execution_count":48,"id":"85ecda33","metadata":{"id":"85ecda33","executionInfo":{"status":"ok","timestamp":1783281041499,"user_tz":-180,"elapsed":1441,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":434},"outputId":"6d243e81-94f4-431d-9ba7-ff847e7709db"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/05_logminilm_confusion_matrix.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 500x400 with 2 Axes>"],"image/png":"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1rl69WoAqlatik6nY8OGDVy6dIm0tDRcXV0ZM2YMI0eOZNmyZZw8eZJDhw4xf/58dcLXq6++yh9//MHYsWOJj49n5cqVREZGarremjVrkpCQwFdffcXJkyeZN29evhPtHBwcCA8P55dffmH37t0MGzaMHj164O3tDcCbb77JzJkzmTdvHr///jtHjhxh6dKlvP/++5raI0RZIYlbiCLi5OTErl27qFKlCl27diUgIIABAwaQkZGh9sBHjx7NCy+8QHh4OCEhIbi6uvLMM8/csd6FCxfSvXt3XnvtNerUqcNLL71Eeno6AA899BBvvvkmEyZMwMvLiyFDhgAwffp0Jk+ezMyZMwkICKB9+/Zs3LgRf39/4MZ952+++YZ169ZRr149Fi1axIwZMzRd79NPP83IkSMZMmQI9evXZ+/evUyePDlPXI0aNejatStPPfUU7dq145FHHrFY7jVw4EAWL17M0qVLCQoKomXLlkRGRqptFUJYkvdxCyGEECWI9LiFEEKIEkQStxBCCFGCSOIWQgghShBJ3EIIIUQJIolbCCGEKEEkcQshhBAliCRuIYQQogSRxC2EEEKUIJK4hRBCiBJEErcQQghRgkjiFkIIIUoQSdxCCCFECfL/vTNV4wWWzHgAAAAASUVORK5CYII=\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["TN, FP, FN, TP: 88551 54 100 5565\n"]}],"source":["# ============================================================\n","# Step 45 — Confusion matrix\n","# ============================================================\n","\n","tn = int(best_row[\"tn\"])\n","fp = int(best_row[\"fp\"])\n","fn = int(best_row[\"fn\"])\n","tp = int(best_row[\"tp\"])\n","\n","cm = np.array([\n","    [tn, fp],\n","    [fn, tp]\n","])\n","\n","plt.figure(figsize=(5, 4))\n","plt.imshow(cm)\n","plt.title(\"LogMiniLM Confusion Matrix\")\n","plt.xlabel(\"Predicted label\")\n","plt.ylabel(\"True label\")\n","plt.xticks([0, 1], [\"Normal\", \"Anomaly\"])\n","plt.yticks([0, 1], [\"Normal\", \"Anomaly\"])\n","\n","for i in range(2):\n","    for j in range(2):\n","        plt.text(j, i, f\"{cm[i, j]:,}\", ha=\"center\", va=\"center\", fontsize=12)\n","\n","plt.colorbar()\n","plt.tight_layout()\n","save_current_figure(\"05_logminilm_confusion_matrix.png\")\n","plt.show()\n","\n","print(\"TN, FP, FN, TP:\", tn, fp, fn, tp)\n"]},{"cell_type":"markdown","id":"cb3f9e2f","metadata":{"id":"cb3f9e2f"},"source":["## Step 46 — Prediction probability distribution\n","\n","This chart compares anomaly probabilities for true normal and true anomalous sequences."]},{"cell_type":"code","execution_count":49,"id":"b0c14620","metadata":{"id":"b0c14620","executionInfo":{"status":"ok","timestamp":1783281043513,"user_tz":-180,"elapsed":2012,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"65c8c722-512b-43d6-90ba-a6ec7ecbf8de"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/06_logminilm_probability_distribution.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 800x400 with 1 Axes>"],"image/png":"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PXt21axZU1u3bn1sfMCzQGIBPCcSn9d/3GMlR48eVZMmTXTv3j2NHTtWU6ZM0auvvqpdu3ZJkooVK6axY8dKkrp3764lS5ZoyZIlql27trmNf/75R6+88orKli2r6dOnq169eo+N68MPP9SGDRs0ZMgQ9evXT1u3blVQUJBFz0pKpCS2BxmGoVdffVXTpk1Tw4YNNXXqVBUpUkSDBw9WSEhIkvo///yzevXqpbZt22rSpEm6e/euWrZsqX/++eexcd25c0d169bVkiVL1L59e3388cfy8vJSp06dNGPGDHPsS5YsUY4cOVS2bFlz7Dlz5rTqHDysa9euGjlypMqXL69p06apTp06mjBhgtq2bWtRb9iwYRozZowqVqyojz/+WIULF1ZwcPAj/2Ls4eGhZs2aWdxQHj58WEePHlW7du2sirFv3746fPiwRo0apZ49e2rdunXq06eP9Qf7GO3atdO+fft06tQpc9myZcvUqlUrq3tRli5dqnr16snX11dt27bVjRs3tG7dumTrpuRn5ujRo6pVq5YOHz6s9957TyNGjNCZM2dUt25d7d27N0mbffv21V9//aUxY8bo1Vdf1aeffqoRI0aoadOmio+P1/jx41WzZk19/PHHWrJkicW2M2bMULly5TR27FiNHz9eTk5Oev3117Vhw4ZHHm+BAgVUo0aNZHtmli5dqixZsqhZs2YpPX1midcie/bsFuW9evXSsWPHNHLkSPOjRaNHj1bv3r3l5+enKVOmqGXLlpo/f74aNGig+/fvW2x/7do1NWrUSBUqVNCkSZOUN29e9ezZU1988YW5TkxMjD7//HPVrVtXEydO1OjRo3X58mUFBwcnO+5j8eLFmjlzpnr37q1hw4bpyJEjevnllxUZGWn1cT9o+PDhKlu2rHLkyGH+nX/ceIujR4+qatWqCg8P19ChQzVlyhRlypRJzZs315o1a8z1Ro8erTFjxqhevXqaPXu2hg8frnz58um3336zKV7ALgwAGcLChQsNScavv/76yDpeXl5GuXLlzMujRo0yHvw1nzZtmiHJuHz58iPb+PXXXw1JxsKFC5Osq1OnjiHJmDdvXrLr6tSpY17evn27IcnIkyePERMTYy7/6quvDEnGjBkzzGX58+c3Onbs+MQ2Hxdbx44djfz585uX165da0gyPvjgA4t6rVq1Mkwmk3Hy5Elz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5uamiRMnqkePHsqaNatd2oyNjZWLi4td2soIeBQKAAAAL7ygoCD5+vpqwoQJj6zzzTffqESJEnJ1dVVAQICmTJlisT4gIEDjxo1Thw4d5Onpqe7duys0NFTe3t5av369ihQpIg8PD7Vq1Uq3b9/WokWLFBAQoKxZs6pfv36Kj483t7VkyRJVrFhRWbJkka+vr9q1a2d+30R6RWIBAACAF56jo6PGjx+vWbNm6e+//06y/sCBA2rdurXatm2rP/74Q6NHj9aIESMUGhpqUW/y5MkqU6aMDh48qBEjRkiSbt++rZkzZ2rFihXavHmzduzYoddee00bN27Uxo0btWTJEs2fP1+rVq0yt3P//n2NGzdOhw8f1tq1a3X27Fl16tQpNU+BzXgUCgAAAJD02muvqWzZsho1apQWLFhgsW7q1KmqX7++OVl46aWXdOzYMX388ccWN/wvv/yyBg0aZF7+6aefdP/+fc2dO1cFCxaUJLVq1UpLlixRZGSkMmfOrOLFi6tevXravn272rRpI0l6++23zW0UKFBAM2fOVKVKlXTz5k1lzpw5tU6BTeixAAAAAP6/iRMnatGiRQoPD7coDw8PV40aNSzKatSoob/++sviEaaKFSsmadPDw8OcVEiSj4+PAgICLBIEHx8fi0edDhw4oKZNmypfvnzKkiWL6tSpI0k6f/68bQeYikgsAAAAgP+vdu3aCg4O1rBhw55q+0yZMiUpc3Z2tlg2mUzJliUkJEiSbt26peDgYHl6emrp0qX69ddftWbNGkn/DghPr3gUCgAAAHjARx99pLJly6pIkSLmsmLFimnXrl0W9Xbt2qWXXnpJjo6Odt3/8ePH9c8//+ijjz6Sv7+/JGn//v123UdqoMcCAAAAeECpUqXUvn17zZw501w2aNAghYWFady4cfrzzz+1aNEizZ49W++++67d958vXz65uLho1qxZOn36tL777juNGzfO7vuxNxILAAAA4CFjx441P5okSeXLl9dXX32lFStWqGTJkho5cqTGjh2bKjM15cyZU6Ghofr6669VvHhxffTRR5o8ebLd92NvJoNXCdpFTEyMvLy8dP36dXl6eqZJDLwgDwAApJW7d+/qzJkzCgwMlJubW1qHAys87tpZc49LjwUAAAAAm5FYAAAAALAZiQUAAAAAm5FYAAAAALAZiQUAAAAAm5FYAAAAALAZiQUAAAAAm5FYAAAAALAZiQUAAAAAm5FYAAAAABlYQECApk+fntZhyCmtAwAAAMBzblmbZ7evdiufetM9e/aoZs2aatiwoTZs2GDHoF4M9FgAAAAAkhYsWKC+fftq586dunjxYlqHk+GQWAAAAOCFd/PmTa1cuVI9e/ZU48aNFRoaal63Y8cOmUwmhYWFqWLFivLw8FD16tV14sQJizbmzp2rggULysXFRUWKFNGSJUss1ptMJs2fP19NmjSRh4eHihUrpj179ujkyZOqW7euMmXKpOrVq+vUqVPmbU6dOqVmzZrJx8dHmTNnVqVKlfTDDz888jjefvttNWnSxKLs/v37ypUrlxYsWGDDGXqyNE0s4uPjNWLECAUGBsrd3V0FCxbUuHHjZBiGuY5hGBo5cqRy584td3d3BQUF6a+//rJo5+rVq2rfvr08PT3l7e2tLl266ObNmxZ1fv/9d9WqVUtubm7y9/fXpEmTksTz9ddfq2jRonJzc1OpUqW0cePG1DlwAAAApCtfffWVihYtqiJFiujNN9/UF198YXFPKknDhw/XlClTtH//fjk5Oentt982r1uzZo369++vQYMG6ciRI+rRo4c6d+6s7du3W7Qxbtw4dejQQYcOHVLRokXVrl079ejRQ8OGDdP+/ftlGIb69Oljrn/z5k01atRIYWFhOnjwoBo2bKimTZvq/PnzyR5H165dtXnzZl26dMlctn79et2+fVtt2qTuI2lpmlhMnDhRc+fO1ezZsxUeHq6JEydq0qRJmjVrlrnOpEmTNHPmTM2bN0979+5VpkyZFBwcrLt375rrtG/fXkePHtXWrVu1fv167dy5U927dzevj4mJUYMGDZQ/f34dOHBAH3/8sUaPHq1PP/3UXGf37t1644031KVLFx08eFDNmzdX8+bNdeTIkWdzMgAAAJBmFixYoDfffFOS1LBhQ12/fl0//vijRZ0PP/xQderUUfHixTV06FDt3r3bfE86efJkderUSb169dJLL72kkJAQtWjRQpMnT7Zoo3PnzmrdurVeeuklDRkyRGfPnlX79u0VHBysYsWKqX///tqxY4e5fpkyZdSjRw+VLFlShQsX1rhx41SwYEF99913yR5H9erVk/SWLFy4UK+//royZ85sj1P1SGmaWOzevVvNmjVT48aNFRAQoFatWqlBgwbat2+fpH97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MxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADYjsQAAAABgMxILAAAAADazS2IRHR1tj2YAAAAAZFBWJxYTJ07UypUrzcutW7dW9uzZlSdPHh0+fNiuwQEAAADIGKxOLObNmyd/f39J0tatW7V161Zt2rRJr7zyigYPHmz3AAEAAACkf07WbhAREWFOLNavX6/WrVurQYMGCggIUJUqVeweIAAAAID0z+oei6xZs+rChQuSpM2bNysoKEiSZBiG4uPj7RsdAAAAgAzB6h6LFi1aqF27dipcuLD++ecfvfLKK5KkgwcPqlChQnYPEAAAAED6Z3ViMW3aNAUEBOjChQuaNGmSMmfOLEm6dOmSevXqZfcAAQAAAKR/VicWzs7Oevfdd5OUDxw40C4BAQAAAMh4nuo9FkuWLFHNmjXl5+enc+fOSZKmT5+ub7/91q7BAQAAAMgYrE4s5s6dq5CQEL3yyiuKjo42D9j29vbW9OnT7R0fAAAAgAzA6sRi1qxZ+uyzzzR8+HA5OjqayytWrKg//vjDrsEBAAAAyBisTizOnDmjcuXKJSl3dXXVrVu37BIUAAAAgIzF6sQiMDBQhw4dSlK+efNmFStWzB4xAQAAAMhgrJ4VKiQkRL1799bdu3dlGIb27dun5cuXa8KECfr8889TI0YAAAAA6ZzViUXXrl3l7u6u999/X7dv31a7du3k5+enGTNmqG3btqkRIwAAAIB0zurEQpLat2+v9u3b6/bt27p586Zy5cpl77gAAAAAZCBWJxZnzpxRXFycChcuLA8PD3l4eEiS/vrrLzk7OysgIMDeMQIAAABI56wevN2pUyft3r07SfnevXvVqVMne8QEAAAAIIOxOrE4ePCgatSokaS8atWqyc4WBQAAAOD5Z3ViYTKZdOPGjSTl169fN7+FGwAAAMCLxerEonbt2powYYJFEhEfH68JEyaoZs2adg0OAAAAQMZg9eDtiRMnqnbt2ipSpIhq1aolSfrpp58UExOjbdu22T1AAAAAAOmf1T0WxYsX1++//67WrVsrKipKN27cUIcOHXT8+HGVLFkyNWIEAAAAkM491Xss/Pz8NH78eHvHAgAAACCD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Zs1q1+AAAAAAZAxWJxadOnVKhTAAAAAAZGRWJxa///57iuuWLl3a2uYBAAAAZEBWJxZly5Z97AvypH/HXZhMJl6WBwAAALwgrJ4VavXq1QoMDNScOXN08OBBHTx4UHPmzFHBggX1zTff6PTp0zpz5oxOnz6dGvECAAAASIes7rEYP368Zs6cqUaNGpnLSpcuLX9/f40YMUIHDhywa4AAAAAA0j+reyz++OMPBQYGJikPDAzUsWPH7BIUAAAAgIzF6sSiWLFimjBhgmJjY81lsbGxmjBhgooVK2bX4AAAAABkDFY/CjVv3jw1bdpUefPmNc/69Pvvv8tkMmndunV2DxAAAABA+md1YlG5cmWdPn1aS5cu1fHjxyVJbdq0Ubt27ZQpUya7BwgAAAAg/bM6sZCkTJkyqXv37vaOBQAAAEAGZfUYC0lasmSJatasKT8/P507d06SNG3aNH377bd2DQ4AAABAxmB1YjF37lyFhITolVde0bVr18wvwcuaNaumT59u7/gAAAAAZABWJxazZs3SZ599puHDh8vJ6f+epKpYsaL++OMPuwYHAAAAIGOwOrE4c+aMypUrl6Tc1dVVt27dsktQAAAAADIWqxOLwMBAHTp0KEn55s2beY8FAAAA8IKyelaokJAQ9e7dW3fv3pVhGNq3b5+WL1+uCRMm6PPPP0+NGAEAAACkc1YnFl27dpW7u7vef/993b59W+3atZOfn59mzJihtm3bpkaMAAAAANK5p3qPRfv27dW+fXvdvn1bN2/eVK5cuewdFwAAAIAMxOoxFnfu3NHt27clSR4eHrpz546mT5+uLVu22D04AAAAABmD1YlFs2bNtHjxYklSdHS0KleurClTpqhZs2aaO3eu3QMEAAAAkP5ZnVj89ttvqlWrliRp1apV8vX11blz57R48WLNnDnT7gECAAAASP+sTixu376tLFmySJK2bNmiFi1ayMHBQVWrVtW5c+fsHiAAAACA9M/qxKJQoUJau3atLly4oO+//14NGjSQJEVFRcnT09PuAQIAAABI/6xOLEaOHKl3331XAQEBqlKliqpVqybp396L5N7IDQAAAOD5Z/V0s61atVLNmjV16dIllSlTxlxev359vfbaa3YNDgAAAEDG8FTvsfD19ZWvr69FWeXKle0SEAAAAICMx+pHoQAAAADgYSQWAAAAAGxGYgEA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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Normal probability statistics\n"]},{"output_type":"display_data","data":{"text/plain":["count    88605.000000\n","mean         0.001014\n","std          0.026122\n","min          0.000006\n","25%          0.000006\n","50%          0.000006\n","75%          0.000006\n","max          0.999996\n","Name: anomaly_probability, dtype: float64"],"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>anomaly_probability</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>count</th>\n","      <td>88605.000000</td>\n","    </tr>\n","    <tr>\n","      <th>mean</th>\n","      <td>0.001014</td>\n","    </tr>\n","    <tr>\n","      <th>std</th>\n","      <td>0.026122</td>\n","    </tr>\n","    <tr>\n","      <th>min</th>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>25%</th>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>50%</th>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>75%</th>\n","      <td>0.000006</td>\n","    </tr>\n","    <tr>\n","      <th>max</th>\n","      <td>0.999996</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div><br><label><b>dtype:</b> float64</label>"]},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Anomaly probability statistics\n"]},{"output_type":"display_data","data":{"text/plain":["count    5665.000000\n","mean        0.982200\n","std         0.129566\n","min         0.000008\n","25%         0.999988\n","50%         0.999995\n","75%         0.999995\n","max         0.999996\n","Name: anomaly_probability, dtype: float64"],"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>anomaly_probability</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>count</th>\n","      <td>5665.000000</td>\n","    </tr>\n","    <tr>\n","      <th>mean</th>\n","      <td>0.982200</td>\n","    </tr>\n","    <tr>\n","      <th>std</th>\n","      <td>0.129566</td>\n","    </tr>\n","    <tr>\n","      <th>min</th>\n","      <td>0.000008</td>\n","    </tr>\n","    <tr>\n","      <th>25%</th>\n","      <td>0.999988</td>\n","    </tr>\n","    <tr>\n","      <th>50%</th>\n","      <td>0.999995</td>\n","    </tr>\n","    <tr>\n","      <th>75%</th>\n","      <td>0.999995</td>\n","    </tr>\n","    <tr>\n","      <th>max</th>\n","      <td>0.999996</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div><br><label><b>dtype:</b> float64</label>"]},"metadata":{}}],"source":["# ============================================================\n","# Step 46 — Prediction probability distribution\n","# ============================================================\n","\n","normal_probs = predictions_df[predictions_df[\"true_label\"] == 0][\"anomaly_probability\"]\n","anomaly_probs = predictions_df[predictions_df[\"true_label\"] == 1][\"anomaly_probability\"]\n","\n","plt.figure(figsize=(8, 4))\n","plt.hist(normal_probs, bins=50, alpha=0.7, label=\"Normal\")\n","plt.hist(anomaly_probs, bins=50, alpha=0.7, label=\"Anomaly\")\n","plt.xlabel(\"Anomaly probability\")\n","plt.ylabel(\"Number of sequences\")\n","plt.title(\"Distribution of LogMiniLM Anomaly Probabilities\")\n","plt.legend()\n","plt.tight_layout()\n","save_current_figure(\"06_logminilm_probability_distribution.png\")\n","plt.show()\n","\n","print(\"Normal probability statistics\")\n","display(normal_probs.describe())\n","print(\"Anomaly probability statistics\")\n","display(anomaly_probs.describe())\n"]},{"cell_type":"markdown","id":"23f26e3e","metadata":{"id":"23f26e3e"},"source":["## Step 47 — Global XAI mean importance by event position\n","\n","This chart aggregates occlusion importance across explained true-positive anomaly sequences."]},{"cell_type":"code","execution_count":50,"id":"a97243ec","metadata":{"id":"a97243ec","executionInfo":{"status":"ok","timestamp":1783281045421,"user_tz":-180,"elapsed":1909,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":787},"outputId":"4e47061d-27c8-4ce4-dd8c-b2e3c4f4cc33"},"outputs":[{"output_type":"stream","name":"stdout","text":["Explained anomaly sequences: 100\n"]},{"output_type":"display_data","data":{"text/plain":["   event_position  mean_importance  median_importance  max_importance  \\\n","0               1     1.399972e-01       0.000000e+00    9.999897e-01   \n","1               2     2.999968e-02       0.000000e+00    9.999877e-01   \n","2               3     2.000037e-02       1.192093e-07    9.999891e-01   \n","3               4     3.695488e-08       0.000000e+00    1.192093e-07   \n","4               5     3.933907e-08       0.000000e+00    5.960464e-07   \n","5               6     3.999900e-02       0.000000e+00    9.999893e-01   \n","6               7     4.051670e-02       0.000000e+00    9.999895e-01   \n","7               8     4.999948e-02       0.000000e+00    9.999890e-01   \n","8               9     7.999910e-02       0.000000e+00    9.999896e-01   \n","9              10     4.999949e-02       0.000000e+00    9.999897e-01   \n","\n","   frequency  \n","0        100  \n","1        100  \n","2        100  \n","3        100  \n","4        100  \n","5        100  \n","6        100  \n","7        100  \n","8        100  \n","9        100  "],"text/html":["\n","  <div id=\"df-59cdd78c-2b39-4534-a053-92230b219f00\" class=\"colab-df-container\">\n","    <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>event_position</th>\n","      <th>mean_importance</th>\n","      <th>median_importance</th>\n","      <th>max_importance</th>\n","      <th>frequency</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>1.399972e-01</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999897e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>2.999968e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999877e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>2.000037e-02</td>\n","      <td>1.192093e-07</td>\n","      <td>9.999891e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>4</td>\n","      <td>3.695488e-08</td>\n","      <td>0.000000e+00</td>\n","      <td>1.192093e-07</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>5</td>\n","      <td>3.933907e-08</td>\n","      <td>0.000000e+00</td>\n","      <td>5.960464e-07</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>6</td>\n","      <td>3.999900e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999893e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>7</td>\n","      <td>4.051670e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999895e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>8</td>\n","      <td>4.999948e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999890e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>9</td>\n","      <td>7.999910e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999896e-01</td>\n","      <td>100</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>10</td>\n","      <td>4.999949e-02</td>\n","      <td>0.000000e+00</td>\n","      <td>9.999897e-01</td>\n","      <td>100</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-59cdd78c-2b39-4534-a053-92230b219f00')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-59cdd78c-2b39-4534-a053-92230b219f00 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-59cdd78c-2b39-4534-a053-92230b219f00');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_8c2f7eac-1702-4c51-8283-e0e98b33e9a8\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('position_importance_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_8c2f7eac-1702-4c51-8283-e0e98b33e9a8 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('position_importance_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"position_importance_df","summary":"{\n  \"name\": \"position_importance_df\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"event_position\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3,\n        \"min\": 1,\n        \"max\": 10,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          9,\n          2,\n          6\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"mean_importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.04115615976477727,\n        \"min\": 3.695487976074219e-08,\n        \"max\": 0.13999721202118054,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          0.07999910476801687,\n          0.0299996824173013,\n          0.039998998580736043\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"median_importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 3.769728732309794e-08,\n        \"min\": 0.0,\n        \"max\": 1.1920928955078125e-07,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1.1920928955078125e-07,\n          0.0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"max_importance\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.4216323184204627,\n        \"min\": 1.1920928955078125e-07,\n        \"max\": 0.9999897194425102,\n        \"num_unique_values\": 10,\n        \"samples\": [\n          0.9999896440449447,\n          0.9999876662341194\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"frequency\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 100,\n        \"max\": 100,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          100\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/07_xai_mean_importance_by_event_position.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x400 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAA90AAAGGCAYAAABmGOKbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbDlJREFUeJzt3Xt8zvX/x/HntdnJMIexGbM55Xwc1ghhGTmWGMk5HZxbqShnNRUiRMqhtCKRSs5zSuQsySFEpDaEOY+29++Pfrty2cau2eUy38f9dvvcuN6f9+f9eX3en8917Xpdn8PbYowxAgAAAAAAWc7F2QEAAAAAAHC/IukGAAAAAMBBSLoBAAAAAHAQkm4AAAAAAByEpBsAAAAAAAch6QYAAAAAwEFIugEAAAAAcBCSbgAAAAAAHISkGwAAAAAAByHpBgBk2NGjR2WxWDR79mxnh3JLFotFw4cPd0jb2aUPAGTO2rVrZbFYtHbtWmeHAuA+QdINZAPvv/++LBaLQkNDnR3KPSc4OFgWiyXNqUmTJs4OT5L05ptvatGiRRmuP3z4cFksFp0+fdpxQd0lx44d03PPPafg4GB5eHioUKFCat26tX744Qdnh5Ytde3aVbly5XJ2GJl2+fJlDR8+/L5MZpYsWSKLxaKAgAAlJyc7OxyHa9eunSwWi1555RVnh5ItbNiwQU2bNlWRIkXk6empYsWKqUWLFvrss8+cHRqAuyCHswMAcHsxMTEKDg7Wli1bdOjQIZUqVcrZId1TqlatqhdffDFVeUBAgBOiSe3NN9/UE088odatWzs7lLvqhx9+0KOPPipJevrpp1W+fHnFxcVp9uzZqlu3riZOnKi+ffs6OUr7BQUF6cqVK3Jzc3N2KNnO5cuXNWLECEnSww8/7NxgsljK5/TRo0e1evVqhYeHOzskhzl//ry+/fZbBQcH6/PPP9eYMWNksVicHdY9a/78+YqMjFTVqlXVv39/5cuXT0eOHNH69ev14Ycf6sknn3R2iAAcjKQbuMcdOXJEGzdu1MKFC/Xss88qJiZGw4YNu6sxJCcn69q1a/L09Lyr682oIkWK6KmnnnJ2GLjB2bNn9cQTT8jLy0s//PCDSpYsaZ0XFRWliIgIDRgwQCEhIapdu7YTI7WfxWK5Z98L96qUz5D71aVLl/T1118rOjpas2bNUkxMTJYl3f/884+Sk5Pl7u6eJe1lhQULFigpKUkzZ85Uw4YNtX79etWvX9/ZYd2zhg8frvLly+vHH39MtR9PnjzppKgA3E1cXg7c42JiYpQvXz41a9ZMTzzxhGJiYqzzrl+/rvz586tbt26pljt//rw8PT310ksvWcsSExM1bNgwlSpVSh4eHgoMDNTLL7+sxMREm2UtFov69OmjmJgYVahQQR4eHlq2bJkkaezYsapdu7YKFCggLy8vhYSE6Msvv0y1/itXrqhfv37y9fVV7ty51bJlS504cSLNe21PnDih7t27y8/PTx4eHqpQoYJmzpx5J91mY+zYsbJYLPr9999TzRs0aJDc3d119uxZa9nmzZvVpEkT+fj4KGfOnKpfv36qy6FTLgE/dOiQunbtqrx588rHx0fdunXT5cuXrfUsFosuXbqkjz/+2HrZe9euXbNku/bv368nnnhC+fPnl6enp2rUqKFvvvnGOn/btm2yWCz6+OOPUy27fPlyWSwWLV682FqWlfvhgw8+UFxcnN555x2bhFuSvLy8rP0xcuRIm3nnzp3TCy+8YL0cvWjRourcubPNpfZXr17V8OHD9cADD8jT01OFCxfW448/rsOHD6cbT9euXRUcHJyqPGU/3mjlypV66KGHlDdvXuXKlUtlypTR4MGDrfPTu6d79erVqlu3rry9vZU3b161atVK+/btS3N9tztu7BEcHKzmzZtr7dq1qlGjhry8vFSpUiXrJdwLFy5UpUqV5OnpqZCQEO3cuTNV3+TKlUu//fabIiIi5O3trYCAAI0cOVLGGJu6ly5d0osvvqjAwEB5eHioTJkyGjt2bKp6aX2GTJs2TQULFpQkjRgxwvp+SPk82L17t7p27aoSJUrI09NT/v7+6t69u/7+++876sNPP/1UtWrVUs6cOZUvXz7Vq1dPK1assKmzdOlS677LnTu3mjVrpl9++SXD++Crr77SlStX1LZtW7Vv314LFy7U1atXU9W73bGbcmyNHTtWEyZMUMmSJeXh4aG9e/dKytgxduHCBQ0YMMDmlo5HHnlEO3bssNY5ePCg2rRpI39/f3l6eqpo0aJq3769EhISMrS9MTExeuSRR9SgQQOVK1fO5u9SitmzZ8tiseiHH35QVFSUChYsKG9vbz322GM6depUqvrvv/++9VgJCAhQ7969de7cOZs6Dz/8sCpWrKjdu3erfv36ypkzp0qVKmX9G7Ru3TqFhobKy8tLZcqU0apVq2yW//3339WrVy+VKVNGXl5eKlCggNq2baujR4/ecnuHDRsmNze3NON+5plnlDdv3jT3d4rDhw+rZs2aaf5wUqhQIZvXycnJmjBhgipUqCBPT0/5+fnp2WeftfkbJUnGGI0ePVpFixZVzpw51aBBA/3yyy8KDg62+RuT1mec9N/+uXnbM/JeSPnMOHHihFq3bq1cuXKpYMGCeumll5SUlJRqeyZOnGj9DCpYsKCaNGmibdu22dT79NNPFRISIi8vL+XPn1/t27fX8ePHberc6XELOJUBcE8rW7as6dGjhzHGmPXr1xtJZsuWLdb53bt3N3nz5jWJiYk2y3388cdGktm6dasxxpikpCTTuHFjkzNnTjNgwADzwQcfmD59+pgcOXKYVq1a2SwryZQrV84ULFjQjBgxwkyZMsXs3LnTGGNM0aJFTa9evczkyZPN+PHjTa1atYwks3jxYps22rVrZySZTp06mSlTpph27dqZKlWqGElm2LBh1npxcXGmaNGiJjAw0IwcOdJMnTrVtGzZ0kgy77777m37JygoyDRu3NicOnUq1XT58mVjjDG///67sVgs5u233061fIkSJUyzZs2sr2NjY427u7sJCwsz48aNM++++66pXLmycXd3N5s3b7bWGzZsmJFkqlWrZh5//HHz/vvvm6efftpIMi+//LK13pw5c4yHh4epW7eumTNnjpkzZ47ZuHHjLbcppe1Tp06lW2fPnj3Gx8fHlC9f3rz11ltm8uTJpl69esZisZiFCxfabN+jjz6aavlu3bqZfPnymWvXrhljMr4fjhw5YiSZWbNm3XIbateubTw9Pc3Vq1fTrVO/fn3j5uZm3U8XLlwwFStWNK6urqZnz55m6tSpZtSoUaZmzZrW4++ff/4xjRo1MpJM+/btzeTJk010dLRp2LChWbRokbXtm4+zLl26mKCgoFQxpPR1ij179hh3d3dTo0YNM3HiRDNt2jTz0ksvmXr16t2yD1auXGly5MhhHnjgAfP222+bESNGGF9fX5MvXz5z5MiRVOu73XGTni5duhhvb2+bsqCgIFOmTBlTuHBhM3z4cPPuu++aIkWKmFy5cplPP/3UFCtWzIwZM8aMGTPG+Pj4mFKlSpmkpCSbNj09PU3p0qVNp06dzOTJk03z5s2NJDNk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/v3l5+cnLy8vFSxY0NpGWvds3q4PDx8+LBcXl1sm/inv+YYNG6Y69lesWJGh4z7lnvG///7b+jldrVo1Xbt2TfPnz7fWs+fYvbnv7DnG3n77be3Zs0eBgYGqVauWhg8fbpMIFS9eXFFRUfroo4/k6+uriIgITZkyJUP3xe7bt087d+5UnTp1rNt66NAhPfzww1q8eHGaPxrdbj+lt23u7u4qUaJEquOqaNGiqX6k8PHxydCxfuXKFQ0dOtT6TAJfX18VLFhQ586du+32R0ZGysPDw/rjQkJCghYvXqyOHTtm6Ae/iIgILV++XOfOndP69evVu3dv/f7772revLn1ODt48KASEhJUqFChVMfjxYsXrfVS+qR06dI26yhYsKC1f+1l73sh5f7sG+XLl8+mvw8fPqyAgACbH4rSWq8xRqVLl0613n379lnXeyfHLXAv4OnlwD1q9erV+uuvvzR37lzNnTs31fyYmBg1btxYktS+fXt98MEHWrp0qVq3bq0vvvhCZcuWVZUqVaz1k5OTValSJY0fPz7N9d38heXGMwIpvv/+e7Vs2VL16tXT+++/r8KFC8vNzU2zZs3K1FijKYnMU089pS5duqRZp3Llyna3m5aAgADVrVtXX3zxhQYPHqwff/xRx44d01tvvZUqnnfeeUdVq1ZNs52bx0h2dXVNs5656cFSN9u4caP1CoYUR44cSfNhXzdLifOll15SREREmnVu/IEjMjJSb7zxhk6fPq3cuXPrm2++UYcOHaxf/h2xH8qVK6edO3cqMTFRHh4eadbZvXu33NzcUn1xdIT0vhTf/EOHl5eX1q9frzVr1ui7777TsmXLNG/ePDVs2FArVqxId3/bK7PHjb3tZfV67JHWZ8ittGvXThs3btTAgQNVtWpV5cqVS8nJyWrSpEmaP3pkxbaltDtnzhz5+/unmn+7BPngwYPaunWrpNQJkPTv5/QzzzyT4XhS2Nt3N2rXrp3q1q2rr776SitWrNA777yjt956SwsXLlTTpk0lSePGjVPXrl319ddfa8WKFerXr5+io6P1448/qmjRoum2/emnn0qSXnjhBb3wwgup5i9YsCDVgz3vpWO9b9++mjVrlgYMGKCwsDD5+PjIYrGoffv2t72yJV++fGrevLliYmI0dOhQffnll0pMTLR75IycOXOqbt26qlu3rnx9fTVixAgtXbpUXbp0UXJysgoVKpTuVQM3J7kZkdHPPnvfC1n1WZicnCyLxaKlS5em2eaNf3Mze9wC9wKSbuAeFRMTo0KFCmnKlCmp5i1cuFBfffWVpk2bJi8vL9WrV0+FCxfWvHnz9NBDD2n16tV67bXXbJYpWbKkfvrpJzVq1CjTl+EuWLBAnp6eWr58uU0iNWvWLJt6QUFBSk5O1pEjR2y+iB46dMimXsGCBZU7d24lJSXdlTFtIyMj1atXLx04cEDz5s1Tzpw51aJFC+v8lKds58mTJ0vjSau/q1SpopUrV9qUpfVFJy0pZyTd3NwyFGdkZKRGjBihBQsWyM/PT+fPn7e5PNMR+6F58+batGmT5s+fn+aX0qNHj+r7779XeHi4NcEoWbKk9uzZc8t2S5Ysqc2bN+v69et2jZOdL1++VE9CllKfnZX+PevbqFEjNWrUSOPHj9ebb76p1157TWvWrEmzf1KuqDhw4ECqefv375evr6+8vb0zHKszJCcn67fffrOe3ZakX3/9VZKsPwQFBQVp1apVqW4d2L9/v3X+7aT32XP27FnFxsZqxIgRGjp0qLU85exbZpQsWVLJycnau3dvuj+ipbznCxUqlKljPyYmRm5ubpozZ06qhGHDhg167733dOzYMRUrVizTx65k/zFWuHBh9erVS7169dLJkydVvXp1vfHGG9akW5IqVaqkSpUq6fXXX9fGjRtVp04dTZs2TaNHj04zBmOMPvvsMzVo0CDVrUOSNGrUKMXExKQ5mkZGt+3Gqy2uXbumI0eOZOln8ZdffqkuXbpo3Lhx1rKrV6+m+dmQls6dO6tVq1baunWrYmJiVK1aNVWoUCHT8dSoUUPSv7cPSP8ej6tWrVKdOnVu+cNLSp8dPHjQps9OnTqV6iqWlDPf586ds94+I6X+7LvT90JaSpYsqeXLl+vMmTPpnu0uWbKkjDEqXry4zedPeuw9boF7BZeXA/egK1euaOHChWrevLmeeOKJVFOfPn104cIF6/BQLi4ueuKJJ/Ttt99qzpw5+ueff2wuLZf+Pftx4sQJffjhh2mu7+bLX9Pi6uoqi8Vi8wv50aNHtWjRIpt6KWdf33//fZvySZMmpWqvTZs2WrBgQZrJVlrDs9yJNm3ayNXVVZ9//rnmz5+v5s2b23xRDQkJUcmSJTV27FhdvHgxy+Lx9vZO9aUuX758qS6Hz+jYz4UKFdLDDz+sDz74wPpl7VZxlitXTpUqVdK8efM0b948FS5cWPXq1bPOd8R+ePbZZ1WoUCENHDgw1f3DV69eVbdu3WSMsUmw2rRpo59++klfffVVqvZSzla1adNGp0+f1uTJk9Otk5aSJUsqISFBu3fvtpb99ddfqdZ15syZVMumJGw3D62XonDhwqpatao+/vhjm/28Z88erVixQo8++mi6cd1LbuxTY4wmT54sNzc3NWrUSJL06KOPKikpKVXfv/vuu7JYLDYJXXpy5swpSaneDykJ6837cMKECfZuhlXr1q3l4uKikSNHpjqLmbKeiIgI5cmTR2+++aauX7+eqo3bHfsxMTGqW7euIiMjU31ODxw4UJL0+eefS8r8sStl/BhLSkpKdbltoUKFFBAQYD1+z58/r3/++cemTqVKleTi4pLuMS5JP/zwg44ePapu3bql+XcpMjJSa9asSfde8vSEh4fL3d1d7733nk0/zJgxQwkJCWrWrJld7d2Kq6trqr6eNGlShm/tadq0qXx9ffXWW29p3bp1GT7LnXI72M1S7sVPubS+Xbt2SkpK0qhRo1LV/eeff6z7Pjw8XG5ubpo0aZLN9qT1fklJptevX28tSxnG8kZ3+l5IS5s2bWSM0YgRI1LNS4n78ccfl6urq0aMGJFq3xhjrEMGZva4Be4VnOkG7kHffPONLly4oJYtW6Y5/8EHH1TBggUVExNjTa4jIyM1adIkDRs2TJUqVbLeZ5miU6dO+uKLL/Tcc89pzZo1qlOnjpKSkrR//3598cUXWr58ufVX9/Q0a9ZM48ePV5MmTfTkk0/q5MmTmjJlikqVKmWTzISEhKhNmzaaMGGC/v77bz344INat26d9czZjWe7xowZozVr1ig0NFQ9e/ZU+fLldebMGe3YsUOrVq1KMwm62YkTJ6yXPd4oV65cat26tfV1oUKF1KBBA40fP14XLlxI9cOEi4uLPvroIzVt2lQVKlRQt27dVKRIEZ04cUJr1qxRnjx59O233942npuFhIRo1apVGj9+vAICAlS8eHGbB/6kZ/z48dYk5cYYBw8erClTpuihhx5SpUqV1LNnT5UoUULx8fHatGmT/vjjD/300082y0VGRmro0KHy9PRUjx49Uj1YKiv2w40KFCigL7/8Us2aNVP16tX19NNPq3z58oqLi9Ps2bN16NAhTZw4UbVr17YuM3DgQH355Zdq27atunfvrpCQEJ05c0bffPONpk2bpipVqqhz58765JNPFBUVpS1btqhu3bq6dOmSVq1apV69elkfinez9u3b65VXXtFjjz2mfv366fLly5o6daoeeOABmwcojRw5UuvXr1ezZs0UFBSkkydP6v3331fRokX10EMPpbu977zzjpo2baqwsDD16NFDV65c0aRJk+Tj45NqXPp7kaenp5YtW6YuXbooNDRUS5cu1XfffafBgwdbL2lt0aKFGjRooNdee01Hjx5VlSpVtGLFCn399dcaMGBAqvHY0+Ll5aXy5ctr3rx5euCBB5Q/f35VrFhRFStWVL169fT222/r+vXrKlKkiFasWKEjR45keptKlSql1157zfrQqscff1weHh7aunWrAgICFB0drTx58mjq1Knq1KmTqlevrvbt26tgwYI6duyYvvvuO9WpUyfNJFmSNm/erEOHDtk8gO5GRYoUUfXq1RUTE6NXXnkl08duiowcYxcuXFDRokX1xBNPqEqVKsqVK5dWrVqlrVu3Ws/url69Wn369FHbtm31wAMP6J9//rGeqb/xYXA3i4mJkaura7pJcMuWLfXaa69p7ty5ioqKuuW23KhgwYIaNGiQRowYoSZNmqhly5Y6cOCA3n//fdWsWdPuy7dvpXnz5pozZ458fHxUvnx5bdq0SatWrVKBAgUytLybm5vat2+vyZMny9XV1eZhnbfSqlUrFS9eXC1atFDJkiWt+/3bb79VzZo1rVdc1a9fX88++6yio6O1a9cuNW7cWG5ubjp48KDmz5+viRMn6oknnrCOiR0dHa3mzZvr0Ucf1c6dO7V06VL5+vrarLtx48YqVqyYevTooYEDB8rV1VUzZ860Hucp7uS9kJ4GDRqoU6dOeu+993Tw4EHrrSLff/+9GjRooD59+qhkyZIaPXq0Bg0apKNHj6p169bKnTu3jhw5oq+++krPPPOMXnrppUwft8A94248Ih2AfVq0aGE8PT1txg29WdeuXY2bm5t1iKfk5GQTGBiY5pA+Ka5du2beeustU6FCBePh4WHy5ctnQkJCzIgRI0xCQoK1nqR0h5yZMWOGKV26tPHw8DBly5Y1s2bNSnNIkkuXLpnevXub/Pnzm1y5cpnWrVubAwcOGElmzJgxNnXj4+NN7969TWBgoHFzczP+/v6m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DRgwwKGxrF27VhaLRefOnXPoejLr5j4IDg7WhAkTnBYPAAB3iqQbAJDlunbtKovFkmpq0qTJXY1j+PDhqlq16l1dZ1oCAwP1119/qWLFipLST3wXLlyoUaNGOTSW2rVr66+//pKPj88dtdOvXz+FhITIw8Mj3T7evXu36tatK09PTwUGBurtt9+2ez1bt27VM888c0exAgDgTDmcHQAA4P7UpEkTzZo1y6bMw8PDSdE4l6urq/z9/W9bL3/+/A6Pxd3dPUOxZET37t21efNm7d69O9W88+fPq3HjxgoPD9e0adP0888/q3v37sqbN69dSXTBggWzJFYAAJyFM90AAIfw8PCQv7+/zZQvXz5J0pNPPqnIyEib+tevX5evr68++eQTSVJycrKio6NVvHhxeXl5qUqVKvryyy+t9VPOFsfGxqpGjRrKmTOnateurQMHDkiSZs+erREjRuinn36ynmmfPXt2mrF27dpVrVu31ogRI1SwYEHlyZNHzz33nK5du2atk5iYqH79+qlQoULy9PTUQw89pK1bt1rnnz17Vh07dlTBggXl5eWl0qVLW390uPHy8qNHj6pBgwaSpHz58slisahr166SUl9affbsWXXu3Fn58uVTzpw51bRpUx08eNA6f/bs2cqbN6+WL1+ucuXKKVeuXGrSpIn++uuvdPfLzWfZM9OGJL333nvq3bu3SpQokeb8mJgYXbt2TTNnzlSFChXUvn179evXT+PHj79luze7+fJyi8Wijz76SI899phy5syp0qVL65tvvrFZZs+ePWratKly5colPz8/derUSadPn053Hb///rtatGihfPnyydvbWxUqVNCSJUsy3N6lS5fUuXNn5cqVS4ULF9a4ceNS7UuLxaJFixbZrDdv3rw2x+Tx48fVrl075c2bV/nz51erVq109OhR6/yU43Ts2LEqXLiwChQooN69e+v69evWOomJiXrllVcUGBgoDw8PlSpVSjNmzMh03wAA7hxJNwDgruvYsaO+/fZbXbx40Vq2fPlyXb58WY899pgkKTo6Wp988ommTZumX375RS+88IKeeuoprVu3zqat1157TePGjdO2bduUI0cOde/eXZIUGRmpF198URUqVNBff/2lv/76K1Wif6PY2Fjt27dPa9eu1eeff66FCxdqxIgR1vkvv/yyFixYoI8//lg7duxQqVKl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xSpXrlya6woKCpLFYtHixYt16tQpmwfKpShdurRatWqlnj17asOGDfrpp5/01FNPqUiRImrVqlWG+8BRDh06pF27dikuLk5XrlzRrl27tGvXLutDv5588km5u7urR48e+uWXXzRv3jxNnDhRUVFRDo2rd+/eOnPmjDp06KCtW7fq8OHDWr58ubp165bujxwDBgzQ8uXLdeTIEe3YsUNr1qyx7rvbtZcrVy716NFDAwcO1OrVq7Vnzx517dpVLi62X7EaNmyoyZMna+fOndq2bZuee+45m7PWHTt2lK+vr1q1aqXvv/9eR44c0dq1a9WvXz/98ccfGdr24OBgdenSRd27d9eiRYusbXzxxReZ7hsAwJ0j6QYAOMSyZctUuHBhm+mhhx6yqdOxY0ft3btXRYoUsblfWpJGjRqlIUOGKDo6WuXKlVOTJk303XffqXjx4hmOoU2bNmrSpIkaNGigggUL6vPPP0+3bqNGjVS6dGnVq1dPkZGRatmypYYPH26dP2bMGLVp00adOnVS9erVdejQIS1fvtx61tbd3V2DBg1S5cqVVa9ePbm6ulrvUb9ZkSJFNGLECL366qvy8/NTnz590qw3a9YshYSEqHnz5goLC5MxRkuWLEl1ibEzPP3006pWrZo++OAD/frrr6pWrZqqVaumP//8U5Lk4+OjFStW6MiRIwoJCdGLL76ooUOH2jVGd2YEBATohx9+UFJSkho3bqxKlSppwIAByps3b6pEOEVSUpJ69+5tPc4eeOABvf/++xlu75133lHdunXVokULhYeH66GHHlJISIjNOsaNG6fAwEDVrVtXTz75pF566SWbZwjkzJlT69evV7FixfT444+rXLly6tGjh65evWrXme+pU6fqiSeeUK9evVS2bFn17NlTly5dynTfAADunMXc6U1bAABkc127dtW5c+dSjaMMZNbDDz+sqlWr2owxDgD438TPmgAAAAAAOAhJNwAAAAAADsLl5QAAAAAAOAhnugEAAAAAcBCSbgAAAAAAHISkGwAAAAAAByHpBgAAAADAQUi6AQAAAABwEJJuAAAAAAAchKQbAAAAAAAHIekGAAAAAMBBSLoBAAAAAHCQ/wNQlFr0bLAhtwAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 47 — Global XAI mean importance by event position\n","# ============================================================\n","\n","all_anomaly_xai = local_xai_df[\n","    (local_xai_df[\"true_label\"] == 1) &\n","    (local_xai_df[\"predicted_label\"] == 1)\n","].copy()\n","\n","position_importance_df = (\n","    all_anomaly_xai\n","    .groupby(\"event_position\")\n","    .agg(\n","        mean_importance=(\"importance_drop\", \"mean\"),\n","        median_importance=(\"importance_drop\", \"median\"),\n","        max_importance=(\"importance_drop\", \"max\"),\n","        frequency=(\"importance_drop\", \"count\")\n","    )\n","    .reset_index()\n","    .sort_values(\"event_position\")\n",")\n","\n","print(\"Explained anomaly sequences:\", all_anomaly_xai[\"sequence_local_test_index\"].nunique())\n","display(position_importance_df)\n","\n","plt.figure(figsize=(10, 4))\n","plt.bar(position_importance_df[\"event_position\"].astype(str), position_importance_df[\"mean_importance\"])\n","plt.xlabel(\"Event position in 10-line sequence\")\n","plt.ylabel(\"Mean importance drop\")\n","plt.title(\"Average Event-Level Occlusion Importance Across Anomaly Sequences\")\n","plt.tight_layout()\n","save_current_figure(\"07_xai_mean_importance_by_event_position.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"3e05fb79","metadata":{"id":"3e05fb79"},"source":["## Step 48 — Strong local XAI case study chart\n","\n","This chart visualizes the strongest local case study selected by occlusion."]},{"cell_type":"code","execution_count":51,"id":"83a88eda","metadata":{"id":"83a88eda","executionInfo":{"status":"ok","timestamp":1783281047369,"user_tz":-180,"elapsed":1944,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":424},"outputId":"542a4e30-0030-4e6f-ee45-05e748547792"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/08_xai_strong_case_study_occlusion.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x400 with 1 Axes>"],"image/png":"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GU5OTsbZs2etbZKM0aNH33Mbqlevbnh5ed2zz5QpUwxJxjfffGMYhmF89tlnhiRjypQp6fqm7eMffvjBkGQMGDDgrn0M48/3T1hYmPX56NGjjYy+0tz5GVi2bNl9971hpN8Hmf1c2/O+yUjadmT0KF++vE3ftWvXGpKMt956yzh58qTh4eFhtGnTJsPtDwwMNJKTk63tEydONCQZK1assLY1bNjQ5n18+/ZtIykpyWZ5V69eNfz8/IxevXpZ206dOmVIMh555BHjypUr1vYVK1YYkoxvv/3W2pb2vv2rBQsWpPub9O6776b725Xmztd+0KBBhiRjy5Yt1raEhASjVKlSRkBAgJGSkmIYxv//TatYsaLNdr3//vsZfoYAIDtxeDkAZJOUlBStW7dObdq0UenSpa3tRYsWVdeuXbV161bFx8dLktasWaOgoCCb0aJChQqpW7du91xH165d9fXXX1sP1XZycko3knM/lSpVUv369a3PCxcurPLly+vkyZN2Led+OnXqpBs3bmjlypVKSEjQypUrs3RoeUBAgNavX5/uMWjQIGuf0NBQXbx40eZw+CVLlig1NdV6TvGVK1f0ww8/qFOnTkpISFBMTIxiYmJ0+fJlhYSE6Ndff9Xvv/9us+4XX3zRZiSwfv36SklJ0ZkzZ+zejswyDENLly5V69atZRiGtc6YmBiFhIQoLi5O+/btkyS1a9dOefPmtRlBPXjwoA4dOmRzLvV///tf1a9fXwULFrRZXnBwsFJSUrR582a7akxISFCBAgXu2Sdtetp7funSpfLx8dFrr72Wrm/aPl66dKksFku6kfu/9nkQaSPFK1eu1K1btzI1jz2f6zQP+r5ZunRpuvf7nDlzbPo0bdpUL730kt588021a9dOrq6umjVrVobLe/HFF62jzZL0yiuvKG/evFq9evVda3BycrJeSDE1NVVXrlzR7du3VbNmTev7769CQ0NVsGBBm22WZPN3xc3NzfrvmzdvKiYmRk899ZQkZbjMzFi9erVq1aplc9FGDw8Pvfjiizp9+rQOHTpk079nz542F4jMqE4AyG4cXg4A2eTSpUu6fv26ypcvn25axYoVlZqaqnPnzqly5co6c+aMgoKC0vUrW7bsPdfRuXNnDRkyRN99952++uortWrV6r7h504lSpRI11awYMH7nuNpr8KFCys4OFjz58/X9evXlZKSog4dOti9HHd3dwUHB9+zT7NmzeTl5aVFixapSZMmkv48xLp69ep67LHHJP15WL1hGBo5cqRGjhyZ4XIuXryo4sWLW5/fua/SQsX99lVKSkq6c3gLFSqUqavBX7p0SbGxsZo9e7Zmz5591zolycfHR02aNNHixYs1btw4SX9ud968edWuXTtr/19//VU///zzXQ/RTVteZhUoUOC+F8NLSEiw9pWkEydOqHz58ve8KviJEydUrFgxFSpUyK56Mqthw4Zq3769xo4dq/fee0+NGjVSmzZt1LVr17ue2mHP5zpNVt83aRo0aJCpC6lNmjRJK1asUFRUlObPn3/X00zuvN2gh4eHihYtmuG1I/5q3rx5mjx5so4cOWLzI0WpUqXS9c3MNl+5ckVjx47VwoUL073n4uLi7lnL3Zw5cybd4f3Sn69N2vS000syWycAZDdCNwDkIEWLFlWjRo00efJkbdu2Ld0VyzPjblc0NwzjQctLp2vXrurbt68uXLig5s2bm3bLIxcXF7Vp00bLli3T9OnTFR0drW3btmn8+PHWPmkXDBsyZIhCQkIyXM6dP3pkdV+dO3cuXTDZsGFDpi6yllbn888/r7CwsAz7VK1a1frvzp07q2fPnoqKilL16tW1ePFiNWnSxCa0paam6plnntG//vWvDJeX9sNEZlWsWFFRUVE6e/Zshj/iSH9eNEv688gKs91tFDwlJSVdvyVLlmjnzp369ttvtXbtWvXq1UuTJ0/Wzp0773sf+sx6WJ+x/fv3W8PrgQMH1KVLl2xb9pdffqkePXqoTZs2Gjp0qHx9feXk5KSIiAibC9+lycw2d+rUSdu3b9fQoUNVvXp1eXh4KDU1Vc2aNcvSBf2y4mH+/QOANIRuAMgmhQsXVv78+XX06NF0044cOaI8efLI399fklSyZMkMr5ibmavodu3aVX369JG3t7datGjx4IWbqG3btnrppZe0c+fOTF9EKqtCQ0M1b948RUZG6vDhwzIMw+YQ67RDg/Ply3ffkXN7ZBT4ihQpYnPldkmqVq1appZXuHBhFShQQCkpKZmqs02bNnrppZes+/fYsWMaPny4TZ8yZcro2rVr2bbdrVq10oIFC/T555/rjTfeSDc9Pj5eK1asUIUKFaw/ZJQpU0Y//vijbt26ZXOo8511rl27VleuXLFrtDtttDI2Ntbmh527Hc791FNP6amnntLbb7+t+fPnq1u3blq4cKH69OmTrq89n+uHKTExUT179lSlSpVUp04dTZw4UW3bttWTTz6Zru+vv/6qxo0bW59fu3ZN58+fv+ffjyVLlqh06dL6+uuvbd7jGR36nxlXr15VZGSkxo4dq1GjRtnUdid7TiUoWbLkXV+btOkA4Gic0w0A2cTJyUlNmzbVihUrbA7bjI6O1vz581WvXj15enpK+vPWPjt27FBUVJS135UrV/TVV1/ddz0dOnTQ6NGjNX369EwdruxIHh4emjFjhsaMGaPWrVubuq7g4GAVKlRIixYt0qJFi1SrVi2b0WZfX181atRIs2bN0vnz59PNn9VbOrm7uys2NtamzdXVVcHBwTaPv57vei9OTk5q37699bZc96vT29tbISEhWrx4sRYuXChnZ2e1adPGpk+nTp20Y8cOrV27Nt3yYmNjdfv27UzVlqZDhw6qVKmSJkyYkO5WXqmpqXrllVd09epVm4DWvn17xcTE2NzGLE3aKGP79u1lGEaGt0G710hk2pXP/3puemJioubNm2fT7+rVq+mWk3ZdhaSkpAyXbc/n+mH697//rbNnz2revHmaMmWKAgICFBYWluF2zJ492+bw8BkzZuj27dvWOwtkJG1E+K/768cff9SOHTuyVG9Gy5OU4ZXz3d3dJSnd5yojLVq00K5du2zqSkxM1OzZsxUQEPBQjrQAgPthpBsA7PTZZ59pzZo16doHDhyot956S+vXr1e9evX06quvKm/evJo1a5aSkpI0ceJEa99//etf+vLLL/XMM8/otddes94yrESJErpy5co9R3q8vLzS3UP4Ybl165beeuutdO2FChXSq6++muE8dztEOrPi4uL05ZdfZjjt+eeft/47X758ateunRYuXKjExERNmjQpXf9p06apXr16qlKlivr27avSpUsrOjpaO3bs0G+//aaffvrJ7voCAwM1Y8YMvfXWWypbtqx8fX2tt3S7l3u9jyZMmKANGzaodu3a6tu3rypVqqQrV65o3759+v7779PdUio0NFTPP/+8pk+frpCQkHSH8Q8dOlTffPONWrVqZb09XGJiog4cOKAlS5bo9OnTmTqHOI2zs7OWLFmiJk2aqF69eurZs6dq1qyp2NhYzZ8/X/v27dPrr7+uzp07W+fp3r27Pv/8c4WHh2vXrl2q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66+/WqfPnTtX3t7eWrt2rSpWrCgPDw81a9ZM58+fv+vrcucoe1aWIUkffPCB+vXrp9KlS2c4/auvvlJycrI+++wzVa5cWZ07d9aAAQM0ZcqUey73TnceXm6xWPTJJ5+obdu2yp8/v8qVK6dvvvnGZp6DBw+qefPm8vDwkJ+fn1544QXFxMTcdR1nzpxR69atVbBgQbm7u6ty5cpavXp1ppeXmJio7t27y8PDQ0WLFtXkyZPTvZYWi0XLly+3Wa+3t7fNe/LcuXPq1KmTvL29VahQIT333HM6ffq0dXra+3TSpEkqWrSoHnnkEfXr10+3bt2y9klKStK///1v+fv7y8XFRWXLltWnn36a5X0DADAHoRsAYKpu3brp22+/1bVr16xta9eu1fXr19W2bVtJUkREhD7//HPNnDlTv/zyiwYPHqznn39emzZtslnWiBEjNHnyZO3Zs0d58+ZVr169JEmhoaF6/fXXVblyZZ0/f17nz59PF/T/KjIyUocPH9bGjRu1YMECff311xo7dqx1+r/+9S8tXbpU8+bN0759+1S2bFmFhIToypUrkqSRI0fq0KFD+u6773T48GHNmDFDPj4+6dbj7++vpUuXSpKOHj2q8+fP6/3338+wph49emjPnj365ptvtGPHDhmGoRYtWtiErOvXr2vSpEn64osvtHnzZp09e1ZDhgy55/6/U3Ys4047duxQgwYN5OzsbG0LCQnR0aNHdfXq1Qda9tixY9WpUyf9/PPPatGihbp162Z9HWJjY/X000+rRo0a2rNnj9asWaPo6Gh16tTprsvr16+fkpKStHnzZh04cEDvvPOOPDw8Mr28oUOHatOmTVqxYoXWrVunjRs3at++fXZt061btxQSEqICBQpoy5Yt2rZtm/UHkL/++LNhwwadOHFCGzZs0Lx58zR37lyb4N69e3ctWLBAH3zwgQ4fPqxZs2bZtS0AgIfEAADgAYSFhRlOTk6Gu7u7zePtt982DMMwbt26Zfj4+Biff/65dZ4uXboYoaGhhmEYxs2bN438+fMb27dvt1lu7969jS5duhiGYRgbNmwwJBnff/+9dfqqVasMScaNGzcMwzCM0aNHG9WqVctUvYUKFTISExOtbTNmzDA8PDyMlJQU49q1a0a+fPmMr776yjo9OTnZKFasmDFx4kTDMAyjdevWRs+ePTNc/qlTpwxJxv79+21qv3r1qk2/hg0bGgMHDjQMwzCOHTtmSDK2bdtmnR4TE2O4ubkZixcvNgzDMObMmWNIMo4fP27tM23aNMPPz++u23rnurOyjL+62z5+5plnjBdffNGm7ZdffjEkGYcOHbrr8v66DwzDMEqWLGm899571ueSjDfeeMP6/Nq1a4Yk47vvvjMMwzDGjRtnNG3a1GaZ586dMyQZR48ezXCdVapUMcaMGZPhtPstLyEhwXB2dra+JoZhGJcvXzbc3NxstkOSsWzZMpvleHl5GXPmzDEMwzC++OILo3z58kZqaqp1elJSkuHm5masXbvWMIw/36clS5Y0bt++be3TsWNH6+fm6NGjhiRj/fr1WdoWAMDDwzndAIAH1rhxY82YMcOmLe2c5bx586pTp0766quv9MILLygxMVErVqzQwoULJUnHjx/X9evX9cwzz9jMn5ycrBo1ati0Va1a1frvokWLSpIuXryoEiVK2FVvtWrVlD9/fuvzoKAgXbt2TefOnVNcXJxu3bqlunXrWqfny5dPtWrV0uHDhyVJr7zyitq3b699+/apadOmatOmjerUqWNXDX91+PBh5c2bV7Vr17a2PfLIIypfvrx1nZKUP39+lSlTxvq8aNGiunjxol3ryo5l2GvLli1q3ry59fmsWbPUrVu3TM3719fc3d1dnp6e1np/+uknbdiwwTq6+1cnTpzQY489lq59wIABeuWVV7Ru3ToFBwerffv21nXcb3k3btxQcnKyzetUqFAhlS9fPlPbkuann37S8ePHVaBAAZv2mzdv6sSJE9bnlStXlpOTk/V50aJFdeDAAUlSVFSUnJyc1LBhw7uuw959AwAwB6EbAPDA3N3dVbZs2btO79atmxo2bKiLFy9q/fr1cnNzs17dPO2w81WrVql48eI28915MbZ8+fJZ/22xWCT9eT74w9a8eXOdOXNGq1ev1vr169WkSRP169dPkyZNMnW9f91+6c99YBjGQ1/GnYoUKaLo6GibtrTnRYoUUUBAgM0t1Pz8/DK97IzqTXvNr127ptatW+udd95JN1/ajzJ36tOnj0JCQrRq1SqtW7dOERERmjx5sl577bX7Lu/48eOZqjmjffrX0wSuXbumwMBAffXVV+nm/evF5O617W5ubvesISv7BgBgDkI3AMB0derUkb+/vxYtWqTvvvtOHTt2tAaKSpUqycXFRWfPnr3rqF1mODs7KyUlJVN9f/rpJ924ccMaXHbu3CkPDw/5+/vLx8dHzs7O2rZtm0qWLCnpz8C0e/dum4tlFS5cWGFhYQoLC1P9+vU1dOjQDEN32nnO96qtYsWKun37tn788UfriPnly5d19OhRVapUKVPb5EhBQUEaMWKEbt26ZX1d169fr/Lly1svqHevH2Wy6oknntDSpUsVEBCgvHkz/5XG399fL7/8sl5++WUNHz5cH3/8sV577bX7Lq9MmTLKly+ffvzxR+vRFVevXtWxY8ds3ruFCxe2uTjdr7/+quvXr9vUvWjRIvn6+srT0zMrm64qVaooNTVVmzZtUnBwcLrpWd03AIDsx4XUAAAPLCkpSRcuXLB53HmV5K5du2rmzJlav369zaHFBQoU0JAhQzR48GDNmzdPJ06c0L59+/Thhx9q3rx5ma4hICBAp06dUlRUlGJiYpSUlHTXvsnJyerdu7cOHTqk1atXa/To0erfv7/y5Mkjd3d3vfLKKxo6dKjWrFmjQ4cOqW/fvrp+/bp69+4tSRo1apRWrFih48eP65dfftHKlStVsWLFDNdVsmRJWSwWrVy5UpcuXbK5oFyacuXK6bnnnlPfvn21detW/fTTT3r++edVvHhxPffcc5neB2Y5fvy4oqKidOHCBd24cUNRUVGKioqyXvSra9eucnZ2Vu/evfXLL79o0aJFev/99xUeHm5qXf369dOVK1fUpUsX7d69WydOnNDatWvVs2fPu/7IMWjQIK1du1anTp3Svn37tGHDButrd7/leXh4qHfv3ho6dKh++OEHHTx4UD169FCePLZfp55++ml99NFH2r9/v/bs2aOXX37ZZtS6W7du8vHx0XPPPactW7bo1KlT2rhxowYMGKDffvstU9seEBCgsLAw9erVS8uXL7cuY/HixVneNwAAcxC6AQAPbM2aNSpatKjNo169ejZ9unXrpkOHDql48eI250tL0rhx4zRy5EhFRESoYsWKatasmVatWqVSpUpluob27durWbNmaty4sQoXLqwFCxbctW+TJk1Urlw5NWjQQKGhoXr22Wc1ZswY6/QJEyaoffv2euGFF/TEE0/o+PHjWrt2rXXU1tnZWcOHD1fVqlXVoEEDOTk5Wc9Rv1Px4sU1duxYDRs2TH5+furfv3+G/ebMmaPAwEC1atVKQUFBMgxDq1evTneIsSP06dNHNWrU0KxZs3Ts2DHVqFFDNWrU0B9//CFJ8vLy0rp163Tq1CkFBgbq9ddf16hRo+y6R3dWFCtWTNu2bVNKSoqaNm2qKlWqaNCgQfL29k4XhNOkpKSoX79+1vfZY489punTp2d6ee+++67q16+v1q1bKzg4WPXq1VNgYKDNOiZPnix/f3/Vr19fXbt21ZAhQ2yuIZA/f35t3rxZJUqUULt27VSxYkX17t1bN2/etGvke8aMGerQoYNeffVVVahQQX379lViYmKW9w0AwBwW40FP5AIAIAfp0aOHYmNj091HGciqRo0aqXr16jb3GAcAIA0/dQIAAAAAYBJCNwAAAAAAJuHwcgAAAAAATMJINwAAAAAAJiF0AwAAAABgEkI3AAAAAAAmIXQDAAAAAGASQjcAAAAAACYhdAMAAAAAYBJCNwAAAAAAJiF0AwAAAABgEkI3AAAAAAAm+T/J2FKk0Q05YQAAAABJRU5ErkJggg==\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 48 — Strong local XAI case study chart\n","# ============================================================\n","\n","if \"case_table\" in globals() and len(case_table) > 0:\n","    strong_plot_df = case_table.sort_values(\"event_position\").copy()\n","elif \"case_df\" in globals() and len(case_df) > 0:\n","    strong_plot_df = case_df.sort_values(\"event_position\").copy()\n","else:\n","    raise ValueError(\"No case_table or case_df available. Run the strong XAI case study steps first.\")\n","\n","plt.figure(figsize=(10, 4))\n","plt.bar(strong_plot_df[\"event_position\"].astype(str), strong_plot_df[\"importance_drop\"])\n","plt.xlabel(\"Event position in 10-line sequence\")\n","plt.ylabel(\"Importance drop\")\n","plt.title(\"LogMiniLM Event-Level Occlusion Explanation\")\n","plt.tight_layout()\n","save_current_figure(\"08_xai_strong_case_study_occlusion.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"f759395c","metadata":{"id":"f759395c"},"source":["## Step 49 — Top-k faithfulness chart\n","\n","This chart shows whether masking more top-ranked events increases the probability drop."]},{"cell_type":"code","execution_count":52,"id":"f96743a1","metadata":{"id":"f96743a1","executionInfo":{"status":"ok","timestamp":1783281049764,"user_tz":-180,"elapsed":2390,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":582},"outputId":"16243a09-09b8-4e52-c31e-e0b09877edb5"},"outputs":[{"output_type":"display_data","data":{"text/plain":["   k  mean_drop  median_drop  max_drop\n","0  1   0.331605     0.000003   0.99999\n","1  2   0.332825     0.000005   0.99999\n","2  3   0.354907     0.000008   0.99999\n","3  5   0.369261     0.000384   0.99999"],"text/html":["\n","  <div id=\"df-09084e59-39a6-48bd-b420-0f8dcc6729f2\" class=\"colab-df-container\">\n","    <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>k</th>\n","      <th>mean_drop</th>\n","      <th>median_drop</th>\n","      <th>max_drop</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>1</td>\n","      <td>0.331605</td>\n","      <td>0.000003</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2</td>\n","      <td>0.332825</td>\n","      <td>0.000005</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>3</td>\n","      <td>0.354907</td>\n","      <td>0.000008</td>\n","      <td>0.99999</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>5</td>\n","      <td>0.369261</td>\n","      <td>0.000384</td>\n","      <td>0.99999</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-09084e59-39a6-48bd-b420-0f8dcc6729f2')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-09084e59-39a6-48bd-b420-0f8dcc6729f2 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-09084e59-39a6-48bd-b420-0f8dcc6729f2');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_be825f4b-1397-4d30-817d-488fe767a2b7\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('topk_summary_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_be825f4b-1397-4d30-817d-488fe767a2b7 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('topk_summary_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"topk_summary_df","summary":"{\n  \"name\": \"topk_summary_df\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"k\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1,\n        \"min\": 1,\n        \"max\": 5,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          2,\n          5,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"mean_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.018219979636622828,\n        \"min\": 0.3316053837158149,\n        \"max\": 0.3692606504189013,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.3328247273179711,\n          0.3692606504189013,\n          0.3316053837158149\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"median_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.00018945745278090123,\n        \"min\": 3.118139829894062e-06,\n        \"max\": 0.0003842217524834268,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          4.706886329586268e-06,\n          0.0003842217524834268,\n          3.118139829894062e-06\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"max_drop\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 8.690770415780243e-08,\n        \"min\": 0.9999897194425102,\n        \"max\": 0.9999898896849118,\n        \"num_unique_values\": 4,\n        \"samples\": [\n          0.9999897243978921,\n          0.9999898896849118,\n          0.9999897194425102\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/09_xai_topk_faithfulness.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 700x400 with 1 Axes>"],"image/png":"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uiE+Pl6nNomIiIjI+Bl0ndjaiuvEEhERERlGrV8nloiIiIiospjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREaHSSwRERERGR0msURERERkdJjEEhEREZHRYRJLREREREanViSxS5cuhaenJ5RKJQICAnD48OFy6//4449o1qwZlEolWrVqhZ07d6rtDwsLg0wmU/uEhIRU5yUQERERUQ0yeBK7YcMGREREIDIyEsePH4evry+Cg4Nx69YtrfX/+OMPDBw4EMOGDcOJEyfQr18/9OvXD2fOnFGrFxISgpSUFOnzww8/1MTlEBEREVENkAkhhCEDCAgIQPv27bFkyRIAgEqlgoeHB8aOHYspU6Zo1A8NDUV2dja2b98ulT377LPw8/PD8uXLART1xKanp2PLli2ViikzMxO2trbIyMiAjY1NpdogIiIiIv3pmocZtCc2Pz8fx44dQ1BQkFQml8sRFBSEhIQErcckJCSo1QeA4OBgjfrx8fFwcnKCt7c3Ro0ahbt375YZR15eHjIzM9U+RERERFR7GTSJvXPnDgoLC+Hs7KxW7uzsjNTUVK3HpKamVlg/JCQEa9asQVxcHObNm4f9+/ejd+/eKCws1NpmdHQ0bG1tpY+Hh8djXhkRERERVac6hg6gOrz++uvSz61atULr1q3RuHFjxMfHo0ePHhr1p06dioiICGk7MzOTiSwRERFRLWbQnlgHBweYmJggLS1NrTwtLQ0uLi5aj3FxcdGrPgA0atQIDg4OuHjxotb9CoUCNjY2ah8iIiIiqr0MmsSamZmhXbt2iIuLk8pUKhXi4uIQGBio9ZjAwEC1+gCwe/fuMusDwN9//427d+/C1dW1agInIiIiIoMy+BJbERERWLFiBVavXo3ExESMGjUK2dnZGDJkCABg0KBBmDp1qlR//PjxiI2NxcKFC3H+/HnMnDkTR48eRXh4OAAgKysLkydPxsGDB3HlyhXExcXhpZdeQpMmTRAc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ypL2X716FX379oW9vT0sLS3RokUL7Ny5U2sMOTk56N27Nzp16iQNMfj222/h4+MDpVKJZs2a4auvvlI75vDhw2jTpg2USiX8/f1x4sSJ8v66iEgfgoioEgYPHixeeuklsXnzZqFUKsX169eFEEL8/PPPouSvlsjISOHr66t27GeffSYaNmyo1pa1tbUYM2aMOH/+vPjvf/8rAIjg4GAxZ84c8ddff4lZs2YJU1NT6TyXL18WAET9+vXFpk2bxLlz58Tw4cOFtbW1uHPnjhBCiHv37glHR0cxdepUkZiYKI4fPy569uwpnnvuOenc3bp1E1ZWVmLy5Mni/Pnz4vz581qvd9GiRcLGxkb88MMP4vz58+L9998Xpqam4q+//hJCCJGSkiJatGghJk6cKFJSUsT9+/c12khPTxeBgYFixIgRIiUlRaSkpIiHDx+Kv//+W1hYWIjRo0eLxMRE8fPPPwsHBwcRGRmpEef48ePF+fPnxdq1a4WFhYX45ptvyvw7+v3334WNjY1YtWqVSE5OFr/99pvw9PQUM2fOFEIIsX37dmFubq4W67Zt24S5ubnIzMwUQggxe/Zs0axZMxEbGyuSk5NFTEyMUCgUIj4+XgghxL59+wQAERAQIOLj48XZs2dFly5dRMeOHYUQQuTk5IiJEyeKFi1aSNeck5MjfvzxR2FjYyN27twprl69Kg4dOlTutURGRgorKyvx6quvirNnz4pffvlFmJmZieDgYDF27Fhx/vx5sXLlSgFAHDx4UDrus88+E3v37hWXL18WcXFxwtvbW4waNUra36dPH9GzZ09x6tQpkZycLLZt2yb279+vdm337t0T9+7dEx07dhS9evUS2dnZQggh1q5dK1xdXcVPP/0kLl26JH766SdRt25dsWrVKiGEEPfv3xeOjo7ijTfeEGfOnBHbtm0TjRo1EgDEiRMnyrxWItINk1giqpTiJFYIIZ599lkxdOhQIUTlk9iGDRuKwsJCqczb21t06dJF2n748KGwtLQUP/zwgxDiURI7d+5cqU5BQYGoX7++mDdvnhBCiFmzZolevXqpnfv69esCgEhKShJCFCWHbdq0qfB63dzcxJw5c9TK2rdvL0aPHi1t+/r6qiWe2nTr1k2MHz9erWzatGnC29tbqFQqqWzp0qXCyspKuifdunUTPj4+anU++OAD4ePjU+a5evToIT755BO1su+++064uroKIYrul4ODg1izZo20f+DAgSI0NFQIIURubq6wsLAQf/zxh1obw4YNEwMHDhRCPEr09uzZI+3fsWOHACAePHgghND+DCxcuFA888wzIj8/v8z4S4qMjBQWFhZSci2EEMHBwcLT01PjuYmOji6znR9//FHUq1dP2m7VqpWU1JdWfG2JiYmidevWon///iIvL0/a37hxY7Fu3Tq1Y2bNmiUCAwOFEEJ8/fXXol69etJ9EEKIZcuWMYklqiIcTkBEj23evHlYvXo1EhMTK91GixYtIJc/+pXk7OyMVq1aSdsmJiaoV68ebt26pXZcYGCg9HOdOnXg7+8vxfHnn39i3759sLKykj7NmjUDUDR+tVi7du3KjS0zMxM3b95Ep06d1Mo7der0WNdcLDExEYGBgWoT4jp16oSsrCz8/fffUtmzzz6rVicwMBAXLlxAYWGh1nb//PNPfPzxx2rXP2LECKSkpCAnJwd16tTBgAED8P333wMAsrOzsXXrVrz55psAgIsXLyInJwc9e/ZUa2PNmjVq9w8AWrduLf3s6uoKABp/VyW99tprePDgARo1aoQRI0bg559/Vhs+oY2npyesra2lbWdnZzRv3lzjuSl53j179qBHjx5wd3eHtbU13n77bdy9exc5OTkAgHHjxmH27Nno1KkTIiMjcerUKY3z9uzZE02aNMGGDRtgZmYm3avk5GQMGzZM7d7Mnj1bujeJiYlo3bo1lEql1FbJ55WIHk8dQwdARMava9euCA4OxtSpUxEWFqa2Ty6Xa4zbLCgo0GjD1NRUbVsmk2ktU6lUOseVlZWFvn37Yt68eRr7ihMtALC0tNS5TWOSlZWFqKgovPLKKxr7ihOrN998E926dcOtW7ewe/dumJubIyQkRDoeAHbs2AF3d3e14xUKhdp2yb+r4kS7vL8rDw8PJCUlYc+ePdi9ezdGjx6NTz/9FPv379f4e9d2juLzlPeMXLlyBS+88AJGjRqFOXPmoG7duvjf//6HYcOGIT8/HxYWFhg+fDiCg4OxY8cO/Pbbb4iOjsbChQsxduxYqc0+ffrgp59+wrlz56R/WBXfmxUrViAgIEAtBhMTkzKvm4iqDpNYIqoSc+fOhZ+fH7y9vdXKHR0dkZqaCiGElNxU5RqZBw8eRNeuXQEADx8+xLFjxxAeHg4AaNu2LX766Sd4enqiTp3K/7qzsbGBm5sbDhw4gG7duknlBw4cQIcOHfRqy8zMTKPn1MfHBz/99JPaPTpw4ACsra1Rv359qd6hQ4fUjjt48CCaNm1aZtLUtm1bJCUloUmTJmXG07FjR3h4eGDDhg349ddf8dprr0mJYfPmzaFQKHDt2jW169aXtmsGAHNzc/Tt2xd9+/bFmDFj0KxZM5w+fRpt27at9LlKOnbsGFQqFRYuXCj11m7cuFGjnoeHB9599128++67mDp1KlasWKGWxM6dOxdWVlbo0aMH4uPj0bx5czg7O8PNzQ2XLl2Seq5L8/HxwXfffYfc3FzpHw0HDx6skmsjIiaxRFRFWrVqhTfffBNffPGFWnn37t1x+/ZtzJ8/H6+++ipiY2Px66+/wsbGpkrOu3TpUjRt2hQ+Pj747LPPcO/ePQwdOhQAMGbMGKxYsQIDBw7E+++/j7p16+LixYtYv349vv32W716zCZPnozIyEg0btwYfn5+iImJwcmTJ6Wv4nXl6emJQ4cO4cqVK7CyskLdunUxevRoLF68GGPHjkV4eDiSkpIQGRmJiIgIta/Kr127hoiICLzzzjs4fvw4vvzySyxcuLDMc82YMQMvvPACGjRogFdffRVyuRx//vknzpw5g9mzZ0v13njjDSxfvhx//fUX9u3bJ5VbW1tj0qRJeO+996BSqdC5c2dkZGTgwIEDsLGxweDBg3W+5suXL+PkyZOoX78+rK2t8cMPP6CwsBABAQGwsLDA2rVrYW5ujoYNG+p1P8vTpEkTFBQU4Msvv0Tfvn1x4MABLF++XK3OhAkT0Lt3bzzzzDO4d+8e9u3bBx8fH422FixYgMLCQjz//POIj49Hs2bNEBUVhXHjxsHW1hYhISHIy8vD0aNHce/ePUREROCNN97Ahx9+iBEjRmDq1Km4cuUKFixYUGXXR/TUM/CYXCIyUiUndhW7fPmyMDMzE6V/tSxbtkx4eHgIS0tLMWjQIDFnzhyNiV2l29I2Aaphw4bis88+k84FQKxbt0506NBBmJmZiebNm4u9e/eqHfPXX3+Jl19+WdjZ2Qlzc3PRrFkzMWHCBGmClLbzaFNYWChmzpwp3N3dhampqfD19RW//vqrWh1dJnYlJSWJZ599VpibmwsA4vLly0IIIeLj40X79u2FmZmZcHFxER988IEoKChQux+jR48W7777rrCxsRH29vZi2rRpahO9tImNjRUdO3YU5ubmwsbGRnTo0EFjFYBz584JAKJhw4Ya7alUKrF48WLh7e0tTE1NhaOjowgODtY6g7/YiRMn1K4tNzdX9O/fX9jZ2QkAIiYmRvz8888iICBA2NjYCEtLS/Hss8+qTQ4rTdvkMF2em0WLFglXV1dhbm4ugoODxZo1a9TiDQ8PF40bNxYKhUI4OjqKt99+W1rdQtu1jR07Vri6ukoTA7///nvh5+cnzMzMhL29vejatavYvHmzVD8hIUH4+voKMzMz4efnJ3766SdO7CKqIjIhKlhkkIiIDK579+7w8/PD4sWLDR0KEVGtwNUJiIiIiMjoMIklIiIiIqPD4QREREREZHTYE0tERERERodJLBEREREZHSaxRERERGR0mMQSERERkdFhEktERERERodJLBEREREZHSaxRERERGR0mMQSERERkdFhEktERERERuf/AXw8AEwZjYnTAAAAAElFTkSuQmCC\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 49 — Top-k faithfulness chart\n","# ============================================================\n","\n","if \"topk_faithfulness_df\" not in globals():\n","    TOPK_FAITHFULNESS_PATH = CACHE_DIR / \"logminilm_xai_topk_faithfulness.csv\"\n","    topk_faithfulness_df = pd.read_csv(TOPK_FAITHFULNESS_PATH)\n","\n","topk_summary_df = (\n","    topk_faithfulness_df\n","    .groupby(\"k\")\n","    .agg(\n","        mean_drop=(\"topk_probability_drop\", \"mean\"),\n","        median_drop=(\"topk_probability_drop\", \"median\"),\n","        max_drop=(\"topk_probability_drop\", \"max\")\n","    )\n","    .reset_index()\n",")\n","\n","display(topk_summary_df)\n","\n","plt.figure(figsize=(7, 4))\n","plt.plot(topk_summary_df[\"k\"], topk_summary_df[\"mean_drop\"], marker=\"o\", label=\"Mean drop\")\n","plt.plot(topk_summary_df[\"k\"], topk_summary_df[\"median_drop\"], marker=\"o\", label=\"Median drop\")\n","plt.xlabel(\"Number of top events masked\")\n","plt.ylabel(\"Probability drop\")\n","plt.title(\"Top-k Occlusion Faithfulness\")\n","plt.legend()\n","plt.tight_layout()\n","save_current_figure(\"09_xai_topk_faithfulness.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"e7d6274b","metadata":{"id":"e7d6274b"},"source":["## Step 50 — SHAP versus occlusion agreement chart\n","\n","This chart summarizes how often SHAP and occlusion identify the same top event."]},{"cell_type":"code","execution_count":53,"id":"d6af317f","metadata":{"id":"d6af317f","executionInfo":{"status":"ok","timestamp":1783281051218,"user_tz":-180,"elapsed":1452,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":537},"outputId":"4fd8add9-c1a5-4207-c291-7c38e23695bf"},"outputs":[{"output_type":"display_data","data":{"text/plain":["             agreement  count\n","0  Different top event      2\n","1       Same top event      9"],"text/html":["\n","  <div id=\"df-8ff863bf-c85a-4d6a-b8e2-23f561fae152\" class=\"colab-df-container\">\n","    <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>agreement</th>\n","      <th>count</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>Different top event</td>\n","      <td>2</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>Same top event</td>\n","      <td>9</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8ff863bf-c85a-4d6a-b8e2-23f561fae152')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-8ff863bf-c85a-4d6a-b8e2-23f561fae152 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-8ff863bf-c85a-4d6a-b8e2-23f561fae152');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_0c7cdc9e-da36-4764-8cb9-ab2be1f99988\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('agreement_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_0c7cdc9e-da36-4764-8cb9-ab2be1f99988 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('agreement_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"agreement_df","summary":"{\n  \"name\": \"agreement_df\",\n  \"rows\": 2,\n  \"fields\": [\n    {\n      \"column\": \"agreement\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"Same top event\",\n          \"Different top event\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"count\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 4,\n        \"min\": 2,\n        \"max\": 9,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          9,\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Top-event agreement rate: 0.8181818181818182\n","Saved figure to: /content/drive/MyDrive/logminilm_cache/figures/10_shap_occlusion_top_event_agreement.png\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 600x400 with 1 Axes>"],"image/png":"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iIhIIV7jRERERKQQgxMRERGRQu/1NU5paWm4ffs2NBoNv4SQiIiIskREkJiYCDc3N73v68vIex2cbt++bfAN3ERERERZcfPmTRQqVOi1fd7r4JT+5aY3b96Eo6NjDldDRERE76OEhAR4eHjofWl6Zt7r4JR+es7R0ZHBiYiIiN6Kkst+eHE4ERERkUIMTkREREQKMTgRERERKcTgRERERKQQgxMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESk0Hv9Jb9ERObGa+TmnC6B6IN0fUqznC4BAI84ERERESnG4ERERESkEIMTERERkUIMTkREREQKMTgRERERKcTgRERERKQQgxMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESkEIMTERERkUIMTkREREQKMTgRERERKcTgRERERKQQgxMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESkEIMTERERkUI5Gpy0Wi3GjBkDb29v2NraomjRopg4cSJEJCfLIiIiIspQrpxc+dSpUxEWFoalS5ciICAAx48fR/fu3eHk5IQBAwbkZGlEREREBnI0OP3xxx9o1aoVmjVrBgDw8vLCihUrcPTo0Zwsi4iIiChDOXqqrlq1ati1axcuX74MADhz5gwOHjyIJk2aZNg/JSUFCQkJeg8iIiKidyVHjziNHDkSCQkJKFGiBCwtLaHVajF58mR07tw5w/7BwcGYMGHCO66SiIiI6IUcPeK0evVqREREYPny5Th58iSWLl2KH374AUuXLs2w/6hRoxAfH6973Lx58x1XTERERB+zHD3iNHz4cIwcORIdO3YEAJQqVQo3btxAcHAwunbtatBfrVZDrVa/6zKJiIiIAOTwEafk5GRYWOiXYGlpibS0tByqiIiIiChzOXrEqUWLFpg8eTIKFy6MgIAAnDp1Cj/++CN69OiRk2URERERZShHg9OcOXMwZswYfPXVV4iLi4Obmxt69+6NsWPH5mRZRERERBnK0eCk0WgQEhKCkJCQnCyDiIiISBF+Vx0RERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESkEIMTERERkUIMTkREREQKMTgRERERKcTgRERERKQQgxMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESkEIMTERERkUIMTkREREQKMTgRERERKWSS4PTo0SNTLIaIiIjIrBkdnKZOnYpVq1bpnrdv3x558+aFu7s7zpw5Y9LiiIiIiMyJ0cFp3rx58PDwAADs2LEDO3bswNatW9GkSRMMHz7c5AUSERERmYtcxs5w584dXXDatGkT2rdvj4YNG8LLywuVK1c2eYFERERE5sLoI07Ozs64efMmACAqKgr169cHAIgItFqtaasjIiIiMiNGH3H69NNP0alTJxQrVgz3799HkyZNAACnTp2Cj4+PyQskIiIiMhdGB6eZM2fCy8sLN2/exLRp0+Dg4AAAiI2NxVdffWXyAomIiIjMhdHBycrKCsOGDTNoHzx4sEkKIiIiIjJXWRrH6ZdffkGNGjXg5uaGGzduAABCQkLw+++/m7Q4IiIiInNidHAKCwvDkCFD0KRJEzx69Eh3QXju3LkREhJi6vqIiIiIzIbRwWnOnDlYuHAhRo8eDUtLS117hQoVcO7cOZMWR0RERGROjA5OMTExKFu2rEG7Wq3G48ePTVIUERERkTkyOjh5e3vj9OnTBu1RUVHw8/MzRU1EREREZsnou+qGDBmCvn374unTpxARHD16FCtWrEBwcDB+/vnn7KiRiIiIyCwYHZx69uwJW1tbfPvtt0hOTkanTp3g5uaGWbNmoWPHjtlRIxEREZFZMDo4AUDnzp3RuXNnJCcnIykpCa6urqaui4iIiMjsGB2cYmJi8Pz5cxQrVgx2dnaws7MDAFy5cgVWVlbw8vIydY1EREREZsHoi8O7deuGP/74w6D9zz//RLdu3UxRExEREZFZMjo4nTp1CtWrVzdor1KlSoZ32xERERF9KIwOTiqVComJiQbt8fHxulHEiYiIiD5ERgenWrVqITg4WC8kabVaBAcHo0aNGiYtjoiIiMicGH1x+NSpU1GrVi34+vqiZs2aAIADBw4gISEBu3fvNnmBRERERObC6CNO/v7+OHv2LNq3b4+4uDgkJiaiS5cuuHjxIkqWLJkdNRIRERGZhSyN4+Tm5obvv//e1LUQERERmbUsBadHjx7h6NGjiIuLQ1pamt60Ll26mKQwIiIiInNjdHDauHEjOnfujKSkJDg6OkKlUummqVQqBiciIiL6YBl9jdPQoUPRo0cPJCUl4dGjR3j48KHu8eDBg+yokYiIiMgsGB2cbt26hQEDBui+aoWIiIjoY2F0cGrUqBGOHz+eHbUQERERmTWjr3Fq1qwZhg8fjvPnz6NUqVKwsrLSm96yZUuTFUdERERkTowOTr169QIAfPfddwbTVCqV0V+7cuvWLYwYMQJbt25FcnIyfHx8EB4ejgoVKhhbGhEREVG2Mjo4vTr8wNt4+PAhqlevjrp162Lr1q1wcXHBlStX4OzsbLJ1EBEREZlKlsZxSvf06VPY2Nhkef6pU6fCw8MD4eHhujZvb++3KYmIiIgo2xh9cbhWq8XEiRPh7u4OBwcHXLt2DQAwZswYLFq0yKhlbdiwARUqVEC7du3g6uqKsmXLYuHChZn2T0lJQUJCgt6DiIiI6F0xOjhNnjwZS5YswbRp02Btba1rL1myJH7++WejlnXt2jWEhYWhWLFi2LZtG/r06YMBAwZg6dKlGfYPDg6Gk5OT7uHh4WFs+URERERZphIRMWYGHx8fzJ8/H/Xq1YNGo8GZM2dQpEgRXLx4EVWrVsXDhw8VL8va2hoVKlTAH3/8oWsbMGAAjh07hsOHDxv0T0lJQUpKiu55QkICPDw8EB8fD0dHR2NeBhFRtvAauTmnSyD6IF2f0izblp2QkAAnJydFeSJLA2D6+PgYtKelpeHZs2dGLatgwYLw9/fXa/Pz88M///yTYX+1Wg1HR0e9BxEREdG7YnRw8vf3x4EDBwza165di7Jlyxq1rOrVq+PSpUt6bZcvX4anp6exZRERERFlO6Pvqhs7diy6du2KW7duIS0tDZGRkbh06RKWLVuGTZs2GbWswYMHo1q1avj+++/Rvn17HD16FAsWLMCCBQuMLYuIiIgo2xl9xKlVq1bYuHEjdu7cCXt7e4wdOxYXLlzAxo0b0aBBA6OWVbFiRaxbtw4rVqxAyZIlMXHiRISEhKBz587GlkVERESU7Yy+ONycGHMxFxHRu8CLw4myx3t7cTgRERHRx8roa5wsLCygUqkynW7sd9URERERvS+MDk7r1q3Te/7s2TOcOnUKS5cuxYQJE0xWGBEREZG5MTo4tWrVyqCtbdu2CAgIwKpVqxAUFGSSwoiIiIjMjcmucapSpQp27dplqsURERERmR2TBKcnT55g9uzZcHd3N8XiiIiIiMyS0afqnJ2d9S4OFxEkJibCzs4Ov/76q0mLIyIiIjInRgenmTNn6gUnCwsLuLi4oHLlynB2djZpcURERETmxOjg1K1bt2wog4iIiMj8GR2czp49q7hvYGCgsYsnIiIiMltGB6cyZcq8dgBM4MV1TyqVioNhEhER0QfF6LvqIiMj4e3tjdDQUJw6dQqnTp1CaGgoihYtit9++w3Xrl1DTEwMrl27lh31EhEREeUYo484ff/995g9ezaaNm2qawsMDISHhwfGjBmDEydOmLRAIiIiInNh9BGnc+fOwdvb26Dd29sb58+fN0lRRERERObI6ODk5+eH4OBgpKam6tpSU1MRHBwMPz8/kxZHREREZE6MPlU3b948tGjRAoUKFdLdNXf27FmoVCps3LjR5AUSERERmQujg1OlSpVw7do1RERE4OLFiwCADh06oFOnTrC3tzd5gURERETmwujgBAD29vb44osvTF0LERERkVnL0pf8/vLLL6hRowbc3Nxw48YNAC++iuX33383aXFERERE5sTo4BQWFoYhQ4agSZMmePjwoW6QS2dnZ4SEhJi6PiIiIiKzYXRwmjNnDhYuXIjRo0cjV67/P9NXoUIFnDt3zqTFEREREZkTo4NTTEwMypYta9CuVqvx+PFjkxRFREREZI6MDk7e3t44ffq0QXtUVBTHcSIiIqIPmtF31Q0ZMgR9+/bF06dPISI4evQoVqxYgeDgYPz888/ZUSMRERGRWTA6OPXs2RO2trb49ttvkZycjE6dOsHNzQ2zZs1Cx44ds6NGIiIiIrOQpXGcOnfujM6dOyM5ORlJSUlwdXU1dV1EREREZsfoa5yePHmC5ORkAICdnR2ePHmCkJAQbN++3eTFEREREZkTo4NTq1atsGzZMgDAo0ePUKlSJcyYMQOtWrVCWFiYyQskIiIiMhdGB6eTJ0+iZs2aAIC1a9eiQIECuHHjBpYtW4bZs2ebvEAiIiIic2F0cEpOToZGowEAbN++HZ9++iksLCxQpUoV3devEBEREX2IjA5OPj4+WL9+PW7evIlt27ahYcOGAIC4uDg4OjqavEAiIiIic2F0cBo7diyGDRsGLy8vVK5cGVWrVgXw4uhTRiOKExEREX0ojB6OoG3btqhRowZi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oKxSiZJ774iIiIgo50cOJyIiInpfMDgRERERKcTg9JFSqVRYv3697vnFixdRpUoV2NjYoEyZMpm2ERERfcwYnD4g3bp1g0qlgkqlgpWVFfLnz48GDRpg8eLFSEtL0+sbGxuLJk2a6J6PGzcO9vb2uHTpEnbt2pVpW07y8vJCSEjIG/u9Ggo/BnXq1MGgQYNyugz6QN27dw99+vRB4cKFoVarUaBAATRq1AiHDh3K6dIyxH0AZSezuKuOTKdx48YIDw+HVqvF3bt3ERUVhYEDB2Lt2rXYsGEDcuV68Za/OjL71atX0axZM3h6er62zVipqamwtrbO8vxElPPatGmD1NRULF26FEWKFMHdu3exa9cu3L9/P6dLI3r3hD4YXbt2lVatWhm079q1SwDIwoULdW0AZN26dbqfX36MGzcuwzYRkX/++UfatWsnTk5O4uzsLC1btpSYmBiDGiZNmiQFCxYULy8vo+abPn26FChQQPLkySNfffWVpKamiohI7dq1DWrKiKenp14fT09P3bTQ0FApUqSIWFlZSfHixWXZsmV68wKQ0NBQady4sdjY2Ii3t7esWbPmtdtcq9XK999/L15eXmJjYyOBgYG6ebRarbi7u0toaKjePCdPnhSVSiXXr18XEZGHDx9KUFCQ5MuXTzQajdStW1dOnz6t6z9u3DgpXbq0LFu2TDw9PcXR0VE6dOggCQkJum336rZ5edsSvY2HDx8KANm7d+9r+82YMUNKliwpdnZ2UqhQIenTp48kJibqpoeHh4uTk5Ns3LhRihcvLra2ttKmTRt5/PixLFmyRDw9PSV37tzSv39/ef78uW6+p0+fytChQ8XNzU3s7OykUqVKsmfPnkzr4D6A+4DsxuD0AcksOImIlC5dWpo0aaJ7/nJwio2NlYCAABk6dKjExsZKYmJihm2pqani5+cnPXr0kLNnz8r58+elU6dO4uvrKykpKboaHBwc5L///a/89ddf8tdffymez9HRUb788ku5cOGCbNy4Uezs7GTBggUiInL//n0pVKiQfPfddxIbGyuxsbEZvs64uDgBIOHh4RIbGytxcXEiIhIZGSlWVlby008/yaVLl2TGjBliaWkpu3fv1tsmefPmlYULF8qlS5fk22+/FUtLSzl//nym23zSpElSokQJiYqKkqtXr0p4eLio1WrdH5lhw4ZJjRo19OYZOnSoXlv9+vWlRYsWcuzYMbl8+bIMHTpU8ubNK/fv3xeRFztNBwcH+fTTT+XcuXOyf/9+KVCggHzzzTciIvLo0SOpWrWq9OrVS7dtXv7DQ/Q2nj17Jg4ODjJo0CB5+vRppv1mzpwpu3fvlpiYGNm1a5f4+vpKnz59dNPDw8PFyspKGjRoICdPnpR9+/ZJ3rx5pWHDhtK+fXv5+++/ZePGjWJtbS0rV67UzdezZ0+pVq2a7N+/X6Kjo2X69OmiVqvl8uXLGdbBfQD3AdmNwekD8rrg1KFDB/Hz89M9fzk4ibwIVulHlTJr++WXX8TX11fS0tJ0bSkpKWJrayvbtm3T1ZA/f35dIDJmPk9PT71f9nbt2kmHDh10zz09PWXmzJlv3A6vvjYRkWrVqkmvXr302tq1aydNmzbVm+/LL7/U61O5cmW9nf/Lnj59KnZ2dvLHH3/otQcFBclnn30mIiKnTp0SlUolN27cEJH//w80LCxMREQOHDggjo6OBn+QihYtKvPnzxeRFztNOzs73X+XIiLDhw+XypUr657Xrl1bBg4cmGGdRG9r7dq14uzsLDY2NlKtWjUZNWqUnDlz5rXzrFmzRvLmzat7Hh4eLgAkOjpa19a7d2+xs7PTOzLVqFEj6d27t4iI3LhxQywtLeXWrVt6y65Xr56MGjUq03VzH0DZiReHfyREBCqV6q2WcebMGURHR0Oj0cDBwQEODg7IkycPnj59iqtXr+r6lSpVSu+6JqXzBQQEwNLSUve8YMGCiIuLe6ua0124cAHVq1fXa6tevTouXLig11a1alWD56/2SRcdHY3k5GQ0aNBA97ocHBywbNky3esqU6YM/Pz8sHz5cgDAvn37EBcXh3bt2gF4sW2SkpKQN29evWXExMTobRsvLy9oNBrdc1NuG6I3adOmDW7fvo0NGzagcePG2Lt3L8qVK4clS5bo+uzcuRP16tWDu7s7NBoN/vvf/+L+/ftITk7W9bGzs0PRokV1z/Pnzw8vLy84ODjotaV/ts+dOwetVovixYvr/X7s27dP7/dDCe4DyFR4cfhH4sKFC/D29n6rZSQlJaF8+fKIiIgwmObi4qL72d7ePkvzWVlZ6U1TqVQGdwOak6SkJADA5s2b4e7urjft5a9x6Ny5M5YvX46RI0di+fLlaNy4MfLmzatbRsGCBbF3716D5efOnVv38/u2bejDY2NjgwYNGqBBgwYYM2YMevbsiXHjxqFbt264fv06mjdvjj59+mDy5MnIkycPDh48iKCgIKSmpsLOzg5Axp/j1322k5KSYGlpiRMnTuj9UwVAL2zlFO4DPk4MTh+B3bt349y5cxg8ePBbLadcuXJYtWoVXF1d4ejomO3zvcra2hparfaN/aysrAz6+fn54dChQ+jatauu7dChQ/D399frd+TIEXTp0kXvedmyZTNcj7+/P9RqNf755x/Url0703o6deqEb7/9FidOnMDatWsxb9483bRy5crhzp07yJUrF7y8vN742jKjdNsQmYq/v7/ulv8TJ04gLS0NM2bMgIXFixMZq1evfut1lC1bFlqtFnFxcahZs6bi+bgPoOzE4PSBSUlJwZ07d/SGIwgODkbz5s31dgZZ0blzZ0yfPh2tWrXCd999h0KFCuHGjRuIjIzE119/jUKFCpl0vld5eXlh//796NixI9RqNfLly5dpv127dqF69epQq9VwdnbG8OHD0b59e5QtWxb169fHxo0bERkZiZ07d+rNu2bNGlSoUAE1atRAREQEjh49ikWLFmW4Ho1Gg2HDhmHw4MFIS0tDjRo1EB8fj0OHDsHR0VG3g/by8kK1atUQFBQErVaLli1b6pZRv359VK1aFa1bt8a0adNQvHhx3L59G5s3b8Ynn3yCChUqKN42f/75J65fv647FZr+B4zobdy/fx/t2rVDjx49EBgYCI1Gg+PHj2PatGlo1aoVAMDHxwfPnj3DnDlz0KJFCxw6dEgvHGRV8eLF0blzZ3Tp0gUzZsxA2bJlce/ePezatQuBgYFo1qxZhvNxH8B9QLbK6YusyHReviU1V65c4uLiIvXr15fFixeLVqvV64ssXBwu8uIOvC5duki+fPlErVZLkSJFpFevXhIfH6+rIaML1LMy38CBA6V27dq654cPH5bAwEBRq9WZDkcgIrJhwwbx8fGRXLlyGX0r8k8//SQNGjQQtVotXl5esmrVqkzXIyKSlpYmISEh4uvrK1ZWVuLi4iKNGjWSffv26fULDQ0VANKlSxeDZSQkJEj//v3Fzc1NrKysxMPDQzp37iz//POPiPz/rcgvmzlzpt5ru3TpklSpUkVsbW15KzKZ1NOnT2XkyJFSrlw5cXJyEjs7O/H19ZVvv/1WkpOTdf1+/PFHKViwoNja2kqjRo1k2bJlAkAePnwoIv8/HMHLMvpsv7ovSE1NlbFjx4qXl5dYWVlJwYIF5ZNPPpGzZ89mWjP3AdwHZCeViEgOZTYis6JSqbBu3Tq0bt06p0shohzAfQApweN4RERERAoxOBEREREpxFN1RERERArxiBMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERO+ZJUuW6H0BLBG9OwxORB+5w4cPw9LSMtPv/foYXb9+HSqVCqdPn87pUhQZP348ypQpk9NlEH0UGJyIPnKLFi1C//79sX//fty+ffutl6fVapGWlmaCyt4/IoLnz5/ndBlElI0YnIg+YklJSVi1ahX69OmDZs2aYcmSJQZ9NmzYgGLFisHGxgZ169bF0qVLoVKp8OjRIwD/f9pow4YN8Pf3h1qtxj///IOUlBQMGzYM7u7usLe3R+XKlbF37169ZR88eBA1a9aEra0tPDw8MGDAADx+/Fg33cvLC5MmTUKXLl3g4OAAT09PbNiwAffu3UOrVq3g4OCAwMBAHD9+3Ojlfv/99+jRowc0Gg0KFy6MBQsW6KZ7e3sDAMqWLQuVSoU6depkuP327t0LlUqFrVu3onz58lCr1Th48CDS0tIQHBwMb29v2NraonTp0li7dq1uvocPH6Jz585wcXGBra0tihUrhvDwcL1lpm9fADh9+jRUKhWuX79uUMOSJUswYcIEnDlzBiqVCiqVKsP3kYhMJEe/YpiIctSiRYukQoUKIiKyceNGKVq0qKSlpemmX7t2TaysrGTYsGFy8eJFWbFihbi7uxt8672VlZVUq1ZNDh06JBcvXpTHjx9Lz549pVq1arJ//36Jjo6W6dOni1qtlsuXL4uISHR0tNjb28vMmTPl8uXLcujQISlbtqx069ZNt35PT0/JkyePzJs3Ty5fvix9+vQRR0dHady4saxevVouXbokrVu3Fj8/P13dxiz3p59+kitXrkhwcLBYWFjIxYsXRUTk6NGjAkB27twpsbGxcv/+/Qy33549ewSABAYGyvbt2yU6Olru378vkyZNkhIlSkhUVJRcvXpVwsPDRa1Wy969e0VEpG/fvlKmTBk5duyYxMTEyI4dO2TDhg16y0zfviIip06d0vvG+/DwcHFychIRkeTkZBk6dKgEBARIbGysxMbGSnJyclY+DkSkAIMT0UesWrVqEhISIiIiz549k3z58smePXt000eMGCElS5bUm2f06NEGwQmAnD59Wtfnxo0bYmlpKbdu3dKbt169ejJq1CgREQkKCpIvvvhCb/qBAwfEwsJCnjx5IiIvAs7nn3+umx4bGysAZMyYMbq2w4cPCwCJjY3N8nLT0tLE1dVVwsLCREQkJiZGAMipU6des/X+P+SsX79e1/b06VOxs7OTP/74Q69vUFCQfPbZZyIi0qJFC+nevftrl6k0OImIjBs3TkqXLv3aWonINHLlyGEuIspxly5dwtGjR7Fu3ToAQK5cudChQwcsWrRId2rq0qVLqFixot58lSpVMliWtbU1AgMDdc/PnTsHrVaL4sWL6/VLSUlB3rx5AQBnzpzB2bNnERERoZsuIkhLS0NMTAz8/PwAQG+5+fPnBwCUKlXKoC0uLg4FChTI0nJVKhUKFCiAuLi4126zzFSoUEH3c3R0NJKTk9GgQQO9PqmpqShbtiwAoE+fPmjTpg1OnjyJhg0bonXr1qhWrVqW1k1E7xaDE9FHatGiRXj+/Dnc3Nx0bSICtVqNuXPnwsnJSfGybG1toVKpdM+TkpJgaWmJEydOwNLSUq+vg4ODrk/v3r0xYMAAg+UVLlxY97OVlZXu5/R1ZNSWfkF6VpabvpysXtRub2+v+zkpKQkAsHnzZri7u+v1U6vVAIAmTZrgxo0b2LJlC3bs2IF69eqhb9+++OGHH2Bh8eLSU3np+9efPXuWpbqIyPQYnIg+Qs+fP8eyZcswY8YMNGzYUG9a69atsWLFCnz55Zfw9fXFli1b9KYfO3bsjcsvW7YstFot4uLiULNmzQz7lCtXDufPn4ePj0/WX0g2Ldfa2hrAizsEjfXyBfK1a9fOtJ+Liwu6du2Krl27ombNmhg+fDh++OEHuLi4AABiY2Ph7OwMAG8cFsHa2jpLtRKR8XhXHdFHaNOmTXj48CGCgoJQsmRJvUebNm2waNEiAEDv3r1x8eJFjBgxApcvX8bq1at1d2y9fITpVcWLF0fnzp3RpUsXREZGIiYmBkePHkVwcDA2b94MABgxYgT++OMP9OvXD6dPn8aVK1fw+++/o1+/fm/12kyxXFdXV9ja2iIqKgp3795FfHy84nk1Gg2GDRuGwYMHY+nSpbh69SpOnjyJOXPmYOnSpQCAsWPH4vfff0d0dDT+/vtvbNq0SXcK0cfHBx4eHhg/fjyuXLmCzZs3Y8aMGa9dp5eXF2JiYnD69Gn8+++/SElJUVwvERmHwYnoI7Ro0SLUr18/w9Nxbdq0wfHjx3H27Fl4e3tj7dq1iIyMRGBgIMLCwjB69GgA/3/aKTPh4eHo0qULhg4dCl9fX7Ru3RrHjh3TnS4LDAzEvn37cPnyZdSsWRNly5bF2LFj9U4dZoUplpsrVy7Mnj0b8+fPh5ubG1q1amVUDRMnTsSYMWMQHBwMPz8/NG7cGJs3b9YNc2BtbY1Ro0YhMDAQtWrVgqWlJVauXAngxSnEFStW4OLFiwgMDMTUqVMxadKk166vTZs2aNy4MerWrQsXFxesWLHCqHqJSDmVvHwinYjoDSZPnox58+bh5s2bOV0KEdE7x2uciOi1QkNDUbFiReTNmxeHDh3C9OnT3/p0GhHR+4rBiYhe68qVK5g0aRIePHiAwoULY+jQoRg1alROl0VElCN4qo6IiIhIIV4cTkRERKQQgxMRERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESk0P8BhIqiCWjHZHYAAAAASUVORK5CYII=\n"},"metadata":{}}],"source":["# ============================================================\n","# Step 50 — SHAP vs Occlusion agreement chart\n","# ============================================================\n","\n","if \"shap_occ_compare_df\" not in globals():\n","    SHAP_COMPARE_PATH = CACHE_DIR / \"logminilm_shap_occlusion_comparison.csv\"\n","    shap_occ_compare_df = pd.read_csv(SHAP_COMPARE_PATH)\n","\n","agreement_counts = shap_occ_compare_df[\"same_top_event\"].value_counts().sort_index()\n","\n","agreement_df = pd.DataFrame({\n","    \"agreement\": [\"Different top event\", \"Same top event\"],\n","    \"count\": [\n","        int(agreement_counts.get(0, 0)),\n","        int(agreement_counts.get(1, 0))\n","    ]\n","})\n","\n","agreement_rate = shap_occ_compare_df[\"same_top_event\"].mean()\n","\n","display(agreement_df)\n","print(\"Top-event agreement rate:\", agreement_rate)\n","\n","plt.figure(figsize=(6, 4))\n","plt.bar(agreement_df[\"agreement\"], agreement_df[\"count\"])\n","plt.xlabel(\"Agreement result\")\n","plt.ylabel(\"Number of sequences\")\n","plt.title(f\"SHAP vs Occlusion Top-Event Agreement ({agreement_rate:.2%})\")\n","plt.tight_layout()\n","save_current_figure(\"10_shap_occlusion_top_event_agreement.png\")\n","plt.show()\n"]},{"cell_type":"markdown","id":"6e666e76","metadata":{"id":"6e666e76"},"source":["## Step 51 — Figure manifest\n","\n","This step lists all saved chart files so they can be copied into Chapter 4."]},{"cell_type":"code","execution_count":54,"id":"4ffc2960","metadata":{"id":"4ffc2960","executionInfo":{"status":"ok","timestamp":1783281051876,"user_tz":-180,"elapsed":656,"user":{"displayName":"Hesham Bashatah","userId":"16181614520800761792"}},"colab":{"base_uri":"https://localhost:8080/","height":665},"outputId":"13727732-4115-4c34-ec04-80044f079ff6"},"outputs":[{"output_type":"stream","name":"stdout","text":["Saved figure manifest to: /content/drive/MyDrive/logminilm_cache/figures/figure_manifest.csv\n"]},{"output_type":"display_data","data":{"text/plain":["                                          figure_file  \\\n","0   /content/drive/MyDrive/logminilm_cache/figures...   \n","1   /content/drive/MyDrive/logminilm_cache/figures...   \n","2   /content/drive/MyDrive/logminilm_cache/figures...   \n","3   /content/drive/MyDrive/logminilm_cache/figures...   \n","4   /content/drive/MyDrive/logminilm_cache/figures...   \n","5   /content/drive/MyDrive/logminilm_cache/figures...   \n","6   /content/drive/MyDrive/logminilm_cache/figures...   \n","7   /content/drive/MyDrive/logminilm_cache/figures...   \n","8   /content/drive/MyDrive/logminilm_cache/figures...   \n","9   /content/drive/MyDrive/logminilm_cache/figures...   \n","10  /content/drive/MyDrive/logminilm_cache/figures...   \n","11  /content/drive/MyDrive/logminilm_cache/figures...   \n","12  /content/drive/MyDrive/logminilm_cache/figures...   \n","\n","                                           filename  \n","0          01_bgl_line_level_class_distribution.png  \n","1      02_bgl_sequence_level_class_distribution.png  \n","2                  03_logminilm_threshold_vs_f1.png  \n","3            04_logminilm_threshold_sensitivity.png  \n","4                 05_logminilm_confusion_matrix.png  \n","5         06_logminilm_probability_distribution.png  \n","6      07_xai_mean_importance_by_event_position.png  \n","7            08_xai_strong_case_study_occlusion.png  \n","8                      09_xai_topk_faithfulness.png  \n","9   10_logminilm_training_validation_loss_curve.png  \n","10        10_shap_occlusion_top_event_agreement.png  \n","11             11_logminilm_validation_f1_curve.png  \n","12        12_logminilm_validation_metrics_curve.png  "],"text/html":["\n","  <div id=\"df-7d860ee6-cf43-4c9c-a841-d1bcee9e7c23\" class=\"colab-df-container\">\n","    <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>figure_file</th>\n","      <th>filename</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>01_bgl_line_level_class_distribution.png</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>02_bgl_sequence_level_class_distribution.png</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>03_logminilm_threshold_vs_f1.png</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>04_logminilm_threshold_sensitivity.png</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>05_logminilm_confusion_matrix.png</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>06_logminilm_probability_distribution.png</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>07_xai_mean_importance_by_event_position.png</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>08_xai_strong_case_study_occlusion.png</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>09_xai_topk_faithfulness.png</td>\n","    </tr>\n","    <tr>\n","      <th>9</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>10_logminilm_training_validation_loss_curve.png</td>\n","    </tr>\n","    <tr>\n","      <th>10</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>10_shap_occlusion_top_event_agreement.png</td>\n","    </tr>\n","    <tr>\n","      <th>11</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>11_logminilm_validation_f1_curve.png</td>\n","    </tr>\n","    <tr>\n","      <th>12</th>\n","      <td>/content/drive/MyDrive/logminilm_cache/figures...</td>\n","      <td>12_logminilm_validation_metrics_curve.png</td>\n","    </tr>\n","  </tbody>\n","</table>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-7d860ee6-cf43-4c9c-a841-d1bcee9e7c23')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-7d860ee6-cf43-4c9c-a841-d1bcee9e7c23 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-7d860ee6-cf43-4c9c-a841-d1bcee9e7c23');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","  <div id=\"id_18cb6244-8666-4c8b-bc9a-ac752547c3ab\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('figure_manifest_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_18cb6244-8666-4c8b-bc9a-ac752547c3ab button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('figure_manifest_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"figure_manifest_df","summary":"{\n  \"name\": \"figure_manifest_df\",\n  \"rows\": 13,\n  \"fields\": [\n    {\n      \"column\": \"figure_file\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 13,\n        \"samples\": [\n          \"/content/drive/MyDrive/logminilm_cache/figures/11_logminilm_validation_f1_curve.png\",\n          \"/content/drive/MyDrive/logminilm_cache/figures/10_logminilm_training_validation_loss_curve.png\",\n          \"/content/drive/MyDrive/logminilm_cache/figures/01_bgl_line_level_class_distribution.png\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"filename\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 13,\n        \"samples\": [\n          \"11_logminilm_validation_f1_curve.png\",\n          \"10_logminilm_training_validation_loss_curve.png\",\n          \"01_bgl_line_level_class_distribution.png\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","Recommended Chapter 4 figure order:\n","1. BGL line-level class distribution\n","2. BGL sequence-level class distribution\n","3. Threshold sensitivity\n","4. Confusion matrix\n","5. Prediction probability distribution\n","6. Global XAI mean importance by event position\n","7. Strong local XAI case study\n","8. Top-k faithfulness\n","9. SHAP vs occlusion agreement\n"]}],"source":["# ============================================================\n","# Step 51 — Figure manifest\n","# ============================================================\n","\n","figure_files = sorted(FIGURES_DIR.glob(\"*.png\"))\n","\n","figure_manifest_df = pd.DataFrame({\n","    \"figure_file\": [str(p) for p in figure_files],\n","    \"filename\": [p.name for p in figure_files]\n","})\n","\n","FIGURE_MANIFEST_PATH = FIGURES_DIR / \"figure_manifest.csv\"\n","figure_manifest_df.to_csv(FIGURE_MANIFEST_PATH, index=False)\n","\n","print(\"Saved figure manifest to:\", FIGURE_MANIFEST_PATH)\n","display(figure_manifest_df)\n","\n","print(\"\\nRecommended Chapter 4 figure order:\")\n","print(\"1. BGL line-level class distribution\")\n","print(\"2. BGL sequence-level class distribution\")\n","print(\"3. Threshold sensitivity\")\n","print(\"4. Confusion matrix\")\n","print(\"5. Prediction probability distribution\")\n","print(\"6. Global XAI mean importance by event position\")\n","print(\"7. Strong local XAI case study\")\n","print(\"8. Top-k faithfulness\")\n","print(\"9. SHAP vs occlusion agreement\")\n"]}],"metadata":{"colab":{"gpuType":"T4","provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"},"accelerator":"GPU","widgets":{"application/vnd.jupyter.widget-state+json":{"8af634f39e5c4827a9d885e9645643dd":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f7e276f867a64174a27a074ff72fb900","IPY_MODEL_e683c3cf89484861a9f753b814acee11","IPY_MODEL_1ee8ae5f1e024cfeb18ddc35dd30e293"],"layout":"IPY_MODEL_720187adbfb0427796d9aa2c2ba2ac3f"}},"f7e276f867a64174a27a074ff72fb900":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_4ed8007d13e94e489d2d3a2cde6b8a9d","placeholder":"​","style":"IPY_MODEL_9c8081a6c88045209b409c0500d7d08e","value":"100%"}},"e683c3cf89484861a9f753b814acee11":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_be45fa442b7348aca954eb16e2338578","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6a1701302c0143f5ba9ae9d309cedcbc","value":1}},"1ee8ae5f1e024cfeb18ddc35dd30e293":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7c1cccff5bd9431dafa0a4808b8dbc31","placeholder":"​","style":"IPY_MODEL_fdf8fac8f87e4eac9e109416c3a48f9e","value":" 1/1 [00:01&lt;00:00,  1.98s/it]"}},"720187adbfb0427796d9aa2c2ba2ac3f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4ed8007d13e94e489d2d3a2cde6b8a9d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9c8081a6c88045209b409c0500d7d08e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"be45fa442b7348aca954eb16e2338578":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6a1701302c0143f5ba9ae9d309cedcbc":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"7c1cccff5bd9431dafa0a4808b8dbc31":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fdf8fac8f87e4eac9e109416c3a48f9e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"cc879f93dc8747cc86a690eebeef0925":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_df395090c5a04268af330fc6c24667e0","IPY_MODEL_d9f506e52b924b48b921d537dfd7404a","IPY_MODEL_dc21f359139b49bf804ff7676df76481"],"layout":"IPY_MODEL_dcc1bd09f7224a54b05be933ee976836"}},"df395090c5a04268af330fc6c24667e0":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7f75354390ee4eed944c3b244d7ca16d","placeholder":"​","style":"IPY_MODEL_ab673b4fc3594b038036a07f02803a25","value":"100%"}},"d9f506e52b924b48b921d537dfd7404a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_dd8606c7196742f4809608081373726f","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_f465b7be7835490980e6d86a14f6b434","value":1}},"dc21f359139b49bf804ff7676df76481":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_77935337572d4d45b312413f3e4fc0db","placeholder":"​","style":"IPY_MODEL_0f94c5129ebe4ee89e40be2a5363b98f","value":" 1/1 [00:02&lt;00:00,  2.85s/it]"}},"dcc1bd09f7224a54b05be933ee976836":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7f75354390ee4eed944c3b244d7ca16d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ab673b4fc3594b038036a07f02803a25":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"dd8606c7196742f4809608081373726f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f465b7be7835490980e6d86a14f6b434":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"77935337572d4d45b312413f3e4fc0db":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0f94c5129ebe4ee89e40be2a5363b98f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c92b1817dc6e47d0b59152db12c647f9":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_fd72d236c9834e81bb4be8e2f3fbf487","IPY_MODEL_ec2dc8dbde7f463aaea156c3afda7102","IPY_MODEL_61b84a2c7e254bb3a315025816199714"],"layout":"IPY_MODEL_0172f67343254e259e2b845ba79812d3"}},"fd72d236c9834e81bb4be8e2f3fbf487":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_770e62fb435e4081ad8dea0325b6af6d","placeholder":"​","style":"IPY_MODEL_02d03a9ffb054f088e8211671b42370b","value":"100%"}},"ec2dc8dbde7f463aaea156c3afda7102":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_3cc025375e704ba3a0600a41e2c73a52","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_904a2b0763de4c26bfb929474aa33c5d","value":1}},"61b84a2c7e254bb3a315025816199714":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_64466d879ed1432a9770f021cab5e78b","placeholder":"​","style":"IPY_MODEL_1280ecb796ad43abac6ab207732d17c0","value":" 1/1 [00:02&lt;00:00,  2.37s/it]"}},"0172f67343254e259e2b845ba79812d3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"770e62fb435e4081ad8dea0325b6af6d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"02d03a9ffb054f088e8211671b42370b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3cc025375e704ba3a0600a41e2c73a52":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"904a2b0763de4c26bfb929474aa33c5d":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"64466d879ed1432a9770f021cab5e78b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1280ecb796ad43abac6ab207732d17c0":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"d83bf77ac2df49908594f54ad82afe9e":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_09a3d888edb64e29b3085f36e7e85579","IPY_MODEL_84ed9f65fbd54855be3e5e2b623e3996","IPY_MODEL_7450400ac5004568a8c3644dc825f8e6"],"layout":"IPY_MODEL_2282990403134bcea9173277e9337da8"}},"09a3d888edb64e29b3085f36e7e85579":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_0483fa635ada47c8a17b9d27af1ad0db","placeholder":"​","style":"IPY_MODEL_b493ecfae8af423b91ac03b5c3d997b6","value":"100%"}},"84ed9f65fbd54855be3e5e2b623e3996":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_c9d6824fd74a4025a39efe2b9d8d56b5","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_f8145ff96a594d4cb9c4b7f9cb225835","value":1}},"7450400ac5004568a8c3644dc825f8e6":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_972ae3307def4be4a1e1d1c0a2edff34","placeholder":"​","style":"IPY_MODEL_2d74425dfea74792ab8b1cd00fdf9e71","value":" 1/1 [00:02&lt;00:00,  2.36s/it]"}},"2282990403134bcea9173277e9337da8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0483fa635ada47c8a17b9d27af1ad0db":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b493ecfae8af423b91ac03b5c3d997b6":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c9d6824fd74a4025a39efe2b9d8d56b5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f8145ff96a594d4cb9c4b7f9cb225835":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"972ae3307def4be4a1e1d1c0a2edff34":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2d74425dfea74792ab8b1cd00fdf9e71":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"54c025fe2a704de38c5d5b76729118f1":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_ae0a4e2b0aad4a969e3f829bdd006ac9","IPY_MODEL_38cd49f14f194a6bbc02e55ae8fef25a","IPY_MODEL_10950d20d67241bfa7805ddf79fb91d4"],"layout":"IPY_MODEL_a376e3c350c3414d8614b9b228f50ed2"}},"ae0a4e2b0aad4a969e3f829bdd006ac9":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_05b465b2f35449e0b799091ade16e074","placeholder":"​","style":"IPY_MODEL_e5028b4d75e64fb89c77e0ed58b0eb92","value":"100%"}},"38cd49f14f194a6bbc02e55ae8fef25a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a24f0dc02b3d4f76b4e3854f7a83bede","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ea92f5bad99c49ffb3d3d6fbe4777609","value":1}},"10950d20d67241bfa7805ddf79fb91d4":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_1a6e1ac3a77745bb926c58330e8d8b7d","placeholder":"​","style":"IPY_MODEL_52844bfb43c04934ae23185fbaba8f4e","value":" 1/1 [00:02&lt;00:00,  2.41s/it]"}},"a376e3c350c3414d8614b9b228f50ed2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"05b465b2f35449e0b799091ade16e074":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e5028b4d75e64fb89c77e0ed58b0eb92":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a24f0dc02b3d4f76b4e3854f7a83bede":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ea92f5bad99c49ffb3d3d6fbe4777609":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"1a6e1ac3a77745bb926c58330e8d8b7d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"52844bfb43c04934ae23185fbaba8f4e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"fd695e5b263c4fafb6a84a30ff3b2a21":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_641f1838f3494b6a8b287f53c6359a69","IPY_MODEL_1dbaa7fc73ad46e9b5168d6f5bedaad0","IPY_MODEL_3b789ff576984d02a20a48088f911259"],"layout":"IPY_MODEL_9d92bbf515bf4f21942fe06d6d05d86d"}},"641f1838f3494b6a8b287f53c6359a69":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_41b74d976bd848389e8efff7caa6bea5","placeholder":"​","style":"IPY_MODEL_7c2f5a3f3d9543de8cba8d6587637a6c","value":"100%"}},"1dbaa7fc73ad46e9b5168d6f5bedaad0":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_8e68f1f1ef6e40e4a142bcf360c2a220","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_a1f7c17ad454497687d8bde8b179ce94","value":1}},"3b789ff576984d02a20a48088f911259":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c9b830566c2446a0bb524427814f1d88","placeholder":"​","style":"IPY_MODEL_0f745eb44ae74c2c925dccae76810c24","value":" 1/1 [00:03&lt;00:00,  3.74s/it]"}},"9d92bbf515bf4f21942fe06d6d05d86d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"41b74d976bd848389e8efff7caa6bea5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7c2f5a3f3d9543de8cba8d6587637a6c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8e68f1f1ef6e40e4a142bcf360c2a220":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a1f7c17ad454497687d8bde8b179ce94":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c9b830566c2446a0bb524427814f1d88":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0f745eb44ae74c2c925dccae76810c24":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"176d89b066cb476dba0f0f6d7ba88a2f":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_14f238a6089941599dc5e9eb84a2ea2a","IPY_MODEL_c2f818dfce004da69acc6d672b4737cf","IPY_MODEL_7eedadcc447b4dfc859cab5d7080c878"],"layout":"IPY_MODEL_1c900dfc11314fa48d212a676bf2f3ac"}},"14f238a6089941599dc5e9eb84a2ea2a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6552e4e7ead749b0bdd3126e56cd828b","placeholder":"​","style":"IPY_MODEL_9d9b5969064b4a3da43de4c7156c7d77","value":"100%"}},"c2f818dfce004da69acc6d672b4737cf":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_48e5c17070c14b9d8cfab38e452d7d60","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_4d8ae037a9ec47158867f7a1c80ab3b1","value":1}},"7eedadcc447b4dfc859cab5d7080c878":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_dce64355bc654213a3dee72454e793e3","placeholder":"​","style":"IPY_MODEL_b823c73ac5a749338d59a8ccc827c99b","value":" 1/1 [00:04&lt;00:00,  4.54s/it]"}},"1c900dfc11314fa48d212a676bf2f3ac":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6552e4e7ead749b0bdd3126e56cd828b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9d9b5969064b4a3da43de4c7156c7d77":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"48e5c17070c14b9d8cfab38e452d7d60":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4d8ae037a9ec47158867f7a1c80ab3b1":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"dce64355bc654213a3dee72454e793e3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b823c73ac5a749338d59a8ccc827c99b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f618f71d4ad24c04ac698f2446d658a7":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a72773276679461d9e32b45ee287b120","IPY_MODEL_e47e898f3cc94e528f10724a6ab1c7d9","IPY_MODEL_75f00e8b87aa4a80ac58ad3e37d1f376"],"layout":"IPY_MODEL_24b74e2e69ba4b668136e292796db969"}},"a72773276679461d9e32b45ee287b120":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_75952dcc7e3e4549aa85f8b1c07b6540","placeholder":"​","style":"IPY_MODEL_92e4c1f23348408093cb06e6a7ff23b4","value":"100%"}},"e47e898f3cc94e528f10724a6ab1c7d9":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_0ffee8569754427fa29bb169d967af6e","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ff4f103aaaf3421fbf4704bb08e93940","value":1}},"75f00e8b87aa4a80ac58ad3e37d1f376":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_29f3350631f140de8e1b4848353c5756","placeholder":"​","style":"IPY_MODEL_f80e990834264029882dbc7d1347cfca","value":" 1/1 [00:02&lt;00:00,  2.14s/it]"}},"24b74e2e69ba4b668136e292796db969":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"75952dcc7e3e4549aa85f8b1c07b6540":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"92e4c1f23348408093cb06e6a7ff23b4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0ffee8569754427fa29bb169d967af6e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ff4f103aaaf3421fbf4704bb08e93940":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"29f3350631f140de8e1b4848353c5756":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f80e990834264029882dbc7d1347cfca":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"07e28888b39a4480905835d693bad57c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_605af382b4484b108c73c941fa49f643","IPY_MODEL_38696b785c254251bb63cde8a6306417","IPY_MODEL_5d945754f3784cedbf72ba680ef34947"],"layout":"IPY_MODEL_3ecf11df35274b1b95a79871e10fe1ea"}},"605af382b4484b108c73c941fa49f643":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_fd0163558cb0484497bbbb4b16ff9a5e","placeholder":"​","style":"IPY_MODEL_da1e3757457d4630889e502952017040","value":"100%"}},"38696b785c254251bb63cde8a6306417":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_6270bffc8b2747398e091f4c422a379a","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_3dd424ae9a3e43cc8d169a918bd67527","value":1}},"5d945754f3784cedbf72ba680ef34947":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b03c96941c624caf8f9136fcb77fa181","placeholder":"​","style":"IPY_MODEL_d9abaa4975f640a8a3391821873182d7","value":" 1/1 [00:02&lt;00:00,  2.46s/it]"}},"3ecf11df35274b1b95a79871e10fe1ea":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fd0163558cb0484497bbbb4b16ff9a5e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"da1e3757457d4630889e502952017040":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6270bffc8b2747398e091f4c422a379a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3dd424ae9a3e43cc8d169a918bd67527":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b03c96941c624caf8f9136fcb77fa181":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d9abaa4975f640a8a3391821873182d7":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"5356813178d64b009b2a4c95f7b2a172":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a3268c2c6dd948649285980e89d4082a","IPY_MODEL_b14cc40f317e4194bc0bfcf7e4fdc508","IPY_MODEL_0d0cdd328e764f91beeb8aac1f64f174"],"layout":"IPY_MODEL_d1d2c51e0fac482b877bd930ddd0fc25"}},"a3268c2c6dd948649285980e89d4082a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_070940cd688042ecb9220ef1b040e5c6","placeholder":"​","style":"IPY_MODEL_57679875b2c74fe59359b9a022b8920c","value":"100%"}},"b14cc40f317e4194bc0bfcf7e4fdc508":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_47f370b1a13549cf852d73acdbac3c9c","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_238d5ab3463d44caa73e6d6fa0485b3c","value":1}},"0d0cdd328e764f91beeb8aac1f64f174":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_938fafbc6ffd428f826f62fb8262ff2a","placeholder":"​","style":"IPY_MODEL_656d673fee37477d90ca4680785912c0","value":" 1/1 [00:01&lt;00:00,  1.32s/it]"}},"d1d2c51e0fac482b877bd930ddd0fc25":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"070940cd688042ecb9220ef1b040e5c6":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"57679875b2c74fe59359b9a022b8920c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"47f370b1a13549cf852d73acdbac3c9c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"238d5ab3463d44caa73e6d6fa0485b3c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"938fafbc6ffd428f826f62fb8262ff2a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"656d673fee37477d90ca4680785912c0":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f1094ec673a24391865ac2502e362ddf":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_7539889f1b6a4b4f8b7e3ad1b28f5e65","IPY_MODEL_96849986fc1346e6be9738b0970dc757","IPY_MODEL_82b64ef4d5624db482f4444036544e2f"],"layout":"IPY_MODEL_6c82fdc707764d4cb759be3114cd335e"}},"7539889f1b6a4b4f8b7e3ad1b28f5e65":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d9e79848d3cb488b930090a517fdbae4","placeholder":"​","style":"IPY_MODEL_ee27ef2f6a3843fa9808d762f1780e66","value":"100%"}},"96849986fc1346e6be9738b0970dc757":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_835506ebe21848539db986f9456eb599","max":1,"min":0,"orientation":"horizontal","style":"IPY_MODEL_23557540dcf640fe824f0ce9218b8932","value":1}},"82b64ef4d5624db482f4444036544e2f":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_30614e39443d4bef952578ac5d7be36a","placeholder":"​","style":"IPY_MODEL_bc65d13c90d34facabd8adaf0913ad0f","value":" 1/1 [00:00&lt;00:00,  1.07it/s]"}},"6c82fdc707764d4cb759be3114cd335e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d9e79848d3cb488b930090a517fdbae4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ee27ef2f6a3843fa9808d762f1780e66":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"835506ebe21848539db986f9456eb599":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"23557540dcf640fe824f0ce9218b8932":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"30614e39443d4bef952578ac5d7be36a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bc65d13c90d34facabd8adaf0913ad0f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"nbformat":4,"nbformat_minor":5}